From c470cfda3ba067b25d3e196f1dcd9043c2de2a72 Mon Sep 17 00:00:00 2001 From: 2vb <2vb@protonmail.com> Date: Sun, 7 Jul 2024 18:49:39 -0700 Subject: [PATCH] it works --- src/main/java/xyz/twovb/sgm/SGM.java | 3 - .../sgm/games/impl/capturethebrick/CTB.java | 170 +++++++++++++----- .../games/impl/capturethebrick/CtbData.java | 1 + .../events/PlayerGameInteractionEvent.java | 52 ++++++ .../events/PlayerStealBrickEvent.java | 2 +- .../games/capturethebrick/messages.yml | 5 +- 6 files changed, 179 insertions(+), 54 deletions(-) create mode 100644 src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/events/PlayerGameInteractionEvent.java diff --git a/src/main/java/xyz/twovb/sgm/SGM.java b/src/main/java/xyz/twovb/sgm/SGM.java index 1eb8e5b..c786399 100644 --- a/src/main/java/xyz/twovb/sgm/SGM.java +++ b/src/main/java/xyz/twovb/sgm/SGM.java @@ -10,8 +10,6 @@ import lombok.Getter; import net.megavex.scoreboardlibrary.api.ScoreboardLibrary; import net.megavex.scoreboardlibrary.api.exception.NoPacketAdapterAvailableException; import net.megavex.scoreboardlibrary.api.noop.NoopScoreboardLibrary; -import net.megavex.scoreboardlibrary.api.team.TeamManager; -import org.apache.commons.io.FileUtils; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; @@ -30,7 +28,6 @@ import xyz.twovb.toolbox.managers.ConfigManager; import xyz.twovb.toolbox.managers.PlaceholderManager; import xyz.twovb.toolbox.utils.CustomLogger; -import java.io.File; import java.io.IOException; import java.util.Objects; 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 aff47be..385302c 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 @@ -25,25 +25,24 @@ 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.*; +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.event.player.*; +import org.bukkit.inventory.EntityEquipment; +import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitTask; -import org.bukkit.util.Transformation; import org.jetbrains.annotations.NotNull; 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.PlayerFreedFromJailEvent; -import xyz.twovb.sgm.games.impl.capturethebrick.events.PlayerJailedEvent; -import xyz.twovb.sgm.games.impl.capturethebrick.events.PlayerTaggedEvent; +import xyz.twovb.sgm.games.impl.capturethebrick.events.*; import xyz.twovb.sgm.levels.LevelManager; import xyz.twovb.toolbox.api.CustomPlayer; import xyz.twovb.toolbox.utils.ChatUtils; @@ -194,7 +193,7 @@ public class CTB implements Minigame { break; } } -// SGM.getInstance().getCLogger().log(playerStateMap); + SGM.getInstance().getCLogger().log(playerStateMap); } @Override @@ -479,50 +478,113 @@ public class CTB implements Minigame { } @EventHandler - void onPlayerFree(EntityDamageByEntityEvent event) { - // Check if a player is allowed to free someone, and if the tagged player is allowed to be free - // If both are true, call the custom event + void handleEntityDamage(EntityDamageByEntityEvent event) { 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; - if (playerStateMap.get(tagged) != CtbData.PlayerState.Jailed) return; - if (playerStateMap.get(tagger) != CtbData.PlayerState.Free) return; - playerStateMap.replace(tagged, CtbData.PlayerState.Jailed, CtbData.PlayerState.Invulnerable); - playerStateMap.replace(tagger, CtbData.PlayerState.Free, CtbData.PlayerState.Invulnerable); - PlayerFreedFromJailEvent freedFromJailEvent = new PlayerFreedFromJailEvent(tagged, tagger); - freedFromJailEvent.callEvent(); + + if (!(eventEntity instanceof Player interacted) || !(eventDamager instanceof Player interacter)) return; + if (!players.contains(interacted) || !players.contains(interacter)) return; + if (getTerritory(interacted) != getTerritory(interacter)) return; + + PlayerGameInteractionEvent interactionEvent = new PlayerGameInteractionEvent(interacted, interacter); + Bukkit.getServer().getPluginManager().callEvent(interactionEvent); + + if (interactionEvent.isCancelled()) { + event.setCancelled(true); + } + } + + @EventHandler + void onPlayerFree(EntityDamageByEntityEvent event) { + handleEntityDamage(event); + Player interacted = (Player) event.getEntity(); + Player interacter = (Player) event.getDamager(); + + if (this.state != GameState.STARTED) return; + if (!players.contains(interacted) || !players.contains(interacter)) return; + if (getTerritory(interacted) != getTerritory(interacter)) return; + ScoreboardTeam interactedTeam = getTeam(interacted); + ScoreboardTeam interacterTeam = getTeam(interacter); + if (interactedTeam != interacterTeam) return; + if (playerStateMap.get(interacted) != CtbData.PlayerState.Jailed) return; + if (playerStateMap.get(interacter) != CtbData.PlayerState.Free) return; + + playerStateMap.replace(interacted, CtbData.PlayerState.Jailed, CtbData.PlayerState.Invulnerable); + playerStateMap.replace(interacter, CtbData.PlayerState.Free, CtbData.PlayerState.Invulnerable); + PlayerFreedFromJailEvent freedFromJailEvent = new PlayerFreedFromJailEvent(interacted, interacter); + Bukkit.getServer().getPluginManager().callEvent(freedFromJailEvent); + event.setCancelled(true); + } + + @EventHandler + void onPlayerHit(EntityDamageByEntityEvent event) { + handleEntityDamage(event); + Player interacted = (Player) event.getEntity(); + Player interacter = (Player) event.getDamager(); + + if (this.state != GameState.STARTED) return; + if (!players.contains(interacted) || !players.contains(interacter)) return; + if (getTerritory(interacted) != getTerritory(interacter)) return; + ScoreboardTeam interactedTeam = getTeam(interacted); + ScoreboardTeam interacterTeam = getTeam(interacter); + if (interactedTeam != interacterTeam) return; + if (playerStateMap.get(interacted) != CtbData.PlayerState.Jailed) return; + if (playerStateMap.get(interacter) != CtbData.PlayerState.Free) return; + + playerStateMap.replace(interacted, CtbData.PlayerState.Jailed, CtbData.PlayerState.Invulnerable); + playerStateMap.replace(interacter, CtbData.PlayerState.Free, CtbData.PlayerState.Invulnerable); + PlayerFreedFromJailEvent freedFromJailEvent = new PlayerFreedFromJailEvent(interacted, interacter); + Bukkit.getServer().getPluginManager().callEvent(freedFromJailEvent); event.setCancelled(true); } @EventHandler void onEntityDamage(EntityDamageByEntityEvent event) { + handleEntityDamage(event); + Player interacted = (Player) event.getEntity(); + Player interacter = (Player) event.getDamager(); + + if (this.state != GameState.STARTED) return; + if (!players.contains(interacted) || !players.contains(interacter)) return; + if (getTerritory(interacted) != getTerritory(interacter)) return; + ScoreboardTeam interactedTeam = getTeam(interacted); + ScoreboardTeam interacterTeam = getTeam(interacter); + if (interactedTeam == interacterTeam) return; + event.setCancelled(true); + + CtbData.Territory territory = getTerritory(interacted); + if (territory == CtbData.Territory.Blue && interacterTeam != blueTeam) return; + if (territory == CtbData.Territory.Red && interacterTeam != redTeam) return; + if (playerStateMap.get(interacter) != CtbData.PlayerState.Free) return; + if (playerStateMap.get(interacted) != CtbData.PlayerState.Free && playerStateMap.get(interacted) != CtbData.PlayerState.Stealing) return; + + playerStateMap.replace(interacted, CtbData.PlayerState.Tagged); + playerStateMap.replace(interacter, CtbData.PlayerState.Free, CtbData.PlayerState.Tagging); + PlayerTaggedEvent taggedEvent = new PlayerTaggedEvent(interacted, interacter); + Bukkit.getServer().getPluginManager().callEvent(taggedEvent); + } + + @EventHandler + void onBrickSteal(PlayerInteractAtEntityEvent 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; + Entity rightClicked = event.getRightClicked(); + Player brickTaker = event.getPlayer(); +// if (!(rightClicked instanceof ArmorStand brickEntity)) return; + if (!players.contains(brickTaker)) return; + SGM.getInstance().getCLogger().log(rightClicked); + SGM.getInstance().getCLogger().log(brickTaker); + ScoreboardTeam taggerTeam = getTeam(brickTaker); event.setCancelled(true); - 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(); + CtbData.Territory territory = getTerritory(brickTaker); + if (territory == CtbData.Territory.Blue && taggerTeam == blueTeam) return; + if (territory == CtbData.Territory.Red && taggerTeam == redTeam) return; + if (playerStateMap.get(brickTaker) != CtbData.PlayerState.Free) return; + playerStateMap.replace(brickTaker, CtbData.PlayerState.Free, CtbData.PlayerState.Stealing); + PlayerStealBrickEvent playerStealBrickEvent = new PlayerStealBrickEvent(brickTaker); + playerStealBrickEvent.callEvent(); } public void addPlayerToJail(Player player) { @@ -596,16 +658,26 @@ public class CTB implements Minigame { private void placeBrick(Location location, ScoreboardTeam team) { Location brickSpawnLoc = location; brickSpawnLoc = brickSpawnLoc.clone().add(0.5, 0, 0.5); - Entity brickEntity = gameWorld.spawnEntity(brickSpawnLoc, EntityType.BLOCK_DISPLAY); - BlockDisplay brickDisplay = (BlockDisplay) brickEntity; + Entity brickEntity = gameWorld.spawnEntity(brickSpawnLoc, EntityType.ARMOR_STAND); + ArmorStand armorStand = (ArmorStand) brickEntity; + EntityEquipment armorEquipment = armorStand.getEquipment(); +// armorStand.setInvisible(true); if (team.equals(redTeam)) { - brickDisplay.setBlock(Material.RED_WOOL.createBlockData()); + armorEquipment.setHelmet(new ItemStack(Material.RED_WOOL)); } else if (team.equals(blueTeam)) { - brickDisplay.setBlock(Material.BLUE_WOOL.createBlockData()); + armorEquipment.setHelmet(new ItemStack(Material.BLUE_WOOL)); } - Transformation transformation = brickDisplay.getTransformation(); - transformation.getScale().set(0.5f); - brickDisplay.setTransformation(transformation); + +// Entity brickEntity = gameWorld.spawnEntity(brickSpawnLoc, EntityType.BLOCK_DISPLAY); +// BlockDisplay brickDisplay = (BlockDisplay) brickEntity; +// if (team.equals(redTeam)) { +// brickDisplay.setBlock(Material.RED_WOOL.createBlockData()); +// } else if (team.equals(blueTeam)) { +// brickDisplay.setBlock(Material.BLUE_WOOL.createBlockData()); +// } +// Transformation transformation = brickDisplay.getTransformation(); +// transformation.getScale().set(0.5f); +// brickDisplay.setTransformation(transformation); } private void setupTeamDisplay(ScoreboardTeam team, String displayName, NamedTextColor color) { 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 567b4f5..4730185 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 @@ -7,6 +7,7 @@ public class CtbData { public enum PlayerState { Free(""), + Stealing("⚠️ʙᴇ ᴄᴀʀᴇꜰᴜʟ! ʏᴏᴜ ʜᴀᴠᴇ ᴀ ʙʀɪᴄᴋ ⚠️"), Invulnerable("ɢᴏ ʙᴀᴄᴋ ᴛᴏ ɴᴇᴜᴛʀᴀʟ!"), Tagging("ʏᴏᴜ ᴀʀᴇ ᴛᴀɢɢɪɴɢ: %player%"), Tagged("ʏᴏᴜ ᴀʀᴇ ᴄᴜʀʀᴇɴᴛʟʏ ᴛᴀɢɢᴇᴅ!"), diff --git a/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/events/PlayerGameInteractionEvent.java b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/events/PlayerGameInteractionEvent.java new file mode 100644 index 0000000..8113a4e --- /dev/null +++ b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/events/PlayerGameInteractionEvent.java @@ -0,0 +1,52 @@ +package xyz.twovb.sgm.games.impl.capturethebrick.events; +/* + * Created by 2vb - 7/7/2024 + */ + +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class PlayerGameInteractionEvent extends Event implements Cancellable { + + private static final HandlerList HANDLER_LIST = new HandlerList(); + private final Player interacted; + private final Player interacter; + private boolean isCancelled; + + public PlayerGameInteractionEvent(Player interacted, Player interacter) { + this.interacted = interacted; + this.interacter = interacter; + this.isCancelled = false; + } + + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + + public Player getInteracted() { + return this.interacted; + } + + public Player getInteracter() { + return this.interacter; + } + + @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/events/PlayerStealBrickEvent.java b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/events/PlayerStealBrickEvent.java index e903065..cc26eae 100644 --- a/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/events/PlayerStealBrickEvent.java +++ b/src/main/java/xyz/twovb/sgm/games/impl/capturethebrick/events/PlayerStealBrickEvent.java @@ -22,7 +22,7 @@ public class PlayerStealBrickEvent extends Event implements Cancellable { public PlayerStealBrickEvent(Player jailed) { this.jailed = jailed; this.isCancelled = false; - this.message = ChatUtils.translate(CTB.getMessages().getString("system.player.jail.notify").replace("%player%", jailed.getName())); + this.message = ChatUtils.translate(CTB.getMessages().getString("system.player.brick.steal.notify")); } public static HandlerList getHandlerList() { diff --git a/src/main/resources/games/capturethebrick/messages.yml b/src/main/resources/games/capturethebrick/messages.yml index 3d1ae93..841e4b9 100644 --- a/src/main/resources/games/capturethebrick/messages.yml +++ b/src/main/resources/games/capturethebrick/messages.yml @@ -17,4 +17,7 @@ system: 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 + full: "&7You have returned to Neutral. You can now get back to the game!" + brick: + steal: + notify: "&7You have stolen a brick. Make it to Neutral without being caught to Capture The Brick™!" \ No newline at end of file