Skip to content
This repository was archived by the owner on Nov 20, 2025. It is now read-only.

Commit 0804c27

Browse files
committed
Refactor combat cleanup and messaging logic
1 parent e9a11d9 commit 0804c27

3 files changed

Lines changed: 97 additions & 92 deletions

File tree

src/main/java/net/opmasterleo/combat/Combat.java

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -564,23 +564,27 @@ public void directSetCombat(Player player, Player opponent) {
564564
updateActionBar(opponent, expiry, currentTime);
565565
}
566566
}
567-
567+
568568
public void forceCombatCleanup(UUID playerUUID) {
569569
if (playerUUID == null) return;
570570
CombatRecord record = combatRecords.remove(playerUUID);
571571
lastActionBarUpdates.remove(playerUUID);
572-
Player player = Bukkit.getPlayer(playerUUID);
573-
if (player != null && glowingEnabled && glowManager != null) {
574-
glowManager.setGlowing(player, false, null);
572+
if (glowingEnabled && glowManager != null) {
573+
Player player = Bukkit.getPlayer(playerUUID);
574+
if (player != null) {
575+
glowManager.setGlowing(player, false, null);
576+
}
575577
}
576578

577579
if (record != null && record.opponent != null) {
578-
CombatRecord opponentRecord = combatRecords.get(record.opponent);
580+
UUID opponentUUID = record.opponent;
581+
CombatRecord opponentRecord = combatRecords.get(opponentUUID);
579582
if (opponentRecord != null && playerUUID.equals(opponentRecord.opponent)) {
580-
combatRecords.remove(record.opponent);
581-
lastActionBarUpdates.remove(record.opponent);
583+
combatRecords.remove(opponentUUID);
584+
lastActionBarUpdates.remove(opponentUUID);
585+
582586
if (glowingEnabled && glowManager != null) {
583-
Player opponent = Bukkit.getPlayer(record.opponent);
587+
Player opponent = Bukkit.getPlayer(opponentUUID);
584588
if (opponent != null) {
585589
glowManager.setGlowing(opponent, false, null);
586590
}
@@ -927,22 +931,17 @@ private void startCombatTimer() {
927931
private void handleCombatEnd(Player player) {
928932
UUID playerUUID = player.getUniqueId();
929933
CombatRecord record = combatRecords.remove(playerUUID);
930-
931934
if (record == null) return;
932-
933935
if (glowingEnabled && glowManager != null) {
934936
glowManager.setGlowing(player, false, null);
935937
if (record.opponent != null) {
936938
Player opponent = Bukkit.getPlayer(record.opponent);
937-
if (opponent != null) {
938-
boolean opponentStillInCombat = isInCombat(opponent);
939-
if (!opponentStillInCombat) {
940-
glowManager.setGlowing(opponent, false, null);
941-
}
939+
if (opponent != null && !isInCombat(opponent)) {
940+
glowManager.setGlowing(opponent, false, null);
942941
}
943942
}
944943
}
945-
944+
946945
if (noLongerInCombatMsg != null && !noLongerInCombatMsg.isEmpty()) {
947946
sendNoLongerInCombatMessage(player, noLongerInCombatMsg, noLongerInCombatType);
948947
}
@@ -1275,6 +1274,10 @@ public Map<UUID, CombatRecord> getCombatRecords() {
12751274
return combatRecords;
12761275
}
12771276

1277+
public ConcurrentHashMap<UUID, Long> getLastActionBarUpdates() {
1278+
return lastActionBarUpdates;
1279+
}
1280+
12781281
public CrystalManager getCrystalManager() {
12791282
return crystalManager;
12801283
}
Lines changed: 63 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,113 +1,108 @@
11
package net.opmasterleo.combat.listener.player;
22

3-
import net.opmasterleo.combat.Combat;
3+
import java.util.Objects;
4+
import java.util.UUID;
5+
46
import org.bukkit.Bukkit;
7+
import org.bukkit.Location;
8+
import org.bukkit.World;
59
import org.bukkit.entity.Player;
610
import org.bukkit.event.EventHandler;
711
import org.bukkit.event.EventPriority;
812
import org.bukkit.event.Listener;
913
import org.bukkit.event.entity.PlayerDeathEvent;
10-
import org.bukkit.Location;
11-
import org.bukkit.World;
12-
import java.util.UUID;
13-
import java.util.Objects;
14+
15+
import net.opmasterleo.combat.Combat;
1416

1517
public class PlayerDeathListener implements Listener {
1618

1719
private static final String INTENTIONAL_GAME_DESIGN_KEYWORD = "Intentional Game Design";
20+
private static final Combat combat = Combat.getInstance();
1821

19-
@EventHandler(priority = EventPriority.NORMAL)
22+
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
2023
public void onPlayerDeath(PlayerDeathEvent event) {
21-
Player victim = event.getEntity();
22-
Combat combat = Combat.getInstance();
23-
Player combatOpponent = combat.getCombatOpponent(victim);
24+
final Player victim = event.getEntity();
25+
final UUID victimUUID = victim.getUniqueId();
26+
final Combat.CombatRecord victimRecord = combat.getCombatRecords().get(victimUUID);
27+
final UUID opponentUUID = victimRecord != null ? victimRecord.opponent : null;
2428
Player killer = victim.getKiller();
25-
if (killer == null && combatOpponent != null) {
29+
if (killer == null && opponentUUID != null) {
2630
net.kyori.adventure.text.Component deathComp = event.deathMessage();
2731
if (deathComp != null) {
28-
String deathText = net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer.plainText()
29-
.serialize(Objects.requireNonNull(deathComp));
32+
String deathText = net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer.plainText()
33+
.serialize(Objects.requireNonNull(deathComp));
3034
if (deathText.contains(INTENTIONAL_GAME_DESIGN_KEYWORD)) {
31-
victim.setKiller(combatOpponent);
35+
Player combatOpponent = Bukkit.getPlayer(opponentUUID);
36+
if (combatOpponent != null) {
37+
victim.setKiller(combatOpponent);
38+
killer = combatOpponent;
39+
}
3240
}
3341
}
3442
}
3543

36-
UUID victimUUID = victim.getUniqueId();
37-
Combat.CombatRecord victimRecord = combat.getCombatRecords().get(victimUUID);
38-
UUID opponentUUID = victimRecord != null ? victimRecord.opponent : null;
39-
boolean untagOnDeath = combat.getConfig().getBoolean("untag-on-death", true);
40-
boolean untagOnEnemyDeath = combat.getConfig().getBoolean("untag-on-enemy-death", true);
41-
boolean lightningEnabled = combat.getConfig().getBoolean("lightning-on-kill", false);
42-
if (lightningEnabled && killer != null && !killer.equals(victim)) {
44+
if (combat.getConfig().getBoolean("lightning-on-kill", false) && killer != null && !killer.equals(victim)) {
4345
Location loc = victim.getLocation();
4446
World world = loc.getWorld();
4547
if (world != null) {
4648
world.strikeLightningEffect(loc);
4749
}
4850
}
4951

52+
final boolean untagOnDeath = combat.getConfig().getBoolean("untag-on-death", true);
53+
final boolean untagOnEnemyDeath = combat.getConfig().getBoolean("untag-on-enemy-death", true);
54+
55+
if (!untagOnDeath && !untagOnEnemyDeath) {
56+
return;
57+
}
58+
5059
if (untagOnDeath) {
51-
combat.forceCombatCleanup(victimUUID);
52-
if (combat.getGlowManager() != null) {
53-
combat.getGlowManager().setGlowing(victim, false);
54-
}
60+
untagPlayer(victimUUID, victim, false);
5561
}
62+
5663
if (untagOnEnemyDeath && opponentUUID != null) {
57-
combat.forceCombatCleanup(opponentUUID);
58-
Player opponent = combat.getServer().getPlayer(opponentUUID);
59-
if (opponent != null && opponent.isOnline()) {
60-
if (combat.getGlowManager() != null) {
61-
combat.getGlowManager().setGlowing(opponent, false);
62-
}
64+
Player opponent = Bukkit.getPlayer(opponentUUID);
65+
untagPlayer(opponentUUID, opponent, true);
66+
}
67+
}
6368

64-
String noLongerInCombatMsg;
65-
String noLongerInCombatType;
66-
if (combat.getConfig().isConfigurationSection("Messages.NoLongerInCombat")) {
67-
noLongerInCombatMsg = combat.getConfig().getString("Messages.NoLongerInCombat.text", "");
68-
noLongerInCombatType = combat.getConfig().getString("Messages.NoLongerInCombat.type", "chat");
69-
} else {
70-
noLongerInCombatMsg = combat.getConfig().getString("Messages.NoLongerInCombat", "");
71-
noLongerInCombatType = combat.getConfig().getString("Messages.NoLongerInCombat.type", "chat");
72-
}
73-
String prefix = combat.getMessage("Messages.Prefix");
74-
net.kyori.adventure.text.Component component = net.opmasterleo.combat.util.ChatUtil.parse(prefix + noLongerInCombatMsg);
75-
switch (noLongerInCombatType == null ? "chat" : noLongerInCombatType.toLowerCase()) {
69+
private void untagPlayer(UUID uuid, Player player, boolean sendMessage) {
70+
combat.getCombatRecords().remove(uuid);
71+
combat.getLastActionBarUpdates().remove(uuid);
72+
if (player != null && combat.getGlowManager() != null) {
73+
combat.getGlowManager().setGlowing(player, false, null);
74+
}
75+
76+
if (sendMessage && player != null && player.isOnline() && combat.isCombatVisible(player)) {
77+
String msg;
78+
String type;
79+
80+
if (combat.getConfig().isConfigurationSection("Messages.NoLongerInCombat")) {
81+
msg = combat.getConfig().getString("Messages.NoLongerInCombat.text", "");
82+
type = combat.getConfig().getString("Messages.NoLongerInCombat.type", "chat");
83+
} else {
84+
msg = combat.getConfig().getString("Messages.NoLongerInCombat", "");
85+
type = "chat";
86+
}
87+
88+
if (msg != null && !msg.isEmpty()) {
89+
String prefix = combat.getPrefix();
90+
net.kyori.adventure.text.Component component = net.opmasterleo.combat.util.ChatUtil.parse(prefix + msg);
91+
92+
switch (type == null ? "chat" : type.toLowerCase()) {
7693
case "actionbar":
77-
opponent.sendActionBar(component);
94+
player.sendActionBar(component);
7895
break;
7996
case "both":
80-
opponent.sendMessage(component);
81-
opponent.sendActionBar(component);
97+
player.sendMessage(component);
98+
player.sendActionBar(component);
8299
break;
83100
case "chat":
84101
default:
85-
opponent.sendMessage(component);
102+
player.sendMessage(component);
86103
break;
87104
}
88105
}
89106
}
90107
}
91-
92-
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
93-
public void handle(PlayerDeathEvent event) {
94-
Player player = event.getPlayer();
95-
Combat combat = Combat.getInstance();
96-
97-
Combat.CombatRecord record = combat.getCombatRecords().remove(player.getUniqueId());
98-
99-
if (combat.getGlowManager() != null) {
100-
combat.getGlowManager().setGlowing(player, false);
101-
if (record != null && record.opponent != null) {
102-
Player opponent = Bukkit.getPlayer(record.opponent);
103-
if (opponent != null) {
104-
combat.getGlowManager().setGlowing(opponent, false);
105-
}
106-
}
107-
}
108-
109-
if (record != null && record.opponent != null) {
110-
combat.getCombatRecords().remove(record.opponent);
111-
}
112-
}
113108
}

src/main/java/net/opmasterleo/combat/listener/player/PlayerQuitListener.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
package net.opmasterleo.combat.listener.player;
22

3-
import net.kyori.adventure.text.Component;
4-
import net.opmasterleo.combat.Combat;
5-
import net.opmasterleo.combat.util.ChatUtil;
3+
import java.util.UUID;
4+
65
import org.bukkit.Bukkit;
76
import org.bukkit.entity.Player;
87
import org.bukkit.event.EventHandler;
98
import org.bukkit.event.EventPriority;
109
import org.bukkit.event.Listener;
1110
import org.bukkit.event.player.PlayerQuitEvent;
1211

13-
import java.util.UUID;
12+
import net.kyori.adventure.text.Component;
13+
import net.opmasterleo.combat.Combat;
14+
import net.opmasterleo.combat.util.ChatUtil;
1415

1516
public class PlayerQuitListener implements Listener {
1617

@@ -23,11 +24,17 @@ public PlayerQuitListener() {
2324
@EventHandler(priority = EventPriority.HIGH)
2425
public void onPlayerQuit(PlayerQuitEvent event) {
2526
Player player = event.getPlayer();
26-
if (!plugin.isInCombat(player)) return;
27-
2827
UUID playerUUID = player.getUniqueId();
28+
if (!plugin.isInCombat(player)) {
29+
if (plugin.getGlowManager() != null) {
30+
plugin.getGlowManager().untrackPlayer(player);
31+
}
32+
return;
33+
}
34+
2935
Combat.CombatRecord record = plugin.getCombatRecords().get(playerUUID);
3036
Player opponent = null;
37+
3138
if (record != null && record.opponent != null) {
3239
opponent = Bukkit.getPlayer(record.opponent);
3340
if (opponent != null) {
@@ -40,7 +47,7 @@ public void onPlayerQuit(PlayerQuitEvent event) {
4047
} catch (Exception ignored) {
4148
}
4249

43-
if (opponent != null) {
50+
if (opponent != null && opponent.isOnline()) {
4451
String logoutMessage = plugin.getConfig().getString("Messages.CombatLogged.text", "");
4552
if (logoutMessage != null && !logoutMessage.isEmpty()) {
4653
logoutMessage = logoutMessage.replace("%player%", player.getName());
@@ -49,10 +56,10 @@ public void onPlayerQuit(PlayerQuitEvent event) {
4956
}
5057
}
5158

52-
plugin.getCombatRecords().remove(playerUUID);
5359
if (plugin.getGlowManager() != null) {
5460
plugin.getGlowManager().untrackPlayer(player);
5561
}
62+
5663
plugin.forceCombatCleanup(playerUUID);
5764
}
5865
}

0 commit comments

Comments
 (0)