diff --git a/pom.xml b/pom.xml index f871200..b56b91b 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer Dominion - 1.42.1-beta + 1.42.2-beta jar Dominion diff --git a/src/main/java/cn/lunadeer/dominion/dtos/Flag.java b/src/main/java/cn/lunadeer/dominion/dtos/Flag.java index 8a0f677..b774a13 100644 --- a/src/main/java/cn/lunadeer/dominion/dtos/Flag.java +++ b/src/main/java/cn/lunadeer/dominion/dtos/Flag.java @@ -46,6 +46,7 @@ public enum Flag { HOOK("hook", "使用钓钩", "是否可以使用钓钩", false, false, true), HOPPER("hopper", "特殊容器", "包含:漏斗/熔炉/发射器/投掷器/高炉/烟熏炉", false, false, true), IGNITE("ignite", "点燃", "是否可以使用打火石点火", false, false, true), + ITEM_FRAME_INTERACTIVE("item_frame_interactive", "展示框交互", "是否可以与物品展示框交互(旋转展示框的东西)", false, false, true), LEVER("lever", "使用拉杆", "是否可以使用拉杆", false, false, true), MOB_DROP_ITEM("mob_drop_item", "生物战利品掉落", "生物死亡时是否产生掉落物", true, true, true), MONSTER_KILLING("monster_killing", "对怪物造成伤害", "玩家是否可以对怪物造成伤害", false, false, true), diff --git a/src/main/java/cn/lunadeer/dominion/events/EnvironmentEvents.java b/src/main/java/cn/lunadeer/dominion/events/EnvironmentEvents.java index 48818b8..585e8e0 100644 --- a/src/main/java/cn/lunadeer/dominion/events/EnvironmentEvents.java +++ b/src/main/java/cn/lunadeer/dominion/events/EnvironmentEvents.java @@ -12,10 +12,8 @@ import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.block.BlockIgniteEvent; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.event.entity.EntityExplodeEvent; -import org.bukkit.event.entity.EntityTeleportEvent; +import org.bukkit.event.entity.*; +import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import java.util.Objects; @@ -27,17 +25,48 @@ public class EnvironmentEvents implements Listener { @EventHandler(priority = EventPriority.HIGHEST) // creeper_explode public void onEntityExplode(EntityExplodeEvent event) { Entity entity = event.getEntity(); - if (entity.getType() != EntityType.CREEPER - && entity.getType() != EntityType.WITHER_SKULL - && entity.getType() != EntityType.FIREBALL - && entity.getType() != EntityType.ENDER_CRYSTAL - ) { + if (isExplodeEntity(entity)) { return; } DominionDTO dom = Cache.instance.getDominionByLoc(event.getLocation()); checkFlag(dom, Flag.CREEPER_EXPLODE, event); } + @EventHandler(priority = EventPriority.HIGHEST) // creeper_explode - item frame + public void onItemFrameExploded(HangingBreakByEntityEvent event) { + Entity entity = event.getEntity(); + Entity remover = event.getRemover(); + if (remover == null) { + return; + } + if (!isExplodeEntity(remover)) { + return; + } + DominionDTO dom = Cache.instance.getDominionByLoc(entity.getLocation()); + checkFlag(dom, Flag.CREEPER_EXPLODE, event); + } + + @EventHandler(priority = EventPriority.HIGHEST) // creeper_explode - armor stand + public void onArmorStandExploded(EntityDamageByEntityEvent event) { + Entity entity = event.getEntity(); + if (entity.getType() != EntityType.ARMOR_STAND) { + return; + } + Entity damager = event.getDamager(); + if (!isExplodeEntity(damager)) { + return; + } + DominionDTO dom = Cache.instance.getDominionByLoc(entity.getLocation()); + checkFlag(dom, Flag.CREEPER_EXPLODE, event); + } + + private static boolean isExplodeEntity(Entity damager) { + return damager.getType() == EntityType.CREEPER + || damager.getType() == EntityType.WITHER_SKULL + || damager.getType() == EntityType.FIREBALL + || damager.getType() == EntityType.ENDER_CRYSTAL; + } + @EventHandler(priority = EventPriority.HIGHEST) // dragon_break_block public void onDragonBreakBlock(EntityExplodeEvent event) { Entity entity = event.getEntity(); diff --git a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java index 3c821de..c0b1f00 100644 --- a/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java +++ b/src/main/java/cn/lunadeer/dominion/events/PlayerEvents.java @@ -16,6 +16,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.*; import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityPlaceEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent; @@ -140,22 +141,42 @@ public class PlayerEvents implements Listener { event.setCancelled(true); } - @EventHandler(priority = EventPriority.HIGHEST) // break - item frame && armor stand + @EventHandler(priority = EventPriority.HIGHEST) // break - item frame public void onItemFrameBreak(HangingBreakByEntityEvent event) { Entity entity = event.getEntity(); - if (!(entity instanceof ItemFrame) && !(entity instanceof ArmorStand)) { - return; - } Entity remover = event.getRemover(); if (!(remover instanceof Player)) { return; } + if (entity instanceof ItemFrame) { + if (((ItemFrame) entity).getItem().getType() != Material.AIR) { + if (!hasContainerPermission((Player) event.getRemover(), entity.getLocation())) { + event.setCancelled(true); + return; + } + } + } if (onBreak((Player) event.getRemover(), entity.getLocation())) { return; } event.setCancelled(true); } + @EventHandler(priority = EventPriority.HIGHEST) // break - armor stand + public void onArmorStandBreak(EntityDamageByEntityEvent event) { + Entity entity = event.getEntity(); + if (!(entity instanceof ArmorStand)) { + return; + } + if (!(event.getDamager() instanceof Player)) { + return; + } + if (onBreak((Player) event.getDamager(), entity.getLocation())) { + return; + } + event.setCancelled(true); + } + public static boolean onBreak(Player player, Location location) { DominionDTO dom = Cache.instance.getDominionByLoc(location); return checkFlag(dom, Flag.BREAK_BLOCK, player, null); @@ -233,30 +254,38 @@ public class PlayerEvents implements Listener { event.setCancelled(true); } - @EventHandler(priority = EventPriority.HIGHEST) // container (item frame) + @EventHandler(priority = EventPriority.HIGHEST) // container (item frame put) public void putSomeOnItemFrame(PlayerInteractEntityEvent event) { Entity entity = event.getRightClicked(); if (!(entity instanceof ItemFrame)) { return; } + ItemFrame itemFrame = (ItemFrame) entity; + if (itemFrame.getItem().getType() != Material.AIR) { + return; + } Player bukkitPlayer = event.getPlayer(); - if (hasContainerPermission(bukkitPlayer, event.getRightClicked().getLocation())) { + if (hasContainerPermission(bukkitPlayer, entity.getLocation())) { return; } event.setCancelled(true); } - @EventHandler(priority = EventPriority.HIGHEST) // container (item frame) + @EventHandler(priority = EventPriority.HIGHEST) // container (item frame get) public void removeSomeOnItemFrame(EntityDamageByEntityEvent event) { Entity entity = event.getEntity(); if (!(entity instanceof ItemFrame)) { return; } + ItemFrame itemFrame = (ItemFrame) entity; + if (itemFrame.getItem().getType() == Material.AIR) { + return; + } if (!(event.getDamager() instanceof Player)) { return; } Player bukkitPlayer = (Player) event.getDamager(); - if (hasContainerPermission(bukkitPlayer, event.getEntity().getLocation())) { + if (hasContainerPermission(bukkitPlayer, entity.getLocation())) { return; } event.setCancelled(true); @@ -498,6 +527,22 @@ public class PlayerEvents implements Listener { checkFlag(dom, Flag.IGNITE, player, event); } + @EventHandler(priority = EventPriority.HIGHEST) // item_frame_interactive + public void onItemFrameInteractive(PlayerInteractEntityEvent event) { + Entity entity = event.getRightClicked(); + if (!(entity instanceof ItemFrame)) { + return; + } + ItemFrame itemFrame = (ItemFrame) entity; + if (itemFrame.getItem().getType() == Material.AIR) { + // 为空则当作容器处理见 putSomeOnItemFrame + return; + } + Player player = event.getPlayer(); + DominionDTO dom = Cache.instance.getDominionByLoc(entity.getLocation()); + checkFlag(dom, Flag.ITEM_FRAME_INTERACTIVE, player, event); + } + @EventHandler(priority = EventPriority.HIGHEST) // lever public void onLever(PlayerInteractEvent event) { if (event.getAction() != Action.RIGHT_CLICK_BLOCK) {