package tc.oc.pgm.stamina; import java.util.HashMap; import java.util.Map; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockDamageEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.event.player.PlayerAnimationEvent; import org.bukkit.event.player.PlayerMoveEvent; import tc.oc.pgm.match.Match; import tc.oc.pgm.match.MatchScope; import tc.oc.commons.bukkit.event.BlockPunchEvent; import tc.oc.pgm.events.ListenerScope; import tc.oc.pgm.match.MatchModule; import tc.oc.pgm.match.Repeatable; import tc.oc.pgm.spawns.events.ParticipantDespawnEvent; import tc.oc.pgm.spawns.events.ParticipantSpawnEvent; @ListenerScope(MatchScope.LOADED) public class StaminaMatchModule extends MatchModule implements Listener { public StaminaOptions getOptions() { return options; } private final StaminaOptions options; private final Map<Player, PlayerStaminaState> states = new HashMap<>(); public StaminaMatchModule(Match match, StaminaOptions options) { super(match); this.options = options; } @EventHandler(priority = EventPriority.LOWEST) public void onSpawn(ParticipantSpawnEvent event) { states.put(event.getPlayer().getBukkit(), new PlayerStaminaState(options, event.getPlayer())); } @EventHandler(priority = EventPriority.MONITOR) public void onDespawn(ParticipantDespawnEvent event) { states.remove(event.getPlayer().getBukkit()); } @Repeatable public void tick(Match match) { for(PlayerStaminaState state : states.values()) { state.tick(); } } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlayerMove(PlayerMoveEvent event) { if(!event.getFrom().toVector().equals(event.getTo().toVector())) { PlayerStaminaState state = states.get(event.getPlayer()); if(state != null) state.onEvent(event); } } @EventHandler(ignoreCancelled = true) public void onPlayerSwing(PlayerAnimationEvent event) { PlayerStaminaState state = states.get(event.getPlayer()); if(state != null) state.onEvent(event); } @EventHandler(ignoreCancelled = true) public void onPlayerDamage(EntityDamageEvent event) { if(event.getEntity() instanceof Player) { PlayerStaminaState state = states.get(event.getEntity()); if(state != null) state.onEvent(event); } else if(event instanceof EntityDamageByEntityEvent && ((EntityDamageByEntityEvent) event).getDamager() instanceof Player) { PlayerStaminaState state = states.get(((EntityDamageByEntityEvent) event).getDamager()); if(state != null) state.onEvent(event); } } @EventHandler(ignoreCancelled = true) public void onPlayerShoot(ProjectileLaunchEvent event) { if(event.getEntity().getShooter() instanceof Player) { PlayerStaminaState state = states.get(event.getEntity().getShooter()); if(state != null) state.onEvent(event); } } @EventHandler public void onPlayerPunchBlock(BlockPunchEvent event) { PlayerStaminaState state = states.get(event.getPlayer()); if(state != null) state.onEvent(event); } @EventHandler public void onPlayerDig(BlockDamageEvent event) { PlayerStaminaState state = states.get(event.getPlayer()); if(state != null) state.onEvent(event); } @EventHandler public void onPlayerBreakBlock(BlockBreakEvent event) { PlayerStaminaState state = states.get(event.getPlayer()); if(state != null) state.onEvent(event); } }