From dbcbb10079c084e4466135d695e166712b246417 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Sun, 9 Feb 2025 22:10:48 +0100 Subject: [PATCH] Refactor player status handling and improve flag logic Rename OnPlayerJoin to OnPlayerOnlineStatus, adding logic for player disconnects. Enhance OnPlayerDeath and Flag classes to handle flag reset and notifications when a flag carrier dies or disconnects. --- src/main/java/com/alttd/ctf/Main.java | 6 +++--- .../com/alttd/ctf/events/OnPlayerDeath.java | 7 +++++-- ...yerJoin.java => OnPlayerOnlineStatus.java} | 11 ++++++++-- src/main/java/com/alttd/ctf/flag/Flag.java | 20 +++++++++++++++++++ 4 files changed, 37 insertions(+), 7 deletions(-) rename src/main/java/com/alttd/ctf/events/{OnPlayerJoin.java => OnPlayerOnlineStatus.java} (85%) diff --git a/src/main/java/com/alttd/ctf/Main.java b/src/main/java/com/alttd/ctf/Main.java index b192452..987422e 100644 --- a/src/main/java/com/alttd/ctf/Main.java +++ b/src/main/java/com/alttd/ctf/Main.java @@ -6,7 +6,7 @@ import com.alttd.ctf.config.GameConfig; import com.alttd.ctf.config.Messages; import com.alttd.ctf.events.InventoryItemInteractionEvent; import com.alttd.ctf.events.OnPlayerDeath; -import com.alttd.ctf.events.OnPlayerJoin; +import com.alttd.ctf.events.OnPlayerOnlineStatus; import com.alttd.ctf.events.SnowballEvent; import com.alttd.ctf.flag.Flag; import com.alttd.ctf.flag.FlagTryCaptureEvent; @@ -87,9 +87,9 @@ public class Main extends JavaPlugin { PluginManager pluginManager = getServer().getPluginManager(); pluginManager.registerEvents(new SnowballEvent(gameManager), this); pluginManager.registerEvents(new FlagTryCaptureEvent(flag), this); - pluginManager.registerEvents(new OnPlayerDeath(gameManager, worldBorderApi, this), this); + pluginManager.registerEvents(new OnPlayerDeath(gameManager, worldBorderApi, this, flag), this); pluginManager.registerEvents(new InventoryItemInteractionEvent(), this); - pluginManager.registerEvents(new OnPlayerJoin(gameManager, flag), this); + pluginManager.registerEvents(new OnPlayerOnlineStatus(gameManager, flag), this); pluginManager.registerEvents(new GUIListener(), this); } diff --git a/src/main/java/com/alttd/ctf/events/OnPlayerDeath.java b/src/main/java/com/alttd/ctf/events/OnPlayerDeath.java index d240a95..873e9a0 100644 --- a/src/main/java/com/alttd/ctf/events/OnPlayerDeath.java +++ b/src/main/java/com/alttd/ctf/events/OnPlayerDeath.java @@ -1,8 +1,8 @@ package com.alttd.ctf.events; import com.alttd.ctf.Main; -import com.alttd.ctf.config.Config; import com.alttd.ctf.config.GameConfig; +import com.alttd.ctf.flag.Flag; import com.alttd.ctf.game.GameManager; import com.alttd.ctf.game.GamePhase; import com.alttd.ctf.team.TeamPlayer; @@ -24,11 +24,13 @@ public class OnPlayerDeath implements Listener { private final GameManager gameManager; private final WorldBorderApi worldBorderApi; private final Main main; + private final Flag flag; - public OnPlayerDeath(GameManager gameManager, WorldBorderApi worldBorderApi, Main main) { + public OnPlayerDeath(GameManager gameManager, WorldBorderApi worldBorderApi, Main main, Flag flag) { this.gameManager = gameManager; this.worldBorderApi = worldBorderApi; this.main = main; + this.flag = flag; } @EventHandler @@ -41,6 +43,7 @@ public class OnPlayerDeath implements Listener { Player player = event.getPlayer(); player.getInventory().clear(); player.updateInventory(); + flag.handleCarrierDeathOrDisconnect(player); } @EventHandler diff --git a/src/main/java/com/alttd/ctf/events/OnPlayerJoin.java b/src/main/java/com/alttd/ctf/events/OnPlayerOnlineStatus.java similarity index 85% rename from src/main/java/com/alttd/ctf/events/OnPlayerJoin.java rename to src/main/java/com/alttd/ctf/events/OnPlayerOnlineStatus.java index 0ebeb3d..d9e7e59 100644 --- a/src/main/java/com/alttd/ctf/events/OnPlayerJoin.java +++ b/src/main/java/com/alttd/ctf/events/OnPlayerOnlineStatus.java @@ -12,17 +12,19 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.jetbrains.annotations.NotNull; import java.util.Comparator; import java.util.Optional; @Slf4j -public class OnPlayerJoin implements Listener { +public class OnPlayerOnlineStatus implements Listener { private final GameManager gameManager; private final Flag flag; - public OnPlayerJoin(GameManager gameManager, Flag flag) { + public OnPlayerOnlineStatus(GameManager gameManager, Flag flag) { this.gameManager = gameManager; this.flag = flag; } @@ -64,4 +66,9 @@ public class OnPlayerJoin implements Listener { player.teleportAsync(teamPlayer.getTeam().getSpawnLocation()); } + @EventHandler + public void onPlayerJoin(@NotNull PlayerQuitEvent event) { + flag.handleCarrierDeathOrDisconnect(event.getPlayer()); + } + } diff --git a/src/main/java/com/alttd/ctf/flag/Flag.java b/src/main/java/com/alttd/ctf/flag/Flag.java index 386ff09..34f90f7 100644 --- a/src/main/java/com/alttd/ctf/flag/Flag.java +++ b/src/main/java/com/alttd/ctf/flag/Flag.java @@ -84,6 +84,9 @@ public class Flag implements Runnable { ))); flagCarrier = player; teamFlagPointCount.clear(); + winningTeam = null; + lastWinningTeamId = -1; + bossBar.setProgress(0); } public void spawnFlag() { @@ -310,4 +313,21 @@ public class Flag implements Runnable { wins.clear(); lastWinningTeamId = -1; } + + public void handleCarrierDeathOrDisconnect(Player player) { + if (flagCarrier == null) { + return; + } + if (!flagCarrier.getUniqueId().equals(player.getUniqueId())) { + return; + } + flagCarrier = null; + particleTrail.clear(); + spawnFlag(); + gameManager.getTeam(player.getUniqueId()) + .ifPresentOrElse(team -> Bukkit.broadcast(MiniMessage.miniMessage() + .deserialize("'s flag carrier died! The flag has respawned", + Placeholder.component("team", team.getName()))), + () -> log.warn("A flag carrier died who was not part of a team")); + } }