From bbb97b08591725cd80fc148691aca43093dedfd7 Mon Sep 17 00:00:00 2001 From: zhangyuheng Date: Fri, 23 Aug 2024 19:42:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E6=BC=8F=E6=96=97?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E5=81=B7=E9=A2=86=E5=9C=B0=E5=86=85=E7=AE=B1?= =?UTF-8?q?=E5=AD=90=E7=9A=84=E6=BC=8F=E6=B4=9E=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BA=86=E6=B4=BB=E5=A1=9E=E5=8F=AF=E4=BB=A5=E8=B7=A8=E9=A2=86?= =?UTF-8?q?=E5=9C=B0=E6=8E=A8=E4=B8=9C=E8=A5=BF=E5=AF=BC=E8=87=B4=E6=BD=9C?= =?UTF-8?q?=E5=9C=A8=E7=A0=B4=E5=9D=8F=E7=9A=84=E6=BC=8F=E6=B4=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 2 +- .../java/cn/lunadeer/dominion/dtos/Flag.java | 2 + .../events_v1_20_1/EnvironmentEvents.java | 42 ++++++++++++++++++ .../events_v1_21/EnvironmentEvents.java | 43 +++++++++++++++++++ 4 files changed, 88 insertions(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 716e98c..0664a65 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } group = "cn.lunadeer" -version = "2.2.2-beta" +version = "2.2.3-beta" java { toolchain.languageVersion.set(JavaLanguageVersion.of(21)) diff --git a/core/src/main/java/cn/lunadeer/dominion/dtos/Flag.java b/core/src/main/java/cn/lunadeer/dominion/dtos/Flag.java index 0e912a6..f075995 100644 --- a/core/src/main/java/cn/lunadeer/dominion/dtos/Flag.java +++ b/core/src/main/java/cn/lunadeer/dominion/dtos/Flag.java @@ -46,6 +46,7 @@ public enum Flag { HONEY("honey", "蜂巢交互", "是否可以采蜂蜜", false, false, true), HOOK("hook", "使用钓钩", "是否可以使用钓钩", false, false, true), HOPPER("hopper", "特殊容器", "包含:漏斗/熔炉/发射器/投掷器/高炉/烟熏炉", false, false, true), + HOPPER_OUTSIDE("hopper_outside", "领地外漏斗对领地内箱子是否生效", "领地外的漏斗是否可以对领地内的箱子生效", false, true, true), IGNITE("ignite", "点燃", "是否可以使用打火石点火", false, false, true), ITEM_FRAME_INTERACTIVE("item_frame_interactive", "展示框交互", "是否可以与物品展示框交互(旋转展示框的东西)", false, false, true), ITEM_FRAME_PROJ_DAMAGE("item_frame_proj_damage", "投掷物是否可以破坏展示框/画", "非玩家发出的投掷物是否可以破坏展示框/画等悬挂物", false, true, true), @@ -56,6 +57,7 @@ public enum Flag { MOVE("move", "移动", "是否可以移动", true, false, true), NOTE_BLOCK("note_block", "点击音符盒", "红石音乐或者某些红石机器会用到...", false, false, true), PLACE("place", "放置方块", "是否可以放置方块(包括:一般方块、展示框、岩浆、水)", false, false, true), + PISTON_OUTSIDE("piston_outside", "活塞是否可以跨领地推动方块", "活塞是否可以往领地内推东西或推东西到领地外", false, true, true), PRESSURE("pressure", "压力板交互", "是否可以触发各种材质的压力板", false, false, true), RIDING("riding", "骑乘载具", "是否可以骑乘各种载具", false, false, true), REPEATER("repeater", "中继器交互", "是否可以与中继器交互", false, false, true), diff --git a/v1_20_1/src/main/java/cn/lunadeer/dominion/events_v1_20_1/EnvironmentEvents.java b/v1_20_1/src/main/java/cn/lunadeer/dominion/events_v1_20_1/EnvironmentEvents.java index 8da4ef4..e8fd34c 100644 --- a/v1_20_1/src/main/java/cn/lunadeer/dominion/events_v1_20_1/EnvironmentEvents.java +++ b/v1_20_1/src/main/java/cn/lunadeer/dominion/events_v1_20_1/EnvironmentEvents.java @@ -7,6 +7,7 @@ import cn.lunadeer.minecraftpluginutils.XLogger; import org.bukkit.Location; import org.bukkit.Tag; import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -14,10 +15,13 @@ 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.block.BlockPistonExtendEvent; import org.bukkit.event.entity.*; import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.hanging.HangingBreakEvent; +import org.bukkit.event.inventory.InventoryMoveItemEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.Inventory; import java.util.Objects; @@ -305,4 +309,42 @@ public class EnvironmentEvents implements Listener { DominionDTO dom = Cache.instance.getDominionByLoc(entity.getLocation()); checkFlag(dom, Flag.VILLAGER_SPAWN, event); } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onHopper(InventoryMoveItemEvent event) { + Inventory hopper = event.getDestination(); + Inventory inventory = event.getSource(); + DominionDTO hopperDom = Cache.instance.getDominionByLoc(hopper.getLocation()); + DominionDTO inventoryDom = Cache.instance.getDominionByLoc(inventory.getLocation()); + if (hopperDom == null && inventoryDom != null) { + checkFlag(inventoryDom, Flag.HOPPER_OUTSIDE, event); + } + if (hopperDom != null && inventoryDom != null) { + if (!hopperDom.getId().equals(inventoryDom.getId())) { + checkFlag(inventoryDom, Flag.HOPPER_OUTSIDE, event); + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onBlockPushedByPiston(BlockPistonExtendEvent event) { + Block piston = event.getBlock(); + DominionDTO pistonDom = Cache.instance.getDominionByLoc(piston.getLocation()); + BlockFace direction = event.getDirection(); + Block endBlockAfterPush = piston.getRelative(direction, event.getBlocks().size() + 1); + DominionDTO endBlockDom = Cache.instance.getDominionByLoc(endBlockAfterPush.getLocation()); + if (pistonDom != null && endBlockDom == null) { + checkFlag(pistonDom, Flag.PISTON_OUTSIDE, event); + } + if (pistonDom == null && endBlockDom != null) { + checkFlag(endBlockDom, Flag.PISTON_OUTSIDE, event); + } + if (pistonDom != null && endBlockDom != null) { + if (!pistonDom.getId().equals(endBlockDom.getId())) { + if (!endBlockDom.getFlagValue(Flag.PISTON_OUTSIDE) || !pistonDom.getFlagValue(Flag.PISTON_OUTSIDE)) { + event.setCancelled(true); + } + } + } + } } diff --git a/v1_21/src/main/java/cn/lunadeer/dominion/events_v1_21/EnvironmentEvents.java b/v1_21/src/main/java/cn/lunadeer/dominion/events_v1_21/EnvironmentEvents.java index b345a1f..00e3d28 100644 --- a/v1_21/src/main/java/cn/lunadeer/dominion/events_v1_21/EnvironmentEvents.java +++ b/v1_21/src/main/java/cn/lunadeer/dominion/events_v1_21/EnvironmentEvents.java @@ -7,6 +7,7 @@ import cn.lunadeer.minecraftpluginutils.XLogger; import org.bukkit.Location; import org.bukkit.Tag; import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -14,10 +15,13 @@ 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.block.BlockPistonExtendEvent; import org.bukkit.event.entity.*; import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.hanging.HangingBreakEvent; +import org.bukkit.event.inventory.InventoryMoveItemEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.Inventory; import java.util.Objects; @@ -305,4 +309,43 @@ public class EnvironmentEvents implements Listener { DominionDTO dom = Cache.instance.getDominionByLoc(entity.getLocation()); checkFlag(dom, Flag.VILLAGER_SPAWN, event); } + + + @EventHandler(priority = EventPriority.HIGHEST) + public void onHopper(InventoryMoveItemEvent event) { + Inventory hopper = event.getDestination(); + Inventory inventory = event.getSource(); + DominionDTO hopperDom = Cache.instance.getDominionByLoc(hopper.getLocation()); + DominionDTO inventoryDom = Cache.instance.getDominionByLoc(inventory.getLocation()); + if (hopperDom == null && inventoryDom != null) { + checkFlag(inventoryDom, Flag.HOPPER_OUTSIDE, event); + } + if (hopperDom != null && inventoryDom != null) { + if (!hopperDom.getId().equals(inventoryDom.getId())) { + checkFlag(inventoryDom, Flag.HOPPER_OUTSIDE, event); + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onBlockPushedByPiston(BlockPistonExtendEvent event) { + Block piston = event.getBlock(); + DominionDTO pistonDom = Cache.instance.getDominionByLoc(piston.getLocation()); + BlockFace direction = event.getDirection(); + Block endBlockAfterPush = piston.getRelative(direction, event.getBlocks().size() + 1); + DominionDTO endBlockDom = Cache.instance.getDominionByLoc(endBlockAfterPush.getLocation()); + if (pistonDom != null && endBlockDom == null) { + checkFlag(pistonDom, Flag.PISTON_OUTSIDE, event); + } + if (pistonDom == null && endBlockDom != null) { + checkFlag(endBlockDom, Flag.PISTON_OUTSIDE, event); + } + if (pistonDom != null && endBlockDom != null) { + if (!pistonDom.getId().equals(endBlockDom.getId())) { + if (!endBlockDom.getFlagValue(Flag.PISTON_OUTSIDE) || !pistonDom.getFlagValue(Flag.PISTON_OUTSIDE)) { + event.setCancelled(true); + } + } + } + } }