entity-armor-stand-destroy flag is added.

This commit is contained in:
chacho4 2022-05-15 21:36:46 +09:00
parent bc63119373
commit 52ca80b793
4 changed files with 38 additions and 26 deletions

View File

@ -66,20 +66,7 @@
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.Waterlogged;
import org.bukkit.block.data.type.Dispenser; import org.bukkit.block.data.type.Dispenser;
import org.bukkit.entity.AreaEffectCloud; import org.bukkit.entity.*;
import org.bukkit.entity.Creeper;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.FallingBlock;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Item;
import org.bukkit.entity.ItemFrame;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Mob;
import org.bukkit.entity.Painting;
import org.bukkit.entity.Player;
import org.bukkit.entity.Tameable;
import org.bukkit.entity.ThrownPotion;
import org.bukkit.entity.minecart.HopperMinecart; import org.bukkit.entity.minecart.HopperMinecart;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.bukkit.event.Event; import org.bukkit.event.Event;
@ -762,6 +749,8 @@ public void onHangingBreak(HangingBreakEvent event) {
destroyEntityEvent.getRelevantFlags().add(Flags.ENTITY_ITEM_FRAME_DESTROY); destroyEntityEvent.getRelevantFlags().add(Flags.ENTITY_ITEM_FRAME_DESTROY);
} else if (event.getEntity() instanceof Painting) { } else if (event.getEntity() instanceof Painting) {
destroyEntityEvent.getRelevantFlags().add(Flags.ENTITY_PAINTING_DESTROY); destroyEntityEvent.getRelevantFlags().add(Flags.ENTITY_PAINTING_DESTROY);
} else if (event.getEntity() instanceof ArmorStand) {
destroyEntityEvent.getRelevantFlags().add(Flags.ENTITY_ARMOR_STAND_DESTROY);
} }
Events.fireToCancel(event, destroyEntityEvent); Events.fireToCancel(event, destroyEntityEvent);
} }

View File

@ -208,8 +208,8 @@ private void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
} else if (defender instanceof ArmorStand && !(attacker instanceof Player)) { } else if (defender instanceof ArmorStand) {
if (wcfg.blockEntityArmorStandDestroy) { if (checkArmorStandProtection(attacker, (ArmorStand) defender)) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
@ -334,9 +334,10 @@ private void onEntityDamageByProjectile(EntityDamageByEntityEvent event) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
} else if (defender instanceof ArmorStand && Entities.isNonPlayerCreature(attacker)) { } else if (defender instanceof ArmorStand) {
if (wcfg.blockEntityArmorStandDestroy) { if (checkArmorStandProtection(attacker, (ArmorStand) defender)) {
event.setCancelled(true); event.setCancelled(true);
return;
} }
} }
@ -851,4 +852,27 @@ private boolean checkItemFrameProtection(Entity attacker, ItemFrame defender) {
return false; return false;
} }
/**
* Checks regions and config settings to protect items from being knocked
* out of armor stand.
* @param attacker attacking entity
* @param defender armor stand being damaged
* @return true if the event should be cancelled
*/
private boolean checkArmorStandProtection(Entity attacker, ArmorStand defender) {
World world = defender.getWorld();
WorldConfiguration wcfg = getWorldConfig(world);
if (wcfg.useRegions) {
// bukkit throws this event when a player attempts to remove an item from a frame
if (!(attacker instanceof Player)) {
if (!StateFlag.test(WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery().queryState(BukkitAdapter.adapt(defender.getLocation()), (RegionAssociable) null, Flags.ENTITY_ARMOR_STAND_DESTROY))) {
return true;
}
}
}
if (wcfg.blockEntityArmorStandDestroy && !(attacker instanceof Player)) {
return true;
}
return false;
}
} }

View File

@ -27,14 +27,7 @@
import com.sk89q.worldguard.protection.flags.Flags; import com.sk89q.worldguard.protection.flags.Flags;
import com.sk89q.worldguard.protection.flags.StateFlag; import com.sk89q.worldguard.protection.flags.StateFlag;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.entity.Creeper; import org.bukkit.entity.*;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Hanging;
import org.bukkit.entity.ItemFrame;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Painting;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent;
@ -90,6 +83,11 @@ public void onHangingBreak(HangingBreakEvent event) {
|| (wcfg.useRegions || (wcfg.useRegions
&& !StateFlag.test(WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery().queryState(BukkitAdapter.adapt(hanging.getLocation()), (RegionAssociable) null, Flags.ENTITY_ITEM_FRAME_DESTROY))))) { && !StateFlag.test(WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery().queryState(BukkitAdapter.adapt(hanging.getLocation()), (RegionAssociable) null, Flags.ENTITY_ITEM_FRAME_DESTROY))))) {
event.setCancelled(true); event.setCancelled(true);
} else if (hanging instanceof ArmorStand
&& (wcfg.blockEntityArmorStandDestroy
|| (wcfg.useRegions
&& !StateFlag.test(WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery().queryState(BukkitAdapter.adapt(hanging.getLocation()), (RegionAssociable) null, Flags.ENTITY_ARMOR_STAND_DESTROY))))) {
event.setCancelled(true);
} }
} }
} else { } else {

View File

@ -99,6 +99,7 @@ public final class Flags {
public static final StateFlag RAVAGER_RAVAGE = register(new StateFlag("ravager-grief", true)); public static final StateFlag RAVAGER_RAVAGE = register(new StateFlag("ravager-grief", true));
public static final StateFlag ENTITY_PAINTING_DESTROY = register(new StateFlag("entity-painting-destroy", true)); public static final StateFlag ENTITY_PAINTING_DESTROY = register(new StateFlag("entity-painting-destroy", true));
public static final StateFlag ENTITY_ITEM_FRAME_DESTROY = register(new StateFlag("entity-item-frame-destroy", true)); public static final StateFlag ENTITY_ITEM_FRAME_DESTROY = register(new StateFlag("entity-item-frame-destroy", true));
public static final StateFlag ENTITY_ARMOR_STAND_DESTROY = register(new StateFlag("entity-armor-stand-destroy", true));
// mob spawning related // mob spawning related
public static final StateFlag MOB_SPAWNING = register(new StateFlag("mob-spawning", true)); public static final StateFlag MOB_SPAWNING = register(new StateFlag("mob-spawning", true));