diff --git a/plugin.yml b/plugin.yml index 4914806..7b5fd24 100644 --- a/plugin.yml +++ b/plugin.yml @@ -9,6 +9,10 @@ commands: usage: / aliases: ppl + ppfeed: + description: Feeds prison pearls + usage: / + pplocateany: description: Locates any prison pearl in the world usage: / player @@ -66,33 +70,34 @@ commands: description: Get information about player in a pearl usage: /ppinfo [player] alias: ppi - pploadalts: - description: reload alt lists from file - usage: /pploadalts - ppcheckall: - description: checkban all accounts - usage: /ppcheckall - ppcheck: - description: checkban the player - usage: /ppcheck [player] - - ppsetdist: - description: Sets distance prisoner can move. - - ppsetdamage: - description: Sets damage prisoner receives. - - pptogglespeech: - description: Toggles whether prisoner can talk in public chat. - - pptoggledamage: - description: Toggles whether prisoner can damage players and mobs. - - pptoggleblocks: - description: Toggles whether prisoner can break blocks. - - ppsetmotd: - description: Sets prisoner's MOTD. + pploadalts: + description: reload alt lists from file + usage: /pploadalts + ppcheckall: + description: checkban all accounts + usage: /ppcheckall + ppcheck: + description: checkban the player + usage: /ppcheck [player] + + ppsetdist: + description: Sets distance prisoner can move. + + ppsetdamage: + description: Sets damage prisoner receives. + + pptogglespeech: + description: Toggles whether prisoner can talk in public chat. + + pptoggledamage: + description: Toggles whether prisoner can damage players and mobs. + + pptoggleblocks: + description: Toggles whether prisoner can break blocks. + + ppsetmotd: + description: Sets prisoner's MOTD. + permissions: prisonpearl.*: diff --git a/src/com/untamedears/PrisonPearl/PrisonPearlCommands.java b/src/com/untamedears/PrisonPearl/PrisonPearlCommands.java index 209081a..d3ca136 100644 --- a/src/com/untamedears/PrisonPearl/PrisonPearlCommands.java +++ b/src/com/untamedears/PrisonPearl/PrisonPearlCommands.java @@ -56,165 +56,193 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String return confirmCmd(sender, args); } else if (label.equalsIgnoreCase("ppsilence")) { return silenceCmd(sender, args); - } else if (label.equalsIgnoreCase("pploadalts")) { - return reloadAlts(sender); - } else if (label.equalsIgnoreCase("ppcheckall")) { - return checkAll(sender); - } else if (label.equalsIgnoreCase("ppcheck")) { - return check(sender, args); - } else if (label.equalsIgnoreCase("kill")) { - return kill(); - } else if (label.equalsIgnoreCase("ppsetdist")) { - return setDistCmd(sender, args); - } else if (label.equalsIgnoreCase("ppsetdamage")) { - return setDamageCmd(sender, args); - } else if (label.equalsIgnoreCase("pptogglespeech")) { - return toggleSpeechCmd(sender, args); - } else if (label.equalsIgnoreCase("pptoggledamage")) { - return toggleDamageCmd(sender, args); - } else if (label.equalsIgnoreCase("pptoggleblocks")) { - return toggleBlocksCmd(sender, args); - } else if (label.equalsIgnoreCase("ppsetmotd")) { - return setMotdCmd(sender, args); + } else if (label.equalsIgnoreCase("pploadalts")) { + return reloadAlts(sender); + } else if (label.equalsIgnoreCase("ppcheckall")) { + return checkAll(sender); + } else if (label.equalsIgnoreCase("ppcheck")) { + return check(sender, args); + } else if (label.equalsIgnoreCase("kill")) { + return kill(); + } else if (label.equalsIgnoreCase("ppsetdist")) { + return setDistCmd(sender, args); + } else if (label.equalsIgnoreCase("ppsetdamage")) { + return setDamageCmd(sender, args); + } else if (label.equalsIgnoreCase("pptogglespeech")) { + return toggleSpeechCmd(sender, args); + } else if (label.equalsIgnoreCase("pptoggledamage")) { + return toggleDamageCmd(sender, args); + } else if (label.equalsIgnoreCase("pptoggleblocks")) { + return toggleBlocksCmd(sender, args); + } else if (label.equalsIgnoreCase("ppsetmotd")) { + return setMotdCmd(sender, args); + } else if (label.equalsIgnoreCase("ppfeed")) { + return feedCmd(sender, args, false); + } else if (label.equalsIgnoreCase("pprestore")) { + return restoreCmd(sender, args, false); } + return false; + } + + private boolean restoreCmd(CommandSender sender, String args[], boolean any){ + if ((sender instanceof Player)) { + sender.sendMessage("Must use [[restore at the console"); + return true; + } + if (!args[0].isEmpty()){ + sender.sendMessage("Restoring from " + args[0]); + sender.sendMessage(pearls.restorePearls(pearlman, args[0])); + }else{ + sender.sendMessage("Restoring from most recent record..."); + sender.sendMessage(pearls.restorePearls(pearlman, null)); + } + return true; + } + + private boolean feedCmd(CommandSender sender, String args[], boolean any) { + if ((sender instanceof Player)) { + sender.sendMessage("Must use ppfeed at the console"); + return true; + } + sender.sendMessage("Feeding all pearls: " + pearls.getPearlCount()); + sender.sendMessage(pearls.feedPearls(pearlman)); + return true; + } + + private PrisonPearl setCmd(CommandSender sender, String[] args) { + PrisonPearl pp; + + if (!(sender instanceof Player)) { + sender.sendMessage("ppset cannot be used at the console"); + return null; + } + + String[] anArray = {}; + Player player = (Player)sender; + pp = getCommandPearl(player, anArray, 1); + + if (pp == null){ + return null; + } + + if (args.length > 1) + return null; + + if (pp.getImprisonedPlayer().isDead()) { + sender.sendMessage(pp.getImprisonedName() + " is dead. Bring him back to try again."); + return null; + } else if (pp.getImprisonedPlayer() == player) { + sender.sendMessage("You cannot alter your own pearl!"); + return null; + } else if (!(summonman.isSummoned(pp))) { + sender.sendMessage(pp.getImprisonedName() + " is not summoned."); + return null; + } + + return pp; + } + + @SuppressWarnings("SameReturnValue") + private boolean setDistCmd(CommandSender sender, String args[]) { + + PrisonPearl pp = setCmd(sender, args); + + if (pp == null) { + + return false; + } + + summonman.getSummon(pp.getImprisonedName()).setAllowedDistance(Integer.parseInt(args[0])); + sender.sendMessage(pp.getImprisonedName() + "'s allowed distance set to " + args[0]); + return true; + } + + private boolean setDamageCmd(CommandSender sender, String args[]) { + + PrisonPearl pp = setCmd(sender, args); + + if (pp == null) { + + return false; + } + + summonman.getSummon(pp.getImprisonedName()).setDamageAmount(Integer.parseInt(args[0])); + sender.sendMessage(pp.getImprisonedName() + "'s damage amount set to " + args[0]); + return true; + } + + private boolean toggleSpeechCmd(CommandSender sender, String args[]) { + + PrisonPearl pp = setCmd(sender, args); + + if (pp == null) { + + return false; + } + + boolean speak = summonman.getSummon(pp.getImprisonedName()).isCanSpeak(); + summonman.getSummon(pp.getImprisonedName()).setCanSpeak(!speak); + sender.sendMessage(pp.getImprisonedName() + " ability to speak set to " + !speak); + return true; + } + + private boolean toggleDamageCmd(CommandSender sender, String args[]) { + + PrisonPearl pp = setCmd(sender, args); + + if (pp == null) { return false; } - private PrisonPearl setCmd(CommandSender sender, String[] args) { - PrisonPearl pp; - - if (!(sender instanceof Player)) { - sender.sendMessage("ppset cannot be used at the console"); - return null; - } - - String[] anArray = {}; - Player player = (Player)sender; - pp = getCommandPearl(player, anArray, 1); - - if (pp == null){ - return null; - } - - if (args.length > 1) - return null; - - if (pp.getImprisonedPlayer().isDead()) { - sender.sendMessage(pp.getImprisonedName() + " is dead. Bring him back to try again."); - return null; - } else if (pp.getImprisonedPlayer() == player) { - sender.sendMessage("You cannot alter your own pearl!"); - return null; - } else if (!(summonman.isSummoned(pp))) { - sender.sendMessage(pp.getImprisonedName() + " is not summoned."); - return null; - } - - return pp; - } - - @SuppressWarnings("SameReturnValue") - private boolean setDistCmd(CommandSender sender, String args[]) { - - PrisonPearl pp = setCmd(sender, args); - - if (pp == null) { - - return false; - } - - summonman.getSummon(pp.getImprisonedName()).setAllowedDistance(Integer.parseInt(args[0])); - sender.sendMessage(pp.getImprisonedName() + "'s allowed distance set to " + args[0]); - return true; - } - - private boolean setDamageCmd(CommandSender sender, String args[]) { - - PrisonPearl pp = setCmd(sender, args); - - if (pp == null) { - - return false; - } - - summonman.getSummon(pp.getImprisonedName()).setDamageAmount(Integer.parseInt(args[0])); - sender.sendMessage(pp.getImprisonedName() + "'s damage amount set to " + args[0]); - return true; - } - - private boolean toggleSpeechCmd(CommandSender sender, String args[]) { - - PrisonPearl pp = setCmd(sender, args); - - if (pp == null) { - - return false; - } - - boolean speak = summonman.getSummon(pp.getImprisonedName()).isCanSpeak(); - summonman.getSummon(pp.getImprisonedName()).setCanSpeak(!speak); - sender.sendMessage(pp.getImprisonedName() + " ability to speak set to " + !speak); - return true; - } - - private boolean toggleDamageCmd(CommandSender sender, String args[]) { - - PrisonPearl pp = setCmd(sender, args); - - if (pp == null) { - - return false; - } - - boolean damage = summonman.getSummon(pp.getImprisonedName()).isCanDealDamage(); - summonman.getSummon(pp.getImprisonedName()).setCanDealDamage(!damage); - sender.sendMessage(pp.getImprisonedName() + " ability to deal damage set to " + !damage); - return true; - } - - private boolean toggleBlocksCmd(CommandSender sender, String args[]) { - - PrisonPearl pp = setCmd(sender, args); - - if (pp == null) { - - return false; - } - - boolean block = summonman.getSummon(pp.getImprisonedName()).isCanBreakBlocks(); - summonman.getSummon(pp.getImprisonedName()).setCanBreakBlocks(!block); - sender.sendMessage(pp.getImprisonedName() + " ability to break blocks set to " + !block); - return true; - } - - private boolean setMotdCmd(CommandSender sender, String args[]) { - - PrisonPearl pp; - - if (!(sender instanceof Player)) { - sender.sendMessage("ppset cannot be used at the console"); - return true; - } - - String[] anArray = {}; - Player player = (Player)sender; - pp = getCommandPearl(player, anArray, 1); - - if (pp == null) { - - return false; - } - - String s = ""; - for (String arg : args) { - s = s.concat(arg + " "); - } - pp.setMotd(s); - sender.sendMessage(pp.getImprisonedName() + "'s Message of the Day set to " + s); - return true; - } - + boolean damage = summonman.getSummon(pp.getImprisonedName()).isCanDealDamage(); + summonman.getSummon(pp.getImprisonedName()).setCanDealDamage(!damage); + sender.sendMessage(pp.getImprisonedName() + " ability to deal damage set to " + !damage); + return true; + } + + private boolean toggleBlocksCmd(CommandSender sender, String args[]) { + + PrisonPearl pp = setCmd(sender, args); + + if (pp == null) { + + return false; + } + + boolean block = summonman.getSummon(pp.getImprisonedName()).isCanBreakBlocks(); + summonman.getSummon(pp.getImprisonedName()).setCanBreakBlocks(!block); + sender.sendMessage(pp.getImprisonedName() + " ability to break blocks set to " + !block); + return true; + } + + private boolean setMotdCmd(CommandSender sender, String args[]) { + + PrisonPearl pp; + + if (!(sender instanceof Player)) { + sender.sendMessage("ppset cannot be used at the console"); + return true; + } + + String[] anArray = {}; + Player player = (Player)sender; + pp = getCommandPearl(player, anArray, 1); + + if (pp == null) { + + return false; + } + + String s = ""; + for (String arg : args) { + s = s.concat(arg + " "); + } + pp.setMotd(s); + sender.sendMessage(pp.getImprisonedName() + "'s Message of the Day set to " + s); + return true; + } + private boolean locateCmd(CommandSender sender, String args[], boolean any) { String name_is; String name_possesive; diff --git a/src/com/untamedears/PrisonPearl/PrisonPearlPlugin.java b/src/com/untamedears/PrisonPearl/PrisonPearlPlugin.java index d0316d4..515f682 100644 --- a/src/com/untamedears/PrisonPearl/PrisonPearlPlugin.java +++ b/src/com/untamedears/PrisonPearl/PrisonPearlPlugin.java @@ -10,7 +10,8 @@ import java.util.Map.Entry; import java.util.Random; import java.util.concurrent.Callable; -import java.util.logging.Logger; +import java.util.logging.Logger; +import java.lang.Thread; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -50,6 +51,8 @@ public class PrisonPearlPlugin extends JavaPlugin implements Listener { private Map attachments; + private final boolean startupFeed = true; //ADDED SO ONE CAN DISABLE STARTUP FEED + public void onEnable() { getConfig().options().copyDefaults(true); saveConfig(); @@ -70,11 +73,12 @@ public void onEnable() { portalman = new PrisonPortaledPlayerManager(this, pearls); load(portalman, getPortaledPlayersFile()); broadcastman = new BroadcastManager(); - combatTagManager = new CombatTagManager(this.getServer(), log); - - loadAlts(); - checkBanAllAlts(); - + combatTagManager = new CombatTagManager(this.getServer(), log); + + loadAlts(); + checkBanAllAlts(); + + if (Bukkit.getPluginManager().isPluginEnabled("PhysicalShop")) new PhysicalShopListener(this, pearls); @@ -96,10 +100,10 @@ public void run() { // shamelessly swiped from bookworm, not sure why there isn't a Bukkit API for this // this causes items to be stacked by their durability value try { - Method method = net.minecraft.server.Item.class.getDeclaredMethod("a", boolean.class); - if (method.getReturnType() == net.minecraft.server.Item.class) { + Method method = net.minecraft.server.v1_4_R1.Item.class.getDeclaredMethod("a", boolean.class); + if (method.getReturnType() == net.minecraft.server.v1_4_R1.Item.class) { method.setAccessible(true); - method.invoke(net.minecraft.server.Item.ENDER_PEARL, true); + method.invoke(net.minecraft.server.v1_4_R1.Item.ENDER_PEARL, true); } } catch (Exception e) { e.printStackTrace(); @@ -108,6 +112,16 @@ public void run() { attachments = new HashMap(); for (Player player : Bukkit.getOnlinePlayers()) updateAttachment(player); + + if (startupFeed){ + //try{ + //Thread.sleep(1000 * 60); + pearls.feedPearls(pearlman); + //} + //catch(Exception e){ + //System.out.println("A straight foolish error has occurred while loading PrisonPearl."); + //} + } } public void onDisable() { @@ -272,18 +286,18 @@ public void onEntityDeath(EntityDeathEvent event) { return; Player player = (Player)event.getEntity(); - String playerName = player.getName(); - - if (combatTagManager.isCombatTagNPC(event.getEntity())) { - String npcName = player.getName(); - String realName = combatTagManager.getNPCPlayerName(player); - log.info("NPC: "+npcName+", Player: "+playerName); - if (!realName.equals("")) { - playerName = realName; - } - } + String playerName = player.getName(); - PrisonPearl pp = pearls.getByImprisoned(playerName); // find out if the player is imprisoned + if (combatTagManager.isCombatTagNPC(event.getEntity())) { + String npcName = player.getName(); + String realName = combatTagManager.getNPCPlayerName(player); + log.info("NPC: "+npcName+", Player: "+playerName); + if (!realName.equals("")) { + playerName = realName; + } + } + + PrisonPearl pp = pearls.getByImprisoned(playerName); // find out if the player is imprisoned if (pp != null) { // if imprisoned if (!getConfig().getBoolean("prison_stealing") || player.getLocation().getWorld() == getPrisonWorld()) {// bail if prisoner stealing isn't allowed, or if the player is in prison (can't steal prisoners from prison ever) // reveal location of pearl to damaging players if pearl stealing is disabled diff --git a/src/com/untamedears/PrisonPearl/PrisonPearlStorage.java b/src/com/untamedears/PrisonPearl/PrisonPearlStorage.java index e0a4c3c..d7a3f6a 100644 --- a/src/com/untamedears/PrisonPearl/PrisonPearlStorage.java +++ b/src/com/untamedears/PrisonPearl/PrisonPearlStorage.java @@ -10,7 +10,8 @@ import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.HashMap; -import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.List; import java.util.Map; import org.bukkit.Bukkit; @@ -18,6 +19,15 @@ import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.block.BrewingStand; +import org.bukkit.block.Chest; +import org.bukkit.block.Dispenser; +import org.bukkit.block.Furnace; +import org.bukkit.inventory.DoubleChestInventory; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; public class PrisonPearlStorage implements SaveLoad { private final Map pearls_byid; @@ -151,6 +161,10 @@ public PrisonPearl getByImprisoned(Player player) { return pearls_byimprisoned.get(player.getName()); } + public Integer getPearlCount(){ + return pearls_byimprisoned.size(); + } + boolean isImprisoned(String name) { return pearls_byimprisoned.containsKey(name); } @@ -158,29 +172,126 @@ boolean isImprisoned(String name) { boolean isImprisoned(Player player) { return pearls_byimprisoned.containsKey(player.getName()); } - - public Integer getImprisonedCount(String[] names) { - Integer count = 0; - for (String name : names) { - if (pearls_byimprisoned.containsKey(name)) { - count++; - } - } - return count; - } - - public String[] getImprisonedNames(String[] names) { - List iNames = new ArrayList(); - for (String name : names) { - if (pearls_byimprisoned.containsKey(name)) { - iNames.add(name); - } - } - int count = iNames.size(); - String[] results = new String[count]; - for (int i = 0; i < count; i++) { - results[i] = iNames.get(i); - } - return results; - } + + public Integer getImprisonedCount(String[] names) { + Integer count = 0; + for (String name : names) { + if (pearls_byimprisoned.containsKey(name)) { + count++; + } + } + return count; + } + + public String[] getImprisonedNames(String[] names) { + List iNames = new ArrayList(); + for (String name : names) { + if (pearls_byimprisoned.containsKey(name)) { + iNames.add(name); + } + } + int count = iNames.size(); + String[] results = new String[count]; + for (int i = 0; i < count; i++) { + results[i] = iNames.get(i); + } + return results; + } + + public String feedPearls(PrisonPearlManager pearlman){ + String message = ""; + String log = ""; + ConcurrentHashMap map = new ConcurrentHashMap(pearls_byid); + + int pearlsfed = 0; + int coalfed = 0; + int freedpearls = 0; + for (PrisonPearl pp : map.values()) { + + BlockState inherentViolence = pp.getHolderBlockState(); + Material mat = inherentViolence.getType(); + + Inventory inv[] = new Inventory[2]; + inv[0] = inv[1] = null; + if (inherentViolence == null) + { + continue; + } + else + { + switch(mat) + { + case FURNACE: + inv[0] = ((Furnace)inherentViolence).getInventory(); + break; + case DISPENSER: + inv[0] = ((Dispenser)inherentViolence).getInventory(); + break; + case BREWING_STAND: + inv[0] = ((BrewingStand)inherentViolence).getInventory(); + break; + default: + if (mat == Material.CHEST || mat == Material.LOCKED_CHEST){ + Chest c = ((Chest)inherentViolence); + DoubleChestInventory dblInv = null; + try{ + dblInv = (DoubleChestInventory)c.getInventory(); + inv[0] = dblInv.getLeftSide(); + inv[1] = dblInv.getRightSide(); + } + catch(Exception e){ + inv[0] = (Inventory)c.getInventory(); + } + }else{ + pearlman.freePearl(pp); + log+="\n freed:"+pp.getImprisonedName()+",reason:"+"badcontainer"; + freedpearls++; + } + break; + } + } + + message = message + "Pearl #" + pp.getID() + ",Name: " + pp.getImprisonedName() + " in a " + pp.getHolderBlockState().getType(); + int requirementSize = 8; + ItemStack requirement = new ItemStack(Material.COAL, requirementSize); + if(inv[0].containsAtLeast(requirement,requirementSize)) + { + message = message + "\n Chest contains enough purestrain coal."; + inv[0].removeItem(requirement); + pearlsfed++; + coalfed += requirementSize; + log+="\n fed:" + pp.getImprisonedName() + ",location:"+ pp.describeLocation(); + } + else if(inv[1] != null && inv[1].containsAtLeast(requirement,requirementSize)){ + message = message + "\n Chest contains enough purestrain coal."; + inv[1].removeItem(requirement); + pearlsfed++; + coalfed += requirementSize; + log+="\n fed:" + pp.getImprisonedName() + ",location:"+ pp.describeLocation(); + } + else { + message = message + "\n Chest does not contain enough purestrain coal."; + pearlman.freePearl(pp); + log+="\n freed:"+pp.getImprisonedName()+",reason:"+"nocoal"+",location:"+pp.describeLocation(); + freedpearls++; + } + } + message = message + "\n Feeding Complete. " + pearlsfed + " were fed " + coalfed + " coal. " + freedpearls + " players were freed."; + return message; + } + + public String restorePearls(PrisonPearlManager pearlman, String config){ + //Read pearl config + + //For each entry + + //Create pearl for player + + //Place in chest + + //Check imprisonment status + + //Report restoration + return ""; + } }