From a41702ea649cbd5d9aa75f4e0087ed29bcd03734 Mon Sep 17 00:00:00 2001 From: 2vb <2vb@protonmail.com> Date: Sun, 7 Jul 2024 05:11:45 -0700 Subject: [PATCH] Is that a basic tag system I see? --- .../sgm/games/impl/capturethebrick/CTB.java | 138 ++++++++++++++++-- .../games/impl/capturethebrick/CtbData.java | 16 +- .../events/PlayerJailedEvent.java | 9 +- .../events/PlayerTaggedEvent.java | 54 +++++++ .../impl/capturethebrick/guis/TeamGui.java | 1 + .../games/capturethebrick/messages.yml | 5 +- 6 files changed, 202 insertions(+), 21 deletions(-) create mode 100644 src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/events/PlayerTaggedEvent.java 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 530d339..46f2d4b 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,9 +28,11 @@ 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.Entity; 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.PlayerDeathEvent; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerMoveEvent; @@ -41,6 +43,7 @@ import xyz.twovb.sgm.SGM; import xyz.twovb.sgm.games.GameManager; import xyz.twovb.sgm.games.Minigame; import xyz.twovb.sgm.games.impl.capturethebrick.events.PlayerJailedEvent; +import xyz.twovb.sgm.games.impl.capturethebrick.events.PlayerTaggedEvent; import xyz.twovb.sgm.levels.LevelManager; import xyz.twovb.toolbox.api.CustomPlayer; import xyz.twovb.toolbox.utils.ChatUtils; @@ -59,12 +62,13 @@ public class CTB implements Minigame { private final ArrayList blueBrickSpawns = new ArrayList(); private final ArrayList redSpawnArea = new ArrayList(); private final ArrayList blueSpawnArea = new ArrayList(); - // private final FileConfiguration messages; private final ArrayList players = new ArrayList(); + private final HashMap playerLocationHashMap = new HashMap<>(); + // tagger, tagged + private final HashMap taggedPlayerHashMap = new HashMap(); + 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; @@ -166,7 +170,37 @@ public class CTB implements Minigame { } for (Player player : players) { CtbData.Territory territory = getTerritory(player); - player.sendActionBar(ChatUtils.translate(territory.getFancyText())); + 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(); + } + } + switch (state) { + case Tagging: + if (tagged != null) { + player.sendActionBar(ChatUtils.translate(state.getFancyText().replace("%player%", tagged.getName()))); + } else { + player.sendActionBar(ChatUtils.translate(territory.getFancyText())); + } + break; + case Jailed: + 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())); + } + break; + default: + player.sendActionBar(ChatUtils.translate(territory.getFancyText())); + break; + } } } @@ -295,7 +329,39 @@ public class CTB implements Minigame { } @EventHandler - void onPlayerMove(PlayerMoveEvent event) { + void onPlayerWalkWhileTag(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 (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.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()); + if (distanceToJail <= 12) { + addPlayerToJail(tagged); + taggedPlayerHashMap.remove(player); + SGM.getInstance().getCLogger().log(taggedPlayerHashMap); + } + } + } + + @EventHandler + void onPlayerMoveInJail(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; @@ -308,8 +374,8 @@ public class CTB implements Minigame { } else if (territory.equals(CtbData.Territory.Red)) { jail = this.redJail; } - double check = jail.distanceSquared(player.getLocation()); - if (check >= 9) { + double distanceFromJail = jail.distanceSquared(player.getLocation()); + if (distanceFromJail >= 9) { Location lastValidPos = playerLocationHashMap.get(player); player.teleport(Objects.requireNonNullElse(lastValidPos, jail)); } else { @@ -317,22 +383,65 @@ public class CTB implements Minigame { } } + @EventHandler + void onPlayerTag(PlayerTaggedEvent event) { + Player tagged = event.getTagged(); + Player tagger = event.getTagger(); + if (this.state != GameState.STARTED) return; + if (!players.contains(tagged) || !players.contains(tagger)) return; + taggedPlayerHashMap.putIfAbsent(tagger, tagged); + CustomPlayer cTagged = new CustomPlayer(tagged); + 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())); + } @EventHandler void onPlayerJail(PlayerJailedEvent event) { - CustomPlayer player = new CustomPlayer(event.getJailed()); - player.sendMessage(messages.getString("system.player.jail.info")); - for (String teamMembers : getTeam(player.player()).defaultDisplay().entries()) { + Player player = event.getJailed(); + if (this.state != GameState.STARTED) return; + if (!players.contains(player)) return; + if (playerStateMap.get(player) != CtbData.PlayerState.Jailed) return; + CustomPlayer cPlayer = new CustomPlayer(player); + cPlayer.sendMessage(messages.getString("system.player.jail.info")); + for (String teamMembers : getTeam(cPlayer.player()).defaultDisplay().entries()) { Player teamPlayer = Bukkit.getServer().getPlayerExact(teamMembers); CustomPlayer teamMember = new CustomPlayer(teamPlayer); - SGM.getInstance().getCLogger().log(teamMember.player().getName()); - if (teamMember.player() == player.player()) continue; + if (teamMember.player() == cPlayer.player()) continue; teamMember.sendMessage(LegacyComponentSerializer.legacyAmpersand().serialize(event.getMessage())); } } + @EventHandler + void onEntityDamage(EntityDamageByEntityEvent event) { + // 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; + Entity eventEntity = event.getEntity(); + Entity eventDamager = event.getDamager(); + if (!(eventEntity instanceof Player tagged) || !(eventDamager instanceof Player tagger)) return; + if (!players.contains(tagged) || !players.contains(tagger)) return; + if (getTerritory(tagged) != getTerritory(tagger)) return; + ScoreboardTeam taggedTeam = getTeam(tagged); + ScoreboardTeam taggerTeam = getTeam(tagger); + if (taggedTeam == taggerTeam) return; + CtbData.Territory territory = getTerritory(tagged); + if (territory == CtbData.Territory.Blue && taggerTeam != blueTeam) return; + if (territory == CtbData.Territory.Red && taggerTeam != redTeam) return; + if (playerStateMap.get(tagged) != CtbData.PlayerState.Free) return; + if (playerStateMap.get(tagger) != CtbData.PlayerState.Free) return; + playerStateMap.replace(tagged, CtbData.PlayerState.Free, CtbData.PlayerState.Tagged); + 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) { - playerStateMap.replace(player, CtbData.PlayerState.Free, CtbData.PlayerState.Jailed); + 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); PlayerJailedEvent jailedEvent = new PlayerJailedEvent(player); jailedEvent.callEvent(); ScoreboardTeam team = getTeam(player); @@ -341,6 +450,7 @@ public class CTB implements Minigame { } else if (team == blueTeam) { player.teleport(redJail); } +// } } public void freePlayerFromJail(Player player) { @@ -538,6 +648,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 8c0eb31..726e6d8 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 @@ -6,7 +6,21 @@ package xyz.twovb.sgm.games.impl.capturethebrick; public class CtbData { public enum PlayerState { - Free, Invulnerable, Tagged, Jailed + Free(""), + Invulnerable("ɢᴏ ʙᴀᴄᴋ ᴛᴏ ɴᴇᴜᴛʀᴀʟ!"), + Tagging("ʏᴏᴜ ᴀʀᴇ ᴛᴀɢɢɪɴɢ: %player%"), + Tagged("ʏᴏᴜ ᴀʀᴇ ᴄᴜʀʀᴇɴᴛʟʏ ᴛᴀɢɢᴇᴅ!"), + Jailed("ʏᴏᴜ ᴀʀᴇ ᴄᴜʀʀᴇɴᴛʟʏ ᴊᴀɪʟᴇᴅ ɪɴ: %territory%"); + + private final String fancyText; + + PlayerState(String fancyText) { + this.fancyText = fancyText; + } + + public String getFancyText() { + return fancyText; + } } public enum Teams { diff --git a/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/events/PlayerJailedEvent.java b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/events/PlayerJailedEvent.java index 4090807..2e712fd 100644 --- a/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/events/PlayerJailedEvent.java +++ b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/events/PlayerJailedEvent.java @@ -8,7 +8,6 @@ import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; -import org.jetbrains.annotations.NotNull; import xyz.twovb.sgm.games.impl.capturethebrick.CTB; import xyz.twovb.toolbox.utils.ChatUtils; @@ -26,6 +25,10 @@ public class PlayerJailedEvent extends Event implements Cancellable { this.message = ChatUtils.translate(CTB.getMessages().getString("system.player.jail.notify").replace("%player%", jailed.getName())); } + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + public Player getJailed() { return this.jailed; } @@ -38,10 +41,6 @@ public class PlayerJailedEvent extends Event implements Cancellable { this.message = message; } - public static HandlerList getHandlerList() { - return HANDLER_LIST; - } - @Override public HandlerList getHandlers() { return HANDLER_LIST; diff --git a/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/events/PlayerTaggedEvent.java b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/events/PlayerTaggedEvent.java new file mode 100644 index 0000000..fd2ea9c --- /dev/null +++ b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/events/PlayerTaggedEvent.java @@ -0,0 +1,54 @@ +package xyz.twovb.sgm.games.impl.capturethebrick.events; +/* + * Created by 2vb - 7/7/2024 + */ + +import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class PlayerTaggedEvent extends Event implements Cancellable { + + private static final HandlerList HANDLER_LIST = new HandlerList(); + private final Player tagged; + private final Player tagger; + private boolean isCancelled; + + private Component message; + + public PlayerTaggedEvent(Player tagged, Player tagger) { + this.tagged = tagged; + this.tagger = tagger; + this.isCancelled = false; + } + + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + + public Player getTagged() { + return this.tagged; + } + + public Player getTagger() { + return this.tagger; + } + + @Override + public HandlerList getHandlers() { + return HANDLER_LIST; + } + + @Override + public boolean isCancelled() { + return this.isCancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + this.isCancelled = cancelled; + } + +} diff --git a/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/guis/TeamGui.java b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/guis/TeamGui.java index a892da9..e744d59 100644 --- a/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/guis/TeamGui.java +++ b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/guis/TeamGui.java @@ -59,5 +59,6 @@ public class TeamGui { game.addPlayerToTeam(target, CtbData.Teams.Blue); game.sendMessageToAllPlayers(target.getName() + " BLUE"); } + player.closeInventory(); } } diff --git a/src/main/resources/games/capturethebrick/messages.yml b/src/main/resources/games/capturethebrick/messages.yml index 4ff50c5..dd17a4c 100644 --- a/src/main/resources/games/capturethebrick/messages.yml +++ b/src/main/resources/games/capturethebrick/messages.yml @@ -7,4 +7,7 @@ system: left: "&7%player% has left the game." jail: notify: "&7%player% has been jailed!" - info: "&7You have been jailed! You can not leave until you get freed by a player or Jailbreak™." \ No newline at end of file + info: "&7You have been jailed! You can not leave until you get freed by a player or Jailbreak™." + 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."