From 4a7202df6fb33a862f7439ef21ba3fd22bb21484 Mon Sep 17 00:00:00 2001 From: Eric Date: Tue, 28 Mar 2017 14:37:12 +0200 Subject: [PATCH] Added support for PlotSquared Three new custom flags will be available for every plot to set: - create-shop - use-shop - use-admin-shop These flags can be set to the following values to allow the flag to that group. If you set the group to members, trusted members and owners are also allowed the flag: - owners - trusted - members - everyone - none The default value for the flags will be 'none', so be sure to change it in order to create or use shops! The flag 'create-shop' can be bypassed by granting the permission 'shopchest.create.protected' (which is not recommended), and the other flags can be bypassed by granting the permission 'shopchest.external.bypass'. This closes #87 --- pom.xml | 10 +++ .../java/de/epiceric/shopchest/ShopChest.java | 22 +++-- .../de/epiceric/shopchest/config/Config.java | 4 + .../external/PlotSquaredShopFlag.java | 87 +++++++++++++++++++ .../WorldGuardShopFlag.java} | 6 +- .../shopchest/language/LanguageUtils.java | 4 +- .../shopchest/language/LocalizedMessage.java | 4 +- .../listeners/ChestProtectListener.java | 15 ++-- .../listeners/ShopInteractListener.java | 85 ++++++++++++------ .../listeners/WorldGuardListener.java | 6 +- .../epiceric/shopchest/utils/Permissions.java | 2 +- .../de/epiceric/shopchest/utils/Utils.java | 36 ++++++++ src/main/resources/config.yml | 4 + src/main/resources/lang/de_DE.lang | 4 +- src/main/resources/lang/en_US.lang | 10 +-- src/main/resources/plugin.yml | 8 +- 16 files changed, 248 insertions(+), 59 deletions(-) create mode 100644 src/main/java/de/epiceric/shopchest/external/PlotSquaredShopFlag.java rename src/main/java/de/epiceric/shopchest/{worldguard/ShopFlag.java => external/WorldGuardShopFlag.java} (96%) diff --git a/pom.xml b/pom.xml index d9405ab..b3d1ace 100644 --- a/pom.xml +++ b/pom.xml @@ -114,6 +114,10 @@ sk89q-repo http://maven.sk89q.com/artifactory/repo/ + + athion-reop + http://ci.athion.net/job/PlotSquared/ws/mvn/ + @@ -152,6 +156,12 @@ 5.2 provided + + com.plotsquared + plotsquared-api + latest + provided + diff --git a/src/main/java/de/epiceric/shopchest/ShopChest.java b/src/main/java/de/epiceric/shopchest/ShopChest.java index 1fa45cc..2fe8550 100644 --- a/src/main/java/de/epiceric/shopchest/ShopChest.java +++ b/src/main/java/de/epiceric/shopchest/ShopChest.java @@ -1,10 +1,12 @@ package de.epiceric.shopchest; +import com.intellectualcrafters.plot.PS; import com.palmergames.bukkit.towny.Towny; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import de.epiceric.shopchest.config.Config; import de.epiceric.shopchest.config.Regex; import de.epiceric.shopchest.event.ShopReloadEvent; +import de.epiceric.shopchest.external.PlotSquaredShopFlag; import de.epiceric.shopchest.language.LanguageUtils; import de.epiceric.shopchest.language.LocalizedMessage; import de.epiceric.shopchest.listeners.*; @@ -16,7 +18,7 @@ import de.epiceric.shopchest.sql.MySQL; import de.epiceric.shopchest.sql.SQLite; import de.epiceric.shopchest.utils.*; import de.epiceric.shopchest.utils.UpdateChecker.UpdateCheckerResult; -import de.epiceric.shopchest.worldguard.ShopFlag; +import de.epiceric.shopchest.external.WorldGuardShopFlag; import fr.xephi.authme.AuthMe; import net.milkbowl.vault.economy.Economy; import org.bstats.Metrics; @@ -30,7 +32,6 @@ import org.bukkit.scheduler.BukkitRunnable; import java.io.*; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; @@ -100,7 +101,7 @@ public class ShopChest extends JavaPlugin { Plugin worldGuardPlugin = Bukkit.getServer().getPluginManager().getPlugin("WorldGuard"); if (worldGuardPlugin instanceof WorldGuardPlugin) { worldGuard = (WorldGuardPlugin) worldGuardPlugin; - ShopFlag.init(this, true); + WorldGuardShopFlag.register(this, true); } } @@ -138,8 +139,8 @@ public class ShopChest extends JavaPlugin { getLogger().warning("Plugin may still work, but more errors are expected!"); } - if (worldGuard != null && !ShopFlag.isLoaded()) { - ShopFlag.init(this, false); + if (worldGuard != null && !WorldGuardShopFlag.isLoaded()) { + WorldGuardShopFlag.register(this, false); try { // Reload WorldGuard regions, so that custom flags are applied @@ -163,6 +164,10 @@ public class ShopChest extends JavaPlugin { authMe = (AuthMe) authMePlugin; } + if (hasPlotSquared()) { + new PlotSquaredShopFlag().register(this); + } + debug("Loading utils and extras..."); LanguageUtils.load(); @@ -427,6 +432,13 @@ public class ShopChest extends JavaPlugin { this.updater = updater; } + /** + * @return Whether the plugin 'PlotSquared' is enabled + */ + public boolean hasPlotSquared() { + return getServer().getPluginManager().getPlugin("PlotSquared") != null; + } + /** * @return Whether the plugin 'AuthMe' is enabled */ diff --git a/src/main/java/de/epiceric/shopchest/config/Config.java b/src/main/java/de/epiceric/shopchest/config/Config.java index d3a6852..9f61a10 100644 --- a/src/main/java/de/epiceric/shopchest/config/Config.java +++ b/src/main/java/de/epiceric/shopchest/config/Config.java @@ -104,6 +104,9 @@ public class Config { /** Whether AuthMe integration should be enabled **/ public boolean enable_authme_integration; + /** Whether PlotSquared integration should be enabled **/ + public boolean enable_plotsquared_integration; + /** Whether the vendor of the shop should get messages about buys and sells **/ public boolean enable_vendor_messages; @@ -342,6 +345,7 @@ public class Config { enable_worldguard_integration = plugin.getConfig().getBoolean("enable-worldguard-integration"); enable_towny_integration = plugin.getConfig().getBoolean("enable-towny-integration"); enable_authme_integration = plugin.getConfig().getBoolean("enable-authme-integration"); + enable_plotsquared_integration = plugin.getConfig().getBoolean("enable-plotsquared-integration"); enable_vendor_messages = plugin.getConfig().getBoolean("enable-vendor-messages"); explosion_protection = plugin.getConfig().getBoolean("explosion-protection"); only_show_shops_in_sight = plugin.getConfig().getBoolean("only-show-shops-in-sight"); diff --git a/src/main/java/de/epiceric/shopchest/external/PlotSquaredShopFlag.java b/src/main/java/de/epiceric/shopchest/external/PlotSquaredShopFlag.java new file mode 100644 index 0000000..32ea5fd --- /dev/null +++ b/src/main/java/de/epiceric/shopchest/external/PlotSquaredShopFlag.java @@ -0,0 +1,87 @@ +package de.epiceric.shopchest.external; + +import com.intellectualcrafters.plot.flag.Flag; +import com.intellectualcrafters.plot.flag.Flags; +import de.epiceric.shopchest.ShopChest; + +import java.util.Locale; + +public class PlotSquaredShopFlag { + + private static boolean registered = false; + + public enum Group { + OWNERS, MEMBERS, TRUSTED, EVERYONE, NONE + } + + public static Flag CREATE_SHOP; + public static Flag USE_SHOP; + public static Flag USE_ADMIN_SHOP; + + private GroupFlag createShop = new GroupFlag("create-shop"); + private GroupFlag useShop = new GroupFlag("use-shop"); + private GroupFlag useAdminShop = new GroupFlag("use-admin-shop"); + + public void register(ShopChest plugin) { + if (registered) return; + + CREATE_SHOP = createShop; + USE_SHOP = useShop; + USE_ADMIN_SHOP = useAdminShop; + + Flags.registerFlag(createShop); + Flags.registerFlag(useShop); + Flags.registerFlag(useAdminShop); + registered = true; + + plugin.debug("Registered custom PlotSquared flags"); + } + + public class GroupFlag extends Flag { + + public GroupFlag(String name) { + super(name); + } + + @Override + public String valueToString(Object value) { + return String.valueOf(value); + } + + @Override + public Group parseValue(String s) { + String val = s.toLowerCase(Locale.ENGLISH); + + switch (val) { + case "owners": + case "owner": + return Group.OWNERS; + case "members": + case "member": + case "helpers": + case "helper": + return Group.MEMBERS; + case "trusted": + return Group.TRUSTED; + case "everyone": + case "all": + return Group.EVERYONE; + case "deny": + case "false": + case "no": + case "0": + case "none": + case "noone": + return Group.NONE; + } + + return null; + } + + @Override + public String getValueDescription() { + return "Flag value must be a group: 'owner' , 'members', 'trusted', 'everyone' or 'none'"; + } + } + +} diff --git a/src/main/java/de/epiceric/shopchest/worldguard/ShopFlag.java b/src/main/java/de/epiceric/shopchest/external/WorldGuardShopFlag.java similarity index 96% rename from src/main/java/de/epiceric/shopchest/worldguard/ShopFlag.java rename to src/main/java/de/epiceric/shopchest/external/WorldGuardShopFlag.java index d646dde..db92c1d 100644 --- a/src/main/java/de/epiceric/shopchest/worldguard/ShopFlag.java +++ b/src/main/java/de/epiceric/shopchest/external/WorldGuardShopFlag.java @@ -1,4 +1,4 @@ -package de.epiceric.shopchest.worldguard; +package de.epiceric.shopchest.external; import com.google.common.collect.Lists; import com.sk89q.worldguard.protection.flags.DefaultFlag; @@ -9,7 +9,7 @@ import de.epiceric.shopchest.ShopChest; import java.lang.reflect.Field; import java.lang.reflect.Modifier; -public class ShopFlag { +public class WorldGuardShopFlag { private static Flag[] customFlagList; private static boolean loaded = false; @@ -30,7 +30,7 @@ public class ShopFlag { return loaded; } - public static void init(final ShopChest plugin, boolean onLoad) { + public static void register(final ShopChest plugin, boolean onLoad) { String worldGuardVersion = plugin.getWorldGuard().getDescription().getVersion(); int majorVersion = 0; diff --git a/src/main/java/de/epiceric/shopchest/language/LanguageUtils.java b/src/main/java/de/epiceric/shopchest/language/LanguageUtils.java index 9a6f1bb..6c97829 100644 --- a/src/main/java/de/epiceric/shopchest/language/LanguageUtils.java +++ b/src/main/java/de/epiceric/shopchest/language/LanguageUtils.java @@ -978,8 +978,8 @@ public class LanguageUtils { messages.add(new LocalizedMessage(LocalizedMessage.Message.NO_PERMISSION_OPEN_OTHERS, langConfig.getString("message.noPermission.open-others", "&cYou don't have permission to open this chest."))); messages.add(new LocalizedMessage(LocalizedMessage.Message.NO_PERMISSION_BUY, langConfig.getString("message.noPermission.buy", "&cYou don't have permission to buy something."))); messages.add(new LocalizedMessage(LocalizedMessage.Message.NO_PERMISSION_SELL, langConfig.getString("message.noPermission.sell", "&cYou don't have permission to sell something."))); - messages.add(new LocalizedMessage(LocalizedMessage.Message.NO_PERMISSION_WG_BUY, langConfig.getString("message.noPermission.worldguard-buy", "&cYou don't have permission to buy something here."))); - messages.add(new LocalizedMessage(LocalizedMessage.Message.NO_PERMISSION_WG_SELL, langConfig.getString("message.noPermission.worldguard-sell", "&cYou don't have permission to sell something here."))); + messages.add(new LocalizedMessage(LocalizedMessage.Message.NO_PERMISSION_BUY_HERE, langConfig.getString("message.noPermission.buy-here", "&cYou don't have permission to buy something here."))); + messages.add(new LocalizedMessage(LocalizedMessage.Message.NO_PERMISSION_SELL_HERE, langConfig.getString("message.noPermission.sell-here", "&cYou don't have permission to sell something here."))); messages.add(new LocalizedMessage(LocalizedMessage.Message.NO_PERMISSION_REMOVE_OTHERS, langConfig.getString("message.noPermission.remove-others", "&cYou don't have permission to remove this shop."))); messages.add(new LocalizedMessage(LocalizedMessage.Message.NO_PERMISSION_REMOVE_ADMIN, langConfig.getString("message.noPermission.remove-admin", "&cYou don't have permission to remove an admin shop."))); messages.add(new LocalizedMessage(LocalizedMessage.Message.NO_PERMISSION_RELOAD, langConfig.getString("message.noPermission.reload", "&cYou don't have permission to reload the shops."))); diff --git a/src/main/java/de/epiceric/shopchest/language/LocalizedMessage.java b/src/main/java/de/epiceric/shopchest/language/LocalizedMessage.java index c184da9..9270051 100644 --- a/src/main/java/de/epiceric/shopchest/language/LocalizedMessage.java +++ b/src/main/java/de/epiceric/shopchest/language/LocalizedMessage.java @@ -113,8 +113,8 @@ public class LocalizedMessage { NO_PERMISSION_OPEN_OTHERS, NO_PERMISSION_BUY, NO_PERMISSION_SELL, - NO_PERMISSION_WG_BUY, - NO_PERMISSION_WG_SELL, + NO_PERMISSION_BUY_HERE, + NO_PERMISSION_SELL_HERE, NO_PERMISSION_REMOVE_OTHERS, NO_PERMISSION_REMOVE_ADMIN, NO_PERMISSION_RELOAD, diff --git a/src/main/java/de/epiceric/shopchest/listeners/ChestProtectListener.java b/src/main/java/de/epiceric/shopchest/listeners/ChestProtectListener.java index 2989db8..e0ef056 100644 --- a/src/main/java/de/epiceric/shopchest/listeners/ChestProtectListener.java +++ b/src/main/java/de/epiceric/shopchest/listeners/ChestProtectListener.java @@ -7,6 +7,7 @@ import com.sk89q.worldguard.bukkit.RegionContainer; import com.sk89q.worldguard.bukkit.RegionQuery; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import de.epiceric.shopchest.ShopChest; +import de.epiceric.shopchest.external.PlotSquaredShopFlag; import de.epiceric.shopchest.language.LanguageUtils; import de.epiceric.shopchest.language.LocalizedMessage; import de.epiceric.shopchest.nms.Hologram; @@ -14,7 +15,7 @@ import de.epiceric.shopchest.shop.Shop; import de.epiceric.shopchest.utils.Permissions; import de.epiceric.shopchest.utils.ShopUtils; import de.epiceric.shopchest.utils.Utils; -import de.epiceric.shopchest.worldguard.ShopFlag; +import de.epiceric.shopchest.external.WorldGuardShopFlag; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -34,11 +35,8 @@ import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.inventory.InventoryMoveItemEvent; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.InventoryHolder; -import org.bukkit.inventory.ItemStack; import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; public class ChestProtectListener implements Listener { @@ -153,7 +151,7 @@ public class ChestProtectListener implements Listener { if (plugin.hasWorldGuard() && plugin.getShopChestConfig().enable_worldguard_integration) { RegionContainer container = worldGuard.getRegionContainer(); RegionQuery query = container.createQuery(); - externalPluginsAllowed = query.testState(b.getLocation(), p, ShopFlag.CREATE_SHOP); + externalPluginsAllowed = query.testState(b.getLocation(), p, WorldGuardShopFlag.CREATE_SHOP); } if (plugin.hasTowny() && plugin.getShopChestConfig().enable_towny_integration) { @@ -161,6 +159,13 @@ public class ChestProtectListener implements Listener { externalPluginsAllowed &= (townBlock != null && townBlock.getType() == TownBlockType.COMMERCIAL); } + if (plugin.hasPlotSquared() && plugin.getShopChestConfig().enable_plotsquared_integration) { + com.intellectualcrafters.plot.object.Location loc = + new com.intellectualcrafters.plot.object.Location(b.getWorld().getName(), b.getX(), b.getY(), b.getZ()); + + externalPluginsAllowed &= Utils.isFlagAllowedOnPlot(loc.getOwnedPlot(), PlotSquaredShopFlag.CREATE_SHOP, p); + } + if (externalPluginsAllowed || p.hasPermission(Permissions.EXTEND_PROTECTED)) { if (shop.getVendor().getUniqueId().equals(p.getUniqueId()) || p.hasPermission(Permissions.EXTEND_OTHER)) { diff --git a/src/main/java/de/epiceric/shopchest/listeners/ShopInteractListener.java b/src/main/java/de/epiceric/shopchest/listeners/ShopInteractListener.java index fa5c0ee..33f8d37 100644 --- a/src/main/java/de/epiceric/shopchest/listeners/ShopInteractListener.java +++ b/src/main/java/de/epiceric/shopchest/listeners/ShopInteractListener.java @@ -1,5 +1,7 @@ package de.epiceric.shopchest.listeners; +import com.intellectualcrafters.plot.flag.Flag; +import com.intellectualcrafters.plot.object.Plot; import com.palmergames.bukkit.towny.object.TownBlock; import com.palmergames.bukkit.towny.object.TownBlockType; import com.palmergames.bukkit.towny.object.TownyUniverse; @@ -11,6 +13,8 @@ import de.epiceric.shopchest.ShopChest; import de.epiceric.shopchest.config.Config; import de.epiceric.shopchest.config.Regex; import de.epiceric.shopchest.event.*; +import de.epiceric.shopchest.external.PlotSquaredShopFlag; +import de.epiceric.shopchest.external.WorldGuardShopFlag; import de.epiceric.shopchest.language.LanguageUtils; import de.epiceric.shopchest.language.LocalizedMessage; import de.epiceric.shopchest.nms.Hologram; @@ -21,7 +25,6 @@ import de.epiceric.shopchest.utils.ClickType; import de.epiceric.shopchest.utils.Permissions; import de.epiceric.shopchest.utils.ShopUtils; import de.epiceric.shopchest.utils.Utils; -import de.epiceric.shopchest.worldguard.ShopFlag; import fr.xephi.authme.AuthMe; import net.milkbowl.vault.economy.Economy; import net.milkbowl.vault.economy.EconomyResponse; @@ -111,7 +114,7 @@ public class ShopInteractListener implements Listener { for (Location loc : chestLocations) { if (loc != null) { - externalPluginsAllowed &= query.testState(loc, p, ShopFlag.CREATE_SHOP); + externalPluginsAllowed &= query.testState(loc, p, WorldGuardShopFlag.CREATE_SHOP); } } } @@ -125,6 +128,19 @@ public class ShopInteractListener implements Listener { } } + if (plugin.hasPlotSquared() && config.enable_plotsquared_integration) { + for (Location loc : chestLocations) { + if (loc != null) { + com.intellectualcrafters.plot.object.Location plotLocation = new com.intellectualcrafters.plot.object.Location( + loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + + Plot plot = plotLocation.getOwnedPlot(); + externalPluginsAllowed &= Utils.isFlagAllowedOnPlot(plot, PlotSquaredShopFlag.CREATE_SHOP, p); + } + } + + } + if ((e.isCancelled() || !externalPluginsAllowed) && !p.hasPermission(Permissions.CREATE_PROTECTED)) { p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.NO_PERMISSION_CREATE_PROTECTED)); ClickType.removePlayerClickType(p); @@ -259,29 +275,34 @@ public class ShopInteractListener implements Listener { if (shop.getBuyPrice() > 0) { if (p.hasPermission(Permissions.BUY)) { - boolean worldGuardAllowed = true; + boolean externalPluginsAllowed = true; + + if (plugin.hasPlotSquared() && config.enable_plotsquared_integration) { + com.intellectualcrafters.plot.object.Location plotLocation = + new com.intellectualcrafters.plot.object.Location(b.getWorld().getName(), b.getX(), b.getY(), b.getZ()); + + Plot plot = plotLocation.getOwnedPlot(); + Flag flag = (shop.getShopType() == Shop.ShopType.ADMIN ? PlotSquaredShopFlag.USE_ADMIN_SHOP : PlotSquaredShopFlag.USE_SHOP); + + externalPluginsAllowed &= Utils.isFlagAllowedOnPlot(plot, flag, p); + } + + if (plugin.hasWorldGuard() && config.enable_worldguard_integration) { + StateFlag flag = (shop.getShopType() == ShopType.ADMIN ? WorldGuardShopFlag.USE_ADMIN_SHOP : WorldGuardShopFlag.USE_SHOP); + RegionContainer container = worldGuard.getRegionContainer(); + RegionQuery query = container.createQuery(); + externalPluginsAllowed &= query.testState(b.getLocation(), p, flag); + } if (shop.getShopType() == ShopType.ADMIN) { - if (plugin.hasWorldGuard() && config.enable_worldguard_integration) { - RegionContainer container = worldGuard.getRegionContainer(); - RegionQuery query = container.createQuery(); - worldGuardAllowed = query.testState(b.getLocation(), p, ShopFlag.USE_ADMIN_SHOP); - } - - if (worldGuardAllowed || p.hasPermission(Permissions.WORLDGUARD_BYPASS)) { + if (externalPluginsAllowed || p.hasPermission(Permissions.BYPASS_EXTERNAL_PLUGIN)) { buy(p, shop, p.isSneaking()); } else { - plugin.debug(p.getName() + " doesn't have worldguard permission"); - p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.NO_PERMISSION_WG_BUY)); + plugin.debug(p.getName() + " doesn't have external plugin's permission"); + p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.NO_PERMISSION_BUY_HERE)); } } else { - if (plugin.hasWorldGuard() && config.enable_worldguard_integration) { - RegionContainer container = worldGuard.getRegionContainer(); - RegionQuery query = container.createQuery(); - worldGuardAllowed = query.testState(b.getLocation(), p, ShopFlag.USE_SHOP); - } - - if (worldGuardAllowed || p.hasPermission(Permissions.WORLDGUARD_BYPASS)) { + if (externalPluginsAllowed || p.hasPermission(Permissions.BYPASS_EXTERNAL_PLUGIN)) { Chest c = (Chest) b.getState(); if (Utils.getAmount(c.getInventory(), shop.getProduct()) >= shop.getProduct().getAmount()) { buy(p, shop, p.isSneaking()); @@ -299,8 +320,8 @@ public class ShopInteractListener implements Listener { } } } else { - plugin.debug(p.getName() + " doesn't have worldguard permission"); - p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.NO_PERMISSION_WG_BUY)); + plugin.debug(p.getName() + " doesn't have external plugin's permission"); + p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.NO_PERMISSION_BUY_HERE)); } } } else { @@ -321,17 +342,27 @@ public class ShopInteractListener implements Listener { if (shop.getSellPrice() > 0) { if (p.hasPermission(Permissions.SELL)) { - boolean worldGuardAllowed = true; + boolean externalPluginsAllowed = true; + + if (plugin.hasPlotSquared() && config.enable_plotsquared_integration) { + com.intellectualcrafters.plot.object.Location plotLocation = + new com.intellectualcrafters.plot.object.Location(b.getWorld().getName(), b.getX(), b.getY(), b.getZ()); + + Plot plot = plotLocation.getOwnedPlot(); + Flag flag = (shop.getShopType() == Shop.ShopType.ADMIN ? PlotSquaredShopFlag.USE_ADMIN_SHOP : PlotSquaredShopFlag.USE_SHOP); + + externalPluginsAllowed &= Utils.isFlagAllowedOnPlot(plot, flag, p); + } if (plugin.hasWorldGuard() && config.enable_worldguard_integration) { RegionContainer container = worldGuard.getRegionContainer(); RegionQuery query = container.createQuery(); - StateFlag flag = (shop.getShopType() == ShopType.ADMIN ? ShopFlag.USE_ADMIN_SHOP : ShopFlag.USE_SHOP); - worldGuardAllowed = query.testState(b.getLocation(), p, flag); + StateFlag flag = (shop.getShopType() == ShopType.ADMIN ? WorldGuardShopFlag.USE_ADMIN_SHOP : WorldGuardShopFlag.USE_SHOP); + externalPluginsAllowed &= query.testState(b.getLocation(), p, flag); } - if (worldGuardAllowed || p.hasPermission(Permissions.WORLDGUARD_BYPASS)) { + if (externalPluginsAllowed || p.hasPermission(Permissions.BYPASS_EXTERNAL_PLUGIN)) { if (Utils.getAmount(p.getInventory(), shop.getProduct()) >= shop.getProduct().getAmount()) { sell(p, shop, p.isSneaking() && !Utils.hasAxeInHand(p)); } else { @@ -343,8 +374,8 @@ public class ShopInteractListener implements Listener { } } } else { - plugin.debug(p.getName() + " doesn't have worldguard permission"); - p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.NO_PERMISSION_WG_SELL)); + plugin.debug(p.getName() + " doesn't have external plugin's permission"); + p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.NO_PERMISSION_SELL_HERE)); } } else { p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.NO_PERMISSION_SELL)); diff --git a/src/main/java/de/epiceric/shopchest/listeners/WorldGuardListener.java b/src/main/java/de/epiceric/shopchest/listeners/WorldGuardListener.java index 55c6a7f..68db8e2 100644 --- a/src/main/java/de/epiceric/shopchest/listeners/WorldGuardListener.java +++ b/src/main/java/de/epiceric/shopchest/listeners/WorldGuardListener.java @@ -13,7 +13,7 @@ import de.epiceric.shopchest.nms.Hologram; import de.epiceric.shopchest.shop.Shop; import de.epiceric.shopchest.utils.ClickType; import de.epiceric.shopchest.utils.Permissions; -import de.epiceric.shopchest.worldguard.ShopFlag; +import de.epiceric.shopchest.external.WorldGuardShopFlag; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Chest; @@ -60,14 +60,14 @@ public class WorldGuardListener implements Listener { if (ClickType.getPlayerClickType(player) != null) { switch (ClickType.getPlayerClickType(player).getClickType()) { case CREATE: - return query.testState(location, localPlayer, ShopFlag.CREATE_SHOP); + return query.testState(location, localPlayer, WorldGuardShopFlag.CREATE_SHOP); case REMOVE: case INFO: return true; } } else { if (shop != null) { - StateFlag flag = (shop.getShopType() == Shop.ShopType.NORMAL ? ShopFlag.USE_SHOP : ShopFlag.USE_ADMIN_SHOP); + StateFlag flag = (shop.getShopType() == Shop.ShopType.NORMAL ? WorldGuardShopFlag.USE_SHOP : WorldGuardShopFlag.USE_ADMIN_SHOP); return query.testState(location, localPlayer, flag); } diff --git a/src/main/java/de/epiceric/shopchest/utils/Permissions.java b/src/main/java/de/epiceric/shopchest/utils/Permissions.java index 41143f6..ba1fa20 100644 --- a/src/main/java/de/epiceric/shopchest/utils/Permissions.java +++ b/src/main/java/de/epiceric/shopchest/utils/Permissions.java @@ -17,6 +17,6 @@ public class Permissions { public static final String CONFIG = "shopchest.config"; public static final String EXTEND_OTHER = "shopchest.extend.other"; public static final String EXTEND_PROTECTED = "shopchest.extend.protected"; - public static final String WORLDGUARD_BYPASS = "shopchest.worldguard.bypass"; + public static final String BYPASS_EXTERNAL_PLUGIN = "shopchest.external.bypass"; } diff --git a/src/main/java/de/epiceric/shopchest/utils/Utils.java b/src/main/java/de/epiceric/shopchest/utils/Utils.java index ff2c59e..a871857 100644 --- a/src/main/java/de/epiceric/shopchest/utils/Utils.java +++ b/src/main/java/de/epiceric/shopchest/utils/Utils.java @@ -1,7 +1,11 @@ package de.epiceric.shopchest.utils; +import com.intellectualcrafters.plot.flag.Flag; +import com.intellectualcrafters.plot.object.Plot; import de.epiceric.shopchest.ShopChest; +import de.epiceric.shopchest.external.PlotSquaredShopFlag; import de.epiceric.shopchest.nms.CustomBookMeta; +import de.epiceric.shopchest.shop.Shop; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.configuration.InvalidConfigurationException; @@ -234,6 +238,38 @@ public class Utils { return item != null && axes.contains(item.getType()); } + /** + * Check if a flag is allowed for a player on a plot from PlotSquared + * @param plot Plot from PlotSquared + * @param flag Flag to check + * @param p Player to check + * @return Whether the flag is allowed for the player + */ + public static boolean isFlagAllowedOnPlot(Plot plot, Flag flag, Player p) { + if (flag != null) { + Object o = plot.getFlag(flag, PlotSquaredShopFlag.Group.NONE); + + if (o instanceof PlotSquaredShopFlag.Group) { + PlotSquaredShopFlag.Group group = (PlotSquaredShopFlag.Group) o; + + switch (group) { + case OWNERS: + return plot.getOwners().contains(p.getUniqueId()); + case TRUSTED: + return plot.getOwners().contains(p.getUniqueId()) || plot.getTrusted().contains(p.getUniqueId()); + case MEMBERS: + return plot.getOwners().contains(p.getUniqueId()) || plot.getTrusted().contains(p.getUniqueId()) || plot.getMembers().contains(p.getUniqueId()); + case EVERYONE: + return true; + case NONE: + return false; + } + } + } + + return false; + } + /** * @param className Name of the class * @return Class in {@code net.minecraft.server.[VERSION]} package with the specified name or {@code null} if the class was not found diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 17e5cb4..09272dc 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -45,6 +45,10 @@ enable-towny-integration: true # Of course, this only works if AuthMe is installed enable-authme-integration: true +# Set whether PlotSquared integration should be enabled +# Of course, this only works if AuthMe is installed +enable-plotsquared-integration: true + # Set whether the vendor of a shop should get messages when players # buy or sell something from/to his shop or if his shop is out of stock enable-vendor-messages: true diff --git a/src/main/resources/lang/de_DE.lang b/src/main/resources/lang/de_DE.lang index cf7ade0..55706c7 100644 --- a/src/main/resources/lang/de_DE.lang +++ b/src/main/resources/lang/de_DE.lang @@ -69,8 +69,8 @@ message.noPermission.create-protected=&cDu hast keine Berechtigung hier einen Sh message.noPermission.open-others=&cDu hast keine Berechtigung diesen Shop zu öffnen. message.noPermission.buy=&cDu hast keine Berechtigung etwas zu kaufen. message.noPermission.sell=&cDu hast keine Berechtigung etwas zu verkaufen. -message.noPermission.worldguard-buy=&cDu hast keine Berechtigung hier etwas zu kaufen. -message.noPermission.worldguard-sell=&cDu hast keine Berechtigung hier etwas zu verkaufen. +message.noPermission.buy-here=&cDu hast keine Berechtigung hier etwas zu kaufen. +message.noPermission.sell-here=&cDu hast keine Berechtigung hier etwas zu verkaufen. message.noPermission.remove-others=&cDu hast keine Berechtigung diesen Shop zu entfernen. message.noPermission.remove-admin=&cDu hast keine Berechtigung einen Admin Shop zu entfernen. message.noPermission.reload=&cDu hast keine Berechtigung die Shops neu zu laden. diff --git a/src/main/resources/lang/en_US.lang b/src/main/resources/lang/en_US.lang index 7c136a5..44d8f10 100644 --- a/src/main/resources/lang/en_US.lang +++ b/src/main/resources/lang/en_US.lang @@ -245,11 +245,11 @@ message.noPermission.buy=&cYou don't have permission to buy something. # Set the message when a not permitted player tries to sell something. message.noPermission.sell=&cYou don't have permission to sell something. -# Set the message when a player tries to buy something in a WorldGuard region that denied shop use. -message.noPermission.worldguard-buy=&cYou don't have permission to buy something here. +# Set the message when a player tries to buy something in a region/plot that denied shop use. +message.noPermission.buy-here=&cYou don't have permission to buy something here. -# Set the message when a player tries to sell something in a WorldGuard region that denied shop use. -message.noPermission.worldguard-sell=&cYou don't have permission to sell something here. +# Set the message when a player tries to sell something in a region/plot region that denied shop use. +message.noPermission.sell-here=&cYou don't have permission to sell something here. # Set the message when a not permitted player tries to remove another player's shop. message.noPermission.remove-others=&cYou don't have permission to remove this shop. @@ -269,7 +269,7 @@ message.noPermission.config=&cYou don't have permission to change configuration # Set the message when a not permitted player tries to extend another player's shop's chest. message.noPermission.extend-others=&cYou don't have permission to extend this chest. -# Set the message when a not permitted player tries to extend a chest into a protected region (e.g. WorldGuard/Towny). +# Set the message when a not permitted player tries to extend a chest into a protected region/plot (e.g. WorldGuard/Towny). message.noPermission.extend-protected=&cYou don't have permission to extend this chest to here. # Set the command description message for '/shop create' when you type '/shop'. diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 257acf0..835e92d 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -5,7 +5,7 @@ main: de.epiceric.shopchest.ShopChest version: ${project.version} author: EpicEric website: ${project.url} -softdepend: [WorldGuard, Towny] +softdepend: [WorldGuard, Towny, PlotSquared] depend: [Vault] permissions: @@ -26,7 +26,7 @@ permissions: shopchest.config: true shopchest.extend.other: true shopchest.extend.protected: true - shopchest.worldguard.bypass: true + shopchest.external.bypass: true shopchest.create: description: Allows you to create a shop. default: true @@ -75,6 +75,6 @@ permissions: shopchest.extend.protected: description: Allows you to extend shops into a protected region. default: op - shopchest.worlguard.bypass: - description: Allows you to to use shops in WorldGuard regions that deny shop use. + shopchest.external.bypass: + description: Allows you to to use shops regions/plots that deny shop use. default: op