diff --git a/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/CTB.java b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/CTB.java index 4794753..114ea12 100644 --- a/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/CTB.java +++ b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/CTB.java @@ -44,7 +44,6 @@ import xyz.twovb.sgm.games.impl.capturethebrick.events.PlayerJailedEvent; import xyz.twovb.sgm.levels.LevelManager; import xyz.twovb.toolbox.api.CustomPlayer; import xyz.twovb.toolbox.utils.ChatUtils; -import xyz.twovb.toolbox.utils.CustomLogger; import java.io.File; import java.io.IOException; @@ -62,9 +61,10 @@ public class CTB implements Minigame { private final ArrayList blueSpawnArea = new ArrayList(); // private final FileConfiguration messages; private final ArrayList players = new ArrayList(); - private final HashMap playerStateMap = new HashMap<>(); ScoreboardTeam redTeam; ScoreboardTeam blueTeam; + private final HashMap playerStateMap = new HashMap<>(); + private final HashMap playerLocationHashMap = new HashMap<>(); private Location redJail; private Location blueJail; private World gameWorld; @@ -167,23 +167,25 @@ public class CTB implements Minigame { } } for (Player player : players) { - Location playerLoc = player.getLocation(); - Location blockCheck = new Location(gameWorld, playerLoc.getBlockX(), territoryLevel, playerLoc.getBlockZ()); - Block territoryCheck = gameWorld.getBlockAt(blockCheck); - switch (territoryCheck.getType()) { - case RED_CONCRETE: - player.sendActionBar(ChatUtils.translate("ʀᴇᴅ ᴛᴇʀʀɪᴛᴏʀʏ")); - break; - case BLUE_CONCRETE: - player.sendActionBar(ChatUtils.translate("ʙʟᴜᴇ ᴛᴇʀʀɪᴛᴏʀʏ")); - break; - case WHITE_CONCRETE: - player.sendActionBar(ChatUtils.translate("ɴᴇᴜᴛʀᴀʟ")); - break; - default: - player.sendActionBar(ChatUtils.translate("???")); - break; - } + CtbData.Territory territory = getTerritory(player); + player.sendActionBar(ChatUtils.translate(territory.getFancyText())); +// Location playerLoc = player.getLocation(); +// Location blockCheck = new Location(gameWorld, playerLoc.getBlockX(), territoryLevel, playerLoc.getBlockZ()); +// Block territoryCheck = gameWorld.getBlockAt(blockCheck); +// switch (territoryCheck.getType()) { +// case RED_CONCRETE: +// player.sendActionBar(ChatUtils.translate("ʀᴇᴅ ᴛᴇʀʀɪᴛᴏʀʏ")); +// break; +// case BLUE_CONCRETE: +// player.sendActionBar(ChatUtils.translate("ʙʟᴜᴇ ᴛᴇʀʀɪᴛᴏʀʏ")); +// break; +// case WHITE_CONCRETE: +// player.sendActionBar(ChatUtils.translate("ɴᴇᴜᴛʀᴀʟ")); +// break; +// default: +// player.sendActionBar(ChatUtils.translate("???")); +// break; +// } } } @@ -191,10 +193,14 @@ public class CTB implements Minigame { public void start(CommandSender sender) { if (checkStart(sender)) { for (Player player : players) { + // TODO: REMEMBER TO REMOVE THIS BEFORE USING IT AT CAMP + player.setAllowFlight(true); + player.setFlying(true); player.teleport(this.spawnLoc); sb.addPlayer(player); playerStateMap.put(player, CtbData.PlayerState.Free); } + // TODO: Fix incorrect amount of brick spawns. for (int i = 0; i <= this.bricks - 1; i++) { placeBrick(redBrickSpawns.get(i), redTeam); placeBrick(blueBrickSpawns.get(i), blueTeam); @@ -204,14 +210,27 @@ public class CTB implements Minigame { state = GameState.STARTED; sendMessageToAllPlayers("The game has started!"); + } + } - CustomLogger logger = SGM.getInstance().getCLogger(); + boolean isJailed(Player player) { + return playerStateMap.get(player) == CtbData.PlayerState.Jailed; + } - for (ScoreboardTeam team : teamManager.teams()) { - logger.log(team.name()); - logger.log(team.defaultDisplay().entries()); - logger.log(team.teamManager().players()); - } + CtbData.Territory getTerritory(Player player) { + Location playerLoc = player.getLocation(); + Location blockCheck = new Location(gameWorld, playerLoc.getBlockX(), territoryLevel, playerLoc.getBlockZ()); + Block territoryCheck = blockCheck.getBlock(); + + switch (territoryCheck.getType()) { + case RED_CONCRETE: + return CtbData.Territory.Red; + case BLUE_CONCRETE: + return CtbData.Territory.Blue; + case WHITE_CONCRETE: + return CtbData.Territory.Neutral; + default: + return CtbData.Territory.Unknown; } } @@ -263,10 +282,10 @@ public class CTB implements Minigame { @Override public void removePlayer(Player player) { - players.remove(player); + sendMessageToAllPlayers(messages.getString("system.player.left").replace("%player%", player.getName())); sb.removePlayer(player); removePlayerFromTeams(player); - sendMessageToAllPlayers(messages.getString("system.player.left").replace("%player%", player.getName())); + players.remove(player); } @EventHandler @@ -297,46 +316,28 @@ public class CTB implements Minigame { @EventHandler void onPlayerMove(PlayerMoveEvent event) { + if (!(event.getFrom().getX() != event.getTo().getX() || event.getFrom().getZ() != event.getTo().getZ())) return; Player player = event.getPlayer(); - if (!players.contains(player)) return; // Check if player is in your list of tracked players - if (this.state != GameState.STARTED) return; // Check if the game state is started - - Location from = event.getFrom(); - Location to = event.getTo(); - - if (from.getBlockX() == to.getBlockX() && from.getBlockZ() == to.getBlockZ()) { - return; // Player hasn't moved block coordinates, ignore + if (!players.contains(player)) return; + if (this.state != GameState.STARTED) return; + if (playerStateMap.get(player) != CtbData.PlayerState.Jailed) return; + CtbData.Territory territory = getTerritory(player); + Location jail = gameWorld.getSpawnLocation(); + if (territory.equals(CtbData.Territory.Blue)) { + jail = this.blueJail; + } else if (territory.equals(CtbData.Territory.Red)) { + jail = this.redJail; } - - if (playerStateMap.get(player) != CtbData.PlayerState.Jailed) return; // Check player state - - Location fake = new Location(gameWorld, 0, -1, 0); // Your 'fake' location - - // Calculate distance squared from 'fake' location to player's current location - double distanceSquared = fake.distanceSquared(player.getLocation()); - - // Check if player is outside the 3 block radius - if (distanceSquared > 9) { // 9 is 3 squared (3*3) - // Teleport player back to 'fake' location - player.teleport(fake); + double check = jail.distanceSquared(player.getLocation()); + if (check >= 9) { + Location lastValidPos = playerLocationHashMap.get(player); + player.teleport(Objects.requireNonNullElse(lastValidPos, jail)); + } else { + playerLocationHashMap.put(player, player.getLocation()); } } -// @EventHandler -// void onPlayerMove(PlayerMoveEvent event) { -// if (!(event.getFrom().getX() != event.getTo().getX() || event.getFrom().getZ() != event.getTo().getZ())) return; -// Player player = event.getPlayer(); -// if (!players.contains(player)) return; -// if (this.state != GameState.STARTED) return; -// if (playerStateMap.get(player) != CtbData.PlayerState.Jailed) return; -// Location fake = new Location(gameWorld, 0, -1, 0); -// double check = fake.distanceSquared(player.getLocation()); -// player.sendMessage(String.valueOf(check)); -// if (check >= 15) { -// player.teleport(player.getLocation()); -// } -// } -// + @EventHandler void onPlayerJail(PlayerJailedEvent event) { CustomPlayer player = new CustomPlayer(event.getJailed()); @@ -345,7 +346,7 @@ public class CTB implements Minigame { Player teamPlayer = Bukkit.getServer().getPlayerExact(teamMembers); CustomPlayer teamMember = new CustomPlayer(teamPlayer); SGM.getInstance().getCLogger().log(teamMember.player().getName()); - if (teamMember == player) continue; + if (teamMember.player() == player.player()) continue; teamMember.sendMessage(LegacyComponentSerializer.legacyAmpersand().serialize(event.getMessage())); } } @@ -354,8 +355,12 @@ public class CTB implements Minigame { playerStateMap.replace(player, CtbData.PlayerState.Free, CtbData.PlayerState.Jailed); PlayerJailedEvent jailedEvent = new PlayerJailedEvent(player); jailedEvent.callEvent(); -// CustomPlayer cPlayer = new CustomPlayer(player); -// cPlayer.sendMessage(messages.getString("system.player.jail.info")); + ScoreboardTeam team = getTeam(player); + if (team == redTeam) { + player.teleport(blueJail); + } else if (team == blueTeam) { + player.teleport(redJail); + } } public void freePlayerFromJail(Player player) { @@ -388,6 +393,7 @@ public class CTB implements Minigame { } public void addPlayerToTeam(Player player, CtbData.Teams team) { + // TODO: VALIDATE IF ON TEAM ALREADY if (team.equals(CtbData.Teams.Blue)) { blueTeam.defaultDisplay().addEntry(player.getName()); } else if (team.equals(CtbData.Teams.Red)) { @@ -501,23 +507,28 @@ public class CTB implements Minigame { } // Process team information - List teamsToProcess = Arrays.asList("red", "blue"); - for (String teamName : teamsToProcess) { - ConfigurationSection team = config.getConfigurationSection("teams." + teamName); - if (team != null) { - List brickSpawns = team.getStringList("brickSpawns"); - List playerSpawnArea = team.getStringList("playerSpawnArea"); - this.redJail = parseString(teamName + "jail"); - this.blueJail = parseString(teamName + "jail"); + CtbData.Teams[] teamsList = CtbData.Teams.values(); + for (CtbData.Teams team : teamsList) { + String teamName = team.name().toLowerCase(); + ConfigurationSection teamConfig = config.getConfigurationSection("teams." + teamName); + if (teamConfig != null) { + List brickSpawns = teamConfig.getStringList("brickSpawns"); + List playerSpawnArea = teamConfig.getStringList("playerSpawnArea"); + + if (team.equals(CtbData.Teams.Red)) { + this.redJail = parseString(teamConfig.getString("jail")); + } else if (team.equals(CtbData.Teams.Blue)) { + this.blueJail = parseString(teamConfig.getString("jail")); + } // Get brick locations if (brickSpawns.size() >= this.bricks) { for (String rawBrickLoc : brickSpawns) { Location brickLoc = parseString(rawBrickLoc); - if (teamName.equals("red")) { + if (team.equals(CtbData.Teams.Red)) { this.redBrickSpawns.add(brickLoc); - } else if (teamName.equals("blue")) { + } else if (team.equals(CtbData.Teams.Blue)) { this.blueBrickSpawns.add(brickLoc); } } @@ -530,9 +541,9 @@ public class CTB implements Minigame { if (playerSpawnArea.size() == 2) { for (String rawSpawnLoc : playerSpawnArea) { Location spawnLoc = parseString(rawSpawnLoc); - if (teamName.equals("red")) { + if (team.equals(CtbData.Teams.Red)) { this.redSpawnArea.add(spawnLoc); - } else if (teamName.equals("blue")) { + } else if (team.equals(CtbData.Teams.Blue)) { this.blueSpawnArea.add(spawnLoc); } } @@ -546,6 +557,6 @@ public class CTB implements Minigame { } } return true; - } +} } \ No newline at end of file diff --git a/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/CtbData.java b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/CtbData.java index c9731f9..8c0eb31 100644 --- a/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/CtbData.java +++ b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/CtbData.java @@ -13,4 +13,21 @@ public class CtbData { Red, Blue } + public enum Territory { + Red("ʀᴇᴅ ᴛᴇʀʀɪᴛᴏʀʏ"), + Blue("ʙʟᴜᴇ ᴛᴇʀʀɪᴛᴏʀʏ"), + Neutral("ɴᴇᴜᴛʀᴀʟ"), + Unknown("???"); + + private final String fancyText; + + Territory(String fancyText) { + this.fancyText = fancyText; + } + + public String getFancyText() { + return fancyText; + } + } + }