From 0b9b364f28634a8dff7bb66eb8c3675d747b2eec Mon Sep 17 00:00:00 2001 From: Sn0wStorm Date: Thu, 26 Nov 2020 23:42:19 +0100 Subject: [PATCH] Added BlockLocker plugin support --- pom.xml | 5 + resources/plugin.yml | 2 +- src/com/dre/brewery/P.java | 2 + src/com/dre/brewery/filedata/BConfig.java | 49 ++++++---- .../integration/IntegrationListener.java | 32 ++++++- .../integration/barrel/BlocklockerBarrel.java | 91 +++++++++++++++++++ .../dre/brewery/listeners/BlockListener.java | 19 +++- 7 files changed, 177 insertions(+), 23 deletions(-) create mode 100644 src/com/dre/brewery/integration/barrel/BlocklockerBarrel.java diff --git a/pom.xml b/pom.xml index b9fbcef..6767bd8 100644 --- a/pom.xml +++ b/pom.xml @@ -251,6 +251,11 @@ 2.12.0 provided + + com.github.rutgerkok + BlockLocker + eb78e99e72 + org.bstats bstats-bukkit diff --git a/resources/plugin.yml b/resources/plugin.yml index 3dc016a..1066c5f 100644 --- a/resources/plugin.yml +++ b/resources/plugin.yml @@ -1,7 +1,7 @@ name: Brewery version: 2.1.2 main: com.dre.brewery.P -softdepend: [LWC, LogBlock, WorldGuard, GriefPrevention, Vault, ChestShop, Shopkeepers, Towny] +softdepend: [LWC, LogBlock, WorldGuard, GriefPrevention, Vault, ChestShop, Shopkeepers, Towny, BlockLocker] authors: [Milan Albrecht, Frank Baumann, ProgrammerDan, Daniel Saukel] api-version: 1.13 commands: diff --git a/src/com/dre/brewery/P.java b/src/com/dre/brewery/P.java index f9da3f8..715864a 100644 --- a/src/com/dre/brewery/P.java +++ b/src/com/dre/brewery/P.java @@ -8,6 +8,7 @@ import com.dre.brewery.filedata.UpdateChecker; import com.dre.brewery.integration.ChestShopListener; import com.dre.brewery.integration.IntegrationListener; import com.dre.brewery.integration.ShopKeepersListener; +import com.dre.brewery.integration.barrel.BlocklockerBarrel; import com.dre.brewery.integration.barrel.LogBlockBarrel; import com.dre.brewery.listeners.*; import com.dre.brewery.recipe.*; @@ -507,6 +508,7 @@ public class P extends JavaPlugin { Barrel.onUpdate();// runs every min to check and update ageing time long t3 = System.nanoTime(); if (use1_14) MCBarrel.onUpdate(); + if (BConfig.useBlocklocker) BlocklockerBarrel.clearBarrelSign(); long t4 = System.nanoTime(); BPlayer.onUpdate();// updates players drunkeness diff --git a/src/com/dre/brewery/filedata/BConfig.java b/src/com/dre/brewery/filedata/BConfig.java index a49bdea..d03e28c 100644 --- a/src/com/dre/brewery/filedata/BConfig.java +++ b/src/com/dre/brewery/filedata/BConfig.java @@ -6,6 +6,7 @@ import com.dre.brewery.DistortChat; import com.dre.brewery.MCBarrel; import com.dre.brewery.P; import com.dre.brewery.api.events.ConfigLoadEvent; +import com.dre.brewery.integration.barrel.BlocklockerBarrel; import com.dre.brewery.integration.barrel.WGBarrel; import com.dre.brewery.integration.barrel.WGBarrel5; import com.dre.brewery.integration.barrel.WGBarrel6; @@ -50,6 +51,7 @@ public class BConfig { public static boolean useLB; //LogBlock public static boolean useGP; //GriefPrevention public static boolean useTowny; //Towny + public static boolean useBlocklocker; //LockBlocker public static boolean hasVault; // Vault public static boolean useCitadel; // CivCraft/DevotedMC Citadel public static boolean useGMInventories; // GamemodeInventories @@ -199,31 +201,13 @@ public class BConfig { // Third-Party useWG = config.getBoolean("useWorldGuard", true) && plMan.isPluginEnabled("WorldGuard"); - - if (useWG) { - Plugin plugin = Bukkit.getPluginManager().getPlugin("WorldEdit"); - if (plugin != null) { - String wgv = plugin.getDescription().getVersion(); - if (wgv.startsWith("6.")) { - wg = new WGBarrel6(); - } else if (wgv.startsWith("5.")) { - wg = new WGBarrel5(); - } else { - wg = new WGBarrel7(); - } - } - if (wg == null) { - P.p.errorLog("Failed loading WorldGuard Integration! Opening Barrels will NOT work!"); - P.p.errorLog("Brewery was tested with version 5.8, 6.1 and 7.0 of WorldGuard!"); - P.p.errorLog("Disable the WorldGuard support in the config and do /brew reload"); - } - } useLWC = config.getBoolean("useLWC", true) && plMan.isPluginEnabled("LWC"); useTowny = config.getBoolean("useTowny", true) && plMan.isPluginEnabled("Towny"); useGP = config.getBoolean("useGriefPrevention", true) && plMan.isPluginEnabled("GriefPrevention"); useLB = config.getBoolean("useLogBlock", false) && plMan.isPluginEnabled("LogBlock"); useGMInventories = config.getBoolean("useGMInventories", false); useCitadel = config.getBoolean("useCitadel", false) && plMan.isPluginEnabled("Citadel"); + useBlocklocker = config.getBoolean("useBlockLocker", false) && plMan.isPluginEnabled("BlockLocker"); virtualChestPerms = config.getBoolean("useVirtualChestPerms", false); // The item util has been removed in Vault 1.7+ hasVault = plMan.isPluginEnabled("Vault") @@ -376,6 +360,33 @@ public class BConfig { } } + if (useWG) { + Plugin plugin = Bukkit.getPluginManager().getPlugin("WorldEdit"); + if (plugin != null) { + String wgv = plugin.getDescription().getVersion(); + if (wgv.startsWith("6.")) { + wg = new WGBarrel6(); + } else if (wgv.startsWith("5.")) { + wg = new WGBarrel5(); + } else { + wg = new WGBarrel7(); + } + } + if (wg == null) { + P.p.errorLog("Failed loading WorldGuard Integration! Opening Barrels will NOT work!"); + P.p.errorLog("Brewery was tested with version 5.8, 6.1 and 7.0 of WorldGuard!"); + P.p.errorLog("Disable the WorldGuard support in the config and do /brew reload"); + } + } + if (useBlocklocker) { + try { + Class.forName("nl.rutgerkok.blocklocker.BlockLockerAPIv2"); + BlocklockerBarrel.registerBarrelAsProtectable(); + } catch (ClassNotFoundException e) { + useBlocklocker = false; + } + } + // init SQL if (sqlSync != null) { try { diff --git a/src/com/dre/brewery/integration/IntegrationListener.java b/src/com/dre/brewery/integration/IntegrationListener.java index 83c2347..6b6761c 100644 --- a/src/com/dre/brewery/integration/IntegrationListener.java +++ b/src/com/dre/brewery/integration/IntegrationListener.java @@ -6,6 +6,7 @@ import com.dre.brewery.api.events.barrel.BarrelAccessEvent; import com.dre.brewery.api.events.barrel.BarrelDestroyEvent; import com.dre.brewery.api.events.barrel.BarrelRemoveEvent; import com.dre.brewery.filedata.BConfig; +import com.dre.brewery.integration.barrel.BlocklockerBarrel; import com.dre.brewery.integration.barrel.GriefPreventionBarrel; import com.dre.brewery.integration.barrel.LWCBarrel; import com.dre.brewery.integration.barrel.LogBlockBarrel; @@ -175,6 +176,32 @@ public class IntegrationListener implements Listener { } } + if (BConfig.useBlocklocker) { + if (P.p.getServer().getPluginManager().isPluginEnabled("BlockLocker")) { + try { + if (!BlocklockerBarrel.checkAccess(event)) { + P.p.msg(event.getPlayer(), P.p.languageReader.get("Error_NoBarrelAccess")); + event.setCancelled(true); + return; + } + } catch (Throwable e) { + event.setCancelled(true); + P.p.errorLog("Failed to Check BlockLocker for Barrel Open Permissions!"); + P.p.errorLog("Brewery was tested with BlockLocker v1.8.2"); + P.p.errorLog("Disable the BlockLocker support in the config and do /brew reload"); + e.printStackTrace(); + Player player = event.getPlayer(); + if (player.hasPermission("brewery.admin") || player.hasPermission("brewery.mod")) { + P.p.msg(player, "&cBlockLocker check Error, Brewery was tested with v1.8.2 of BlockLocker"); + P.p.msg(player, "&cSet &7useBlockLocker: false &cin the config and /brew reload"); + } else { + P.p.msg(player, "&cError opening Barrel, please report to an Admin!"); + } + return; + } + } + } + if (BConfig.virtualChestPerms) { Player player = event.getPlayer(); BlockState originalBlockState = event.getClickedBlock().getState(); @@ -218,8 +245,10 @@ public class IntegrationListener implements Listener { if (!BConfig.useLWC) return; if (event.hasPlayer()) { + Player player = event.getPlayerOptional(); + assert player != null; try { - if (LWCBarrel.denyDestroy(event.getPlayerOptional(), event.getBarrel())) { + if (LWCBarrel.denyDestroy(player, event.getBarrel())) { event.setCancelled(true); } } catch (Throwable e) { @@ -228,7 +257,6 @@ public class IntegrationListener implements Listener { P.p.errorLog("Brewery was tested with version 4.5.0 of LWC!"); P.p.errorLog("Disable the LWC support in the config and do /brew reload"); e.printStackTrace(); - Player player = event.getPlayerOptional(); if (player.hasPermission("brewery.admin") || player.hasPermission("brewery.mod")) { P.p.msg(player, "&cLWC check Error, Brewery was tested with up to v4.5.0 of LWC"); P.p.msg(player, "&cSet &7useLWC: false &cin the config and /brew reload"); diff --git a/src/com/dre/brewery/integration/barrel/BlocklockerBarrel.java b/src/com/dre/brewery/integration/barrel/BlocklockerBarrel.java new file mode 100644 index 0000000..d496a99 --- /dev/null +++ b/src/com/dre/brewery/integration/barrel/BlocklockerBarrel.java @@ -0,0 +1,91 @@ +package com.dre.brewery.integration.barrel; + +import com.dre.brewery.Barrel; +import com.dre.brewery.BarrelBody; +import com.dre.brewery.P; +import com.dre.brewery.api.events.barrel.BarrelAccessEvent; +import com.dre.brewery.filedata.BConfig; +import com.dre.brewery.utility.LegacyUtil; +import nl.rutgerkok.blocklocker.BlockLockerAPIv2; +import nl.rutgerkok.blocklocker.ProtectableBlocksSettings; +import nl.rutgerkok.blocklocker.ProtectionType; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; + +import java.util.List; + +public class BlocklockerBarrel implements ProtectableBlocksSettings { + private static Block lastBarrelSign; + + @Override + public boolean canProtect(Block block) { + return isOrWillCreateBarrel(block); + } + + @Override + public boolean canProtect(ProtectionType protectionType, Block block) { + if (protectionType != ProtectionType.CONTAINER) return false; + + return isOrWillCreateBarrel(block); + } + + public boolean isOrWillCreateBarrel(Block block) { + if (!P.p.isEnabled() || !BConfig.useBlocklocker) { + return false; + } + if (!LegacyUtil.isWoodPlanks(block.getType()) && !LegacyUtil.isWoodStairs(block.getType())) { + // Can only be a barrel if it's a planks block + return false; + } + if (Barrel.getByWood(block) != null) { + // Barrel already exists + return true; + } + if (lastBarrelSign == null) { + // No player wants to create a Barrel + return false; + } + for (BlockFace face : new BlockFace[] {BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST}) { + Block sign = block.getRelative(face); + if (lastBarrelSign.equals(sign)) { + Block spigot = BarrelBody.getSpigotOfSign(sign); + byte signoffset = 0; + if (!spigot.equals(sign)) { + signoffset = (byte) (sign.getY() - spigot.getY()); + } + Barrel barrel = new Barrel(spigot, signoffset); + + return barrel.getBody().getBrokenBlock(true) == null; + } + } + return false; + } + + public static boolean checkAccess(BarrelAccessEvent event) { + Block sign = event.getBarrel().getBody().getSignOfSpigot(); + if (!LegacyUtil.isSign(sign.getType())) { + return true; + } + return BlockLockerAPIv2.isAllowed(event.getPlayer(), sign, true); + } + + public static void createdBarrelSign(Block sign) { + // The Player created a sign with "Barrel" on it, he want's to create a barrel + lastBarrelSign = sign; + } + + public static void clearBarrelSign() { + lastBarrelSign = null; + } + + public static void registerBarrelAsProtectable() { + try { + List extraProtectables = BlockLockerAPIv2.getPlugin().getChestSettings().getExtraProtectables(); + if (extraProtectables.stream().noneMatch(blockSettings -> blockSettings instanceof BlocklockerBarrel)) { + extraProtectables.add(new BlocklockerBarrel()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/com/dre/brewery/listeners/BlockListener.java b/src/com/dre/brewery/listeners/BlockListener.java index e0c0e27..b254de3 100644 --- a/src/com/dre/brewery/listeners/BlockListener.java +++ b/src/com/dre/brewery/listeners/BlockListener.java @@ -6,7 +6,9 @@ import com.dre.brewery.Barrel; import com.dre.brewery.DistortChat; import com.dre.brewery.P; import com.dre.brewery.api.events.barrel.BarrelDestroyEvent; +import com.dre.brewery.filedata.BConfig; import com.dre.brewery.filedata.BData; +import com.dre.brewery.integration.barrel.BlocklockerBarrel; import com.dre.brewery.utility.BUtil; import org.bukkit.Material; import org.bukkit.block.Block; @@ -22,7 +24,7 @@ public class BlockListener implements Listener { public void onSignChange(SignChangeEvent event) { String[] lines = event.getLines(); - if (lines[0].equalsIgnoreCase("Barrel") || lines[0].equalsIgnoreCase(P.p.languageReader.get("Etc_Barrel"))) { + if (hasBarrelLine(lines)) { Player player = event.getPlayer(); if (!player.hasPermission("brewery.createbarrel.small") && !player.hasPermission("brewery.createbarrel.big")) { P.p.msg(player, P.p.languageReader.get("Perms_NoBarrelCreate")); @@ -38,6 +40,15 @@ public class BlockListener implements Listener { } } + public static boolean hasBarrelLine(String[] lines) { + for (String line : lines) { + if (line.equalsIgnoreCase("Barrel") || line.equalsIgnoreCase(P.p.languageReader.get("Etc_Barrel"))) { + return true; + } + } + return false; + } + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onSignChangeLow(SignChangeEvent event) { if (DistortChat.doSigns) { @@ -45,6 +56,12 @@ public class BlockListener implements Listener { DistortChat.signWrite(event); } } + if (BConfig.useBlocklocker) { + String[] lines = event.getLines(); + if (hasBarrelLine(lines)) { + BlocklockerBarrel.createdBarrelSign(event.getBlock()); + } + } } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)