diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/TypeBedWarsGameLoader.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/TypeBedWarsGameLoader.java index ae208e707..d4207abc5 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/TypeBedWarsGameLoader.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/TypeBedWarsGameLoader.java @@ -113,12 +113,6 @@ public static Game getGameById(@NotNull String gameId) { .orElse(null); } - public static Game getPlayerGame(@NotNull Player player) { - String gameId = player.getTag(Tag.String("gameId")); - if (gameId == null) return null; - return getGameById(gameId); - } - @SneakyThrows public static Game createGame(BedWarsMapsConfig.MapEntry entry) { if (games.size() >= MAX_GAMES) { @@ -145,7 +139,8 @@ private static Component header() { private static Component footer(HypixelPlayer player) { Component start = Component.empty(); - if (TypeBedWarsGameLoader.getPlayerGame(player) != null) { + BedWarsPlayer bwPlayer = (BedWarsPlayer) player; + if (bwPlayer.getGame() != null) { start = start.append(MiniMessage.miniMessage().deserialize("Kills: 0 Final Kills: 0 Beds Broken: 0")).appendNewline(); } return start diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/commands/ForceStartCommand.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/commands/ForceStartCommand.java index e50aa5404..26d7bc971 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/commands/ForceStartCommand.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/commands/ForceStartCommand.java @@ -20,7 +20,7 @@ public void registerUsage(MinestomCommand command) { command.addSyntax((sender, context) -> { if (!permissionCheck(sender)) return; BedWarsPlayer player = (BedWarsPlayer) sender; - Game game = TypeBedWarsGameLoader.getPlayerGame(player); + Game game = player.getGame(); if (game == null) { player.sendMessage("§cYou are not in a game."); return; diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/commands/ShoutCommand.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/commands/ShoutCommand.java index beaa3aa0c..1521b198e 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/commands/ShoutCommand.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/commands/ShoutCommand.java @@ -26,8 +26,7 @@ public void registerUsage(MinestomCommand command) { if (!permissionCheck(sender)) return; BedWarsPlayer player = (BedWarsPlayer) sender; - Game game = TypeBedWarsGameLoader.getPlayerGame(player); - + Game game = player.getGame(); if (game == null) { player.sendMessage("§cYou are not in a game."); return; diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameBreak.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameBreak.java index 61403d2fa..f0d1051a5 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameBreak.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameBreak.java @@ -30,19 +30,14 @@ public void run(PlayerBlockBreakEvent event) { BedWarsPlayer player = (BedWarsPlayer) event.getPlayer(); Block blockBeingBroken = event.getBlock(); - if (!player.hasTag(Tag.String("gameId"))) { - event.setCancelled(true); - return; - } - String gameId = player.getTag(Tag.String("gameId")); - Game game = TypeBedWarsGameLoader.getGameById(gameId); + Game game = player.getGame(); if (game == null || game.getGameStatus() != GameStatus.IN_PROGRESS) { event.setCancelled(true); return; } boolean isTeamBedPart = false; - String playerTeamName = player.getTag(Tag.String("team")); + TeamKey playerTeamKey = player.getTeamKey(); Point brokenBlockPosition = event.getBlockPosition(); // Check if it's a part of any team's bed first @@ -57,7 +52,7 @@ public void run(PlayerBlockBreakEvent event) { if (brokenBlockPosition.sameBlock(feetPoint) || brokenBlockPosition.sameBlock(headPoint)) { // This is team X's bed - if (teamKey.getName().equalsIgnoreCase(playerTeamName)) { + if (teamKey.equals(playerTeamKey)) { player.getAchievementHandler().completeAchievement("bedwars.you_cant_do_that"); player.sendMessage("§cYou cannot break your own team's bed!"); event.setCancelled(true); diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameCombatTrack.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameCombatTrack.java index 4874d0664..c9bfa0323 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameCombatTrack.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameCombatTrack.java @@ -1,8 +1,7 @@ package net.swofty.type.bedwarsgame.events; -import net.minestom.server.tag.Tag; +import net.swofty.commons.bedwars.map.BedWarsMapsConfig; import net.swofty.pvp.events.FinalDamageEvent; -import net.swofty.type.bedwarsgame.TypeBedWarsGameLoader; import net.swofty.type.bedwarsgame.death.BedWarsCombatTracker; import net.swofty.type.bedwarsgame.game.Game; import net.swofty.type.bedwarsgame.game.GameStatus; @@ -19,13 +18,7 @@ public void run(FinalDamageEvent event) { return; } - if (!victim.hasTag(Tag.String("gameId"))) { - return; - } - - String gameId = victim.getTag(Tag.String("gameId")); - Game game = TypeBedWarsGameLoader.getGameById(gameId); - + Game game = victim.getGame(); if (game == null || game.getGameStatus() != GameStatus.IN_PROGRESS) { return; } @@ -37,10 +30,13 @@ public void run(FinalDamageEvent event) { } } - private boolean isSameTeam(BedWarsPlayer player1, BedWarsPlayer player2) { - String team1 = player1.getTag(Tag.String("team")); - String team2 = player2.getTag(Tag.String("team")); - return team1 != null && team1.equals(team2); + private boolean isSameTeam(BedWarsPlayer first, BedWarsPlayer second) { + BedWarsMapsConfig.TeamKey team1 = first.getTeamKey(); + BedWarsMapsConfig.TeamKey team2 = second.getTeamKey(); + if (team1 == null || team2 == null) { + return false; + } + return team1.equals(team2); } } diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameCustomItems.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameCustomItems.java index 511b8081d..b68c07fbd 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameCustomItems.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameCustomItems.java @@ -14,10 +14,12 @@ import net.minestom.server.instance.Instance; import net.minestom.server.instance.block.Block; import net.minestom.server.tag.Tag; +import net.swofty.commons.bedwars.map.BedWarsMapsConfig; import net.swofty.pvp.projectile.entities.FireballProjectile; import net.swofty.type.bedwarsgame.TypeBedWarsGameLoader; import net.swofty.type.bedwarsgame.game.Game; import net.swofty.type.bedwarsgame.game.GameStatus; +import net.swofty.type.bedwarsgame.user.BedWarsPlayer; import net.swofty.type.generic.event.EventNodes; import net.swofty.type.generic.event.HypixelEvent; import net.swofty.type.generic.event.HypixelEventClass; @@ -33,14 +35,13 @@ private static void handleFireballExplosion(FireballProjectile fireball) { return; } - final Player shooter = (Player) fireball.getShooter(); + final BedWarsPlayer shooter = (BedWarsPlayer) fireball.getShooter(); if (shooter == null) { fireball.remove(); return; } - String gameId = shooter.getTag(Tag.String("gameId")); - Game game = TypeBedWarsGameLoader.getGameById(gameId); + Game game = shooter.getGame(); if (game == null || game.getGameStatus() != GameStatus.IN_PROGRESS) { fireball.remove(); return; @@ -84,11 +85,11 @@ public void run(ProjectileCollideWithEntityEvent event) { return; // Don't explode on self } - if (target instanceof Player targetPlayer) { - final Player shooter = (Player) fireball.getShooter(); + if (target instanceof BedWarsPlayer targetPlayer) { + final BedWarsPlayer shooter = (BedWarsPlayer) fireball.getShooter(); if (shooter != null) { - String shooterTeam = shooter.getTag(Tag.String("team")); - String targetTeam = targetPlayer.getTag(Tag.String("team")); + BedWarsMapsConfig.TeamKey shooterTeam = shooter.getTeamKey(); + BedWarsMapsConfig.TeamKey targetTeam = targetPlayer.getTeamKey(); if (shooterTeam != null && shooterTeam.equals(targetTeam)) { return; } diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameDeath.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameDeath.java index 626d73def..51e723331 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameDeath.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameDeath.java @@ -45,12 +45,7 @@ public class ActionGameDeath implements HypixelEventClass { public void run(PlayerDeathEvent event) { BedWarsPlayer player = (BedWarsPlayer) event.getPlayer(); - if (!player.hasTag(Tag.String("gameId"))) { - return; - } - String gameId = player.getTag(Tag.String("gameId")); - Game game = TypeBedWarsGameLoader.getGameById(gameId); - + Game game = player.getGame(); if (game == null || game.getGameStatus() != GameStatus.IN_PROGRESS) { return; } diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameMove.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameMove.java index a86150188..d01334429 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameMove.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGameMove.java @@ -27,13 +27,11 @@ public class ActionGameMove implements HypixelEventClass { public void run(PlayerMoveEvent event) { BedWarsPlayer player = (BedWarsPlayer) event.getPlayer(); - if (!player.isOnline() || !player.hasTag(Tag.String("gameId"))) { + if (!player.isOnline()) { return; } - String gameId = player.getTag(Tag.String("gameId")); - Game game = TypeBedWarsGameLoader.getGameById(gameId); - + Game game = player.getGame(); if (game == null || game.getGameStatus() != GameStatus.IN_PROGRESS) { return; } @@ -48,8 +46,8 @@ public void run(PlayerMoveEvent event) { return; } - String playerTeamName = player.getTag(Tag.String("team")); - if (playerTeamName == null) { + TeamKey playerTeamKey = player.getTeamKey(); + if (playerTeamKey == null) { return; } @@ -61,7 +59,7 @@ public void run(PlayerMoveEvent event) { MapTeam team = entry.getValue(); // Don't trigger own team's traps - if (teamKey.getName().equals(playerTeamName)) { + if (teamKey.equals(playerTeamKey)) { continue; } diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGamePlace.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGamePlace.java index 8bc0370c9..616af57d7 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGamePlace.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGamePlace.java @@ -19,13 +19,16 @@ import net.swofty.type.generic.event.HypixelEvent; import net.swofty.type.generic.event.HypixelEventClass; import net.swofty.type.generic.utility.MathUtility; +import org.tinylog.Logger; public class ActionGamePlace implements HypixelEventClass { @HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = false) public void run(PlayerBlockPlaceEvent event) { BedWarsPlayer player = (BedWarsPlayer) event.getPlayer(); - if (!player.hasTag(Tag.String("gameId"))) { + Game game = player.getGame(); + if (game == null) { + Logger.info("Player {} tried to place a block but is not in a game!", player.getUsername()); event.setCancelled(true); // Prevent placing if not in a game return; } @@ -36,10 +39,7 @@ public void run(PlayerBlockPlaceEvent event) { return; } - String gameId = player.getTag(Tag.String("gameId")); - Game game = TypeBedWarsGameLoader.getGameById(gameId); - - if (game == null || game.getGameStatus() != GameStatus.IN_PROGRESS) { + if (game.getGameStatus() != GameStatus.IN_PROGRESS) { event.setCancelled(true); return; } diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGamePlayerEvent.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGamePlayerEvent.java index a7e2eafd6..012a8f89e 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGamePlayerEvent.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionGamePlayerEvent.java @@ -33,49 +33,49 @@ public class ActionGamePlayerEvent implements HypixelEventClass { - public static final ConcurrentHashMap ACTIVE_TEAM_CHESTS = new ConcurrentHashMap<>(); + public static final ConcurrentHashMap ACTIVE_TEAM_CHESTS = new ConcurrentHashMap<>(); @HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = false) public void run(InventoryPreClickEvent event) { if (!(event.getInventory() instanceof PlayerInventory)) { return; } - Player player = event.getPlayer(); - if (player.hasTag(Tag.String("gameId"))) { - if (event.getClickedItem().material().isArmor()) { - event.setCancelled(true); - return; - } - String gameId = player.getTag(Tag.String("gameId")); - Game game = TypeBedWarsGameLoader.getGameById(gameId); - if (game.getGameStatus() == GameStatus.WAITING) { - event.setCancelled(true); - } + BedWarsPlayer player = (BedWarsPlayer) event.getPlayer(); + if (event.getClickedItem().material().isArmor()) { + event.setCancelled(true); + return; + } + Game game = player.getGame(); + if (game == null) { + event.setCancelled(true); + return; + } + ; + if (game.getGameStatus() == GameStatus.WAITING) { + event.setCancelled(true); } } @HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = false) public void run(ItemDropEvent event) { - ItemEntity itemEntity = new ItemEntity(event.getItemStack()); - itemEntity.setInstance(event.getPlayer().getInstance(), event.getPlayer().getPosition().add(0, event.getPlayer().getEyeHeight(), 0)); - itemEntity.setVelocity(event.getPlayer().getPosition().add(0, 0.3, 0).direction().mul(6)); - itemEntity.setPickupDelay(Duration.ofMillis(500)); - if (event.getPlayer().hasTag(Tag.String("gameId"))) { - switch (event.getItemStack().material().name()) { - case "wooden_sword": - case "wooden_pickaxe": - case "wooden_axe": - case "stone_axe": - case "iron_pickaxe": - case "iron_axe": - case "diamond_pickaxe": - case "diamond_axe": - event.setCancelled(true); - event.getPlayer().sendMessage("§cYou cannot drop your tools!"); - break; - default: - break; - } + switch (event.getItemStack().material().name()) { + case "wooden_sword": + case "wooden_pickaxe": + case "wooden_axe": + case "stone_axe": + case "iron_pickaxe": + case "iron_axe": + case "diamond_pickaxe": + case "diamond_axe": + event.setCancelled(true); + event.getPlayer().sendMessage("§cYou cannot drop your tools!"); + break; + default: + ItemEntity itemEntity = new ItemEntity(event.getItemStack()); + itemEntity.setInstance(event.getPlayer().getInstance(), event.getPlayer().getPosition().add(0, event.getPlayer().getEyeHeight(), 0)); + itemEntity.setVelocity(event.getPlayer().getPosition().add(0, 0.3, 0).direction().mul(6)); + itemEntity.setPickupDelay(Duration.ofMillis(500)); + break; } } @@ -83,7 +83,7 @@ public void run(ItemDropEvent event) { public void run(PlayerBlockInteractEvent event) { Block block = event.getBlock(); BedWarsPlayer player = (BedWarsPlayer) event.getPlayer(); - if (!player.hasTag(Tag.String("gameId"))) { + if (player.getGame() == null) { event.setCancelled(true); return; } @@ -94,21 +94,20 @@ public void run(PlayerBlockInteractEvent event) { if (block.registry().material() != Material.CHEST) return; - String gameId = player.getTag(Tag.String("gameId")); - Game game = TypeBedWarsGameLoader.getGameById(gameId); + Game game = player.getGame(); if (game == null || game.getGameStatus() != GameStatus.IN_PROGRESS) { event.setCancelled(true); return; } - String teamName = player.getTag(Tag.String("team")); - if (teamName == null) { + TeamKey playerTeamKey = player.getTeamKey(); + if (playerTeamKey == null) { event.setCancelled(true); return; } - String chestTeamName = null; double closestDistance = Double.MAX_VALUE; + TeamKey chestTeamKey = null; for (java.util.Map.Entry entry : game.getMapEntry().getConfiguration().getTeams().entrySet()) { TeamKey teamKey = entry.getKey(); @@ -124,29 +123,29 @@ public void run(PlayerBlockInteractEvent event) { if (distance < 10.0 && distance < closestDistance) { closestDistance = distance; - chestTeamName = teamKey.getName(); + chestTeamKey = teamKey; } } - if (chestTeamName == null) { + if (chestTeamKey == null) { return; } - boolean sameTeam = chestTeamName.equals(teamName); - if (!sameTeam && game.getTeamManager().getTeamBedStatus().getOrDefault(chestTeamName, false)) { + boolean sameTeam = chestTeamKey.equals(playerTeamKey); + if (!sameTeam && game.getTeamManager().getTeamBedStatus().getOrDefault(chestTeamKey, false)) { event.setCancelled(true); player.sendMessage("§cYou can only access enemy team chests if their bed is destroyed!"); return; } - String existingContextId = ACTIVE_TEAM_CHESTS.get(chestTeamName); - GUITeamChest teamChest = new GUITeamChest(chestTeamName); + String existingContextId = ACTIVE_TEAM_CHESTS.get(chestTeamKey); + GUITeamChest teamChest = new GUITeamChest(chestTeamKey); if (existingContextId != null) { teamChest.joinSharedContext(player, existingContextId); } else { String contextId = teamChest.createSharedContext(player); - ACTIVE_TEAM_CHESTS.put(chestTeamName, contextId); + ACTIVE_TEAM_CHESTS.put(chestTeamKey, contextId); } } @@ -156,12 +155,7 @@ public void run(PlayerStartDiggingEvent event) { BedWarsPlayer player = (BedWarsPlayer) event.getPlayer(); ItemStack itemInHand = player.getItemInMainHand(); - if (!player.hasTag(Tag.String("gameId"))) { - return; - } - - String gameId = player.getTag(Tag.String("gameId")); - Game game = TypeBedWarsGameLoader.getGameById(gameId); + Game game = player.getGame(); if (game == null || game.getGameStatus() != GameStatus.IN_PROGRESS) { return; } @@ -217,15 +211,16 @@ public void run(PlayerStartDiggingEvent event) { if (block.registry().material() == Material.CHEST) { event.setCancelled(true); - String playerTeamName = player.getTag(Tag.String("team")); + + TeamKey playerTeamName = player.getTeamKey(); if (playerTeamName == null) { return; } - String chestTeamName = null; + TeamKey chestTeamName = null; double closestDistance = Double.MAX_VALUE; - for (java.util.Map.Entry entry : game.getMapEntry().getConfiguration().getTeams().entrySet()) { + for (Map.Entry entry : game.getMapEntry().getConfiguration().getTeams().entrySet()) { TeamKey teamKey = entry.getKey(); MapTeam team = entry.getValue(); BedWarsMapsConfig.PitchYawPosition teamSpawn = team.getSpawn(); @@ -239,7 +234,7 @@ public void run(PlayerStartDiggingEvent event) { if (distance < 10.0 && distance < closestDistance) { closestDistance = distance; - chestTeamName = teamKey.getName(); + chestTeamName = teamKey; } } diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionPlayerChat.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionPlayerChat.java index 92b505c29..b6ec5f11c 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionPlayerChat.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionPlayerChat.java @@ -27,7 +27,7 @@ public void run(PlayerChatEvent event) { final BedWarsPlayer player = (BedWarsPlayer) event.getPlayer(); event.setCancelled(true); - Game game = TypeBedWarsGameLoader.getPlayerGame(player); + Game game = player.getGame(); if (game == null) return; BedWarsDataHandler bedWarsDataHandler = BedWarsDataHandler.getUser(player); diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionPlayerDisconnect.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionPlayerDisconnect.java index c5aecec65..077980690 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionPlayerDisconnect.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionPlayerDisconnect.java @@ -16,7 +16,7 @@ public class ActionPlayerDisconnect implements HypixelEventClass { @HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = false) public void run(PlayerDisconnectEvent event) { final BedWarsPlayer player = (BedWarsPlayer) event.getPlayer(); - Game game = TypeBedWarsGameLoader.getPlayerGame(player); + Game game = player.getGame(); if (game != null) { if (game.getGameStatus() == GameStatus.IN_PROGRESS) { // Use handleDisconnect for active games to enable rejoin diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/game/DisconnectedPlayerInfo.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/game/DisconnectedPlayerInfo.java index ebe09acaa..eb26d8367 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/game/DisconnectedPlayerInfo.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/game/DisconnectedPlayerInfo.java @@ -5,10 +5,6 @@ import java.util.UUID; -/** - * Holds information about a player who disconnected from an active game. - * Used to restore state when they rejoin. - */ @Getter public class DisconnectedPlayerInfo { private final UUID playerUuid; @@ -17,7 +13,6 @@ public class DisconnectedPlayerInfo { private final long disconnectTime; private final boolean bedWasAliveOnDisconnect; - // Saved player state for restoration private final int armorLevel; private final int pickaxeLevel; private final int axeLevel; @@ -35,11 +30,4 @@ public DisconnectedPlayerInfo(UUID playerUuid, String username, TeamKey teamKey, this.axeLevel = axeLevel; } - /** - * Determines if player should rejoin as spectator. - * True if bed was already broken when they disconnected. - */ - public boolean shouldRejoinAsSpectator() { - return !bedWasAliveOnDisconnect; - } } diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/game/Game.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/game/Game.java index 524236f14..abb710422 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/game/Game.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/game/Game.java @@ -59,7 +59,7 @@ public final class Game { private final GameCountdown countdown; private final GameEventManager eventManager; - private final Map> chests = new HashMap<>(); + private final Map> chests = new HashMap<>(); private final Map> enderchests = new HashMap<>(); // Track players who disconnected during an active game for rejoin @@ -118,8 +118,8 @@ public void join(BedWarsPlayer player) { } } - public void leave(HypixelPlayer player) { - String teamName = player.getTag(Tag.String("team")); + public void leave(BedWarsPlayer player) { + TeamKey teamName = player.getTeamKey(); players.remove(player); player.removeTag(Tag.String("gameId")); @@ -143,9 +143,7 @@ public void handleDisconnect(BedWarsPlayer player) { return; } - String teamName = player.getTag(Tag.String("team")); - TeamKey teamKey = teamManager.getTeamKeyByName(teamName); - + TeamKey teamKey = player.getTeamKey(); boolean bedAlive = teamKey != null && teamManager.isBedAlive(teamKey); // Get current upgrade levels @@ -175,7 +173,7 @@ public void handleDisconnect(BedWarsPlayer player) { ); Logger.info("Player {} disconnected from game {} (team: {}, bed alive: {})", - player.getUsername(), gameId, teamName, bedAlive); + player.getUsername(), gameId, teamKey, bedAlive); // Clear player tags and send to lobby player.removeTag(Tag.String("gameId")); @@ -234,11 +232,8 @@ public void rejoin(BedWarsPlayer player) { Logger.info("Player {} rejoined game {} (team: {})", player.getUsername(), gameId, info.getTeamKey().getName()); - // Check if bed is currently destroyed (may have been destroyed while disconnected) - boolean bedCurrentlyAlive = teamManager.isBedAlive(info.getTeamKey()); - - if (info.shouldRejoinAsSpectator() || !bedCurrentlyAlive) { - // Rejoin as spectator - bed was broken when they left or is now broken + // check if bed is alive, if not, set up as spectator + if (!teamManager.isBedAlive(info.getTeamKey())) { setupAsSpectator(player); } else { // Normal rejoin with respawn timer @@ -419,9 +414,9 @@ public void recordBedDestroyed(TeamKey teamKey) { checkForWinCondition(); } - public void playerEliminated(Player player) { + public void playerEliminated(BedWarsPlayer player) { player.setTag(ELIMINATED_TAG, true); - String teamName = player.getTag(Tag.String("team")); + TeamKey teamName = player.getTeamKey(); Logger.info("Player {} from team {} eliminated", player.getUsername(), teamName != null ? teamName : "N/A"); checkForWinCondition(); } @@ -430,7 +425,7 @@ public void checkForWinCondition() { if (gameStatus != GameStatus.IN_PROGRESS) return; List viableTeams = mapEntry.getConfiguration().getTeams().keySet().stream() - .filter(teamKey -> hasPlayersOnTeam(teamKey) && isTeamViable(teamKey)) + .filter(this::isTeamViable) .toList(); if (viableTeams.size() <= 1) { @@ -439,24 +434,15 @@ public void checkForWinCondition() { } } - private boolean hasPlayersOnTeam(TeamKey teamKey) { - // Check active players - boolean hasActivePlayers = players.stream().anyMatch(p -> teamKey.getName().equals(p.getTag(Tag.String("team")))); - if (hasActivePlayers) return true; - - // Check disconnected players who can still rejoin (bed was alive when they left) - return disconnectedPlayers.values().stream() - .anyMatch(info -> info.getTeamKey() == teamKey && info.isBedWasAliveOnDisconnect()); - } - private boolean isTeamViable(TeamKey teamKey) { // A team is viable if: // 1. Bed is alive, OR // 2. Has active (non-eliminated) players online, OR - // 3. Has disconnected players who can still rejoin (bed was alive when they left) + // 3. Has disconnected players who can still rejoin + // 4. Has not been vibecoded by Swofty boolean hasActivePlayers = teamManager.countActivePlayersOnTeam(teamKey) > 0; boolean hasRejoinablePlayers = disconnectedPlayers.values().stream() - .anyMatch(info -> info.getTeamKey() == teamKey && info.isBedWasAliveOnDisconnect()); + .anyMatch(info -> info.getTeamKey() == teamKey && teamManager.isBedAlive(info.getTeamKey())); return teamManager.isBedAlive(teamKey) || hasActivePlayers || hasRejoinablePlayers; } diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/game/TeamManager.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/game/TeamManager.java index a503287e3..28c3ffdb3 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/game/TeamManager.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/game/TeamManager.java @@ -177,7 +177,7 @@ public void removeTeamTrap(TeamKey teamKey, String trapKey) { public List getPlayersOnTeam(TeamKey teamKey) { return game.getPlayers().stream() - .filter(player -> teamKey.getName().equals(player.getTag(Tag.String("team"))) + .filter(player -> teamKey.equals(player.getTeamKey()) && player.isOnline() && !Boolean.TRUE.equals(player.getTag(Game.ELIMINATED_TAG))) .collect(Collectors.toList()); @@ -185,7 +185,7 @@ public List getPlayersOnTeam(TeamKey teamKey) { public int countActivePlayersOnTeam(TeamKey teamKey) { return (int) game.getPlayers().stream() - .filter(player -> teamKey.getName().equals(player.getTag(Tag.String("team"))) + .filter(player -> teamKey.equals(player.getTeamKey()) && player.isOnline() && !Boolean.TRUE.equals(player.getTag(Game.ELIMINATED_TAG))) .count(); diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/gui/GUIEnderChest.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/gui/GUIEnderChest.java index a5f7ac6ec..7c881c8a6 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/gui/GUIEnderChest.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/gui/GUIEnderChest.java @@ -8,6 +8,7 @@ import net.minestom.server.tag.Tag; import net.swofty.type.bedwarsgame.TypeBedWarsGameLoader; import net.swofty.type.bedwarsgame.game.Game; +import net.swofty.type.bedwarsgame.user.BedWarsPlayer; import net.swofty.type.generic.gui.inventory.HypixelInventoryGUI; import net.swofty.type.generic.user.HypixelPlayer; @@ -22,11 +23,8 @@ public GUIEnderChest() { @Override public void setItems(InventoryGUIOpenEvent event) { - HypixelPlayer player = event.player(); - String gameId = player.getTag(Tag.String("gameId")); - if (gameId == null) return; - - Game game = TypeBedWarsGameLoader.getGameById(gameId); + BedWarsPlayer player = (BedWarsPlayer) event.player(); + Game game = player.getGame(); if (game == null) return; Map enderChest = game.getEnderchests().get(player); @@ -53,11 +51,9 @@ public void suddenlyQuit(Inventory inventory, HypixelPlayer player) { closeSave(player); } - private void closeSave(HypixelPlayer player) { - String gameId = player.getTag(Tag.String("gameId")); - if (gameId == null) return; - - Game game = TypeBedWarsGameLoader.getGameById(gameId); + private void closeSave(HypixelPlayer p) { + BedWarsPlayer player = (BedWarsPlayer) p; + Game game = player.getGame(); if (game == null) return; Map enderChest = new ConcurrentHashMap<>(); diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/gui/GUITeamChest.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/gui/GUITeamChest.java index 5bbee3a02..c2b6441b0 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/gui/GUITeamChest.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/gui/GUITeamChest.java @@ -5,36 +5,37 @@ import net.minestom.server.inventory.click.Click; import net.minestom.server.item.ItemStack; import net.minestom.server.tag.Tag; +import net.swofty.commons.bedwars.map.BedWarsMapsConfig; import net.swofty.type.bedwarsgame.TypeBedWarsGameLoader; import net.swofty.type.bedwarsgame.events.ActionGamePlayerEvent; import net.swofty.type.bedwarsgame.game.Game; +import net.swofty.type.bedwarsgame.user.BedWarsPlayer; import net.swofty.type.generic.gui.inventory.SharedInventory; import net.swofty.type.generic.gui.inventory.item.GUIClickableItem; import net.swofty.type.generic.user.HypixelPlayer; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public class GUITeamChest extends SharedInventory { - private final String teamName; + private final BedWarsMapsConfig.TeamKey teamKey; - public GUITeamChest(String teamName) { - super(teamName.toUpperCase() + "'s Team Chest", InventoryType.CHEST_3_ROW); - this.teamName = teamName; + public GUITeamChest(BedWarsMapsConfig.TeamKey teamName) { + super(teamName.getName() + "'s Team Chest", InventoryType.CHEST_3_ROW); + this.teamKey = teamName; } @Override public void setItems(InventoryGUIOpenEvent e) { if (sharedContext == null) return; - HypixelPlayer player = e.player(); - String gameId = player.getTag(Tag.String("gameId")); - if (gameId == null) return; + BedWarsPlayer player = (BedWarsPlayer) e.player(); - Game game = TypeBedWarsGameLoader.getGameById(gameId); + Game game = player.getGame(); if (game == null) return; - Map teamChest = game.getChests().get(teamName); + Map teamChest = game.getChests().get(teamKey); if (teamChest != null) { setSharedItems(teamChest); } @@ -176,7 +177,7 @@ public void onBottomClick(InventoryPreClickEvent e) { @Override protected void onContextClosed(SharedInventoryContext context) { - ActionGamePlayerEvent.ACTIVE_TEAM_CHESTS.remove(teamName); + ActionGamePlayerEvent.ACTIVE_TEAM_CHESTS.remove(teamKey); } @Override @@ -196,7 +197,7 @@ protected void onSharedItemChanged(int slot, ItemStack oldItem, ItemStack newIte continue; } - Map teamChest = game.getChests().computeIfAbsent(teamName, k -> new java.util.concurrent.ConcurrentHashMap<>()); + Map teamChest = game.getChests().computeIfAbsent(teamKey, k -> new ConcurrentHashMap<>()); if (newItem.isAir()) { teamChest.remove(slot); } else { diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/gui/GUITeamShop.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/gui/GUITeamShop.java index bc2866570..a83795778 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/gui/GUITeamShop.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/gui/GUITeamShop.java @@ -48,7 +48,7 @@ public boolean allowHotkeying() { @Override public void onOpen(InventoryGUIOpenEvent e) { - updateGUI(e.player()); + updateGUI((BedWarsPlayer) e.player()); } @Override @@ -56,16 +56,15 @@ public void onBottomClick(InventoryPreClickEvent e) { e.setCancelled(true); } - private void updateGUI(HypixelPlayer player) { - // Clear / fill separators + private void updateGUI(BedWarsPlayer player) { for (int slot : SEPARATOR_SLOTS) { set(slot, ItemStack.builder(Material.GRAY_STAINED_GLASS_PANE) .customName(noItalic(Component.text(" ")))); } - Game game = TypeBedWarsGameLoader.getPlayerGame(player); - String teamName = player.getTag(Tag.String("team")); - if (game == null || teamName == null) { + Game game = player.getGame(); + BedWarsMapsConfig.TeamKey teamKey = player.getTeamKey(); + if (game == null || teamKey == null) { // Show error placeholders for (int slot : UPGRADE_SLOTS) { set(slot, ItemStack.builder(Material.BARRIER) @@ -86,7 +85,7 @@ private void updateGUI(HypixelPlayer player) { public void run(InventoryPreClickEvent event, HypixelPlayer p) { if (index >= upgrades.size()) return; BedWarsPlayer player = (BedWarsPlayer) p; - Game playerGame = TypeBedWarsGameLoader.getPlayerGame(player); + Game playerGame = player.getGame(); if (playerGame == null) return; TeamUpgrade upgrade = upgrades.get(index); TeamUpgradeTier nextTier = upgrade.getNextTier(playerGame, player.getTeamKey()); @@ -109,7 +108,7 @@ public void run(InventoryPreClickEvent event, HypixelPlayer p) { public ItemStack.Builder getItem(HypixelPlayer p) { if (index >= upgrades.size()) return ItemStack.builder(Material.AIR); BedWarsPlayer player = (BedWarsPlayer) p; - Game playerGame = TypeBedWarsGameLoader.getPlayerGame(player); + Game playerGame = player.getGame(); BedWarsMapsConfig.TeamKey tag = player.getTeamKey(); if (playerGame == null || tag == null) return ItemStack.builder(Material.BARRIER) .customName(noItalic(Component.text("No Game").color(NamedTextColor.RED))); @@ -161,7 +160,7 @@ public void run(InventoryPreClickEvent event, HypixelPlayer p) { BedWarsPlayer player = (BedWarsPlayer) p; BedWarsMapsConfig.TeamKey tag = player.getTeamKey(); - Game playerGame = TypeBedWarsGameLoader.getPlayerGame(player); + Game playerGame = player.getGame(); if (playerGame == null || tag == null) return; int trapSize = playerGame.getTeamManager().getTeamTraps(tag).size(); if (trapSize >= 3) { @@ -195,9 +194,9 @@ public void run(InventoryPreClickEvent event, HypixelPlayer p) { @Override public ItemStack.Builder getItem(HypixelPlayer player) { if (index >= traps.size()) return ItemStack.builder(Material.AIR); - Game playerGame = TypeBedWarsGameLoader.getPlayerGame(player); BedWarsPlayer bwPlayer = (BedWarsPlayer) player; BedWarsMapsConfig.TeamKey t = bwPlayer.getTeamKey(); + Game playerGame = bwPlayer.getGame(); if (playerGame == null || t == null) return ItemStack.builder(Material.BARRIER) .customName(noItalic(Component.text("No Game").color(NamedTextColor.RED))); Trap trap = traps.get(index); @@ -235,8 +234,8 @@ public void run(InventoryPreClickEvent event, HypixelPlayer player) { @Override public ItemStack.Builder getItem(HypixelPlayer player) { - Game g = TypeBedWarsGameLoader.getPlayerGame(player); BedWarsPlayer bwPlayer = (BedWarsPlayer) player; + Game g = bwPlayer.getGame(); BedWarsMapsConfig.TeamKey t = bwPlayer.getTeamKey(); if (g == null || t == null) return ItemStack.builder(Material.BARRIER) .customName(noItalic(Component.text("No Game").color(NamedTextColor.RED))); diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/item/impl/LeaveGameBed.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/item/impl/LeaveGameBed.java index 809df0528..a5e3429d2 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/item/impl/LeaveGameBed.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/item/impl/LeaveGameBed.java @@ -22,7 +22,7 @@ public ItemStack getBlandItem() { @Override public void onItemUse(PlayerUseItemEvent event) { - Game game = TypeBedWarsGameLoader.getPlayerGame(event.getPlayer()); + Game game = ((BedWarsPlayer) event.getPlayer()).getGame(); if (game != null) { game.leave((BedWarsPlayer) event.getPlayer()); } diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/redis/service/RedisBedWarsGamePropagatePartyEvent.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/redis/service/RedisBedWarsGamePropagatePartyEvent.java index 84d92ff73..3fb6ea150 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/redis/service/RedisBedWarsGamePropagatePartyEvent.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/redis/service/RedisBedWarsGamePropagatePartyEvent.java @@ -75,7 +75,7 @@ private JSONObject handleWarpEventWithGameValidation(PartyWarpResponseEvent warp } // Warper IS on this game server - check if they're in a game - Game warperGame = TypeBedWarsGameLoader.getPlayerGame(warper); + Game warperGame = warper.getGame(); if (warperGame == null) { // Warper is on this server but not in a game - handle normally diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/shop/impl/ArmorShopItem.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/shop/impl/ArmorShopItem.java index d277a02a4..ec0608aaf 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/shop/impl/ArmorShopItem.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/shop/impl/ArmorShopItem.java @@ -30,9 +30,11 @@ public void onPurchase(BedWarsPlayer player) { player.setTag(TypeBedWarsGameLoader.ARMOR_LEVEL_TAG, armorLevel); if (player.hasTag(Tag.Integer("upgrade_reinforced_armor"))) { - String gameId = player.getTag(Tag.String("gameId")); - - TypeBedWarsGameLoader.getTeamShopManager().getUpgrade("reinforced_armor").applyEffect(TypeBedWarsGameLoader.getGameById(gameId), player.getTeamKey(), player.getTag(Tag.Integer("upgrade_reinforced_armor"))); + TypeBedWarsGameLoader.getTeamShopManager().getUpgrade("reinforced_armor").applyEffect( + player.getGame(), + player.getTeamKey(), + player.getTag(Tag.Integer("upgrade_reinforced_armor")) + ); } } diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/shop/impl/ReplaceAdderItem.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/shop/impl/ReplaceAdderItem.java index 93ca7028f..52ddbd975 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/shop/impl/ReplaceAdderItem.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/shop/impl/ReplaceAdderItem.java @@ -4,6 +4,7 @@ import net.minestom.server.tag.Tag; import net.swofty.commons.bedwars.BedwarsGameType; import net.swofty.type.bedwarsgame.TypeBedWarsGameLoader; +import net.swofty.type.bedwarsgame.game.Game; import net.swofty.type.bedwarsgame.shop.Currency; import net.swofty.type.bedwarsgame.shop.ShopItem; import net.swofty.type.bedwarsgame.user.BedWarsPlayer; @@ -42,9 +43,8 @@ public void onPurchase(BedWarsPlayer player) { inventory.addItemStack(getDisplay()); if (player.hasTag(Tag.Integer("upgrade_sharpness"))) { - String gameId = player.getTag(Tag.String("gameId")); - - TypeBedWarsGameLoader.getTeamShopManager().getUpgrade("sharpness").applyEffect(TypeBedWarsGameLoader.getGameById(gameId), player.getTeamKey(), player.getTag(Tag.Integer("upgrade_sharpness"))); + Game game = player.getGame(); + TypeBedWarsGameLoader.getTeamShopManager().getUpgrade("sharpness").applyEffect(game, player.getTeamKey(), player.getTag(Tag.Integer("upgrade_sharpness"))); } } diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/user/BedWarsPlayer.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/user/BedWarsPlayer.java index 374be3fb9..a492de04a 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/user/BedWarsPlayer.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/user/BedWarsPlayer.java @@ -24,6 +24,7 @@ import net.swofty.type.generic.data.handlers.BedWarsDataHandler; import net.swofty.type.generic.user.HypixelPlayer; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.function.Function; @@ -47,10 +48,12 @@ public BedWarsDataHandler getBedWarsDataHandler() { return BedWarsDataHandler.getUser(this.getUuid()); } + @Nullable public String getTeamName() { return getTag(Tag.String("team")); } + @Nullable public BedWarsMapsConfig.TeamKey getTeamKey() { return BedWarsMapsConfig.TeamKey.valueOf(getTeamName()); }