diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index de70921e..05ee203c 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -15,7 +15,7 @@ object Versions { const val ADVENTURE_PLATFORM_BUKKIT = "4.4.1" const val ADVENTURE_API = "4.25.0" - const val LITE_COMMANDS = "3.10.5" + const val LITE_COMMANDS = "3.10.2" //downgrade bc 3.10.5 does not support folia const val OKAERI_CONFIGS_SERDES_COMMONS = "5.0.13" const val OKAERI_CONFIGS_SERDES_BUKKIT = "5.0.13" @@ -25,8 +25,14 @@ object Versions { const val WORLD_GUARD_BUKKIT = "7.0.14" const val PLACEHOLDER_API = "2.11.6" + const val LANDS_API = "7.17.2" const val PAPERLIB = "1.0.8" + const val WORLDEDIT = "3ISh7ADm" //cannot use numeric version bc of duplicated version on modrinth + const val PACKETEVENTS = "2.11.1" + const val WORLDGUARD = "7.0.15-beta-01" + const val LUCKPERMS = "5.5.17" + } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/CancelTagReason.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/CancelTagReason.java index 3bd1c7c4..d35299d6 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/CancelTagReason.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/CancelTagReason.java @@ -2,6 +2,9 @@ public enum CancelTagReason { - TAGOUT + TAGOUT, + PERMISSION_BYPASS, + ADMIN, + CREATIVE_MODE, } diff --git a/eternalcombat-plugin/build.gradle.kts b/eternalcombat-plugin/build.gradle.kts index 77d94a62..fb64e3ac 100644 --- a/eternalcombat-plugin/build.gradle.kts +++ b/eternalcombat-plugin/build.gradle.kts @@ -1,4 +1,5 @@ import net.minecrell.pluginyml.bukkit.BukkitPluginDescription +import xyz.jpenilla.runpaper.task.RunServer plugins { `eternalcombat-java` @@ -59,7 +60,7 @@ dependencies { compileOnly("me.clip:placeholderapi:${Versions.PLACEHOLDER_API}") // Lands - compileOnly("com.github.angeschossen:LandsAPI:7.17.2") + compileOnly("com.github.angeschossen:LandsAPI:${Versions.LANDS_API}") // Multification implementation("com.eternalcode:multification-bukkit:${Versions.MULTIFICATION}") @@ -88,10 +89,18 @@ bukkit { tasks { runServer { + minecraftVersion("1.21.10") + + downloadPlugins.modrinth("WorldEdit", Versions.WORLDEDIT) + downloadPlugins.modrinth("PacketEvents", "${Versions.PACKETEVENTS}+spigot") + downloadPlugins.modrinth("WorldGuard", Versions.WORLDGUARD) + downloadPlugins.modrinth("LuckPerms", "v${Versions.LUCKPERMS}-bukkit") + } + + runPaper.folia.registerTask() { minecraftVersion("1.21.8") - downloadPlugins.url("https://cdn.modrinth.com/data/1u6JkXh5/versions/Jk1z2u7n/worldedit-bukkit-7.3.16.jar") - downloadPlugins.url("https://github.com/retrooper/packetevents/releases/download/v2.9.5/packetevents-spigot-2.9.5.jar") - downloadPlugins.url("https://cdn.modrinth.com/data/DKY9btbd/versions/PO4MKx7e/worldguard-bukkit-7.0.14-dist.jar") + + downloadPlugins.modrinth("PacketEvents", "${Versions.PACKETEVENTS}+spigot") } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java index c2de7b8d..ef6d5f04 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -8,6 +8,9 @@ import com.eternalcode.combat.bridge.BridgeService; import com.eternalcode.combat.crystalpvp.RespawnAnchorListener; import com.eternalcode.combat.crystalpvp.EndCrystalListener; +import com.eternalcode.combat.fight.controller.FightBypassAdminController; +import com.eternalcode.combat.fight.controller.FightBypassCreativeController; +import com.eternalcode.combat.fight.controller.FightBypassPermissionController; import com.eternalcode.combat.fight.drop.DropKeepInventoryService; import com.eternalcode.combat.fight.FightManager; import com.eternalcode.combat.fight.drop.DropService; @@ -172,13 +175,16 @@ public void onEnable() { eventManager.subscribe( new FightTagController(this.fightManager, pluginConfig), new FightUnTagController(this.fightManager, pluginConfig, logoutService), + new FightBypassAdminController(server, pluginConfig), + new FightBypassPermissionController(server), + new FightBypassCreativeController(server, pluginConfig), new FightActionBlockerController(this.fightManager, noticeService, pluginConfig, server), new FightPearlController(pluginConfig.pearl, noticeService, this.fightManager, this.fightPearlService), new UpdaterNotificationController(updaterService, pluginConfig, this.audienceProvider, miniMessage), new KnockbackRegionController(noticeService, this.regionProvider, this.fightManager, knockbackService, server), - new FightEffectController(pluginConfig.effect, this.fightEffectService, this.fightManager, this.getServer()), + new FightEffectController(pluginConfig.effect, this.fightEffectService, this.fightManager, server), new FightTagOutController(this.fightTagOutService), - new FightMessageController(this.fightManager, noticeService, pluginConfig, this.getServer()), + new FightMessageController(this.fightManager, noticeService, pluginConfig, server), new BorderTriggerController(borderService, () -> pluginConfig.border, fightManager, server, scheduler), new ParticleController(borderService, () -> pluginConfig.border.particle, scheduler, server), new BorderBlockController(borderService, () -> pluginConfig.border.block, scheduler, server), diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightBypassAdminController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightBypassAdminController.java new file mode 100644 index 00000000..099cc774 --- /dev/null +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightBypassAdminController.java @@ -0,0 +1,37 @@ +package com.eternalcode.combat.fight.controller; + +import com.eternalcode.combat.config.implementation.PluginConfig; +import com.eternalcode.combat.fight.event.CancelTagReason; +import com.eternalcode.combat.fight.event.FightTagEvent; +import java.util.UUID; +import org.bukkit.Server; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +public class FightBypassAdminController implements Listener { + + private final Server server; + private final PluginConfig config; + + public FightBypassAdminController(Server server, PluginConfig config) { + this.server = server; + this.config = config; + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + void onFightTagEvent(FightTagEvent event) { + UUID uniqueId = event.getPlayer(); + + Player player = this.server.getPlayer(uniqueId); + if (player == null) { + return; + } + + if (this.config.admin.excludeAdminsFromCombat && player.isOp()) { + event.setCancelReason(CancelTagReason.ADMIN); + event.setCancelled(true); + } + } +} diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightBypassCreativeController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightBypassCreativeController.java new file mode 100644 index 00000000..25776962 --- /dev/null +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightBypassCreativeController.java @@ -0,0 +1,39 @@ +package com.eternalcode.combat.fight.controller; + +import com.eternalcode.combat.config.implementation.PluginConfig; +import com.eternalcode.combat.fight.event.CancelTagReason; +import com.eternalcode.combat.fight.event.FightTagEvent; +import java.util.UUID; +import org.bukkit.GameMode; +import org.bukkit.Server; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +public class FightBypassCreativeController implements Listener { + + private final Server server; + private final PluginConfig config; + + public FightBypassCreativeController(Server server, PluginConfig config) { + this.server = server; + this.config = config; + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + void onFightTagEvent(FightTagEvent event) { + UUID uniqueId = event.getPlayer(); + + Player player = this.server.getPlayer(uniqueId); + if (player == null) { + return; + } + + if (this.config.admin.excludeCreativePlayersFromCombat && player.getGameMode() == GameMode.CREATIVE) { + event.setCancelReason(CancelTagReason.CREATIVE_MODE); + event.setCancelled(true); + } + } + +} diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightBypassPermissionController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightBypassPermissionController.java new file mode 100644 index 00000000..bcf68fd7 --- /dev/null +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightBypassPermissionController.java @@ -0,0 +1,36 @@ +package com.eternalcode.combat.fight.controller; + +import com.eternalcode.combat.fight.event.CancelTagReason; +import com.eternalcode.combat.fight.event.FightTagEvent; +import java.util.UUID; +import org.bukkit.Server; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +public class FightBypassPermissionController implements Listener { + + private static final String BYPASS_PERMISSION = "eternalcombat.bypass"; + + private final Server server; + + public FightBypassPermissionController(Server server) { + this.server = server; + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + void onFightTagEvent(FightTagEvent event) { + UUID uniqueId = event.getPlayer(); + + Player player = this.server.getPlayer(uniqueId); + if (player == null) { + return; + } + + if (player.hasPermission(BYPASS_PERMISSION)) { + event.setCancelReason(CancelTagReason.PERMISSION_BYPASS); + event.setCancelled(true); + } + } +} diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightTagController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightTagController.java index 4dc6ec51..b06cf65c 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightTagController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightTagController.java @@ -4,7 +4,6 @@ import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.fight.FightManager; import com.eternalcode.combat.fight.event.CauseOfTag; -import org.bukkit.GameMode; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; @@ -56,11 +55,11 @@ void onEntityDamageByEntity(EntityDamageByEntityEvent event) { return; } - if (this.cannotBeTagged(attacker)) { - return; - } + UUID attackedUniqueId = attackedPlayerByPerson.getUniqueId(); + UUID attackerUniqueId = attacker.getUniqueId(); - if (this.cannotBeTagged(attackedPlayerByPerson)) { + // enderpearl on folia counts as attack on self + if (attackedUniqueId.equals(attackerUniqueId)) { return; } @@ -77,8 +76,6 @@ void onEntityDamageByEntity(EntityDamageByEntityEvent event) { } Duration combatTime = this.config.settings.combatTimerDuration; - UUID attackedUniqueId = attackedPlayerByPerson.getUniqueId(); - UUID attackerUniqueId = attacker.getUniqueId(); this.fightManager.tag(attackedUniqueId, combatTime, CauseOfTag.PLAYER, attackerUniqueId); this.fightManager.tag(attackerUniqueId, combatTime, CauseOfTag.PLAYER, attackedUniqueId); @@ -99,15 +96,6 @@ void onEntityDamage(EntityDamageEvent event) { return; } - if (this.cannotBeTagged(player)) { - return; - } - - boolean hasBypass = player.hasPermission("eternalcombat.bypass"); - if (hasBypass) { - return; - } - Duration combatTime = this.config.settings.combatTimerDuration; UUID uuid = player.getUniqueId(); @@ -145,18 +133,5 @@ private boolean isPlayerInDisabledWorld(Player player) { return this.config.settings.ignoredWorlds.contains(worldName); } - private boolean cannotBeTagged(Player player) { - if (this.config.admin.excludeAdminsFromCombat && player.hasPermission("eternalcombat.bypass")) { - return true; - } - - if (this.config.admin.excludeAdminsFromCombat && player.isOp()) { - return true; - } - - return this.config.admin.excludeCreativePlayersFromCombat && player.getGameMode() == GameMode.CREATIVE; - } - - }