From 3d2870cc4e6f771a37304ce9e6267663e10d01e6 Mon Sep 17 00:00:00 2001 From: ementalo Date: Wed, 10 Oct 2012 14:00:38 +0100 Subject: Esschat clean up Re-implement sign throttle Test #2331 --- .../src/net/ess3/signs/EssentialsSign.java | 9 +- .../src/net/ess3/signs/EssentialsSignsPlugin.java | 3 + .../src/net/ess3/signs/SignBalance.java | 22 -- .../src/net/ess3/signs/SignBlockListener.java | 264 --------------- EssentialsSigns/src/net/ess3/signs/SignBuy.java | 38 --- EssentialsSigns/src/net/ess3/signs/SignConfig.java | 40 +++ .../src/net/ess3/signs/SignDisposal.java | 23 -- .../src/net/ess3/signs/SignEnchant.java | 119 ------- .../src/net/ess3/signs/SignEntityListener.java | 80 ----- .../src/net/ess3/signs/SignException.java | 15 - EssentialsSigns/src/net/ess3/signs/SignFree.java | 47 --- .../src/net/ess3/signs/SignGameMode.java | 51 --- EssentialsSigns/src/net/ess3/signs/SignHeal.java | 36 -- EssentialsSigns/src/net/ess3/signs/SignInfo.java | 54 --- EssentialsSigns/src/net/ess3/signs/SignKit.java | 75 ----- EssentialsSigns/src/net/ess3/signs/SignMail.java | 32 -- .../src/net/ess3/signs/SignPlayerListener.java | 65 ---- EssentialsSigns/src/net/ess3/signs/SignRepair.java | 57 ---- EssentialsSigns/src/net/ess3/signs/SignSell.java | 35 -- .../src/net/ess3/signs/SignSpawnmob.java | 48 --- EssentialsSigns/src/net/ess3/signs/SignTime.java | 59 ---- EssentialsSigns/src/net/ess3/signs/SignTrade.java | 361 -------------------- EssentialsSigns/src/net/ess3/signs/SignWarp.java | 70 ---- .../src/net/ess3/signs/SignWeather.java | 57 ---- EssentialsSigns/src/net/ess3/signs/Signs.java | 18 + .../src/net/ess3/signs/SignsConfig.java | 23 -- .../src/net/ess3/signs/SignsConfigHolder.java | 4 +- .../src/net/ess3/signs/SignsPermissions.java | 1 - .../ess3/signs/listeners/SignBlockListener.java | 267 +++++++++++++++ .../ess3/signs/listeners/SignEntityListener.java | 82 +++++ .../ess3/signs/listeners/SignPlayerListener.java | 67 ++++ .../src/net/ess3/signs/signs/SignBalance.java | 23 ++ .../src/net/ess3/signs/signs/SignBuy.java | 39 +++ .../src/net/ess3/signs/signs/SignDisposal.java | 24 ++ .../src/net/ess3/signs/signs/SignEnchant.java | 120 +++++++ .../src/net/ess3/signs/signs/SignException.java | 15 + .../src/net/ess3/signs/signs/SignFree.java | 48 +++ .../src/net/ess3/signs/signs/SignGameMode.java | 52 +++ .../src/net/ess3/signs/signs/SignHeal.java | 37 +++ .../src/net/ess3/signs/signs/SignInfo.java | 55 ++++ .../src/net/ess3/signs/signs/SignKit.java | 76 +++++ .../src/net/ess3/signs/signs/SignMail.java | 33 ++ .../src/net/ess3/signs/signs/SignRepair.java | 58 ++++ .../src/net/ess3/signs/signs/SignSell.java | 36 ++ .../src/net/ess3/signs/signs/SignSpawnmob.java | 49 +++ .../src/net/ess3/signs/signs/SignTime.java | 60 ++++ .../src/net/ess3/signs/signs/SignTrade.java | 363 +++++++++++++++++++++ .../src/net/ess3/signs/signs/SignWarp.java | 71 ++++ .../src/net/ess3/signs/signs/SignWeather.java | 58 ++++ 49 files changed, 1703 insertions(+), 1636 deletions(-) delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignBalance.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignBlockListener.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignBuy.java create mode 100644 EssentialsSigns/src/net/ess3/signs/SignConfig.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignDisposal.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignEnchant.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignEntityListener.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignException.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignFree.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignGameMode.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignHeal.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignInfo.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignKit.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignMail.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignPlayerListener.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignRepair.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignSell.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignSpawnmob.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignTime.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignTrade.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignWarp.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignWeather.java delete mode 100644 EssentialsSigns/src/net/ess3/signs/SignsConfig.java create mode 100644 EssentialsSigns/src/net/ess3/signs/listeners/SignBlockListener.java create mode 100644 EssentialsSigns/src/net/ess3/signs/listeners/SignEntityListener.java create mode 100644 EssentialsSigns/src/net/ess3/signs/listeners/SignPlayerListener.java create mode 100644 EssentialsSigns/src/net/ess3/signs/signs/SignBalance.java create mode 100644 EssentialsSigns/src/net/ess3/signs/signs/SignBuy.java create mode 100644 EssentialsSigns/src/net/ess3/signs/signs/SignDisposal.java create mode 100644 EssentialsSigns/src/net/ess3/signs/signs/SignEnchant.java create mode 100644 EssentialsSigns/src/net/ess3/signs/signs/SignException.java create mode 100644 EssentialsSigns/src/net/ess3/signs/signs/SignFree.java create mode 100644 EssentialsSigns/src/net/ess3/signs/signs/SignGameMode.java create mode 100644 EssentialsSigns/src/net/ess3/signs/signs/SignHeal.java create mode 100644 EssentialsSigns/src/net/ess3/signs/signs/SignInfo.java create mode 100644 EssentialsSigns/src/net/ess3/signs/signs/SignKit.java create mode 100644 EssentialsSigns/src/net/ess3/signs/signs/SignMail.java create mode 100644 EssentialsSigns/src/net/ess3/signs/signs/SignRepair.java create mode 100644 EssentialsSigns/src/net/ess3/signs/signs/SignSell.java create mode 100644 EssentialsSigns/src/net/ess3/signs/signs/SignSpawnmob.java create mode 100644 EssentialsSigns/src/net/ess3/signs/signs/SignTime.java create mode 100644 EssentialsSigns/src/net/ess3/signs/signs/SignTrade.java create mode 100644 EssentialsSigns/src/net/ess3/signs/signs/SignWarp.java create mode 100644 EssentialsSigns/src/net/ess3/signs/signs/SignWeather.java (limited to 'EssentialsSigns') diff --git a/EssentialsSigns/src/net/ess3/signs/EssentialsSign.java b/EssentialsSigns/src/net/ess3/signs/EssentialsSign.java index 4aa10c25a..95876ff0f 100644 --- a/EssentialsSigns/src/net/ess3/signs/EssentialsSign.java +++ b/EssentialsSigns/src/net/ess3/signs/EssentialsSign.java @@ -8,6 +8,7 @@ import net.ess3.api.ChargeException; import net.ess3.api.IEssentials; import net.ess3.api.IUser; import net.ess3.economy.Trade; +import net.ess3.signs.signs.SignException; import net.ess3.utils.FormatUtil; import org.bukkit.Material; import org.bukkit.block.Block; @@ -75,10 +76,14 @@ public class EssentialsSign return user.getName().substring(0, user.getName().length() > 13 ? 13 : user.getName().length()); } - public final boolean onSignInteract(final Block block, final Player player, final IEssentials ess) + public final boolean onSignInteract(final Block block, final Player player, final IEssentials ess, final ISignsPlugin isp) { final ISign sign = new BlockSign(block); final IUser user = ess.getUserMap().getUser(player); + if (user.checkSignThrottle(isp.getSettings().getData().getSignUsePerSecond())) + { + return false; + } try { return SignsPermissions.USE.isAuthorized(user, signName) @@ -466,7 +471,7 @@ public class EssentialsSign } - static class BlockSign implements ISign + public static class BlockSign implements ISign { private final transient Sign sign; private final transient Block block; diff --git a/EssentialsSigns/src/net/ess3/signs/EssentialsSignsPlugin.java b/EssentialsSigns/src/net/ess3/signs/EssentialsSignsPlugin.java index ae96be4f6..cdd4494ea 100644 --- a/EssentialsSigns/src/net/ess3/signs/EssentialsSignsPlugin.java +++ b/EssentialsSigns/src/net/ess3/signs/EssentialsSignsPlugin.java @@ -5,6 +5,9 @@ import java.util.logging.Logger; import static net.ess3.I18n._; import net.ess3.api.IEssentials; import net.ess3.api.IPlugin; +import net.ess3.signs.listeners.SignBlockListener; +import net.ess3.signs.listeners.SignEntityListener; +import net.ess3.signs.listeners.SignPlayerListener; import org.bukkit.Bukkit; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; diff --git a/EssentialsSigns/src/net/ess3/signs/SignBalance.java b/EssentialsSigns/src/net/ess3/signs/SignBalance.java deleted file mode 100644 index 2648e6aad..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignBalance.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.ess3.signs; - -import static net.ess3.I18n._; -import net.ess3.api.IEssentials; -import net.ess3.api.IUser; -import net.ess3.utils.FormatUtil; - - -public class SignBalance extends EssentialsSign -{ - public SignBalance() - { - super("Balance"); - } - - @Override - protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException - { - player.sendMessage(_("balance", FormatUtil.displayCurrency(player.getMoney(), ess))); - return true; - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignBlockListener.java b/EssentialsSigns/src/net/ess3/signs/SignBlockListener.java deleted file mode 100644 index e7fc11d44..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignBlockListener.java +++ /dev/null @@ -1,264 +0,0 @@ -package net.ess3.signs; - -import java.util.logging.Level; -import java.util.logging.Logger; -import net.ess3.api.IEssentials; -import net.ess3.api.ISettings; -import net.ess3.api.IUser; -import net.ess3.permissions.Permissions; -import net.ess3.utils.FormatUtil; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.Sign; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.block.*; - - -public class SignBlockListener implements Listener -{ - private final transient IEssentials ess; - private final transient ISignsPlugin plugin; - private final static Logger LOGGER = Logger.getLogger("Minecraft"); - private final static int WALL_SIGN = Material.WALL_SIGN.getId(); - private final static int SIGN_POST = Material.SIGN_POST.getId(); - - public SignBlockListener(final IEssentials ess, final ISignsPlugin plugin) - { - this.ess = ess; - this.plugin = plugin; - } - - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public void onBlockBreak(final BlockBreakEvent event) - { - ISettings settings = ess.getSettings(); - if (plugin.getSettings().areSignsDisabled()) - { - return; - } - - if (protectSignsAndBlocks(event.getBlock(), event.getPlayer())) - { - event.setCancelled(true); - } - } - - public boolean protectSignsAndBlocks(final Block block, final Player player) - { - final int mat = block.getTypeId(); - if (mat == SIGN_POST || mat == WALL_SIGN) - { - final Sign csign = (Sign)block.getState(); - - for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) - { - if (csign.getLine(0).equalsIgnoreCase(sign.getSuccessName()) - && !sign.onSignBreak(block, player, ess)) - { - return true; - } - } - } - // prevent any signs be broken by destroying the block they are attached to - if (EssentialsSign.checkIfBlockBreaksSigns(block)) - { - LOGGER.log(Level.INFO, "Prevented that a block was broken next to a sign."); - return true; - } - for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) - { - if (sign.getBlocks().contains(block.getType()) - && !sign.onBlockBreak(block, player, ess)) - { - LOGGER.log(Level.INFO, "A block was protected by a sign."); - return true; - } - } - return false; - } - - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public void onSignChange(final SignChangeEvent event) - { - if (plugin.getSettings().areSignsDisabled()) - { - return; - } - IUser user = ess.getUserMap().getUser(event.getPlayer()); - - for (int i = 0; i < 4; i++) - { - event.setLine(i, FormatUtil.formatString(user, Permissions.SIGNS, event.getLine(i))); - } - - for (Signs signs : Signs.values()) - { - final EssentialsSign sign = signs.getSign(); - if (event.getLine(0).equalsIgnoreCase(sign.getSuccessName())) - { - event.setCancelled(true); - return; - } - if (event.getLine(0).equalsIgnoreCase(sign.getTemplateName()) - && !sign.onSignCreate(event, ess)) - { - event.setCancelled(true); - return; - } - } - } - - @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) - public void onBlockPlace(final BlockPlaceEvent event) - { - if (plugin.getSettings().areSignsDisabled()) - { - return; - } - - final Block against = event.getBlockAgainst(); - if ((against.getTypeId() == WALL_SIGN - || against.getTypeId() == SIGN_POST) - && EssentialsSign.isValidSign(new EssentialsSign.BlockSign(against))) - { - event.setCancelled(true); - return; - } - final Block block = event.getBlock(); - if (block.getTypeId() == WALL_SIGN - || block.getTypeId() == SIGN_POST) - { - return; - } - for (Signs signs : Signs.values()) - { - final EssentialsSign sign = signs.getSign(); - if (sign.getBlocks().contains(block.getType()) - && !sign.onBlockPlace(block, event.getPlayer(), ess)) - { - event.setCancelled(true); - return; - } - } - } - - @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) - public void onBlockBurn(final BlockBurnEvent event) - { - if (plugin.getSettings().areSignsDisabled()) - { - return; - } - - final Block block = event.getBlock(); - if (((block.getTypeId() == WALL_SIGN - || block.getTypeId() == SIGN_POST) - && EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block))) - || EssentialsSign.checkIfBlockBreaksSigns(block)) - { - event.setCancelled(true); - return; - } - for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) - { - if (sign.getBlocks().contains(block.getType()) - && !sign.onBlockBurn(block, ess)) - { - event.setCancelled(true); - return; - } - } - } - - @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) - public void onBlockIgnite(final BlockIgniteEvent event) - { - if (plugin.getSettings().areSignsDisabled()) - { - return; - } - - final Block block = event.getBlock(); - if (((block.getTypeId() == WALL_SIGN - || block.getTypeId() == SIGN_POST) - && EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block))) - || EssentialsSign.checkIfBlockBreaksSigns(block)) - { - event.setCancelled(true); - return; - } - for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) - { - if (sign.getBlocks().contains(block.getType()) - && !sign.onBlockIgnite(block, ess)) - { - event.setCancelled(true); - return; - } - } - } - - @EventHandler(priority = EventPriority.LOW) - public void onBlockPistonExtend(final BlockPistonExtendEvent event) - { - if (plugin.getSettings().areSignsDisabled()) - { - return; - } - - for (Block block : event.getBlocks()) - { - if (((block.getTypeId() == WALL_SIGN - || block.getTypeId() == SIGN_POST) - && EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block))) - || EssentialsSign.checkIfBlockBreaksSigns(block)) - { - event.setCancelled(true); - return; - } - for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) - { - if (sign.getBlocks().contains(block.getType()) - && !sign.onBlockPush(block, ess)) - { - event.setCancelled(true); - return; - } - } - } - } - - @EventHandler(priority = EventPriority.LOW) - public void onBlockPistonRetract(final BlockPistonRetractEvent event) - { - if (plugin.getSettings().areSignsDisabled()) - { - return; - } - - if (event.isSticky()) - { - final Block block = event.getBlock(); - if (((block.getTypeId() == WALL_SIGN - || block.getTypeId() == SIGN_POST) - && EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block))) - || EssentialsSign.checkIfBlockBreaksSigns(block)) - { - event.setCancelled(true); - return; - } - for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) - { - if (sign.getBlocks().contains(block.getType()) - && !sign.onBlockPush(block, ess)) - { - event.setCancelled(true); - return; - } - } - } - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignBuy.java b/EssentialsSigns/src/net/ess3/signs/SignBuy.java deleted file mode 100644 index ff08cdbc1..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignBuy.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.ess3.signs; - -import net.ess3.api.ChargeException; -import net.ess3.api.IEssentials; -import net.ess3.api.IUser; -import net.ess3.economy.Trade; - - -public class SignBuy extends EssentialsSign -{ - public SignBuy() - { - super("Buy"); - } - - @Override - protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException - { - validateTrade(sign, 1, 2, player, ess); - validateTrade(sign, 3, ess); - return true; - } - - @Override - protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException - { - final Trade items = getTrade(sign, 1, 2, player, ess); - final Trade charge = getTrade(sign, 3, ess); - charge.isAffordableFor(player); - if (!items.pay(player, false)) - { - throw new ChargeException("Inventory full"); - } - charge.charge(player); - Trade.log("Sign", "Buy", "Interact", username, charge, username, items, sign.getBlock().getLocation(), ess); - return true; - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignConfig.java b/EssentialsSigns/src/net/ess3/signs/SignConfig.java new file mode 100644 index 000000000..7706907ec --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/SignConfig.java @@ -0,0 +1,40 @@ +package net.ess3.signs; + +import java.util.Collections; +import java.util.Map; +import lombok.Data; +import lombok.EqualsAndHashCode; +import net.ess3.storage.Comment; +import net.ess3.storage.StorageObject; + + +@Data +@EqualsAndHashCode(callSuper = false) +public class SignConfig implements StorageObject +{ + private Map signs; + + public Map getSigns() + { + return signs == null + ? Collections.emptyMap() + : Collections.unmodifiableMap(signs); + } + + public void setSigns(final Map signs) + { + this.signs = signs; + } + @Comment( + { + "How many times per second can Essentials signs be interacted with.", + "Values should be between 1-20, 20 being virtually no lag protection.", + "Lower numbers will reduce the possiblity of lag, but may annoy players." + }) + private int signUsesPerSecond = 4; + + public int getSignUsePerSecond() { + + return signUsesPerSecond > 0 ? signUsesPerSecond : 1; + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/SignDisposal.java b/EssentialsSigns/src/net/ess3/signs/SignDisposal.java deleted file mode 100644 index 01775e18c..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignDisposal.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.ess3.signs; - -import net.ess3.api.IEssentials; -import net.ess3.api.IUser; - - -public class SignDisposal extends EssentialsSign -{ - public SignDisposal() - { - super("Disposal"); - } - - @Override - protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) - { - player.sendMessage("Bukkit broke this sign :("); - //TODO: wait for a fix in bukkit - //Problem: Items can be duplicated - //player.getBase().openInventory(ess.getServer().createInventory(player, 36)); - return true; - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignEnchant.java b/EssentialsSigns/src/net/ess3/signs/SignEnchant.java deleted file mode 100644 index 492836eee..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignEnchant.java +++ /dev/null @@ -1,119 +0,0 @@ -package net.ess3.signs; - -import java.util.Locale; -import static net.ess3.I18n._; -import net.ess3.api.ChargeException; -import net.ess3.api.IEssentials; -import net.ess3.api.IUser; -import net.ess3.bukkit.Enchantments; -import net.ess3.economy.Trade; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.ItemStack; - - -public class SignEnchant extends EssentialsSign -{ - public SignEnchant() - { - super("Enchant"); - } - - @Override - protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException - { - final ItemStack stack = sign.getLine(1).equals("*") || sign.getLine(1).equalsIgnoreCase("any") ? null : getItemStack(sign.getLine(1), 1, ess); - final String[] enchantLevel = sign.getLine(2).split(":"); - if (enchantLevel.length != 2) - { - throw new SignException(_("invalidSignLine", 3)); - } - final Enchantment enchantment = Enchantments.getByName(enchantLevel[0]); - if (enchantment == null) - { - throw new SignException(_("enchantmentNotFound")); - } - int level; - try - { - level = Integer.parseInt(enchantLevel[1]); - } - catch (NumberFormatException ex) - { - throw new SignException(ex.getMessage(), ex); - } - if (level < 1 || level > enchantment.getMaxLevel()) - { - level = enchantment.getMaxLevel(); - sign.setLine(2, enchantLevel[0] + ":" + level); - } - try - { - if (stack != null) - { - stack.addEnchantment(enchantment, level); - } - } - catch (Throwable ex) - { - throw new SignException(ex.getMessage(), ex); - } - getTrade(sign, 3, ess); - return true; - } - - @Override - protected boolean onSignInteract(ISign sign, IUser player, String username, IEssentials ess) throws SignException, ChargeException - { - final ItemStack search = sign.getLine(1).equals("*") || sign.getLine(1).equalsIgnoreCase("any") ? null : getItemStack(sign.getLine(1), 1, ess); - int slot = -1; - final Trade charge = getTrade(sign, 3, ess); - charge.isAffordableFor(player); - final String[] enchantLevel = sign.getLine(2).split(":"); - if (enchantLevel.length != 2) - { - throw new SignException(_("invalidSignLine", 3)); - } - final Enchantment enchantment = Enchantments.getByName(enchantLevel[0]); - if (enchantment == null) - { - throw new SignException(_("enchantmentNotFound")); - } - int level; - try - { - level = Integer.parseInt(enchantLevel[1]); - } - catch (NumberFormatException ex) - { - level = enchantment.getMaxLevel(); - } - - final ItemStack playerHand = player.getPlayer().getItemInHand(); - if (playerHand == null - || playerHand.getAmount() != 1 - || (playerHand.containsEnchantment(enchantment) - && playerHand.getEnchantmentLevel(enchantment) == level)) - { - throw new SignException(_("missingItems", 1, sign.getLine(1))); - } - if (search != null && playerHand.getType() != search.getType()) - { - throw new SignException(_("missingItems", 1, search.getType().toString().toLowerCase(Locale.ENGLISH).replace('_', ' '))); - } - - final ItemStack toEnchant = playerHand; - try - { - toEnchant.addEnchantment(enchantment, level); - } - catch (Exception ex) - { - throw new SignException(ex.getMessage(), ex); - } - - charge.charge(player); - Trade.log("Sign", "Enchant", "Interact", username, charge, username, charge, sign.getBlock().getLocation(), ess); - player.getPlayer().updateInventory(); - return true; - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignEntityListener.java b/EssentialsSigns/src/net/ess3/signs/SignEntityListener.java deleted file mode 100644 index 1c316478d..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignEntityListener.java +++ /dev/null @@ -1,80 +0,0 @@ -package net.ess3.signs; - -import net.ess3.api.IEssentials; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityChangeBlockEvent; -import org.bukkit.event.entity.EntityExplodeEvent; - - -public class SignEntityListener implements Listener -{ - private final transient IEssentials ess; - private final transient ISignsPlugin plugin; - - public SignEntityListener(final IEssentials ess, final ISignsPlugin plugin) - { - this.ess = ess; - this.plugin = plugin; - } - - @EventHandler(priority = EventPriority.LOW) - public void onEntityExplode(final EntityExplodeEvent event) - { - if (plugin.getSettings().areSignsDisabled()) - { - return; - } - - for (Block block : event.blockList()) - { - if (((block.getTypeId() == Material.WALL_SIGN.getId() - || block.getTypeId() == Material.SIGN_POST.getId()) - && EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block))) - || EssentialsSign.checkIfBlockBreaksSigns(block)) - { - event.setCancelled(true); - return; - } - for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) - { - if (sign.getBlocks().contains(block.getType())) - { - event.setCancelled(!sign.onBlockExplode(block, ess)); - return; - } - } - } - } - - @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) - public void onEntityChangeBlock(final EntityChangeBlockEvent event) - { - if (plugin.getSettings().areSignsDisabled()) - { - return; - } - - final Block block = event.getBlock(); - if (((block.getTypeId() == Material.WALL_SIGN.getId() - || block.getTypeId() == Material.SIGN_POST.getId()) - && EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block))) - || EssentialsSign.checkIfBlockBreaksSigns(block)) - { - event.setCancelled(true); - return; - } - for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) - { - if (sign.getBlocks().contains(block.getType()) - && !sign.onBlockBreak(block, ess)) - { - event.setCancelled(true); - return; - } - } - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignException.java b/EssentialsSigns/src/net/ess3/signs/SignException.java deleted file mode 100644 index 7ca73e4e5..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignException.java +++ /dev/null @@ -1,15 +0,0 @@ -package net.ess3.signs; - - -public class SignException extends Exception -{ - public SignException(final String message) - { - super(message); - } - - public SignException(final String message, final Throwable throwable) - { - super(message, throwable); - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignFree.java b/EssentialsSigns/src/net/ess3/signs/SignFree.java deleted file mode 100644 index 906929e09..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignFree.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.ess3.signs; - -import static net.ess3.I18n._; -import net.ess3.api.IEssentials; -import net.ess3.api.IUser; -import net.ess3.craftbukkit.InventoryWorkaround; -import net.ess3.economy.Trade; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; - - -public class SignFree extends EssentialsSign -{ - public SignFree() - { - super("Free"); - } - - @Override - protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException - { - getItemStack(sign.getLine(1), 1, ess); - return true; - } - - @Override - protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException - { - final ItemStack item = getItemStack(sign.getLine(1), 1, ess); - if (item.getType() == Material.AIR) - { - throw new SignException(_("cantSpawnItem", "Air")); - } - - item.setAmount(item.getType().getMaxStackSize()); - InventoryWorkaround.addItem(player.getPlayer().getInventory(), true, item); - player.sendMessage("Item added to your inventory."); - player.getPlayer().updateInventory(); - //TODO: wait for a fix in bukkit - //Problem: Items can be duplicated - //Inventory i = ess.getServer().createInventory(player, InventoryType.CHEST); - //i.addItem(item); - //player.openInventory(i); - Trade.log("Sign", "Free", "Interact", username, null, username, new Trade(item, ess), sign.getBlock().getLocation(), ess); - return true; - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignGameMode.java b/EssentialsSigns/src/net/ess3/signs/SignGameMode.java deleted file mode 100644 index 1109956ab..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignGameMode.java +++ /dev/null @@ -1,51 +0,0 @@ -package net.ess3.signs; - -import java.util.Locale; -import static net.ess3.I18n._; -import net.ess3.api.ChargeException; -import net.ess3.api.IEssentials; -import net.ess3.api.IUser; -import net.ess3.economy.Trade; -import org.bukkit.GameMode; - - -public class SignGameMode extends EssentialsSign -{ - public SignGameMode() - { - super("GameMode"); - } - - @Override - protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException - { - final String gamemode = sign.getLine(1); - if (gamemode.isEmpty()) - { - sign.setLine(1, "Survival"); - } - - validateTrade(sign, 2, ess); - - return true; - } - - @Override - protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException - { - final Trade charge = getTrade(sign, 2, ess); - final String mode = sign.getLine(1).trim(); - - if (mode.isEmpty()) - { - throw new SignException(_("invalidSignLine", 2)); - } - charge.isAffordableFor(player); - - //this needs to be fixed - player.getPlayer().setGameMode(player.getPlayer().getGameMode() == GameMode.SURVIVAL ? GameMode.CREATIVE : GameMode.SURVIVAL); - player.sendMessage(_("gameMode", _(player.getPlayer().getGameMode().toString().toLowerCase(Locale.ENGLISH)), player.getPlayer().getDisplayName())); - charge.charge(player); - return true; - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignHeal.java b/EssentialsSigns/src/net/ess3/signs/SignHeal.java deleted file mode 100644 index 6d82ba70f..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignHeal.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.ess3.signs; - -import static net.ess3.I18n._; -import net.ess3.api.ChargeException; -import net.ess3.api.IEssentials; -import net.ess3.api.IUser; -import net.ess3.economy.Trade; - - -public class SignHeal extends EssentialsSign -{ - public SignHeal() - { - super("Heal"); - } - - @Override - protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException - { - validateTrade(sign, 1, ess); - return true; - } - - @Override - protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException - { - final Trade charge = getTrade(sign, 1, ess); - charge.isAffordableFor(player); - player.getPlayer().setHealth(20); - player.getPlayer().setFoodLevel(20); - player.getPlayer().setFireTicks(0); - player.sendMessage(_("youAreHealed")); - charge.charge(player); - return true; - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignInfo.java b/EssentialsSigns/src/net/ess3/signs/SignInfo.java deleted file mode 100644 index dd37d6462..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignInfo.java +++ /dev/null @@ -1,54 +0,0 @@ -package net.ess3.signs; - -import java.io.IOException; -import net.ess3.api.ChargeException; -import net.ess3.api.IEssentials; -import net.ess3.api.IUser; -import net.ess3.economy.Trade; -import net.ess3.utils.textreader.IText; -import net.ess3.utils.textreader.KeywordReplacer; -import net.ess3.utils.textreader.TextInput; -import net.ess3.utils.textreader.TextPager; - - -public class SignInfo extends EssentialsSign -{ - public SignInfo() - { - super("Info"); - } - - @Override - protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException - { - validateTrade(sign, 3, ess); - return true; - } - - @Override - protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException - { - final Trade charge = getTrade(sign, 3, ess); - charge.isAffordableFor(player); - - String chapter = sign.getLine(1); - String page = sign.getLine(2); - - final IText input; - try - { - input = new TextInput(player, "info", true, ess); - final IText output = new KeywordReplacer(input, player, ess); - final TextPager pager = new TextPager(output); - pager.showPage(chapter, page, null, player); - - } - catch (IOException ex) - { - throw new SignException(ex.getMessage(), ex); - } - - charge.charge(player); - return true; - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignKit.java b/EssentialsSigns/src/net/ess3/signs/SignKit.java deleted file mode 100644 index 413eed605..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignKit.java +++ /dev/null @@ -1,75 +0,0 @@ -package net.ess3.signs; - -import java.util.Locale; -import net.ess3.api.ChargeException; -import net.ess3.api.IEssentials; -import net.ess3.api.IUser; -import net.ess3.economy.Trade; -import net.ess3.permissions.Permissions; -import net.ess3.settings.Kit; - - -public class SignKit extends EssentialsSign -{ - public SignKit() - { - super("Kit"); - } - - @Override - protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException - { - validateTrade(sign, 3, ess); - - final String kitName = sign.getLine(1).toLowerCase(Locale.ENGLISH); - - if (kitName.isEmpty()) - { - sign.setLine(1, "§dKit name!"); - return false; - } - else - { - try - { - ess.getKits().getKit(kitName); - } - catch (Exception ex) - { - throw new SignException(ex.getMessage(), ex); - } - final String group = sign.getLine(2); - if ("Everyone".equalsIgnoreCase(group) || "Everybody".equalsIgnoreCase(group)) - { - sign.setLine(2, "§2Everyone"); - } - return true; - } - } - - @Override - protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException - { - final String kitName = sign.getLine(1).toLowerCase(Locale.ENGLISH); - final String group = sign.getLine(2); - if ((!group.isEmpty() && ("§2Everyone".equals(group) || ess.getRanks().inGroup(player, group))) - || (group.isEmpty() && Permissions.KITS.isAuthorized(player, kitName))) - { - final Trade charge = getTrade(sign, 3, ess); - charge.isAffordableFor(player); - try - {; - final Kit kit = ess.getKits().getKit(kitName); - ess.getKits().checkTime(player, kit); - ess.getKits().sendKit(player, kit); - charge.charge(player); - } - catch (Exception ex) - { - throw new SignException(ex.getMessage(), ex); - } - return true; - } - return false; - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignMail.java b/EssentialsSigns/src/net/ess3/signs/SignMail.java deleted file mode 100644 index b9f7de05c..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignMail.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.ess3.signs; - -import java.util.List; -import static net.ess3.I18n._; -import net.ess3.api.IEssentials; -import net.ess3.api.IUser; - - -public class SignMail extends EssentialsSign -{ - public SignMail() - { - super("Mail"); - } - - @Override - protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException - { - final List mail = player.getData().getMails(); - if (mail == null || mail.isEmpty()) - { - player.sendMessage(_("noNewMail")); - return false; - } - for (String s : mail) - { - player.sendMessage(s); - } - player.sendMessage(_("markMailAsRead")); - return true; - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignPlayerListener.java b/EssentialsSigns/src/net/ess3/signs/SignPlayerListener.java deleted file mode 100644 index eabf5423b..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignPlayerListener.java +++ /dev/null @@ -1,65 +0,0 @@ -package net.ess3.signs; - -import net.ess3.api.IEssentials; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.Sign; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; -import org.bukkit.event.player.PlayerInteractEvent; - - -public class SignPlayerListener implements Listener -{ - private final transient IEssentials ess; - private final transient ISignsPlugin plugin; - - public SignPlayerListener(final IEssentials ess, final ISignsPlugin plugin) - { - this.ess = ess; - this.plugin = plugin; - } - - @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) - public void onPlayerInteract(final PlayerInteractEvent event) - { - if (plugin.getSettings().areSignsDisabled() || event.getAction() != Action.RIGHT_CLICK_BLOCK) - { - return; - } - final Block block = event.getClickedBlock(); - if (block == null) - { - return; - } - - final int mat = block.getTypeId(); - if (mat == Material.SIGN_POST.getId() || mat == Material.WALL_SIGN.getId()) - { - final Sign csign = (Sign)block.getState(); - for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) - { - if (csign.getLine(0).equalsIgnoreCase(sign.getSuccessName())) - { - sign.onSignInteract(block, event.getPlayer(), ess); - event.setCancelled(true); - return; - } - } - } - else - { - for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) - { - if (sign.getBlocks().contains(block.getType()) - && !sign.onBlockInteract(block, event.getPlayer(), ess)) - { - event.setCancelled(true); - return; - } - } - } - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignRepair.java b/EssentialsSigns/src/net/ess3/signs/SignRepair.java deleted file mode 100644 index 1610f16f8..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignRepair.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.ess3.signs; - -import static net.ess3.I18n._; -import net.ess3.api.ChargeException; -import net.ess3.api.IEssentials; -import net.ess3.api.IUser; -import net.ess3.commands.Commandrepair; -import net.ess3.economy.Trade; - - -public class SignRepair extends EssentialsSign -{ - public SignRepair() - { - super("Repair"); - } - - @Override - protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException - { - final String repairTarget = sign.getLine(1); - if (repairTarget.isEmpty()) - { - sign.setLine(1, "Hand"); - } - else if (!repairTarget.equalsIgnoreCase("all") && !repairTarget.equalsIgnoreCase("hand")) - { - throw new SignException(_("invalidSignLine", 2)); - } - validateTrade(sign, 2, ess); - return true; - } - - @Override - protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException - { - final Trade charge = getTrade(sign, 2, ess); - charge.isAffordableFor(player); - - Commandrepair command = new Commandrepair(); - command.init(ess, "repair"); - String[] args = new String[] - { - sign.getLine(1) - }; - try - { - command.run(player, "repair", args); - } - catch (Exception ex) - { - throw new SignException(ex.getMessage(), ex); - } - charge.charge(player); - return true; - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignSell.java b/EssentialsSigns/src/net/ess3/signs/SignSell.java deleted file mode 100644 index 9a48e4948..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignSell.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.ess3.signs; - -import net.ess3.api.ChargeException; -import net.ess3.api.IEssentials; -import net.ess3.api.IUser; -import net.ess3.economy.Trade; - - -public class SignSell extends EssentialsSign -{ - public SignSell() - { - super("Sell"); - } - - @Override - protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException - { - validateTrade(sign, 1, 2, player, ess); - validateTrade(sign, 3, ess); - return true; - } - - @Override - protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException - { - final Trade charge = getTrade(sign, 1, 2, player, ess); - final Trade money = getTrade(sign, 3, ess); - charge.isAffordableFor(player); - money.pay(player); - charge.charge(player); - Trade.log("Sign", "Sell", "Interact", username, charge, username, money, sign.getBlock().getLocation(), ess); - return true; - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignSpawnmob.java b/EssentialsSigns/src/net/ess3/signs/SignSpawnmob.java deleted file mode 100644 index 47961a96e..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignSpawnmob.java +++ /dev/null @@ -1,48 +0,0 @@ -package net.ess3.signs; - -import net.ess3.api.ChargeException; -import net.ess3.api.IEssentials; -import net.ess3.api.IUser; -import net.ess3.commands.Commandspawnmob; -import net.ess3.economy.Trade; - - -public class SignSpawnmob extends EssentialsSign -{ - public SignSpawnmob() - { - super("Spawnmob"); - } - - @Override - protected boolean onSignCreate(ISign sign, IUser player, String username, IEssentials ess) throws SignException, ChargeException - { - validateInteger(sign, 1); - validateTrade(sign, 3, ess); - return true; - } - - //TODO: This should call a method not a command - @Override - protected boolean onSignInteract(ISign sign, IUser player, String username, IEssentials ess) throws SignException, ChargeException - { - final Trade charge = getTrade(sign, 3, ess); - charge.isAffordableFor(player); - Commandspawnmob command = new Commandspawnmob(); - command.init(ess, "spawnmob"); - String[] args = new String[] - { - sign.getLine(2), sign.getLine(1) - }; - try - { - command.run(player, "spawnmob", args); - } - catch (Exception ex) - { - throw new SignException(ex.getMessage(), ex); - } - charge.charge(player); - return true; - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignTime.java b/EssentialsSigns/src/net/ess3/signs/SignTime.java deleted file mode 100644 index 215721b69..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignTime.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.ess3.signs; - -import static net.ess3.I18n._; -import net.ess3.api.ChargeException; -import net.ess3.api.IEssentials; -import net.ess3.api.IUser; -import net.ess3.economy.Trade; -import org.bukkit.World; - - -public class SignTime extends EssentialsSign -{ - public SignTime() - { - super("Time"); - } - - @Override - protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException - { - validateTrade(sign, 2, ess); - final String timeString = sign.getLine(1); - if ("Day".equalsIgnoreCase(timeString)) - { - sign.setLine(1, "§2Day"); - return true; - } - if ("Night".equalsIgnoreCase(timeString)) - { - sign.setLine(1, "§2Night"); - return true; - } - throw new SignException(_("onlyDayNight")); - } - - @Override - protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException - { - final Trade charge = getTrade(sign, 2, ess); - charge.isAffordableFor(player); - final String timeString = sign.getLine(1); - final World world = player.getPlayer().getWorld(); - long time = world.getTime(); - time -= time % 24000; - if ("§2Day".equalsIgnoreCase(timeString)) - { - world.setTime(time + 24000); - charge.charge(player); - return true; - } - if ("§2Night".equalsIgnoreCase(timeString)) - { - world.setTime(time + 37700); - charge.charge(player); - return true; - } - throw new SignException(_("onlyDayNight")); - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignTrade.java b/EssentialsSigns/src/net/ess3/signs/SignTrade.java deleted file mode 100644 index dc5129cbb..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignTrade.java +++ /dev/null @@ -1,361 +0,0 @@ -package net.ess3.signs; - -import static net.ess3.I18n._; -import net.ess3.api.ChargeException; -import net.ess3.api.IEssentials; -import net.ess3.api.IUser; -import net.ess3.economy.Trade; -import net.ess3.utils.FormatUtil; -import org.bukkit.inventory.ItemStack; - -//TODO: Sell Enchantment on Trade signs? -public class SignTrade extends EssentialsSign -{ - public SignTrade() - { - super("Trade"); - } - - @Override - protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException - { - validateTrade(sign, 1, false, ess); - validateTrade(sign, 2, true, ess); - final Trade charge = getTrade(sign, 2, true, true, ess); - charge.isAffordableFor(player); - sign.setLine(3, "§8" + username); - charge.charge(player); - Trade.log("Sign", "Trade", "Create", username, charge, username, null, sign.getBlock().getLocation(), ess); - return true; - } - - @Override - protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException - { - if (sign.getLine(3).substring(2).equalsIgnoreCase(username)) - { - final Trade store = rechargeSign(sign, ess, player); - Trade stored = null; - try - { - stored = getTrade(sign, 1, true, true, ess); - subtractAmount(sign, 1, stored, ess); - stored.pay(player); - } - catch (SignException e) - { - if (store == null) - { - throw new SignException(_("tradeSignEmptyOwner"), e); - } - } - Trade.log("Sign", "Trade", "OwnerInteract", username, store, username, stored, sign.getBlock().getLocation(), ess); - } - else - { - final Trade charge = getTrade(sign, 1, false, false, ess); - final Trade trade = getTrade(sign, 2, false, true, ess); - charge.isAffordableFor(player); - addAmount(sign, 1, charge, ess); - subtractAmount(sign, 2, trade, ess); - if (!trade.pay(player, false)) - { - subtractAmount(sign, 1, charge, ess); - addAmount(sign, 2, trade, ess); - throw new ChargeException("Full inventory"); - } - charge.charge(player); - Trade.log("Sign", "Trade", "Interact", sign.getLine(3), charge, username, trade, sign.getBlock().getLocation(), ess); - } - sign.updateSign(); - return true; - } - - private Trade rechargeSign(final ISign sign, final IEssentials ess, final IUser player) throws SignException, ChargeException - { - final Trade trade = getTrade(sign, 2, false, false, ess); - ItemStack itemInHand = player.getPlayer().getItemInHand(); - if (trade.getItemStack() != null && itemInHand != null - && trade.getItemStack().getTypeId() == itemInHand.getTypeId() - && trade.getItemStack().getDurability() == itemInHand.getDurability() - && trade.getItemStack().getEnchantments().equals(itemInHand.getEnchantments())) - { - int amount = itemInHand.getAmount(); - amount -= amount % trade.getItemStack().getAmount(); - if (amount > 0) - { - final ItemStack stack = itemInHand.clone(); - stack.setAmount(amount); - final Trade store = new Trade(stack, ess); - addAmount(sign, 2, store, ess); - store.charge(player); - return store; - } - } - return null; - } - - @Override - protected boolean onSignBreak(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException - { - if ((sign.getLine(3).length() > 3 && sign.getLine(3).substring(2).equalsIgnoreCase(username)) - || SignsPermissions.TRADE_OVERRIDE.isAuthorized(player)) - { - try - { - final Trade stored1 = getTrade(sign, 1, true, false, ess); - final Trade stored2 = getTrade(sign, 2, true, false, ess); - stored1.pay(player); - stored2.pay(player); - Trade.log("Sign", "Trade", "Break", username, stored2, username, stored1, sign.getBlock().getLocation(), ess); - } - catch (SignException e) - { - if (SignsPermissions.TRADE_OVERRIDE.isAuthorized(player)) - { - return true; - } - throw e; - } - return true; - } - else - { - return false; - } - } - - protected final void validateTrade(final ISign sign, final int index, final boolean amountNeeded, final IEssentials ess) throws SignException - { - final String line = sign.getLine(index).trim(); - if (line.isEmpty()) - { - throw new SignException("Empty line"); - } - final String[] split = line.split("[ :]+"); - - if (split.length == 1 && !amountNeeded) - { - final Double money = getMoney(split[0]); - if (money != null) - { - if (FormatUtil.shortCurrency(money, ess).length() * 2 > 15) - { - throw new SignException("Line can be too long!"); - } - sign.setLine(index, FormatUtil.shortCurrency(money, ess) + ":0"); - return; - } - } - - if (split.length == 2 && amountNeeded) - { - final Double money = getMoney(split[0]); - Double amount = getDoublePositive(split[1]); - if (money != null && amount != null) - { - amount -= amount % money; - if (amount < 0.01 || money < 0.01) - { - throw new SignException(_("moreThanZero")); - } - sign.setLine(index, FormatUtil.shortCurrency(money, ess) + ":" + FormatUtil.shortCurrency(amount, ess).substring(1)); - return; - } - } - - if (split.length == 2 && !amountNeeded) - { - final int amount = getIntegerPositive(split[0]); - - if (amount < 1) - { - throw new SignException(_("moreThanZero")); - } - if (!(split[1].equalsIgnoreCase("exp") || split[1].equalsIgnoreCase("xp")) - && getItemStack(split[1], amount, ess).getTypeId() == 0) - { - throw new SignException(_("moreThanZero")); - } - String newline = amount + " " + split[1] + ":0"; - if ((newline + amount).length() > 15) - { - throw new SignException("Line can be too long!"); - } - sign.setLine(index, newline); - return; - } - - if (split.length == 3 && amountNeeded) - { - final int stackamount = getIntegerPositive(split[0]); - int amount = getIntegerPositive(split[2]); - amount -= amount % stackamount; - if (amount < 1 || stackamount < 1) - { - throw new SignException(_("moreThanZero")); - } - if (!(split[1].equalsIgnoreCase("exp") || split[1].equalsIgnoreCase("xp")) - && getItemStack(split[1], stackamount, ess).getTypeId() == 0) - { - throw new SignException(_("moreThanZero")); - } - sign.setLine(index, stackamount + " " + split[1] + ":" + amount); - return; - } - throw new SignException(_("invalidSignLine", index + 1)); - } - - protected final Trade getTrade(final ISign sign, final int index, final boolean fullAmount, final boolean notEmpty, final IEssentials ess) throws SignException - { - final String line = sign.getLine(index).trim(); - if (line.isEmpty()) - { - throw new SignException("Empty line"); - } - final String[] split = line.split("[ :]+"); - - if (split.length == 2) - { - try - { - final Double money = getMoney(split[0]); - final Double amount = notEmpty ? getDoublePositive(split[1]) : getDouble(split[1]); - if (money != null && amount != null) - { - return new Trade(fullAmount ? amount : money, ess); - } - } - catch (SignException e) - { - throw new SignException(_("tradeSignEmpty"), e); - } - } - - if (split.length == 3) - { - if (split[1].equalsIgnoreCase("exp") || split[1].equalsIgnoreCase("xp")) - { - final int stackamount = getIntegerPositive(split[0]); - int amount = getInteger(split[2]); - amount -= amount % stackamount; - if (notEmpty && (amount < 1 || stackamount < 1)) - { - throw new SignException(_("tradeSignEmpty")); - } - return new Trade(fullAmount ? amount : stackamount, ess); - } - else - { - final int stackamount = getIntegerPositive(split[0]); - final ItemStack item = getItemStack(split[1], stackamount, ess); - int amount = getInteger(split[2]); - amount -= amount % stackamount; - if (notEmpty && (amount < 1 || stackamount < 1 || item.getTypeId() == 0)) - { - throw new SignException(_("tradeSignEmpty")); - } - item.setAmount(fullAmount ? amount : stackamount); - return new Trade(item, ess); - } - } - throw new SignException(_("invalidSignLine", index + 1)); - } - - protected final void subtractAmount(final ISign sign, final int index, final Trade trade, final IEssentials ess) throws SignException - { - final Double money = trade.getMoney(); - if (money != null) - { - changeAmount(sign, index, -money, ess); - } - final ItemStack item = trade.getItemStack(); - if (item != null) - { - changeAmount(sign, index, -item.getAmount(), ess); - } - final Integer exp = trade.getExperience(); - if (exp != null) - { - changeAmount(sign, index, -exp.intValue(), ess); - } - } - - protected final void addAmount(final ISign sign, final int index, final Trade trade, final IEssentials ess) throws SignException - { - final Double money = trade.getMoney(); - if (money != null) - { - changeAmount(sign, index, money, ess); - } - final ItemStack item = trade.getItemStack(); - if (item != null) - { - changeAmount(sign, index, item.getAmount(), ess); - } - final Integer exp = trade.getExperience(); - if (exp != null) - { - changeAmount(sign, index, exp.intValue(), ess); - } - } - - //TODO: Translate these exceptions. - private void changeAmount(final ISign sign, final int index, final double value, final IEssentials ess) throws SignException - { - - final String line = sign.getLine(index).trim(); - if (line.isEmpty()) - { - throw new SignException("Empty line"); - } - final String[] split = line.split("[ :]+"); - - if (split.length == 2) - { - final Double money = getMoney(split[0]); - final Double amount = getDouble(split[1]); - if (money != null && amount != null) - { - final String newline = FormatUtil.shortCurrency(money, ess) + ":" + FormatUtil.shortCurrency(amount + value, ess).substring(1); - if (newline.length() > 15) - { - throw new SignException("This sign is full: Line too long!"); - } - sign.setLine(index, newline); - return; - } - } - - if (split.length == 3) - { - if (split[1].equalsIgnoreCase("exp") || split[1].equalsIgnoreCase("xp")) - { - final int stackamount = getIntegerPositive(split[0]); - final int amount = getInteger(split[2]); - final String newline = stackamount + " " + split[1] + ":" + (amount + Math.round(value)); - if (newline.length() > 15) - { - throw new SignException("This sign is full: Line too long!"); - } - sign.setLine(index, newline); - return; - } - else - { - final int stackamount = getIntegerPositive(split[0]); - //TODO: Unused local variable - final ItemStack item = getItemStack(split[1], stackamount, ess); - final int amount = getInteger(split[2]); - final String newline = stackamount + " " + split[1] + ":" + (amount + Math.round(value)); - if (newline.length() > 15) - { - throw new SignException("This sign is full: Line too long!"); - } - sign.setLine(index, newline); - return; - } - } - throw new SignException(_("invalidSignLine", index + 1)); - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignWarp.java b/EssentialsSigns/src/net/ess3/signs/SignWarp.java deleted file mode 100644 index 7987ce9da..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignWarp.java +++ /dev/null @@ -1,70 +0,0 @@ -package net.ess3.signs; - -import net.ess3.api.ChargeException; -import net.ess3.api.IEssentials; -import net.ess3.api.IUser; -import net.ess3.economy.Trade; -import net.ess3.permissions.Permissions; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; - - -public class SignWarp extends EssentialsSign -{ - public SignWarp() - { - super("Warp"); - } - - @Override - protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException - { - validateTrade(sign, 3, ess); - final String warpName = sign.getLine(1); - - if (warpName.isEmpty()) - { - sign.setLine(1, "§dWarp name!"); - return false; - } - else - { - try - { - ess.getWarps().getWarp(warpName); - } - catch (Exception ex) - { - throw new SignException(ex.getMessage(), ex); - } - final String group = sign.getLine(2); - if ("Everyone".equalsIgnoreCase(group) || "Everybody".equalsIgnoreCase(group)) - { - sign.setLine(2, "§2Everyone"); - } - return true; - } - } - - @Override - protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException - { - final String warpName = sign.getLine(1); - final String group = sign.getLine(2); - - if ((!group.isEmpty() && ("§2Everyone".equals(group) || ess.getRanks().inGroup(player, group))) - || (group.isEmpty() && Permissions.WARPS.isAuthorized(player, warpName))) - { - final Trade charge = getTrade(sign, 3, ess); - try - { - player.getTeleport().warp(warpName, charge, TeleportCause.PLUGIN); - } - catch (Exception ex) - { - throw new SignException(ex.getMessage(), ex); - } - return true; - } - return false; - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignWeather.java b/EssentialsSigns/src/net/ess3/signs/SignWeather.java deleted file mode 100644 index 18aa1f567..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignWeather.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.ess3.signs; - -import static net.ess3.I18n._; -import net.ess3.api.ChargeException; -import net.ess3.api.IEssentials; -import net.ess3.api.IUser; -import net.ess3.economy.Trade; -import org.bukkit.World; - - -public class SignWeather extends EssentialsSign -{ - public SignWeather() - { - super("Weather"); - } - - @Override - protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException - { - validateTrade(sign, 2, ess); - final String timeString = sign.getLine(1); - if ("Sun".equalsIgnoreCase(timeString)) - { - sign.setLine(1, "§2Sun"); - return true; - } - if ("Storm".equalsIgnoreCase(timeString)) - { - sign.setLine(1, "§2Storm"); - return true; - } - throw new SignException(_("onlySunStorm")); - } - - @Override - protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException - { - final Trade charge = getTrade(sign, 2, ess); - charge.isAffordableFor(player); - final String weatherString = sign.getLine(1); - final World world = player.getPlayer().getWorld(); - if ("§2Sun".equalsIgnoreCase(weatherString)) - { - world.setStorm(false); - charge.charge(player); - return true; - } - if ("§2Storm".equalsIgnoreCase(weatherString)) - { - world.setStorm(true); - charge.charge(player); - return true; - } - throw new SignException(_("onlySunStorm")); - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/Signs.java b/EssentialsSigns/src/net/ess3/signs/Signs.java index 5f7dc702b..a81bd2e55 100644 --- a/EssentialsSigns/src/net/ess3/signs/Signs.java +++ b/EssentialsSigns/src/net/ess3/signs/Signs.java @@ -1,5 +1,23 @@ package net.ess3.signs; +import net.ess3.signs.signs.SignMail; +import net.ess3.signs.signs.SignDisposal; +import net.ess3.signs.signs.SignBuy; +import net.ess3.signs.signs.SignWarp; +import net.ess3.signs.signs.SignSpawnmob; +import net.ess3.signs.signs.SignTime; +import net.ess3.signs.signs.SignWeather; +import net.ess3.signs.signs.SignEnchant; +import net.ess3.signs.signs.SignHeal; +import net.ess3.signs.signs.SignFree; +import net.ess3.signs.signs.SignInfo; +import net.ess3.signs.signs.SignBalance; +import net.ess3.signs.signs.SignSell; +import net.ess3.signs.signs.SignGameMode; +import net.ess3.signs.signs.SignKit; +import net.ess3.signs.signs.SignTrade; +import net.ess3.signs.signs.SignRepair; + public enum Signs { diff --git a/EssentialsSigns/src/net/ess3/signs/SignsConfig.java b/EssentialsSigns/src/net/ess3/signs/SignsConfig.java deleted file mode 100644 index 2db26f9c0..000000000 --- a/EssentialsSigns/src/net/ess3/signs/SignsConfig.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.ess3.signs; - -import java.util.Collections; -import java.util.Map; -import net.ess3.storage.StorageObject; - - -public class SignsConfig implements StorageObject -{ - private Map signs; - - public Map getSigns() - { - return signs == null - ? Collections.emptyMap() - : Collections.unmodifiableMap(signs); - } - - public void setSigns(final Map signs) - { - this.signs = signs; - } -} diff --git a/EssentialsSigns/src/net/ess3/signs/SignsConfigHolder.java b/EssentialsSigns/src/net/ess3/signs/SignsConfigHolder.java index 5f3a767f7..51937ee77 100644 --- a/EssentialsSigns/src/net/ess3/signs/SignsConfigHolder.java +++ b/EssentialsSigns/src/net/ess3/signs/SignsConfigHolder.java @@ -7,7 +7,7 @@ import net.ess3.storage.AsyncStorageObjectHolder; import org.bukkit.plugin.Plugin; -public class SignsConfigHolder extends AsyncStorageObjectHolder +public class SignsConfigHolder extends AsyncStorageObjectHolder { private final transient Plugin plugin; private Set enabledSigns = new HashSet(); @@ -15,7 +15,7 @@ public class SignsConfigHolder extends AsyncStorageObjectHolder public SignsConfigHolder(final IEssentials ess, final Plugin plugin) { - super(ess, SignsConfig.class, new File(plugin.getDataFolder(), "config.yml")); + super(ess, SignConfig.class, new File(plugin.getDataFolder(), "signs.yml")); this.plugin = plugin; onReload(); final Map signs = getData().getSigns(); diff --git a/EssentialsSigns/src/net/ess3/signs/SignsPermissions.java b/EssentialsSigns/src/net/ess3/signs/SignsPermissions.java index 7070bbb88..b9630e8ec 100644 --- a/EssentialsSigns/src/net/ess3/signs/SignsPermissions.java +++ b/EssentialsSigns/src/net/ess3/signs/SignsPermissions.java @@ -8,7 +8,6 @@ import net.ess3.permissions.DotStarPermission; public class SignsPermissions { public static final IPermission COLOR = new BasePermission("essentials.signs.", "color"); - public static final IPermission PROTECTION_OVERRIDE = new BasePermission("essentials.signs.protection.", "override"); public static final IPermission TRADE_OVERRIDE = new BasePermission("essentials.signs.trade.", "override"); public static final DotStarPermission CREATE = new DotStarPermission("essentials.signs.create"); public static final DotStarPermission USE = new DotStarPermission("essentials.signs.use"); diff --git a/EssentialsSigns/src/net/ess3/signs/listeners/SignBlockListener.java b/EssentialsSigns/src/net/ess3/signs/listeners/SignBlockListener.java new file mode 100644 index 000000000..9deea4de1 --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/listeners/SignBlockListener.java @@ -0,0 +1,267 @@ +package net.ess3.signs.listeners; + +import java.util.logging.Level; +import java.util.logging.Logger; +import net.ess3.api.IEssentials; +import net.ess3.api.ISettings; +import net.ess3.api.IUser; +import net.ess3.permissions.Permissions; +import net.ess3.signs.EssentialsSign; +import net.ess3.signs.ISignsPlugin; +import net.ess3.signs.Signs; +import net.ess3.utils.FormatUtil; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.Sign; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.*; + + +public class SignBlockListener implements Listener +{ + private final transient IEssentials ess; + private final transient ISignsPlugin plugin; + private final static Logger LOGGER = Logger.getLogger("Minecraft"); + private final static int WALL_SIGN = Material.WALL_SIGN.getId(); + private final static int SIGN_POST = Material.SIGN_POST.getId(); + + public SignBlockListener(final IEssentials ess, final ISignsPlugin plugin) + { + this.ess = ess; + this.plugin = plugin; + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onBlockBreak(final BlockBreakEvent event) + { + ISettings settings = ess.getSettings(); + if (plugin.getSettings().areSignsDisabled()) + { + return; + } + + if (protectSignsAndBlocks(event.getBlock(), event.getPlayer())) + { + event.setCancelled(true); + } + } + + public boolean protectSignsAndBlocks(final Block block, final Player player) + { + final int mat = block.getTypeId(); + if (mat == SIGN_POST || mat == WALL_SIGN) + { + final Sign csign = (Sign)block.getState(); + + for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) + { + if (csign.getLine(0).equalsIgnoreCase(sign.getSuccessName()) + && !sign.onSignBreak(block, player, ess)) + { + return true; + } + } + } + // prevent any signs be broken by destroying the block they are attached to + if (EssentialsSign.checkIfBlockBreaksSigns(block)) + { + LOGGER.log(Level.INFO, "Prevented that a block was broken next to a sign."); + return true; + } + for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) + { + if (sign.getBlocks().contains(block.getType()) + && !sign.onBlockBreak(block, player, ess)) + { + LOGGER.log(Level.INFO, "A block was protected by a sign."); + return true; + } + } + return false; + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onSignChange(final SignChangeEvent event) + { + if (plugin.getSettings().areSignsDisabled()) + { + return; + } + IUser user = ess.getUserMap().getUser(event.getPlayer()); + + for (int i = 0; i < 4; i++) + { + event.setLine(i, FormatUtil.formatString(user, Permissions.SIGNS, event.getLine(i))); + } + + for (Signs signs : Signs.values()) + { + final EssentialsSign sign = signs.getSign(); + if (event.getLine(0).equalsIgnoreCase(sign.getSuccessName())) + { + event.setCancelled(true); + return; + } + if (event.getLine(0).equalsIgnoreCase(sign.getTemplateName()) + && !sign.onSignCreate(event, ess)) + { + event.setCancelled(true); + return; + } + } + } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onBlockPlace(final BlockPlaceEvent event) + { + if (plugin.getSettings().areSignsDisabled()) + { + return; + } + + final Block against = event.getBlockAgainst(); + if ((against.getTypeId() == WALL_SIGN + || against.getTypeId() == SIGN_POST) + && EssentialsSign.isValidSign(new EssentialsSign.BlockSign(against))) + { + event.setCancelled(true); + return; + } + final Block block = event.getBlock(); + if (block.getTypeId() == WALL_SIGN + || block.getTypeId() == SIGN_POST) + { + return; + } + for (Signs signs : Signs.values()) + { + final EssentialsSign sign = signs.getSign(); + if (sign.getBlocks().contains(block.getType()) + && !sign.onBlockPlace(block, event.getPlayer(), ess)) + { + event.setCancelled(true); + return; + } + } + } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onBlockBurn(final BlockBurnEvent event) + { + if (plugin.getSettings().areSignsDisabled()) + { + return; + } + + final Block block = event.getBlock(); + if (((block.getTypeId() == WALL_SIGN + || block.getTypeId() == SIGN_POST) + && EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block))) + || EssentialsSign.checkIfBlockBreaksSigns(block)) + { + event.setCancelled(true); + return; + } + for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) + { + if (sign.getBlocks().contains(block.getType()) + && !sign.onBlockBurn(block, ess)) + { + event.setCancelled(true); + return; + } + } + } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onBlockIgnite(final BlockIgniteEvent event) + { + if (plugin.getSettings().areSignsDisabled()) + { + return; + } + + final Block block = event.getBlock(); + if (((block.getTypeId() == WALL_SIGN + || block.getTypeId() == SIGN_POST) + && EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block))) + || EssentialsSign.checkIfBlockBreaksSigns(block)) + { + event.setCancelled(true); + return; + } + for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) + { + if (sign.getBlocks().contains(block.getType()) + && !sign.onBlockIgnite(block, ess)) + { + event.setCancelled(true); + return; + } + } + } + + @EventHandler(priority = EventPriority.LOW) + public void onBlockPistonExtend(final BlockPistonExtendEvent event) + { + if (plugin.getSettings().areSignsDisabled()) + { + return; + } + + for (Block block : event.getBlocks()) + { + if (((block.getTypeId() == WALL_SIGN + || block.getTypeId() == SIGN_POST) + && EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block))) + || EssentialsSign.checkIfBlockBreaksSigns(block)) + { + event.setCancelled(true); + return; + } + for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) + { + if (sign.getBlocks().contains(block.getType()) + && !sign.onBlockPush(block, ess)) + { + event.setCancelled(true); + return; + } + } + } + } + + @EventHandler(priority = EventPriority.LOW) + public void onBlockPistonRetract(final BlockPistonRetractEvent event) + { + if (plugin.getSettings().areSignsDisabled()) + { + return; + } + + if (event.isSticky()) + { + final Block block = event.getBlock(); + if (((block.getTypeId() == WALL_SIGN + || block.getTypeId() == SIGN_POST) + && EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block))) + || EssentialsSign.checkIfBlockBreaksSigns(block)) + { + event.setCancelled(true); + return; + } + for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) + { + if (sign.getBlocks().contains(block.getType()) + && !sign.onBlockPush(block, ess)) + { + event.setCancelled(true); + return; + } + } + } + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/listeners/SignEntityListener.java b/EssentialsSigns/src/net/ess3/signs/listeners/SignEntityListener.java new file mode 100644 index 000000000..2be907813 --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/listeners/SignEntityListener.java @@ -0,0 +1,82 @@ +package net.ess3.signs.listeners; + +import net.ess3.api.IEssentials; +import net.ess3.signs.EssentialsSign; +import net.ess3.signs.ISignsPlugin; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityChangeBlockEvent; +import org.bukkit.event.entity.EntityExplodeEvent; + + +public class SignEntityListener implements Listener +{ + private final transient IEssentials ess; + private final transient ISignsPlugin plugin; + + public SignEntityListener(final IEssentials ess, final ISignsPlugin plugin) + { + this.ess = ess; + this.plugin = plugin; + } + + @EventHandler(priority = EventPriority.LOW) + public void onEntityExplode(final EntityExplodeEvent event) + { + if (plugin.getSettings().areSignsDisabled()) + { + return; + } + + for (Block block : event.blockList()) + { + if (((block.getTypeId() == Material.WALL_SIGN.getId() + || block.getTypeId() == Material.SIGN_POST.getId()) + && EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block))) + || EssentialsSign.checkIfBlockBreaksSigns(block)) + { + event.setCancelled(true); + return; + } + for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) + { + if (sign.getBlocks().contains(block.getType())) + { + event.setCancelled(!sign.onBlockExplode(block, ess)); + return; + } + } + } + } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onEntityChangeBlock(final EntityChangeBlockEvent event) + { + if (plugin.getSettings().areSignsDisabled()) + { + return; + } + + final Block block = event.getBlock(); + if (((block.getTypeId() == Material.WALL_SIGN.getId() + || block.getTypeId() == Material.SIGN_POST.getId()) + && EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block))) + || EssentialsSign.checkIfBlockBreaksSigns(block)) + { + event.setCancelled(true); + return; + } + for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) + { + if (sign.getBlocks().contains(block.getType()) + && !sign.onBlockBreak(block, ess)) + { + event.setCancelled(true); + return; + } + } + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/listeners/SignPlayerListener.java b/EssentialsSigns/src/net/ess3/signs/listeners/SignPlayerListener.java new file mode 100644 index 000000000..8c6fc6899 --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/listeners/SignPlayerListener.java @@ -0,0 +1,67 @@ +package net.ess3.signs.listeners; + +import net.ess3.api.IEssentials; +import net.ess3.signs.EssentialsSign; +import net.ess3.signs.ISignsPlugin; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.Sign; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; + + +public class SignPlayerListener implements Listener +{ + private final transient IEssentials ess; + private final transient ISignsPlugin plugin; + + public SignPlayerListener(final IEssentials ess, final ISignsPlugin plugin) + { + this.ess = ess; + this.plugin = plugin; + } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onPlayerInteract(final PlayerInteractEvent event) + { + if (plugin.getSettings().areSignsDisabled() || event.getAction() != Action.RIGHT_CLICK_BLOCK) + { + return; + } + final Block block = event.getClickedBlock(); + if (block == null) + { + return; + } + + final int mat = block.getTypeId(); + if (mat == Material.SIGN_POST.getId() || mat == Material.WALL_SIGN.getId()) + { + final Sign csign = (Sign)block.getState(); + for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) + { + if (csign.getLine(0).equalsIgnoreCase(sign.getSuccessName())) + { + sign.onSignInteract(block, event.getPlayer(), ess, plugin); + event.setCancelled(true); + return; + } + } + } + else + { + for (EssentialsSign sign : plugin.getSettings().getEnabledSigns()) + { + if (sign.getBlocks().contains(block.getType()) + && !sign.onBlockInteract(block, event.getPlayer(), ess)) + { + event.setCancelled(true); + return; + } + } + } + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/signs/SignBalance.java b/EssentialsSigns/src/net/ess3/signs/signs/SignBalance.java new file mode 100644 index 000000000..814a9b5dc --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/signs/SignBalance.java @@ -0,0 +1,23 @@ +package net.ess3.signs.signs; + +import static net.ess3.I18n._; +import net.ess3.api.IEssentials; +import net.ess3.api.IUser; +import net.ess3.signs.EssentialsSign; +import net.ess3.utils.FormatUtil; + + +public class SignBalance extends EssentialsSign +{ + public SignBalance() + { + super("Balance"); + } + + @Override + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException + { + player.sendMessage(_("balance", FormatUtil.displayCurrency(player.getMoney(), ess))); + return true; + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/signs/SignBuy.java b/EssentialsSigns/src/net/ess3/signs/signs/SignBuy.java new file mode 100644 index 000000000..64b194515 --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/signs/SignBuy.java @@ -0,0 +1,39 @@ +package net.ess3.signs.signs; + +import net.ess3.api.ChargeException; +import net.ess3.api.IEssentials; +import net.ess3.api.IUser; +import net.ess3.economy.Trade; +import net.ess3.signs.EssentialsSign; + + +public class SignBuy extends EssentialsSign +{ + public SignBuy() + { + super("Buy"); + } + + @Override + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException + { + validateTrade(sign, 1, 2, player, ess); + validateTrade(sign, 3, ess); + return true; + } + + @Override + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException + { + final Trade items = getTrade(sign, 1, 2, player, ess); + final Trade charge = getTrade(sign, 3, ess); + charge.isAffordableFor(player); + if (!items.pay(player, false)) + { + throw new ChargeException("Inventory full"); + } + charge.charge(player); + Trade.log("Sign", "Buy", "Interact", username, charge, username, items, sign.getBlock().getLocation(), ess); + return true; + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/signs/SignDisposal.java b/EssentialsSigns/src/net/ess3/signs/signs/SignDisposal.java new file mode 100644 index 000000000..c637467c2 --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/signs/SignDisposal.java @@ -0,0 +1,24 @@ +package net.ess3.signs.signs; + +import net.ess3.api.IEssentials; +import net.ess3.api.IUser; +import net.ess3.signs.EssentialsSign; + + +public class SignDisposal extends EssentialsSign +{ + public SignDisposal() + { + super("Disposal"); + } + + @Override + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) + { + player.sendMessage("Bukkit broke this sign :("); + //TODO: wait for a fix in bukkit + //Problem: Items can be duplicated + //player.getBase().openInventory(ess.getServer().createInventory(player, 36)); + return true; + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/signs/SignEnchant.java b/EssentialsSigns/src/net/ess3/signs/signs/SignEnchant.java new file mode 100644 index 000000000..365de9557 --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/signs/SignEnchant.java @@ -0,0 +1,120 @@ +package net.ess3.signs.signs; + +import java.util.Locale; +import static net.ess3.I18n._; +import net.ess3.api.ChargeException; +import net.ess3.api.IEssentials; +import net.ess3.api.IUser; +import net.ess3.bukkit.Enchantments; +import net.ess3.economy.Trade; +import net.ess3.signs.EssentialsSign; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; + + +public class SignEnchant extends EssentialsSign +{ + public SignEnchant() + { + super("Enchant"); + } + + @Override + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException + { + final ItemStack stack = sign.getLine(1).equals("*") || sign.getLine(1).equalsIgnoreCase("any") ? null : getItemStack(sign.getLine(1), 1, ess); + final String[] enchantLevel = sign.getLine(2).split(":"); + if (enchantLevel.length != 2) + { + throw new SignException(_("invalidSignLine", 3)); + } + final Enchantment enchantment = Enchantments.getByName(enchantLevel[0]); + if (enchantment == null) + { + throw new SignException(_("enchantmentNotFound")); + } + int level; + try + { + level = Integer.parseInt(enchantLevel[1]); + } + catch (NumberFormatException ex) + { + throw new SignException(ex.getMessage(), ex); + } + if (level < 1 || level > enchantment.getMaxLevel()) + { + level = enchantment.getMaxLevel(); + sign.setLine(2, enchantLevel[0] + ":" + level); + } + try + { + if (stack != null) + { + stack.addEnchantment(enchantment, level); + } + } + catch (Throwable ex) + { + throw new SignException(ex.getMessage(), ex); + } + getTrade(sign, 3, ess); + return true; + } + + @Override + protected boolean onSignInteract(ISign sign, IUser player, String username, IEssentials ess) throws SignException, ChargeException + { + final ItemStack search = sign.getLine(1).equals("*") || sign.getLine(1).equalsIgnoreCase("any") ? null : getItemStack(sign.getLine(1), 1, ess); + int slot = -1; + final Trade charge = getTrade(sign, 3, ess); + charge.isAffordableFor(player); + final String[] enchantLevel = sign.getLine(2).split(":"); + if (enchantLevel.length != 2) + { + throw new SignException(_("invalidSignLine", 3)); + } + final Enchantment enchantment = Enchantments.getByName(enchantLevel[0]); + if (enchantment == null) + { + throw new SignException(_("enchantmentNotFound")); + } + int level; + try + { + level = Integer.parseInt(enchantLevel[1]); + } + catch (NumberFormatException ex) + { + level = enchantment.getMaxLevel(); + } + + final ItemStack playerHand = player.getPlayer().getItemInHand(); + if (playerHand == null + || playerHand.getAmount() != 1 + || (playerHand.containsEnchantment(enchantment) + && playerHand.getEnchantmentLevel(enchantment) == level)) + { + throw new SignException(_("missingItems", 1, sign.getLine(1))); + } + if (search != null && playerHand.getType() != search.getType()) + { + throw new SignException(_("missingItems", 1, search.getType().toString().toLowerCase(Locale.ENGLISH).replace('_', ' '))); + } + + final ItemStack toEnchant = playerHand; + try + { + toEnchant.addEnchantment(enchantment, level); + } + catch (Exception ex) + { + throw new SignException(ex.getMessage(), ex); + } + + charge.charge(player); + Trade.log("Sign", "Enchant", "Interact", username, charge, username, charge, sign.getBlock().getLocation(), ess); + player.getPlayer().updateInventory(); + return true; + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/signs/SignException.java b/EssentialsSigns/src/net/ess3/signs/signs/SignException.java new file mode 100644 index 000000000..6a32b95bc --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/signs/SignException.java @@ -0,0 +1,15 @@ +package net.ess3.signs.signs; + + +public class SignException extends Exception +{ + public SignException(final String message) + { + super(message); + } + + public SignException(final String message, final Throwable throwable) + { + super(message, throwable); + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/signs/SignFree.java b/EssentialsSigns/src/net/ess3/signs/signs/SignFree.java new file mode 100644 index 000000000..cf7ffed50 --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/signs/SignFree.java @@ -0,0 +1,48 @@ +package net.ess3.signs.signs; + +import static net.ess3.I18n._; +import net.ess3.api.IEssentials; +import net.ess3.api.IUser; +import net.ess3.craftbukkit.InventoryWorkaround; +import net.ess3.economy.Trade; +import net.ess3.signs.EssentialsSign; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + + +public class SignFree extends EssentialsSign +{ + public SignFree() + { + super("Free"); + } + + @Override + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException + { + getItemStack(sign.getLine(1), 1, ess); + return true; + } + + @Override + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException + { + final ItemStack item = getItemStack(sign.getLine(1), 1, ess); + if (item.getType() == Material.AIR) + { + throw new SignException(_("cantSpawnItem", "Air")); + } + + item.setAmount(item.getType().getMaxStackSize()); + InventoryWorkaround.addItem(player.getPlayer().getInventory(), true, item); + player.sendMessage("Item added to your inventory."); + player.getPlayer().updateInventory(); + //TODO: wait for a fix in bukkit + //Problem: Items can be duplicated + //Inventory i = ess.getServer().createInventory(player, InventoryType.CHEST); + //i.addItem(item); + //player.openInventory(i); + Trade.log("Sign", "Free", "Interact", username, null, username, new Trade(item, ess), sign.getBlock().getLocation(), ess); + return true; + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/signs/SignGameMode.java b/EssentialsSigns/src/net/ess3/signs/signs/SignGameMode.java new file mode 100644 index 000000000..52972e9cd --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/signs/SignGameMode.java @@ -0,0 +1,52 @@ +package net.ess3.signs.signs; + +import java.util.Locale; +import static net.ess3.I18n._; +import net.ess3.api.ChargeException; +import net.ess3.api.IEssentials; +import net.ess3.api.IUser; +import net.ess3.economy.Trade; +import net.ess3.signs.EssentialsSign; +import org.bukkit.GameMode; + + +public class SignGameMode extends EssentialsSign +{ + public SignGameMode() + { + super("GameMode"); + } + + @Override + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException + { + final String gamemode = sign.getLine(1); + if (gamemode.isEmpty()) + { + sign.setLine(1, "Survival"); + } + + validateTrade(sign, 2, ess); + + return true; + } + + @Override + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException + { + final Trade charge = getTrade(sign, 2, ess); + final String mode = sign.getLine(1).trim(); + + if (mode.isEmpty()) + { + throw new SignException(_("invalidSignLine", 2)); + } + charge.isAffordableFor(player); + + //this needs to be fixed + player.getPlayer().setGameMode(player.getPlayer().getGameMode() == GameMode.SURVIVAL ? GameMode.CREATIVE : GameMode.SURVIVAL); + player.sendMessage(_("gameMode", _(player.getPlayer().getGameMode().toString().toLowerCase(Locale.ENGLISH)), player.getPlayer().getDisplayName())); + charge.charge(player); + return true; + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/signs/SignHeal.java b/EssentialsSigns/src/net/ess3/signs/signs/SignHeal.java new file mode 100644 index 000000000..470145abf --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/signs/SignHeal.java @@ -0,0 +1,37 @@ +package net.ess3.signs.signs; + +import static net.ess3.I18n._; +import net.ess3.api.ChargeException; +import net.ess3.api.IEssentials; +import net.ess3.api.IUser; +import net.ess3.economy.Trade; +import net.ess3.signs.EssentialsSign; + + +public class SignHeal extends EssentialsSign +{ + public SignHeal() + { + super("Heal"); + } + + @Override + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException + { + validateTrade(sign, 1, ess); + return true; + } + + @Override + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException + { + final Trade charge = getTrade(sign, 1, ess); + charge.isAffordableFor(player); + player.getPlayer().setHealth(20); + player.getPlayer().setFoodLevel(20); + player.getPlayer().setFireTicks(0); + player.sendMessage(_("youAreHealed")); + charge.charge(player); + return true; + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/signs/SignInfo.java b/EssentialsSigns/src/net/ess3/signs/signs/SignInfo.java new file mode 100644 index 000000000..634959c6d --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/signs/SignInfo.java @@ -0,0 +1,55 @@ +package net.ess3.signs.signs; + +import java.io.IOException; +import net.ess3.api.ChargeException; +import net.ess3.api.IEssentials; +import net.ess3.api.IUser; +import net.ess3.economy.Trade; +import net.ess3.signs.EssentialsSign; +import net.ess3.utils.textreader.IText; +import net.ess3.utils.textreader.KeywordReplacer; +import net.ess3.utils.textreader.TextInput; +import net.ess3.utils.textreader.TextPager; + + +public class SignInfo extends EssentialsSign +{ + public SignInfo() + { + super("Info"); + } + + @Override + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException + { + validateTrade(sign, 3, ess); + return true; + } + + @Override + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException + { + final Trade charge = getTrade(sign, 3, ess); + charge.isAffordableFor(player); + + String chapter = sign.getLine(1); + String page = sign.getLine(2); + + final IText input; + try + { + input = new TextInput(player, "info", true, ess); + final IText output = new KeywordReplacer(input, player, ess); + final TextPager pager = new TextPager(output); + pager.showPage(chapter, page, null, player); + + } + catch (IOException ex) + { + throw new SignException(ex.getMessage(), ex); + } + + charge.charge(player); + return true; + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/signs/SignKit.java b/EssentialsSigns/src/net/ess3/signs/signs/SignKit.java new file mode 100644 index 000000000..ed8fb075b --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/signs/SignKit.java @@ -0,0 +1,76 @@ +package net.ess3.signs.signs; + +import java.util.Locale; +import net.ess3.api.ChargeException; +import net.ess3.api.IEssentials; +import net.ess3.api.IUser; +import net.ess3.economy.Trade; +import net.ess3.permissions.Permissions; +import net.ess3.settings.Kit; +import net.ess3.signs.EssentialsSign; + + +public class SignKit extends EssentialsSign +{ + public SignKit() + { + super("Kit"); + } + + @Override + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException + { + validateTrade(sign, 3, ess); + + final String kitName = sign.getLine(1).toLowerCase(Locale.ENGLISH); + + if (kitName.isEmpty()) + { + sign.setLine(1, "§dKit name!"); + return false; + } + else + { + try + { + ess.getKits().getKit(kitName); + } + catch (Exception ex) + { + throw new SignException(ex.getMessage(), ex); + } + final String group = sign.getLine(2); + if ("Everyone".equalsIgnoreCase(group) || "Everybody".equalsIgnoreCase(group)) + { + sign.setLine(2, "§2Everyone"); + } + return true; + } + } + + @Override + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException + { + final String kitName = sign.getLine(1).toLowerCase(Locale.ENGLISH); + final String group = sign.getLine(2); + if ((!group.isEmpty() && ("§2Everyone".equals(group) || ess.getRanks().inGroup(player, group))) + || (group.isEmpty() && Permissions.KITS.isAuthorized(player, kitName))) + { + final Trade charge = getTrade(sign, 3, ess); + charge.isAffordableFor(player); + try + {; + final Kit kit = ess.getKits().getKit(kitName); + ess.getKits().checkTime(player, kit); + ess.getKits().sendKit(player, kit); + charge.charge(player); + } + catch (Exception ex) + { + throw new SignException(ex.getMessage(), ex); + } + return true; + } + return false; + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/signs/SignMail.java b/EssentialsSigns/src/net/ess3/signs/signs/SignMail.java new file mode 100644 index 000000000..2f93aadb0 --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/signs/SignMail.java @@ -0,0 +1,33 @@ +package net.ess3.signs.signs; + +import java.util.List; +import static net.ess3.I18n._; +import net.ess3.api.IEssentials; +import net.ess3.api.IUser; +import net.ess3.signs.EssentialsSign; + + +public class SignMail extends EssentialsSign +{ + public SignMail() + { + super("Mail"); + } + + @Override + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException + { + final List mail = player.getData().getMails(); + if (mail == null || mail.isEmpty()) + { + player.sendMessage(_("noNewMail")); + return false; + } + for (String s : mail) + { + player.sendMessage(s); + } + player.sendMessage(_("markMailAsRead")); + return true; + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/signs/SignRepair.java b/EssentialsSigns/src/net/ess3/signs/signs/SignRepair.java new file mode 100644 index 000000000..5b60c348c --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/signs/SignRepair.java @@ -0,0 +1,58 @@ +package net.ess3.signs.signs; + +import static net.ess3.I18n._; +import net.ess3.api.ChargeException; +import net.ess3.api.IEssentials; +import net.ess3.api.IUser; +import net.ess3.commands.Commandrepair; +import net.ess3.economy.Trade; +import net.ess3.signs.EssentialsSign; + + +public class SignRepair extends EssentialsSign +{ + public SignRepair() + { + super("Repair"); + } + + @Override + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException + { + final String repairTarget = sign.getLine(1); + if (repairTarget.isEmpty()) + { + sign.setLine(1, "Hand"); + } + else if (!repairTarget.equalsIgnoreCase("all") && !repairTarget.equalsIgnoreCase("hand")) + { + throw new SignException(_("invalidSignLine", 2)); + } + validateTrade(sign, 2, ess); + return true; + } + + @Override + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException + { + final Trade charge = getTrade(sign, 2, ess); + charge.isAffordableFor(player); + + Commandrepair command = new Commandrepair(); + command.init(ess, "repair"); + String[] args = new String[] + { + sign.getLine(1) + }; + try + { + command.run(player, "repair", args); + } + catch (Exception ex) + { + throw new SignException(ex.getMessage(), ex); + } + charge.charge(player); + return true; + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/signs/SignSell.java b/EssentialsSigns/src/net/ess3/signs/signs/SignSell.java new file mode 100644 index 000000000..bcebe6cfd --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/signs/SignSell.java @@ -0,0 +1,36 @@ +package net.ess3.signs.signs; + +import net.ess3.api.ChargeException; +import net.ess3.api.IEssentials; +import net.ess3.api.IUser; +import net.ess3.economy.Trade; +import net.ess3.signs.EssentialsSign; + + +public class SignSell extends EssentialsSign +{ + public SignSell() + { + super("Sell"); + } + + @Override + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException + { + validateTrade(sign, 1, 2, player, ess); + validateTrade(sign, 3, ess); + return true; + } + + @Override + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException + { + final Trade charge = getTrade(sign, 1, 2, player, ess); + final Trade money = getTrade(sign, 3, ess); + charge.isAffordableFor(player); + money.pay(player); + charge.charge(player); + Trade.log("Sign", "Sell", "Interact", username, charge, username, money, sign.getBlock().getLocation(), ess); + return true; + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/signs/SignSpawnmob.java b/EssentialsSigns/src/net/ess3/signs/signs/SignSpawnmob.java new file mode 100644 index 000000000..efe602aec --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/signs/SignSpawnmob.java @@ -0,0 +1,49 @@ +package net.ess3.signs.signs; + +import net.ess3.api.ChargeException; +import net.ess3.api.IEssentials; +import net.ess3.api.IUser; +import net.ess3.commands.Commandspawnmob; +import net.ess3.economy.Trade; +import net.ess3.signs.EssentialsSign; + + +public class SignSpawnmob extends EssentialsSign +{ + public SignSpawnmob() + { + super("Spawnmob"); + } + + @Override + protected boolean onSignCreate(ISign sign, IUser player, String username, IEssentials ess) throws SignException, ChargeException + { + validateInteger(sign, 1); + validateTrade(sign, 3, ess); + return true; + } + + //TODO: This should call a method not a command + @Override + protected boolean onSignInteract(ISign sign, IUser player, String username, IEssentials ess) throws SignException, ChargeException + { + final Trade charge = getTrade(sign, 3, ess); + charge.isAffordableFor(player); + Commandspawnmob command = new Commandspawnmob(); + command.init(ess, "spawnmob"); + String[] args = new String[] + { + sign.getLine(2), sign.getLine(1) + }; + try + { + command.run(player, "spawnmob", args); + } + catch (Exception ex) + { + throw new SignException(ex.getMessage(), ex); + } + charge.charge(player); + return true; + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/signs/SignTime.java b/EssentialsSigns/src/net/ess3/signs/signs/SignTime.java new file mode 100644 index 000000000..d6d65f76d --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/signs/SignTime.java @@ -0,0 +1,60 @@ +package net.ess3.signs.signs; + +import static net.ess3.I18n._; +import net.ess3.api.ChargeException; +import net.ess3.api.IEssentials; +import net.ess3.api.IUser; +import net.ess3.economy.Trade; +import net.ess3.signs.EssentialsSign; +import org.bukkit.World; + + +public class SignTime extends EssentialsSign +{ + public SignTime() + { + super("Time"); + } + + @Override + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException + { + validateTrade(sign, 2, ess); + final String timeString = sign.getLine(1); + if ("Day".equalsIgnoreCase(timeString)) + { + sign.setLine(1, "§2Day"); + return true; + } + if ("Night".equalsIgnoreCase(timeString)) + { + sign.setLine(1, "§2Night"); + return true; + } + throw new SignException(_("onlyDayNight")); + } + + @Override + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException + { + final Trade charge = getTrade(sign, 2, ess); + charge.isAffordableFor(player); + final String timeString = sign.getLine(1); + final World world = player.getPlayer().getWorld(); + long time = world.getTime(); + time -= time % 24000; + if ("§2Day".equalsIgnoreCase(timeString)) + { + world.setTime(time + 24000); + charge.charge(player); + return true; + } + if ("§2Night".equalsIgnoreCase(timeString)) + { + world.setTime(time + 37700); + charge.charge(player); + return true; + } + throw new SignException(_("onlyDayNight")); + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/signs/SignTrade.java b/EssentialsSigns/src/net/ess3/signs/signs/SignTrade.java new file mode 100644 index 000000000..798fb1733 --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/signs/SignTrade.java @@ -0,0 +1,363 @@ +package net.ess3.signs.signs; + +import static net.ess3.I18n._; +import net.ess3.api.ChargeException; +import net.ess3.api.IEssentials; +import net.ess3.api.IUser; +import net.ess3.economy.Trade; +import net.ess3.signs.EssentialsSign; +import net.ess3.signs.SignsPermissions; +import net.ess3.utils.FormatUtil; +import org.bukkit.inventory.ItemStack; + +//TODO: Sell Enchantment on Trade signs? +public class SignTrade extends EssentialsSign +{ + public SignTrade() + { + super("Trade"); + } + + @Override + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException + { + validateTrade(sign, 1, false, ess); + validateTrade(sign, 2, true, ess); + final Trade charge = getTrade(sign, 2, true, true, ess); + charge.isAffordableFor(player); + sign.setLine(3, "§8" + username); + charge.charge(player); + Trade.log("Sign", "Trade", "Create", username, charge, username, null, sign.getBlock().getLocation(), ess); + return true; + } + + @Override + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException + { + if (sign.getLine(3).substring(2).equalsIgnoreCase(username)) + { + final Trade store = rechargeSign(sign, ess, player); + Trade stored = null; + try + { + stored = getTrade(sign, 1, true, true, ess); + subtractAmount(sign, 1, stored, ess); + stored.pay(player); + } + catch (SignException e) + { + if (store == null) + { + throw new SignException(_("tradeSignEmptyOwner"), e); + } + } + Trade.log("Sign", "Trade", "OwnerInteract", username, store, username, stored, sign.getBlock().getLocation(), ess); + } + else + { + final Trade charge = getTrade(sign, 1, false, false, ess); + final Trade trade = getTrade(sign, 2, false, true, ess); + charge.isAffordableFor(player); + addAmount(sign, 1, charge, ess); + subtractAmount(sign, 2, trade, ess); + if (!trade.pay(player, false)) + { + subtractAmount(sign, 1, charge, ess); + addAmount(sign, 2, trade, ess); + throw new ChargeException("Full inventory"); + } + charge.charge(player); + Trade.log("Sign", "Trade", "Interact", sign.getLine(3), charge, username, trade, sign.getBlock().getLocation(), ess); + } + sign.updateSign(); + return true; + } + + private Trade rechargeSign(final ISign sign, final IEssentials ess, final IUser player) throws SignException, ChargeException + { + final Trade trade = getTrade(sign, 2, false, false, ess); + ItemStack itemInHand = player.getPlayer().getItemInHand(); + if (trade.getItemStack() != null && itemInHand != null + && trade.getItemStack().getTypeId() == itemInHand.getTypeId() + && trade.getItemStack().getDurability() == itemInHand.getDurability() + && trade.getItemStack().getEnchantments().equals(itemInHand.getEnchantments())) + { + int amount = itemInHand.getAmount(); + amount -= amount % trade.getItemStack().getAmount(); + if (amount > 0) + { + final ItemStack stack = itemInHand.clone(); + stack.setAmount(amount); + final Trade store = new Trade(stack, ess); + addAmount(sign, 2, store, ess); + store.charge(player); + return store; + } + } + return null; + } + + @Override + protected boolean onSignBreak(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException + { + if ((sign.getLine(3).length() > 3 && sign.getLine(3).substring(2).equalsIgnoreCase(username)) + || SignsPermissions.TRADE_OVERRIDE.isAuthorized(player)) + { + try + { + final Trade stored1 = getTrade(sign, 1, true, false, ess); + final Trade stored2 = getTrade(sign, 2, true, false, ess); + stored1.pay(player); + stored2.pay(player); + Trade.log("Sign", "Trade", "Break", username, stored2, username, stored1, sign.getBlock().getLocation(), ess); + } + catch (SignException e) + { + if (SignsPermissions.TRADE_OVERRIDE.isAuthorized(player)) + { + return true; + } + throw e; + } + return true; + } + else + { + return false; + } + } + + protected final void validateTrade(final ISign sign, final int index, final boolean amountNeeded, final IEssentials ess) throws SignException + { + final String line = sign.getLine(index).trim(); + if (line.isEmpty()) + { + throw new SignException("Empty line"); + } + final String[] split = line.split("[ :]+"); + + if (split.length == 1 && !amountNeeded) + { + final Double money = getMoney(split[0]); + if (money != null) + { + if (FormatUtil.shortCurrency(money, ess).length() * 2 > 15) + { + throw new SignException("Line can be too long!"); + } + sign.setLine(index, FormatUtil.shortCurrency(money, ess) + ":0"); + return; + } + } + + if (split.length == 2 && amountNeeded) + { + final Double money = getMoney(split[0]); + Double amount = getDoublePositive(split[1]); + if (money != null && amount != null) + { + amount -= amount % money; + if (amount < 0.01 || money < 0.01) + { + throw new SignException(_("moreThanZero")); + } + sign.setLine(index, FormatUtil.shortCurrency(money, ess) + ":" + FormatUtil.shortCurrency(amount, ess).substring(1)); + return; + } + } + + if (split.length == 2 && !amountNeeded) + { + final int amount = getIntegerPositive(split[0]); + + if (amount < 1) + { + throw new SignException(_("moreThanZero")); + } + if (!(split[1].equalsIgnoreCase("exp") || split[1].equalsIgnoreCase("xp")) + && getItemStack(split[1], amount, ess).getTypeId() == 0) + { + throw new SignException(_("moreThanZero")); + } + String newline = amount + " " + split[1] + ":0"; + if ((newline + amount).length() > 15) + { + throw new SignException("Line can be too long!"); + } + sign.setLine(index, newline); + return; + } + + if (split.length == 3 && amountNeeded) + { + final int stackamount = getIntegerPositive(split[0]); + int amount = getIntegerPositive(split[2]); + amount -= amount % stackamount; + if (amount < 1 || stackamount < 1) + { + throw new SignException(_("moreThanZero")); + } + if (!(split[1].equalsIgnoreCase("exp") || split[1].equalsIgnoreCase("xp")) + && getItemStack(split[1], stackamount, ess).getTypeId() == 0) + { + throw new SignException(_("moreThanZero")); + } + sign.setLine(index, stackamount + " " + split[1] + ":" + amount); + return; + } + throw new SignException(_("invalidSignLine", index + 1)); + } + + protected final Trade getTrade(final ISign sign, final int index, final boolean fullAmount, final boolean notEmpty, final IEssentials ess) throws SignException + { + final String line = sign.getLine(index).trim(); + if (line.isEmpty()) + { + throw new SignException("Empty line"); + } + final String[] split = line.split("[ :]+"); + + if (split.length == 2) + { + try + { + final Double money = getMoney(split[0]); + final Double amount = notEmpty ? getDoublePositive(split[1]) : getDouble(split[1]); + if (money != null && amount != null) + { + return new Trade(fullAmount ? amount : money, ess); + } + } + catch (SignException e) + { + throw new SignException(_("tradeSignEmpty"), e); + } + } + + if (split.length == 3) + { + if (split[1].equalsIgnoreCase("exp") || split[1].equalsIgnoreCase("xp")) + { + final int stackamount = getIntegerPositive(split[0]); + int amount = getInteger(split[2]); + amount -= amount % stackamount; + if (notEmpty && (amount < 1 || stackamount < 1)) + { + throw new SignException(_("tradeSignEmpty")); + } + return new Trade(fullAmount ? amount : stackamount, ess); + } + else + { + final int stackamount = getIntegerPositive(split[0]); + final ItemStack item = getItemStack(split[1], stackamount, ess); + int amount = getInteger(split[2]); + amount -= amount % stackamount; + if (notEmpty && (amount < 1 || stackamount < 1 || item.getTypeId() == 0)) + { + throw new SignException(_("tradeSignEmpty")); + } + item.setAmount(fullAmount ? amount : stackamount); + return new Trade(item, ess); + } + } + throw new SignException(_("invalidSignLine", index + 1)); + } + + protected final void subtractAmount(final ISign sign, final int index, final Trade trade, final IEssentials ess) throws SignException + { + final Double money = trade.getMoney(); + if (money != null) + { + changeAmount(sign, index, -money, ess); + } + final ItemStack item = trade.getItemStack(); + if (item != null) + { + changeAmount(sign, index, -item.getAmount(), ess); + } + final Integer exp = trade.getExperience(); + if (exp != null) + { + changeAmount(sign, index, -exp.intValue(), ess); + } + } + + protected final void addAmount(final ISign sign, final int index, final Trade trade, final IEssentials ess) throws SignException + { + final Double money = trade.getMoney(); + if (money != null) + { + changeAmount(sign, index, money, ess); + } + final ItemStack item = trade.getItemStack(); + if (item != null) + { + changeAmount(sign, index, item.getAmount(), ess); + } + final Integer exp = trade.getExperience(); + if (exp != null) + { + changeAmount(sign, index, exp.intValue(), ess); + } + } + + //TODO: Translate these exceptions. + private void changeAmount(final ISign sign, final int index, final double value, final IEssentials ess) throws SignException + { + + final String line = sign.getLine(index).trim(); + if (line.isEmpty()) + { + throw new SignException("Empty line"); + } + final String[] split = line.split("[ :]+"); + + if (split.length == 2) + { + final Double money = getMoney(split[0]); + final Double amount = getDouble(split[1]); + if (money != null && amount != null) + { + final String newline = FormatUtil.shortCurrency(money, ess) + ":" + FormatUtil.shortCurrency(amount + value, ess).substring(1); + if (newline.length() > 15) + { + throw new SignException("This sign is full: Line too long!"); + } + sign.setLine(index, newline); + return; + } + } + + if (split.length == 3) + { + if (split[1].equalsIgnoreCase("exp") || split[1].equalsIgnoreCase("xp")) + { + final int stackamount = getIntegerPositive(split[0]); + final int amount = getInteger(split[2]); + final String newline = stackamount + " " + split[1] + ":" + (amount + Math.round(value)); + if (newline.length() > 15) + { + throw new SignException("This sign is full: Line too long!"); + } + sign.setLine(index, newline); + return; + } + else + { + final int stackamount = getIntegerPositive(split[0]); + //TODO: Unused local variable + final ItemStack item = getItemStack(split[1], stackamount, ess); + final int amount = getInteger(split[2]); + final String newline = stackamount + " " + split[1] + ":" + (amount + Math.round(value)); + if (newline.length() > 15) + { + throw new SignException("This sign is full: Line too long!"); + } + sign.setLine(index, newline); + return; + } + } + throw new SignException(_("invalidSignLine", index + 1)); + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/signs/SignWarp.java b/EssentialsSigns/src/net/ess3/signs/signs/SignWarp.java new file mode 100644 index 000000000..08c9795ef --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/signs/SignWarp.java @@ -0,0 +1,71 @@ +package net.ess3.signs.signs; + +import net.ess3.api.ChargeException; +import net.ess3.api.IEssentials; +import net.ess3.api.IUser; +import net.ess3.economy.Trade; +import net.ess3.permissions.Permissions; +import net.ess3.signs.EssentialsSign; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; + + +public class SignWarp extends EssentialsSign +{ + public SignWarp() + { + super("Warp"); + } + + @Override + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException + { + validateTrade(sign, 3, ess); + final String warpName = sign.getLine(1); + + if (warpName.isEmpty()) + { + sign.setLine(1, "§dWarp name!"); + return false; + } + else + { + try + { + ess.getWarps().getWarp(warpName); + } + catch (Exception ex) + { + throw new SignException(ex.getMessage(), ex); + } + final String group = sign.getLine(2); + if ("Everyone".equalsIgnoreCase(group) || "Everybody".equalsIgnoreCase(group)) + { + sign.setLine(2, "§2Everyone"); + } + return true; + } + } + + @Override + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException + { + final String warpName = sign.getLine(1); + final String group = sign.getLine(2); + + if ((!group.isEmpty() && ("§2Everyone".equals(group) || ess.getRanks().inGroup(player, group))) + || (group.isEmpty() && Permissions.WARPS.isAuthorized(player, warpName))) + { + final Trade charge = getTrade(sign, 3, ess); + try + { + player.getTeleport().warp(warpName, charge, TeleportCause.PLUGIN); + } + catch (Exception ex) + { + throw new SignException(ex.getMessage(), ex); + } + return true; + } + return false; + } +} diff --git a/EssentialsSigns/src/net/ess3/signs/signs/SignWeather.java b/EssentialsSigns/src/net/ess3/signs/signs/SignWeather.java new file mode 100644 index 000000000..0d428f11d --- /dev/null +++ b/EssentialsSigns/src/net/ess3/signs/signs/SignWeather.java @@ -0,0 +1,58 @@ +package net.ess3.signs.signs; + +import static net.ess3.I18n._; +import net.ess3.api.ChargeException; +import net.ess3.api.IEssentials; +import net.ess3.api.IUser; +import net.ess3.economy.Trade; +import net.ess3.signs.EssentialsSign; +import org.bukkit.World; + + +public class SignWeather extends EssentialsSign +{ + public SignWeather() + { + super("Weather"); + } + + @Override + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException + { + validateTrade(sign, 2, ess); + final String timeString = sign.getLine(1); + if ("Sun".equalsIgnoreCase(timeString)) + { + sign.setLine(1, "§2Sun"); + return true; + } + if ("Storm".equalsIgnoreCase(timeString)) + { + sign.setLine(1, "§2Storm"); + return true; + } + throw new SignException(_("onlySunStorm")); + } + + @Override + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException + { + final Trade charge = getTrade(sign, 2, ess); + charge.isAffordableFor(player); + final String weatherString = sign.getLine(1); + final World world = player.getPlayer().getWorld(); + if ("§2Sun".equalsIgnoreCase(weatherString)) + { + world.setStorm(false); + charge.charge(player); + return true; + } + if ("§2Storm".equalsIgnoreCase(weatherString)) + { + world.setStorm(true); + charge.charge(player); + return true; + } + throw new SignException(_("onlySunStorm")); + } +} -- cgit v1.2.3