From 6f77135426d7bee29a466dcee284208539ee0402 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Fri, 7 Feb 2025 23:48:40 +0100 Subject: [PATCH] Refactor snowball handling and improve player interactions Renamed OnSnowballHit to SnowballEvent and expanded functionality to handle projectile launches. Added InventoryItemInteractionEvent to manage item pickup and drop behavior. Updated player join logic to clear inventory, assign players to teams, and teleport them appropriately based on game state. --- src/main/java/com/alttd/ctf/Main.java | 6 ++- .../events/InventoryItemInteractionEvent.java | 29 ++++++++++++ .../com/alttd/ctf/events/OnPlayerJoin.java | 32 +++++++++++-- ...{OnSnowballHit.java => SnowballEvent.java} | 45 +++++++++++++++++-- src/main/java/com/alttd/ctf/team/Team.java | 6 ++- version.properties | 4 +- 6 files changed, 109 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/alttd/ctf/events/InventoryItemInteractionEvent.java rename src/main/java/com/alttd/ctf/events/{OnSnowballHit.java => SnowballEvent.java} (60%) diff --git a/src/main/java/com/alttd/ctf/Main.java b/src/main/java/com/alttd/ctf/Main.java index ee80962..a1b3ff9 100644 --- a/src/main/java/com/alttd/ctf/Main.java +++ b/src/main/java/com/alttd/ctf/Main.java @@ -4,9 +4,10 @@ import com.alttd.ctf.commands.CommandManager; import com.alttd.ctf.config.Config; import com.alttd.ctf.config.GameConfig; import com.alttd.ctf.config.Messages; +import com.alttd.ctf.events.InventoryItemInteractionEvent; import com.alttd.ctf.events.OnPlayerDeath; import com.alttd.ctf.events.OnPlayerJoin; -import com.alttd.ctf.events.OnSnowballHit; +import com.alttd.ctf.events.SnowballEvent; import com.alttd.ctf.flag.Flag; import com.alttd.ctf.flag.FlagTryCaptureEvent; import com.alttd.ctf.game.GameManager; @@ -66,9 +67,10 @@ public class Main extends JavaPlugin { private void registerEvents(Flag flag) { PluginManager pluginManager = getServer().getPluginManager(); //TODO add event for player joining and clear their inv - pluginManager.registerEvents(new OnSnowballHit(gameManager), this); + pluginManager.registerEvents(new SnowballEvent(gameManager), this); pluginManager.registerEvents(new FlagTryCaptureEvent(flag), this); pluginManager.registerEvents(new OnPlayerDeath(gameManager), this); + pluginManager.registerEvents(new InventoryItemInteractionEvent(), this); pluginManager.registerEvents(new OnPlayerJoin(gameManager, flag), this); pluginManager.registerEvents(new GUIListener(), this); } diff --git a/src/main/java/com/alttd/ctf/events/InventoryItemInteractionEvent.java b/src/main/java/com/alttd/ctf/events/InventoryItemInteractionEvent.java new file mode 100644 index 0000000..8465c6a --- /dev/null +++ b/src/main/java/com/alttd/ctf/events/InventoryItemInteractionEvent.java @@ -0,0 +1,29 @@ +package com.alttd.ctf.events; + +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerAttemptPickupItemEvent; +import org.bukkit.event.player.PlayerDropItemEvent; + +public class InventoryItemInteractionEvent implements Listener { + + @EventHandler + public void onPlayerDropItem(PlayerDropItemEvent event) { + Material type = event.getItemDrop().getItemStack().getType(); + if (type.equals(Material.SNOWBALL) || type.equals(Material.SNOW_BLOCK)) { + return; + } + event.setCancelled(true); + } + + @EventHandler + public void onPlayerAttemptPickupItem(PlayerAttemptPickupItemEvent event) { + Material type = event.getItem().getItemStack().getType(); + if (type.equals(Material.SNOWBALL) || type.equals(Material.SNOW_BLOCK)) { + return; + } + event.setCancelled(true); + } + +} diff --git a/src/main/java/com/alttd/ctf/events/OnPlayerJoin.java b/src/main/java/com/alttd/ctf/events/OnPlayerJoin.java index 795d1e6..0ebeb3d 100644 --- a/src/main/java/com/alttd/ctf/events/OnPlayerJoin.java +++ b/src/main/java/com/alttd/ctf/events/OnPlayerJoin.java @@ -2,6 +2,9 @@ package com.alttd.ctf.events; import com.alttd.ctf.flag.Flag; import com.alttd.ctf.game.GameManager; +import com.alttd.ctf.game.GamePhase; +import com.alttd.ctf.team.Team; +import com.alttd.ctf.team.TeamPlayer; import lombok.extern.slf4j.Slf4j; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeInstance; @@ -10,13 +13,16 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; +import java.util.Comparator; +import java.util.Optional; + @Slf4j public class OnPlayerJoin implements Listener { private final GameManager gameManager; private final Flag flag; - public OnPlayerJoin(GameManager gameManager, Flag flag) {//TODO remove player from team when they leave the game + public OnPlayerJoin(GameManager gameManager, Flag flag) { this.gameManager = gameManager; this.flag = flag; } @@ -31,11 +37,31 @@ public class OnPlayerJoin implements Listener { } maxHealthAttribute.setBaseValue(20); player.setHealth(20); + flag.addPlayer(player); - if (gameManager.getGamePhase().isEmpty()) { + player.getInventory().clear(); + player.updateInventory(); + Optional optionalGamePhase = gameManager.getGamePhase(); + if (optionalGamePhase.isEmpty()) { return; } - //TODO other stuff based on game state (like adding them to a team etc) + GamePhase gamePhase = optionalGamePhase.get(); + if (gamePhase.equals(GamePhase.ENDED)) { + return; + } + Optional optionalTeamPlayer = gameManager.getTeamPlayer(player.getUniqueId()); + TeamPlayer teamPlayer; + if (optionalTeamPlayer.isEmpty()) { + Optional min = gameManager.getTeams().stream().min(Comparator.comparingInt(team -> team.getPlayers().size())); + if (min.isEmpty()) { + log.error("No team found when attempting to add freshly joined player to a team"); + return; + } + teamPlayer = min.get().addPlayer(player.getUniqueId()); + } else { + teamPlayer = optionalTeamPlayer.get(); + } + player.teleportAsync(teamPlayer.getTeam().getSpawnLocation()); } } diff --git a/src/main/java/com/alttd/ctf/events/OnSnowballHit.java b/src/main/java/com/alttd/ctf/events/SnowballEvent.java similarity index 60% rename from src/main/java/com/alttd/ctf/events/OnSnowballHit.java rename to src/main/java/com/alttd/ctf/events/SnowballEvent.java index f1dc0d4..7051b20 100644 --- a/src/main/java/com/alttd/ctf/events/OnSnowballHit.java +++ b/src/main/java/com/alttd/ctf/events/SnowballEvent.java @@ -6,19 +6,21 @@ import com.alttd.ctf.game_class.GameClass; import com.alttd.ctf.team.TeamPlayer; import lombok.extern.slf4j.Slf4j; import org.bukkit.Material; +import org.bukkit.entity.Snowball; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.ProjectileLaunchEvent; import java.util.Optional; @Slf4j -public class OnSnowballHit implements Listener { +public class SnowballEvent implements Listener { private final GameManager gameManager; - public OnSnowballHit(GameManager gameManager) { + public SnowballEvent(GameManager gameManager) { this.gameManager = gameManager; } @@ -27,9 +29,14 @@ public class OnSnowballHit implements Listener { void apply(Player hitPlayer, Player shooter, TeamPlayer shooterTeamPlayer); } + @FunctionalInterface + private interface SnowballThrownConsumer { + void apply(Player shooter, TeamPlayer shooterTeamPlayer); + } + @EventHandler public void onSnowballHit(EntityDamageByEntityEvent event) { - handle(event, (hitPlayer, shooter, shooterTeamPlayer) -> { + handleSnowballHit(event, (hitPlayer, shooter, shooterTeamPlayer) -> { GameClass shooterClass = shooterTeamPlayer.getGameClass(); shooter.setCooldown(Material.SNOWBALL, shooterClass.getThrowTickSpeed()); @@ -40,7 +47,37 @@ public class OnSnowballHit implements Listener { }); } - private void handle(EntityDamageByEntityEvent event, SnowballHitConsumer consumer) { + @EventHandler + public void onSnowballHitBySnowball(ProjectileLaunchEvent event) { + handleSnowballThrown(event, (shooter, shooterTeamPlayer) -> { + GameClass shooterClass = shooterTeamPlayer.getGameClass(); + shooter.setCooldown(Material.SNOWBALL, shooterClass.getThrowTickSpeed()); + }); + } + + private void handleSnowballThrown(ProjectileLaunchEvent event, SnowballThrownConsumer consumer) { + Optional optionalGamePhase = gameManager.getGamePhase(); + if (optionalGamePhase.isEmpty()) { + return; + } + if (!(event.getEntity() instanceof Snowball snowball)) { + log.debug("Something other than a snowball was thrown"); + return; + } + if (!(snowball.getShooter() instanceof Player shooter)) { + log.debug("The snowball shooter wasn't a player"); + return; + } + + Optional teamPlayer = gameManager.getTeamPlayer(shooter.getUniqueId()); + if (teamPlayer.isEmpty()) { + log.debug("The shooter that threw a snowball was not a team player"); + return; + } + consumer.apply(shooter, teamPlayer.get()); + } + + private void handleSnowballHit(EntityDamageByEntityEvent event, SnowballHitConsumer consumer) { Optional optionalGamePhase = gameManager.getGamePhase(); if (optionalGamePhase.isEmpty()) { log.debug("No game is running but player was hit by snowball"); diff --git a/src/main/java/com/alttd/ctf/team/Team.java b/src/main/java/com/alttd/ctf/team/Team.java index 0d28d35..91ac100 100644 --- a/src/main/java/com/alttd/ctf/team/Team.java +++ b/src/main/java/com/alttd/ctf/team/Team.java @@ -39,9 +39,11 @@ public class Team { @Getter private TeamColor color; - public void addPlayer(UUID uuid) { - players.put(uuid, new TeamPlayer(uuid, this)); + public TeamPlayer addPlayer(UUID uuid) { + TeamPlayer teamPlayer = new TeamPlayer(uuid, this); + players.put(uuid, teamPlayer); log.debug("Added player with uuid {} to team with id {}", uuid, id); + return teamPlayer; } public Optional getPlayer(@NotNull UUID uuid) { diff --git a/version.properties b/version.properties index 3cf2d9a..6f9094b 100644 --- a/version.properties +++ b/version.properties @@ -1,3 +1,3 @@ -#Fri Feb 07 23:09:43 CET 2025 -buildNumber=8 +#Fri Feb 07 23:34:22 CET 2025 +buildNumber=9 version=0.1