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