/** * This handler only checks to see if the event should be cancelled. It does not change the * state of any Destroyables. */ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void testBlockChange(BlockTransformEvent event) { if(this.match.getWorld() != event.getWorld() || !this.anyDestroyableAffected(event)) { return; } // This is a temp fix until there is a tracker for placed minecarts (only dispensed are tracked right now) if((event.getCause() instanceof EntityExplodeEvent && ((EntityExplodeEvent) event.getCause()).getEntity() instanceof ExplosiveMinecart) || event.getCause() instanceof BlockPistonExtendEvent || event.getCause() instanceof BlockPistonRetractEvent) { event.setCancelled(true); return; } for(Destroyable destroyable : this.destroyables) { String reasonKey = destroyable.testBlockChange(event.getOldState(), event.getNewState(), ParticipantBlockTransformEvent.getPlayerState(event)); if(reasonKey != null) { event.setCancelled(true, new TranslatableComponent(reasonKey)); return; } } }
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onPaintingBreak(final HangingBreakByEntityEvent event) { final ProtectHolder settings = prot.getSettings(); Entity remover = event.getRemover(); if ((event.getCause() == HangingBreakEvent.RemoveCause.ENTITY) && ((remover instanceof Creeper) && getSettings().isCreeperBlockdamage()) || ((remover instanceof Wither) && getSettings().isWitherSpawnBlockdamage()) || ((remover instanceof Fireball) && getSettings().isFireballBlockdamage()) || ((remover instanceof TNTPrimed) && getSettings().isTntBlockdamage()) || ((remover instanceof WitherSkull) && getSettings().isWitherskullBlockdamage()) || ((remover instanceof ExplosiveMinecart) && getSettings().isTntMinecartBlockdamage())) { event.setCancelled(true); } }
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onEntityExplode(final EntityExplodeEvent event) { final int maxHeight = prot.getSettings().getData().getCreeperMaxHeight(); Entity entity = event.getEntity(); //Block damage prevention section if (entity instanceof EnderDragon && getSettings().isEnderdragonBlockdamage()) { event.setCancelled(true); } else if (entity instanceof Wither && getSettings().isWitherSpawnBlockdamage()) { event.setCancelled(true); } else if (entity instanceof Creeper && (getSettings().isCreeperBlockdamage() || getSettings().isCreeperBlockdamage() || (maxHeight >= 0 && event.getLocation().getBlockY() > maxHeight))) { event.setCancelled(true); event.getLocation().getWorld().createExplosion(event.getLocation(), 0F); } else if (entity instanceof TNTPrimed && getSettings().isTntBlockdamage()) { event.setCancelled(true); } else if ((entity instanceof Fireball || entity instanceof SmallFireball) && getSettings().isFireballBlockdamage()) { event.setCancelled(true); } else if ((entity instanceof WitherSkull) && getSettings().isWitherskullBlockdamage()) { event.setCancelled(true); } else if ((entity instanceof ExplosiveMinecart) && getSettings().isTntMinecartBlockdamage()) { event.setCancelled(true); } }
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void breakCheck(final BlockTransformEvent event) { if(event.getWorld() != this.match.getWorld()) return; ParticipantState player = ParticipantBlockTransformEvent.getPlayerState(event); Vector blockVector = BlockUtils.center(event.getNewState()).toVector(); for(Core core : this.cores) { if(!core.hasLeaked() && core.getCasingRegion().contains(blockVector)) { if(event.getNewState().getType() == Material.AIR) { if(player != null) { Competitor team = player.getParty(); if(team == core.getOwner()) { event.setCancelled(true, new TranslatableComponent("match.core.damageOwn")); } else if (event.getOldState().getData().equals(core.getMaterial())) { this.match.getPluginManager().callEvent(new CoreBlockBreakEvent(core, player, event.getOldState())); core.touch(player); // Note: team may not have touched a broken core if a different team broke it if(!core.isCompleted(team) && !core.hasTouched(team)) { this.match.getPluginManager().callEvent(new GoalStatusChangeEvent(core)); } } } else if(event.getCause() instanceof EntityExplodeEvent) { // this is a temp fix until there is a tracker for placed minecarts (only dispensed are tracked right now) if(((EntityExplodeEvent) event.getCause()).getEntity() instanceof ExplosiveMinecart) { event.setCancelled(true); } } else if(event.getCause() instanceof BlockPistonRetractEvent) { event.setCancelled(true); } } else if(event.getCause() instanceof BlockPistonExtendEvent) { event.setCancelled(true); } else if(event.getCause() instanceof BlockDispenseEvent) { event.setCancelled(true); } break; } } }