From 2cf21c8ce70b92d101a08d2e0fa4bbff8ca2b13d Mon Sep 17 00:00:00 2001 From: 2vb <2vb@protonmail.com> Date: Sun, 7 Jul 2024 06:18:53 -0700 Subject: [PATCH] Is that the entire tag system done? --- .../sgm/games/impl/capturethebrick/CTB.java | 147 ++++++++++++------ .../games/capturethebrick/messages.yml | 4 + 2 files changed, 105 insertions(+), 46 deletions(-) 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 46f2d4b..1392be3 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 @@ -28,15 +28,19 @@ import org.bukkit.command.CommandSender; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDismountEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerToggleSneakEvent; import org.bukkit.scheduler.BukkitTask; import org.jetbrains.annotations.NotNull; import xyz.twovb.sgm.SGM; @@ -154,6 +158,9 @@ public class CTB implements Minigame { @Override public void onTick() { + if (players.isEmpty()) { + this.stop(); + } try { headerAnimation.nextFrame(); layout.apply(sb); @@ -171,14 +178,7 @@ public class CTB implements Minigame { for (Player player : players) { CtbData.Territory territory = getTerritory(player); CtbData.PlayerState state = playerStateMap.get(player); - Player tagger = null; - Player tagged = null; - if (((state == CtbData.PlayerState.Tagged) || (state == CtbData.PlayerState.Tagging)) && taggedPlayerHashMap.containsKey(player)) { - for (Map.Entry entry : taggedPlayerHashMap.entrySet()) { - tagger = entry.getKey(); - tagged = entry.getValue(); - } - } + Player tagged = taggedPlayerHashMap.get(player); switch (state) { case Tagging: if (tagged != null) { @@ -191,26 +191,22 @@ public class CTB implements Minigame { player.sendActionBar(ChatUtils.translate(state.getFancyText().replace("%territory%", territory.getFancyText()))); break; case Tagged: - if (tagger != null) { - player.sendActionBar(ChatUtils.translate(state.getFancyText().replace("!", " ʙʏ " + tagger.getName()))); - } else { - player.sendActionBar(ChatUtils.translate(state.getFancyText())); - } + player.sendActionBar(ChatUtils.translate(state.getFancyText())); break; + case Invulnerable: + player.sendActionBar(ChatUtils.translate(state.getFancyText())); default: player.sendActionBar(ChatUtils.translate(territory.getFancyText())); break; } } + SGM.getInstance().getCLogger().log(playerStateMap); } @Override 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); @@ -265,12 +261,9 @@ public class CTB implements Minigame { // TODO: make it wait before unloading world // Stop game logic state = GameState.ENDING; - Player winner; - if (players.size() <= 1) { - winner = players.get(0); - winner.sendMessage("Congratulations on winning the game!"); + if (!players.isEmpty()) { + players.clear(); } - players.clear(); // Clear player list GameManager.getActiveGames().remove(uuid); HandlerList.unregisterAll(this); for (Player player : gameWorld.getPlayers()) { @@ -286,7 +279,6 @@ public class CTB implements Minigame { Bukkit.getScheduler().cancelTask(this.taskId); } - @Override public void addPlayer(Player player) { player.teleport(this.spawnLoc); @@ -329,33 +321,83 @@ public class CTB implements Minigame { } @EventHandler - void onPlayerWalkWhileTag(PlayerMoveEvent event) { + void onPlayerSneak(PlayerToggleSneakEvent event) { + Player tagger = event.getPlayer(); + if (!players.contains(tagger)) return; + if (this.state != GameState.STARTED) return; + if (playerStateMap.get(tagger) != CtbData.PlayerState.Tagging) return; + Player tagged = taggedPlayerHashMap.get(tagger); + if (tagged != null) { + releasePlayer(tagged, tagger); + for (Entity entity : tagger.getPassengers()) { + if (entity instanceof ArmorStand) { + entity.remove(); + } + } + } + } + + private void releasePlayer(Player tagged, Player tagger) { + playerStateMap.replace(tagger, CtbData.PlayerState.Tagging, CtbData.PlayerState.Free); + playerStateMap.replace(tagged, CtbData.PlayerState.Tagged, CtbData.PlayerState.Invulnerable); + CustomPlayer cTagged = new CustomPlayer(tagged); + CustomPlayer cTagger = new CustomPlayer(tagger); + cTagged.sendMessage(messages.getString("system.player.released.info").replace("%player%", tagger.getName())); + cTagger.sendMessage(messages.getString("system.player.released.notify").replace("%player%", tagged.getName())); + taggedPlayerHashMap.remove(tagger); + } + + @EventHandler + void onPlayerWalkWhileInvuln(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.Tagging) return; - Player tagged = taggedPlayerHashMap.get(player); + if (playerStateMap.get(player) != CtbData.PlayerState.Invulnerable) return; + CtbData.Territory territory = getTerritory(player); + CustomPlayer cPlayer = new CustomPlayer(player); + if (territory.equals(CtbData.Territory.Neutral)) { + cPlayer.sendMessage(messages.getString("system.player.released.full")); + playerStateMap.replace(player, CtbData.PlayerState.Invulnerable, CtbData.PlayerState.Free); + } + } + + @EventHandler + void onPlayerWalkWhileTag(PlayerMoveEvent event) { + if (!(event.getFrom().getX() != event.getTo().getX() || event.getFrom().getZ() != event.getTo().getZ())) return; + Player tagger = event.getPlayer(); + if (!players.contains(tagger)) return; + if (this.state != GameState.STARTED) return; + if (playerStateMap.get(tagger) != CtbData.PlayerState.Tagging) return; + ScoreboardTeam team = getTeam(tagger); + Location jail = gameWorld.getSpawnLocation(); + if (team.equals(redTeam)) { + jail = redJail; + } else if (team.equals(blueTeam)) { + jail = blueJail; + } + CtbData.Territory territory = getTerritory(tagger); + + Player tagged = taggedPlayerHashMap.get(tagger); if (tagged != null) { - CtbData.Territory territory = getTerritory(player); - ScoreboardTeam team = getTeam(player); - Location jail = gameWorld.getSpawnLocation(); - if (team.equals(redTeam)) { - jail = redJail; - } else if (team.equals(blueTeam)) { - jail = blueJail; + if (territory == CtbData.Territory.Neutral) { + releasePlayer(tagged, tagger); + for (Entity entity : tagger.getPassengers()) { + if (entity instanceof ArmorStand) { + entity.remove(); + } + } } - if (territory.equals(CtbData.Territory.Neutral)) { - Location lastValidPos = playerLocationHashMap.get(player); - player.teleport(Objects.requireNonNullElse(lastValidPos, player.getLocation())); - } else { - playerLocationHashMap.put(player, player.getLocation()); - } - double distanceToJail = jail.distanceSquared(player.getLocation()); + double distanceToJail = jail.distanceSquared(tagger.getLocation()); if (distanceToJail <= 12) { addPlayerToJail(tagged); - taggedPlayerHashMap.remove(player); - SGM.getInstance().getCLogger().log(taggedPlayerHashMap); + taggedPlayerHashMap.remove(tagger); + playerStateMap.replace(tagger, CtbData.PlayerState.Tagging, CtbData.PlayerState.Free); + for (Entity entity : tagger.getPassengers()) { + if (entity instanceof ArmorStand) { + entity.remove(); + } + } } } } @@ -394,6 +436,22 @@ public class CTB implements Minigame { CustomPlayer cTagger = new CustomPlayer(tagger); cTagged.sendMessage(messages.getString("system.player.tag.notify").replace("%player%", tagger.getName())); cTagger.sendMessage(messages.getString("system.player.tag.info").replace("%player%", tagged.getName())); + Entity seatEntity = gameWorld.spawnEntity(tagger.getLocation(), EntityType.ARMOR_STAND); + ArmorStand armorStandEntity = (ArmorStand) seatEntity; + armorStandEntity.setInvisible(true); + armorStandEntity.setSmall(true); + tagger.addPassenger(armorStandEntity); + armorStandEntity.addPassenger(tagged); + } + + @EventHandler + void onDismountAttempt(EntityDismountEvent event) { + if (!(event.getEntity() instanceof Player player)) return; + if (this.state != GameState.STARTED) return; + if (!players.contains(player)) return; + CtbData.PlayerState playerState = playerStateMap.get(player); + if (playerState != CtbData.PlayerState.Tagged) return; + event.setCancelled(true); } @EventHandler @@ -417,6 +475,7 @@ public class CTB implements Minigame { // Check if a player is allowed to tag, and if the tagged player is allowed to be tagged // If both are true, call the custom tag event and add players to tagged hashmap if (this.state != GameState.STARTED) return; + event.setCancelled(true); Entity eventEntity = event.getEntity(); Entity eventDamager = event.getDamager(); if (!(eventEntity instanceof Player tagged) || !(eventDamager instanceof Player tagger)) return; @@ -434,14 +493,11 @@ public class CTB implements Minigame { playerStateMap.replace(tagger, CtbData.PlayerState.Free, CtbData.PlayerState.Tagging); PlayerTaggedEvent taggedEvent = new PlayerTaggedEvent(tagged, tagger); taggedEvent.callEvent(); - event.setCancelled(true); } public void addPlayerToJail(Player player) { CtbData.PlayerState playerState = playerStateMap.get(player); -// if (playerState != CtbData.PlayerState.Free || playerState != CtbData.PlayerState.Tagged) { -// playerStateMap.replace(player, playerState, CtbData.PlayerState.Jailed); - playerStateMap.replace(player, CtbData.PlayerState.Jailed); + playerStateMap.replace(player, playerState, CtbData.PlayerState.Jailed); PlayerJailedEvent jailedEvent = new PlayerJailedEvent(player); jailedEvent.callEvent(); ScoreboardTeam team = getTeam(player); @@ -450,7 +506,6 @@ public class CTB implements Minigame { } else if (team == blueTeam) { player.teleport(redJail); } -// } } public void freePlayerFromJail(Player player) { diff --git a/src/main/resources/games/capturethebrick/messages.yml b/src/main/resources/games/capturethebrick/messages.yml index dd17a4c..c5e9bb5 100644 --- a/src/main/resources/games/capturethebrick/messages.yml +++ b/src/main/resources/games/capturethebrick/messages.yml @@ -11,3 +11,7 @@ system: tag: notify: "&7You have been tagged! %player% now has 25 seconds to take you to Jail or you will be freed!" info: "&7You have tagged %player%! You have 25 seconds to take them to Jail! Crouch if you would like to set them free." + released: + notify: "&7You have released %player%!" + info: "&7%player% let you free! You must head back to Neutral before you can do anything." + full: "&7You have returned to Neutral. You can now get back to the game!" \ No newline at end of file