diff --git a/pom.xml b/pom.xml
index e4835fd..ff0ad00 100644
--- a/pom.xml
+++ b/pom.xml
@@ -89,7 +89,7 @@
http://maven.sk89q.com/repo/
-
+
jitpack.io
https://jitpack.io
@@ -233,6 +233,12 @@
3.11
provided
+
+ com.github.TownyAdvanced
+ Towny
+ 0.96.3.0
+ provided
+
org.bstats
bstats-bukkit
diff --git a/resources/config/v12/de/config.yml b/resources/config/v12/de/config.yml
index 1817390..518461f 100644
--- a/resources/config/v12/de/config.yml
+++ b/resources/config/v12/de/config.yml
@@ -426,9 +426,14 @@ recipes:
useWorldGuard: true
useLWC: true
useGriefPrevention: true
+useTowny: true
useGMInventories: true
useCitadel: true
+# Beim öffnen eine virtuelle Kiste nutzen um Rechte bei alle anderen Plugins abzufragen
+# Könnte Anti-Cheat plugins verwirren aber sonst ok zu aktivieren
+useVirtualChestPerms: false
+
# Änderungen an Fassinventaren mit LogBlock aufzeichen [true]
useLogBlock: true
diff --git a/resources/config/v12/en/config.yml b/resources/config/v12/en/config.yml
index 9171cda..493e236 100644
--- a/resources/config/v12/en/config.yml
+++ b/resources/config/v12/en/config.yml
@@ -428,9 +428,14 @@ recipes:
useWorldGuard: true
useLWC: true
useGriefPrevention: true
+useTowny: true
useGMInventories: true
useCitadel: true
+# Use a virtual chest when opening a Barrel to check with all other protection plugins
+# This could confuse Anti-Cheat plugins, but is otherwise good to use
+useVirtualChestPerms: false
+
# Enable the Logging of Barrel Inventories to LogBlock [true]
useLogBlock: true
diff --git a/resources/config/v12/fr/config.yml b/resources/config/v12/fr/config.yml
index 1c12c29..a0a6000 100644
--- a/resources/config/v12/fr/config.yml
+++ b/resources/config/v12/fr/config.yml
@@ -423,9 +423,14 @@ recipes:
useWorldGuard: true
useLWC: true
useGriefPrevention: true
+useTowny: true
useGMInventories: true
useCitadel: true
+# Use a virtual chest when opening a Barrel to check with all other protection plugins
+# This could confuse Anti-Cheat plugins, but is otherwise good to use
+useVirtualChestPerms: false
+
# Activer l'historique du contenu des tonneaux avec LogBlock [true]
useLogBlock: true
diff --git a/resources/config/v12/it/config.yml b/resources/config/v12/it/config.yml
index 78496c4..7923227 100644
--- a/resources/config/v12/it/config.yml
+++ b/resources/config/v12/it/config.yml
@@ -415,9 +415,14 @@ recipes:
useWorldGuard: true
useLWC: true
useGriefPrevention: true
+useTowny: true
useGMInventories: true
useCitadel: true
+# Use a virtual chest when opening a Barrel to check with all other protection plugins
+# This could confuse Anti-Cheat plugins, but is otherwise good to use
+useVirtualChestPerms: false
+
# Abilita il logging degli inventari dei barili [true]
useLogBlock: true
diff --git a/resources/config/v13/de/config.yml b/resources/config/v13/de/config.yml
index 3c179e2..96f7d0c 100644
--- a/resources/config/v13/de/config.yml
+++ b/resources/config/v13/de/config.yml
@@ -786,8 +786,14 @@ recipes:
useWorldGuard: true
useLWC: true
useGriefPrevention: true
+useTowny: true
useGMInventories: true
+# Beim Fass öffnen eine virtuelle Kiste nutzen um Rechte bei alle anderen Plugins abzufragen
+# Könnte Anti-Cheat plugins verwirren aber sonst ok zu aktivieren
+useVirtualChestPerms: false
+
+
# Änderungen an Fassinventaren mit LogBlock aufzeichen [true]
useLogBlock: true
diff --git a/resources/config/v13/en/config.yml b/resources/config/v13/en/config.yml
index 79df4da..15c5bcd 100644
--- a/resources/config/v13/en/config.yml
+++ b/resources/config/v13/en/config.yml
@@ -780,8 +780,13 @@ recipes:
useWorldGuard: true
useLWC: true
useGriefPrevention: true
+useTowny: true
useGMInventories: true
+# Use a virtual chest when opening a Barrel to check with all other protection plugins
+# This could confuse Anti-Cheat plugins, but is otherwise good to use
+useVirtualChestPerms: false
+
# Enable the Logging of Barrel Inventories to LogBlock [true]
useLogBlock: true
diff --git a/resources/config/v13/es/config.yml b/resources/config/v13/es/config.yml
index 9f5b0d8..fa8e30d 100644
--- a/resources/config/v13/es/config.yml
+++ b/resources/config/v13/es/config.yml
@@ -780,8 +780,13 @@ recipes:
useWorldGuard: true
useLWC: true
useGriefPrevention: true
+useTowny: true
useGMInventories: true
+# Use a virtual chest when opening a Barrel to check with all other protection plugins
+# This could confuse Anti-Cheat plugins, but is otherwise good to use
+useVirtualChestPerms: false
+
# Enable the Logging of Barrel Inventories to LogBlock [true]
useLogBlock: true
diff --git a/resources/config/v13/fr/config.yml b/resources/config/v13/fr/config.yml
index 413972f..0e1fb9f 100644
--- a/resources/config/v13/fr/config.yml
+++ b/resources/config/v13/fr/config.yml
@@ -786,8 +786,13 @@ recipes:
useWorldGuard: true
useLWC: true
useGriefPrevention: true
+useTowny: true
useGMInventories: true
+# Use a virtual chest when opening a Barrel to check with all other protection plugins
+# This could confuse Anti-Cheat plugins, but is otherwise good to use
+useVirtualChestPerms: false
+
# Activer l'historique du contenu des tonneaux avec LogBlock [true]
useLogBlock: true
diff --git a/resources/config/v13/it/config.yml b/resources/config/v13/it/config.yml
index 91666ec..c02f374 100644
--- a/resources/config/v13/it/config.yml
+++ b/resources/config/v13/it/config.yml
@@ -780,8 +780,13 @@ eggnog:
useWorldGuard: true
useLWC: true
useGriefPrevention: true
+useTowny: true
useGMInventories: true
+# Use a virtual chest when opening a Barrel to check with all other protection plugins
+# This could confuse Anti-Cheat plugins, but is otherwise good to use
+useVirtualChestPerms: false
+
# Abilita il logging degli inventari dei barili [true]
useLogBlock: true
diff --git a/resources/config/v13/zh/config.yml b/resources/config/v13/zh/config.yml
index 9ebfdec..0626f22 100644
--- a/resources/config/v13/zh/config.yml
+++ b/resources/config/v13/zh/config.yml
@@ -784,8 +784,13 @@ recipes:
useWorldGuard: true
useLWC: true
useGriefPrevention: true
+useTowny: true
useGMInventories: true
+# Use a virtual chest when opening a Barrel to check with all other protection plugins
+# This could confuse Anti-Cheat plugins, but is otherwise good to use
+useVirtualChestPerms: false
+
# 对LogBlock启用方块数据录入[true]
useLogBlock: true
diff --git a/resources/plugin.yml b/resources/plugin.yml
index 6c01b34..ab99610 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]
+softdepend: [LWC, LogBlock, WorldGuard, GriefPrevention, Vault, ChestShop, Towny]
authors: [Milan Albrecht, Frank Baumann, ProgrammerDan, Daniel Saukel]
api-version: 1.13
commands:
diff --git a/src/com/dre/brewery/BDistiller.java b/src/com/dre/brewery/BDistiller.java
index 6eb20b3..37ea858 100644
--- a/src/com/dre/brewery/BDistiller.java
+++ b/src/com/dre/brewery/BDistiller.java
@@ -176,7 +176,9 @@ public class BDistiller {
if (now instanceof BrewingStand) {
BrewingStand stand = (BrewingStand) now;
if (brewTime == -1) { // only check at the beginning (and end) for distillables
- prepareForDistillables(stand);
+ if (!prepareForDistillables(stand)) {
+ return;
+ }
}
brewTime--; // count down.
@@ -204,7 +206,7 @@ public class BDistiller {
}
}
- private void prepareForDistillables(BrewingStand stand) {
+ private boolean prepareForDistillables(BrewingStand stand) {
BrewerInventory inventory = stand.getInventory();
if (contents == null) {
contents = getDistillContents(inventory);
@@ -234,13 +236,14 @@ public class BDistiller {
trackedDistillers.remove(standBlock);
showAlc(inventory, contents);
P.p.debugLog("nothing to distill");
- return;
+ return false;
default:
runTime = getLongestDistillTime(contents);
brewTime = runTime;
P.p.debugLog("using brewtime: " + runTime);
}
+ return true;
}
}
}
diff --git a/src/com/dre/brewery/Barrel.java b/src/com/dre/brewery/Barrel.java
index 0cc0c01..0ba060b 100644
--- a/src/com/dre/brewery/Barrel.java
+++ b/src/com/dre/brewery/Barrel.java
@@ -124,7 +124,7 @@ public class Barrel implements InventoryHolder {
}
// Call event
- BarrelAccessEvent accessEvent = new BarrelAccessEvent(this, player, event.getClickedBlock());
+ BarrelAccessEvent accessEvent = new BarrelAccessEvent(this, player, event.getClickedBlock(), event.getBlockFace());
// Listened to by WGBarrel7, WGBarrelNew, WGBarrelOld, GriefPreventionBarrel (IntegrationListener)
P.p.getServer().getPluginManager().callEvent(accessEvent);
if (accessEvent.isCancelled()) {
diff --git a/src/com/dre/brewery/api/events/barrel/BarrelAccessEvent.java b/src/com/dre/brewery/api/events/barrel/BarrelAccessEvent.java
index b3c853d..2ac4c95 100644
--- a/src/com/dre/brewery/api/events/barrel/BarrelAccessEvent.java
+++ b/src/com/dre/brewery/api/events/barrel/BarrelAccessEvent.java
@@ -2,6 +2,7 @@ package com.dre.brewery.api.events.barrel;
import com.dre.brewery.Barrel;
import org.bukkit.block.Block;
+import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
@@ -16,12 +17,18 @@ public class BarrelAccessEvent extends BarrelEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private final Player player;
private final Block clickedBlock;
+ private final BlockFace clickedBlockFace;
private boolean isCancelled;
public BarrelAccessEvent(Barrel barrel, Player player, Block clickedBlock) {
+ this(barrel, player, clickedBlock, BlockFace.UP);
+ }
+
+ public BarrelAccessEvent(Barrel barrel, Player player, Block clickedBlock, BlockFace clickedBlockFace) {
super(barrel);
this.player = player;
this.clickedBlock = clickedBlock;
+ this.clickedBlockFace = clickedBlockFace;
}
/**
@@ -32,6 +39,13 @@ public class BarrelAccessEvent extends BarrelEvent implements Cancellable {
return clickedBlock;
}
+ /**
+ * Get the clicked Block Face when clicking on the Barrel Block
+ */
+ public BlockFace getClickedBlockFace() {
+ return clickedBlockFace;
+ }
+
@Override
public boolean isCancelled() {
return isCancelled;
diff --git a/src/com/dre/brewery/filedata/BConfig.java b/src/com/dre/brewery/filedata/BConfig.java
index 022a6e4..2cb75e8 100644
--- a/src/com/dre/brewery/filedata/BConfig.java
+++ b/src/com/dre/brewery/filedata/BConfig.java
@@ -49,6 +49,7 @@ public class BConfig {
public static boolean useLWC; //LWC
public static boolean useLB; //LogBlock
public static boolean useGP; //GriefPrevention
+ public static boolean useTowny; //Towny
public static boolean hasVault; // Vault
public static boolean useCitadel; // CivCraft/DevotedMC Citadel
public static boolean useGMInventories; // GamemodeInventories
@@ -59,6 +60,7 @@ public class BConfig {
// Barrel
public static boolean openEverywhere;
public static boolean loadDataAsync;
+ public static boolean virtualChestPerms;
// Cauldron
public static boolean useOffhandForCauldron;
@@ -212,10 +214,12 @@ public class BConfig {
}
}
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");
+ virtualChestPerms = config.getBoolean("useVirtualChestPerms", false);
// The item util has been removed in Vault 1.7+
hasVault = plMan.isPluginEnabled("Vault")
&& Integer.parseInt(plMan.getPlugin("Vault").getDescription().getVersion().split("\\.")[1]) <= 6;
diff --git a/src/com/dre/brewery/integration/IntegrationListener.java b/src/com/dre/brewery/integration/IntegrationListener.java
index de7e320..83c2347 100644
--- a/src/com/dre/brewery/integration/IntegrationListener.java
+++ b/src/com/dre/brewery/integration/IntegrationListener.java
@@ -9,6 +9,7 @@ import com.dre.brewery.filedata.BConfig;
import com.dre.brewery.integration.barrel.GriefPreventionBarrel;
import com.dre.brewery.integration.barrel.LWCBarrel;
import com.dre.brewery.integration.barrel.LogBlockBarrel;
+import com.dre.brewery.integration.barrel.TownyBarrel;
import com.dre.brewery.integration.item.MMOItemsPluginItem;
import com.dre.brewery.recipe.BCauldronRecipe;
import com.dre.brewery.recipe.RecipeItem;
@@ -17,7 +18,9 @@ import net.mmogroup.mmolib.api.item.NBTItem;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.block.Block;
+import org.bukkit.block.BlockState;
import org.bukkit.entity.Player;
+import org.bukkit.event.Event;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@@ -106,6 +109,7 @@ public class IntegrationListener implements Listener {
} else {
P.p.msg(player, "&cError opening Barrel, please report to an Admin!");
}
+ return;
}
}
}
@@ -124,6 +128,7 @@ public class IntegrationListener implements Listener {
if (!LWCBarrel.checkAccess(player, sign, plugin)) {
P.p.msg(event.getPlayer(), P.p.languageReader.get("Error_NoBarrelAccess"));
event.setCancelled(true);
+ return;
}
} catch (Throwable e) {
event.setCancelled(true);
@@ -137,11 +142,75 @@ public class IntegrationListener implements Listener {
} else {
P.p.msg(player, "&cError opening Barrel, please report to an Admin!");
}
+ return;
}
}
}
}
}
+
+ if (BConfig.useTowny) {
+ if (P.p.getServer().getPluginManager().isPluginEnabled("Towny")) {
+ try {
+ if (!TownyBarrel.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 Towny for Barrel Open Permissions!");
+ P.p.errorLog("Brewery was tested with Towny v0.96.3.0");
+ P.p.errorLog("Disable the Towny 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, "&cTowny check Error, Brewery was tested with up to v0.96.3.0 of Towny");
+ P.p.msg(player, "&cSet &7useTowny: 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();
+
+ event.getClickedBlock().setType(Material.CHEST, false);
+ PlayerInteractEvent simulatedEvent = new PlayerInteractEvent(
+ player,
+ Action.RIGHT_CLICK_BLOCK,
+ player.getInventory().getItemInMainHand(),
+ event.getClickedBlock(),
+ event.getClickedBlockFace(),
+ EquipmentSlot.HAND);
+
+ try {
+ P.p.getServer().getPluginManager().callEvent(simulatedEvent);
+ } catch (Throwable e) {
+ P.p.errorLog("Failed to simulate a Chest for Barrel Open Permissions!");
+ P.p.errorLog("Disable useVirtualChestPerms in the config and do /brew reload");
+ e.printStackTrace();
+ if (player.hasPermission("brewery.admin") || player.hasPermission("brewery.mod")) {
+ P.p.msg(player, "&cVirtual Chest Error");
+ P.p.msg(player, "&cSet &7useVirtualChestPerms: false &cin the config and /brew reload");
+ } else {
+ P.p.msg(player, "&cError opening Barrel, please report to an Admin!");
+ }
+ } finally {
+ event.getClickedBlock().setType(Material.AIR, false);
+ originalBlockState.update(true);
+ }
+
+ if (simulatedEvent.useInteractedBlock() == Event.Result.DENY) {
+ event.setCancelled(true);
+ P.p.msg(event.getPlayer(), P.p.languageReader.get("Error_NoBarrelAccess"));
+ //return;
+ }
+ }
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOW)
diff --git a/src/com/dre/brewery/integration/barrel/TownyBarrel.java b/src/com/dre/brewery/integration/barrel/TownyBarrel.java
new file mode 100644
index 0000000..d5adb4e
--- /dev/null
+++ b/src/com/dre/brewery/integration/barrel/TownyBarrel.java
@@ -0,0 +1,23 @@
+package com.dre.brewery.integration.barrel;
+
+import com.dre.brewery.P;
+import com.dre.brewery.api.events.barrel.BarrelAccessEvent;
+
+import com.palmergames.bukkit.towny.TownySettings;
+import com.palmergames.bukkit.towny.object.TownyPermission;
+import com.palmergames.bukkit.towny.utils.PlayerCacheUtil;
+import org.bukkit.Material;
+
+public class TownyBarrel {
+ public static boolean checkAccess(BarrelAccessEvent event) {
+ if (!TownySettings.isSwitchMaterial("BREWERY") && !TownySettings.isSwitchMaterial("BARREL")) {
+ if (P.use1_14) {
+ return true;
+ } else if (!TownySettings.isSwitchMaterial("CHEST")) {
+ return true;
+ }
+ }
+ Material mat = P.use1_14 ? Material.BARREL : Material.CHEST;
+ return PlayerCacheUtil.getCachePermission(event.getPlayer(), event.getSpigot().getLocation(), mat, TownyPermission.ActionType.SWITCH);
+ }
+}