From 4135e5c7cc85e9a6e706f1fb8e005dd82a325f40 Mon Sep 17 00:00:00 2001 From: DeveloperDeborah Date: Thu, 27 Nov 2025 23:11:42 -0500 Subject: [PATCH 1/3] Fix players not dying sometimes --- src/no/runsafe/combatcooldown/PlayerListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/no/runsafe/combatcooldown/PlayerListener.java b/src/no/runsafe/combatcooldown/PlayerListener.java index 54c3db4..038c796 100644 --- a/src/no/runsafe/combatcooldown/PlayerListener.java +++ b/src/no/runsafe/combatcooldown/PlayerListener.java @@ -46,7 +46,7 @@ public void OnPlayerQuit(RunsafePlayerQuitEvent event) IPlayer player = event.getPlayer(); if (combatMonitor.isInCombat(player)) { - player.damage(500D); // This should kill them + player.setHealth(0); // This should kill them ILocation location = player.getLocation(); if (location != null) location.playEffect(effect, 0.3F, 100, 50); From 77cf93ef653360c3b15526dc1b21f57ebb2d1373 Mon Sep 17 00:00:00 2001 From: DeveloperDeborah Date: Thu, 27 Nov 2025 23:31:38 -0500 Subject: [PATCH 2/3] Code Cleanup --- .../runsafe/combatcooldown/CombatMonitor.java | 33 ++++++++-------- ...{CombatCooldownConfig.java => Config.java} | 2 +- .../combatcooldown/EntityListener.java | 38 ++++--------------- .../combatcooldown/PlayerListener.java | 35 ++++++++--------- src/no/runsafe/combatcooldown/Plugin.java | 7 +++- 5 files changed, 46 insertions(+), 69 deletions(-) rename src/no/runsafe/combatcooldown/{CombatCooldownConfig.java => Config.java} (95%) diff --git a/src/no/runsafe/combatcooldown/CombatMonitor.java b/src/no/runsafe/combatcooldown/CombatMonitor.java index 06c707d..60c2279 100644 --- a/src/no/runsafe/combatcooldown/CombatMonitor.java +++ b/src/no/runsafe/combatcooldown/CombatMonitor.java @@ -9,7 +9,7 @@ public class CombatMonitor implements IPluginDisabled { - public CombatMonitor(IScheduler scheduler, CombatCooldownConfig config) + public CombatMonitor(IScheduler scheduler, Config config) { this.scheduler = scheduler; this.config = config; @@ -17,11 +17,11 @@ public CombatMonitor(IScheduler scheduler, CombatCooldownConfig config) public void leaveCombat(IPlayer player) { - if (this.combatTimers.containsKey(player)) - { - this.combatTimers.remove(player); - player.sendColouredMessage(config.getLeavingCombatMessage()); - } + if (!this.combatTimers.containsKey(player)) + return; + + this.combatTimers.remove(player); + player.sendColouredMessage(config.getLeavingCombatMessage()); } public boolean isInCombat(IPlayer player) @@ -51,14 +51,14 @@ public void engageInDergonCombat(IPlayer player) public void engageInCombat(IPlayer firstPlayer, IPlayer secondPlayer) { - if (this.monitoringWorld(firstPlayer.getWorld()) && this.monitoringWorld(secondPlayer.getWorld())) - { - if (firstPlayer.isPvPFlagged() && secondPlayer.isPvPFlagged()) - { - this.engagePlayer(firstPlayer); - this.engagePlayer(secondPlayer); - } - } + if (!this.monitoringWorld(firstPlayer.getWorld()) || !this.monitoringWorld(secondPlayer.getWorld())) + return; + + if (!firstPlayer.isPvPFlagged() || !secondPlayer.isPvPFlagged()) + return; + + this.engagePlayer(firstPlayer); + this.engagePlayer(secondPlayer); } private void engagePlayer(IPlayer player) @@ -72,13 +72,12 @@ private void engagePlayer(IPlayer player) private void registerPlayerTimer(final IPlayer player) { if (this.combatTimers.containsKey(player)) - { this.scheduler.cancelTask(this.combatTimers.get(player)); - } + this.combatTimers.put(player, this.scheduler.startSyncTask(() -> leaveCombat(player), config.getCombatTime())); } private final ConcurrentHashMap combatTimers = new ConcurrentHashMap<>(); private final IScheduler scheduler; - private final CombatCooldownConfig config; + private final Config config; } diff --git a/src/no/runsafe/combatcooldown/CombatCooldownConfig.java b/src/no/runsafe/combatcooldown/Config.java similarity index 95% rename from src/no/runsafe/combatcooldown/CombatCooldownConfig.java rename to src/no/runsafe/combatcooldown/Config.java index b4fec2e..07a565c 100644 --- a/src/no/runsafe/combatcooldown/CombatCooldownConfig.java +++ b/src/no/runsafe/combatcooldown/Config.java @@ -5,7 +5,7 @@ import java.util.List; -public class CombatCooldownConfig implements IConfigurationChanged +public class Config implements IConfigurationChanged { @Override public void OnConfigurationChanged(IConfiguration configuration) diff --git a/src/no/runsafe/combatcooldown/EntityListener.java b/src/no/runsafe/combatcooldown/EntityListener.java index df69af2..3203f70 100644 --- a/src/no/runsafe/combatcooldown/EntityListener.java +++ b/src/no/runsafe/combatcooldown/EntityListener.java @@ -1,26 +1,19 @@ package no.runsafe.combatcooldown; -import no.runsafe.framework.api.IServer; import no.runsafe.framework.api.event.entity.IEntityDamageByEntityEvent; import no.runsafe.framework.api.event.player.IPlayerCustomEvent; -import no.runsafe.framework.api.log.IDebug; import no.runsafe.framework.api.player.IPlayer; import no.runsafe.framework.minecraft.entity.ProjectileEntity; import no.runsafe.framework.minecraft.entity.RunsafeEntity; -import no.runsafe.framework.minecraft.entity.RunsafeLivingEntity; import no.runsafe.framework.minecraft.entity.RunsafeProjectile; import no.runsafe.framework.minecraft.event.entity.RunsafeEntityDamageByEntityEvent; import no.runsafe.framework.minecraft.event.player.RunsafeCustomEvent; -import java.util.List; - public class EntityListener implements IEntityDamageByEntityEvent, IPlayerCustomEvent { - public EntityListener(CombatMonitor combatMonitor, IDebug debugger, IServer server) + public EntityListener(CombatMonitor combatMonitor) { this.combatMonitor = combatMonitor; - this.debugger = debugger; - this.server = server; } @Override @@ -34,7 +27,7 @@ public void OnPlayerCustomEvent(RunsafeCustomEvent event) return; combatMonitor.engageInDergonCombat(player); - this.debugger.debugFine(String.format( + Plugin.Debugger.debugFine(String.format( "Player %s is being picked up by a Dergon - Blocking Commands if able.", player.getName() )); @@ -53,7 +46,7 @@ public void OnEntityDamageByEntity(RunsafeEntityDamageByEntityEvent event) IPlayer attackingPlayer = null; RunsafeEntity attacker = event.getDamageActor(); - this.debugger.debugFine(String.format( + Plugin.Debugger.debugFine(String.format( "Player %s is being attacked by a %s.", victim.getName(), attacker.getEntityType().getName() @@ -70,40 +63,23 @@ else if (attacker instanceof RunsafeProjectile) if (attackingPlayer == null) { - this.debugger.debugFine("Victim is not being attacked by a player."); + Plugin.Debugger.debugFine("Victim is not being attacked by a player."); return; } - if (attackingPlayer.isVanished() || attackingPlayer.shouldNotSee(victim) || isSamePlayer(victim, attackingPlayer)) + if (attackingPlayer.isVanished() || attackingPlayer.shouldNotSee(victim) || victim.equals(attackingPlayer)) { - this.debugger.debugFine("Victim being attacked by exempted player."); + Plugin.Debugger.debugFine("Victim being attacked by exempted player."); return; } this.combatMonitor.engageInCombat(attackingPlayer, victim); - this.debugger.debugFine(String.format( + Plugin.Debugger.debugFine(String.format( "Player %s engaged in PvP with %s - Blocking commands", attackingPlayer.getName(), victim.getName() )); } - private boolean isSamePlayer(IPlayer one, IPlayer two) - { - return one.equals(two); - } - - private IPlayer findPlayer(RunsafeLivingEntity entity) - { - List onlinePlayers = server.getOnlinePlayers(); - for (IPlayer player : onlinePlayers) - if (entity != null && player != null && entity.getEntityId() == player.getEntityId()) - return player; - - return null; - } - private final CombatMonitor combatMonitor; - private final IDebug debugger; - private final IServer server; } diff --git a/src/no/runsafe/combatcooldown/PlayerListener.java b/src/no/runsafe/combatcooldown/PlayerListener.java index 038c796..ca947ae 100644 --- a/src/no/runsafe/combatcooldown/PlayerListener.java +++ b/src/no/runsafe/combatcooldown/PlayerListener.java @@ -5,7 +5,6 @@ import no.runsafe.framework.api.event.player.IPlayerCommandPreprocessEvent; import no.runsafe.framework.api.event.player.IPlayerDeathEvent; import no.runsafe.framework.api.event.player.IPlayerQuitEvent; -import no.runsafe.framework.api.log.IDebug; import no.runsafe.framework.api.player.IPlayer; import no.runsafe.framework.minecraft.Item; import no.runsafe.framework.minecraft.WorldBlockEffect; @@ -16,10 +15,9 @@ public class PlayerListener implements IPlayerCommandPreprocessEvent, IPlayerDeathEvent, IPlayerQuitEvent { - public PlayerListener(CombatMonitor combatMonitor, IDebug console, CombatCooldownConfig config) + public PlayerListener(CombatMonitor combatMonitor, Config config) { this.combatMonitor = combatMonitor; - this.debugger = console; this.config = config; effect = new WorldBlockEffect(WorldBlockEffectType.BLOCK_DUST, Item.BuildingBlock.Bedrock); } @@ -31,26 +29,26 @@ public void OnBeforePlayerCommand(RunsafePlayerCommandPreprocessEvent event) String playerName = player.getName(); String commandString = event.getMessage(); - debugger.debugFine("Checking if %s is engaged in combat", playerName); - if (this.combatMonitor.isInCombat(player) && !canRunCommand(player, commandString)) - { - debugger.debugFine("Blocking %s from running command %s during combat", playerName, commandString); - event.cancel(); - player.sendColouredMessage(config.getNoCommandsInCombatMessage()); - } + Plugin.Debugger.debugFine("Checking if %s is engaged in combat", playerName); + if (!this.combatMonitor.isInCombat(player) || canRunCommand(player, commandString)) + return; + + Plugin.Debugger.debugFine("Blocking %s from running command %s during combat", playerName, commandString); + event.cancel(); + player.sendColouredMessage(config.getNoCommandsInCombatMessage()); } @Override public void OnPlayerQuit(RunsafePlayerQuitEvent event) { IPlayer player = event.getPlayer(); - if (combatMonitor.isInCombat(player)) - { - player.setHealth(0); // This should kill them - ILocation location = player.getLocation(); - if (location != null) - location.playEffect(effect, 0.3F, 100, 50); - } + if (!combatMonitor.isInCombat(player)) + return; + + player.setHealth(0); // This should kill them + ILocation location = player.getLocation(); + if (location != null) + location.playEffect(effect, 0.3F, 100, 50); } @Override @@ -66,7 +64,6 @@ private boolean canRunCommand(IPlayer player, String commandString) } private final CombatMonitor combatMonitor; - private final IDebug debugger; - private final CombatCooldownConfig config; + private final Config config; private final IWorldEffect effect; } diff --git a/src/no/runsafe/combatcooldown/Plugin.java b/src/no/runsafe/combatcooldown/Plugin.java index b1ffcd3..7e60e78 100644 --- a/src/no/runsafe/combatcooldown/Plugin.java +++ b/src/no/runsafe/combatcooldown/Plugin.java @@ -1,14 +1,19 @@ package no.runsafe.combatcooldown; import no.runsafe.framework.RunsafeConfigurablePlugin; +import no.runsafe.framework.api.log.IDebug; import no.runsafe.framework.features.Events; public class Plugin extends RunsafeConfigurablePlugin { + public static IDebug Debugger; + @Override protected void pluginSetup() { - this.addComponent(CombatCooldownConfig.class); + Debugger = getComponent(IDebug.class); + + this.addComponent(Config.class); this.addComponent(Events.class); this.addComponent(CombatMonitor.class); this.addComponent(EntityListener.class); From c34e3d955f6f966ddbee4c50bf215b2cf9ee1cc6 Mon Sep 17 00:00:00 2001 From: DeveloperDeborah Date: Thu, 27 Nov 2025 23:35:47 -0500 Subject: [PATCH 3/3] Add debugging Try to track down issue where combat cooldown fails to set players as being engaged in combat in certain worlds --- src/no/runsafe/combatcooldown/CombatMonitor.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/no/runsafe/combatcooldown/CombatMonitor.java b/src/no/runsafe/combatcooldown/CombatMonitor.java index 60c2279..d29d0ab 100644 --- a/src/no/runsafe/combatcooldown/CombatMonitor.java +++ b/src/no/runsafe/combatcooldown/CombatMonitor.java @@ -54,9 +54,18 @@ public void engageInCombat(IPlayer firstPlayer, IPlayer secondPlayer) if (!this.monitoringWorld(firstPlayer.getWorld()) || !this.monitoringWorld(secondPlayer.getWorld())) return; - if (!firstPlayer.isPvPFlagged() || !secondPlayer.isPvPFlagged()) + Plugin.Debugger.debugFine("engageInCombat world check succeeded"); + + if (!firstPlayer.isPvPFlagged()) return; + Plugin.Debugger.debugFine("Player %s is pvp flagged", firstPlayer); + + if (!secondPlayer.isPvPFlagged()) + return; + + Plugin.Debugger.debugFine("Player %s is pvp flagged", secondPlayer); + this.engagePlayer(firstPlayer); this.engagePlayer(secondPlayer); }