From 457bf2ffff3ea2c577e7f00d6cf40634361d9517 Mon Sep 17 00:00:00 2001 From: Andreas Troelsen Date: Mon, 13 Nov 2023 16:19:01 +0100 Subject: [PATCH] Clean up PvP activation logic. The idea behind the previous implementation worked, but it was a tad bit confusing. This commit refactors the activation logic by simply removing it entirely. The "activation" part of the logic is now derived from the wave number (if 0, it means we haven't _really_ started yet), instead of relying on the spawn thread to toggle the flag on and off. This kind of dependency inversion (spawn thread -> listener, listener -> "phase") is a pretty decent (albeit super tiny) step towards cleaning up the whole session system, so I call that a victory in and of itself! --- .../garbagemule/MobArena/ArenaListener.java | 29 +++++++------------ .../garbagemule/MobArena/MASpawnThread.java | 7 +---- 2 files changed, 12 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/garbagemule/MobArena/ArenaListener.java b/src/main/java/com/garbagemule/MobArena/ArenaListener.java index dff3381..431808d 100644 --- a/src/main/java/com/garbagemule/MobArena/ArenaListener.java +++ b/src/main/java/com/garbagemule/MobArena/ArenaListener.java @@ -116,7 +116,6 @@ public class ArenaListener private boolean protect; private boolean monsterExp; private boolean monsterInfight; - private boolean pvpOn; private boolean pvpEnabled; private boolean foodRegen; private boolean lockFoodLevel; @@ -142,7 +141,7 @@ public class ArenaListener this.protect = s.getBoolean("protect", true); this.monsterExp = s.getBoolean("monster-exp", false); this.monsterInfight = s.getBoolean("monster-infight", false); - this.pvpOn = s.getBoolean("pvp-enabled", false); + this.pvpEnabled = s.getBoolean("pvp-enabled", false); this.foodRegen = s.getBoolean("food-regen", false); this.lockFoodLevel = s.getBoolean("lock-food-level", true); this.allowTeleport = s.getBoolean("allow-teleporting", false); @@ -161,16 +160,6 @@ public class ArenaListener ); } - void pvpActivate() { - if (arena.isRunning() && !arena.getPlayersInArena().isEmpty()) { - pvpEnabled = pvpOn; - } - } - - void pvpDeactivate() { - if (pvpOn) pvpEnabled = false; - } - public void onBlockBreak(BlockBreakEvent event) { // Check if the block is a sign, it might be a leaderboard if (event.getBlock() instanceof Sign) { @@ -722,11 +711,15 @@ public class ArenaListener return; } - // Cancel PvP damage if disabled - if (!pvpEnabled && damager instanceof Player && !damager.equals(player)) { - event.setCancelled(true); - return; + // If this is player damage (and not self-inflicted), handle PvP + if (damager instanceof Player && !damager.equals(player)) { + // PvP must be enabled, and the first wave must have spawned + if (!pvpEnabled || arena.getWaveManager().getWaveNumber() == 0) { + event.setCancelled(true); + return; + } } + event.setCancelled(false); arena.getArenaPlayer(player).getStats().add("dmgTaken", event.getDamage()); @@ -802,7 +795,7 @@ public class ArenaListener return; } - if (!pvpEnabled) { + if (!pvpEnabled || arena.getWaveManager().getWaveNumber() == 0) { event.setCancelled(true); } } @@ -913,7 +906,7 @@ public class ArenaListener if (potion.getShooter() instanceof Player) { // Check for PvP stuff if the shooter is a player - if (!pvpEnabled) { + if (!pvpEnabled || arena.getWaveManager().getWaveNumber() == 0) { // If a potion has harmful effects, remove all players. for (PotionEffect effect : potion.getEffects()) { PotionEffectType type = effect.getType(); diff --git a/src/main/java/com/garbagemule/MobArena/MASpawnThread.java b/src/main/java/com/garbagemule/MobArena/MASpawnThread.java index a3adf4d..ad8bd26 100644 --- a/src/main/java/com/garbagemule/MobArena/MASpawnThread.java +++ b/src/main/java/com/garbagemule/MobArena/MASpawnThread.java @@ -91,10 +91,7 @@ public class MASpawnThread implements Runnable } int delay = arena.getSettings().getInt("first-wave-delay", 5) * 20; - task = Bukkit.getScheduler().runTaskLater(plugin, () -> { - arena.getEventListener().pvpActivate(); - this.run(); - }, delay); + task = Bukkit.getScheduler().runTaskLater(plugin, this, delay); } public void stop() { @@ -103,8 +100,6 @@ public class MASpawnThread implements Runnable return; } - arena.getEventListener().pvpDeactivate(); - task.cancel(); task = null; }