From 4bc6abfef8d852e78d31283a873bdce3be73d918 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Sat, 18 Jun 2016 12:13:17 -0500 Subject: [PATCH] Re-structure TwosideKeeper project such that it builds properly and has a proper build file. --- TwosideKeeper.jar | Bin 0 -> 182113 bytes projectBuilder.xml | 6 + src/plugin.yml | 39 + src/sig/plugin/TwosideKeeper/Artifact.java | 176 + .../plugin/TwosideKeeper/DeathManager.java | 155 + .../HelperStructures/ArtifactItem.java | 18 + .../HelperStructures/CubeType.java | 5 + .../HelperStructures/DeathStructure.java | 20 + .../HelperStructures/ItemRarity.java | 5 + .../HelperStructures/MalleableBaseQuest.java | 288 + .../HelperStructures/MonsterDifficulty.java | 8 + .../HelperStructures/MonsterType.java | 17 + .../HelperStructures/QuestStatus.java | 6 + .../TwosideKeeper/HelperStructures/Rank.java | 37 + .../HelperStructures/SessionState.java | 9 + .../HelperStructures/ShopPurchase.java | 37 + .../HelperStructures/SpleefArena.java | 6 + .../HelperStructures/WorldShop.java | 258 + .../HelperStructures/WorldShopSession.java | 82 + .../TwosideKeeper/MonsterController.java | 686 ++ src/sig/plugin/TwosideKeeper/Party.java | 211 + .../plugin/TwosideKeeper/PlayerStructure.java | 178 + src/sig/plugin/TwosideKeeper/Recipes.java | 475 ++ .../plugin/TwosideKeeper/RecyclingCenter.java | 100 + src/sig/plugin/TwosideKeeper/SpleefGame.java | 585 ++ .../plugin/TwosideKeeper/SpleefManager.java | 58 + .../plugin/TwosideKeeper/TwosideKeeper.java | 5776 +++++++++++++++++ .../TwosideKeeper/TwosideKeeperAPI.java | 73 + .../TwosideKeeper/WorldShopManager.java | 179 + 29 files changed, 9493 insertions(+) create mode 100644 TwosideKeeper.jar create mode 100644 projectBuilder.xml create mode 100644 src/plugin.yml create mode 100644 src/sig/plugin/TwosideKeeper/Artifact.java create mode 100644 src/sig/plugin/TwosideKeeper/DeathManager.java create mode 100644 src/sig/plugin/TwosideKeeper/HelperStructures/ArtifactItem.java create mode 100644 src/sig/plugin/TwosideKeeper/HelperStructures/CubeType.java create mode 100644 src/sig/plugin/TwosideKeeper/HelperStructures/DeathStructure.java create mode 100644 src/sig/plugin/TwosideKeeper/HelperStructures/ItemRarity.java create mode 100644 src/sig/plugin/TwosideKeeper/HelperStructures/MalleableBaseQuest.java create mode 100644 src/sig/plugin/TwosideKeeper/HelperStructures/MonsterDifficulty.java create mode 100644 src/sig/plugin/TwosideKeeper/HelperStructures/MonsterType.java create mode 100644 src/sig/plugin/TwosideKeeper/HelperStructures/QuestStatus.java create mode 100644 src/sig/plugin/TwosideKeeper/HelperStructures/Rank.java create mode 100644 src/sig/plugin/TwosideKeeper/HelperStructures/SessionState.java create mode 100644 src/sig/plugin/TwosideKeeper/HelperStructures/ShopPurchase.java create mode 100644 src/sig/plugin/TwosideKeeper/HelperStructures/SpleefArena.java create mode 100644 src/sig/plugin/TwosideKeeper/HelperStructures/WorldShop.java create mode 100644 src/sig/plugin/TwosideKeeper/HelperStructures/WorldShopSession.java create mode 100644 src/sig/plugin/TwosideKeeper/MonsterController.java create mode 100644 src/sig/plugin/TwosideKeeper/Party.java create mode 100644 src/sig/plugin/TwosideKeeper/PlayerStructure.java create mode 100644 src/sig/plugin/TwosideKeeper/Recipes.java create mode 100644 src/sig/plugin/TwosideKeeper/RecyclingCenter.java create mode 100644 src/sig/plugin/TwosideKeeper/SpleefGame.java create mode 100644 src/sig/plugin/TwosideKeeper/SpleefManager.java create mode 100644 src/sig/plugin/TwosideKeeper/TwosideKeeper.java create mode 100644 src/sig/plugin/TwosideKeeper/TwosideKeeperAPI.java create mode 100644 src/sig/plugin/TwosideKeeper/WorldShopManager.java diff --git a/TwosideKeeper.jar b/TwosideKeeper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e677ef074f41c0e711558aeb4e43bc078d0eb779 GIT binary patch literal 182113 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≦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 literal 0 HcmV?d00001 diff --git a/projectBuilder.xml b/projectBuilder.xml new file mode 100644 index 0000000..c78ccc0 --- /dev/null +++ b/projectBuilder.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/plugin.yml b/src/plugin.yml new file mode 100644 index 0000000..aeb1b98 --- /dev/null +++ b/src/plugin.yml @@ -0,0 +1,39 @@ +name: TwosideKeeper +main: sig.plugin.TwosideKeeper.TwosideKeeper +version: 3.3.4 +commands: + money: + description: Tells the player the amount of money they are holding. + usage: /money + permission: TwosideKeeper.money + permission-message: You don't have permission to check your balance! + enchant_advanced: + description: Enchants items with more properties. + usage: /enchant_advanced + permission: TwosideKeeper.enchant + permission-message: No permissions! + harden_armor: + description: Hardens a piece of armor. + usage: /harden_armor + permission: TwosideKeeper.harden + permission-message: No permissions! + item_cube: + description: Sets this item as an item cube. + usage: /item_cube + permission: TwosideKeeper.item_cube + permission-message: No permissions! + artifact: + description: Gives the player an artifact. + usage: /artifact + permission: TwosideKeeper.artifact + permission-message: No permissions! + recyclingcenter: + description: Defines a new container for a Recycling Center. + usage: /recyclingcenter + permission: TwosideKeeper.recyclingcenter + permission-message: No permissions! + sound: + description: Toggle sound message notifications. + usage: /sound + permission: TwosideKeeper.sound + permission-message: No permissions! \ No newline at end of file diff --git a/src/sig/plugin/TwosideKeeper/Artifact.java b/src/sig/plugin/TwosideKeeper/Artifact.java new file mode 100644 index 0000000..c6eeb87 --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/Artifact.java @@ -0,0 +1,176 @@ +package sig.plugin.TwosideKeeper; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.material.MaterialData; + +import sig.plugin.TwosideKeeper.HelperStructures.ArtifactItem; + +public class Artifact { + public static ItemStack createArtifactItem(ArtifactItem type) { + ItemStack i = null; + switch (type) { + case ANCIENT_BASE: + i=new ItemStack(Material.CLAY_BALL); + break; + case ANCIENT_CORE: + i=new ItemStack(Material.MAGMA_CREAM); + break; + case ANCIENT_ESSENCE: + i=new ItemStack(Material.SUGAR); + break; + case ARTIFACT_BASE: + i=new ItemStack(Material.CLAY_BALL); + break; + case ARTIFACT_CORE: + i=new ItemStack(Material.MAGMA_CREAM); + break; + case ARTIFACT_ESSENCE: + i=new ItemStack(Material.SUGAR); + break; + case DIVINE_BASE: + i=new ItemStack(Material.CLAY_BALL); + break; + case DIVINE_CORE: + i=new ItemStack(Material.MAGMA_CREAM); + break; + case DIVINE_ESSENCE: + i=new ItemStack(Material.SUGAR); + break; + case LOST_BASE: + i=new ItemStack(Material.CLAY_BALL); + break; + case LOST_CORE: + i=new ItemStack(Material.MAGMA_CREAM); + break; + case LOST_ESSENCE: + i=new ItemStack(Material.SUGAR); + break; + case MALLEABLE_BASE: + i=new ItemStack(Material.INK_SACK,1,(short) 7); + break; + case MYSTERIOUS_ESSENCE: + i=new ItemStack(Material.PUMPKIN_SEEDS); + break; + default: + i=new ItemStack(Material.AIR); + break; + } + return convert(setName(i,type),type,true); + } + public static ItemStack setName(ItemStack i, ArtifactItem type) { + ItemMeta m = i.getItemMeta(); + switch (type) { + case ANCIENT_BASE: + m.setDisplayName(ChatColor.BOLD+""+ChatColor.BLUE+"Ancient Base"); + break; + case ANCIENT_CORE: + m.setDisplayName(ChatColor.BOLD+""+ChatColor.BLUE+"Ancient Core"); + break; + case ANCIENT_ESSENCE: + m.setDisplayName(ChatColor.BOLD+""+ChatColor.BLUE+"Ancient Essence"); + break; + case ARTIFACT_BASE: + m.setDisplayName(ChatColor.BOLD+""+ChatColor.BLUE+"Artifact Base"); + break; + case ARTIFACT_CORE: + m.setDisplayName(ChatColor.BOLD+""+ChatColor.BLUE+"Artifact Core"); + break; + case ARTIFACT_ESSENCE: + m.setDisplayName(ChatColor.BOLD+""+ChatColor.BLUE+"Artifact Essence"); + break; + case DIVINE_BASE: + m.setDisplayName(ChatColor.BOLD+""+ChatColor.BLUE+"Divine Base"); + break; + case DIVINE_CORE: + m.setDisplayName(ChatColor.BOLD+""+ChatColor.BLUE+"Divine Core"); + break; + case DIVINE_ESSENCE: + m.setDisplayName(ChatColor.BOLD+""+ChatColor.BLUE+"Divine Essence"); + break; + case LOST_BASE: + m.setDisplayName(ChatColor.BOLD+""+ChatColor.BLUE+"Lost Base"); + break; + case LOST_CORE: + m.setDisplayName(ChatColor.BOLD+""+ChatColor.BLUE+"Lost Core"); + break; + case LOST_ESSENCE: + m.setDisplayName(ChatColor.BOLD+""+ChatColor.BLUE+"Lost Essence"); + break; + case MALLEABLE_BASE: + m.setDisplayName(ChatColor.BOLD+""+ChatColor.BLUE+"Malleable Base"); + break; + case MYSTERIOUS_ESSENCE: + m.setDisplayName(ChatColor.BOLD+""+ChatColor.LIGHT_PURPLE+"Mysterious Essence"); + break; + } + i.setItemMeta(m); + return i; + } + public static ItemStack convert(ItemStack item, ArtifactItem type, boolean reprint_lore) { + //Converts an item to an artifact. + ItemMeta m = item.getItemMeta(); + List l = new ArrayList(); + if (item.getItemMeta().hasLore()) { + l = item.getItemMeta().getLore(); + } + if (reprint_lore) { + l.add(ChatColor.GOLD+""+ChatColor.ITALIC+"Artifact Crafting Item"); + if (type==ArtifactItem.MALLEABLE_BASE) { + l.add(ChatColor.YELLOW+" Right-click to activate"); + l.add(ChatColor.YELLOW+" this base."); + } + } + m.setLore(l); + item.setItemMeta(m); + if (type.toString().contains("ARTIFACT")) { + item.addUnsafeEnchantment(Enchantment.LUCK, 1); + } else + if (type.toString().contains("ANCIENT")) { + item.addUnsafeEnchantment(Enchantment.LUCK, 2); + } else + if (type.toString().contains("LOST")) { + item.addUnsafeEnchantment(Enchantment.LUCK, 3); + } else + if (type.toString().contains("DIVINE")) { + item.addUnsafeEnchantment(Enchantment.LUCK, 4); + } else { + item.addUnsafeEnchantment(Enchantment.LUCK, 10); + } + return item; + } + public static ItemStack convert(ItemStack item, boolean reprint_lore) { + //Converts an item to an artifact. + return convert(item, ArtifactItem.ARTIFACT_ESSENCE, reprint_lore); + } + public static ItemStack convert(ItemStack item) { + //Converts an item to an artifact. + return convert(item, ArtifactItem.ARTIFACT_ESSENCE, true); + } + public static boolean isArtifact(ItemStack item) { + if (item.hasItemMeta() && + item.getItemMeta().hasLore() && + item.getItemMeta().getLore().contains(ChatColor.GOLD+""+ChatColor.ITALIC+"Artifact Crafting Item")) { + //This is an artifact. + return true; + } else { + return false; + } + } + public static boolean isMalleableBase(ItemStack item) { + //Check for type of item, and if it's an artifact. + if (isArtifact(item) && + item.getType()==Material.INK_SACK && + item.getDurability()==7) { + return true; + } else { + return false; + } + } +} diff --git a/src/sig/plugin/TwosideKeeper/DeathManager.java b/src/sig/plugin/TwosideKeeper/DeathManager.java new file mode 100644 index 0000000..53c3644 --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/DeathManager.java @@ -0,0 +1,155 @@ +package sig.plugin.TwosideKeeper; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import sig.plugin.TwosideKeeper.HelperStructures.DeathStructure; + +public class DeathManager { + static String Pick5Text = "Mercy (Pick 5 Lost Items)"; + static String Pick20Text = "Mercy (Pick 20 Lost Items Randomly)"; + static String BuybackText = "Buyback (Pay for Lost Items)"; + static String DropText = "Drop Items (At death point)"; + public static List ds = new ArrayList(); + + public static void addNewDeathStructure(List deathinv, Location deathloc, Player p) { + ds.add(new DeathStructure(deathinv,deathloc,p)); + } + public static void removeDeathStructure(Player p) { + ds.remove(getDeathStructure(p)); + } + public static boolean deathStructureExists(Player p) { + if (getDeathStructure(p)!=null) { + return true; + } else { + return false; + } + } + /* + public static void givePlayerDeathChoices(Player p) { + //Also stop the player from moving. + ItemStack pick_five = new ItemStack(Material.COMMAND); + ItemMeta meta = pick_five.getItemMeta(); + meta.setDisplayName(Pick5Text); + pick_five.setItemMeta(meta); + pick_five.addUnsafeEnchantment(Enchantment.LUCK, 1); + ItemStack pick_twenty = new ItemStack(Material.COMMAND_CHAIN); + meta = pick_twenty.getItemMeta(); + meta.setDisplayName(Pick20Text); + pick_twenty.setItemMeta(meta); + pick_twenty.addUnsafeEnchantment(Enchantment.LUCK, 1); + ItemStack buyback = new ItemStack(Material.COMMAND_REPEATING); + meta = buyback.getItemMeta(); + meta.setDisplayName(BuybackText); + buyback.setItemMeta(meta); + buyback.addUnsafeEnchantment(Enchantment.LUCK, 1); + ItemStack normaldrop = new ItemStack(Material.BARRIER); + meta = normaldrop.getItemMeta(); + meta.setDisplayName(DropText); + normaldrop.setItemMeta(meta); + normaldrop.addUnsafeEnchantment(Enchantment.LUCK, 1); + + + p.getInventory().addItem(pick_five); + p.getInventory().addItem(pick_twenty); + p.getInventory().addItem(buyback); + p.getInventory().addItem(normaldrop); + + p.addPotionEffect(new PotionEffect(PotionEffectType.SLOW,999999999,10)); + p.sendMessage(ChatColor.AQUA+"Place down the block indicating how you want to retrieve your lost items."); + }*/ + public static boolean isDeathBlock(ItemStack b) { + if (b.hasItemMeta() && + b.getItemMeta().hasDisplayName() && + b.containsEnchantment(Enchantment.LUCK)) { + return true; + } else { + return false; + } + } + + public static DeathStructure getDeathStructure(Player p) { + for (int i=0;i=36) { + if (pd.deathinventory.get(i).getType().toString().contains("BOOTS")) { + p.getInventory().setBoots(pd.deathinventory.get(i)); + } else + if (pd.deathinventory.get(i).getType().toString().contains("SHIELD")) { + p.getInventory().setItemInOffHand(pd.deathinventory.get(i)); + } else + if (pd.deathinventory.get(i).getType().toString().contains("LEGGINGS")) { + p.getInventory().setLeggings(pd.deathinventory.get(i)); + } else + if (pd.deathinventory.get(i).getType().toString().contains("CHESTPLATE")) { + p.getInventory().setChestplate(pd.deathinventory.get(i)); + } else + if (pd.deathinventory.get(i).getType().toString().contains("HELMET")) { + p.getInventory().setHelmet(pd.deathinventory.get(i)); + } else { + //What is this? Just drop it. + p.getLocation().getWorld().dropItem(p.getLocation(), pd.deathinventory.get(i)); + } + } else { + p.getInventory().addItem(pd.deathinventory.get(i)); + }*/ + if (structure.deathinventory.get(i)!=null && + structure.deathinventory.get(i).getType()!=Material.AIR) { + deathinv.addItem(structure.deathinventory.get(i)); + } + } + double totalmoney = TwosideKeeper.getPlayerMoney(p)+TwosideKeeper.getPlayerBankMoney(p); + int price = 1; + if (structure.deathloc.getBlockY()<=60) { + price += 24-(structure.deathloc.getBlockY()/2.5); + } + p.openInventory(deathinv); + p.sendMessage(ChatColor.AQUA+"You can buy back up to "+ChatColor.YELLOW+(int)(totalmoney/price)+ChatColor.AQUA+" items, costing $"+ChatColor.GREEN+price+ChatColor.WHITE+" per item."); + p.sendMessage(" The rest will drop at your death location."); + p.sendMessage(ChatColor.GRAY+"Close your inventory once you've picked your items."); + } + + public static int CalculateDeathPrice(Player p) { + DeathStructure ds = getDeathStructure(p); + return (int)(1+((ds.deathloc.getBlockY()<=60)?(24-(ds.deathloc.getBlockY()/2.5)):0)); + } + public static int CountOccupiedSlots(Inventory inv) { + int occupiedslots = 0; + for (int i=0;i deathinventory; + public Location deathloc; + public String p; + + public DeathStructure(List di, Location dl, Player p) { + this.deathinventory=di; + this.deathloc=dl; + this.p=p.getName(); + } +} diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/ItemRarity.java b/src/sig/plugin/TwosideKeeper/HelperStructures/ItemRarity.java new file mode 100644 index 0000000..4332f1e --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/ItemRarity.java @@ -0,0 +1,5 @@ +package sig.plugin.TwosideKeeper.HelperStructures; + +public enum ItemRarity { + VANILLA, RARE, EPIC, LEGENDARY; +} diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/MalleableBaseQuest.java b/src/sig/plugin/TwosideKeeper/HelperStructures/MalleableBaseQuest.java new file mode 100644 index 0000000..5a90aa6 --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/MalleableBaseQuest.java @@ -0,0 +1,288 @@ +package sig.plugin.TwosideKeeper.HelperStructures; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.plugin.Plugin; + +import sig.plugin.TwosideKeeper.Artifact; +import sig.plugin.TwosideKeeper.TwosideKeeper; + +public class MalleableBaseQuest { + + /*LORE FORMAT: + * FORMING IN PROGRESS + * Base requires 'ITEM_NAME' to + * continue forming... (5/30) + * 4893210801 <--Server Tick Time + * + * + */ + + public static ItemStack startQuest(ItemStack base) { + //Formats the item lore in preparation for the quest. + ItemMeta m = base.getItemMeta(); + List lore = new ArrayList(); + lore.add(ChatColor.RED+"FORMING IN PROGRESS"); + lore.add(ChatColor.BLUE+"Base requires "+ChatColor.AQUA+"'"+TwosideKeeper.UserFriendlyMaterialName(new ItemStack(selectItem()))+"'"+ChatColor.BLUE+" to"); + lore.add(ChatColor.BLUE+"continue forming... "+ChatColor.GREEN+"(0/30)"); + lore.add(ChatColor.BLUE+""+TwosideKeeper.getServerTickTime()); + m.setLore(lore); + base.setItemMeta(m); + return Artifact.convert(base); + + } + + public static ItemStack setTimeStarted(ItemStack base, long time) { + //The time started is always on the third line. + ItemMeta m = base.getItemMeta(); + List lore = m.getLore(); + lore.remove(2); + lore.add(2,ChatColor.BLUE+""+TwosideKeeper.getServerTickTime()); + m.setLore(lore); + base.setItemMeta(m); + return base; + } + public static ItemStack setItem(ItemStack base, Material mat) { + //Sets the material to this item instead. + ItemMeta m = base.getItemMeta(); + List lore = m.getLore(); + lore.remove(1); + lore.add(1,ChatColor.BLUE+"Base requires "+ChatColor.AQUA+"'"+mat.toString()+"'"+ChatColor.BLUE+" to"); + m.setLore(lore); + base.setItemMeta(m); + return base; + } + public static ItemStack advanceQuestProgress(ItemStack base) { + //This should occur when the base quest is ready to proceed. + //Advance the progress by one. + //Choose the next item randomly. + ItemMeta m = base.getItemMeta(); + List lore = m.getLore(); + lore.remove(1); + lore.add(1,ChatColor.BLUE+"Base requires "+ChatColor.AQUA+"'"+TwosideKeeper.UserFriendlyMaterialName(new ItemStack(selectItem()))+"'"+ChatColor.BLUE+" to"); + //Get the old quest progress. + int progress = getCurrentProgress(base); + lore.remove(2); + lore.add(2,ChatColor.BLUE+"continue forming... "+ChatColor.GREEN+"("+(progress+1)+"/30)"); + m.setLore(lore); + base.setItemMeta(m); + return Artifact.convert(base,false); + } + public static ItemStack completeQuest(ItemStack base) { + //Triggered when the quest is done. Turn into a base. + //Get the time now, and the time when we started the quest. + long starttime = getTimeStarted(base); + long currenttime = TwosideKeeper.getServerTickTime(); + + if (currenttime-starttime<=36000) { //30 min passed. Divine tier. + return Artifact.createArtifactItem(ArtifactItem.DIVINE_BASE); + } else + if (currenttime-starttime<=72000) { //1 hour passed. Lost tier. + return Artifact.createArtifactItem(ArtifactItem.LOST_BASE); + } else + if (currenttime-starttime<=144000) { //2 hours passed. Ancient tier. + return Artifact.createArtifactItem(ArtifactItem.ANCIENT_BASE); + } else + { //>2 hours passed. Artifact tier. + return Artifact.createArtifactItem(ArtifactItem.ARTIFACT_BASE); + }/* else //Too harsh. We are not going to make the player start all over. + { + //This failed. Turn it back into a Malleable base. + return Artifact.createArtifactItem(ArtifactItem.MALLEABLE_BASE); + }*/ + } + + public static String getItem(ItemStack base) { + //Get current item for this Base. + ItemMeta m = base.getItemMeta(); + List lore = m.getLore(); + String material_name = lore.get(1).split("'")[1]; + return material_name; + } + public static int getCurrentProgress(ItemStack base) { + //How many quest items have been completed already? + ItemMeta m = base.getItemMeta(); + List lore = m.getLore(); + String progress = lore.get(2).substring(lore.get(2).indexOf("(", 0)+1,lore.get(2).indexOf("/", 0)); + return Integer.parseInt(progress); + } + public static long getTimeStarted(ItemStack base) { + //Returns the server tick time this quest was started on. + ItemMeta m = base.getItemMeta(); + List lore = m.getLore(); + String timelore = lore.get(3).replace(ChatColor.BLUE+"", ""); + return Long.parseLong(timelore); + + } + public static QuestStatus getStatus(ItemStack base) { + ItemMeta m = base.getItemMeta(); + if (m.getLore().contains(ChatColor.RED+"FORMING IN PROGRESS")) { + return QuestStatus.IN_PROGRESS; + } else { + return QuestStatus.UNFORMED; + } + } + + public static void announceQuestItem(Plugin plug, final Player p, final ItemStack i) { + /*Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + @Override + public void run() { + setPlayerMaxHealth(player); + } + },1);*/ + p.sendMessage(ChatColor.AQUA+"The item you must obtain..."); + Bukkit.getScheduler().scheduleSyncDelayedTask(plug, new Runnable() { + @Override + public void run() { + p.sendMessage(ChatColor.AQUA+"is "+ChatColor.GREEN+getItem(i)); + } + },40); + Bukkit.getScheduler().scheduleSyncDelayedTask(plug, new Runnable() { + @Override + public void run() { + p.sendMessage(ChatColor.AQUA+"Right-click the base again once you have the item in your hotbar!"); + } + },80); + } + + public static Material selectItem() { + //Material.values(). + List blacklisted_items = new ArrayList(); + blacklisted_items.add(Material.ACACIA_DOOR); + blacklisted_items.add(Material.AIR); + blacklisted_items.add(Material.BARRIER); + blacklisted_items.add(Material.BED_BLOCK); + blacklisted_items.add(Material.BEDROCK); + blacklisted_items.add(Material.BEETROOT_BLOCK); + blacklisted_items.add(Material.BEETROOT); + blacklisted_items.add(Material.BIRCH_DOOR); + blacklisted_items.add(Material.BREWING_STAND); + blacklisted_items.add(Material.BURNING_FURNACE); + blacklisted_items.add(Material.CAKE_BLOCK); + blacklisted_items.add(Material.CARROT); + blacklisted_items.add(Material.CAULDRON); + blacklisted_items.add(Material.CHAINMAIL_BOOTS); + blacklisted_items.add(Material.CHAINMAIL_CHESTPLATE); + blacklisted_items.add(Material.CHAINMAIL_HELMET); + blacklisted_items.add(Material.CHAINMAIL_LEGGINGS); + blacklisted_items.add(Material.CHAINMAIL_BOOTS); + blacklisted_items.add(Material.CHORUS_PLANT); + blacklisted_items.add(Material.COCOA); + blacklisted_items.add(Material.COMMAND); + blacklisted_items.add(Material.COMMAND_CHAIN); + blacklisted_items.add(Material.COMMAND_MINECART); + blacklisted_items.add(Material.COMMAND_REPEATING); + blacklisted_items.add(Material.CROPS); + blacklisted_items.add(Material.DARK_OAK_DOOR); + blacklisted_items.add(Material.DAYLIGHT_DETECTOR_INVERTED); + blacklisted_items.add(Material.DEAD_BUSH); + blacklisted_items.add(Material.DIODE_BLOCK_OFF); + blacklisted_items.add(Material.DIODE_BLOCK_ON); + blacklisted_items.add(Material.DOUBLE_PLANT); + blacklisted_items.add(Material.DOUBLE_STEP); + blacklisted_items.add(Material.DOUBLE_STONE_SLAB2); + blacklisted_items.add(Material.DRAGON_EGG); + blacklisted_items.add(Material.DRAGONS_BREATH); + blacklisted_items.add(Material.EMERALD_ORE); + blacklisted_items.add(Material.COAL_ORE); + blacklisted_items.add(Material.END_CRYSTAL); + blacklisted_items.add(Material.END_GATEWAY); + blacklisted_items.add(Material.ENDER_PORTAL); + blacklisted_items.add(Material.ENDER_PORTAL_FRAME); + blacklisted_items.add(Material.EXP_BOTTLE); + blacklisted_items.add(Material.FIRE); + blacklisted_items.add(Material.FIREBALL); + blacklisted_items.add(Material.FLOWER_POT); + blacklisted_items.add(Material.FROSTED_ICE); + blacklisted_items.add(Material.GLOWING_REDSTONE_ORE); + blacklisted_items.add(Material.GOLD_RECORD); + blacklisted_items.add(Material.GRASS); + blacklisted_items.add(Material.GRASS_PATH); + blacklisted_items.add(Material.GREEN_RECORD); + blacklisted_items.add(Material.HUGE_MUSHROOM_1); + blacklisted_items.add(Material.HUGE_MUSHROOM_2); + blacklisted_items.add(Material.JUNGLE_DOOR); + blacklisted_items.add(Material.LAVA); + blacklisted_items.add(Material.LEAVES); + blacklisted_items.add(Material.LEAVES_2); + blacklisted_items.add(Material.LINGERING_POTION); + blacklisted_items.add(Material.LOG); + blacklisted_items.add(Material.LOG_2); + blacklisted_items.add(Material.LONG_GRASS); + blacklisted_items.add(Material.MAP); + blacklisted_items.add(Material.MELON_BLOCK); + blacklisted_items.add(Material.MELON_STEM); + blacklisted_items.add(Material.MOB_SPAWNER); + blacklisted_items.add(Material.MONSTER_EGG); + blacklisted_items.add(Material.MONSTER_EGGS); + blacklisted_items.add(Material.MYCEL); + blacklisted_items.add(Material.NAME_TAG); + blacklisted_items.add(Material.NETHER_STALK); + blacklisted_items.add(Material.NETHER_WARTS); + blacklisted_items.add(Material.MYCEL); + blacklisted_items.add(Material.PISTON_EXTENSION); + blacklisted_items.add(Material.PISTON_MOVING_PIECE); + blacklisted_items.add(Material.POISONOUS_POTATO); + blacklisted_items.add(Material.PORTAL); + blacklisted_items.add(Material.POTATO); + blacklisted_items.add(Material.PUMPKIN_STEM); + blacklisted_items.add(Material.PURPUR_DOUBLE_SLAB); + blacklisted_items.add(Material.QUARTZ_ORE); + blacklisted_items.add(Material.RECORD_10); + blacklisted_items.add(Material.RECORD_11); + blacklisted_items.add(Material.RECORD_12); + blacklisted_items.add(Material.RECORD_3); + blacklisted_items.add(Material.RECORD_4); + blacklisted_items.add(Material.RECORD_5); + blacklisted_items.add(Material.RECORD_6); + blacklisted_items.add(Material.RECORD_7); + blacklisted_items.add(Material.RECORD_8); + blacklisted_items.add(Material.RECORD_9); + blacklisted_items.add(Material.RED_ROSE); + blacklisted_items.add(Material.REDSTONE_COMPARATOR_OFF); + blacklisted_items.add(Material.REDSTONE_COMPARATOR_ON); + blacklisted_items.add(Material.REDSTONE_LAMP_OFF); + blacklisted_items.add(Material.REDSTONE_LAMP_ON); + blacklisted_items.add(Material.REDSTONE_ORE); + blacklisted_items.add(Material.REDSTONE_TORCH_OFF); + blacklisted_items.add(Material.REDSTONE_WIRE); + blacklisted_items.add(Material.SAPLING); + blacklisted_items.add(Material.SIGN_POST); + blacklisted_items.add(Material.WALL_SIGN); + blacklisted_items.add(Material.SKULL); + blacklisted_items.add(Material.SKULL_ITEM); + blacklisted_items.add(Material.SNOW); + blacklisted_items.add(Material.SOIL); + blacklisted_items.add(Material.SPONGE); + blacklisted_items.add(Material.SPRUCE_DOOR); + blacklisted_items.add(Material.STANDING_BANNER); + blacklisted_items.add(Material.STATIONARY_LAVA); + blacklisted_items.add(Material.STATIONARY_WATER); + blacklisted_items.add(Material.STEP); + blacklisted_items.add(Material.STONE_SLAB2); + blacklisted_items.add(Material.STRUCTURE_BLOCK); + blacklisted_items.add(Material.SUGAR_CANE_BLOCK); + blacklisted_items.add(Material.TRIPWIRE); + blacklisted_items.add(Material.VINE); + blacklisted_items.add(Material.WALL_BANNER); + blacklisted_items.add(Material.WATCH); + blacklisted_items.add(Material.WATER); + blacklisted_items.add(Material.WOOD_DOUBLE_STEP); + blacklisted_items.add(Material.WOODEN_DOOR); + blacklisted_items.add(Material.WOOD_DOOR); + blacklisted_items.add(Material.YELLOW_FLOWER); + Material selectedMat = Material.values()[(int)(Math.random()*Material.values().length)]; + while (blacklisted_items.contains(selectedMat)) { + //RE-roll if it's a black-listed item. + selectedMat = Material.values()[(int)(Math.random()*Material.values().length)]; + } + return selectedMat; + } +} \ No newline at end of file diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/MonsterDifficulty.java b/src/sig/plugin/TwosideKeeper/HelperStructures/MonsterDifficulty.java new file mode 100644 index 0000000..6ea2228 --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/MonsterDifficulty.java @@ -0,0 +1,8 @@ +package sig.plugin.TwosideKeeper.HelperStructures; + +public enum MonsterDifficulty { + NORMAL, + DANGEROUS, + DEADLY, + HELLFIRE +} diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/MonsterType.java b/src/sig/plugin/TwosideKeeper/HelperStructures/MonsterType.java new file mode 100644 index 0000000..ad74e9c --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/MonsterType.java @@ -0,0 +1,17 @@ +package sig.plugin.TwosideKeeper.HelperStructures; + +public enum MonsterType { + BLAZE, + CAVESPIDER, + CREEPER, + ENDERMAN, + GIANT, + GUARDIAN, + PIGZOMBIE, + SILVERFISH, + SKELETON, + SPIDER, + WITCH, + WITHER, + ZOMBIE +} diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/QuestStatus.java b/src/sig/plugin/TwosideKeeper/HelperStructures/QuestStatus.java new file mode 100644 index 0000000..2901d1f --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/QuestStatus.java @@ -0,0 +1,6 @@ +package sig.plugin.TwosideKeeper.HelperStructures; + +public enum QuestStatus { + UNFORMED, + IN_PROGRESS +} diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/Rank.java b/src/sig/plugin/TwosideKeeper/HelperStructures/Rank.java new file mode 100644 index 0000000..8821dd0 --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/Rank.java @@ -0,0 +1,37 @@ +package sig.plugin.TwosideKeeper.HelperStructures; + +import org.bukkit.Color; + +/** + * Rank structure + * + * Defines a rank a player can be on the server. + * Each rank has a color and a "canX" permission + * for each permission they can do. + * + * @author Joshua Sigona + * + */ +public class Rank { + public String name; + public Color color; + public boolean + canBreak, + canBuild, + canChat, + canFly, + canItemGive; + /** + * Rank sets up a rank. You have to define specific permissions with 'true' and 'false' separately. + * @param name + * @param color + */ + public Rank(String name, Color color) { + this.name = name; + this.color = color; + + //Set default permissions. + this.canBreak=this.canBuild=this.canChat=true; + this.canFly=this.canItemGive=false; + } +} diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/SessionState.java b/src/sig/plugin/TwosideKeeper/HelperStructures/SessionState.java new file mode 100644 index 0000000..ab20338 --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/SessionState.java @@ -0,0 +1,9 @@ +package sig.plugin.TwosideKeeper.HelperStructures; + +public enum SessionState { + CREATE, //Creating a shop. Asks for amount to put in. + PRICE, //Creating a shop. Asks for price of each unit. + EDIT, //Editing a shop. Asks for amount to put in or take out. + UPDATE, //Editing a shop. Asks for new price of each unit. + PURCHASE +} diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/ShopPurchase.java b/src/sig/plugin/TwosideKeeper/HelperStructures/ShopPurchase.java new file mode 100644 index 0000000..65205d7 --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/ShopPurchase.java @@ -0,0 +1,37 @@ +package sig.plugin.TwosideKeeper.HelperStructures; + +import java.text.DecimalFormat; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import sig.plugin.TwosideKeeper.TwosideKeeper; + +public class ShopPurchase { + String player; + String customer; + String itemname; + double money; + int amt; + + public ShopPurchase(String p, Player customer, ItemStack item, double money, int amt) { + player = p; + this.customer=customer.getName(); + itemname = TwosideKeeper.GetItemName(item); + this.money = money; + this.amt=amt; + } + + public String getPlayer() { + return player; + } + public String getCustomer() { + return customer; + } + + public String announcementString() { + DecimalFormat df = new DecimalFormat("0.00"); + return "Player "+ChatColor.BLUE+customer+ChatColor.WHITE+" has purchased "+ChatColor.YELLOW+amt+ChatColor.WHITE+" of your "+ChatColor.YELLOW+itemname+". You have earned $"+df.format(money)+". "+ChatColor.GRAY+""+ChatColor.ITALIC+"(See /money)"; + } +} \ No newline at end of file diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/SpleefArena.java b/src/sig/plugin/TwosideKeeper/HelperStructures/SpleefArena.java new file mode 100644 index 0000000..445d2cc --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/SpleefArena.java @@ -0,0 +1,6 @@ +package sig.plugin.TwosideKeeper.HelperStructures; + +public enum SpleefArena { + //Three constants. + SMALL, LARGE, LAYERED +} diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/WorldShop.java b/src/sig/plugin/TwosideKeeper/HelperStructures/WorldShop.java new file mode 100644 index 0000000..5597e65 --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/WorldShop.java @@ -0,0 +1,258 @@ +package sig.plugin.TwosideKeeper.HelperStructures; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.block.Sign; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.EnchantmentStorageMeta; +import org.bukkit.material.MaterialData; +import org.bukkit.potion.PotionType; + +import sig.plugin.TwosideKeeper.TwosideKeeper; + +public class WorldShop { + ItemStack item; + String owner; + double price; + int amt; + int id; + + public WorldShop (ItemStack i, int amt, double p, String player, int shopID) { + this.item=i; + this.price=p; + this.owner=player; + this.amt = amt; + this.id = shopID; + } + + public String GetItemName() { + if (this.item.hasItemMeta() && + this.item.getItemMeta().hasDisplayName()) { + return this.item.getItemMeta().getDisplayName(); + } else { + return TwosideKeeper.UserFriendlyMaterialName(this.item); + } + } + public void UpdateAmount(int amt) { + this.amt=amt; + } + public void UpdateUnitPrice(double price) { + this.price=price; + } + + public ItemStack GetItem() { + return item; + } + public double GetUnitPrice() { + return price; + } + public int getID() { + return id; + } + public int GetAmount() { + if (owner.equalsIgnoreCase("admin")) { + return 10000; + } else { + return amt; + } + } + public String GetOwner() { + return owner; + } + + public String toString() { + return "WorldShop:{Item:"+item.toString()+",Price:"+price+",Amount:"+amt+",Owner:"+owner+"}"; + } + + public static String GetItemInfo(ItemStack item) { + //Gets all the info about this item in one gigantic string. (Separated by new lines. Useful for tellraw()). + String message = ""; + for (int i=0;i=128) { + //This is a 95% chance this will despawn. + if (Math.random()<=0.95) { + ent.remove(); + return false; + } else { + if (isZombieLeader(ent)) { + Monster m = (Monster)ent; + m.setCustomName(ChatColor.WHITE+"Zombie Leader"); + } + return true; + } + } else + if (ylv>=64) { + //This is a 90% chance this will despawn. + if (Math.random()<=0.90) { + ent.remove(); + return false; + } else { + if (isZombieLeader(ent)) { + Monster m = (Monster)ent; + m.setCustomName(ChatColor.WHITE+"Zombie Leader"); + } + return true; + } + } else + if (ylv>=48) { + //"Normal" spawn rate. We're going to decrease it a bit for the time being. + //This is a 50% chance this will despawn. + if (Math.random()<=0.50) { + ent.remove(); + return false; + } else { + if (isZombieLeader(ent)) { + Monster m = (Monster)ent; + m.setCustomName(ChatColor.WHITE+"Zombie Leader"); + } + return true; + } + } else + if (ylv>=32) { + //Change mobs in this range to 'Dangerous' versions. Zombies and skeletons also get armor. + Monster m = (Monster)(ent); + MonsterDifficulty md = MonsterDifficulty.DANGEROUS; + convertMonster(m,md); + return true; + } else + if (ylv>=16) { + MonsterDifficulty md = MonsterDifficulty.DEADLY; + //Change mobs in this range to 'Dangerous' versions. Zombies and skeletons also get armor. + Monster m = (Monster)(ent); + convertMonster(m,md); + return true; + } else + { + //Change mobs in this range to 'Dangerous' versions. Zombies and skeletons also get armor. + MonsterDifficulty md = MonsterDifficulty.HELLFIRE; + Monster m = (Monster)(ent); + convertMonster(m,md); + return true; + } + } + private static void RandomizeEquipment(Monster m, int lv) { + /* + * Lv1: Leather/Iron Armor. + * Lv2: Iron/Diamond Armor. + * Lv3: Diamond Armor. + */ + switch (lv) { + case 1:{ + if (Math.random()<0.5) { + m.getEquipment().setHelmet(new ItemStack(Material.LEATHER_HELMET)); + m.getEquipment().getHelmet().setDurability((short)Math.round(Math.random()*128)); + } else { + m.getEquipment().setHelmet(new ItemStack(Material.IRON_HELMET)); + m.getEquipment().getHelmet().setDurability((short)Math.round(Math.random()*128)); + } + if (Math.random()<0.5) { + m.getEquipment().setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE)); + m.getEquipment().getChestplate().setDurability((short)Math.round(Math.random()*128)); + } else { + m.getEquipment().setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + m.getEquipment().getChestplate().setDurability((short)Math.round(Math.random()*128)); + } + if (Math.random()<0.5) { + m.getEquipment().setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); + m.getEquipment().getLeggings().setDurability((short)Math.round(Math.random()*128)); + } else { + m.getEquipment().setLeggings(new ItemStack(Material.IRON_LEGGINGS)); + m.getEquipment().getLeggings().setDurability((short)Math.round(Math.random()*128)); + } + if (Math.random()<0.5) { + m.getEquipment().setBoots(new ItemStack(Material.LEATHER_BOOTS)); + m.getEquipment().getBoots().setDurability((short)Math.round(Math.random()*128)); + } else { + m.getEquipment().setBoots(new ItemStack(Material.IRON_BOOTS)); + m.getEquipment().getBoots().setDurability((short)Math.round(Math.random()*128)); + } + if (m.getEquipment().getHelmet()!=null && Math.random()<0.3) { + m.getEquipment().setHelmet(RandomizeEnchantments(m.getEquipment().getHelmet(),ItemRarity.RARE)); + if (Math.random()20) || + (md==MonsterDifficulty.DANGEROUS && ent.getMaxHealth()>20*2) || + (md==MonsterDifficulty.NORMAL && ent.getMaxHealth()>20*2) || + (md==MonsterDifficulty.NORMAL && ent.getMaxHealth()>20*4) + ) + { + return true; + } else { + return false; + } + } else { + return false; + } + } + + public static Monster convertMonster(Monster m) { + if (m.getLocation().getY()<48) { + if (m.getLocation().getY()>=32) + return convertMonster(m,MonsterDifficulty.DANGEROUS); + else if (m.getLocation().getY()>=16) + return convertMonster(m,MonsterDifficulty.DEADLY); + else + return convertMonster(m,MonsterDifficulty.HELLFIRE); + } else { + return convertMonster(m,MonsterDifficulty.NORMAL); + } + } + + public static MonsterDifficulty getMonsterDifficulty(Monster m) { + if (m.getCustomName()!=null) { + if (m.getCustomName().contains("Dangerous")) { + return MonsterDifficulty.DANGEROUS; + } else + if (m.getCustomName().contains("Deadly")) { + return MonsterDifficulty.DEADLY; + } else + if (m.getCustomName().contains("Hellfire")) { + return MonsterDifficulty.HELLFIRE; + } else + { + return MonsterDifficulty.NORMAL; + } + } else { + return MonsterDifficulty.NORMAL; + } + } + + public static Monster convertMonster(Monster m, MonsterDifficulty md) { + switch (md) { + case DANGEROUS: { + String MonsterName = m.getType().toString().toLowerCase(); + m.setCustomName(ChatColor.DARK_AQUA+"Dangerous "+TwosideKeeper.CapitalizeFirstLetters(MonsterName.replaceAll("_", " ")+(isZombieLeader(m)?" Leader":""))); + m.setMaxHealth(m.getMaxHealth()*2.0); + m.setHealth(m.getMaxHealth()); + if (isAllowedToEquipItems(m)) { + m.getEquipment().clear(); + RandomizeEquipment(m,1); + } + }break; + case DEADLY: { + String MonsterName = m.getType().toString().toLowerCase(); + m.setCustomName(ChatColor.GOLD+"Deadly "+TwosideKeeper.CapitalizeFirstLetters(MonsterName.replaceAll("_", " ")+(isZombieLeader(m)?" Leader":""))); + m.setMaxHealth(m.getMaxHealth()*2.0); + m.setHealth(m.getMaxHealth()); + if (isAllowedToEquipItems(m)) { + m.getEquipment().clear(); + RandomizeEquipment(m,2); + } + m.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE,99999,1)); + }break; + case HELLFIRE:{ + String MonsterName = m.getType().toString().toLowerCase(); + m.setCustomName(ChatColor.DARK_RED+"Hellfire "+TwosideKeeper.CapitalizeFirstLetters(MonsterName.replaceAll("_", " ")+(isZombieLeader(m)?" Leader":""))); + //m.setCustomName(ChatColor.DARK_AQUA+"Dangerous Mob"); + //m.setCustomNameVisible(true); + m.setMaxHealth(m.getMaxHealth()*4.0); + m.setHealth(m.getMaxHealth()); + m.setFireTicks(999999); + if (isAllowedToEquipItems(m)) { + m.getEquipment().clear(); + RandomizeEquipment(m,3); + } + m.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE,99999,1)); + m.addPotionEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE,99999,1)); + if (Math.random()<=0.2) {m.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION,99999,1));} + }break; + default: { + if (isAllowedToEquipItems(m)) { + m.getEquipment().clear(); + RandomizeEquipment(m,0); + } + if (isZombieLeader(m)) { + m.setCustomName(ChatColor.WHITE+"Zombie Leader"); + } + }break; + } + return m; + } + + private static boolean isAllowedToEquipItems(Monster m) { + if (m.getType()==EntityType.ZOMBIE || + m.getType()==EntityType.PIG_ZOMBIE || + m.getType()==EntityType.SKELETON || + m.getType()==EntityType.GIANT) { + return true; + } else { + return false; + } + } + + public static Monster spawnAdjustedMonster(MonsterType mt,Location loc) { + EntityType et; + switch(mt) { + case BLAZE: + et=EntityType.BLAZE; + break; + case CAVESPIDER: + et=EntityType.CAVE_SPIDER; + break; + case CREEPER: + et=EntityType.CREEPER; + break; + case ENDERMAN: + et=EntityType.ENDERMAN; + break; + case GIANT: + et=EntityType.GIANT; + break; + case GUARDIAN: + et=EntityType.GUARDIAN; + break; + case PIGZOMBIE: + et=EntityType.PIG_ZOMBIE; + break; + case SILVERFISH: + et=EntityType.SILVERFISH; + break; + case SKELETON: + et=EntityType.SKELETON; + break; + case SPIDER: + et=EntityType.SPIDER; + break; + case WITCH: + et=EntityType.WITCH; + break; + case WITHER: + et=EntityType.WITHER; + break; + case ZOMBIE: + et=EntityType.ZOMBIE; + break; + default: + et=EntityType.ZOMBIE; + } + Monster m = (Monster)loc.getWorld().spawnEntity(loc, et); + return MonsterController.convertMonster(m); + } +} diff --git a/src/sig/plugin/TwosideKeeper/Party.java b/src/sig/plugin/TwosideKeeper/Party.java new file mode 100644 index 0000000..f89706d --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/Party.java @@ -0,0 +1,211 @@ +package sig.plugin.TwosideKeeper; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Color; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.scoreboard.DisplaySlot; + +public class Party { + public List partyplayers; + int color; + Location region; + + Party(int color, Location rawPos) { + partyplayers = new ArrayList(); + rawPos.setX((int)(rawPos.getX()/(16*TwosideKeeper.PARTY_CHUNK_SIZE))*(16*TwosideKeeper.PARTY_CHUNK_SIZE)); + rawPos.setZ((int)(rawPos.getZ()/(16*TwosideKeeper.PARTY_CHUNK_SIZE))*(16*TwosideKeeper.PARTY_CHUNK_SIZE)); + region=rawPos; + Bukkit.getLogger().info(region.toString()); + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "scoreboard objectives remove Party"+color); //Make sure the party is cleared out if it was used for something before... + //Bukkit.getScoreboardManager().getMainScoreboard().registerNewObjective("Party"+color, "dummy"); + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "scoreboard objectives add Party"+color+" dummy Your Party"); + //Bukkit.getScoreboardManager().getMainScoreboard().getObjective("Party"+color).setDisplaySlot(DisplaySlot.SIDEBAR); + String color_txt = ""; + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "scoreboard objectives setdisplay sidebar.team."+ConvertColor(color)+" Party"+color); + this.color=color; + } + + String ConvertColor(int val) { + + switch (val%16) { + case 0:{ + return "white"; + } + case 1:{ + return "yellow"; + } + case 2:{ + return "light_purple"; + } + case 3:{ + return "red"; + } + case 4:{ + return "aqua"; + } + case 5:{ + return "green"; + } + case 6:{ + return "blue"; + } + case 7:{ + return "dark_gray"; + } + case 8:{ + return "gray"; + } + case 9:{ + return "gold"; + } + case 10:{ + return "dark_purple"; + } + case 11:{ + return "dark_red"; + } + case 12:{ + return "dark_aqua"; + } + case 13:{ + return "dark_green"; + } + case 14:{ + return "dark_blue"; + } + case 15:{ + return "black"; + } + default:{ + return "white"; + } + } + } + + public void addPlayer(Player p) { + partyplayers.add(p); + for (int l=0;l=2) { + //partyplayers.get(l).sendMessage(ChatColor.ITALIC+""+ChatColor.GOLD+"Party Bonuses Applied: "+ChatColor.BLUE+"+"+(partyplayers.size()-1)+"0% damage + defense for "+partyplayers.size()+" party members. Drop Rate +"+(partyplayers.size()-1)+"0%"); + } + } + } + } + Bukkit.dispatchCommand(Bukkit.getServer().getConsoleSender(), "scoreboard players set "+p.getName().toLowerCase()+" Party"+color+" "+partyplayers.size()*-1); + Bukkit.dispatchCommand(Bukkit.getServer().getConsoleSender(), "scoreboard teams option "+p.getName().toLowerCase()+" color "+ConvertColor(color)); + } + + public void sortPlayers() { + //Sorts the players on the scoreboard by proper health values. + List sortedorder = new ArrayList(); + int lasti=-1; //The last player that had less health than you did. + for (int i=0;ipartyplayers.get(i).getHealth()) { + lasti=-1; + } else { + lasti=j; //This means our health is bigger. We go here. + break; + } + } + if (lasti==-1) { + //This just gets inserted. + sortedorder.add(partyplayers.get(i)); + } else { + sortedorder.add(lasti,partyplayers.get(i)); + } + } + for (int i=0;i=2) { + //partyplayers.get(i).sendMessage(ChatColor.DARK_GRAY+""+ChatColor.ITALIC+"Party buffs removed."); + } + partyplayers.remove(i); + i--; + } + } + if (prevsiz!=partyplayers.size()) { + for (int i=0;i item_ItemCube_lore = new ArrayList(); + item_ItemCube_lore.add("A storage container that can"); + item_ItemCube_lore.add("be carried around. "+ChatColor.GOLD+"Open by"); + item_ItemCube_lore.add(ChatColor.GOLD+"right-clicking."); + ItemMeta item_ItemCube_meta=item_ItemCube.getItemMeta(); + item_ItemCube_meta.setLore(item_ItemCube_lore); + item_ItemCube_meta.setDisplayName("Item Cube"); + item_ItemCube.setItemMeta(item_ItemCube_meta); + + ShapedRecipe ItemCube = new ShapedRecipe(item_ItemCube); + ItemCube.shape("ppp","pcp","ppp"); + ItemCube.setIngredient('p', Material.WOOD, -1); + ItemCube.setIngredient('c', Material.CHEST); + + Bukkit.addRecipe(ItemCube); + //------------------------------ + item_ItemCube = new ItemStack(Material.STORAGE_MINECART); + item_ItemCube_meta=item_ItemCube.getItemMeta(); + item_ItemCube_meta.setLore(item_ItemCube_lore); + item_ItemCube_meta.setDisplayName("Large Item Cube"); + item_ItemCube.setItemMeta(item_ItemCube_meta); + + ItemCube = new ShapedRecipe(item_ItemCube); + ItemCube.shape("ppp","gcg","ppp"); + ItemCube.setIngredient('p', Material.WOOD, -1); + ItemCube.setIngredient('g', Material.GOLD_BLOCK); + ItemCube.setIngredient('c', Material.CHEST); + + Bukkit.addRecipe(ItemCube); + //------------------------------ + item_ItemCube = new ItemStack(Material.ENDER_CHEST); + item_ItemCube_meta=item_ItemCube.getItemMeta(); + item_ItemCube_meta.setLore(item_ItemCube_lore); + item_ItemCube_meta.setDisplayName("Ender Item Cube"); + item_ItemCube.setItemMeta(item_ItemCube_meta); + + ItemCube = new ShapedRecipe(item_ItemCube); + ItemCube.shape("ooo","ece","ooo"); + ItemCube.setIngredient('o', Material.OBSIDIAN); + ItemCube.setIngredient('e', Material.EMERALD); + ItemCube.setIngredient('c', Material.ENDER_CHEST); + + Bukkit.addRecipe(ItemCube); + //------------------------------ + } + public static void Initialize_ArrowQuiver_Recipe() { + ItemStack arrow_quiver = new ItemStack(Material.TIPPED_ARROW); + + List arrow_quiver_lore = new ArrayList(); + arrow_quiver_lore.add("A quiver that holds many arrows."); + arrow_quiver_lore.add(ChatColor.GRAY+"Arrows Remaining: "+ChatColor.YELLOW+"5"); + ItemMeta arrow_quiver_meta=arrow_quiver.getItemMeta(); + arrow_quiver_meta.setLore(arrow_quiver_lore); + arrow_quiver_meta.setDisplayName(ChatColor.BLUE+"Arrow Quiver"); + arrow_quiver.setItemMeta(arrow_quiver_meta); + + arrow_quiver.addUnsafeEnchantment(Enchantment.ARROW_INFINITE, 5); + + arrow_quiver.setAmount(1); + + ShapedRecipe ArrowQuiver = new ShapedRecipe(arrow_quiver); + ArrowQuiver.shape("xle","lsl","xlx"); + ArrowQuiver.setIngredient('s', Material.SPECTRAL_ARROW); + ArrowQuiver.setIngredient('l', Material.LEATHER); + ArrowQuiver.setIngredient('e', Material.EMERALD_BLOCK); + + Bukkit.addRecipe(ArrowQuiver); + } + public static void Initialize_BlockArmor_Recipes() { + ItemStack blockarmorpc = new ItemStack(Material.IRON_HELMET); + + List blockarmorpc_lore = new ArrayList(); + blockarmorpc_lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + blockarmorpc_lore.add(ChatColor.GRAY+"Twice as strong"); + blockarmorpc_lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+"4"); + ItemMeta blockarmorpc_meta=blockarmorpc.getItemMeta(); + blockarmorpc_meta.setLore(blockarmorpc_lore); + blockarmorpc_meta.setDisplayName(ChatColor.BLUE+"Hardened Iron Helmet"); + blockarmorpc.setItemMeta(blockarmorpc_meta); + + ShapedRecipe BlockArmor = new ShapedRecipe(blockarmorpc); + BlockArmor.shape("aaa","axa","xxx"); + BlockArmor.setIngredient('a', Material.IRON_BLOCK); + + Bukkit.addRecipe(BlockArmor); + //-------------------------------------------- + blockarmorpc = new ItemStack(Material.IRON_CHESTPLATE); + + blockarmorpc_lore = new ArrayList(); + blockarmorpc_lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + blockarmorpc_lore.add(ChatColor.GRAY+"Twice as strong"); + blockarmorpc_lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+"4"); + blockarmorpc_meta=blockarmorpc.getItemMeta(); + blockarmorpc_meta.setLore(blockarmorpc_lore); + blockarmorpc_meta.setDisplayName(ChatColor.BLUE+"Hardened Iron Chestplate"); + blockarmorpc.setItemMeta(blockarmorpc_meta); + + BlockArmor = new ShapedRecipe(blockarmorpc); + BlockArmor.shape("axa","aaa","aaa"); + BlockArmor.setIngredient('a', Material.IRON_BLOCK); + + Bukkit.addRecipe(BlockArmor); + //-------------------------------------------- + blockarmorpc = new ItemStack(Material.IRON_LEGGINGS); + + blockarmorpc_lore = new ArrayList(); + blockarmorpc_lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + blockarmorpc_lore.add(ChatColor.GRAY+"Twice as strong"); + blockarmorpc_lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+"4"); + blockarmorpc_meta=blockarmorpc.getItemMeta(); + blockarmorpc_meta.setLore(blockarmorpc_lore); + blockarmorpc_meta.setDisplayName(ChatColor.BLUE+"Hardened Iron Leggings"); + blockarmorpc.setItemMeta(blockarmorpc_meta); + + BlockArmor = new ShapedRecipe(blockarmorpc); + BlockArmor.shape("aaa","axa","axa"); + BlockArmor.setIngredient('a', Material.IRON_BLOCK); + + Bukkit.addRecipe(BlockArmor); + //-------------------------------------------- + blockarmorpc = new ItemStack(Material.IRON_BOOTS); + + blockarmorpc_lore = new ArrayList(); + blockarmorpc_lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + blockarmorpc_lore.add(ChatColor.GRAY+"Twice as strong"); + blockarmorpc_lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+"4"); + blockarmorpc_meta=blockarmorpc.getItemMeta(); + blockarmorpc_meta.setLore(blockarmorpc_lore); + blockarmorpc_meta.setDisplayName(ChatColor.BLUE+"Hardened Iron Boots"); + blockarmorpc.setItemMeta(blockarmorpc_meta); + + BlockArmor = new ShapedRecipe(blockarmorpc); + BlockArmor.shape("axa","axa"); + BlockArmor.setIngredient('a', Material.IRON_BLOCK); + + Bukkit.addRecipe(BlockArmor); + //-------------------------------------------- + blockarmorpc = new ItemStack(Material.GOLD_HELMET); + + blockarmorpc_lore = new ArrayList(); + blockarmorpc_lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + blockarmorpc_lore.add(ChatColor.GRAY+"Twice as strong"); + blockarmorpc_lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+"4"); + blockarmorpc_meta=blockarmorpc.getItemMeta(); + blockarmorpc_meta.setLore(blockarmorpc_lore); + blockarmorpc_meta.setDisplayName(ChatColor.BLUE+"Hardened Gold Helmet"); + blockarmorpc.setItemMeta(blockarmorpc_meta); + + BlockArmor = new ShapedRecipe(blockarmorpc); + BlockArmor.shape("aaa","axa","xxx"); + BlockArmor.setIngredient('a', Material.GOLD_BLOCK); + + Bukkit.addRecipe(BlockArmor); + //-------------------------------------------- + blockarmorpc = new ItemStack(Material.GOLD_CHESTPLATE); + + blockarmorpc_lore = new ArrayList(); + blockarmorpc_lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + blockarmorpc_lore.add(ChatColor.GRAY+"Twice as strong"); + blockarmorpc_lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+"4"); + blockarmorpc_meta=blockarmorpc.getItemMeta(); + blockarmorpc_meta.setLore(blockarmorpc_lore); + blockarmorpc_meta.setDisplayName(ChatColor.BLUE+"Hardened Gold Chestplate"); + blockarmorpc.setItemMeta(blockarmorpc_meta); + + BlockArmor = new ShapedRecipe(blockarmorpc); + BlockArmor.shape("axa","aaa","aaa"); + BlockArmor.setIngredient('a', Material.GOLD_BLOCK); + + Bukkit.addRecipe(BlockArmor); + //-------------------------------------------- + blockarmorpc = new ItemStack(Material.GOLD_LEGGINGS); + + blockarmorpc_lore = new ArrayList(); + blockarmorpc_lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + blockarmorpc_lore.add(ChatColor.GRAY+"Twice as strong"); + blockarmorpc_lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+"4"); + blockarmorpc_meta=blockarmorpc.getItemMeta(); + blockarmorpc_meta.setLore(blockarmorpc_lore); + blockarmorpc_meta.setDisplayName(ChatColor.BLUE+"Hardened Gold Leggings"); + blockarmorpc.setItemMeta(blockarmorpc_meta); + + BlockArmor = new ShapedRecipe(blockarmorpc); + BlockArmor.shape("aaa","axa","axa"); + BlockArmor.setIngredient('a', Material.GOLD_BLOCK); + + Bukkit.addRecipe(BlockArmor); + //-------------------------------------------- + blockarmorpc = new ItemStack(Material.GOLD_BOOTS); + + blockarmorpc_lore = new ArrayList(); + blockarmorpc_lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + blockarmorpc_lore.add(ChatColor.GRAY+"Twice as strong"); + blockarmorpc_lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+"4"); + blockarmorpc_meta=blockarmorpc.getItemMeta(); + blockarmorpc_meta.setLore(blockarmorpc_lore); + blockarmorpc_meta.setDisplayName(ChatColor.BLUE+"Hardened Gold Boots"); + blockarmorpc.setItemMeta(blockarmorpc_meta); + + BlockArmor = new ShapedRecipe(blockarmorpc); + BlockArmor.shape("axa","axa"); + BlockArmor.setIngredient('a', Material.GOLD_BLOCK); + + Bukkit.addRecipe(BlockArmor); + //-------------------------------------------- + blockarmorpc = new ItemStack(Material.DIAMOND_HELMET); + + blockarmorpc_lore = new ArrayList(); + blockarmorpc_lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + blockarmorpc_lore.add(ChatColor.GRAY+"Twice as strong"); + blockarmorpc_lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+"4"); + blockarmorpc_meta=blockarmorpc.getItemMeta(); + blockarmorpc_meta.setLore(blockarmorpc_lore); + blockarmorpc_meta.setDisplayName(ChatColor.BLUE+"Hardened Diamond Helmet"); + blockarmorpc.setItemMeta(blockarmorpc_meta); + + BlockArmor = new ShapedRecipe(blockarmorpc); + BlockArmor.shape("aaa","axa","xxx"); + BlockArmor.setIngredient('a', Material.DIAMOND_BLOCK); + + Bukkit.addRecipe(BlockArmor); + //-------------------------------------------- + blockarmorpc = new ItemStack(Material.DIAMOND_CHESTPLATE); + + blockarmorpc_lore = new ArrayList(); + blockarmorpc_lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + blockarmorpc_lore.add(ChatColor.GRAY+"Twice as strong"); + blockarmorpc_lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+"4"); + blockarmorpc_meta=blockarmorpc.getItemMeta(); + blockarmorpc_meta.setLore(blockarmorpc_lore); + blockarmorpc_meta.setDisplayName(ChatColor.BLUE+"Hardened Diamond Chestplate"); + blockarmorpc.setItemMeta(blockarmorpc_meta); + + BlockArmor = new ShapedRecipe(blockarmorpc); + BlockArmor.shape("axa","aaa","aaa"); + BlockArmor.setIngredient('a', Material.DIAMOND_BLOCK); + + Bukkit.addRecipe(BlockArmor); + //-------------------------------------------- + blockarmorpc = new ItemStack(Material.DIAMOND_LEGGINGS); + + blockarmorpc_lore = new ArrayList(); + blockarmorpc_lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + blockarmorpc_lore.add(ChatColor.GRAY+"Twice as strong"); + blockarmorpc_lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+"4"); + blockarmorpc_meta=blockarmorpc.getItemMeta(); + blockarmorpc_meta.setLore(blockarmorpc_lore); + blockarmorpc_meta.setDisplayName(ChatColor.BLUE+"Hardened Diamond Leggings"); + blockarmorpc.setItemMeta(blockarmorpc_meta); + + BlockArmor = new ShapedRecipe(blockarmorpc); + BlockArmor.shape("aaa","axa","axa"); + BlockArmor.setIngredient('a', Material.DIAMOND_BLOCK); + + Bukkit.addRecipe(BlockArmor); + //-------------------------------------------- + blockarmorpc = new ItemStack(Material.DIAMOND_BOOTS); + + blockarmorpc_lore = new ArrayList(); + blockarmorpc_lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + blockarmorpc_lore.add(ChatColor.GRAY+"Twice as strong"); + blockarmorpc_lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+"4"); + blockarmorpc_meta=blockarmorpc.getItemMeta(); + blockarmorpc_meta.setLore(blockarmorpc_lore); + blockarmorpc_meta.setDisplayName(ChatColor.BLUE+"Hardened Diamond Boots"); + blockarmorpc.setItemMeta(blockarmorpc_meta); + + BlockArmor = new ShapedRecipe(blockarmorpc); + BlockArmor.shape("axa","axa"); + BlockArmor.setIngredient('a', Material.DIAMOND_BLOCK); + + Bukkit.addRecipe(BlockArmor); + //-------------------------------------------- + } + public static void Initialize_ItemDeconstruction_Recipes() { + ShapelessRecipe decons_recipe = new ShapelessRecipe(new ItemStack(Material.LEATHER,4)); + decons_recipe.addIngredient(Material.LEATHER_BOOTS); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.LEATHER,7)); + decons_recipe.addIngredient(Material.LEATHER_LEGGINGS); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.LEATHER,8)); + decons_recipe.addIngredient(Material.LEATHER_CHESTPLATE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.LEATHER,5)); + decons_recipe.addIngredient(Material.LEATHER_HELMET); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.WOOD,2)); + decons_recipe.addIngredient(Material.WOOD_SWORD); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.WOOD,3)); + decons_recipe.addIngredient(Material.WOOD_AXE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.WOOD,3)); + decons_recipe.addIngredient(Material.WOOD_PICKAXE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.WOOD,2)); + decons_recipe.addIngredient(Material.WOOD_HOE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.WOOD,1)); + decons_recipe.addIngredient(Material.WOOD_SPADE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.COBBLESTONE,2)); + decons_recipe.addIngredient(Material.STONE_SWORD); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.COBBLESTONE,3)); + decons_recipe.addIngredient(Material.STONE_AXE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.COBBLESTONE,3)); + decons_recipe.addIngredient(Material.STONE_PICKAXE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.COBBLESTONE,2)); + decons_recipe.addIngredient(Material.STONE_HOE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.COBBLESTONE,1)); + decons_recipe.addIngredient(Material.STONE_SPADE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.IRON_INGOT,4)); + decons_recipe.addIngredient(Material.IRON_BOOTS); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.IRON_INGOT,7)); + decons_recipe.addIngredient(Material.IRON_LEGGINGS); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.IRON_INGOT,8)); + decons_recipe.addIngredient(Material.IRON_CHESTPLATE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.IRON_INGOT,5)); + decons_recipe.addIngredient(Material.IRON_HELMET); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.IRON_INGOT,2)); + decons_recipe.addIngredient(Material.IRON_SWORD); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.IRON_INGOT,3)); + decons_recipe.addIngredient(Material.IRON_AXE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.IRON_INGOT,3)); + decons_recipe.addIngredient(Material.IRON_PICKAXE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.IRON_INGOT,2)); + decons_recipe.addIngredient(Material.IRON_HOE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.IRON_INGOT,1)); + decons_recipe.addIngredient(Material.IRON_SPADE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.GOLD_INGOT,4)); + decons_recipe.addIngredient(Material.GOLD_BOOTS); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.GOLD_INGOT,7)); + decons_recipe.addIngredient(Material.GOLD_LEGGINGS); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.GOLD_INGOT,8)); + decons_recipe.addIngredient(Material.GOLD_CHESTPLATE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.GOLD_INGOT,5)); + decons_recipe.addIngredient(Material.GOLD_HELMET); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.GOLD_INGOT,2)); + decons_recipe.addIngredient(Material.GOLD_SWORD); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.GOLD_INGOT,3)); + decons_recipe.addIngredient(Material.GOLD_AXE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.GOLD_INGOT,3)); + decons_recipe.addIngredient(Material.GOLD_PICKAXE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.GOLD_INGOT,2)); + decons_recipe.addIngredient(Material.GOLD_HOE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.GOLD_INGOT,1)); + decons_recipe.addIngredient(Material.GOLD_SPADE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.DIAMOND,4)); + decons_recipe.addIngredient(Material.DIAMOND_BOOTS); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.DIAMOND,7)); + decons_recipe.addIngredient(Material.DIAMOND_LEGGINGS); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.DIAMOND,8)); + decons_recipe.addIngredient(Material.DIAMOND_CHESTPLATE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.DIAMOND,5)); + decons_recipe.addIngredient(Material.DIAMOND_HELMET); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.DIAMOND,2)); + decons_recipe.addIngredient(Material.DIAMOND_SWORD); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.DIAMOND,3)); + decons_recipe.addIngredient(Material.DIAMOND_AXE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.DIAMOND,3)); + decons_recipe.addIngredient(Material.DIAMOND_PICKAXE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.DIAMOND,2)); + decons_recipe.addIngredient(Material.DIAMOND_HOE); + Bukkit.addRecipe(decons_recipe); + decons_recipe = new ShapelessRecipe(new ItemStack(Material.DIAMOND,1)); + decons_recipe.addIngredient(Material.DIAMOND_SPADE); + Bukkit.addRecipe(decons_recipe); + } + public static void Initialize_WoolRecolor_Recipes() { + for (int i=0;i<16;i++) { + ShapedRecipe wool_recolor_recipe = new ShapedRecipe(new ItemStack(Material.WOOL,8,(byte)(15-i))); + wool_recolor_recipe.shape("www","wdw","www"); + wool_recolor_recipe.setIngredient('w', Material.WOOL, -1); + wool_recolor_recipe.setIngredient('d', Material.getMaterial(351), i); + Bukkit.addRecipe(wool_recolor_recipe); + } + } + public static void Initialize_SlabReconstruction_Recipes() { + for (int i=0;i<=5;i++) { + ShapelessRecipe plank_construction_recipe = new ShapelessRecipe(new ItemStack(Material.WOOD,1,(byte)i)); + plank_construction_recipe.addIngredient(2, Material.getMaterial(126), i); + Bukkit.addRecipe(plank_construction_recipe); + } + ShapelessRecipe sandstone_construction_recipe = new ShapelessRecipe(new ItemStack(Material.RED_SANDSTONE,1)); + sandstone_construction_recipe.addIngredient(2, Material.getMaterial(182)); + Bukkit.addRecipe(sandstone_construction_recipe); + ShapelessRecipe stone_construction_recipe = new ShapelessRecipe(new ItemStack(Material.STONE,1)); + stone_construction_recipe.addIngredient(2, Material.getMaterial(44), 0); + Bukkit.addRecipe(stone_construction_recipe); + stone_construction_recipe = new ShapelessRecipe(new ItemStack(Material.SANDSTONE,1)); + stone_construction_recipe.addIngredient(2, Material.getMaterial(44), 1); + Bukkit.addRecipe(stone_construction_recipe); + stone_construction_recipe = new ShapelessRecipe(new ItemStack(Material.WOOD,1)); + stone_construction_recipe.addIngredient(2, Material.getMaterial(44), 2); + Bukkit.addRecipe(stone_construction_recipe); + stone_construction_recipe = new ShapelessRecipe(new ItemStack(Material.COBBLESTONE,1)); + stone_construction_recipe.addIngredient(2, Material.getMaterial(44), 3); + Bukkit.addRecipe(stone_construction_recipe); + stone_construction_recipe = new ShapelessRecipe(new ItemStack(Material.BRICK,1)); + stone_construction_recipe.addIngredient(2, Material.getMaterial(44), 4); + Bukkit.addRecipe(stone_construction_recipe); + stone_construction_recipe = new ShapelessRecipe(new ItemStack(Material.getMaterial(98),1)); + stone_construction_recipe.addIngredient(2, Material.getMaterial(44), 5); + Bukkit.addRecipe(stone_construction_recipe); + stone_construction_recipe = new ShapelessRecipe(new ItemStack(Material.NETHER_BRICK,1)); + stone_construction_recipe.addIngredient(2, Material.getMaterial(44), 6); + Bukkit.addRecipe(stone_construction_recipe); + stone_construction_recipe = new ShapelessRecipe(new ItemStack(Material.QUARTZ_BLOCK,1)); + stone_construction_recipe.addIngredient(2, Material.getMaterial(44), 7); + Bukkit.addRecipe(stone_construction_recipe); + stone_construction_recipe = new ShapelessRecipe(new ItemStack(Material.PURPUR_BLOCK,1)); + stone_construction_recipe.addIngredient(2, Material.PURPUR_SLAB); + Bukkit.addRecipe(stone_construction_recipe); + ItemStack modded_plank = new ItemStack(Material.STEP,1); + modded_plank.setDurability((short)2); + ItemMeta m = modded_plank.getItemMeta(); + m.setDisplayName("Fireproof Oak Wood Slab"); + modded_plank.setItemMeta(m); + stone_construction_recipe = new ShapelessRecipe(modded_plank); + stone_construction_recipe.addIngredient(1, Material.WOOD_STEP); + stone_construction_recipe.addIngredient(1, Material.SLIME_BALL); + Bukkit.addRecipe(stone_construction_recipe); + } +} diff --git a/src/sig/plugin/TwosideKeeper/RecyclingCenter.java b/src/sig/plugin/TwosideKeeper/RecyclingCenter.java new file mode 100644 index 0000000..9e36d64 --- /dev/null +++ b/src/sig/plugin/TwosideKeeper/RecyclingCenter.java @@ -0,0 +1,100 @@ +package sig.plugin.TwosideKeeper; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Vector; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.inventory.ItemStack; + +public class RecyclingCenter { + //Each Recycling center has nodes which contain all the chests. + List nodes; + + boolean choosing = false; + + public RecyclingCenter() { + nodes = new ArrayList(); + } + + public void AddNode(World world, int locx,int locy,int locz) { + nodes.add(new Location(world,locx,locy,locz)); + } + + /** + * + * @param numb The number in the list of the node you want. + * @return The Location of the node requested. + */ + public Location getNodeLocation(int numb) { + return nodes.get(numb); + } + + public Location getRandomNode() { + return nodes.get((int)(Math.floor(Math.random()*nodes.size()))); + } + + public int getNumberOfNodes() { + return nodes.size(); + } + + public boolean IsItemAllowed(ItemStack item) { + //Artifact type of items are not allowed to be sent to the Recycling Center. + if (Artifact.isArtifact(item)) { + return false; + } + return true; + } + + public void loadConfig() { + File config= new File(TwosideKeeper.filesave,"recyclingcenters.data"); + if (config.exists()) { + Bukkit.getLogger().info("Config exists. Entering."); + FileConfiguration workable = YamlConfiguration.loadConfiguration(config); + + /*workable.addDefault("recyclingcenter.count", 0); + + int total = workable.getInt("recyclingcenter.count");*/ + //Bukkit.getLogger().info("Recycling center count: "+total+" ("+workable.getKeys(false).size()+")"); + for (int i=0;i players = new ArrayList(); //The players involved with this spleef game. + List registered_players = new ArrayList(); //The players involved with this spleef game. + TwosideKeeper plugin; + SpleefArena id; //The ID of this spleef game. + Location corner1; //The location of the first corner of the arena. + //Going outside it automatically terminates the game. + Location corner2; //The location of the second corner of the arena. + //Going outside it automatically terminates the game. + Location shovel_chest; //The location of the chest the spleef shovel is supposed to be in. + Location shovel_chest2; //The location of the chest the spleef shovel is supposed to be in. + Location sign; //The location of the sign to register for this spleef arena. + long registrationtime; //If it takes more than 60 seconds for players to register for a spleef game, the registration will be cancelled. + long starttime; //The starting time of the match. + long last_destroyed; //Time the last block was destroyed. + + public SpleefGame(TwosideKeeper plug, SpleefArena id, Location corner1, Location corner2, Location shovel_chest, Location sign) { + this.plugin=plug; + this.id=id; + this.corner1=corner1; + this.corner2=corner2; + this.shovel_chest=shovel_chest; + this.sign=sign; + + this.registrationtime=0; + } + public SpleefGame(TwosideKeeper plug, SpleefArena id, Location corner1, Location corner2, Location shovel_chest, Location shovel_chest2, Location sign) { + this.plugin=plug; + this.id=id; + this.corner1=corner1; + this.corner2=corner2; + this.shovel_chest=shovel_chest; + this.shovel_chest2=shovel_chest2; + this.sign=sign; + + this.registrationtime=0; + } + public String toString() { + return "SpleefGame: "+id.toString()+" From "+this.corner1.toString()+" to "+this.corner2.toString()+".\n" + + "Shovel Chest Loc: "+shovel_chest.toString()+";"+((shovel_chest2!=null)?"Shovel Chest 2 Loc: "+shovel_chest2.toString()+";":"")+ " Registration Sign Loc: "+sign.toString(); + } + + public boolean isActive() { + return active; + } + + public void EventListener(Event e) { + + //A listener for all events passed here. + + if (e instanceof BlockBreakEvent) { + BlockBreakEvent ev = (BlockBreakEvent)e; + + if (active) { + + if (ev.getBlock().getLocation().getBlockX()==corner1.getBlockX() || + ev.getBlock().getLocation().getBlockX()==corner2.getBlockX() || + ev.getBlock().getLocation().getBlockZ()==corner1.getBlockZ() || + ev.getBlock().getLocation().getBlockZ()==corner2.getBlockZ()) { + //We are not allowed to break blocks on the borders. + //This is a border block. Prevent destruction. + ev.setCancelled(true); + } + if (BlockIsInside(ev.getBlock().getLocation(),corner1,corner2)) { + //This is a block inside the field. Now see if it's a registered player. + boolean not_allowed=true; + for (int i=0;i=2) { + plugin.getServer().broadcastMessage(ChatColor.GOLD+"Player "+ChatColor.GREEN+ev.getPlayer().getName()+ChatColor.GOLD+" has registered to play in the "+ChatColor.AQUA+id.toString()+ChatColor.GOLD+" Spleef Arena!"); + plugin.getServer().broadcastMessage(ChatColor.BLUE+" 10 seconds left to register!"); + starttime=TwosideKeeper.getServerTickTime()+200; + } else { //We only have one player. Wait for more. + plugin.getServer().broadcastMessage(ChatColor.GOLD+"Player "+ChatColor.GREEN+ev.getPlayer().getName()+ChatColor.GOLD+" has registered to play in the "+ChatColor.AQUA+id.toString()+ChatColor.GOLD+" Spleef Arena!"); + plugin.getServer().broadcastMessage(ChatColor.BLUE+" Looking for at least one more player!"); + //De-register from other Spleef Arenas. + for (int i=0;i=2 && starttime<=TwosideKeeper.getServerTickTime()) + { //Start the game! + //Teleport players to the arena at a random position, clear their inventories, + //set their health, and their hunger. + //Setup the arena with the proper blocks, if the dirt blocks are not filled in already. + if (corner1.getBlockX()>corner2.getBlockX()) { + if (corner1.getBlockZ()>corner2.getBlockZ()) { + for (int i=corner2.getBlockX();i<=corner1.getBlockX();i++) { + for (int j=corner2.getBlockZ();j<=corner1.getBlockZ();j++) { + if (Bukkit.getWorld("world").getBlockAt(i,corner1.getBlockY(),j)!=null && + Bukkit.getWorld("world").getBlockAt(i,corner1.getBlockY(),j).getType()==Material.AIR) { + Bukkit.getWorld("world").getBlockAt(i,corner1.getBlockY(),j).setType(Material.DIRT); + } + if (id==SpleefArena.LAYERED && + i!=corner2.getBlockX() && + i!=corner1.getBlockX() && + j!=corner1.getBlockZ() && + j!=corner2.getBlockZ()) { + for (int k=0;k<3;k++) { + Bukkit.getWorld("world").getBlockAt(i,corner1.getBlockY()+k+1,j).setType(Material.GRAVEL); + } + } + } + } + } else { + for (int i=corner2.getBlockX();i<=corner1.getBlockX();i++) { + for (int j=corner1.getBlockZ();j<=corner2.getBlockZ();j++) { + if (Bukkit.getWorld("world").getBlockAt(i,corner1.getBlockY(),j)!=null && + Bukkit.getWorld("world").getBlockAt(i,corner1.getBlockY(),j).getType()==Material.AIR) { + Bukkit.getWorld("world").getBlockAt(i,corner1.getBlockY(),j).setType(Material.DIRT); + } + if (id==SpleefArena.LAYERED && + i!=corner2.getBlockX() && + i!=corner1.getBlockX() && + j!=corner1.getBlockZ() && + j!=corner2.getBlockZ()) { + for (int k=0;k<3;k++) { + Bukkit.getWorld("world").getBlockAt(i,corner1.getBlockY()+k+1,j).setType(Material.GRAVEL); + } + } + } + } + } + } else { + if (corner1.getBlockZ()>corner2.getBlockZ()) { + for (int i=corner1.getBlockX();i<=corner2.getBlockX();i++) { + for (int j=corner2.getBlockZ();j<=corner1.getBlockZ();j++) { + if (Bukkit.getWorld("world").getBlockAt(i,corner1.getBlockY(),j)!=null && + Bukkit.getWorld("world").getBlockAt(i,corner1.getBlockY(),j).getType()==Material.AIR) { + Bukkit.getWorld("world").getBlockAt(i,corner1.getBlockY(),j).setType(Material.DIRT); + } + if (id==SpleefArena.LAYERED && + i!=corner2.getBlockX() && + i!=corner1.getBlockX() && + j!=corner1.getBlockZ() && + j!=corner2.getBlockZ()) { + for (int k=0;k<3;k++) { + Bukkit.getWorld("world").getBlockAt(i,corner1.getBlockY()+k+1,j).setType(Material.GRAVEL); + } + } + } + } + } else { + for (int i=corner1.getBlockX();i<=corner2.getBlockX();i++) { + for (int j=corner1.getBlockZ();j<=corner2.getBlockZ();j++) { + if (Bukkit.getWorld("world").getBlockAt(i,corner1.getBlockY(),j)!=null && + Bukkit.getWorld("world").getBlockAt(i,corner1.getBlockY(),j).getType()==Material.AIR) { + Bukkit.getWorld("world").getBlockAt(i,corner1.getBlockY(),j).setType(Material.DIRT); + } + if (id==SpleefArena.LAYERED && + i!=corner2.getBlockX() && + i!=corner1.getBlockX() && + j!=corner1.getBlockZ() && + j!=corner2.getBlockZ()) { + for (int k=0;k<3;k++) { + Bukkit.getWorld("world").getBlockAt(i,corner1.getBlockY()+k+1,j).setType(Material.GRAVEL); + } + } + } + } + } + } + + //For the block above the chest, turn it into a wooden plank. + Bukkit.getWorld("world").getBlockAt(shovel_chest.clone().add(0,1,0)).setType(Material.WOOD); + //Insert a Spleef shovel in the chest. + //We will clear out the contents first. + if (Bukkit.getWorld("world").getBlockAt(shovel_chest).getState() instanceof Chest) { + Chest spleef_chest = (Chest)Bukkit.getWorld("world").getBlockAt(shovel_chest).getState(); + spleef_chest.getInventory().clear(); + spleef_chest.getInventory().setItem((int)(Math.random()*27), new ItemStack(Material.WOOD_SPADE)); + } + //And a second one if it exists. + if (shovel_chest2!=null) { + Bukkit.getWorld("world").getBlockAt(shovel_chest2.clone().add(0,1,0)).setType(Material.WOOD); + if (Bukkit.getWorld("world").getBlockAt(shovel_chest2).getState() instanceof Chest) { + Chest spleef_chest2 = (Chest)Bukkit.getWorld("world").getBlockAt(shovel_chest2).getState(); + spleef_chest2.getInventory().clear(); + spleef_chest2.getInventory().setItem((int)(Math.random()*27), new ItemStack(Material.WOOD_SPADE)); + } + } + + //Insert spleef shovel into the chest~! + + String matchup=""; //Set the string for the match-up. + for (int i=0;icorner2.getBlockX())?(corner1.getBlockX()-2-(Math.random()*(corner1.getBlockX()-corner2.getBlockX()-4))):(corner2.getBlockX()-2-(Math.random()*(corner2.getBlockX()-corner1.getBlockX()-4))), + (corner1.getBlockY()>corner2.getBlockY())?(corner1.getBlockY()+4):(corner2.getBlockY()+4), + (corner1.getBlockZ()>corner2.getBlockZ())?(corner1.getBlockZ()-2-(Math.random()*(corner1.getBlockZ()-corner2.getBlockZ()-4))):(corner2.getBlockZ()-2-(Math.random()*(corner2.getBlockZ()-corner1.getBlockZ()-4))) + ), TeleportCause.PLUGIN); + //Give players Resistance 100 so they can never die. + Bukkit.getServer().getPlayer(players.get(i).player).addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE,99999,100)); + } + active=true; + starttime=TwosideKeeper.getServerTickTime(); + //registered_players=players; //Registered players include every single player that joined in. This is to manage ranking and + //who is allowed to help break blocks after losing. + last_destroyed=TwosideKeeper.getServerTickTime(); + + Bukkit.getServer().broadcastMessage(ChatColor.GOLD+"The spleef matchup between "+ChatColor.GREEN+matchup+ChatColor.GOLD+" has begun!"); + } + + if (active && starttime+100highest_count) { + highest_count=players.get(i).blocks_destroyed; + winner=players.get(i); + } + } + + Bukkit.getServer().broadcastMessage(ChatColor.GOLD+"The Spleef Match has stalled, and the winner has been decided!"); + Bukkit.getServer().broadcastMessage(ChatColor.BLUE+""+ChatColor.ITALIC+" With "+ChatColor.GREEN+highest_count+ChatColor.BLUE+" blocks destroyed..."); + //We will have the winner. End the Match. + if (winner!=null) { + EndMatch(winner); + } else { + EndMatch(players.get(0)); //Something went wrong?? + } + } + } + + void RemovePlayer(Player p, RemovePlayerReason rs) { + for (int i=0;icorner2.getBlockX())?(corner1.getBlockX()-(Math.random()*(corner1.getBlockX()-corner2.getBlockX()))):(corner2.getBlockX()-(Math.random()*(corner2.getBlockX()-corner1.getBlockX()))), + (corner1.getBlockY()>corner2.getBlockY())?(corner1.getBlockY()-2):(corner2.getBlockY()-2), + (corner1.getBlockZ()>corner2.getBlockZ())?(corner1.getBlockZ()-(Math.random()*(corner1.getBlockZ()-corner2.getBlockZ()))):(corner2.getBlockZ()-(Math.random()*(corner2.getBlockZ()-corner1.getBlockZ()))) + ), TeleportCause.PLUGIN); + if (rs==RemovePlayerReason.OUTOFBOUNDS || + rs==RemovePlayerReason.QUIT) { + for (int i=0;ib2.getBlockX()) { + if (b1.getBlockZ()>b2.getBlockZ()) { + if (l.getBlockX()>b2.getBlockX() && + l.getBlockX()b2.getBlockZ() && + l.getBlockZ()b2.getBlockX() && + l.getBlockX()b1.getBlockZ()) { + return true; + } else { + return false; + } + } + } else { + if (b1.getBlockZ()>b2.getBlockZ()) { + if (l.getBlockX()b1.getBlockX() && + l.getBlockZ()>b2.getBlockZ() && + l.getBlockZ()b1.getBlockX() && + l.getBlockZ()b1.getBlockZ()) { + return true; + } else { + return false; + } + } + } + } +} + +enum RemovePlayerReason { + QUIT,OUTOFBOUNDS,GENERAL; +} + +class SpleefPlayerData { + String player; //The name of the player. + ItemStack player_equipment_helmet; + ItemStack player_equipment_chestplate; + ItemStack player_equipment_leggings; + ItemStack player_equipment_boots; + ItemStack player_equipment_shield; + List player_inventory = new ArrayList(); + TwosideKeeper plug; + int blocks_destroyed; + SpleefPlayerData(TwosideKeeper plug, Player player) { + this.plug=plug; + this.player=player.getName(); + this.blocks_destroyed=0; + /* + */ + } + public void RestoreInventory() { + //Gives the player back their inventory. + for (int i=0;icorner2.getBlockX())?corner2.getBlockX():corner1.getBlockX(), + xbound2=(corner1.getBlockX()>corner2.getBlockX())?corner1.getBlockX():corner2.getBlockX(), + zbound1=(corner1.getBlockZ()>corner2.getBlockZ())?corner2.getBlockZ():corner1.getBlockZ(), + zbound2=(corner1.getBlockZ()>corner2.getBlockZ())?corner1.getBlockZ():corner2.getBlockZ(); + if (p.getLocation().getBlockX()<=xbound1 || + p.getLocation().getBlockX()>=xbound2 || + p.getLocation().getBlockZ()<=zbound1 || + p.getLocation().getBlockZ()>=zbound2 || + p.getLocation().getBlockY() spleef_game_list; + TwosideKeeper plugin; + public SpleefManager(TwosideKeeper plug) { + plugin = plug; + spleef_game_list = new ArrayList(); + } + public List GetSpleefGames() { + return spleef_game_list; + } + public List GetActiveSpleefGames() { + List active_spleef_game_list = new ArrayList(); + for (int i=0;i playerdata; + public static SpleefManager TwosideSpleefGames; + public WorldShopManager TwosideShops; + + public int TeamCounter = 0; + public List PartyList = new ArrayList(); + public List colors_used = new ArrayList(); + + public RecyclingCenter TwosideRecyclingCenter; + + //Bank timers and users. + public String withdrawUser=""; + public long withdrawTime=0; + public String depositUser=""; + public long depositTime=0; + public String conversionUser=""; + public long conversionTime=0; + public int sleepingPlayers=0; + + int[] lampblocks = {1626,71,-255, //List of all lamp blocks in the city to be lit. + 1628,70,-223, + 1626,70,-265, + 1624,70,-267, + 1635,71,-269, + 1612,69,-269, + 1610,69,-271, + 1595,67,-267, + 1595,66,-269, + 1577,66,-271, + 1610,71,-282, + 1608,71,-295, + 1610,67,-317, + 1610,67,-338, + 1610,67,-340, + 1632,71,-342, + 1601,67,-342, + 1587,67,-340}; + + boolean lamps_are_turned_on = false; + + @Override + public void onEnable() { + // TODO Insert logic to be performed when the plugin is enabled + Bukkit.getPluginManager().registerEvents(this, this); + + loadConfig(); + + sig.plugin.TwosideKeeper.Recipes.Initialize_ItemCube_Recipes(); + sig.plugin.TwosideKeeper.Recipes.Initialize_ArrowQuiver_Recipe(); + sig.plugin.TwosideKeeper.Recipes.Initialize_BlockArmor_Recipes(); + sig.plugin.TwosideKeeper.Recipes.Initialize_ItemDeconstruction_Recipes(); + sig.plugin.TwosideKeeper.Recipes.Initialize_WoolRecolor_Recipes(); + sig.plugin.TwosideKeeper.Recipes.Initialize_SlabReconstruction_Recipes(); + + filesave=getDataFolder(); //Store the location of where our data folder is. + getLogger().info("Data folder at "+filesave+"."); + + STARTTIME=Bukkit.getWorld("world").getFullTime(); + LASTSERVERCHECK=getServerTickTime(); + + TwosideRecyclingCenter = new RecyclingCenter(); + TwosideRecyclingCenter.loadConfig(); + Bukkit.getLogger().info("Recycling Centers Loaded: "+TwosideRecyclingCenter.getNumberOfNodes()); + + //Create Spleef Games. + TwosideSpleefGames = new SpleefManager(this); + + TwosideSpleefGames.SetupSpleefArena( + SpleefArena.SMALL, //Spleef Arena Type + new Location(Bukkit.getWorld("world"),1616,86,53), //Corner 1 + new Location(Bukkit.getWorld("world"),1627,86,64), //Corner 2 + new Location(Bukkit.getWorld("world"),1622,85,58), //Shovel Chest + new Location(Bukkit.getWorld("world"),1620,83,45) //Registration Sign + ); + TwosideSpleefGames.SetupSpleefArena( + SpleefArena.LARGE, //Spleef Arena Type + new Location(Bukkit.getWorld("world"),1585,86,24), //Corner 1 + new Location(Bukkit.getWorld("world"),1600,86,39), //Corner 2 + new Location(Bukkit.getWorld("world"),1593,85,34), //Shovel Chest + new Location(Bukkit.getWorld("world"),1593,85,29), //Shovel Chest 2 + new Location(Bukkit.getWorld("world"),1608,83,34) //Registration Sign + ); + TwosideSpleefGames.SetupSpleefArena( + SpleefArena.LAYERED, //Spleef Arena Type + new Location(Bukkit.getWorld("world"),1658,87,27), //Corner 1 + new Location(Bukkit.getWorld("world"),1646,87,39), //Corner 2 + new Location(Bukkit.getWorld("world"),1652,86,34), //Shovel Chest + new Location(Bukkit.getWorld("world"),1635,83,31) //Registration Sign + ); + + TwosideShops = new WorldShopManager(); + + //Initialize Player Data structure. + playerdata = new ArrayList(); + + //This is the constant timing method. + getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable(){ + public void run(){ + //getLogger().info("Server time passed: "+(Bukkit.getWorld("world").getFullTime()-STARTTIME)+". New Server Time: "+(Bukkit.getWorld("world").getFullTime()-STARTTIME+SERVERTICK)); + Bukkit.getWorld("world").setFullTime(Bukkit.getWorld("world").getFullTime()-10); + //WORK IN PROGRESS: Lamp updating code TO GO HERE. + + //SAVE SERVER SETTINGS. + if (getServerTickTime()-LASTSERVERCHECK>=SERVERCHECKERTICKS) { //15 MINUTES (DEFAULT) + saveOurData(); + + + //Advertisement messages could go here. + //MOTD: "Thanks for playing on Sig's Minecraft!\n*bCheck out http://z-gamers.net/mc for update info!\n*aReport any bugs you find at http://zgamers.domain.com/mc/" + getMOTD(); + getServer().broadcastMessage(ChatColor.translateAlternateColorCodes('*', MOTD)); + /* + getServer().broadcastMessage("Thanks for playing on Sig's Minecraft!"); + getServer().broadcastMessage(ChatColor.AQUA+"Check out http://z-gamers.net/mc for update info!"); + getServer().broadcastMessage(" "); + */ + //End Advertisements. + + LASTSERVERCHECK=getServerTickTime(); + } + + //Check our deposit and withdraw terminals for lingering timers. + if (!withdrawUser.equalsIgnoreCase("") && getServerTickTime()-withdrawTime>TERMINALTIME) { + //This is occupied still when it's supposed to time out. + Player p = Bukkit.getPlayer(withdrawUser); + if (p!=null) { + p.sendMessage(ChatColor.RED+"RAN OUT OF TIME! "+ChatColor.WHITE+"Cancelled out of Withdraw terminal."); + } + withdrawUser=""; + } + if (!depositUser.equalsIgnoreCase("") && getServerTickTime()-depositTime>TERMINALTIME) { + //This is occupied still when it's supposed to time out. + Player p = Bukkit.getPlayer(depositUser); + if (p!=null) { + p.sendMessage(ChatColor.RED+"RAN OUT OF TIME! "+ChatColor.WHITE+"Cancelled out of Deposit terminal."); + } + depositUser=""; + } + if (!conversionUser.equalsIgnoreCase("") && getServerTickTime()-conversionTime>TERMINALTIME) { + //This is occupied still when it's supposed to time out. + Player p = Bukkit.getPlayer(conversionUser); + if (p!=null) { + p.sendMessage(ChatColor.RED+"RAN OUT OF TIME! "+ChatColor.WHITE+"Cancelled out of Conversion terminal."); + } + conversionUser=""; + } + + if (Bukkit.getWorld("world").getTime()>=12000) { + Collection players = (Collection) getServer().getOnlinePlayers(); + //Count the number of players sleeping. Compare to "sleepingplayers" count. + //getLogger().info("[DEBUG] Time: "+Bukkit.getWorld("world").getTime()+" Full Time: "+Bukkit.getWorld("world").getFullTime() + " SERVERTICKTIME: "+getServerTickTime()); + if (players.size()>=2) { //This functionality only makes sense when two or more players are on. + int sleeping=0; + for (int i=0;i=players.size()/2) { + //Make it the next day. + getServer().broadcastMessage(ChatColor.GOLD+"Enough Players sleeping! It's now morning!"); + + SERVERTICK=getServerTickTime(); + Bukkit.getWorld("world").setTime(0); + STARTTIME=Bukkit.getWorld("world").getFullTime(); + LASTSERVERCHECK=getServerTickTime(); + //Make sure we keep SERVERTICK in check. + sleepingPlayers=0; + } + } + } + + //See if each player needs to regenerate their health. + for (int i=0;i=16) { + p.setHealth((p.getHealth()+1+(p.getMaxHealth()*0.05)>p.getMaxHealth())?p.getMaxHealth():p.getHealth()+1+(p.getMaxHealth()*0.05)); + } + } + //See if this player is sleeping. + if (p.isSleeping()) { + p.setHealth(Bukkit.getPlayer(pd.name).getMaxHealth()); //Heals the player fully when sleeping. + } + //We need to see if this player's damage reduction has changed recently. If so, notify them. + //Check damage reduction by sending an artifical "1" damage to the player. + if (!p.isDead()) {setPlayerMaxHealth(p);} + p.getScoreboard().getTeam(p.getName().toLowerCase()).setSuffix(createHealthbar(((p.getHealth())/p.getMaxHealth())*100,p)); + if (CalculateDamageReduction(1,p,p)!=pd.damagereduction) { + pd.damagereduction=CalculateDamageReduction(1,p,p); + p.sendMessage(ChatColor.GRAY+""+ChatColor.ITALIC+"Damage Reduction modified: "+ChatColor.RESET+""+ChatColor.DARK_AQUA+Math.round((1.0-pd.damagereduction)*100)+"%"); + } + + + //Try to fit into an already existing party. + boolean inParty=false; + for (int j=0;j lore = meta.getLore(); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+args[0]); + meta.setLore(lore); + } else { + List lore = new ArrayList(); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+args[0]); + meta.setLore(lore); + if (lore.size()>=1) { + sender.sendMessage("Updated Lore."); + } + } + item.setItemMeta(meta); + p.getEquipment().setItemInMainHand(item); + } else { + sender.sendMessage("Wrong arguments!"); + } + } else { + sender.sendMessage("Cannot harden nothing!"); + } + return true; + } else + if (cmd.getName().equalsIgnoreCase("item_cube")) { + //sender.sendMessage("You are currently holding "+ChatColor.GREEN+"$"+getPlayerMoney((Player)sender)); + //sender.sendMessage("You are currently holding "+ChatColor.GREEN+"$"+getPlayerMoney((Player)sender)); + Player p = (Player)sender; + if (p.getEquipment().getItemInMainHand()!=null) { + if (args.length==1) { + ItemStack item = p.getEquipment().getItemInMainHand(); + ItemMeta meta = item.getItemMeta(); + if (meta.hasLore()) { + List lore = meta.getLore(); + lore.clear(); + lore.add(" "); + lore.add(" "); + lore.add(" "); + lore.add(ChatColor.DARK_PURPLE+"ID#"+args[0]); + meta.setLore(lore); + } else { + List lore = new ArrayList(); + lore.clear(); + lore.add(" "); + lore.add(" "); + lore.add(" "); + lore.add(ChatColor.DARK_PURPLE+"ID#"+args[0]); + meta.setLore(lore); + } + item.setItemMeta(meta); + p.getEquipment().setItemInMainHand(item); + } else { + sender.sendMessage("Wrong arguments!"); + } + } else { + sender.sendMessage("Cannot convert nothing!"); + } + return true; + } else + if (cmd.getName().equalsIgnoreCase("artifact")) { + Player p = (Player)sender; + if (args.length==1) { + p.getInventory().addItem(Artifact.createArtifactItem(ArtifactItem.valueOf(args[0]))); + } else { + sender.sendMessage("Wrong arguments!"); + } + } else + if (cmd.getName().equalsIgnoreCase("recyclingcenter")) { + Player p = (Player)sender; + TwosideRecyclingCenter.setChoosingRecyclingCenter(!TwosideRecyclingCenter.isChoosingRecyclingCenter()); + if (TwosideRecyclingCenter.isChoosingRecyclingCenter()) { + p.sendMessage(ChatColor.GREEN+"Click on a Chest to set up a new Recycling Center Node."); + } else { + p.sendMessage(ChatColor.RED+"Cancelled Recycling Center selection mode."); + } + } else + if (cmd.getName().equalsIgnoreCase("sound")) { + Player p = (Player)sender; + for (int i=0;i=1) { + //See if we're using a bank terminal. + Player thisp = ev.getPlayer(); + if (withdrawUser.equalsIgnoreCase(thisp.getName())) { + //See if this message is a number. + if (isNumeric(ev.getMessage())) { + DecimalFormat df = new DecimalFormat("0.00"); + Double value=Double.parseDouble(ev.getMessage()); + value=Double.parseDouble(df.format(Double.valueOf(value))); + if (value>=0.01) { + if (getPlayerBankMoney(thisp)>=value) { + //Withdraw the money. Credit it to the player. + givePlayerBankMoney(thisp,-value); + givePlayerMoney(thisp,value); + ev.getPlayer().sendMessage(ChatColor.GOLD+"WITHDRAW COMPLETE!"); + ev.getPlayer().sendMessage(" Now Holding: "+ChatColor.GREEN+"$"+df.format(getPlayerMoney(ev.getPlayer()))); + } else { + thisp.sendMessage(ChatColor.RED+"Your account does not have that much money! You can withdraw a maximum of "+ChatColor.WHITE+"$"+getPlayerBankMoney(thisp)); + thisp.sendMessage(ChatColor.WHITE+" Cancelled out of Withdraw terminal."); + } + } else { + thisp.sendMessage(ChatColor.RED+"You must withdraw at least "+ChatColor.WHITE+"$0.01 or more."); + thisp.sendMessage(ChatColor.WHITE+" Cancelled out of Withdraw terminal."); + } + } else { + thisp.sendMessage(ChatColor.RED+"Invalid Number!"); + thisp.sendMessage(ChatColor.WHITE+" Cancelled out of Withdraw terminal."); + } + withdrawUser=""; + ev.setMessage(""); + ev.setCancelled(true); + } else + if (depositUser.equalsIgnoreCase(thisp.getName())) { + //See if this message is a number. + if (isNumeric(ev.getMessage())) { + DecimalFormat df = new DecimalFormat("0.00"); + Double value=Double.parseDouble(ev.getMessage()); + value=Double.parseDouble(df.format(Double.valueOf(value))); + if (value>=0.01) { + if (getPlayerMoney(thisp)>=value) { + //Withdraw the money. Credit it to the player. + givePlayerBankMoney(thisp,value); + givePlayerMoney(thisp,-value); + ev.getPlayer().sendMessage(ChatColor.GOLD+"DEPOSIT COMPLETE!"); + ev.getPlayer().sendMessage(" Now In Bank: "+ChatColor.BLUE+"$"+df.format(getPlayerBankMoney(ev.getPlayer()))); + } else { + thisp.sendMessage(ChatColor.RED+"You are not holding that much money! You can deposit a maximum of "+ChatColor.WHITE+"$"+getPlayerMoney(thisp)); + thisp.sendMessage(ChatColor.WHITE+" Cancelled out of Deposit terminal."); + } + } else { + thisp.sendMessage(ChatColor.RED+"You must deposit at least "+ChatColor.WHITE+"$0.01 or more."); + thisp.sendMessage(ChatColor.WHITE+" Cancelled out of Deposit terminal."); + } + } else { + thisp.sendMessage(ChatColor.RED+"Invalid Number!"); + thisp.sendMessage(ChatColor.WHITE+" Cancelled out of Deposit terminal."); + } + depositUser=""; + ev.setMessage(""); + ev.setCancelled(true); + } else + if (conversionUser.equalsIgnoreCase(thisp.getName())) { + //See if this message is a number. + if (isNumeric(ev.getMessage())) { + DecimalFormat df = new DecimalFormat("0.00"); + Integer value=Integer.parseInt(ev.getMessage()); + if (value>=1) { + if (thisp.getLevel()>=value) { + //Take that amount of exp away from the player. Give them money in return. + int startlv = thisp.getLevel(); + for (int i=startlv;i>=startlv-value;i--) { + switch (i) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + { + givePlayerMoney(thisp,(2*i+7)*XP_CONVERSION_RATE); + }break; + case 17: + case 18: + case 19: + case 20: + case 21: + case 22: + case 23: + case 24: + case 25: + case 26: + case 27: + case 28: + case 29: + case 30: + case 31: + { + givePlayerMoney(thisp,(5*i-38)*XP_CONVERSION_RATE); + }break; + default:{ + givePlayerMoney(thisp,(9*i-158)*XP_CONVERSION_RATE); + } + } + } + thisp.setLevel(thisp.getLevel()-value); + ev.getPlayer().sendMessage(ChatColor.GOLD+"CONVERSION COMPLETE!"); + ev.getPlayer().sendMessage(" Now Holding: "+ChatColor.BLUE+"$"+df.format(getPlayerMoney(ev.getPlayer()))); + } else { + thisp.sendMessage(ChatColor.RED+"You do not have that many levels. You can convert as many as "+ChatColor.WHITE+thisp.getLevel()+ChatColor.RED+" levels."); + thisp.sendMessage(ChatColor.WHITE+" Cancelled out of Conversion terminal."); + } + } else { + thisp.sendMessage(ChatColor.RED+"You must convert at least "+ChatColor.WHITE+"1 level."); + thisp.sendMessage(ChatColor.WHITE+" Cancelled out of Conversion terminal."); + } + } else { + thisp.sendMessage(ChatColor.RED+"Invalid Number!"); + thisp.sendMessage(ChatColor.WHITE+" Cancelled out of Conversion terminal."); + } + conversionUser=""; + ev.setMessage(""); + ev.setCancelled(true); + } else + if (TwosideShops.IsPlayerUsingTerminal(ev.getPlayer())) { + final WorldShopSession current_session = TwosideShops.GetSession(ev.getPlayer()); + current_session.UpdateTime(); //Make sure our session does not expire. + switch (current_session.GetSessionType()) { + case CREATE: + if (isNumeric(ev.getMessage())) { + int amt = Integer.parseInt(ev.getMessage()); + if (amt<=CountItems(ev.getPlayer(), current_session.getItem()) && amt>0) { + current_session.SetAmt(amt); + ev.getPlayer().sendMessage("Input how much each "+ChatColor.GREEN+TwosideKeeper.GetItemName(current_session.getItem())+ChatColor.WHITE+" will cost:"); + current_session.SetSession(SessionState.PRICE); + } else { + if (amt<=0) { + ev.getPlayer().sendMessage("You cannot sell a non-existent amount of items. Please try again."); + } else { + ev.getPlayer().sendMessage("You only have "+CountItems(ev.getPlayer(), current_session.getItem())+" of "+ChatColor.GREEN+TwosideKeeper.GetItemName(current_session.getItem())+ChatColor.WHITE+". Please try again with a lower amount."); + } + } + } else { + ev.getPlayer().sendMessage("That is not a valid number! Please try again."); + } + break; + case PRICE: + if (isNumeric(ev.getMessage())) { + final DecimalFormat df = new DecimalFormat("0.00"); + final double amt = Double.parseDouble(ev.getMessage()); + if (amt>0 && amt<=999999999999.99) { + ev.getPlayer().sendMessage(ChatColor.DARK_BLUE+"Shop has been successfully created!"); + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + @Override + public void run() { + TwosideShops.SaveWorldShopData( + TwosideShops.CreateWorldShop(current_session.GetSign(), current_session.getItem(), current_session.getAmt(), Double.parseDouble(df.format(amt)), ev.getPlayer().getName()) + ); + RemoveItemAmount(ev.getPlayer(), current_session.getItem(), current_session.getAmt()); + TwosideShops.RemoveSession(ev.getPlayer()); + } + },1); + + } else { + if (amt>999999999999.99) { + ev.getPlayer().sendMessage("You cannot sell an item for that ridiculous amount. Please try again."); + } else { + ev.getPlayer().sendMessage("You cannot sell an item for free. Please try again."); + } + } + } else { + ev.getPlayer().sendMessage("That is not a valid number! Please try again."); + } + break; + case EDIT: + if (isNumeric(ev.getMessage())) { + int amt = Integer.parseInt(ev.getMessage()); + DecimalFormat df = new DecimalFormat("0.00"); + WorldShop shop = TwosideShops.LoadWorldShopData(TwosideShops.GetShopID(current_session.GetSign())); + if (amt>=0) { + if (amt<=CountItems(ev.getPlayer(), shop.GetItem())) { + shop.UpdateAmount(shop.GetAmount()+amt); + RemoveItemAmount(ev.getPlayer(), shop.GetItem(), amt); + TwosideShops.SaveWorldShopData(shop); + TwosideShops.UpdateSign(shop, TwosideShops.GetShopID(current_session.GetSign()), current_session.GetSign()); + ev.getPlayer().sendMessage("Added "+ChatColor.AQUA+amt+ChatColor.WHITE+" more "+ChatColor.GREEN+shop.GetItemName()+ChatColor.WHITE+" to your shop!"); + ev.getPlayer().sendMessage("Input how much each "+ChatColor.GREEN+shop.GetItemName()+ChatColor.WHITE+" will cost (Old value - "+ChatColor.YELLOW+"$"+df.format(shop.GetUnitPrice())+ChatColor.WHITE+":"); + + current_session.SetSession(SessionState.UPDATE); + } else { + if (amt<=0) { + ev.getPlayer().sendMessage("You cannot add a non-existent amount of items. Please try again."); + } else { + ev.getPlayer().sendMessage("You only have "+CountItems(ev.getPlayer(), shop.GetItem())+" of "+ChatColor.GREEN+shop.GetItemName()+ChatColor.WHITE+". Please try again with a lower amount."); + } + } + } else { + if (-amt<=shop.GetAmount()) { + //Take out these items from the shop. + amt*=-1; + shop.UpdateAmount(shop.GetAmount()-amt); + ItemStack drop = shop.GetItem(); + int dropAmt = amt; + //ev.getPlayer().getWorld().dropItemNaturally(ev.getPlayer().getLocation(), drop).setPickupDelay(0); + final Player p = ev.getPlayer(); + while (dropAmt>0) { + if (dropAmt>shop.GetItem().getMaxStackSize()) { + drop.setAmount(shop.GetItem().getMaxStackSize()); + final ItemStack dropitem = drop; + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + @Override + public void run() { + p.getWorld().dropItemNaturally(p.getLocation(), dropitem).setPickupDelay(0); + } + },1); + dropAmt-=shop.GetItem().getMaxStackSize(); + } else { + drop.setAmount(dropAmt); + final ItemStack dropitem = drop; + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + @Override + public void run() { + p.getWorld().dropItemNaturally(p.getLocation(), dropitem).setPickupDelay(0); + } + },1); + dropAmt=0; + } + } + Bukkit.getLogger().info("Dropped item."); + //ev.getPlayer().getWorld().dropItemNaturally(ev.getPlayer().getLocation(), drop).setPickupDelay(0); + TwosideShops.SaveWorldShopData(shop); + TwosideShops.UpdateSign(shop, TwosideShops.GetShopID(current_session.GetSign()), current_session.GetSign()); + + if (shop.GetAmount()>0) { + current_session.SetSession(SessionState.UPDATE); + ev.getPlayer().sendMessage("Input how much each "+ChatColor.GREEN+shop.GetItemName()+ChatColor.WHITE+" will cost (Old value - "+ChatColor.YELLOW+"$"+df.format(shop.GetUnitPrice())+ChatColor.WHITE+":"); + } else { + ev.getPlayer().sendMessage(ChatColor.DARK_BLUE+"Shop successfully updated!"); + TwosideShops.RemoveSession(ev.getPlayer()); + } + } else { + ev.getPlayer().sendMessage("You only have "+shop.GetAmount()+" of "+ChatColor.GREEN+shop.GetItemName()+ChatColor.WHITE+" in the shop. Please try again."); + } + } + } else { + ev.getPlayer().sendMessage("That is not a valid number! Please try again."); + } + break; + case UPDATE: + if (isNumeric(ev.getMessage())) { + double amt = Double.parseDouble(ev.getMessage()); + WorldShop shop = TwosideShops.LoadWorldShopData(TwosideShops.GetShopID(current_session.GetSign())); + if (amt>0 && amt<=999999999999.99) { + shop.UpdateUnitPrice(amt); + TwosideShops.SaveWorldShopData(shop); + TwosideShops.UpdateSign(shop, TwosideShops.GetShopID(current_session.GetSign()), current_session.GetSign()); + ev.getPlayer().sendMessage(ChatColor.DARK_BLUE+"Shop successfully updated!"); + TwosideShops.RemoveSession(ev.getPlayer()); + } else { + if (amt>999999999999.99) { + ev.getPlayer().sendMessage("You cannot sell an item for that ridiculous amount. Please try again."); + } else { + ev.getPlayer().sendMessage("You cannot sell an item for free. Please try again."); + } + } + } else { + ev.getPlayer().sendMessage("That is not a valid number! Please try again."); + } + break; + case PURCHASE: + if (isNumeric(ev.getMessage())) { + DecimalFormat df = new DecimalFormat("0.00"); + int amt = Integer.parseInt(ev.getMessage()); + if (amt>0) { + int shopID = TwosideShops.GetShopID(current_session.GetSign()); + WorldShop shop = TwosideShops.LoadWorldShopData(shopID); + if (amt<=shop.GetAmount()) { + if (getPlayerMoney(ev.getPlayer())>=amt*shop.GetUnitPrice()) { + ev.getPlayer().sendMessage(ChatColor.DARK_BLUE+"Successfully bought "+amt+" "+ChatColor.GREEN+shop.GetItemName()+ChatColor.WHITE+"!"); + shop.UpdateAmount(shop.GetAmount()-amt); + ItemStack shopItem = shop.GetItem(); + int dropAmt = amt; + while (dropAmt>0) { + if (dropAmt>shop.GetItem().getMaxStackSize()) { + shopItem.setAmount(shop.GetItem().getMaxStackSize()); + final ItemStack dropitem = shopItem; + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + @Override + public void run() { + ev.getPlayer().getWorld().dropItemNaturally(ev.getPlayer().getLocation(), dropitem).setPickupDelay(0); + } + },1); + dropAmt-=shop.GetItem().getMaxStackSize(); + } else { + shopItem.setAmount(dropAmt); + final ItemStack dropitem = shopItem; + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + @Override + public void run() { + ev.getPlayer().getWorld().dropItemNaturally(ev.getPlayer().getLocation(), dropitem).setPickupDelay(0); + } + },1); + dropAmt=0; + } + } + TwosideShops.UpdateSign(shop, shopID, current_session.GetSign()); + TwosideShops.SaveWorldShopData(shop); + TwosideShops.RemoveSession(ev.getPlayer()); + givePlayerMoney(ev.getPlayer(), -amt*shop.GetUnitPrice()); + TwosideShops.AddNewPurchase(shop.GetOwner(), ev.getPlayer(), shop.GetItem(), amt*shop.GetUnitPrice(), amt); + if (Bukkit.getPlayer(shop.GetOwner())!=null) { + givePlayerMoney(Bukkit.getPlayer(shop.GetOwner()), amt*shop.GetUnitPrice()); + } else { + givePlayerMoney(shop.GetOwner(), amt*shop.GetUnitPrice()); + } + } else { + ev.getPlayer().sendMessage("You do not have enough money to buy that many (You can buy "+ChatColor.GREEN+(int)(getPlayerMoney(ev.getPlayer())/shop.GetUnitPrice())+ChatColor.WHITE+" of them)! Please try again."); + } + } else { + ev.getPlayer().sendMessage("There are only "+shop.GetAmount()+" of this item in the shop! Please try again."); + } + } else { + ev.getPlayer().sendMessage(ChatColor.RED+"Decided not to buy anything."); + TwosideShops.RemoveSession(ev.getPlayer()); + } + } else { + ev.getPlayer().sendMessage("That is not a valid number! Please try again."); + } + break; + default: + break; + } + ev.setMessage(""); + ev.setCancelled(true); + } else + for (int i=0;i-1) { + pos = ev.getMessage().indexOf("[]"); + ev.setMessage(ev.getMessage().replace("[]", "")); + //getLogger().info("pos is "+pos+" message is: {"+ev.getMessage()+"}"); + Bukkit.dispatchCommand(Bukkit.getConsoleSender(),"tellraw @a [\"\",{\"text\":\"<"+ev.getPlayer().getName()+"> \"},{\"text\":\""+ev.getMessage().substring(0, pos)+"\"},{\"text\":\""+ChatColor.GREEN+"["+ChatColor.stripColor(TwosideKeeper.GetItemName(ev.getPlayer().getEquipment().getItemInMainHand()))+ChatColor.GREEN+"]"+ChatColor.WHITE+"\",\"hoverEvent\":{\"action\":\"show_text\",\"value\":\""+TwosideKeeper.GetItemName(ev.getPlayer().getEquipment().getItemInMainHand())+"\n"+WorldShop.GetItemInfo(ev.getPlayer().getEquipment().getItemInMainHand()).replace("\"", "\\\"")+"\"}},{\"text\":\""+ev.getMessage().substring(pos)+"\"}]"); + ev.setCancelled(true); + } + //Bukkit.dispatchCommand(Bukkit.getConsoleSender(),"tellraw @a [\"\",{\"text\":\""+ChatColor.GREEN+"[Item]"+ChatColor.WHITE+"\",\"hoverEvent\":{\"action\":\"show_text\",\"value\":\""+(ev.getPlayer().getEquipment().getItemInMainHand().getType())+"\"}},{\"text\":\" "+ev.getMessage().substring(0, pos)+" \"}]"); + + } + } + + @EventHandler(priority=EventPriority.LOW) + public void onPlayerInteract(PlayerInteractEvent ev) { + Block b = ev.getClickedBlock(); + //getLogger().info("Interacting "+ev.getAction().toString()); + + //Pass along this event to Spleef Games. + TwosideSpleefGames.PassEvent(ev); + + final Player player = ev.getPlayer(); + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + @Override + public void run() { + setPlayerMaxHealth(player); + } + },1); + + if (ev.getClickedBlock()!=null && ev.getClickedBlock().getType()==Material.CHEST && + TwosideRecyclingCenter.isChoosingRecyclingCenter() && + ev.getPlayer().hasPermission("TwosideKeeper.recyclingcenter")) { + TwosideRecyclingCenter.setChoosingRecyclingCenter(false); + //Create a new Recycling Center. + TwosideRecyclingCenter.AddNode(ev.getClickedBlock().getWorld(), ev.getClickedBlock().getLocation().getBlockX(), ev.getClickedBlock().getLocation().getBlockY(), ev.getClickedBlock().getLocation().getBlockZ()); + ev.getPlayer().sendMessage(ChatColor.DARK_BLUE+"New Recycling Center successfully created at "+ev.getClickedBlock().getLocation().toString()); + } + + //Shield related stuff in here. + if (ev.getAction()==Action.RIGHT_CLICK_AIR || + ev.getAction()==Action.RIGHT_CLICK_BLOCK) { + //See if this player is blocking. If so, give them absorption. + //Player p = ev.getPlayer(); + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + @Override + public void run() { + if (player.isBlocking()) { + //Give absorption hearts. + if (isDefender(player)) { + player.addPotionEffect(new PotionEffect(PotionEffectType.ABSORPTION,200,1)); + + List entities = player.getNearbyEntities(16, 16, 16); + for (int i=0;i entities = ev.getPlayer().getWorld().getNearbyEntities(newloc, 1, 1, 1); + for (int i=0;i0) { + player.sendMessage("How many "+ChatColor.GREEN+shop.GetItemName()+ChatColor.WHITE+" would you like to buy? "+ChatColor.GREEN+"(MAX: "+((getPlayerMoney(player)<(shop.GetAmount()*shop.GetUnitPrice()))?(int)(getPlayerMoney(player)/shop.GetUnitPrice()):shop.GetAmount())+")"); + + //Initiate buying session. + TwosideShops.AddSession(SessionState.PURCHASE, player, s); + getLogger().info("Added a session."); + shop.sendItemInfo(player); + } else { + player.sendMessage(ChatColor.GOLD+"Sorry! "+ChatColor.WHITE+"This shop is sold out! Let "+ChatColor.LIGHT_PURPLE+shop.GetOwner()+ChatColor.WHITE+" know to restock the shop!"); + } + } + } + } + //Determine if this is a bank sign. + if (s.getLine(0).equalsIgnoreCase(ChatColor.AQUA+"-- BANK --")) { + //This is indeed a bank sign. Now figure out which one. + if (s.getLine(1).equalsIgnoreCase(ChatColor.GREEN+"CHECK BALANCE")) { + //Display the balance to the user. + DecimalFormat df = new DecimalFormat("0.00"); + ev.getPlayer().sendMessage("Your Bank Account currently has: "+ChatColor.BLUE+"$"+df.format(getPlayerBankMoney(ev.getPlayer()))); + } else + if (s.getLine(1).equalsIgnoreCase(ChatColor.DARK_RED+"WITHDRAW")) { + if (withdrawUser.equalsIgnoreCase("")) { + if (!depositUser.equalsIgnoreCase(ev.getPlayer().getName()) && + !conversionUser.equalsIgnoreCase(ev.getPlayer().getName())) { + ev.getPlayer().sendMessage(ChatColor.GOLD+"Say/Type the amount you want to WITHDRAW today."); + ev.getPlayer().sendMessage(" In Bank: "+ChatColor.BLUE+"$"+getPlayerBankMoney(ev.getPlayer())); + //Activate the terminal. + withdrawUser=ev.getPlayer().getName(); + withdrawTime=getServerTickTime(); + } else { + //Can't use if we're already using another terminal. + ev.getPlayer().sendMessage(ChatColor.RED+"You're already using another terminal. "+ChatColor.WHITE+"Please finish that operation first."); + } + } else { + if (!withdrawUser.equalsIgnoreCase(ev.getPlayer().getName())) { + ev.getPlayer().sendMessage(ChatColor.RED+"TERMINAL IS BEING USED. "+ChatColor.WHITE+"Please try again later."); + } + } + } else + if (s.getLine(1).equalsIgnoreCase(ChatColor.DARK_BLUE+"DEPOSIT")) { + if (depositUser.equalsIgnoreCase("")) { + if (!withdrawUser.equalsIgnoreCase(ev.getPlayer().getName()) && + !conversionUser.equalsIgnoreCase(ev.getPlayer().getName())) { + ev.getPlayer().sendMessage(ChatColor.GOLD+"Say/Type the amount you want to DEPOSIT today."); + ev.getPlayer().sendMessage(" Currently Holding: "+ChatColor.GREEN+"$"+getPlayerMoney(ev.getPlayer())); + //Activate the terminal. + depositUser=ev.getPlayer().getName(); + depositTime=getServerTickTime(); + } else { + //Can't use if we're already using another terminal. + ev.getPlayer().sendMessage(ChatColor.RED+"You're already using another terminal. "+ChatColor.WHITE+"Please finish that operation first."); + } + } else { + if (!depositUser.equalsIgnoreCase(ev.getPlayer().getName())) { + ev.getPlayer().sendMessage(ChatColor.RED+"TERMINAL IS BEING USED. "+ChatColor.WHITE+"Please try again later."); + } + } + } else + if (s.getLine(1).equalsIgnoreCase(ChatColor.DARK_BLUE+"EXP CONVERSION")) { + if (conversionUser.equalsIgnoreCase("")) { + if (!withdrawUser.equalsIgnoreCase(ev.getPlayer().getName()) && + !depositUser.equalsIgnoreCase(ev.getPlayer().getName())) { + ev.getPlayer().sendMessage(ChatColor.GOLD+"Say/Type the amount of experience you want to convert today."); + ev.getPlayer().sendMessage(" Currently Have: "+ChatColor.GREEN+ev.getPlayer().getLevel()+" levels"); + //Activate the terminal. + conversionUser=ev.getPlayer().getName(); + conversionTime=getServerTickTime(); + } else { + //Can't use if we're already using another terminal. + ev.getPlayer().sendMessage(ChatColor.RED+"You're already using another terminal. "+ChatColor.WHITE+"Please finish that operation first."); + } + } else { + if (!conversionUser.equalsIgnoreCase(ev.getPlayer().getName())) { + ev.getPlayer().sendMessage(ChatColor.RED+"TERMINAL IS BEING USED. "+ChatColor.WHITE+"Please try again later."); + } + } + } + } + } + } + + @EventHandler(priority=EventPriority.LOW) + public void onBlockPlace(BlockPlaceEvent ev) { + + TwosideSpleefGames.PassEvent(ev); + + if (ev.getItemInHand().hasItemMeta() && + ev.getItemInHand().getItemMeta().hasLore() && + ev.getItemInHand().getItemMeta().getLore().size()==4 && + ev.getItemInHand().getItemMeta().getLore().get(3).contains(ChatColor.DARK_PURPLE+"ID#")) { + //This is an item cube. + ev.setCancelled(true); + } + } + + @EventHandler(priority=EventPriority.LOW) + public void onPlayerDeath(PlayerDeathEvent ev) { + //Modify the death message. This is a fix for getting rid of the healthbar from the player name. + final Player p = ev.getEntity(); + if (!DeathManager.deathStructureExists(p)) { + String[] parsed_msg = ev.getDeathMessage().split(" "); + //Get rid of the name. + //NOTE: If you change how the suffix looks YOU MUST UPDATE THIS! + String newDeathMsg=""; + for (int i=2;i item_lore = ev.getCurrentItem().getItemMeta().getLore(); + if (item_lore.size()!=4) { + //Make sure it doesn't already have an ID. + item_lore.add(ChatColor.DARK_PURPLE+"ID#"+ITEMCUBEID); + item_meta.setLore(item_lore); + ev.getCurrentItem().setItemMeta(item_meta); + if (ev.getCurrentItem().getItemMeta().getDisplayName().contains("Ender Item Cube")) { + ev.getCurrentItem().setAmount(2); + } + CubeType cubetype; + if (ev.getCurrentItem().getItemMeta().getDisplayName().contains("Ender Item Cube")) { + cubetype=CubeType.ENDER; + } else if (ev.getCurrentItem().getItemMeta().getDisplayName().contains("Large Item Cube")) { + cubetype=CubeType.LARGE; + } else { + cubetype=CubeType.NORMAL; + } + itemCube_saveConfig(ITEMCUBEID, new ArrayList(), cubetype); + ITEMCUBEID++; + } + } + } + } + } + + @EventHandler(priority=EventPriority.LOW) + public void onPlayerDropItem(PlayerDropItemEvent ev) { + if (ev.getItemDrop().getItemStack().hasItemMeta()) { + if (ev.getItemDrop().getItemStack().getItemMeta().hasLore()) { + if (ev.getItemDrop().getItemStack().getItemMeta().getLore().size()==4) { + if (ev.getItemDrop().getItemStack().getItemMeta().getLore().get(3).contains(ChatColor.DARK_PURPLE+"ID#")) { + //We have an item cube. + int itemcube_id=Integer.parseInt(ev.getItemDrop().getItemStack().getItemMeta().getLore().get(3).split("#")[1]); + //Now we need to see if an item cube inventory of that ID is opened. + if (ev.getPlayer().getOpenInventory().getTitle().split("#").length>1 && itemcube_id==Integer.parseInt(ev.getPlayer().getOpenInventory().getTitle().split("#")[1])) { + //We have the same item cube opened. Save and close it immediately. + List itemlist = new ArrayList(); + for (int i=0;i itemcube_contents = itemCube_loadConfig(id); + for (int i=0;i0) { + ev.getInventory().setItem(i, itemcube_contents.get(i)); + } else { + ev.getInventory().setItem(i, new ItemStack(Material.AIR)); + } + } + } + } + } + } + + @EventHandler(priority=EventPriority.LOW) + public void onInventoryClose(InventoryCloseEvent ev) { + if (ev.getPlayer() instanceof Player) { + Player p = (Player)ev.getPlayer(); + if (ev.getInventory().getTitle().contains("Death Loot")) { + Location deathloc = DeathManager.getDeathStructure(p).deathloc; + //Whatever is left drops at the death location. + if (DeathManager.CountOccupiedSlots(p.getOpenInventory().getTopInventory())>0) { + p.sendMessage(ChatColor.GOLD+"The rest of your items have dropped at your death location!"); + } + double amounttotake = DeathManager.CountOccupiedSlots(p.getInventory())*DeathManager.CalculateDeathPrice(p); + if (getPlayerMoney(p)>=amounttotake) { + givePlayerMoney(p,getPlayerMoney(p)-amounttotake); + } else { + double diff = amounttotake-getPlayerMoney(p); + givePlayerMoney(p,-getPlayerMoney(p)); + amounttotake = diff; + givePlayerBankMoney(p,-amounttotake); + } + for (int i=0;i itemcube_contents = new ArrayList(); + for (int i=0;i0 && pd.saturation<20) { + pd.saturation+=2; + ((Player)ev.getEntity()).setSaturation(((Player)ev.getEntity()).getSaturation()-1); + getLogger().info("Saturation increased to "+pd.saturation+". Old saturation: "+((Player)ev.getEntity()).getSaturation()); + } + } + } + //((Player)ev.getEntity()).setSaturation(((Player)ev.getEntity()).getSaturation()+1.0f); + //We will never use saturation to heal. + } + } + + @EventHandler(priority=EventPriority.LOW) + public void onFoodLevelChange(FoodLevelChangeEvent ev) { + if (ev.getEntityType()==EntityType.PLAYER) { + Player p = (Player)ev.getEntity(); + if (p.getFoodLevel()ev.getFoodLevel()) { + //Find the player that is losing food level. + for (int i=0;i0) { + pd.saturation--; + ev.setFoodLevel(ev.getFoodLevel()+1); + getLogger().info("Saturation level is now "+(pd.saturation)+". Food level is now "+p.getFoodLevel()); + } + } + } + } + } + } + + @EventHandler(priority=EventPriority.LOW) + public void onInventoryClick(InventoryClickEvent ev) { + final Player player = (Player)ev.getWhoClicked(); + //Bukkit.getLogger().info("Clicked: "+ev.getRawSlot()); + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + @Override + public void run() { + setPlayerMaxHealth(player); + } + },1); + + if (ev.getInventory().getTitle().equalsIgnoreCase("Death Loot")) { + //See how many items are in our inventory. Determine final balance. + //Count the occupied slots. + if (getPlayerMoney(player)+getPlayerBankMoney(player)-DeathManager.CalculateDeathPrice(player)*DeathManager.CountOccupiedSlots(player.getInventory())>=DeathManager.CalculateDeathPrice(player)) { + //player.getInventory().addItem(ev.getCurrentItem()); + player.getLocation().getWorld().dropItemNaturally(player.getLocation(), ev.getCurrentItem()).setPickupDelay(0); + ev.setCurrentItem(new ItemStack(Material.AIR)); + + final DecimalFormat df = new DecimalFormat("0.00"); + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + @Override + public void run() { + player.sendMessage(ChatColor.BLUE+"New Balance: "+ChatColor.GREEN+"$"+df.format((getPlayerMoney(player)+getPlayerBankMoney(player)-DeathManager.CalculateDeathPrice(player)*DeathManager.CountOccupiedSlots(player.getInventory())))); + } + },5); + } else { + player.sendMessage(ChatColor.RED+"You cannot afford to salvage any more items!"); + } + ev.setCancelled(true); + } + //Check for a left click for an arrow quiver. + if (ev.getClick()==ClickType.LEFT) { + //Tries to take out 1 stack of arrows. + //We're going to try to deposit arrows. + if (ev.getCursor()!=null && ev.getCursor().getAmount()>0 && + ev.getCursor().getType()==Material.ARROW) { + Player p = (Player)ev.getWhoClicked(); + if (playerHasArrowQuiver(p)) { + boolean foundquiver=false; + int slot=-1; + if (p.getInventory().getItem(ev.getSlot())!=null && + p.getInventory().getItem(ev.getSlot()).getType()==Material.TIPPED_ARROW && + p.getInventory().getItem(ev.getSlot()).getEnchantmentLevel(Enchantment.ARROW_INFINITE)==5) { + //This is an arrow quiver. + foundquiver=true; + slot=ev.getSlot(); + } + if (foundquiver) { + //getLogger().info("An arrow quiver was right clicked."); + //Continue. + //Deposit the arrows we are holding. + + int amt=playerGetArrowQuiverAmt(p, slot); + playerInsertArrowQuiver(p, slot , ev.getCursor().getAmount()); + p.sendMessage(ChatColor.DARK_GRAY+""+ev.getCursor().getAmount()+" arrow"+((ev.getCursor().getAmount()==1)?"":"s")+" "+((ev.getCursor().getAmount()==1)?"was":"were")+" added to your arrow quiver. Arrow Count: "+ChatColor.GRAY+playerGetArrowQuiverAmt(p,playerGetArrowQuiver(p))); + ev.setCursor(new ItemStack(Material.AIR)); + //Cancel this click event. + ev.setCancelled(true); + ev.setResult(Result.DENY); + + } + } + } + } + + //Check for a right click for an arrow quiver. + if (ev.getClick()==ClickType.RIGHT && + ev.getCursor().getType()==Material.AIR) { + //Tries to take out 1 stack of arrows. + Player p = (Player)ev.getWhoClicked(); + if (playerHasArrowQuiver(p)) { + boolean foundquiver=false; + int slot=-1; + if (p.getInventory().getItem(ev.getSlot())!=null && + p.getInventory().getItem(ev.getSlot()).getType()==Material.TIPPED_ARROW && + p.getInventory().getItem(ev.getSlot()).getEnchantmentLevel(Enchantment.ARROW_INFINITE)==5) { + //This is an arrow quiver. + foundquiver=true; + slot=ev.getSlot(); + } + if (foundquiver) { + //getLogger().info("An arrow quiver was right clicked."); + //Continue. + //Try to withdraw 64 arrows. + int amt=playerGetArrowQuiverAmt(p, slot); + playerRemoveArrowQuiver(p, slot , (amt>64)?64:amt); + //Cancel this click event so we can grab the arrows inside. + ev.setCancelled(true); + ev.setResult(Result.DENY); + ItemStack arrow = new ItemStack(Material.ARROW,(amt>64)?64:amt); + ev.setCursor(arrow); + } + } + } + + //LEFT CLICK STUFF. + //WARNING! This only happens for ITEM CUBES! Do not add other items in here! + final InventoryClickEvent store = ev; + if ((ev.getInventory().getType()!=InventoryType.WORKBENCH || + (ev.getInventory().getType()==InventoryType.WORKBENCH && ev.getRawSlot()>9)) && ev.getInventory().getTitle().contains("Item Cube #")) { + //getLogger().info("Item Cube window identified."); + final int id=Integer.parseInt(ev.getInventory().getTitle().split("#")[1]); + //Check to see if the cursor item is an item cube. + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + @Override + public void run() { + /* + if ((store.getCursor().getType()==Material.CHEST || + store.getCursor().getType()==Material.STORAGE_MINECART || + store.getCursor().getType()==Material.ENDER_CHEST) && + store.getCursor().hasItemMeta() && + store.getCursor().getItemMeta().hasLore()) { + getLogger().info("The clicked item has lore..."); + for (int i=0;i itemlist = new ArrayList(); + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + @Override + public void run() { + for (int i=0;i9)) && ev.isLeftClick() && ev.getCurrentItem()!=null && ev.getCursor()!=null) { + if (ev.getCurrentItem().hasItemMeta() && (ev.getCursor().getType()!=Material.AIR)) { + ItemMeta item_meta = ev.getCurrentItem().getItemMeta(); + if (item_meta.hasLore()) { + List item_meta_lore = item_meta.getLore(); + if (item_meta_lore.size()==4 && item_meta_lore.get(3).contains(ChatColor.DARK_PURPLE+"ID#")) { + int idnumb = Integer.parseInt(item_meta_lore.get(3).split("#")[1]); + int itemcubeid = -1; //This is the ID of the window we are looking at, if one exists. + CubeType cubetype = CubeType.NORMAL; + //This is an Item Cube. + ev.setCancelled(true); + ev.setResult(Result.DENY); + + int size; + if (ev.getCurrentItem().getType()==Material.CHEST) { + size=9; + cubetype=CubeType.NORMAL; + } else { + size=27; + if (ev.getCurrentItem().getType()==Material.STORAGE_MINECART) { + cubetype=CubeType.LARGE; + } else { + cubetype=CubeType.ENDER; + } + } + + //See if we're looking at an Item Cube inventory already. + if (ev.getInventory().getTitle().contains("Item Cube")) { + //Check to see what the Item Cube ID is. + itemcubeid=Integer.parseInt(ev.getInventory().getTitle().split("#")[1]); + } + + //Check to see if the cursor item is an item cube. + if ((ev.getCursor().getType()==Material.CHEST || + ev.getCursor().getType()==Material.STORAGE_MINECART || + ev.getCursor().getType()==Material.ENDER_CHEST) && + ev.getCursor().hasItemMeta() && + ev.getCursor().getItemMeta().hasLore()) { + //getLogger().info("The clicked item has lore..."); + for (int i=0;i virtual_inventory = itemCube_loadConfig(idnumb); + boolean stack_available=false; + //Now we will see if there are any places to stack blocks on. + int quantity=ev.getCursor().getAmount(); + //getLogger().info("Amount held: "+quantity); + for (int i=0;ivirtual_inventory.get(i).getAmount()) { + //getLogger().info("Entered Loop"); + //This is the same, and we have room to throw some in. + int space=virtual_inventory.get(i).getMaxStackSize()-virtual_inventory.get(i).getAmount(); //How much space is here. + //getLogger().info("There is space for "+space+" blocks."); + if (space>=quantity) { + //We are done, because we can store everything. + virtual_inventory.get(i).setAmount(virtual_inventory.get(i).getAmount()+quantity); + quantity=0; + final int ider = idnumb; + final List items = virtual_inventory; + final CubeType type = cubetype; + + if (itemCube_getCubeType(idnumb)==CubeType.ENDER) { + //getLogger().info("This is an Ender Item Cube transfer click."); + //We are going to look at all players and see if they have this inventory open. + final int id = idnumb; + for (int j=0;j0) { + //We can't fit this anywhere else. So we put the rest back to the cursor. + ev.getCursor().setAmount(quantity); + } else { + stack_available=true; + } + + if (stack_available) { + ev.setCursor(new ItemStack(Material.AIR)); + itemCube_saveConfig(idnumb,virtual_inventory,cubetype); + } else { + //Look for an empty space. + for (int i=0;i items = virtual_inventory; + final CubeType type = cubetype; + + if (itemCube_getCubeType(idnumb)==CubeType.ENDER) { + //getLogger().info("This is an Ender Item Cube transfer click."); + //We are going to look at all players and see if they have this inventory open. + final int id = idnumb; + for (int j=0;jev.getView().getTopInventory().getItem(i).getAmount()) { + //getLogger().info("Entered Loop"); + //This is the same, and we have room to throw some in. + int space=ev.getView().getTopInventory().getItem(i).getMaxStackSize()-ev.getView().getTopInventory().getItem(i).getAmount(); //How much space is here. + //getLogger().info("There is space for "+space+" blocks."); + if (space>=quantity) { + //We are done, because we can store everything. + ev.getView().getTopInventory().getItem(i).setAmount(ev.getView().getTopInventory().getItem(i).getAmount()+quantity); + quantity=0; + List itemlist = new ArrayList(); + for (int j=0;j items = itemlist; + final CubeType type = cubetype; + if (itemCube_getCubeType(idnumb)==CubeType.ENDER) { + //getLogger().info("This is an Ender Item Cube transfer click."); + //We are going to look at all players and see if they have this inventory open. + final int id = idnumb; + for (int j=0;j itemlist = new ArrayList(); + for (int j=0;j items = itemlist; + final CubeType type = cubetype; + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + @Override + public void run() { + itemCube_saveConfig(ider,items,type); + } + },2); + } + } + } + } + if (quantity>0) { + //We can't fit this anywhere else. So we put the rest back to the cursor. + ev.getCursor().setAmount(quantity); + } else { + stack_available=true; + } + + if (stack_available) { + ev.setCursor(new ItemStack(Material.AIR)); + } else { + for (int i=0;i9)) && ev.isRightClick() && ev.getCurrentItem()!=null && ev.getCurrentItem().getAmount()==1) { + //getLogger().info(ev.getCurrentItem().toString()); + if (ev.getCurrentItem().hasItemMeta()) { + //getLogger().info("Item Meta: "+ev.getCurrentItem().getItemMeta().toString()); + ItemMeta item_meta = ev.getCurrentItem().getItemMeta(); + if (item_meta.hasLore()) { + List item_meta_lore = item_meta.getLore(); + if (item_meta_lore.size()==4 && item_meta_lore.get(3).contains(ChatColor.DARK_PURPLE+"ID#")) { + int idnumb = Integer.parseInt(item_meta_lore.get(3).split("#")[1]); + //getLogger().info("This is an Item Cube."); + List viewers = ev.getViewers(); + for (int i=0;i0 && Math.random()*100=4) { + if (Math.abs(arrowLoc.getY()-monsterHead.getY())<=0.165/HEADSHOT_ACC) { + //getLogger().info("Height discrepancy is good."); + if (Math.abs(arrowLoc.getZ()-monsterHead.getZ())<=3.0/HEADSHOT_ACC && + Math.abs(arrowLoc.getX()-monsterHead.getX())<=3.0/HEADSHOT_ACC) { + ev.setDamage(ev.getDamage()*8.0); + p.sendMessage(ChatColor.DARK_RED+"Headshot! x8 Damage"); + headshot=true; + } + } + } + + //Make this monster the player's new target. + for (int i=0;i lore = new ArrayList(); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+"2"); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_ALL, 10); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_ARTHROPODS, 10); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_UNDEAD, 10); + ev.getDrops().add(raresword); + } + if (Math.random()<0.00390625*dropmult) { + ev.getDrops().add(Artifact.createArtifactItem(ArtifactItem.ANCIENT_ESSENCE)); + } + } + } + if (m.getCustomName().contains("Deadly")) { + m.getWorld().playSound(m.getLocation(), Sound.ENTITY_CREEPER_PRIMED, 1.0f, 1.0f); + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + public void run() { + if (m.getLocation().getBlockY()<48) { + m.getWorld().createExplosion(m.getLocation().getBlockX(), m.getLocation().getBlockY(), m.getLocation().getBlockZ(), 3.0f, false, true); + } else { + m.getWorld().createExplosion(m.getLocation().getBlockX(), m.getLocation().getBlockY(), m.getLocation().getBlockZ(), 6.0f, false, false); + } + }} + ,20); + if (m.getKiller()!=null) { //Make sure a player actually killed this. + ev.setDroppedExp(ev.getDroppedExp()*8); + + if (Math.random()<0.5*dropmult) { + //m.getWorld().dropItemNaturally(m.getLocation(), new ItemStack(Material.DIAMOND)); + ev.getDrops().add(new ItemStack(Material.DIAMOND)); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*6)+2)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_ALL, 10); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_ARTHROPODS, 10); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_UNDEAD, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*6)+2)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_ALL, 10); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_ARTHROPODS, 10); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_UNDEAD, 10); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + lore.add(ChatColor.GRAY+"Twice as strong"); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*6)+2)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FALL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FIRE, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_PROJECTILE, 10); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + lore.add(ChatColor.GRAY+"Twice as strong"); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*6)+2)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FALL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FIRE, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_PROJECTILE, 10); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + lore.add(ChatColor.GRAY+"Twice as strong"); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*6)+2)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FALL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FIRE, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_PROJECTILE, 10); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + lore.add(ChatColor.GRAY+"Twice as strong"); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*6)+2)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FALL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FIRE, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_PROJECTILE, 10); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*6)+2)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.DIG_SPEED, 10); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_ALL, 10); + raresword.addUnsafeEnchantment(Enchantment.LOOT_BONUS_BLOCKS, 10); + raresword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 1); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*6)+2)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.DIG_SPEED, 10); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_ALL, 10); + raresword.addUnsafeEnchantment(Enchantment.LOOT_BONUS_MOBS, 10); + raresword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 1); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*6)+2)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.DIG_SPEED, 10); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_ALL, 10); + raresword.addUnsafeEnchantment(Enchantment.LOOT_BONUS_BLOCKS, 10); + raresword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 1); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*6)+2)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.DIG_SPEED, 10); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_ALL, 10); + raresword.addUnsafeEnchantment(Enchantment.LOOT_BONUS_MOBS, 10); + raresword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 10); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random()<0.00390625*dropmult) { + ev.getDrops().add(Artifact.createArtifactItem(ArtifactItem.LOST_ESSENCE)); + } + final List drops = new ArrayList(); + drops.addAll(ev.getDrops()); + ev.getDrops().clear(); + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + public void run() { + for (int i=0;i lore = new ArrayList(); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*7)+4)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_ALL, 10); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_ARTHROPODS, 10); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_UNDEAD, 10); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + lore.add(ChatColor.GRAY+"Twice as strong"); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*7)+4)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FALL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FIRE, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_PROJECTILE, 10); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + lore.add(ChatColor.GRAY+"Twice as strong"); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*7)+4)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FALL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FIRE, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_PROJECTILE, 10); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + lore.add(ChatColor.GRAY+"Twice as strong"); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*7)+4)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FALL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FIRE, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_PROJECTILE, 10); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + lore.add(ChatColor.GRAY+"Twice as strong"); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*7)+4)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FALL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FIRE, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_PROJECTILE, 10); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + lore.add(ChatColor.GRAY+"Twice as strong"); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*14)+8)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FALL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FIRE, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_PROJECTILE, 10); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + lore.add(ChatColor.GRAY+"Twice as strong"); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*14)+8)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FALL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FIRE, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_PROJECTILE, 10); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + lore.add(ChatColor.GRAY+"Twice as strong"); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*14)+8)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FALL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FIRE, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_PROJECTILE, 10); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + lore.add(ChatColor.GRAY+"Twice as strong"); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*14)+8)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FALL, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_FIRE, 10); + raresword.addUnsafeEnchantment(Enchantment.PROTECTION_PROJECTILE, 10); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*14)+8)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_ALL, 10); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_ARTHROPODS, 10); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_UNDEAD, 10); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*6)+2)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.DIG_SPEED, 10); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_ALL, 10); + raresword.addUnsafeEnchantment(Enchantment.LOOT_BONUS_BLOCKS, 10); + raresword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 1); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*6)+2)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.DIG_SPEED, 10); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_ALL, 10); + raresword.addUnsafeEnchantment(Enchantment.LOOT_BONUS_MOBS, 10); + raresword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 1); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*6)+2)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.DIG_SPEED, 10); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_ALL, 10); + raresword.addUnsafeEnchantment(Enchantment.LOOT_BONUS_BLOCKS, 10); + raresword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 1); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*6)+2)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.DIG_SPEED, 10); + raresword.addUnsafeEnchantment(Enchantment.DAMAGE_ALL, 10); + raresword.addUnsafeEnchantment(Enchantment.LOOT_BONUS_MOBS, 10); + raresword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 10); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random() lore = new ArrayList(); + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+((int)(Math.random()*7)+4)); + sword_meta.setLore(lore); + } + raresword.setItemMeta(sword_meta); + raresword.addUnsafeEnchantment(Enchantment.ARROW_DAMAGE, 10); + raresword.addUnsafeEnchantment(Enchantment.ARROW_KNOCKBACK, 2); + raresword.addUnsafeEnchantment(Enchantment.DURABILITY, 10); + ev.getDrops().add(raresword); + } + if (Math.random()<0.00390625*dropmult) { + ev.getDrops().add(Artifact.createArtifactItem(ArtifactItem.DIVINE_ESSENCE)); + } + } + final List drops = new ArrayList(); + drops.addAll(ev.getDrops()); + ev.getDrops().clear(); + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + public void run() { + for (int i=0;i0) { + //item.setAmount(1); + breakHardenedItem(item); + } else + { + p.sendMessage(ChatColor.DARK_RED+"Your "+ChatColor.YELLOW+item.getType().toString().replaceAll("_", " ")+ChatColor.DARK_RED+" has broken!"); + } + + } + + @EventHandler(priority=EventPriority.LOW) + public void onBlockBreak(BlockBreakEvent ev) { + + TwosideSpleefGames.PassEvent(ev); + + Player p = ev.getPlayer(); + if (p!=null) { + getLogger().info(p.getName()+" has broken block "+TwosideKeeper.UserFriendlyMaterialName(new ItemStack(ev.getBlock().getType()))); + } + + if (ev.getBlock().getType()==Material.WALL_SIGN) { + //We're going to make sure if it's a shop or not. + Sign s = (Sign)(ev.getBlock().getState()); + if (s.getLine(0).equalsIgnoreCase(ChatColor.BLUE+"-- SHOP --")) { + //This is a shop. Let's find out who the owner is. + int shopID = TwosideShops.GetShopID(s); + WorldShop shop = TwosideShops.LoadWorldShopData(shopID); + String owner = shop.GetOwner(); + if (owner.equalsIgnoreCase(p.getName()) || p.isOp()) { + //We are going to see if this shop had items in it. + if (shop.GetAmount()>0) { + //It did, we are going to release those items. + ItemStack drop = shop.GetItem(); + int dropAmt = shop.GetAmount(); + while (dropAmt>0) { + if (dropAmt>shop.GetItem().getMaxStackSize()) { + drop.setAmount(shop.GetItem().getMaxStackSize()); + ev.getPlayer().getWorld().dropItemNaturally(ev.getPlayer().getLocation(), drop).setPickupDelay(0); + dropAmt-=shop.GetItem().getMaxStackSize(); + } else { + drop.setAmount(dropAmt); + ev.getPlayer().getWorld().dropItemNaturally(ev.getPlayer().getLocation(), drop).setPickupDelay(0); + dropAmt=0; + } + } + //ev.getPlayer().getLocation().getWorld().dropItemNaturally(ev.getPlayer().getLocation(), drop).setPickupDelay(0); + } + //Remove the itemstack that represented this item. + Collection nearby = ev.getPlayer().getWorld().getNearbyEntities(ev.getBlock().getLocation(), 3, 3, 3); + for (int i=0;i arrow_quiver_lore = new ArrayList(); + arrow_quiver_lore.add("A quiver that holds many arrows."); + arrow_quiver_lore.add(ChatColor.GRAY+"Arrows Remaining: "+ChatColor.YELLOW+(ArrowQuiver_amt-1)); + ItemMeta arrow_quiver_meta=ArrowQuiver.getItemMeta(); + arrow_quiver_meta.setLore(arrow_quiver_lore); + arrow_quiver_meta.setDisplayName(ChatColor.BLUE+"Arrow Quiver"); + ArrowQuiver.setItemMeta(arrow_quiver_meta); + + ArrowQuiver.addUnsafeEnchantment(Enchantment.ARROW_INFINITE, 5); + + ArrowQuiver.setAmount(1); + if (!offhand) {p.getInventory().addItem(ArrowQuiver);} else {p.getInventory().setItemInOffHand(ArrowQuiver);} + } else { + p.sendMessage(ChatColor.ITALIC+""+ChatColor.GRAY+"If you are trying to shoot a regular arrow, put it inside your quiver and shoot again."); + } + } + }} + ,5); + } + } + + } + } + + + @EventHandler(priority=EventPriority.LOW) + public void onItemCraftEvent(PrepareItemCraftEvent ev) { + ItemStack result = ev.getInventory().getResult(); + if (result.getType()==Material.TNT) { + result.setAmount(result.getAmount()*5); //TNT recipes are 5 times as effective. + } + } + + @EventHandler(priority=EventPriority.LOW) + public void MinecartExitEvent(VehicleExitEvent ev) { + if (ev.getExited() instanceof Player && + ev.getVehicle().getType()==EntityType.MINECART) { + Player p = (Player)(ev.getExited()); + //p.sendMessage("Off."); + //Drop a minecart at the position. + ev.getVehicle().getWorld().dropItemNaturally(ev.getVehicle().getLocation().add(0,1,0), new ItemStack(Material.MINECART)); + ev.getVehicle().remove(); + } + } + + @EventHandler(priority=EventPriority.LOW) + public void onTeleportEvent(PlayerTeleportEvent ev) { + if (ev.getCause().equals(TeleportCause.END_PORTAL)) { + Player p = ev.getPlayer(); + for (int i=0;i=10000) {weather="\u263D";} else {weather="\u2600";}} + if (time>0 && time<=3000) { + ev.setMotd("\u00A7bsig's Minecraft!\n"+weather+" \u00A7fCurrently: \u00A7eMORNING"); + } else + if (time>3000 && time<=10000) { + ev.setMotd("\u00A7bsig's Minecraft!\n"+weather+" \u00A7fCurrently: \u00A76AFTERNOON"); + } else + if (time>10000 && time<=13000) { + ev.setMotd("\u00A7bsig's Minecraft!\n"+weather+" \u00A7fCurrently: \u00A73EVENING"); + } else + if (time>13000 && time<23000) { + ev.setMotd("\u00A7bsig's Minecraft!\n"+weather+" \u00A7fCurrently: \u00A79NIGHT"); + } else { + ev.setMotd("\u00A7bsig's Minecraft!\n"+weather+" \u00A7fCurrently: \u00A7dDAWN"); + } + } + + public void saveOurData(){ + getConfig().set("SERVERTICK", getServerTickTime()); //Add to how many ticks we've used. + getConfig().set("DAYMULT", DAYMULT); + getConfig().set("SERVERCHECKERTICKS", SERVERCHECKERTICKS); + getConfig().set("TERMINALTIME", TERMINALTIME); + getConfig().set("DEATHPENALTY", DEATHPENALTY); + getConfig().set("RECYCLECHANCE", RECYCLECHANCE); + getConfig().set("RECYCLEDECAYAMT", RECYCLEDECAYAMT); + getConfig().set("ITEMCUBEID", ITEMCUBEID); + getConfig().set("ARMOR/ARMOR_LEATHER_HP", ARMOR_LEATHER_HP); + getConfig().set("ARMOR/ARMOR_IRON_HP", ARMOR_IRON_HP); + getConfig().set("ARMOR/ARMOR_GOLD_HP", ARMOR_GOLD_HP); + getConfig().set("ARMOR/ARMOR_DIAMOND_HP", ARMOR_DIAMOND_HP); + getConfig().set("ARMOR/ARMOR_IRONBLOCK_HP", ARMOR_IRON2_HP); + getConfig().set("ARMOR/ARMOR_GOLDBLOCK_HP", ARMOR_GOLD2_HP); + getConfig().set("ARMOR/ARMOR_DIAMONDBLOCK_HP", ARMOR_DIAMOND2_HP); + getConfig().set("HEALTH/HEALTH_REGENERATION_RATE", HEALTH_REGENERATION_RATE); + getConfig().set("HEALTH/FOOD_HEAL_AMT", FOOD_HEAL_AMT); + getConfig().set("ENEMY/ENEMY_DMG_MULT", ENEMY_DMG_MULT); + getConfig().set("ENEMY/EXPLOSION_DMG_MULT", EXPLOSION_DMG_MULT); + getConfig().set("ENEMY/HEADSHOT_ACC", HEADSHOT_ACC); + getConfig().set("ITEM/RARE_DROP_RATE", RARE_DROP_RATE); + getConfig().set("PARTY_CHUNK_SIZE", PARTY_CHUNK_SIZE); + getConfig().set("XP_CONVERSION_RATE", XP_CONVERSION_RATE); + getConfig().set("WORLD_SHOP_ID", WORLD_SHOP_ID); + //getConfig().set("MOTD", MOTD); //It makes no sense to save the MOTD as it will never be modified in-game. + saveConfig(); + + TwosideRecyclingCenter.saveConfig(); + + //Save user configs here too. + saveAllUserConfigs(); + + getLogger().info("[TASK] Configurations have been saved successfully."); + } + + public void saveAllUserConfigs() { + for (int i=0;i itemCube_loadConfig(int id){ + List ItemCube_items = new ArrayList(); + File config; + config = new File(TwosideKeeper.filesave,"itemcubes/ItemCube"+id+".data"); + FileConfiguration workable = YamlConfiguration.loadConfiguration(config); + + for (int i=0;i<27;i++) { + ItemCube_items.add(workable.getItemStack("item"+i, new ItemStack(Material.AIR))); + } + return ItemCube_items; + } + public CubeType itemCube_getCubeType(int id){ + List ItemCube_items = new ArrayList(); + File config; + config = new File(TwosideKeeper.filesave,"itemcubes/ItemCube"+id+".data"); + FileConfiguration workable = YamlConfiguration.loadConfiguration(config); + + switch (workable.getInt("cubetype")) { + case 0:{return CubeType.NORMAL;} + case 1:{return CubeType.LARGE;} + case 2:{return CubeType.ENDER;} + default:{return CubeType.NORMAL;} + } + } + + //Item Cube Saving. + public void itemCube_saveConfig(int id, List items){ + List ItemCube_items = new ArrayList(); + File config; + config = new File(TwosideKeeper.filesave,"itemcubes/ItemCube"+id+".data"); + FileConfiguration workable = YamlConfiguration.loadConfiguration(config); + + for (int i=0;i items, CubeType cubetype){ + List ItemCube_items = new ArrayList(); + File config; + config = new File(TwosideKeeper.filesave,"itemcubes/ItemCube"+id+".data"); + FileConfiguration workable = YamlConfiguration.loadConfiguration(config); + + for (int i=0;i100) {pcthp=100;} + while (pcthp>=20) { + pcthp-=20; + bar+=Character.toString((char)0x2588); + length++; + } + if (pcthp>=16) { + bar+=Character.toString((char)0x2588); + length++; + } else + if (pcthp>=12) { + bar+=Character.toString((char)0x2593); + length++; + } else + if (pcthp>=8) { + bar+=Character.toString((char)0x2592); + length++; + } else + if (pcthp>=1) { + bar+=Character.toString((char)0x2591); + length++; + } else { + bar+=" "; + length++; + } + while (length<6) { + bar+=" "; + length++; + }*/ + + boolean hasDebuff=false; + boolean isHungry=(p.getFoodLevel()<=16)?true:false; + boolean inNether=(p.getWorld().getName().equalsIgnoreCase("world_nether"))?true:false; + boolean inEnd=(p.getWorld().getName().equalsIgnoreCase("world_the_end"))?true:false; + //getLogger().info(p.getWorld().getName().toString()); + int absorptionlv=0; + + for (int i=0;i66) {bar += ((isHungry)?ChatColor.DARK_GREEN:ChatColor.GREEN)+""+Math.round(p.getHealth())+""+Character.toString((char)0x2665);} + else if (pcthp>33) {bar += ((isHungry)?ChatColor.GOLD:ChatColor.YELLOW)+""+Math.round(p.getHealth())+""+Character.toString((char)0x2665);} + else {bar += ((isHungry)?ChatColor.DARK_RED:ChatColor.RED)+""+Math.round(p.getHealth())+""+Character.toString((char)0x2665);} + + /* + if (absorptionlv>0) { + bar+=" "+ChatColor.ITALIC+""+ChatColor.LIGHT_PURPLE+"+"+(absorptionlv*4)+Character.toString((char)0x2665); + }*/ + + if (hasDebuff||isHungry||inNether) { + bar+=" "; + } + + if (hasDebuff) { + bar+=ChatColor.GRAY+"!"; + } + /*if (isHungry) { + bar+=ChatColor.RED+""+ChatColor.BOLD+"!"; + }*/ + if (inNether) { + /* 058D:Counter-clockwise portal + * 058E:Clockwise portal + */ + bar+=ChatColor.DARK_PURPLE+""+Character.toString((char)0x25CA); + //bar+=ChatColor.DARK_PURPLE+""+"¤"; + } else + if (inEnd) { + /* 058D:Counter-clockwise portal + * 058E:Clockwise portal + */ + bar+=ChatColor.DARK_BLUE+""+Character.toString((char)0x25CA); + //bar+=ChatColor.DARK_PURPLE+""+"¤"; + } + + return bar; + } + + //Returns if a player has an arrow quiver in their inventory. + public boolean playerHasArrowQuiver(Player p) { + //getLogger().info("Checking an inventory of size "+p.getInventory().getSize()); + for (int i=0;i newlore = ArrowQuiver.getItemMeta().getLore(); + newlore.set(1, ChatColor.GRAY+"Arrows Remaining: "+ChatColor.YELLOW+ArrowQuiver_amt); + ArrowQuiver_meta.setLore(newlore); + ArrowQuiver.setItemMeta(ArrowQuiver_meta); + } + + public int playerGetArrowQuiverAmt(Player p, int slot) { + ItemStack ArrowQuiver = p.getInventory().getItem(slot); + ItemMeta ArrowQuiver_meta = ArrowQuiver.getItemMeta(); + int ArrowQuiver_amt = Integer.parseInt(ArrowQuiver.getItemMeta().getLore().get(1).split(": "+ChatColor.YELLOW)[1]); + return ArrowQuiver_amt; + } + + //Removes amt arrows in the arrow quiver in slot slot. If there's not enough arrows, sets the amount to 0. + //Returns how many arrows are left, or 0 if it's now empty. + public int playerRemoveArrowQuiver(Player p, int slot, int amt) { + ItemStack ArrowQuiver = p.getInventory().getItem(slot); + ItemMeta ArrowQuiver_meta = ArrowQuiver.getItemMeta(); + int ArrowQuiver_amt = Integer.parseInt(ArrowQuiver.getItemMeta().getLore().get(1).split(": "+ChatColor.YELLOW)[1]); + ArrowQuiver_amt -= amt; + if (ArrowQuiver_amt<0) {ArrowQuiver_amt=0;} + List newlore = ArrowQuiver.getItemMeta().getLore(); + newlore.set(1, ChatColor.GRAY+"Arrows Remaining: "+ChatColor.YELLOW+ArrowQuiver_amt); + ArrowQuiver_meta.setLore(newlore); + ArrowQuiver.setItemMeta(ArrowQuiver_meta); + return ArrowQuiver_amt; + } + + + + ///////////////ALL PLAYER RELATED FUNCTIONS GO DOWN HERE. + public static double getPlayerMoney(Player p) { + //Tells a player how much money they have. + for (int i=0;i20) { + while (health>20) { + color1++; + color2++; + health-=20; + } + } + for (int i=0;i20) { + for (int i=0;i<10;i++) { + heartdisplay+=Character.toString((char)0x2665); + } + } else { + for (int i=0;i0) { + //getLogger().info("Monster "+target.getEntityId()+" has Protection "+monsterEquipment[i].getEnchantmentLevel(Enchantment.PROTECTION_ENVIRONMENTAL)); + protectionlevel+=monsterEquipment[i].getEnchantmentLevel(Enchantment.PROTECTION_ENVIRONMENTAL); + //Protection is 1% damage reduction per level of protection. + } + + switch (monsterEquipment[i].getType()) { + case LEATHER_HELMET:{ + dmgreduction+=3.0*((isMonster)?2:1); //We multiply it all by 2 since we are giving them the "block" version of the armor. + }break; + case LEATHER_CHESTPLATE:{ + dmgreduction+=3.0*((isMonster)?2:1); + }break; + case LEATHER_LEGGINGS:{ + dmgreduction+=3.0*((isMonster)?2:1); + }break; + case LEATHER_BOOTS:{ + dmgreduction+=3.0*((isMonster)?2:1); + }break; + case IRON_HELMET:{ + dmgreduction+=5.0*((isMonster)?2:1); + }break; + case IRON_CHESTPLATE:{ + dmgreduction+=5.0*((isMonster)?2:1); + }break; + case IRON_LEGGINGS:{ + dmgreduction+=5.0*((isMonster)?2:1); + }break; + case IRON_BOOTS:{ + dmgreduction+=5.0*((isMonster)?2:1); + }break; + case GOLD_HELMET:{ + dmgreduction+=10.0*((isMonster)?2:1); + }break; + case GOLD_CHESTPLATE:{ + dmgreduction+=10.0*((isMonster)?2:1); + }break; + case GOLD_LEGGINGS:{ + dmgreduction+=10.0*((isMonster)?2:1); + }break; + case GOLD_BOOTS:{ + dmgreduction+=10.0*((isMonster)?2:1); + }break; + case DIAMOND_HELMET:{ + dmgreduction+=8.0*((isMonster)?2:1); + }break; + case DIAMOND_CHESTPLATE:{ + dmgreduction+=8.0*((isMonster)?2:1); + }break; + case DIAMOND_LEGGINGS:{ + dmgreduction+=8.0*((isMonster)?2:1); + }break; + case DIAMOND_BOOTS:{ + dmgreduction+=8.0*((isMonster)?2:1); + }break; + default: { + dmgreduction+=0.0*((isMonster)?2:1); + } + } + } + } + + //Now apply resistances if any. + //Resistance effect reduces damage by 10% per level of resistance. + int resistlevel = 0; + int strengthlevel = 0; + int weaknesslevel = 0; + int partylevel = 0; + + Collection target_effects = target.getActivePotionEffects(); + for (int i=0;i player_effects = p.getActivePotionEffects(); + for (int i=0;i0) { + partylevel = playerdata.get(j).partybonus; + getLogger().info("Party level is "+partylevel); + if (partylevel>9) {partylevel=9;} + } + } + + int sharpnesslevel=0; + //Apply player enchantments next. + //Each sharpness level increases damage by 0.5. + //Both Smite and Bane of Arthropods increases damage by 1.0 per level. + if (p.getEquipment().getItemInMainHand()!=null) { + if (p.getEquipment().getItemInMainHand().getEnchantmentLevel(Enchantment.DAMAGE_ALL)>0) { + sharpnesslevel+=p.getEquipment().getItemInMainHand().getEnchantmentLevel(Enchantment.DAMAGE_ALL); + //getLogger().info("Player "+p.getName()+" has Sharpness "+p.getEquipment().getItemInMainHand().getEnchantmentLevel(Enchantment.DAMAGE_ALL)+"."); + } else + if ((target.getType()==EntityType.ZOMBIE || target.getType()==EntityType.PIG_ZOMBIE || + target.getType()==EntityType.WITHER || target.getType()==EntityType.SKELETON) && + p.getEquipment().getItemInMainHand().getEnchantmentLevel(Enchantment.DAMAGE_UNDEAD)>0) { + sharpnesslevel+=p.getEquipment().getItemInMainHand().getEnchantmentLevel(Enchantment.DAMAGE_ALL)*2; + //getLogger().info("Player "+p.getName()+" has Smite "+p.getEquipment().getItemInMainHand().getEnchantmentLevel(Enchantment.DAMAGE_ALL)+"."); + } else + if ((target.getType()==EntityType.SPIDER || target.getType()==EntityType.CAVE_SPIDER || + target.getType()==EntityType.SILVERFISH || target.getType()==EntityType.ENDERMITE) && + p.getEquipment().getItemInMainHand().getEnchantmentLevel(Enchantment.DAMAGE_UNDEAD)>0) { + sharpnesslevel+=p.getEquipment().getItemInMainHand().getEnchantmentLevel(Enchantment.DAMAGE_ALL)*2; + //getLogger().info("Player "+p.getName()+" has Bane of Arthropods "+p.getEquipment().getItemInMainHand().getEnchantmentLevel(Enchantment.DAMAGE_ALL)+"."); + } + } + + boolean hasShield=false; + + //Check if our enemy has a shield. + //Shields reduce damage by another 5%. + if (target.getEquipment().getItemInOffHand().getType()==Material.SHIELD) { + hasShield=true; + } + + final double dmgamt = ( + basedmg + +sharpnesslevel*0.5 + -(basedmg*(dmgreduction/100.0d)) + ) + *((10-resistlevel)*0.1) + /((10-strengthlevel)*0.1) + *((10-weaknesslevel)*0.1) + /((10-partylevel)*0.1) + *((100-protectionlevel)*0.01) + *((hasShield)?0.95:1.00); //Calculated damage amount. + + getLogger().info("Final damage is "+dmgamt); + + final LivingEntity pp = p; + final LivingEntity m = target; + + if (m.getHealth()>dmgamt) { + m.setHealth(m.getHealth()-dmgamt); + } else { + m.setHealth(0.0); + } + /* + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + public void run() { + if (m!=null) { + //getLogger().info(pp.getName()+" Dealt "+dmgamt+" modified dmg to "+m.getName()+"."); + //m.damage(dmgamt); //Finally, damage the enemy. + if (m.getHealth()>dmgamt) { + m.setHealth(m.getHealth()-dmgamt); + } else { + m.setHealth(0.0); + } + getLogger().info(m.getKiller().getName()); + } + }} + ,1);*/ + } + + public double CalculateDamageReduction(double basedmg,LivingEntity target,Entity damager) { + ItemStack[] armor = target.getEquipment().getArmorContents(); + double dmgreduction = 0.0; + + int protectionlevel = 0; + int resistlevel = 0; + int partylevel = 0; + + for (int i=0;i0) { + protectionlevel+=armor[i].getEnchantmentLevel(Enchantment.PROTECTION_ENVIRONMENTAL); + } + if ((damager instanceof Arrow) && armor[i].getEnchantmentLevel(Enchantment.PROTECTION_PROJECTILE)>0) { + protectionlevel+=armor[i].getEnchantmentLevel(Enchantment.PROTECTION_PROJECTILE); + } + if ((damager instanceof Creeper) && armor[i].getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS)>0) { + protectionlevel+=armor[i].getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS); + } + + boolean isBlockArmor = IsBlockArmor(armor[i]); + switch (armor[i].getType()) { + case LEATHER_BOOTS: + case LEATHER_LEGGINGS: + case LEATHER_CHESTPLATE: + case LEATHER_HELMET: { + dmgreduction+=3*((isBlockArmor)?2:1); + }break; + case IRON_BOOTS: + case IRON_LEGGINGS: + case IRON_CHESTPLATE: + case IRON_HELMET: { + dmgreduction+=5*((isBlockArmor)?2:1); + }break; + case GOLD_BOOTS: + case GOLD_LEGGINGS: + case GOLD_CHESTPLATE: + case GOLD_HELMET: { + dmgreduction+=10*((isBlockArmor)?2:1); + }break; + case DIAMOND_BOOTS: + case DIAMOND_LEGGINGS: + case DIAMOND_CHESTPLATE: + case DIAMOND_HELMET: { + dmgreduction+=8*((isBlockArmor)?2:1); + }break; + } + } + } + + //Check for resistance effect. + Collection target_effects = target.getActivePotionEffects(); + for (int i=0;i0) { + partylevel = playerdata.get(j).partybonus; + if (partylevel>9) {partylevel=9;} + } + } + } + + //Blocking: -((p.isBlocking())?ev.getDamage()*0.33:0) //33% damage will be reduced if we are blocking. + //Shield: -((p.getEquipment().getItemInOffHand()!=null && p.getEquipment().getItemInOffHand().getType()==Material.SHIELD)?ev.getDamage()*0.05:0) //5% damage will be reduced if we are holding a shield. + + + double finaldmg=(basedmg-(basedmg*(dmgreduction/100.0d))) + *((10-resistlevel)*0.1) + *((100-protectionlevel)*0.01) + *((10-partylevel)*0.1) + *((target instanceof Player && ((Player)target).isBlocking())?(isDefender((Player)target))?0.30:0.50:1) + *((isDefender(target))?0.9:(target.getEquipment().getItemInOffHand()!=null && target.getEquipment().getItemInOffHand().getType()==Material.SHIELD)?0.95:1); + + //getLogger().info("Dealt "+finaldmg+" modified damage."); + return finaldmg; + } + + public boolean IsBlockArmor(ItemStack armor) { + //Checks if this block is a block armor version. If so, it will + //have double the normal damage reduction. + //It will say ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor" on a lore line. + if (armor!=null) { + if (armor.hasItemMeta() && + armor.getItemMeta().hasLore()) { + //Loop through the lore to see if this line exists. + for (int i=0;i lore = new ArrayList(); + if (meta.hasLore()) { + lore.addAll(meta.getLore()); + } + if (isArmor(item)) { + lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Armor"); + lore.add(ChatColor.GRAY+"Twice as strong"); + } else + if (isTool(item)) { + lore.add(ChatColor.BLUE+""+ChatColor.ITALIC+"Hardened Weapon"); + lore.add(ChatColor.GRAY+"Twice as strong"); + } + lore.add(ChatColor.GRAY+"Breaks Remaining: "+ChatColor.YELLOW+breaks); + meta.setLore(lore); + item.setItemMeta(meta); + } + return item; + } + + /** + * This function will return the number of items of this type + * that exist in your inventory. It will not include your + * equipment. + * @param p + * @param item + * @return + */ + public static int CountItems(Player p, ItemStack item) { + int totalcount=0; + for (int i=0;i='a') { + first = (char)(temp[i].charAt(0)-32); + } else { + first = temp[i].charAt(0); + } + finalname+=(finalname.equals("")?"":" ")+first+temp[i].toLowerCase().substring(1); + } + return finalname; + } else { + if (s.charAt(0)>='a') { + char first = (char)(s.charAt(0)-32); + return first+s.toLowerCase().substring(1); + } else { + char first = (char)(s.charAt(0)); + return first+s.toLowerCase().substring(1); + } + } + } + + public static int getHardenedItemBreaks(ItemStack item) { + if (item.hasItemMeta() && + item.getItemMeta().hasLore()) { + ItemMeta item_meta = item.getItemMeta(); + int breaks_remaining=-1; + int loreline=-1; + for (int i=0;i0) { + ItemMeta m = item.getItemMeta(); + List lore = item.getItemMeta().getLore(); + for (int i=0;i sessions = new ArrayList(); + List purchases = new ArrayList(); + + //Save itemstack in file. + //Reference an ID. + + /** + * Creates a World shop. + * @param s The sign the shop is created on. + * @param item The item being sold. + * @param price The unit price of the item. + * @param owner Owner of the shop. + */ + public WorldShop CreateWorldShop(Sign s, ItemStack item, int amt, double price, String owner) { + //Convert the sign. + String[] lines = s.getLines(); + List sign_lines = new ArrayList(); + WorldShop newshop = new WorldShop(item, amt, price, owner, TwosideKeeper.WORLD_SHOP_ID); + if (lines[0].equalsIgnoreCase("shop")) { + UpdateSign(newshop, TwosideKeeper.WORLD_SHOP_ID, s); + } + TwosideKeeper.WORLD_SHOP_ID++; + return newshop; + } + + public void UpdateSign(WorldShop shop, int id, Sign s) { + //Convert the sign. + String[] lines = s.getLines(); + List sign_lines = new ArrayList(); + //Create a shop out of this. + sign_lines.add(ChatColor.BLUE+"-- SHOP --"); + if (shop.GetItem().hasItemMeta() && + shop.GetItem().getItemMeta().hasDisplayName()) { + sign_lines.add(shop.GetItem().getItemMeta().getDisplayName()); + } else { + sign_lines.add(TwosideKeeper.UserFriendlyMaterialName(shop.GetItem())); + } + DecimalFormat df = new DecimalFormat("0.00"); + sign_lines.add("$"+df.format(shop.GetUnitPrice())+ChatColor.DARK_BLUE+" [x"+shop.GetAmount()+"]"); + DecimalFormat df2 = new DecimalFormat("000000"); + sign_lines.add(ChatColor.DARK_GRAY+df2.format(id)); + for (int i=0;i<4;i++) { + s.setLine(i, sign_lines.get(i)); + } + s.update(); + } + + public int GetShopID(Sign s) { + return Integer.parseInt(s.getLines()[3].replace(ChatColor.DARK_GRAY+"", "")); + } + + public WorldShop LoadWorldShopData(int id) { + File config; + config = new File(TwosideKeeper.filesave,"worldshop.data"); + FileConfiguration workable = YamlConfiguration.loadConfiguration(config); + + return new WorldShop(workable.getItemStack("item"+id),workable.getInt("amt"+id),workable.getDouble("item_price"+id),workable.getString("owner"+id),id); + } + + public void SaveWorldShopData(WorldShop shop) { + File config; + config = new File(TwosideKeeper.filesave,"worldshop.data"); + FileConfiguration workable = YamlConfiguration.loadConfiguration(config); + + int id = shop.getID(); + + workable.set("item"+id,shop.GetItem()); + workable.set("item_price"+id,shop.GetUnitPrice()); + workable.set("amt"+id,shop.GetAmount()); + workable.set("owner"+id,shop.GetOwner()); + + try { + workable.save(config); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + public List GetSessions() { + return sessions; + } + public WorldShopSession GetSession(int session) { + return sessions.get(session); + } + public WorldShopSession GetSession(Player p) { + return sessions.get(GetPlayerTerminal(p)); + } + public boolean IsPlayerUsingTerminal(Player p) { + for (int i=0;i