From 1b63c02930c273417d6d309045adbb8ec6d63ec5 Mon Sep 17 00:00:00 2001 From: MapleHuang Date: Mon, 19 Jun 2017 16:10:05 +0800 Subject: [PATCH 1/6] Added language Chinese(traditional) and disable in specific worlds feature --- config.yml | 4 ++- lang_zh-tw.yml | 32 +++++++++++++++++++ .../lockettepro/BlockEnvironmentListener.java | 8 +++++ .../BlockInventoryMoveListener.java | 1 + .../mc/lockettepro/BlockPlayerListener.java | 9 ++++++ src/me/crafter/mc/lockettepro/Config.java | 7 ++++ 6 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 lang_zh-tw.yml diff --git a/config.yml b/config.yml index bcd95b4..1a7aa37 100644 --- a/config.yml +++ b/config.yml @@ -43,4 +43,6 @@ lockables: - DARK_OAK_DOOR - IRON_DOOR_BLOCK protection-exempt: -- nothing \ No newline at end of file +- nothing +disable-worlds: +- world_without_lockettepro \ No newline at end of file diff --git a/lang_zh-tw.yml b/lang_zh-tw.yml new file mode 100644 index 0000000..d82fa4a --- /dev/null +++ b/lang_zh-tw.yml @@ -0,0 +1,32 @@ +# Traditional Chinese translation by MapleHuang(stan60250@gmail.com) +command-usage: "&6[LockettePro]&bLockettePro 插件說明\n&c1. 為箱子新增或刪除使用者,首先右鍵選取一個告示牌, 然後輸入/lock 行號 玩家名稱 即可\n&c2. 管理員重新載入插件設定,使用 /lock reload\nLockettePro by connection_lost" +you-can-quick-lock-it: '&6[LockettePro]&6手持告示牌對目標方塊點右鍵即可上鎖' +you-can-manual-lock-it: '&6[LockettePro]&6貼上一個告示牌並寫上[Private]即可上鎖' +config-reloaded: '&6[LockettePro]&a設定已重新載入' +no-permission: '&6[LockettePro]&c權限不足! 無法使用該指令' +no-sign-selected: '&6[LockettePro]&c請先右鍵選擇一個告示牌' +sign-need-reselect: '&6[LockettePro]&c請重新選擇一個告示牌' +line-is-too-long: '&6[LockettePro]&c設定輸入告示牌的文字過長!' +cannot-change-this-line: '&6[LockettePro]&c無法修改這一行' +sign-changed: '&6[LockettePro]&a告示牌已修改' +locked-quick: '&6[LockettePro]&a已成功上鎖' +additional-sign-added-quick: '&6[LockettePro]&a更多的使用者告示牌已新增' +cannot-lock-quick: '&6[LockettePro]&c這個方塊無法上鎖' +cannot-add-additional-sign-quick: '&6[LockettePro]&c無法在這裡新增告示牌' +locked-manual: '&6[LockettePro]&a已成功上鎖' +additional-sign-added-manual: '&6[LockettePro]&a更多的使用者告示牌已新增' +cannot-lock-manual: '&6[LockettePro]&c這個方塊無法上鎖' +cannot-add-additional-sign-manual: '&6[LockettePro]&c無法在這裡新增告示牌' +not-locked-yet-manual: '&6[LockettePro]&c這個方塊還沒有上鎖' +cannot-lock-door-nearby-manual: '&6[LockettePro]&c這附近已經有其他人上鎖的門' +block-already-locked-manual: '&6[LockettePro]&c這個方塊已經被上鎖了' +block-is-not-lockable: '&6[LockettePro]&c這個方塊無法上鎖' +sign-selected: '&6[LockettePro]&a您選擇了一個告示牌,輸入/lock 行號 玩家名稱 來修改它' +break-own-lock-sign: '&6[LockettePro]&a上鎖的告示牌已拆除' +cannot-break-this-lock-sign: '&6[LockettePro]&c無法拆除其他玩家上鎖的告示牌' +break-own-additional-sign: '&6[LockettePro]&a更多使用者的告示牌已拆除' +break-redundant-additional-sign: '&6[LockettePro]&a更多使用者的告示牌已拆除' +cannot-break-this-additional-sign: '&6[LockettePro]&c無法拆除其他玩家上鎖的告示牌' +block-is-locked: '&6[LockettePro]&c這個方塊已被上鎖' +cannot-interfere-with-others: '&6[LockettePro]&c無法在已上鎖的方塊附近放置其他物件' +sign-error: '&4[ERROR]' \ No newline at end of file diff --git a/src/me/crafter/mc/lockettepro/BlockEnvironmentListener.java b/src/me/crafter/mc/lockettepro/BlockEnvironmentListener.java index e75d20c..31ebe5d 100644 --- a/src/me/crafter/mc/lockettepro/BlockEnvironmentListener.java +++ b/src/me/crafter/mc/lockettepro/BlockEnvironmentListener.java @@ -23,6 +23,7 @@ public class BlockEnvironmentListener implements Listener{ @EventHandler(priority = EventPriority.HIGH) public void onEntityExplode(EntityExplodeEvent event){ if (Config.isProtectionExempted("explosion")) return; + if (event.getLocation() != null && Config.isDisabledWorld(event.getLocation().getWorld().getName())) return; Iterator it = event.blockList().iterator(); while (it.hasNext()) { Block block = it.next(); @@ -34,6 +35,7 @@ public void onEntityExplode(EntityExplodeEvent event){ @EventHandler(priority = EventPriority.HIGH) public void onBlockExplode(BlockExplodeEvent event){ if (Config.isProtectionExempted("explosion")) return; + if (event.getBlock() != null && Config.isDisabledWorld(event.getBlock().getWorld().getName())) return; Iterator it = event.blockList().iterator(); while (it.hasNext()) { Block block = it.next(); @@ -45,6 +47,7 @@ public void onBlockExplode(BlockExplodeEvent event){ @EventHandler(priority = EventPriority.HIGH) public void onStructureGrow(StructureGrowEvent event){ if (Config.isProtectionExempted("growth")) return; + if (event.getWorld() != null && Config.isDisabledWorld(event.getWorld().getName())) return; for (BlockState blockstate : event.getBlocks()){ if (LocketteProAPI.isProtected(blockstate.getBlock())){ event.setCancelled(true); @@ -57,6 +60,7 @@ public void onStructureGrow(StructureGrowEvent event){ @EventHandler(priority = EventPriority.HIGH) public void onPistonExtend(BlockPistonExtendEvent event){ if (Config.isProtectionExempted("piston")) return; + if (event.getBlock() != null && Config.isDisabledWorld(event.getBlock().getWorld().getName())) return; for (Block block : event.getBlocks()){ if (LocketteProAPI.isProtected(block)){ event.setCancelled(true); @@ -69,6 +73,7 @@ public void onPistonExtend(BlockPistonExtendEvent event){ @EventHandler(priority = EventPriority.HIGH) public void onPistonRetract(BlockPistonRetractEvent event){ if (Config.isProtectionExempted("piston")) return; + if (event.getBlock() != null && Config.isDisabledWorld(event.getBlock().getWorld().getName())) return; for (Block block : event.getBlocks()){ if (LocketteProAPI.isProtected(block)){ event.setCancelled(true); @@ -81,6 +86,7 @@ public void onPistonRetract(BlockPistonRetractEvent event){ @EventHandler(priority = EventPriority.HIGH) public void onBlockRedstoneChange(BlockRedstoneEvent event){ if (Config.isProtectionExempted("redstone")) return; + if (event.getBlock() != null && Config.isDisabledWorld(event.getBlock().getWorld().getName())) return; if (LocketteProAPI.isProtected(event.getBlock())){ event.setNewCurrent(event.getOldCurrent()); } @@ -90,6 +96,7 @@ public void onBlockRedstoneChange(BlockRedstoneEvent event){ @EventHandler(priority = EventPriority.HIGH) public void onVillagerOpenDoor(EntityInteractEvent event){ if (Config.isProtectionExempted("villager")) return; + if (event.getBlock() != null && Config.isDisabledWorld(event.getBlock().getWorld().getName())) return; // Explicitly to villager vs all doors if (event.getEntity() instanceof Villager && (LocketteProAPI.isSingleDoorBlock(event.getBlock()) || LocketteProAPI.isDoubleDoorBlock(event.getBlock())) && @@ -102,6 +109,7 @@ public void onVillagerOpenDoor(EntityInteractEvent event){ @EventHandler(priority = EventPriority.HIGH) public void onEndermanGreif(EntityInteractEvent event){ if (Config.isProtectionExempted("enderman")) return; + if (event.getBlock() != null && Config.isDisabledWorld(event.getBlock().getWorld().getName())) return; if (event.getEntity() instanceof Enderman && LocketteProAPI.isProtected(event.getBlock())){ event.setCancelled(true); } diff --git a/src/me/crafter/mc/lockettepro/BlockInventoryMoveListener.java b/src/me/crafter/mc/lockettepro/BlockInventoryMoveListener.java index e0e84a9..2fedc5c 100644 --- a/src/me/crafter/mc/lockettepro/BlockInventoryMoveListener.java +++ b/src/me/crafter/mc/lockettepro/BlockInventoryMoveListener.java @@ -15,6 +15,7 @@ public class BlockInventoryMoveListener implements Listener { @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) public void onInventoryMove(InventoryMoveItemEvent event){ + if (event.getSource() != null && Config.isDisabledWorld(event.getSource().getLocation().getWorld().getName())) return; if (Config.isItemTransferOutBlocked() || Config.getHopperMinecartAction() != (byte)0){ if (isInventoryLocked(event.getSource())){ if (Config.isItemTransferOutBlocked()){ diff --git a/src/me/crafter/mc/lockettepro/BlockPlayerListener.java b/src/me/crafter/mc/lockettepro/BlockPlayerListener.java index fa04ded..cfbdf95 100644 --- a/src/me/crafter/mc/lockettepro/BlockPlayerListener.java +++ b/src/me/crafter/mc/lockettepro/BlockPlayerListener.java @@ -28,6 +28,8 @@ public void onPlayerQuickLockChest(PlayerInteractEvent event){ if (event.isCancelled()) return; // Check quick lock enabled if (Config.getQuickProtectAction() == (byte)0) return; + // Check world enabled + if (event.getPlayer() != null && event.getPlayer().getWorld() != null && Config.isDisabledWorld(event.getPlayer().getWorld().getName())) return; // Get player and action info Action action = event.getAction(); Player player = event.getPlayer(); @@ -97,6 +99,7 @@ public void onPlayerQuickLockChest(PlayerInteractEvent event){ @EventHandler(priority = EventPriority.NORMAL) public void onManualLock(SignChangeEvent event){ if (event.getBlock().getType() != Material.WALL_SIGN) return; + if (event.getPlayer() != null && event.getPlayer().getWorld() != null && Config.isDisabledWorld(event.getPlayer().getWorld().getName())) return; String topline = event.getLine(0); Player player = event.getPlayer(); /* Issue #46 - Old version of Minecraft trim signs in unexpected way. @@ -167,6 +170,7 @@ public void onManualLock(SignChangeEvent event){ // Player select sign @EventHandler(priority = EventPriority.LOW) public void playerSelectSign(PlayerInteractEvent event){ + if (event.getPlayer() != null && Config.isDisabledWorld(event.getPlayer().getWorld().getName())) return; if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock().getType() == Material.WALL_SIGN){ Block block = event.getClickedBlock(); Player player = event.getPlayer(); @@ -183,6 +187,7 @@ public void playerSelectSign(PlayerInteractEvent event){ @EventHandler(priority = EventPriority.HIGH) public void onAttemptBreakSign(BlockBreakEvent event){ if (event.isCancelled()) return; + if (event.getPlayer() != null && event.getPlayer().getWorld() != null && Config.isDisabledWorld(event.getPlayer().getWorld().getName())) return; Block block = event.getBlock(); Player player = event.getPlayer(); if (player.hasPermission("lockettepro.admin.break")) return; @@ -217,6 +222,7 @@ public void onAttemptBreakSign(BlockBreakEvent event){ @EventHandler(priority = EventPriority.HIGH) public void onAttemptBreakLockedBlocks(BlockBreakEvent event){ if (event.isCancelled()) return; + if (event.getPlayer() != null && event.getPlayer().getWorld() != null && Config.isDisabledWorld(event.getPlayer().getWorld().getName())) return; Block block = event.getBlock(); Player player = event.getPlayer(); if (LocketteProAPI.isLocked(block) || LocketteProAPI.isUpDownLockedDoor(block)){ @@ -229,6 +235,7 @@ public void onAttemptBreakLockedBlocks(BlockBreakEvent event){ // Protect block from being used & handle double doors @EventHandler(priority = EventPriority.HIGH) public void onAttemptInteractLockedBlocks(PlayerInteractEvent event){ + if (event.getPlayer() != null && event.getPlayer().getWorld() != null && Config.isDisabledWorld(event.getPlayer().getWorld().getName())) return; Action action = event.getAction(); Block block = event.getClickedBlock(); if (LockettePro.needCheckHand()){ @@ -288,6 +295,7 @@ public void onAttemptInteractLockedBlocks(PlayerInteractEvent event){ @EventHandler(priority = EventPriority.HIGH) public void onAttemptPlaceInterfereBlocks(BlockPlaceEvent event){ if (event.isCancelled()) return; + if (event.getPlayer() != null && event.getPlayer().getWorld() != null && Config.isDisabledWorld(event.getPlayer().getWorld().getName())) return; Block block = event.getBlock(); Player player = event.getPlayer(); if (player.hasPermission("lockettepro.admin.interfere")) return; @@ -302,6 +310,7 @@ public void onAttemptPlaceInterfereBlocks(BlockPlaceEvent event){ @EventHandler(priority = EventPriority.MONITOR) public void onPlaceFirstBlockNotify(BlockPlaceEvent event){ if (event.isCancelled()) return; + if (event.getPlayer() != null && event.getPlayer().getWorld() != null && Config.isDisabledWorld(event.getPlayer().getWorld().getName())) return; Block block = event.getBlock(); Player player = event.getPlayer(); if (!player.hasPermission("lockettepro.lock")) return; diff --git a/src/me/crafter/mc/lockettepro/Config.java b/src/me/crafter/mc/lockettepro/Config.java index f1d657e..46cf3d5 100644 --- a/src/me/crafter/mc/lockettepro/Config.java +++ b/src/me/crafter/mc/lockettepro/Config.java @@ -39,6 +39,7 @@ public class Config { private static long lockdefaultcreatetime = -1L; private static String lockexpirestring = ""; private static Set protectionexempt = new HashSet(); + private static Set disableWorlds = new HashSet(); public Config(Plugin _plugin){ plugin = _plugin; @@ -76,10 +77,12 @@ public static void reload(){ List additionalstringlist = config.getStringList("additional-signs"); List everyonestringlist = config.getStringList("everyone-signs"); List protectionexemptstringlist = config.getStringList("protection-exempt"); + List disableworldsstringlist = config.getStringList("disable-worlds"); privatestrings = new HashSet(privatestringlist); additionalstrings = new HashSet(additionalstringlist); everyonestrings = new HashSet(everyonestringlist); protectionexempt = new HashSet(protectionexemptstringlist); + disableWorlds = new HashSet(disableworldsstringlist); defaultprivatestring = privatestringlist.get(0); defaultadditionalstring = additionalstringlist.get(0); @@ -287,4 +290,8 @@ public static boolean isProtectionExempted(String against){ return protectionexempt.contains(against); } + public static boolean isDisabledWorld(String worldName){ + return disableWorlds.contains(worldName); + } + } From 6ea53b2662a19ea4f893309321a265313b845407 Mon Sep 17 00:00:00 2001 From: MapleHuang Date: Tue, 20 Jun 2017 02:43:45 +0800 Subject: [PATCH 2/6] Update config method --- .../lockettepro/BlockEnvironmentListener.java | 24 +++++++------------ .../mc/lockettepro/BlockPlayerListener.java | 21 +++++++--------- src/me/crafter/mc/lockettepro/Config.java | 12 +++++++++- 3 files changed, 27 insertions(+), 30 deletions(-) diff --git a/src/me/crafter/mc/lockettepro/BlockEnvironmentListener.java b/src/me/crafter/mc/lockettepro/BlockEnvironmentListener.java index 31ebe5d..49ee8ca 100644 --- a/src/me/crafter/mc/lockettepro/BlockEnvironmentListener.java +++ b/src/me/crafter/mc/lockettepro/BlockEnvironmentListener.java @@ -22,8 +22,7 @@ public class BlockEnvironmentListener implements Listener{ // Prevent explosion break block @EventHandler(priority = EventPriority.HIGH) public void onEntityExplode(EntityExplodeEvent event){ - if (Config.isProtectionExempted("explosion")) return; - if (event.getLocation() != null && Config.isDisabledWorld(event.getLocation().getWorld().getName())) return; + if (Config.isProtectionExempted("explosion") || Config.isDisabledWorld(event.getLocation())) return; Iterator it = event.blockList().iterator(); while (it.hasNext()) { Block block = it.next(); @@ -34,8 +33,7 @@ public void onEntityExplode(EntityExplodeEvent event){ // Prevent bed break block @EventHandler(priority = EventPriority.HIGH) public void onBlockExplode(BlockExplodeEvent event){ - if (Config.isProtectionExempted("explosion")) return; - if (event.getBlock() != null && Config.isDisabledWorld(event.getBlock().getWorld().getName())) return; + if (Config.isProtectionExempted("explosion") || Config.isDisabledWorld(event.getBlock())) return; Iterator it = event.blockList().iterator(); while (it.hasNext()) { Block block = it.next(); @@ -46,8 +44,7 @@ public void onBlockExplode(BlockExplodeEvent event){ // Prevent tree break block @EventHandler(priority = EventPriority.HIGH) public void onStructureGrow(StructureGrowEvent event){ - if (Config.isProtectionExempted("growth")) return; - if (event.getWorld() != null && Config.isDisabledWorld(event.getWorld().getName())) return; + if (Config.isProtectionExempted("growth") || Config.isDisabledWorld(event.getWorld().getName())) return; for (BlockState blockstate : event.getBlocks()){ if (LocketteProAPI.isProtected(blockstate.getBlock())){ event.setCancelled(true); @@ -59,8 +56,7 @@ public void onStructureGrow(StructureGrowEvent event){ // Prevent piston extend break lock @EventHandler(priority = EventPriority.HIGH) public void onPistonExtend(BlockPistonExtendEvent event){ - if (Config.isProtectionExempted("piston")) return; - if (event.getBlock() != null && Config.isDisabledWorld(event.getBlock().getWorld().getName())) return; + if (Config.isProtectionExempted("piston") || Config.isDisabledWorld(event.getBlock())) return; for (Block block : event.getBlocks()){ if (LocketteProAPI.isProtected(block)){ event.setCancelled(true); @@ -72,8 +68,7 @@ public void onPistonExtend(BlockPistonExtendEvent event){ // Prevent piston retract break lock @EventHandler(priority = EventPriority.HIGH) public void onPistonRetract(BlockPistonRetractEvent event){ - if (Config.isProtectionExempted("piston")) return; - if (event.getBlock() != null && Config.isDisabledWorld(event.getBlock().getWorld().getName())) return; + if (Config.isProtectionExempted("piston") || Config.isDisabledWorld(event.getBlock())) return; for (Block block : event.getBlocks()){ if (LocketteProAPI.isProtected(block)){ event.setCancelled(true); @@ -85,8 +80,7 @@ public void onPistonRetract(BlockPistonRetractEvent event){ // Prevent redstone current open doors @EventHandler(priority = EventPriority.HIGH) public void onBlockRedstoneChange(BlockRedstoneEvent event){ - if (Config.isProtectionExempted("redstone")) return; - if (event.getBlock() != null && Config.isDisabledWorld(event.getBlock().getWorld().getName())) return; + if (Config.isProtectionExempted("redstone") || Config.isDisabledWorld(event.getBlock())) return; if (LocketteProAPI.isProtected(event.getBlock())){ event.setNewCurrent(event.getOldCurrent()); } @@ -95,8 +89,7 @@ public void onBlockRedstoneChange(BlockRedstoneEvent event){ // Prevent villager open door @EventHandler(priority = EventPriority.HIGH) public void onVillagerOpenDoor(EntityInteractEvent event){ - if (Config.isProtectionExempted("villager")) return; - if (event.getBlock() != null && Config.isDisabledWorld(event.getBlock().getWorld().getName())) return; + if (Config.isProtectionExempted("villager") || Config.isDisabledWorld(event.getBlock())) return; // Explicitly to villager vs all doors if (event.getEntity() instanceof Villager && (LocketteProAPI.isSingleDoorBlock(event.getBlock()) || LocketteProAPI.isDoubleDoorBlock(event.getBlock())) && @@ -108,8 +101,7 @@ public void onVillagerOpenDoor(EntityInteractEvent event){ // Prevent Enderman take block @EventHandler(priority = EventPriority.HIGH) public void onEndermanGreif(EntityInteractEvent event){ - if (Config.isProtectionExempted("enderman")) return; - if (event.getBlock() != null && Config.isDisabledWorld(event.getBlock().getWorld().getName())) return; + if (Config.isProtectionExempted("enderman") || Config.isDisabledWorld(event.getBlock())) return; if (event.getEntity() instanceof Enderman && LocketteProAPI.isProtected(event.getBlock())){ event.setCancelled(true); } diff --git a/src/me/crafter/mc/lockettepro/BlockPlayerListener.java b/src/me/crafter/mc/lockettepro/BlockPlayerListener.java index cfbdf95..b15788e 100644 --- a/src/me/crafter/mc/lockettepro/BlockPlayerListener.java +++ b/src/me/crafter/mc/lockettepro/BlockPlayerListener.java @@ -29,7 +29,7 @@ public void onPlayerQuickLockChest(PlayerInteractEvent event){ // Check quick lock enabled if (Config.getQuickProtectAction() == (byte)0) return; // Check world enabled - if (event.getPlayer() != null && event.getPlayer().getWorld() != null && Config.isDisabledWorld(event.getPlayer().getWorld().getName())) return; + if (Config.isDisabledWorld(event.getPlayer().getWorld().getName())) return; // Get player and action info Action action = event.getAction(); Player player = event.getPlayer(); @@ -98,8 +98,7 @@ public void onPlayerQuickLockChest(PlayerInteractEvent event){ // Manual protection @EventHandler(priority = EventPriority.NORMAL) public void onManualLock(SignChangeEvent event){ - if (event.getBlock().getType() != Material.WALL_SIGN) return; - if (event.getPlayer() != null && event.getPlayer().getWorld() != null && Config.isDisabledWorld(event.getPlayer().getWorld().getName())) return; + if (event.getBlock().getType() != Material.WALL_SIGN || Config.isDisabledWorld(event.getBlock())) return; String topline = event.getLine(0); Player player = event.getPlayer(); /* Issue #46 - Old version of Minecraft trim signs in unexpected way. @@ -170,7 +169,7 @@ public void onManualLock(SignChangeEvent event){ // Player select sign @EventHandler(priority = EventPriority.LOW) public void playerSelectSign(PlayerInteractEvent event){ - if (event.getPlayer() != null && Config.isDisabledWorld(event.getPlayer().getWorld().getName())) return; + if (event.isCancelled() || Config.isDisabledWorld(event.getClickedBlock())) return; if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock().getType() == Material.WALL_SIGN){ Block block = event.getClickedBlock(); Player player = event.getPlayer(); @@ -186,8 +185,7 @@ public void playerSelectSign(PlayerInteractEvent event){ // Player break sign @EventHandler(priority = EventPriority.HIGH) public void onAttemptBreakSign(BlockBreakEvent event){ - if (event.isCancelled()) return; - if (event.getPlayer() != null && event.getPlayer().getWorld() != null && Config.isDisabledWorld(event.getPlayer().getWorld().getName())) return; + if (event.isCancelled() || Config.isDisabledWorld(event.getBlock())) return; Block block = event.getBlock(); Player player = event.getPlayer(); if (player.hasPermission("lockettepro.admin.break")) return; @@ -221,8 +219,7 @@ public void onAttemptBreakSign(BlockBreakEvent event){ // Protect block from being destroyed @EventHandler(priority = EventPriority.HIGH) public void onAttemptBreakLockedBlocks(BlockBreakEvent event){ - if (event.isCancelled()) return; - if (event.getPlayer() != null && event.getPlayer().getWorld() != null && Config.isDisabledWorld(event.getPlayer().getWorld().getName())) return; + if (event.isCancelled() || Config.isDisabledWorld(event.getBlock())) return; Block block = event.getBlock(); Player player = event.getPlayer(); if (LocketteProAPI.isLocked(block) || LocketteProAPI.isUpDownLockedDoor(block)){ @@ -235,7 +232,7 @@ public void onAttemptBreakLockedBlocks(BlockBreakEvent event){ // Protect block from being used & handle double doors @EventHandler(priority = EventPriority.HIGH) public void onAttemptInteractLockedBlocks(PlayerInteractEvent event){ - if (event.getPlayer() != null && event.getPlayer().getWorld() != null && Config.isDisabledWorld(event.getPlayer().getWorld().getName())) return; + if (Config.isDisabledWorld(event.getClickedBlock())) return; Action action = event.getAction(); Block block = event.getClickedBlock(); if (LockettePro.needCheckHand()){ @@ -294,8 +291,7 @@ public void onAttemptInteractLockedBlocks(PlayerInteractEvent event){ // Protect block from interfere block @EventHandler(priority = EventPriority.HIGH) public void onAttemptPlaceInterfereBlocks(BlockPlaceEvent event){ - if (event.isCancelled()) return; - if (event.getPlayer() != null && event.getPlayer().getWorld() != null && Config.isDisabledWorld(event.getPlayer().getWorld().getName())) return; + if (event.isCancelled() || Config.isDisabledWorld(event.getBlock())) return; Block block = event.getBlock(); Player player = event.getPlayer(); if (player.hasPermission("lockettepro.admin.interfere")) return; @@ -309,8 +305,7 @@ public void onAttemptPlaceInterfereBlocks(BlockPlaceEvent event){ // Tell player about lockettepro @EventHandler(priority = EventPriority.MONITOR) public void onPlaceFirstBlockNotify(BlockPlaceEvent event){ - if (event.isCancelled()) return; - if (event.getPlayer() != null && event.getPlayer().getWorld() != null && Config.isDisabledWorld(event.getPlayer().getWorld().getName())) return; + if (event.isCancelled() || Config.isDisabledWorld(event.getBlock())) return; Block block = event.getBlock(); Player player = event.getPlayer(); if (!player.hasPermission("lockettepro.lock")) return; diff --git a/src/me/crafter/mc/lockettepro/Config.java b/src/me/crafter/mc/lockettepro/Config.java index 46cf3d5..f9c854a 100644 --- a/src/me/crafter/mc/lockettepro/Config.java +++ b/src/me/crafter/mc/lockettepro/Config.java @@ -8,7 +8,9 @@ import java.util.Set; import org.bukkit.ChatColor; +import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.block.Block; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.Plugin; @@ -202,7 +204,7 @@ public static void initDefaultConfig(){ } public static void initAdditionalFiles(){ - String[] availablefiles = {"lang.yml", "lang_zh-cn.yml", "lang_es.yml", "lang_it.yml"}; + String[] availablefiles = {"lang.yml", "lang_zh-cn.yml", "lang_zh-tw.yml", "lang_es.yml", "lang_it.yml"}; for (String filename : availablefiles){ File langfile = new File(plugin.getDataFolder(), filename); if (!langfile.exists()){ @@ -294,4 +296,12 @@ public static boolean isDisabledWorld(String worldName){ return disableWorlds.contains(worldName); } + public static boolean isDisabledWorld(Block block){ + return block != null && block.getWorld() != null && isDisabledWorld(block.getWorld().getName()); + } + + public static boolean isDisabledWorld(Location location){ + return location != null && location.getWorld() != null && isDisabledWorld(location.getWorld().getName()); + } + } From fb61b4c14016233882810d808514f606cb3f2a67 Mon Sep 17 00:00:00 2001 From: MapleHuang Date: Tue, 20 Jun 2017 03:06:12 +0800 Subject: [PATCH 3/6] Update LocketteProAPI and remove duplicate code --- .../lockettepro/BlockEnvironmentListener.java | 16 +++++++------- .../BlockInventoryMoveListener.java | 1 - .../mc/lockettepro/BlockPlayerListener.java | 21 +++++++------------ src/me/crafter/mc/lockettepro/Config.java | 10 --------- .../mc/lockettepro/LocketteProAPI.java | 4 ++++ 5 files changed, 19 insertions(+), 33 deletions(-) diff --git a/src/me/crafter/mc/lockettepro/BlockEnvironmentListener.java b/src/me/crafter/mc/lockettepro/BlockEnvironmentListener.java index 49ee8ca..be7a421 100644 --- a/src/me/crafter/mc/lockettepro/BlockEnvironmentListener.java +++ b/src/me/crafter/mc/lockettepro/BlockEnvironmentListener.java @@ -22,7 +22,7 @@ public class BlockEnvironmentListener implements Listener{ // Prevent explosion break block @EventHandler(priority = EventPriority.HIGH) public void onEntityExplode(EntityExplodeEvent event){ - if (Config.isProtectionExempted("explosion") || Config.isDisabledWorld(event.getLocation())) return; + if (Config.isProtectionExempted("explosion")) return; Iterator it = event.blockList().iterator(); while (it.hasNext()) { Block block = it.next(); @@ -33,7 +33,7 @@ public void onEntityExplode(EntityExplodeEvent event){ // Prevent bed break block @EventHandler(priority = EventPriority.HIGH) public void onBlockExplode(BlockExplodeEvent event){ - if (Config.isProtectionExempted("explosion") || Config.isDisabledWorld(event.getBlock())) return; + if (Config.isProtectionExempted("explosion")) return; Iterator it = event.blockList().iterator(); while (it.hasNext()) { Block block = it.next(); @@ -44,7 +44,7 @@ public void onBlockExplode(BlockExplodeEvent event){ // Prevent tree break block @EventHandler(priority = EventPriority.HIGH) public void onStructureGrow(StructureGrowEvent event){ - if (Config.isProtectionExempted("growth") || Config.isDisabledWorld(event.getWorld().getName())) return; + if (Config.isProtectionExempted("growth")) return; for (BlockState blockstate : event.getBlocks()){ if (LocketteProAPI.isProtected(blockstate.getBlock())){ event.setCancelled(true); @@ -56,7 +56,7 @@ public void onStructureGrow(StructureGrowEvent event){ // Prevent piston extend break lock @EventHandler(priority = EventPriority.HIGH) public void onPistonExtend(BlockPistonExtendEvent event){ - if (Config.isProtectionExempted("piston") || Config.isDisabledWorld(event.getBlock())) return; + if (Config.isProtectionExempted("piston")) return; for (Block block : event.getBlocks()){ if (LocketteProAPI.isProtected(block)){ event.setCancelled(true); @@ -68,7 +68,7 @@ public void onPistonExtend(BlockPistonExtendEvent event){ // Prevent piston retract break lock @EventHandler(priority = EventPriority.HIGH) public void onPistonRetract(BlockPistonRetractEvent event){ - if (Config.isProtectionExempted("piston") || Config.isDisabledWorld(event.getBlock())) return; + if (Config.isProtectionExempted("piston")) return; for (Block block : event.getBlocks()){ if (LocketteProAPI.isProtected(block)){ event.setCancelled(true); @@ -80,7 +80,7 @@ public void onPistonRetract(BlockPistonRetractEvent event){ // Prevent redstone current open doors @EventHandler(priority = EventPriority.HIGH) public void onBlockRedstoneChange(BlockRedstoneEvent event){ - if (Config.isProtectionExempted("redstone") || Config.isDisabledWorld(event.getBlock())) return; + if (Config.isProtectionExempted("redstone")) return; if (LocketteProAPI.isProtected(event.getBlock())){ event.setNewCurrent(event.getOldCurrent()); } @@ -89,7 +89,7 @@ public void onBlockRedstoneChange(BlockRedstoneEvent event){ // Prevent villager open door @EventHandler(priority = EventPriority.HIGH) public void onVillagerOpenDoor(EntityInteractEvent event){ - if (Config.isProtectionExempted("villager") || Config.isDisabledWorld(event.getBlock())) return; + if (Config.isProtectionExempted("villager")) return; // Explicitly to villager vs all doors if (event.getEntity() instanceof Villager && (LocketteProAPI.isSingleDoorBlock(event.getBlock()) || LocketteProAPI.isDoubleDoorBlock(event.getBlock())) && @@ -101,7 +101,7 @@ public void onVillagerOpenDoor(EntityInteractEvent event){ // Prevent Enderman take block @EventHandler(priority = EventPriority.HIGH) public void onEndermanGreif(EntityInteractEvent event){ - if (Config.isProtectionExempted("enderman") || Config.isDisabledWorld(event.getBlock())) return; + if (Config.isProtectionExempted("enderman")) return; if (event.getEntity() instanceof Enderman && LocketteProAPI.isProtected(event.getBlock())){ event.setCancelled(true); } diff --git a/src/me/crafter/mc/lockettepro/BlockInventoryMoveListener.java b/src/me/crafter/mc/lockettepro/BlockInventoryMoveListener.java index 2fedc5c..e0e84a9 100644 --- a/src/me/crafter/mc/lockettepro/BlockInventoryMoveListener.java +++ b/src/me/crafter/mc/lockettepro/BlockInventoryMoveListener.java @@ -15,7 +15,6 @@ public class BlockInventoryMoveListener implements Listener { @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) public void onInventoryMove(InventoryMoveItemEvent event){ - if (event.getSource() != null && Config.isDisabledWorld(event.getSource().getLocation().getWorld().getName())) return; if (Config.isItemTransferOutBlocked() || Config.getHopperMinecartAction() != (byte)0){ if (isInventoryLocked(event.getSource())){ if (Config.isItemTransferOutBlocked()){ diff --git a/src/me/crafter/mc/lockettepro/BlockPlayerListener.java b/src/me/crafter/mc/lockettepro/BlockPlayerListener.java index b15788e..d39813a 100644 --- a/src/me/crafter/mc/lockettepro/BlockPlayerListener.java +++ b/src/me/crafter/mc/lockettepro/BlockPlayerListener.java @@ -23,9 +23,8 @@ public class BlockPlayerListener implements Listener { // Quick protect for chests - @EventHandler(priority = EventPriority.NORMAL) + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onPlayerQuickLockChest(PlayerInteractEvent event){ - if (event.isCancelled()) return; // Check quick lock enabled if (Config.getQuickProtectAction() == (byte)0) return; // Check world enabled @@ -98,7 +97,7 @@ public void onPlayerQuickLockChest(PlayerInteractEvent event){ // Manual protection @EventHandler(priority = EventPriority.NORMAL) public void onManualLock(SignChangeEvent event){ - if (event.getBlock().getType() != Material.WALL_SIGN || Config.isDisabledWorld(event.getBlock())) return; + if (event.getBlock().getType() != Material.WALL_SIGN) return; String topline = event.getLine(0); Player player = event.getPlayer(); /* Issue #46 - Old version of Minecraft trim signs in unexpected way. @@ -167,9 +166,8 @@ public void onManualLock(SignChangeEvent event){ } // Player select sign - @EventHandler(priority = EventPriority.LOW) + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void playerSelectSign(PlayerInteractEvent event){ - if (event.isCancelled() || Config.isDisabledWorld(event.getClickedBlock())) return; if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock().getType() == Material.WALL_SIGN){ Block block = event.getClickedBlock(); Player player = event.getPlayer(); @@ -183,9 +181,8 @@ public void playerSelectSign(PlayerInteractEvent event){ } // Player break sign - @EventHandler(priority = EventPriority.HIGH) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onAttemptBreakSign(BlockBreakEvent event){ - if (event.isCancelled() || Config.isDisabledWorld(event.getBlock())) return; Block block = event.getBlock(); Player player = event.getPlayer(); if (player.hasPermission("lockettepro.admin.break")) return; @@ -217,9 +214,8 @@ public void onAttemptBreakSign(BlockBreakEvent event){ } // Protect block from being destroyed - @EventHandler(priority = EventPriority.HIGH) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onAttemptBreakLockedBlocks(BlockBreakEvent event){ - if (event.isCancelled() || Config.isDisabledWorld(event.getBlock())) return; Block block = event.getBlock(); Player player = event.getPlayer(); if (LocketteProAPI.isLocked(block) || LocketteProAPI.isUpDownLockedDoor(block)){ @@ -232,7 +228,6 @@ public void onAttemptBreakLockedBlocks(BlockBreakEvent event){ // Protect block from being used & handle double doors @EventHandler(priority = EventPriority.HIGH) public void onAttemptInteractLockedBlocks(PlayerInteractEvent event){ - if (Config.isDisabledWorld(event.getClickedBlock())) return; Action action = event.getAction(); Block block = event.getClickedBlock(); if (LockettePro.needCheckHand()){ @@ -289,9 +284,8 @@ public void onAttemptInteractLockedBlocks(PlayerInteractEvent event){ } // Protect block from interfere block - @EventHandler(priority = EventPriority.HIGH) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onAttemptPlaceInterfereBlocks(BlockPlaceEvent event){ - if (event.isCancelled() || Config.isDisabledWorld(event.getBlock())) return; Block block = event.getBlock(); Player player = event.getPlayer(); if (player.hasPermission("lockettepro.admin.interfere")) return; @@ -303,9 +297,8 @@ public void onAttemptPlaceInterfereBlocks(BlockPlaceEvent event){ } // Tell player about lockettepro - @EventHandler(priority = EventPriority.MONITOR) + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlaceFirstBlockNotify(BlockPlaceEvent event){ - if (event.isCancelled() || Config.isDisabledWorld(event.getBlock())) return; Block block = event.getBlock(); Player player = event.getPlayer(); if (!player.hasPermission("lockettepro.lock")) return; diff --git a/src/me/crafter/mc/lockettepro/Config.java b/src/me/crafter/mc/lockettepro/Config.java index f9c854a..a85c62f 100644 --- a/src/me/crafter/mc/lockettepro/Config.java +++ b/src/me/crafter/mc/lockettepro/Config.java @@ -8,9 +8,7 @@ import java.util.Set; import org.bukkit.ChatColor; -import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.block.Block; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.Plugin; @@ -296,12 +294,4 @@ public static boolean isDisabledWorld(String worldName){ return disableWorlds.contains(worldName); } - public static boolean isDisabledWorld(Block block){ - return block != null && block.getWorld() != null && isDisabledWorld(block.getWorld().getName()); - } - - public static boolean isDisabledWorld(Location location){ - return location != null && location.getWorld() != null && isDisabledWorld(location.getWorld().getName()); - } - } diff --git a/src/me/crafter/mc/lockettepro/LocketteProAPI.java b/src/me/crafter/mc/lockettepro/LocketteProAPI.java index a6e92a6..04d75f1 100644 --- a/src/me/crafter/mc/lockettepro/LocketteProAPI.java +++ b/src/me/crafter/mc/lockettepro/LocketteProAPI.java @@ -17,6 +17,8 @@ public class LocketteProAPI { public static boolean isLocked(Block block){ if (block == null) return false; + // World check + if (Config.isDisabledWorld(block.getWorld().getName())) return false; switch (block.getType()){ // Double Doors case WOODEN_DOOR: @@ -208,6 +210,8 @@ public static boolean isOwnerOfSign(Block block, Player player){ // Requires isS } public static boolean isLockable(Block block){ + // World check + if (block != null && Config.isDisabledWorld(block.getWorld().getName())) return false; Material material = block.getType(); //Bad blocks switch (material){ From 700e592c195d5dc311c32d85c18acca9b76ff7c1 Mon Sep 17 00:00:00 2001 From: Pawned Date: Sun, 16 Jul 2017 09:19:06 +0100 Subject: [PATCH 4/6] Ignore case-sensitivity on Clan Tags Clan Tags are not case-sensitive (i.e. 1 user cannot have clan tag "Test" and another user have a clan with tag "TeSt") This update just makes it easier to give their clan members access as we found that .getTag() returns the tag in all lowercase while users were used to typing their tag with whatever casing they usually have on their tag. --- src/me/crafter/mc/lockettepro/Dependency.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/me/crafter/mc/lockettepro/Dependency.java b/src/me/crafter/mc/lockettepro/Dependency.java index 0e9eced..394e68f 100644 --- a/src/me/crafter/mc/lockettepro/Dependency.java +++ b/src/me/crafter/mc/lockettepro/Dependency.java @@ -203,7 +203,7 @@ public static boolean isSimpleClanOf(String line, Player player){ if (clanplayer != null){ Clan clan = clanplayer.getClan(); if (clan != null){ - if (line.equals("[" + clan.getTag() + "]")) return true; + if (line.equalsIgnoreCase("[" + clan.getTag() + "]")) return true; } } } catch (Exception e){} From abe4d3d391e91ee13436db348de5248a9ab787ce Mon Sep 17 00:00:00 2001 From: cyilin Date: Mon, 5 Feb 2018 16:01:51 +0800 Subject: [PATCH 5/6] prevent mobs break block. fix #75 --- .../lockettepro/BlockEnvironmentListener.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/me/crafter/mc/lockettepro/BlockEnvironmentListener.java b/src/me/crafter/mc/lockettepro/BlockEnvironmentListener.java index e75d20c..60669d4 100644 --- a/src/me/crafter/mc/lockettepro/BlockEnvironmentListener.java +++ b/src/me/crafter/mc/lockettepro/BlockEnvironmentListener.java @@ -5,7 +5,10 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.entity.Enderman; +import org.bukkit.entity.Silverfish; import org.bukkit.entity.Villager; +import org.bukkit.entity.Wither; +import org.bukkit.entity.Zombie; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -13,6 +16,7 @@ import org.bukkit.event.block.BlockPistonExtendEvent; import org.bukkit.event.block.BlockPistonRetractEvent; import org.bukkit.event.block.BlockRedstoneEvent; +import org.bukkit.event.entity.EntityChangeBlockEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntityInteractEvent; import org.bukkit.event.world.StructureGrowEvent; @@ -98,13 +102,17 @@ public void onVillagerOpenDoor(EntityInteractEvent event){ } } - // Prevent Enderman take block + // Prevent mob change block @EventHandler(priority = EventPriority.HIGH) - public void onEndermanGreif(EntityInteractEvent event){ - if (Config.isProtectionExempted("enderman")) return; - if (event.getEntity() instanceof Enderman && LocketteProAPI.isProtected(event.getBlock())){ - event.setCancelled(true); - } + public void onMobChangeBlock(EntityChangeBlockEvent event) { + if ((event.getEntity() instanceof Enderman && !Config.isProtectionExempted("enderman")) ||// enderman pick up/place block + (event.getEntity() instanceof Wither && !Config.isProtectionExempted("wither")) ||// wither break block + (event.getEntity() instanceof Zombie && !Config.isProtectionExempted("zombie")) ||// zombie break door + (event.getEntity() instanceof Silverfish && !Config.isProtectionExempted("silverfish"))){ + if (LocketteProAPI.isProtected(event.getBlock())){ + event.setCancelled(true); + } + }// ignore other reason (boat break lily pad, arrow ignite tnt, etc) } } From 686b9132cf1d8aba4eea71c09fd0fecda870217b Mon Sep 17 00:00:00 2001 From: MapleHuang Date: Sat, 28 Jul 2018 19:00:04 +0800 Subject: [PATCH 6/6] Added exhibit(show-off) feature --- plugin.yml | 2 +- .../mc/lockettepro/BlockPlayerListener.java | 94 ++++++++++++++++++- src/me/crafter/mc/lockettepro/Config.java | 13 +++ .../mc/lockettepro/LocketteProAPI.java | 46 +++++++++ src/me/crafter/mc/lockettepro/Utils.java | 6 ++ 5 files changed, 158 insertions(+), 3 deletions(-) diff --git a/plugin.yml b/plugin.yml index c49b56a..9dd08fe 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,7 +1,7 @@ name: LockettePro main: me.crafter.mc.lockettepro.LockettePro author: connection_lost -softdepend: [Vault, WorldGuard, Residence, Towny, ProtocolLib, Factions, ASkyBlock, PlotSquared, SimpleClans] +softdepend: [Vault, WorldGuard, Residence, Towny, ProtocolLib, Factions, ASkyBlock, PlotSquared, SimpleClans, GriefPrevention] loadbefore: [SignShop] version: 2.8.1 description: > diff --git a/src/me/crafter/mc/lockettepro/BlockPlayerListener.java b/src/me/crafter/mc/lockettepro/BlockPlayerListener.java index d39813a..bd849fc 100644 --- a/src/me/crafter/mc/lockettepro/BlockPlayerListener.java +++ b/src/me/crafter/mc/lockettepro/BlockPlayerListener.java @@ -8,6 +8,7 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; +import org.bukkit.block.Chest; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -16,8 +17,12 @@ import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.SignChangeEvent; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.DoubleChestInventory; import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.InventoryHolder; import org.bukkit.material.Openable; public class BlockPlayerListener implements Listener { @@ -245,7 +250,7 @@ public void onAttemptInteractLockedBlocks(PlayerInteractEvent event){ case LEFT_CLICK_BLOCK: case RIGHT_CLICK_BLOCK: Player player = event.getPlayer(); - if (((LocketteProAPI.isLocked(block) && !LocketteProAPI.isUser(block, player)) || + if (((LocketteProAPI.isLocked(block) && !LocketteProAPI.isUser(block, player) && !LocketteProAPI.isExhibit(block) ) || (LocketteProAPI.isUpDownLockedDoor(block) && !LocketteProAPI.isUserUpDownLockedDoor(block, player))) && !player.hasPermission("lockettepro.admin.use")){ Utils.sendMessages(player, Config.getLang("block-is-locked")); @@ -253,7 +258,8 @@ public void onAttemptInteractLockedBlocks(PlayerInteractEvent event){ Utils.playAccessDenyEffect(player, block); } else { // Handle double doors if (action == Action.RIGHT_CLICK_BLOCK){ - if ((LocketteProAPI.isDoubleDoorBlock(block) || LocketteProAPI.isSingleDoorBlock(block)) && LocketteProAPI.isLocked(block)){ + if(LocketteProAPI.isLocked(block)) { + if (LocketteProAPI.isDoubleDoorBlock(block) || LocketteProAPI.isSingleDoorBlock(block)){ Block doorblock = LocketteProAPI.getBottomDoorBlock(block); BlockState doorstate = doorblock.getState(); Openable openablestate = (Openable)doorstate.getData(); @@ -274,6 +280,19 @@ public void onAttemptInteractLockedBlocks(PlayerInteractEvent event){ if (closetime > 0){ Bukkit.getScheduler().runTaskLater(LockettePro.getPlugin(), new DoorToggleTask(doors), closetime*20); } + } else if ( + LocketteProAPI.isExhibit(block) && + !LocketteProAPI.isUser(block, player) && + !player.hasPermission("lockettepro.admin.use") + ) { + if (block.getState() instanceof Chest && ((Chest)block.getState()).getInventory() instanceof DoubleChestInventory) { + Utils.getProtectedInventoryHolder().put(player, ((DoubleChestInventory)((Chest)block.getState()).getInventory()).getLeftSide().getHolder()); + //player.sendMessage(("§bProtect DInventoryHolder: " + getCode(((DoubleChestInventory)((Chest)block.getState()).getInventory()).getLeftSide().getHolder().toString()))); + } else if (block.getState() instanceof InventoryHolder) { + Utils.getProtectedInventoryHolder().put(player, ((InventoryHolder)block.getState())); + //player.sendMessage("§bProtect InventoryHolder: " + getCode(((InventoryHolder)block.getState()).toString())); + } + } } } } @@ -283,6 +302,77 @@ public void onAttemptInteractLockedBlocks(PlayerInteractEvent event){ } } + /* + @EventHandler(ignoreCancelled = true) + public void onInventoryOpen(InventoryOpenEvent event) { + if( + event.getPlayer() != null && event.getPlayer() instanceof Player && + Utils.getProtectedInventoryHolder().containsKey((Player)event.getPlayer()) && + event.getInventory() != null) { + Player player = (Player)event.getPlayer(); + if(event.getInventory() instanceof DoubleChestInventory && Utils.getProtectedInventoryHolder().get((Player)event.getPlayer()).equals(((DoubleChestInventory)event.getInventory()).getLeftSide().getHolder())) { + player.sendMessage("§aProtected DoubleChestInventory Open: " + getCode(((DoubleChestInventory)event.getInventory()).getLeftSide().getHolder().toString())); + } else if (Utils.getProtectedInventoryHolder().get((Player)event.getPlayer()).equals(event.getInventory().getHolder())) { + player.sendMessage("§aProtected Inventory Open: " + getCode(event.getInventory().getHolder().toString())); + } + } + } + */ + + @EventHandler(ignoreCancelled = true) + public void onInventoryClick(InventoryClickEvent event) { + if( + event.getWhoClicked() != null && event.getWhoClicked() instanceof Player && + Utils.getProtectedInventoryHolder().containsKey((Player)event.getWhoClicked()) && + event.getInventory() != null) { + event.setCancelled(true); + /* + Player player = (Player)event.getWhoClicked(); + if(event.getInventory() instanceof DoubleChestInventory && Utils.getProtectedInventoryHolder().get((Player)event.getWhoClicked()).equals(((DoubleChestInventory)event.getInventory()).getLeftSide().getHolder())) { + player.sendMessage("§dProtected DoubleChestInventory Click: " + getCode(((DoubleChestInventory)event.getInventory()).getLeftSide().getHolder().toString())); + } else if (Utils.getProtectedInventoryHolder().get((Player)event.getWhoClicked()).equals(event.getInventory().getHolder())) { + player.sendMessage("§dProtected Inventory Click: " + getCode(event.getInventory().getHolder().toString())); + } + */ + } + } + + @EventHandler(ignoreCancelled = true) + public void onInventoryClose(InventoryCloseEvent event) { + if( + event.getPlayer() != null && event.getPlayer() instanceof Player && + Utils.getProtectedInventoryHolder().containsKey((Player)event.getPlayer()) && + event.getInventory() != null) { + /* + Player player = (Player)event.getPlayer(); + if(event.getInventory() instanceof DoubleChestInventory && Utils.getProtectedInventoryHolder().get((Player)event.getPlayer()).equals(((DoubleChestInventory)event.getInventory()).getLeftSide().getHolder())) { + player.sendMessage("§cProtected DInventory Close: " + getCode(((DoubleChestInventory)event.getInventory()).getLeftSide().getHolder().toString())); + } else if (Utils.getProtectedInventoryHolder().get((Player)event.getPlayer()).equals(event.getInventory().getHolder())) { + player.sendMessage("§cProtected Inventory Close: " + getCode(event.getInventory().getHolder().toString())); + } + */ + Utils.getProtectedInventoryHolder().remove((Player)event.getPlayer()); + } + } + + /* + private boolean isProtectedInventoryHolder(HumanEntity humanEntity, Inventory inventory) { + return + humanEntity != null && + humanEntity instanceof Player && + Utils.getProtectedInventoryHolder().containsKey((Player)humanEntity) && + inventory != null && + ( + (inventory instanceof DoubleChestInventory && Utils.getProtectedInventoryHolder().get((Player)humanEntity).equals(((DoubleChestInventory)inventory).getLeftSide().getHolder())) || + (Utils.getProtectedInventoryHolder().get((Player)humanEntity).equals(inventory.getHolder())) + ); + } + + private String getCode(String text) { + return text.substring(text.lastIndexOf("@") + 1); + } + */ + // Protect block from interfere block @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onAttemptPlaceInterfereBlocks(BlockPlaceEvent event){ diff --git a/src/me/crafter/mc/lockettepro/Config.java b/src/me/crafter/mc/lockettepro/Config.java index a85c62f..7615620 100644 --- a/src/me/crafter/mc/lockettepro/Config.java +++ b/src/me/crafter/mc/lockettepro/Config.java @@ -24,6 +24,7 @@ public class Config { private static Set privatestrings = new HashSet(); private static Set additionalstrings = new HashSet(); private static Set everyonestrings = new HashSet(); + private static Set exhibitstrings = new HashSet(); private static Set timerstrings = new HashSet(); private static String defaultprivatestring = "[Private]"; private static String defaultadditionalstring = "[More Users]"; @@ -76,11 +77,13 @@ public static void reload(){ List privatestringlist = config.getStringList("private-signs"); List additionalstringlist = config.getStringList("additional-signs"); List everyonestringlist = config.getStringList("everyone-signs"); + List exhibitstringlist = config.getStringList("exhibit-signs"); List protectionexemptstringlist = config.getStringList("protection-exempt"); List disableworldsstringlist = config.getStringList("disable-worlds"); privatestrings = new HashSet(privatestringlist); additionalstrings = new HashSet(additionalstringlist); everyonestrings = new HashSet(everyonestringlist); + exhibitstrings = new HashSet(exhibitstringlist); protectionexempt = new HashSet(protectionexemptstringlist); disableWorlds = new HashSet(disableworldsstringlist); defaultprivatestring = privatestringlist.get(0); @@ -180,6 +183,8 @@ public static void initDefaultConfig(){ config.addDefault("additional-signs", additional_signs); String[] everyone_signs = {"[Everyone]", "[everyone]"}; config.addDefault("everyone-signs", everyone_signs); + String[] exhibit_signs = {"[Exhibit]", "[exhibit]"}; + config.addDefault("exhibit-signs", exhibit_signs); String[] timer_signs = {"[Timer:@]", "[timer:@]"}; config.addDefault("timer-signs", timer_signs); String[] lockables = {"CHEST","TRAPPED_CHEST","FURNACE","BURNING_FURNACE","HOPPER","BREWING_STAND","DIAMOND_BLOCK", @@ -246,6 +251,10 @@ public static boolean isEveryoneSignString(String message){ return everyonestrings.contains(message); } + public static boolean isExhibitSignString(String message){ + return exhibitstrings.contains(message); + } + public static boolean isTimerSignString(String message){ for (String timerstring : timerstrings){ String[] splitted = timerstring.split("@", 2); @@ -282,6 +291,10 @@ public static int getCacheTimeMillis(){ return cachetime; } + public static Set getExhibitTags(){ + return exhibitstrings; + } + public static boolean isCacheEnabled(){ return cacheenabled; } diff --git a/src/me/crafter/mc/lockettepro/LocketteProAPI.java b/src/me/crafter/mc/lockettepro/LocketteProAPI.java index 04d75f1..1ef64de 100644 --- a/src/me/crafter/mc/lockettepro/LocketteProAPI.java +++ b/src/me/crafter/mc/lockettepro/LocketteProAPI.java @@ -1,5 +1,7 @@ package me.crafter.mc.lockettepro; +import java.util.Set; + import org.bukkit.Effect; import org.bukkit.Material; import org.bukkit.block.Block; @@ -153,6 +155,27 @@ public static boolean isUser(Block block, Player player){ return false; } + public static boolean isExhibit(Block block){ + switch (block.getType()){ + // Chests (Second block only) + case CHEST: + case TRAPPED_CHEST: + // Check second chest sign + for (BlockFace chestface : newsfaces){ + Block relativechest = block.getRelative(chestface); + if (relativechest.getType() == block.getType()){ + if (isTagSingleBlock(relativechest, chestface.getOppositeFace(), Config.getExhibitTags())) return true; + } + } + // Don't break here + // Everything else (First block of container check goes here) + default: + if (isTagSingleBlock(block, null, Config.getExhibitTags())) return true; + break; + } + return false; + } + public static boolean isProtected(Block block){ return (isLockSign(block) || isLocked(block) || isUpDownLockedDoor(block)); } @@ -199,6 +222,19 @@ public static boolean isUserSingleBlock(Block block, BlockFace exempt, Player pl return false; } + public static boolean isTagSingleBlock(Block block, BlockFace exempt, Set tags){ // Requires isLocked + for (BlockFace blockface : newsfaces){ + if (blockface == exempt) continue; + Block relativeblock = block.getRelative(blockface); + if (isLockSignOrAdditionalSign(relativeblock) && (((org.bukkit.material.Sign)relativeblock.getState().getData()).getFacing() == blockface)){ + if (isTagOnSign(relativeblock, tags)){ + return true; + } + } + } + return false; + } + public static boolean isOwnerOfSign(Block block, Player player){ // Requires isSign Block protectedblock = getAttachedBlock(block); // Normal situation, that block is just locked by an adjacent sign @@ -408,6 +444,16 @@ public static boolean isUserOnSign(Block block, Player player){ // Requires (isL return false; } + public static boolean isTagOnSign(Block block, Set tags){ + String[] lines = ((Sign)block.getState()).getLines(); + for (int i = 1; i < 4; i ++){ + if (tags.contains(lines[i])) { + return true; + } + } + return false; + } + public static boolean isSignExpired(Block block){ if (!isSign(block) || !isLockSign(block)) return false; return isLineExpired(((Sign)block.getState()).getLine(0)); diff --git a/src/me/crafter/mc/lockettepro/Utils.java b/src/me/crafter/mc/lockettepro/Utils.java index 672c505..c68d12a 100644 --- a/src/me/crafter/mc/lockettepro/Utils.java +++ b/src/me/crafter/mc/lockettepro/Utils.java @@ -19,6 +19,7 @@ import org.bukkit.block.Sign; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.inventory.InventoryHolder; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.MetadataValue; @@ -32,6 +33,7 @@ public class Utils { private static Map selectedsign = new HashMap(); private static Set notified = new HashSet(); + private static Map protectedinventoryholder = new HashMap(); // Helper functions @SuppressWarnings("deprecation") @@ -325,4 +327,8 @@ public static String getSignLineFromUnknown(String json){ return json; } + public static Map getProtectedInventoryHolder(){ + return protectedinventoryholder; + } + }