From 2b40b15d50e9761947c899562c42b6709ce87d82 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Wed, 18 Dec 2013 08:37:55 -0700 Subject: [PATCH] Mob Heads are added, MobHead class implemented. Just need to add functionality. All possible head combinations can be obtained via mobs or obtained via '/event cheatheads' --- BankEconomyMod/src/me/kaZep/Base/Main.java | 156 ++++ BankEconomyMod/src/me/kaZep/Base/MobHead.java | 849 ++++++++++++++++++ .../src/me/kaZep/Base/PlayerListener.java | 375 +++++++- .../me/kaZep/Base/RecyclingCenterNode.java | 4 +- .../me/kaZep/Commands/commandBankEconomy.java | 65 +- 5 files changed, 1413 insertions(+), 36 deletions(-) create mode 100644 BankEconomyMod/src/me/kaZep/Base/MobHead.java diff --git a/BankEconomyMod/src/me/kaZep/Base/Main.java b/BankEconomyMod/src/me/kaZep/Base/Main.java index 4897c89..0d7f1af 100644 --- a/BankEconomyMod/src/me/kaZep/Base/Main.java +++ b/BankEconomyMod/src/me/kaZep/Base/Main.java @@ -22,6 +22,8 @@ import java.util.logging.Logger; import java.text.*; import me.kaZep.Base.BonusEnchantment.ItemType; +import me.kaZep.Base.MobHead.MobHeadRareType; +import me.kaZep.Base.MobHead.MobHeadType; import me.kaZep.Base.PlayerListener.Cube; import me.kaZep.Commands.JobsDataInfo; import me.kaZep.Commands.JobsDataInfo.Job; @@ -43,6 +45,7 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.Server; +import org.bukkit.SkullType; import org.bukkit.Sound; import org.bukkit.World; import org.bukkit.block.Block; @@ -74,6 +77,7 @@ import org.bukkit.entity.Skeleton; import org.bukkit.entity.Wither; import org.bukkit.entity.Wolf; import org.bukkit.entity.Zombie; +import org.bukkit.entity.Skeleton.SkeletonType; import org.bukkit.inventory.FurnaceRecipe; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -118,6 +122,7 @@ public class Main extends JavaPlugin { public final Logger logger = Logger.getLogger("Minecraft"); public static Economy economy = null; + public static Main plugin = null; public ItemStack[] spleef_inventory_a,spleef_inventory_b; public ItemStack[] spleef4_inventory_a,spleef4_inventory_b,spleef4_inventory_c,spleef4_inventory_d; public ItemStack store_shovel=null; @@ -154,6 +159,8 @@ public class Main extends JavaPlugin public Location BOSS_DEFEAT_LOC; public int POLYMORPH=0; public Location POLYMORPH_LOC; + public static double HEAD_DROP_CHANCE = 0.01; + public static double RARE_HEAD_DROP_CHANCE = 0.000953125; public int LOGGING_UPDATE_COUNTS=-1; public int MAX_LOGGING_COUNT=12; @@ -248,6 +255,8 @@ public class Main extends JavaPlugin { getServer().getPluginManager().registerEvents(this.pl, this); + plugin = this; + cleaned=false; if (Bukkit.getPluginManager().isPluginEnabled("MCTowns")) { @@ -288,6 +297,28 @@ public class Main extends JavaPlugin getConfig().addDefault("thanksgiving-enabled", Boolean.valueOf(false)); getConfig().addDefault("item-cube-numb", Integer.valueOf(0)); getConfig().addDefault("server-tick-time", Long.valueOf(143000000l)); + getConfig().addDefault("mob.skeleton", Integer.valueOf(0)); + getConfig().addDefault("mob.witherskeleton", Integer.valueOf(0)); + getConfig().addDefault("mob.zombie", Integer.valueOf(0)); + getConfig().addDefault("mob.creeper", Integer.valueOf(0)); + getConfig().addDefault("mob.spider", Integer.valueOf(0)); + getConfig().addDefault("mob.enderman", Integer.valueOf(0)); + getConfig().addDefault("mob.cavespider", Integer.valueOf(0)); + getConfig().addDefault("mob.blaze", Integer.valueOf(0)); + getConfig().addDefault("mob.ghast", Integer.valueOf(0)); + getConfig().addDefault("mob.zombiepigman", Integer.valueOf(0)); + getConfig().addDefault("mob.magmacube", Integer.valueOf(0)); + getConfig().addDefault("mob.rareskeleton", Integer.valueOf(0)); + getConfig().addDefault("mob.rarewitherskeleton", Integer.valueOf(0)); + getConfig().addDefault("mob.rarezombie", Integer.valueOf(0)); + getConfig().addDefault("mob.rarecreeper", Integer.valueOf(0)); + getConfig().addDefault("mob.rarespider", Integer.valueOf(0)); + getConfig().addDefault("mob.rareenderman", Integer.valueOf(0)); + getConfig().addDefault("mob.rarecavespider", Integer.valueOf(0)); + getConfig().addDefault("mob.rareblaze", Integer.valueOf(0)); + getConfig().addDefault("mob.rareghast", Integer.valueOf(0)); + getConfig().addDefault("mob.rarezombiepigman", Integer.valueOf(0)); + getConfig().addDefault("mob.raremagmacube", Integer.valueOf(0)); saveConfig(); SERVER_TICK_TIME = getConfig().getLong("server-tick-time"); @@ -694,6 +725,29 @@ public class Main extends JavaPlugin artifact_clay.addIngredient(Material.EYE_OF_ENDER); Bukkit.addRecipe(artifact_clay); + //Add Powered Mob Head recipe. + for (int i=0;i<5;i++) { + ItemStack skull_stack = new ItemStack(Material.SKULL_ITEM); + MaterialData newskull = new MaterialData(Material.SKULL_ITEM,(byte)i); + skull_stack.setDurability((short)i); + ShapedRecipe powered_heads = new ShapedRecipe(skull_stack); + powered_heads.shape(" a ","aba"," a "); + powered_heads.setIngredient('a', Material.GOLD_BLOCK); + powered_heads.setIngredient('b', newskull); + Bukkit.addRecipe(powered_heads); + } + //Add Powered Rare Mob Head recipe. + for (int i=0;i<5;i++) { + ItemStack skull_stack = new ItemStack(Material.SKULL_ITEM); + MaterialData newskull = new MaterialData(Material.SKULL_ITEM,(byte)i); + skull_stack.setDurability((short)i); + ShapedRecipe powered_rare_heads = new ShapedRecipe(skull_stack); + powered_rare_heads.shape(" a ","aba"," a "); + powered_rare_heads.setIngredient('a', Material.BEACON); + powered_rare_heads.setIngredient('b', newskull); + Bukkit.addRecipe(powered_rare_heads); + } + //Add deconversion recipes. ShapelessRecipe DeConv_diamond_chestplate = new ShapelessRecipe(new ItemStack(Material.DIAMOND)); DeConv_diamond_chestplate.addIngredient(Material.DIAMOND_CHESTPLATE); @@ -1768,6 +1822,8 @@ public void runTick() { meta.setOwner("MHF_Enderman"); skull.setItemMeta(meta); zombie.getEquipment().setHelmet(skull); + Zombie z = (Zombie)zombie; + z.setBaby(false); enderdragon.setCustomName(ChatColor.DARK_PURPLE+"Charge Zombie III"); enderdragon.setMaxHealth(200); @@ -5427,6 +5483,22 @@ public void payDay(int time) } } + /** + * Compounds the interest for the player and updates their account balance appropriately. + * Use whenever you need to update their balance. + * @param p The player to update the balance for. + * @return Returns what the new balance is for displaying / processing. + */ + public double compoundInterest(Player p) { + double oldmon = getAccountsConfig().getDouble(p.getName().toLowerCase()+".money"); + double newbalance = getAccountsConfig().getDouble(p.getName().toLowerCase()+".money")*Math.pow(Math.E, getConfig().getDouble("payday.amount") * ((Main.SERVER_TICK_TIME - getAccountsConfig().getLong(p.getName().toLowerCase()+".interestdistributedtime")) / 1728000d)); + Bukkit.getLogger().info("Money compounded from "+oldmon+" to "+newbalance); + //Bukkit.getLogger().info("Equation is "+getAccountsConfig().getDouble(p.getName().toLowerCase()+".money")+"*Math.pow("+Math.E+","+getConfig().getDouble("payday.amount")+"*(("+Main.SERVER_TICK_TIME+"-"+getAccountsConfig().getLong(p.getName().toLowerCase()+".interestdistributedtime")+")/1728000d))"); + getAccountsConfig().set(p.getName().toLowerCase()+".interestdistributedtime", Long.valueOf(Main.SERVER_TICK_TIME)); + getAccountsConfig().set(p.getName().toLowerCase()+".money", Double.valueOf(newbalance)); + return newbalance; + } + public void notifyBuffMessages(Player p) { notifyBuffMessages(p, 20); } @@ -6374,6 +6446,90 @@ public void payDay(int time) } return finallist; } + + /** + * Checks if the given head is powered or + * unpowered. + * @param head The mob head to check for. + * @return Returns true if the head is powered + * or false otherwise. + */ + public boolean isUnpoweredHead(MobHead head) { + return !head.is_powered; + } + + /** + * Checks if the given head is rare or + * unrare. + * @param head The mob head to check for. + * @return Returns true if the head is rare + * or false otherwise. + */ + public boolean isRareHead(MobHead head) { + //Bukkit.getLogger().info("Checking mobhead "+head.toString()); + return head.rare_head; + } + + /** + * Linker function for MobHead.convertToPoweredHead() + * @param item + * @return + */ + public ItemStack convertToPoweredHead(ItemStack item) { + return MobHead.convertToPoweredHead(item); + } + + /** + * Linker function for MobHead.getMobHead() + * @param item + * @return + */ + public MobHead getMobHead(ItemStack item) { + return MobHead.getMobHead(item); + } + + /** + * Gets a list of all the valid mob heads that the player + * has in their inventory. + * @param p The player to check for. + * @return A list containing all the MobHead + * objects the player has in their inventory. + * In the case there are none, null is returned. + */ + public List getMobHeads(Player p) { + List mobheadlist = new ArrayList(); + for (int i=0;i0) { + return mobheadlist; + } else { + return null; + } + } + + /** + * Gets how many mob heads of a certain type of MobHead + * exist in the mobhead list provided. + * @return Returns the number of that type of head + * in the given list. (0 if there are none) + */ + public int getMobHeadAmt(MobHead mobhead, List mobheads) { + int same_amt=0; + for (int i=0;i newlore = new ArrayList(); + newlore.add(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"Ranged Damage"); + meta.setLore(newlore); + newhead.setItemMeta(meta); + finalhead = newhead; + }break; + case WITHER_SKELETON:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)1); + ItemMeta meta = newhead.getItemMeta(); + String key = "mob.witherskeleton"; + meta.setDisplayName(ChatColor.WHITE+"Wither Skeleton Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + List newlore = new ArrayList(); + newlore.add(ChatColor.LIGHT_PURPLE+"+5 "+ChatColor.GOLD+"second "+ChatColor.GRAY+"Wither I"+ChatColor.GOLD+" duration"); + newlore.add(ChatColor.GOLD+" on hit."); + meta.setLore(newlore); + newhead.setItemMeta(meta); + finalhead = newhead; + }break; + case ZOMBIE:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)2); + ItemMeta meta = newhead.getItemMeta(); + String key = "mob.zombie"; + meta.setDisplayName(ChatColor.WHITE+"Zombie Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + List newlore = new ArrayList(); + newlore.add(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"Lifesteal"); + meta.setLore(newlore); + newhead.setItemMeta(meta); + finalhead = newhead; + }break; + case CREEPER:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)4); + ItemMeta meta = newhead.getItemMeta(); + String key = "mob.creeper"; + meta.setDisplayName(ChatColor.WHITE+"Creeper Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + List newlore = new ArrayList(); + newlore.add(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"AoE Damage"); + meta.setLore(newlore); + newhead.setItemMeta(meta); + finalhead = newhead; + }break; + case SPIDER:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)SkullType.PLAYER.ordinal()); + SkullMeta skullMeta = (SkullMeta) newhead.getItemMeta(); + String key = "mob.spider"; + skullMeta.setDisplayName(ChatColor.WHITE+"Spider Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + skullMeta.setOwner("MHF_Spider"); + newhead.setItemMeta(skullMeta); + ItemMeta meta = newhead.getItemMeta(); + List newlore = new ArrayList(); + newlore.add(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"Slow on hit"); + meta.setLore(newlore); + newhead.setItemMeta(meta); + finalhead = newhead; + }break; + case ENDERMAN:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)SkullType.PLAYER.ordinal()); + SkullMeta skullMeta = (SkullMeta) newhead.getItemMeta(); + String key = "mob.enderman"; + skullMeta.setDisplayName(ChatColor.WHITE+"Enderman Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + skullMeta.setOwner("MHF_Enderman"); + List newlore = new ArrayList(); + newlore.add(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"Critical Chance"); + skullMeta.setLore(newlore); + newhead.setItemMeta(skullMeta); + finalhead = newhead; + }break; + case CAVE_SPIDER:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)SkullType.PLAYER.ordinal()); + SkullMeta skullMeta = (SkullMeta) newhead.getItemMeta(); + String key = "mob.cavespider"; + skullMeta.setDisplayName(ChatColor.WHITE+"Cave Spider Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + skullMeta.setOwner("MHF_CaveSpider"); + List newlore = new ArrayList(); + newlore.add(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"second Poison duration"); + newlore.add(ChatColor.GOLD+" on hit."); + skullMeta.setLore(newlore); + newhead.setItemMeta(skullMeta); + finalhead = newhead; + }break; + case BLAZE:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)SkullType.PLAYER.ordinal()); + SkullMeta skullMeta = (SkullMeta) newhead.getItemMeta(); + String key = "mob.blaze"; + skullMeta.setDisplayName(ChatColor.WHITE+"Blaze Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + skullMeta.setOwner("MHF_Blaze"); + List newlore = new ArrayList(); + newlore.add(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"second ignite duration"); + newlore.add(ChatColor.GOLD+" on hit."); + skullMeta.setLore(newlore); + newhead.setItemMeta(skullMeta); + finalhead = newhead; + }break; + case GHAST:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)SkullType.PLAYER.ordinal()); + SkullMeta skullMeta = (SkullMeta) newhead.getItemMeta(); + String key = "mob.ghast"; + skullMeta.setDisplayName(ChatColor.WHITE+"Ghast Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + skullMeta.setOwner("MHF_Ghast"); + List newlore = new ArrayList(); + newlore.add(ChatColor.LIGHT_PURPLE+"-1% "+ChatColor.GOLD+"damage taken on hit"); + skullMeta.setLore(newlore); + newhead.setItemMeta(skullMeta); + finalhead = newhead; + }break; + case ZOMBIE_PIGMAN:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)SkullType.PLAYER.ordinal()); + SkullMeta skullMeta = (SkullMeta) newhead.getItemMeta(); + String key = "mob.zombiepigman"; + skullMeta.setDisplayName(ChatColor.WHITE+"Zombie Pigman Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + skullMeta.setOwner("MHF_PigZombie"); + List newlore = new ArrayList(); + newlore.add(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"chance of being fully"); + newlore.add(ChatColor.GOLD+" healed on kill."); + skullMeta.setLore(newlore); + newhead.setItemMeta(skullMeta); + finalhead = newhead; + }break; + case MAGMA_CUBE:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)SkullType.PLAYER.ordinal()); + SkullMeta skullMeta = (SkullMeta) newhead.getItemMeta(); + String key = "mob.magmacube"; + skullMeta.setDisplayName(ChatColor.WHITE+"Magma Cube Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + skullMeta.setOwner("MHF_LavaSlime"); + List newlore = new ArrayList(); + newlore.add(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"chance of setting the"); + newlore.add(ChatColor.GOLD+" mob and surrounding mobs on fire"); + newlore.add(ChatColor.GOLD+" for 10 seconds."); + skullMeta.setLore(newlore); + newhead.setItemMeta(skullMeta); + finalhead = newhead; + }break; + } + } else { + switch (head_type) { + case WITHER_SKELETON:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)1); + ItemMeta meta = newhead.getItemMeta(); + String key = "mob.rarewitherskeleton"; + meta.setDisplayName(ChatColor.BLUE+"Rare Wither Skeleton Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + List newlore = new ArrayList(); + newlore.add(ChatColor.LIGHT_PURPLE+"+15 "+ChatColor.GOLD+"second "+ChatColor.GRAY+"Wither III"+ChatColor.GOLD+" duration"); + newlore.add(ChatColor.GOLD+" on hit."); + meta.setLore(newlore); + newhead.setItemMeta(meta); + newhead.addUnsafeEnchantment(Enchantment.ARROW_DAMAGE, 1); + finalhead = newhead; + }break; + case SKELETON:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + ItemMeta meta = newhead.getItemMeta(); + String key = "mob.rareskeleton"; + meta.setDisplayName(ChatColor.BLUE+"Rare Skeleton Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + List newlore = new ArrayList(); + if (rare_head_type==MobHeadRareType.RARE_TYPE_A) { + newlore.add(ChatColor.LIGHT_PURPLE+"+3% "+ChatColor.GOLD+"Ranged Damage"); + } else { + newlore.add(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"m/s Projectile Speed"); + } + meta.setLore(newlore); + newhead.setItemMeta(meta); + newhead.addUnsafeEnchantment(Enchantment.ARROW_DAMAGE, 1); + finalhead = newhead; + }break; + case ZOMBIE:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)2); + ItemMeta meta = newhead.getItemMeta(); + String key = "mob.rarezombie"; + meta.setDisplayName(ChatColor.BLUE+"Rare Zombie Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + List newlore = new ArrayList(); + if (rare_head_type==MobHeadRareType.RARE_TYPE_A) { + newlore.add(ChatColor.LIGHT_PURPLE+"+3% "+ChatColor.GOLD+"Lifesteal"); + } else { + newlore.add(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"Max Health"); + } + meta.setLore(newlore); + newhead.setItemMeta(meta); + newhead.addUnsafeEnchantment(Enchantment.ARROW_DAMAGE, 1); + finalhead = newhead; + }break; + case CREEPER:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)4); + ItemMeta meta = newhead.getItemMeta(); + String key = "mob.rarecreeper"; + meta.setDisplayName(ChatColor.BLUE+"Rare Creeper Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + List newlore = new ArrayList(); + if (rare_head_type==MobHeadRareType.RARE_TYPE_A) { + newlore.add(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"Damage to all nearby enemies."); + } else { + newlore.add(ChatColor.LIGHT_PURPLE+"+20% "+ChatColor.GOLD+"AoE Damage"); + } + meta.setLore(newlore); + newhead.setItemMeta(meta); + newhead.addUnsafeEnchantment(Enchantment.ARROW_DAMAGE, 1); + finalhead = newhead; + }break; + case SPIDER:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)SkullType.PLAYER.ordinal()); + SkullMeta skullMeta = (SkullMeta) newhead.getItemMeta(); + skullMeta.setOwner("MHF_Spider"); + String key = "mob.rarespider"; + skullMeta.setDisplayName(ChatColor.BLUE+"Rare Spider Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + newhead.setItemMeta(skullMeta); + ItemMeta meta = newhead.getItemMeta(); + meta.setDisplayName(ChatColor.BLUE+"Rare Spider Head"); + List newlore = new ArrayList(); + if (rare_head_type==MobHeadRareType.RARE_TYPE_A) { + newlore.add(ChatColor.LIGHT_PURPLE+"+2 "+ChatColor.GOLD+"second Poison duration"); + newlore.add(ChatColor.GOLD+" on hit."); + } else { + newlore.add(ChatColor.LIGHT_PURPLE+"+15% "+ChatColor.GOLD+"Slow on hit"); + } + meta.setLore(newlore); + newhead.setItemMeta(meta); + newhead.addUnsafeEnchantment(Enchantment.ARROW_DAMAGE, 1); + finalhead = newhead; + }break; + case ENDERMAN:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)SkullType.PLAYER.ordinal()); + SkullMeta skullMeta = (SkullMeta) newhead.getItemMeta(); + skullMeta.setOwner("MHF_Enderman"); + String key = "mob.rareenderman"; + skullMeta.setDisplayName(ChatColor.BLUE+"Rare Enderman Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + List newlore = new ArrayList(); + if (rare_head_type==MobHeadRareType.RARE_TYPE_A) { + newlore.add(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"Item Drop Amount Increase"); + } else { + newlore.add(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"Critical Chance"); + } + skullMeta.setLore(newlore); + newhead.setItemMeta(skullMeta); + newhead.addUnsafeEnchantment(Enchantment.ARROW_DAMAGE, 1); + finalhead = newhead; + }break; + case CAVE_SPIDER:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)SkullType.PLAYER.ordinal()); + SkullMeta skullMeta = (SkullMeta) newhead.getItemMeta(); + String key = "mob.rarecavespider"; + skullMeta.setDisplayName(ChatColor.BLUE+"Rare Cave Spider Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + skullMeta.setOwner("MHF_CaveSpider"); + List newlore = new ArrayList(); + if (rare_head_type==MobHeadRareType.RARE_TYPE_A) { + newlore.add(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"of snaring a target"); + newlore.add(ChatColor.GOLD+" for 5 seconds."); + } else { + newlore.add(ChatColor.LIGHT_PURPLE+"+3 "+ChatColor.GOLD+"second Poison duration"); + newlore.add(ChatColor.GOLD+" on hit."); + } + skullMeta.setLore(newlore); + newhead.setItemMeta(skullMeta); + newhead.addUnsafeEnchantment(Enchantment.ARROW_DAMAGE, 1); + finalhead = newhead; + }break; + case BLAZE:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)SkullType.PLAYER.ordinal()); + SkullMeta skullMeta = (SkullMeta) newhead.getItemMeta(); + String key = "mob.rareblaze"; + skullMeta.setDisplayName(ChatColor.BLUE+"Rare Blaze Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + skullMeta.setOwner("MHF_Blaze"); + List newlore = new ArrayList(); + if (rare_head_type==MobHeadRareType.RARE_TYPE_A) { + newlore.add(ChatColor.LIGHT_PURPLE+"+3% "+ChatColor.GOLD+"chance to send enemy"); + newlore.add(ChatColor.GOLD+" airborne."); + } else { + newlore.add(ChatColor.LIGHT_PURPLE+"+3 "+ChatColor.GOLD+"second ignite duration"); + newlore.add(ChatColor.GOLD+" on hit."); + } + skullMeta.setLore(newlore); + newhead.setItemMeta(skullMeta); + newhead.addUnsafeEnchantment(Enchantment.ARROW_DAMAGE, 1); + finalhead = newhead; + }break; + case GHAST:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)SkullType.PLAYER.ordinal()); + SkullMeta skullMeta = (SkullMeta) newhead.getItemMeta(); + String key = "mob.rareghast"; + skullMeta.setDisplayName(ChatColor.BLUE+"Rare Ghast Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + skullMeta.setOwner("MHF_Ghast"); + List newlore = new ArrayList(); + if (rare_head_type==MobHeadRareType.RARE_TYPE_A) { + newlore.add(ChatColor.LIGHT_PURPLE+"+3% "+ChatColor.GOLD+"chance to send down"); + newlore.add(ChatColor.GOLD+" lightning on a target."); + } else { + newlore.add(ChatColor.LIGHT_PURPLE+"-5% "+ChatColor.GOLD+"damage taken on hit"); + } + skullMeta.setLore(newlore); + newhead.setItemMeta(skullMeta); + newhead.addUnsafeEnchantment(Enchantment.ARROW_DAMAGE, 1); + finalhead = newhead; + }break; + case ZOMBIE_PIGMAN:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)SkullType.PLAYER.ordinal()); + SkullMeta skullMeta = (SkullMeta) newhead.getItemMeta(); + String key = "mob.rarezombiepigman"; + skullMeta.setDisplayName(ChatColor.BLUE+"Rare Pig Zombie Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + skullMeta.setOwner("MHF_PigZombie"); + List newlore = new ArrayList(); + if (rare_head_type==MobHeadRareType.RARE_TYPE_A) { + newlore.add(ChatColor.LIGHT_PURPLE+"+10% "+ChatColor.GOLD+"chance of dropping a"); + newlore.add(ChatColor.GOLD+" Golden Nugget on a kill."); + } else { + newlore.add(ChatColor.LIGHT_PURPLE+"+3% "+ChatColor.GOLD+"chance of being fully"); + newlore.add(ChatColor.GOLD+" healed on kill."); + } + skullMeta.setLore(newlore); + newhead.setItemMeta(skullMeta); + newhead.addUnsafeEnchantment(Enchantment.ARROW_DAMAGE, 1); + finalhead = newhead; + }break; + case MAGMA_CUBE:{ + ItemStack newhead = new ItemStack(Material.SKULL_ITEM); + newhead.setDurability((short)SkullType.PLAYER.ordinal()); + SkullMeta skullMeta = (SkullMeta) newhead.getItemMeta(); + String key = "mob.raremagmacube"; + skullMeta.setDisplayName(ChatColor.BLUE+"Rare Magma Cube Head "+ChatColor.ITALIC+"#"+Main.plugin.getConfig().getInt(key)); + Main.plugin.getConfig().set(key, Main.plugin.getConfig().getInt(key)+1); + skullMeta.setOwner("MHF_LavaSlime"); + List newlore = new ArrayList(); + if (rare_head_type==MobHeadRareType.RARE_TYPE_A) { + newlore.add(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"chance of burning an"); + newlore.add(ChatColor.GOLD+" enemy to a crisp."); + } else { + newlore.add(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"chance of setting the"); + newlore.add(ChatColor.GOLD+" mob and surrounding mobs on fire"); + newlore.add(ChatColor.GOLD+" for 10 seconds."); + } + skullMeta.setLore(newlore); + newhead.setItemMeta(skullMeta); + newhead.addUnsafeEnchantment(Enchantment.ARROW_DAMAGE, 1); + finalhead = newhead; + }break; + } + } + //Bukkit.getLogger().info("Mobhead is "+toString()+" currently."); + if (is_powered) { + short numb = finalhead.clone().getDurability(); + ItemStack poweredhead = convertToPoweredHead(finalhead.clone()); + //Bukkit.getLogger().info("Converted head item is "+this.plugin.convertToPoweredHead(result.getMatrix()[i]).toString()); + poweredhead.setDurability(numb); + finalhead = poweredhead; + } + return finalhead; + } + + /** + * Attempts to get the mob head object that + * corresponds to this item, by checking its lore. + * @param item The item to check for. + * @return Returns null if this item is not a + * valid mob head. Returns the MobHead object + * otherwise. + */ + static public MobHead getMobHead(ItemStack item) { + if (item!=null && item.getType()==Material.SKULL_ITEM && item.hasItemMeta() && item.getItemMeta().hasLore()) { + List getLore = item.getItemMeta().getLore(); + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+5 "+ChatColor.GOLD+"second "+ChatColor.GRAY+"Wither I"+ChatColor.GOLD+" duration")) { + return new MobHead(MobHeadType.WITHER_SKELETON); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"Ranged Damage")) { + return new MobHead(MobHeadType.SKELETON); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"Lifesteal")) { + return new MobHead(MobHeadType.ZOMBIE); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"AoE Damage")) { + return new MobHead(MobHeadType.CREEPER); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"Slow on hit")) { + return new MobHead(MobHeadType.SPIDER); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"Critical Chance")) { + return new MobHead(MobHeadType.ENDERMAN); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"second Poison duration")) { + return new MobHead(MobHeadType.CAVE_SPIDER); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"second ignite duration")) { + return new MobHead(MobHeadType.BLAZE); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"-1% "+ChatColor.GOLD+"damage taken on hit")) { + return new MobHead(MobHeadType.GHAST); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"chance of being fully")) { + return new MobHead(MobHeadType.ZOMBIE_PIGMAN); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"chance of setting the")) { + return new MobHead(MobHeadType.MAGMA_CUBE); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+15 "+ChatColor.GOLD+"second "+ChatColor.GRAY+"Wither III"+ChatColor.GOLD+" duration")) { + return new MobHead(MobHeadType.WITHER_SKELETON, true, MobHeadRareType.RARE_TYPE_A); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+3% "+ChatColor.GOLD+"Ranged Damage")) { + return new MobHead(MobHeadType.SKELETON, true, MobHeadRareType.RARE_TYPE_A); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"m/s Projectile Speed")) { + return new MobHead(MobHeadType.SKELETON, true, MobHeadRareType.RARE_TYPE_B); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+3% "+ChatColor.GOLD+"Lifesteal")) { + return new MobHead(MobHeadType.ZOMBIE, true, MobHeadRareType.RARE_TYPE_A); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"Max Health")) { + return new MobHead(MobHeadType.ZOMBIE, true, MobHeadRareType.RARE_TYPE_B); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"Damage to all nearby enemies.")) { + return new MobHead(MobHeadType.CREEPER, true, MobHeadRareType.RARE_TYPE_A); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+20% "+ChatColor.GOLD+"AoE Damage")) { + return new MobHead(MobHeadType.CREEPER, true, MobHeadRareType.RARE_TYPE_B); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+2 "+ChatColor.GOLD+"second Poison duration on hit")) { + return new MobHead(MobHeadType.SPIDER, true, MobHeadRareType.RARE_TYPE_A); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+15% "+ChatColor.GOLD+"Slow on hit")) { + return new MobHead(MobHeadType.SPIDER, true, MobHeadRareType.RARE_TYPE_B); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"Item Drop Amount Increase")) { + return new MobHead(MobHeadType.ENDERMAN, true, MobHeadRareType.RARE_TYPE_A); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"Critical Chance")) { + return new MobHead(MobHeadType.ENDERMAN, true, MobHeadRareType.RARE_TYPE_B); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"of snaring a target")) { + return new MobHead(MobHeadType.CAVE_SPIDER, true, MobHeadRareType.RARE_TYPE_A); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+3 "+ChatColor.GOLD+"second Poison duration")) { + return new MobHead(MobHeadType.CAVE_SPIDER, true, MobHeadRareType.RARE_TYPE_B); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+3% "+ChatColor.GOLD+"chance to send enemy")) { + return new MobHead(MobHeadType.BLAZE, true, MobHeadRareType.RARE_TYPE_A); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+3 "+ChatColor.GOLD+"second ignite duration")) { + return new MobHead(MobHeadType.BLAZE, true, MobHeadRareType.RARE_TYPE_B); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+3% "+ChatColor.GOLD+"chance to send down")) { + return new MobHead(MobHeadType.GHAST, true, MobHeadRareType.RARE_TYPE_A); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"-5% "+ChatColor.GOLD+"damage taken on hit")) { + return new MobHead(MobHeadType.GHAST, true, MobHeadRareType.RARE_TYPE_B); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+10% "+ChatColor.GOLD+"chance of dropping a")) { + return new MobHead(MobHeadType.ZOMBIE_PIGMAN, true, MobHeadRareType.RARE_TYPE_A); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+3% "+ChatColor.GOLD+"chance of being fully")) { + return new MobHead(MobHeadType.ZOMBIE_PIGMAN, true, MobHeadRareType.RARE_TYPE_B); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"chance of burning an")) { + return new MobHead(MobHeadType.BLAZE, true, MobHeadRareType.RARE_TYPE_A); + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"chance of setting the")) { + return new MobHead(MobHeadType.BLAZE, true, MobHeadRareType.RARE_TYPE_B); + } + } + return null; + } + + /** + * Checks if the given head is powered or + * unpowered. + * @param head The mob head to check for. + * @return Returns true if the head is powered + * or false otherwise. + */ + static public boolean isUnpoweredHead(MobHead head) { + return !head.is_powered; + } + + /** + * Converts an unpowered mob head to a powered + * version. If this head is not an unpowered version + * or something bad happens along the way, it + * simply returns the same ItemStack that was + * given. + * @param item The head item we are converting. + * @return The converted mob head. (Or the same + * mob head that was given if something bad + * happened.) + */ + static public ItemStack convertToPoweredHead(ItemStack item) { + if (item!=null && item.getType()==Material.SKULL_ITEM && item.hasItemMeta() && item.getItemMeta().hasLore()) { + ItemStack newitem = new ItemStack(Material.SKULL_ITEM); + List getLore = item.getItemMeta().getLore(); + ItemMeta newitem_meta = item.getItemMeta(); + newitem.setData(item.getData()); + if (newitem_meta.getDisplayName().contains("Rare")) { + newitem_meta.setDisplayName(ChatColor.BLUE+"Powered "+newitem_meta.getDisplayName()); + } else { + newitem_meta.setDisplayName(ChatColor.RESET+"Powered "+newitem_meta.getDisplayName()); + } + newitem.setItemMeta(newitem_meta); + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+5 "+ChatColor.GOLD+"second "+ChatColor.GRAY+"Wither I"+ChatColor.GOLD+" duration")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.GOLD+"Stacks Wither effect by 1"); + newLore.add(ChatColor.GOLD+"per hit for 5 seconds."); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"Ranged Damage")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"Ranged Damage "+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"m/s Projectile Speed"); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"Lifesteal")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"Lifesteal"+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"Max Health"); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"AoE Damage")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"AoE Damage"+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"Damage over time to"); + newLore.add(ChatColor.GOLD+" all nearby enemies."); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"Slow on hit")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"Slow on hit"+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"second Poison duration"); + newLore.add(ChatColor.GOLD+" on hit."); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"Critical Chance")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"Critical Chance"+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"Item Drop Increase"); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"second Poison duration")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"second Poison duration"); + newLore.add(ChatColor.GOLD+" on hit."+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"chance of snaring the"); + newLore.add(ChatColor.GOLD+" target for 5 seconds."); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"second ignite duration")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"second ignite duration"); + newLore.add(ChatColor.GOLD+" on hit."+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"chance of sending the"); + newLore.add(ChatColor.GOLD+" enemy airborne."); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"-1% "+ChatColor.GOLD+"damage taken on hit")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"-1% "+ChatColor.GOLD+"damage taken on hit"+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"chance to send down"); + newLore.add(ChatColor.GOLD+" lightning onto your enemy."); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"chance of being fully")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"chance of being fully"); + newLore.add(ChatColor.GOLD+" healed on a kill."+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+3% "+ChatColor.GOLD+"chance of dropping a"); + newLore.add(ChatColor.GOLD+" Golden Nugget on a kill"); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"chance of setting the")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"chance of setting the"); + newLore.add(ChatColor.GOLD+" mob and surrounding mobs on fire"); + newLore.add(ChatColor.GOLD+" for 10 seconds."+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"chance of burning an"); + newLore.add(ChatColor.GOLD+" enemy to a crisp."); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+15 "+ChatColor.GOLD+"second "+ChatColor.GRAY+"Wither III"+ChatColor.GOLD+" duration")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.GOLD+"Stacks Wither effect by 2"); + newLore.add(ChatColor.GOLD+"per hit for 20 seconds."); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+3% "+ChatColor.GOLD+"Ranged Damage") || + getLore.contains(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"m/s Projectile Speed")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"Ranged Damage "+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+3 "+ChatColor.GOLD+"m/s Projectile Speed"); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+3% "+ChatColor.GOLD+"Lifesteal") || + getLore.contains(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"Max Health")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"Lifesteal"+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+4 "+ChatColor.GOLD+"Max Health"); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1 "+ChatColor.GOLD+"Damage to all nearby enemies.") || + getLore.contains(ChatColor.LIGHT_PURPLE+"+20% "+ChatColor.GOLD+"AoE Damage")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"+30% "+ChatColor.GOLD+"AoE Damage"+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+3 "+ChatColor.GOLD+"Damage over time to"); + newLore.add(ChatColor.GOLD+" all nearby enemies."); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+2 "+ChatColor.GOLD+"second Poison duration") || + getLore.contains(ChatColor.LIGHT_PURPLE+"+15% "+ChatColor.GOLD+"Slow on hit")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"+30% "+ChatColor.GOLD+"Slow on hit"+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+5 "+ChatColor.GOLD+"second Poison duration"); + newLore.add(ChatColor.GOLD+" on hit."); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+1% "+ChatColor.GOLD+"Item Drop Amount Increase") || + getLore.contains(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"Critical Chance")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"+10% "+ChatColor.GOLD+"Critical Chance"+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+3% "+ChatColor.GOLD+"Item Drop Increase"); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"of snaring a target") || + getLore.contains(ChatColor.LIGHT_PURPLE+"+3 "+ChatColor.GOLD+"second Poison duration")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"+5 "+ChatColor.GOLD+"second Poison duration"); + newLore.add(ChatColor.GOLD+" on hit."+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+8% "+ChatColor.GOLD+"chance of snaring the"); + newLore.add(ChatColor.GOLD+" target for 5 seconds."); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+3% "+ChatColor.GOLD+"chance to send enemy") || + getLore.contains(ChatColor.LIGHT_PURPLE+"+3 "+ChatColor.GOLD+"second ignite duration")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"+5 "+ChatColor.GOLD+"second ignite duration"); + newLore.add(ChatColor.GOLD+" on hit."+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+10% "+ChatColor.GOLD+"chance of sending the"); + newLore.add(ChatColor.GOLD+" enemy airborne."); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+3% "+ChatColor.GOLD+"chance to send down") || + getLore.contains(ChatColor.LIGHT_PURPLE+"-5% "+ChatColor.GOLD+"damage taken on hit")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"-10% "+ChatColor.GOLD+"damage taken on hit"+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+10% "+ChatColor.GOLD+"chance to send down"); + newLore.add(ChatColor.GOLD+" lightning onto your enemy."); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+10% "+ChatColor.GOLD+"chance of dropping a") || + getLore.contains(ChatColor.LIGHT_PURPLE+"+3% "+ChatColor.GOLD+"chance of being fully")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"chance of being fully"); + newLore.add(ChatColor.GOLD+" healed on a kill."+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+20% "+ChatColor.GOLD+"chance of dropping a"); + newLore.add(ChatColor.GOLD+" Golden Nugget on a kill"); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + if (getLore.contains(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"chance of burning an") || + getLore.contains(ChatColor.LIGHT_PURPLE+"+5% "+ChatColor.GOLD+"chance of setting the")) { + ItemMeta meta = newitem.getItemMeta(); + List newLore = new ArrayList(); + newLore.add(ChatColor.LIGHT_PURPLE+"+10% "+ChatColor.GOLD+"chance of setting the"); + newLore.add(ChatColor.GOLD+" mob and surrounding mobs on fire"); + newLore.add(ChatColor.GOLD+" for 10 seconds."+ChatColor.BLUE+" &"); + newLore.add(ChatColor.LIGHT_PURPLE+"+10% "+ChatColor.GOLD+"chance of burning an"); + newLore.add(ChatColor.GOLD+" enemy to a crisp."); + meta.setLore(newLore); + newitem.setItemMeta(meta); + return newitem; + } + } + return item; + } + @Override + public String toString() { + return "MobHead(Type: "+head_type.name()+", Rare Type: "+rare_head_type.name()+", is_rare:"+rare_head+", is_powered:"+is_powered+")"; + } + public MobHead(MobHeadType head_type) { + MobHead(head_type, false, MobHeadRareType.RARE_TYPE_A, false); + } + public MobHead(MobHeadType head_type, boolean is_rare) { + MobHead(head_type, is_rare, MobHeadRareType.RARE_TYPE_A, false); + } + public MobHead(MobHeadType head_type, boolean is_rare, MobHeadRareType rare_head_type) { + MobHead(head_type, is_rare, rare_head_type, false); + } + public MobHead(MobHeadType head_type, boolean is_rare, boolean is_powered) { + MobHead(head_type, is_rare, MobHeadRareType.RARE_TYPE_A, is_powered); + } + public MobHead(MobHeadType head_type, boolean is_rare, MobHeadRareType rare_head_type, boolean is_powered) { + MobHead(head_type, is_rare, rare_head_type, is_powered); + } + void MobHead(MobHeadType head_type, boolean is_rare, MobHeadRareType rare_head_type, boolean is_powered) { + this.head_type=head_type; + this.rare_head_type=rare_head_type; + this.rare_head=is_rare; + this.is_powered=is_powered; + } +} \ No newline at end of file diff --git a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java index 6f5486f..d82f986 100644 --- a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java +++ b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java @@ -33,6 +33,7 @@ import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.OfflinePlayer; +import org.bukkit.SkullType; import org.bukkit.Sound; import org.bukkit.World; import org.bukkit.block.Biome; @@ -49,6 +50,7 @@ import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.AnimalTamer; import org.bukkit.entity.Animals; +import org.bukkit.entity.Arrow; import org.bukkit.entity.Chicken; import org.bukkit.entity.Cow; import org.bukkit.entity.Creature; @@ -129,6 +131,7 @@ import org.bukkit.event.inventory.CraftItemEvent; import org.bukkit.event.inventory.FurnaceBurnEvent; import org.bukkit.event.inventory.FurnaceExtractEvent; import org.bukkit.event.inventory.FurnaceSmeltEvent; +import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryDragEvent; @@ -223,6 +226,8 @@ import me.kaZep.Base.PersistentExplorerList; import me.kaZep.Base.PlayerData; import me.kaZep.Base.SupportEntity; import me.kaZep.Base.SupportPlayer; +import me.kaZep.Base.MobHead.MobHeadRareType; +import me.kaZep.Base.MobHead.MobHeadType; import me.kaZep.Commands.JobsDataInfo.Job; public class PlayerListener @@ -334,9 +339,9 @@ implements Listener public void onServerListPing(ServerListPingEvent e) { e.setMaxPlayers(16); if (this.plugin.getConfig().getBoolean("maintenance-mode")) { - e.setMotd(ChatColor.RED+"Currently in Maintenance Mode."); + e.setMotd(ChatColor.AQUA+"Sig's Minecraft!\n"+ChatColor.RED+"Currently in Maintenance Mode."); } else { - e.setMotd("Sig's Minecraft - "+ChatColor.BLUE+"Currently Online."); + e.setMotd(ChatColor.AQUA+"Sig's Minecraft!\n"+ChatColor.BLUE+"Currently Online."); } return; } @@ -1957,6 +1962,7 @@ implements Listener Main.economy.depositPlayer(p.getName().toLowerCase(), 70); this.plugin.getAccountsConfig().set(p.getName().toLowerCase() + ".status", Boolean.valueOf(true)); this.plugin.getAccountsConfig().set(p.getName().toLowerCase() + ".money", Double.valueOf(this.plugin.getConfig().getDouble("start-balance"))); + this.plugin.getAccountsConfig().set(p.getName().toLowerCase() + ".interestdistributedtime", Long.valueOf(Main.SERVER_TICK_TIME)); this.plugin.getAccountsConfig().set(p.getName().toLowerCase() + ".revived", Boolean.valueOf(true)); this.plugin.getAccountsConfig().set(p.getName().toLowerCase() + ".spleefrating", Double.valueOf(1000.0d)); this.plugin.getAccountsConfig().set(p.getName().toLowerCase() + ".spleefwins", Integer.valueOf(0)); @@ -2022,6 +2028,10 @@ implements Listener p.sendMessage(ChatColor.DARK_AQUA+"For a list of all changes made to this server, visit: http://z-gamers.net/changelog.html"); p.sendMessage("----------------------------"); p.sendMessage(ChatColor.YELLOW+"Current Money Balance: $ "+df.format(Main.economy.bankBalance(p.getName().toLowerCase()).balance)+", Bank Balance: $"+df.format(this.plugin.getAccountsConfig().getDouble(p.getName().toLowerCase()+".money"))); + if (!this.plugin.getAccountsConfig().contains(p.getName().toLowerCase() + ".interestdistributedtime")) { + this.plugin.getAccountsConfig().set(p.getName().toLowerCase()+".interestdistributedtime", Long.valueOf(Main.SERVER_TICK_TIME)); + //this.plugin.saveAccountsConfig(); + } //Update account information for the stat point update. if (!this.plugin.getAccountsConfig().contains(p.getName().toLowerCase() + ".jobs.job1_30")) { this.plugin.getAccountsConfig().set(p.getName().toLowerCase()+".jobs.job1_30", Integer.valueOf(0)); @@ -6098,6 +6108,8 @@ implements Listener public void onItemPrepareCraft(PrepareItemCraftEvent e) { CraftingInventory result = e.getInventory(); + //Bukkit.getLogger().info("Triggered PrepareItemCraftEvent."); + //****************************// Job Boofs poof here. if (result.getResult().getType()==Material.WOOD) { @@ -6151,6 +6163,62 @@ implements Listener return; //Don't allow it to continue. } } + + if (result.getResult().getType()==Material.SKULL_ITEM) { + //This could potentially be a mob head. + //Find the mob head. + boolean found=false; + for (int i=0;i1) { + //Every stack only has half a chance of the previous one to still exist. + int newamt=1; + for (int j=0;j player_mobheads = this.plugin.getMobHeads(p); + int skeleton_heads = this.plugin.getMobHeadAmt(new MobHead(MobHeadType.SKELETON), player_mobheads); + int powered_skeleton_heads = this.plugin.getMobHeadAmt(new MobHead(MobHeadType.SKELETON, false, true), player_mobheads); + int rare_skeleton_heads = this.plugin.getMobHeadAmt(new MobHead(MobHeadType.SKELETON, true, MobHeadRareType.RARE_TYPE_A), player_mobheads); + int powered_rare_skeleton_heads = this.plugin.getMobHeadAmt(new MobHead(MobHeadType.SKELETON, true, MobHeadRareType.RARE_TYPE_A, true), player_mobheads); + /*if (skeleton_heads>0) { + Bukkit.getLogger().info("Found "+skeleton_heads+" skeleton mob heads."); + } + if (powered_skeleton_heads>0) { + Bukkit.getLogger().info("Found "+powered_skeleton_heads+" powered skeleton mob heads."); + } + if (rare_skeleton_heads>0) { + Bukkit.getLogger().info("Found "+rare_skeleton_heads+" rare skeleton mob heads."); + } + if (powered_rare_skeleton_heads>0) { + Bukkit.getLogger().info("Found "+powered_rare_skeleton_heads+" powered rare skeleton "s."); + }*/ + if (skeleton_heads+powered_skeleton_heads+rare_skeleton_heads+powered_rare_skeleton_heads>0) { + //Bukkit.getLogger().info("Old damage was "+e.getDamage()); + e.setDamage(e.getDamage()+(e.getDamage()*(0.01*skeleton_heads))); + e.setDamage(e.getDamage()+(e.getDamage()*(0.01*powered_skeleton_heads))); + e.setDamage(e.getDamage()+(e.getDamage()*(0.03*rare_skeleton_heads))); + e.setDamage(e.getDamage()+(e.getDamage()*(0.05*powered_rare_skeleton_heads))); + //Bukkit.getLogger().info("New damage is "+e.getDamage()); + } if (this.plugin.hasJobBuff("Hunter", p, Job.JOB30B)) { armor_pen+=10; } @@ -11127,8 +11343,10 @@ implements Listener if (f.getCustomName()!=null) { if (enemy_starthp-f.getHealth()+armor_dmg>0.1) { p.sendMessage(ChatColor.RED+""+ChatColor.ITALIC+"Dealt "+df.format(enemy_starthp-f.getHealth()+armor_dmg)+" damage to "+f.getCustomName()+ChatColor.RED+""+ChatColor.ITALIC+" (-"+df2.format(((enemy_starthp-f.getHealth())/f.getMaxHealth())*100)+"%)"); - } else { - p.sendMessage(ChatColor.RED+""+ChatColor.ITALIC+"Dealt "+df.format(enemy_starthp-f.getHealth()+armor_dmg)+" damage to "+ChatColor.WHITE+f.getType()+ChatColor.RED+""+ChatColor.ITALIC+" (-"+df2.format(((enemy_starthp-f.getHealth())/f.getMaxHealth())*100)+"%)"); + } + } else { + if (enemy_starthp-f.getHealth()+armor_dmg>0.1) { + p.sendMessage(ChatColor.RED+""+ChatColor.ITALIC+"Dealt "+df.format(enemy_starthp-f.getHealth()+armor_dmg)+" damage to "+ChatColor.WHITE+f.getType().name()+ChatColor.RED+""+ChatColor.ITALIC+" (-"+df2.format(((enemy_starthp-f.getHealth())/f.getMaxHealth())*100)+"%)"); } } } @@ -12414,7 +12632,7 @@ implements Listener //Subtract 1 from cursor. //If the item matches or it's blank. if (event.getInventory().getItem(3)!=null) { - if (event.getClick()==ClickType.LEFT) { + if (event.getClick()==ClickType.LEFT && event.getAction()!=InventoryAction.COLLECT_TO_CURSOR) { if (event.getInventory().getItem(3).getType()==event.getCursor().getType() || event.getInventory().getItem(3).getType()==Material.AIR) { int amt = event.getInventory().getItem(3).getAmount(); if (amt+event.getCursor().getAmount()>event.getInventory().getItem(3).getMaxStackSize()) { @@ -12425,16 +12643,19 @@ implements Listener newamt.setAmount(leftover); event.getInventory().setItem(3, newamt2); event.setCursor(newamt); + event.setResult(Result.ALLOW); } else { //Just transfer it all. event.getInventory().setItem(3, event.getCursor()); event.setCursor(new ItemStack(Material.AIR)); + event.setResult(Result.ALLOW); } } else { //Swap them. ItemStack swap = event.getInventory().getItem(3).clone(); event.getInventory().setItem(3, event.getCursor()); event.setCursor(swap); + event.setResult(Result.ALLOW); } } else if (event.getClick()==ClickType.RIGHT) { @@ -12448,6 +12669,7 @@ implements Listener newamt.setAmount(leftover); event.getInventory().setItem(3, newamt2); event.setCursor(newamt); + event.setResult(Result.ALLOW); } else { //Just transfer 1. ItemStack curs = event.getCursor().clone(); @@ -12456,28 +12678,33 @@ implements Listener inven.setAmount(inven.getAmount()+1); event.getInventory().setItem(3, inven); event.setCursor(curs); + event.setResult(Result.ALLOW); } } else { //Swap them. ItemStack swap = event.getInventory().getItem(3).clone(); event.getInventory().setItem(3, event.getCursor()); event.setCursor(swap); + event.setResult(Result.ALLOW); } } } else { if (event.getClick()==ClickType.LEFT) { event.getInventory().setItem(3, event.getCursor()); event.setCursor(new ItemStack(Material.AIR)); + event.setResult(Result.ALLOW); } else if (event.getClick()==ClickType.RIGHT) { if (event.getCursor().getAmount()==1) { event.getInventory().setItem(3, event.getCursor()); event.setCursor(new ItemStack(Material.AIR)); + event.setResult(Result.ALLOW); } else { ItemStack curs = event.getCursor().clone(); curs.setAmount(curs.getAmount()-1); ItemStack curs2 = event.getCursor().clone(); curs2.setAmount(1); event.getInventory().setItem(3, curs2); event.setCursor(curs); + event.setResult(Result.ALLOW); } } } @@ -12507,6 +12734,7 @@ implements Listener if (pot1!=null && pot1.getDurability()==0) {brew=true;} if (pot2!=null && pot2.getDurability()==0) {brew=true;} if (pot3!=null && pot3.getDurability()==0) {brew=true;} + Bukkit.getLogger().info("Checking in slot 3: "+event.getInventory().getItem(3).toString()); if (event.getInventory().getItem(3).getType()==Material.INK_SACK && brew) { ItemStack pot = new ItemStack(Material.POTION); pot.setDurability((short)16391); @@ -13675,8 +13903,21 @@ implements Listener if (!anvilClicked) { // Clicked the inventory. Leave the operation alone UNLESS it's a shift-click operation. if (event.isShiftClick()) { - // Call the scheduled task to validate and update the inventory - Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, new updateInventoryTask(event.getWhoClicked().getName())); + // Call the scheduled task to validate and update the inventory + int task=-1, tries=100; + do { + task = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, new updateInventoryTask(event.getWhoClicked().getName())); + tries--; + Bukkit.getLogger().info("Trying updateInventoryTask(). tries="+tries); + } while (task==-1 && tries>0); + if (tries<0) { + Bukkit.getLogger().severe("Could not updateInventoryTask() for whatever reason. Stop trying."); + //Failed for some reason. Cancel the click instead. + event.setCancelled(true); + event.getWhoClicked().getInventory().setContents(event.getWhoClicked().getInventory().getContents()); + event.getInventory().setContents(event.getInventory().getContents()); + p.updateInventory(); + } } } else { // Clicked the anvil. If GUI items are clicked or an invalid operation happens, cancel the operation. @@ -13786,8 +14027,20 @@ implements Listener } event.getInventory().setItem(OUTPUT, new ItemStack(Material.AIR)); - Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, new updateInventoryTask(event.getWhoClicked().getName())); - + int task=-1, tries=100; + do { + task = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, new updateInventoryTask(event.getWhoClicked().getName())); + tries--; + Bukkit.getLogger().info("Trying updateInventoryTask(). tries="+tries); + } while (task==-1 && tries>0); + if (tries<0) { + Bukkit.getLogger().severe("Could not updateInventoryTask() for whatever reason. Stop trying."); + //Failed for some reason. Cancel the click instead. + event.setCancelled(true); + event.getWhoClicked().getInventory().setContents(event.getWhoClicked().getInventory().getContents()); + event.getInventory().setContents(event.getInventory().getContents()); + p.updateInventory(); + } } } } else { @@ -13871,7 +14124,20 @@ implements Listener event.getInventory().setItem(OUTPUT, new ItemStack(Material.AIR)); - Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, new updateInventoryTask(event.getWhoClicked().getName())); + int task=-1, tries=100; + do { + task = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, new updateInventoryTask(event.getWhoClicked().getName())); + tries--; + Bukkit.getLogger().info("Trying updateInventoryTask(). tries="+tries); + } while (task==-1 && tries>0); + if (tries<0) { + Bukkit.getLogger().severe("Could not updateInventoryTask() for whatever reason. Stop trying."); + //Failed for some reason. Cancel the click instead. + event.setCancelled(true); + event.getWhoClicked().getInventory().setContents(event.getWhoClicked().getInventory().getContents()); + event.getInventory().setContents(event.getInventory().getContents()); + p.updateInventory(); + } } } else { // Bukkit.getLogger().info("Normal click"); @@ -13935,8 +14201,20 @@ implements Listener Bukkit.getPlayer(event.getWhoClicked().getName()).getWorld().playSound(Bukkit.getPlayer(event.getWhoClicked().getName()).getLocation(), Sound.LEVEL_UP, 10, 1); } - Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, new updateInventoryTask(event.getWhoClicked().getName())); - + int task=-1, tries=100; + do { + task = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, new updateInventoryTask(event.getWhoClicked().getName())); + tries--; + Bukkit.getLogger().info("Trying updateInventoryTask(). tries="+tries); + } while (task==-1 && tries>0); + if (tries<0) { + Bukkit.getLogger().severe("Could not updateInventoryTask() for whatever reason. Stop trying."); + //Failed for some reason. Cancel the click instead. + event.setCancelled(true); + event.getWhoClicked().getInventory().setContents(event.getWhoClicked().getInventory().getContents()); + event.getInventory().setContents(event.getInventory().getContents()); + p.updateInventory(); + } } } @@ -14022,7 +14300,20 @@ implements Listener Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, new updateInventoryTask(event.getWhoClicked().getName())); } */ - Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, new updateInventoryTask(event.getWhoClicked().getName())); + int task=-1, tries=100; + do { + task = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, new updateInventoryTask(event.getWhoClicked().getName())); + tries--; + Bukkit.getLogger().info("Trying updateInventoryTask(). tries="+tries); + } while (task==-1 && tries>0); + if (tries<0) { + Bukkit.getLogger().severe("Could not updateInventoryTask() for whatever reason. Stop trying."); + //Failed for some reason. Cancel the click instead. + event.setCancelled(true); + event.getWhoClicked().getInventory().setContents(event.getWhoClicked().getInventory().getContents()); + event.getInventory().setContents(event.getInventory().getContents()); + p.updateInventory(); + } } else { event.setCancelled(true); } @@ -14067,6 +14358,19 @@ implements Listener } } + if (event.isCancelled()) { + final Player p2 = p; + final InventoryClickEvent e2 = event; + Bukkit.getScheduler().scheduleSyncDelayedTask(this.plugin, new + Runnable() { + @Override + public void run() { + e2.getInventory().setContents(e2.getInventory().getContents()); + p2.getInventory().setContents(p2.getInventory().getContents()); + p2.updateInventory(); + } + }, 1); + } } private void rewardCraft(ItemStack item, int amount, HumanEntity pl) { @@ -14841,6 +15145,28 @@ implements Listener @EventHandler public void onProjectilLaunch(ProjectileLaunchEvent e) { Projectile thrown_obj = e.getEntity(); + if (thrown_obj instanceof Arrow) { + if (thrown_obj.getShooter()!=null && (thrown_obj.getShooter() instanceof Player)) { + Player p = (Player)thrown_obj.getShooter(); + List mobheads = this.plugin.getMobHeads(p); + int skeleton_mob_head = this.plugin.getMobHeadAmt(new MobHead(MobHeadType.SKELETON, true, MobHeadRareType.RARE_TYPE_B), mobheads); + int powered_skeleton_mob_head = this.plugin.getMobHeadAmt(new MobHead(MobHeadType.SKELETON, false, true), mobheads); + int powered_rare_skeleton_mob_head = this.plugin.getMobHeadAmt(new MobHead(MobHeadType.SKELETON, true, MobHeadRareType.RARE_TYPE_A, true), mobheads); + if (skeleton_mob_head+powered_skeleton_mob_head+powered_rare_skeleton_mob_head>0) { + //Bukkit.getLogger().info("Old Projectile speed: "+thrown_obj.getVelocity().toString()); + for (int i=0;iMain.SERVER_TICK_TIME) { //Parse the amount. double val=0; @@ -16353,6 +16681,7 @@ implements Listener this.plugin.economy.withdrawPlayer(e.getPlayer().getName(), val); double mymoney = this.plugin.getAccountsConfig().getDouble(e.getPlayer().getName().toLowerCase() + ".money"); this.plugin.getAccountsConfig().set(e.getPlayer().getName().toLowerCase() + ".money", Double.valueOf(mymoney+val)); + this.plugin.compoundInterest(e.getPlayer()); //this.plugin.saveAccountsConfig(); e.getPlayer().sendMessage(ChatColor.GREEN+"Deposited $" + df.format(val) + " into your account. " + ChatColor.YELLOW + "New Bank Balance: $" + ChatColor.AQUA + df.format(this.plugin.getAccountsConfig().getDouble(e.getPlayer().getName().toLowerCase() + ".money"))); this.plugin.last_bank_deposit_use_time=0; @@ -16366,6 +16695,7 @@ implements Listener this.plugin.economy.withdrawPlayer(e.getPlayer().getName(), val); double mymoney = this.plugin.getAccountsConfig().getDouble(e.getPlayer().getName().toLowerCase() + ".money"); this.plugin.getAccountsConfig().set(e.getPlayer().getName().toLowerCase() + ".money", Double.valueOf(mymoney+val)); + this.plugin.compoundInterest(e.getPlayer()); //this.plugin.saveAccountsConfig(); e.getPlayer().sendMessage(ChatColor.GREEN+"Deposited $" + df.format(val) + " into your account. " + ChatColor.YELLOW + "New Bank Balance: $" + ChatColor.AQUA + df.format(this.plugin.getAccountsConfig().getDouble(e.getPlayer().getName().toLowerCase() + ".money"))); this.plugin.last_bank_deposit_use_time=0; @@ -16385,6 +16715,7 @@ implements Listener double val=0; if (e.getMessage().equalsIgnoreCase("all")) { //Withdraw all the money in their account. + this.plugin.compoundInterest(e.getPlayer()); val = this.plugin.getAccountsConfig().getDouble(e.getPlayer().getName().toLowerCase() + ".money"); this.plugin.getAccountsConfig().set(e.getPlayer().getName().toLowerCase() + ".money", Double.valueOf(0)); //this.plugin.saveAccountsConfig(); @@ -16395,6 +16726,7 @@ implements Listener try { val = Double.parseDouble(e.getMessage()); //Make sure the user is holding at least that much money. + this.plugin.compoundInterest(e.getPlayer()); if (this.plugin.getAccountsConfig().getDouble(e.getPlayer().getName().toLowerCase() + ".money")>=val && val>0) { //Deposit the money into their account. //this.plugin.economy.bankDeposit(e.getPlayer().getName(), val); @@ -17579,7 +17911,7 @@ implements Listener //******************************//End Job related buffs. - if (e.getAction()==Action.RIGHT_CLICK_BLOCK && p.isSneaking() && e.getClickedBlock().getType()==Material.BOOKSHELF) { + if (e.getAction()==Action.RIGHT_CLICK_BLOCK && !p.isSneaking() && e.getClickedBlock().getType()==Material.BOOKSHELF) { viewBookshelf(p, e.getClickedBlock().getLocation()); e.setCancelled(true); } @@ -18093,18 +18425,15 @@ implements Listener } else if ((sign.getLine(0).equalsIgnoreCase(ChatColor.DARK_GREEN + "[Bank]")) && (sign.getLine(1).equalsIgnoreCase(ChatColor.DARK_GRAY + "Check Balance"))) { p.sendMessage(ChatColor.GRAY + "===========[ " + ChatColor.LIGHT_PURPLE + "Current Balance" + ChatColor.GRAY + " ]==========="); DecimalFormat df = new DecimalFormat("#0.00"); - if (actMon <= 1) - p.sendMessage(ChatColor.DARK_GREEN + "Balance: $" + ChatColor.BOLD + ChatColor.AQUA + df.format(actMon)); - else { - p.sendMessage(ChatColor.DARK_GREEN + "Balance: $" + ChatColor.BOLD + ChatColor.AQUA + df.format(actMon)); - } + //Update money with interest. + actMon=this.plugin.compoundInterest(p); + p.sendMessage(ChatColor.DARK_GREEN + "Balance: $" + ChatColor.BOLD + ChatColor.AQUA + df.format(actMon)); /* if (stats) p.sendMessage(ChatColor.DARK_GREEN + "Status: " + ChatColor.AQUA + "enabled"); else if (!stats) { p.sendMessage(ChatColor.DARK_GREEN + "Status: " + ChatColor.AQUA + "disabled"); }*/ - p.sendMessage(ChatColor.GRAY + "======================================"); } } else diff --git a/BankEconomyMod/src/me/kaZep/Base/RecyclingCenterNode.java b/BankEconomyMod/src/me/kaZep/Base/RecyclingCenterNode.java index 887c5d3..9d48f8c 100644 --- a/BankEconomyMod/src/me/kaZep/Base/RecyclingCenterNode.java +++ b/BankEconomyMod/src/me/kaZep/Base/RecyclingCenterNode.java @@ -91,7 +91,9 @@ public class RecyclingCenterNode { } public void recycleItem(ItemStack item) { - if (item.getItemMeta().hasDisplayName()==false) { + boolean allowed=true; + if (item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().toLowerCase().contains("quickshop")) {allowed=false;} + if (allowed) { //Choose one of the random recycling centers. int center=(int)(Math.random()*locations.size()); double tempchance = chance; //Store the current chance so we can check for duplicates. diff --git a/BankEconomyMod/src/me/kaZep/Commands/commandBankEconomy.java b/BankEconomyMod/src/me/kaZep/Commands/commandBankEconomy.java index f72c743..d8d82b4 100644 --- a/BankEconomyMod/src/me/kaZep/Commands/commandBankEconomy.java +++ b/BankEconomyMod/src/me/kaZep/Commands/commandBankEconomy.java @@ -10,6 +10,9 @@ import java.util.List; import java.util.Map; import me.kaZep.Base.Main; +import me.kaZep.Base.MobHead; +import me.kaZep.Base.MobHead.MobHeadRareType; +import me.kaZep.Base.MobHead.MobHeadType; import me.kaZep.Commands.JobsDataInfo.Job; import net.jmhertlein.mctowns.MCTowns; import net.jmhertlein.mctowns.MCTownsPlugin; @@ -357,7 +360,8 @@ public String convertToItemName(String val) { Player p = (Player)sender; boolean status = this.plugin.getAccountsConfig().getBoolean(p.getName().toLowerCase() + ".status"); - int playerBankBalance = this.plugin.getAccountsConfig().getInt(p.getName().toLowerCase() + ".money"); + double playerBankBalance = this.plugin.getAccountsConfig().getInt(p.getName().toLowerCase() + ".money"); + playerBankBalance = this.plugin.compoundInterest(p); String currencySingular = Main.economy.currencyNameSingular(); String currencyPlural = Main.economy.currencyNamePlural(); @@ -387,7 +391,7 @@ public String convertToItemName(String val) { } } else if (cmd.getName().toLowerCase().equalsIgnoreCase("tele")) { - p.sendMessage("Usage: "+ChatColor.RED+"/tele to "+ChatColor.GREEN+" "+ChatColor.WHITE+" - Teleport to a player for a cost."); + p.sendMessage("Usage: "+ChatColor.RED+"/tele to "+ChatColor.GREEN+" "+ChatColor.WHITE+" - Teleport to a player/town for a cost."); } else if (cmd.getName().toLowerCase().equalsIgnoreCase("settings")) { Inventory i = Bukkit.createInventory(p, 27, "Notification Options"); @@ -566,9 +570,13 @@ public String convertToItemName(String val) { if (meta.getDisplayName()==null) { meta.setDisplayName(ChatColor.RESET+""); } - for (int i=0;i lore = new ArrayList(); @@ -845,8 +889,6 @@ public String convertToItemName(String val) { i.setItem(count+=1, temp); p.openInventory(i); - - } } if (args[0].equalsIgnoreCase("newmobs")) { @@ -1835,10 +1877,9 @@ public String convertToItemName(String val) { } else if (cmd.getName().toLowerCase().equalsIgnoreCase("bankeconomy") && (args[0].equalsIgnoreCase("info")) && (p.hasPermission("bankeconomy.info"))) { if (args.length == 1) { - if (playerBankBalance <= 1) - p.sendMessage(this.prefix + " " + this.cmdInfo + " " + playerBankBalance + currencySingular + "a."); - else if (playerBankBalance > 1) - p.sendMessage(this.prefix + " " + this.cmdInfo + " " + playerBankBalance + currencyPlural + "a."); + p.sendMessage(ChatColor.GRAY + "===========[ " + ChatColor.LIGHT_PURPLE + "Current Balance" + ChatColor.GRAY + " ]==========="); + DecimalFormat df = new DecimalFormat("#0.00"); + p.sendMessage(ChatColor.DARK_GREEN + "Balance: $" + ChatColor.BOLD + ChatColor.AQUA + df.format(playerBankBalance)); } else p.sendMessage(this.invARG);