ProjectAres/PGM/src/main/java/tc/oc/pgm/listeners/PGMListener.java

139 lines
5.2 KiB
Java

package tc.oc.pgm.listeners;
import java.util.logging.Logger;
import javax.inject.Inject;
import org.bukkit.Material;
import org.bukkit.entity.EnderPearl;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerFishEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.inventory.ItemStack;
import tc.oc.commons.bukkit.localization.Translations;
import tc.oc.commons.core.logging.Loggers;
import tc.oc.commons.core.plugin.PluginFacet;
import tc.oc.pgm.Config;
import tc.oc.pgm.events.MatchBeginEvent;
import tc.oc.pgm.events.MatchEndEvent;
import tc.oc.pgm.events.MatchLoadEvent;
import tc.oc.pgm.gamerules.GameRulesModule;
import tc.oc.pgm.match.MatchManager;
import tc.oc.pgm.modules.TimeLockModule;
/**
* TODO: Break this down into more specific responsibilities
*/
public class PGMListener implements PluginFacet, Listener {
private final Logger logger;
private final MatchManager mm;
@Inject PGMListener(Loggers loggers, MatchManager mm) {
this.logger = loggers.get(getClass());
this.mm = mm;
}
@EventHandler(priority = EventPriority.MONITOR)
public void kickAbandonedPlayers(final PlayerJoinEvent event) {
// Spawn module should add player to a match at a lower priority.
// If that hasn't happened for some reason, kick the player.
if(mm.getPlayer(event.getPlayer()) == null) {
event.getPlayer().kickPlayer(net.md_5.bungee.api.ChatColor.RED + Translations.get().t("incorrectWorld.kickMessage", event.getPlayer()));
logger.severe("Kicking " + event.getPlayer().getName() + " because they failed to join a match");
}
}
@EventHandler(ignoreCancelled = true)
public void protect36(final PlayerInteractEvent event) {
if(event.getClickedBlock() != null) {
if(event.getClickedBlock().getType() == Material.PISTON_MOVING_PIECE) {
event.setCancelled(true);
}
}
}
// sometimes arrows stuck in players persist through deaths
@EventHandler
public void fixStuckArrows(final PlayerRespawnEvent event) {
event.getPlayer().setArrowsStuck(0);
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void clearActiveEnderPearls(final PlayerDeathEvent event) {
for(Entity entity : event.getEntity().getWorld().getEntitiesByClass(EnderPearl.class)) {
if(((EnderPearl) entity).getShooter() == event.getEntity()) {
entity.remove();
}
}
}
// fix item pickup to work the way it should
@EventHandler(priority = EventPriority.HIGHEST)
public void handleItemPickup(final PlayerPickupItemEvent event) {
Player nearestPlayer = event.getPlayer();
double closestDistance = event.getItem().getLocation().distance(event.getPlayer().getLocation());
for(Entity nearEntity : event.getItem().getNearbyEntities(1.5, 1.5, 1.5)) {
double distance = event.getItem().getLocation().distanceSquared(nearEntity.getLocation());
if(nearEntity instanceof Player && distance < closestDistance) {
nearestPlayer = (Player) nearEntity;
closestDistance = distance;
}
}
if(nearestPlayer != event.getPlayer()) event.setCancelled(true);
}
//
// Time Lock
// lock time before, during (if time lock enabled), and after the match
//
static final String DO_DAYLIGHT_CYCLE = "doDaylightCycle";
@EventHandler
public void lockTime(final MatchLoadEvent event) {
event.getMatch().getWorld().setGameRuleValue(DO_DAYLIGHT_CYCLE, Boolean.toString(false));
}
@EventHandler
public void unlockTime(final MatchBeginEvent event) {
boolean unlockTime = false;
if(!event.getMatch().getModuleContext().getModule(TimeLockModule.class).isTimeLocked()) {
unlockTime = true;
}
GameRulesModule gameRulesModule = event.getMatch().getModuleContext().getModule(GameRulesModule.class);
if (gameRulesModule != null && gameRulesModule.getGameRules().containsKey(DO_DAYLIGHT_CYCLE)) {
unlockTime = Boolean.valueOf(gameRulesModule.getGameRules().get(DO_DAYLIGHT_CYCLE));
}
event.getMatch().getWorld().setGameRuleValue(DO_DAYLIGHT_CYCLE, Boolean.toString(unlockTime));
}
@EventHandler
public void lockTime(final MatchEndEvent event) {
event.getMatch().getWorld().setGameRuleValue(DO_DAYLIGHT_CYCLE, Boolean.toString(false));
}
@EventHandler
public void nerfFishing(PlayerFishEvent event) {
if (Config.Fishing.disableTreasure() && event.getCaught() instanceof Item) {
Item caught = (Item) event.getCaught();
if (caught.getItemStack().getType() != Material.RAW_FISH) {
caught.setItemStack(new ItemStack(Material.RAW_FISH));
}
}
}
}