diff --git a/src/main/java/com/alttd/hunger_games/Main.java b/src/main/java/com/alttd/hunger_games/Main.java index e7b5550..87e7294 100644 --- a/src/main/java/com/alttd/hunger_games/Main.java +++ b/src/main/java/com/alttd/hunger_games/Main.java @@ -3,6 +3,7 @@ package com.alttd.hunger_games; import com.alttd.hunger_games.commands.BaseCommand; import com.alttd.hunger_games.config.Config; import com.alttd.hunger_games.config.Messages; +import com.alttd.hunger_games.event_listeners.PlayerDamageListener; import com.alttd.hunger_games.event_listeners.PlayerDisconnectListener; import com.alttd.hunger_games.event_listeners.PlayerJoinListener; import com.alttd.hunger_games.services.PlayerService; @@ -50,6 +51,7 @@ public final class Main extends JavaPlugin { PluginManager pluginManager = getServer().getPluginManager(); pluginManager.registerEvents(new PlayerDisconnectListener(playerService), this); pluginManager.registerEvents(new PlayerJoinListener(playerService), this); + pluginManager.registerEvents(new PlayerDamageListener(roundService, playerService), this); } public void reloadConfigs() { diff --git a/src/main/java/com/alttd/hunger_games/event_listeners/PlayerDamageListener.java b/src/main/java/com/alttd/hunger_games/event_listeners/PlayerDamageListener.java new file mode 100644 index 0000000..a8fffa3 --- /dev/null +++ b/src/main/java/com/alttd/hunger_games/event_listeners/PlayerDamageListener.java @@ -0,0 +1,40 @@ +package com.alttd.hunger_games.event_listeners; + +import com.alttd.hunger_games.data_objects.ROUND_STATE; +import com.alttd.hunger_games.services.PlayerService; +import com.alttd.hunger_games.services.RoundService; +import lombok.RequiredArgsConstructor; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerRespawnEvent; + +@RequiredArgsConstructor +public class PlayerDamageListener implements Listener { + + private final RoundService roundService; + private final PlayerService playerService; + + @EventHandler + public void onEntityDamage(EntityDamageEvent event) { + if (!(event.getEntity() instanceof Player)) { + return; + } + ROUND_STATE roundState = roundService.getRoundState(); + if (roundState != ROUND_STATE.KILL_PHASE && roundState != ROUND_STATE.FINALE) { + event.setCancelled(true); + } + } + + @EventHandler + public void onPlayerDeath(PlayerDeathEvent event) { + playerService.handlePlayerDeath(event.getPlayer()); + } + + @EventHandler + public void onPlayerRespawn(PlayerRespawnEvent event) { + playerService.handlePlayerRespawn(event.getPlayer()); + } +} diff --git a/src/main/java/com/alttd/hunger_games/services/PlayerService.java b/src/main/java/com/alttd/hunger_games/services/PlayerService.java index 810fcd6..6b2e74e 100644 --- a/src/main/java/com/alttd/hunger_games/services/PlayerService.java +++ b/src/main/java/com/alttd/hunger_games/services/PlayerService.java @@ -97,6 +97,18 @@ public class PlayerService implements RoundListener { player.sendRichMessage(Messages.RECONNECT.FORFEITED); } + public void handlePlayerDeath(Player player) { + UUID uuid = player.getUniqueId(); + roundService.setPlayerState(uuid, PLAYER_STATE.SPECTATING); + // TODO: send a message when a player is killed + } + + public void handlePlayerRespawn(Player player) { + roundService.getPlayerState(player.getUniqueId()) + .filter(state -> state == PLAYER_STATE.SPECTATING) + .ifPresent(state -> playerTeleporterService.teleportPlayer(player, DESTINATION.SPECTATOR_AREA)); + } + private Optional determinePlayerState(UUID playerUuid) { if (roundState == null) { return Optional.empty();