/* * Copyright 2011 Tyler Blair. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and contributors and should not be interpreted as representing official policies, * either expressed or implied, of anybody else. */ package com.griefcraft.modules.modes; import com.griefcraft.lwc.LWC; import com.griefcraft.model.Action; import com.griefcraft.model.LWCPlayer; import com.griefcraft.model.Mode; import com.griefcraft.model.Protection; import com.griefcraft.scripting.JavaModule; import com.griefcraft.scripting.event.LWCBlockInteractEvent; import com.griefcraft.scripting.event.LWCCommandEvent; import com.griefcraft.scripting.event.LWCDropItemEvent; import com.griefcraft.scripting.event.LWCProtectionInteractEvent; import com.herocraftonline.heroes.Heroes; import com.herocraftonline.heroes.characters.Hero; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.command.CommandSender; import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; import java.util.Map; import java.util.Set; public class DropTransferModule extends JavaModule { private LWC lwc; @Override public void load(LWC lwc) { this.lwc = lwc; } /** * Check if the player is currently drop transferring * * @param player * @return */ private boolean isPlayerDropTransferring(LWCPlayer player) { return player.hasMode("+dropTransfer"); } /** * Get the drop transfer target for a player * * @param player * @return */ private int getPlayerDropTransferTarget(LWCPlayer player) { Mode mode = player.getMode("dropTransfer"); if (mode == null) { return -1; } String target = mode.getData(); try { return Integer.parseInt(target); } catch (NumberFormatException e) { } return -1; } @Override @SuppressWarnings("deprecation") public void onDropItem(LWCDropItemEvent event) { Player bPlayer = event.getPlayer(); Item item = event.getEvent().getItemDrop(); ItemStack itemStack = item.getItemStack(); // Heroes try { Plugin heroesPlugin = lwc.getPlugin().getServer().getPluginManager().getPlugin("Heroes"); if (heroesPlugin != null) { Heroes heroes = (Heroes) heroesPlugin; Hero hero = heroes.getCharacterManager().getHero(bPlayer); if (hero != null && hero.isInCombat()) { return; } } } catch (Exception e) { } // MobArena try { Plugin mobarenaPlugin = lwc.getPlugin().getServer().getPluginManager().getPlugin("MobArena"); if (mobarenaPlugin != null) { com.garbagemule.MobArena.MobArena mobarena = (com.garbagemule.MobArena.MobArena) mobarenaPlugin; if (mobarena.getArenaMaster().getArenaAtLocation(bPlayer.getLocation()) != null) { return; } } } catch (Exception e) { } LWCPlayer player = lwc.wrapPlayer(bPlayer); int protectionId = getPlayerDropTransferTarget(player); if (protectionId == -1) { return; } if (!isPlayerDropTransferring(player)) { return; } Protection protection = lwc.getPhysicalDatabase().loadProtection(protectionId); if (protection == null) { lwc.sendLocale(player, "lwc.nolongerexists"); player.disableMode(player.getMode("dropTransfer")); return; } // load the world and the inventory World world = player.getServer().getWorld(protection.getWorld()); if (world == null) { lwc.sendLocale(player, "lwc.invalidworld"); player.disableMode(player.getMode("dropTransfer")); return; } // Don't allow them to transfer items across worlds if (bPlayer.getWorld() != world && !lwc.getConfiguration().getBoolean("modes.droptransfer.crossWorld", false)) { lwc.sendLocale(player, "lwc.dropxfer.acrossworlds"); player.disableMode(player.getMode("dropTransfer")); return; } Block block = world.getBlockAt(protection.getX(), protection.getY(), protection.getZ()); Map<Integer, ItemStack> remaining = lwc.depositItems(block, itemStack); if (remaining.size() > 0) { lwc.sendLocale(player, "lwc.dropxfer.chestfull"); for (ItemStack temp : remaining.values()) { bPlayer.getInventory().addItem(temp); } } bPlayer.updateInventory(); // if they're in the chest and dropping items, this is required item.remove(); } @Override public void onProtectionInteract(LWCProtectionInteractEvent event) { LWC lwc = event.getLWC(); Protection protection = event.getProtection(); Set<String> actions = event.getActions(); boolean canAccess = event.canAccess(); Player bPlayer = event.getPlayer(); LWCPlayer player = lwc.wrapPlayer(bPlayer); if (!actions.contains("dropTransferSelect")) { return; } if (!canAccess) { lwc.sendLocale(player, "protection.interact.dropxfer.noaccess"); } else { int blockId = protection.getBlockId(); if (blockId != Material.CHEST.getId() && blockId != Material.TRAPPED_CHEST.getId()) { lwc.sendLocale(player, "protection.interact.dropxfer.notchest"); player.removeAllActions(); event.setResult(Result.CANCEL); return; } Mode mode = new Mode(); mode.setName("dropTransfer"); mode.setData(protection.getId() + ""); mode.setPlayer(bPlayer); player.enableMode(mode); mode = new Mode(); mode.setName("+dropTransfer"); mode.setPlayer(bPlayer); player.enableMode(mode); lwc.sendLocale(player, "protection.interact.dropxfer.finalize"); } player.removeAllActions(); // ignore the persist mode } @Override public void onBlockInteract(LWCBlockInteractEvent event) { Player player = event.getPlayer(); Set<String> actions = event.getActions(); if (!actions.contains("dropTransferSelect")) { return; } lwc.sendLocale(player, "protection.interact.dropxfer.notprotected"); lwc.removeModes(player); } @Override public void onCommand(LWCCommandEvent event) { if (!event.hasFlag("p", "mode")) { return; } if (event.isCancelled()) { return; } LWC lwc = event.getLWC(); CommandSender sender = event.getSender(); String[] args = event.getArgs(); LWCPlayer player = lwc.wrapPlayer(sender); String mode = args[0].toLowerCase(); if (!mode.equals("droptransfer")) { return; } event.setCancelled(true); // internal name mode = "dropTransfer"; if (args.length < 2) { lwc.sendLocale(player, "protection.modes.dropxfer.help"); return; } String action = args[1].toLowerCase(); String playerName = player.getName(); if (action.equals("select")) { if (isPlayerDropTransferring(player)) { lwc.sendLocale(player, "protection.modes.dropxfer.select.error"); return; } player.disableMode(player.getMode(mode)); Action temp = new Action(); temp.setName("dropTransferSelect"); temp.setPlayer(player); player.addAction(temp); lwc.sendLocale(player, "protection.modes.dropxfer.select.finalize"); } else if (action.equals("on")) { int target = getPlayerDropTransferTarget(player); if (target == -1) { lwc.sendLocale(player, "protection.modes.dropxfer.selectchest"); return; } Mode temp = new Mode(); temp.setName("+dropTransfer"); temp.setPlayer(player.getBukkitPlayer()); player.enableMode(temp); lwc.sendLocale(player, "protection.modes.dropxfer.on.finalize"); } else if (action.equals("off")) { int target = getPlayerDropTransferTarget(player); if (target == -1) { lwc.sendLocale(player, "protection.modes.dropxfer.selectchest"); return; } player.disableMode(player.getMode("+dropTransfer")); lwc.sendLocale(player, "protection.modes.dropxfer.off.finalize"); } else if (action.equals("status")) { if (getPlayerDropTransferTarget(player) == -1) { lwc.sendLocale(player, "protection.modes.dropxfer.status.off"); } else { if (isPlayerDropTransferring(player)) { lwc.sendLocale(player, "protection.modes.dropxfer.status.active"); } else { lwc.sendLocale(player, "protection.modes.dropxfer.status.inactive"); } } } } }