Add PlayerDamageListener to manage damage, death, and respawn events during rounds

This commit is contained in:
akastijn 2026-05-30 00:16:33 +02:00
parent d3946bc16a
commit 5743bc63a5
3 changed files with 54 additions and 0 deletions

View File

@ -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() {

View File

@ -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());
}
}

View File

@ -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<PLAYER_STATE> determinePlayerState(UUID playerUuid) {
if (roundState == null) {
return Optional.empty();