ProjectAres/PGM/src/main/java/tc/oc/pgm/freeze/FreezeListener.java

181 lines
6.7 KiB
Java

package tc.oc.pgm.freeze;
import java.util.Collections;
import javax.inject.Inject;
import com.sk89q.minecraft.util.commands.CommandException;
import org.bukkit.Location;
import org.bukkit.Material;
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.BlockPlaceEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerBucketEmptyEvent;
import org.bukkit.event.player.PlayerBucketFillEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.vehicle.VehicleDamageEvent;
import org.bukkit.event.vehicle.VehicleEnterEvent;
import org.bukkit.event.vehicle.VehicleExitEvent;
import org.bukkit.event.vehicle.VehicleMoveEvent;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.util.Vector;
import tc.oc.commons.bukkit.localization.Translations;
import tc.oc.commons.core.commands.CommandExceptionHandler;
import tc.oc.commons.core.plugin.PluginFacet;
import tc.oc.pgm.events.ObserverInteractEvent;
import tc.oc.commons.bukkit.event.ObserverKitApplyEvent;
public class FreezeListener implements Listener, PluginFacet {
private final Freeze freeze;
private final CommandExceptionHandler.Factory exceptionHandlerFactory;
@Inject FreezeListener(Freeze freeze, CommandExceptionHandler.Factory exceptionHandlerFactory) {
this.freeze = freeze;
this.exceptionHandlerFactory = exceptionHandlerFactory;
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onPlayerInteractEntity(final ObserverInteractEvent event) {
if(event.getPlayer().isDead()) return;
if(freeze.isFrozen(event.getPlayer().getBukkit())) {
event.setCancelled(true);
} else if(freeze.enabled()) {
if(event.getClickedItem() != null &&
event.getClickedItem().getType() == Material.ICE &&
event.getPlayer().getBukkit().hasPermission(Freeze.PERMISSION) &&
event.getClickedPlayer() != null) {
event.setCancelled(true);
try {
freeze.toggleFrozen(event.getPlayer().getBukkit(), event.getClickedPlayer().getBukkit());
} catch(CommandException e) {
exceptionHandlerFactory
.create(event.getPlayer().getBukkit())
.handleException(e, null, null);
}
}
}
}
@EventHandler
public void giveKit(final ObserverKitApplyEvent event) {
if(event.getPlayer().hasPermission(Freeze.PERMISSION)) {
ItemStack item = new ItemStack(Material.ICE);
ItemMeta meta = item.getItemMeta();
meta.addItemFlags(ItemFlag.values());
meta.setDisplayName(Translations.get().t("freeze.itemName", event.getPlayer()));
meta.setLore(Collections.singletonList(Translations.get().t("freeze.itemDescription", event.getPlayer())));
item.setItemMeta(meta);
event.getPlayer().getInventory().setItem(6, item);
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onPlayerMove(final PlayerMoveEvent event) {
if(freeze.isFrozen(event.getPlayer())) {
Location old = event.getFrom();
old.setPitch(event.getTo().getPitch());
old.setYaw(event.getTo().getYaw());
event.setTo(old);
}
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onVehicleMove(final VehicleMoveEvent event) {
if(!event.getVehicle().isEmpty() && freeze.isFrozen(event.getVehicle().getPassenger())) {
event.getVehicle().setVelocity(new Vector(0, 0, 0));
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onVehicleEnter(final VehicleEnterEvent event) {
if(freeze.isFrozen(event.getEntered())) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onVehicleExit(final VehicleExitEvent event) {
if(freeze.isFrozen(event.getExited())) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onBlockBreak(final BlockBreakEvent event) {
if(freeze.isFrozen(event.getPlayer())) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onBlockPlace(final BlockPlaceEvent event) {
if(freeze.isFrozen(event.getPlayer())) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onBucketFill(final PlayerBucketFillEvent event) {
if(freeze.isFrozen(event.getPlayer())) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onBucketEmpty(final PlayerBucketEmptyEvent event) {
if(freeze.isFrozen(event.getPlayer())) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOW) // ignoreCancelled doesn't seem to work well here
public void onPlayerInteract(final PlayerInteractEvent event) {
if(freeze.isFrozen(event.getPlayer())) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onInventoryClick(final InventoryClickEvent event) {
if(event.getWhoClicked() instanceof Player) {
if(freeze.isFrozen(event.getWhoClicked())) {
event.setCancelled(true);
}
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onPlayerDropItem(final PlayerDropItemEvent event) {
if(freeze.isFrozen(event.getPlayer())) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onEntityDamge(final EntityDamageByEntityEvent event) {
if(freeze.isFrozen(event.getDamager())) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onVehicleDamage(final VehicleDamageEvent event) {
if(freeze.isFrozen(event.getAttacker())) {
event.setCancelled(true);
}
}
}