From 97f57b655bfbcf4fa58daffddff67d89c6705613 Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Mon, 29 Dec 2014 06:44:00 -0500 Subject: [PATCH] Prevent horses from spawning in Clans Added Building supplies shop and pvp shop to clans. --- .../core/common/util/InventoryUtil.java | 12 +-- .../mineplex/core/shop/item/ItemPackage.java | 2 +- .../src/mineplex/game/clans/Clans.java | 8 +- .../mineplex/game/clans/clans/ClansGame.java | 9 ++ .../src/mineplex/game/clans/shop/PvpItem.java | 45 +++++++- .../game/clans/shop/PvpShopButton.java | 97 ++++++++++++++++-- .../shop/{ => building}/BuildingPage.java | 14 ++- .../shop/{ => building}/BuildingShop.java | 15 ++- .../mineplex/game/clans/shop/pvp/PvpPage.java | 69 +++++++++++++ .../mineplex/game/clans/shop/pvp/PvpShop.java | 22 ++++ .../Mineplex.Hub/src/mineplex/hub/Hub.java | 2 +- .../src/mineplex/staffServer/StaffServer.java | 2 +- .../src/nautilus/game/arcade/Arcade.java | 2 +- Website/LOCWebsite.suo | Bin 474624 -> 474624 bytes 14 files changed, 269 insertions(+), 30 deletions(-) rename Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/{ => building}/BuildingPage.java (65%) rename Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/{ => building}/BuildingShop.java (58%) create mode 100644 Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/pvp/PvpPage.java create mode 100644 Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/pvp/PvpShop.java diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/InventoryUtil.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/InventoryUtil.java index e8276ce1d..cf348a681 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/InventoryUtil.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/InventoryUtil.java @@ -74,16 +74,12 @@ public class InventoryUtil else if (item == null) continue; - boolean equals = false; + boolean equals = (item.getTypeId() == inventory[i].getTypeId() && item.getDurability() == inventory[i].getDurability() && item.getEnchantments().equals(inventory[i].getEnchantments())); - if (withAmount) + if (equals && withAmount) { - equals = item.equals(inventory[i]); + equals = inventory[i].getAmount() >= item.getAmount(); } - else - { - equals = item.getTypeId() == inventory[i].getTypeId() && item.getDurability() == inventory[i].getDurability() && item.getEnchantments().equals(inventory[i].getEnchantments()); - } if (equals) { @@ -94,7 +90,7 @@ public class InventoryUtil return -1; } - public static int GetCountOfObjectsRemoved(CraftInventory getInventory, int i, ItemStack itemStack) + public static int getCountOfObjectsRemoved(CraftInventory getInventory, int i, ItemStack itemStack) { int count = 0; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/shop/item/ItemPackage.java b/Plugins/Mineplex.Core/src/mineplex/core/shop/item/ItemPackage.java index 683a87f0b..539bbe4fc 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/shop/item/ItemPackage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/shop/item/ItemPackage.java @@ -140,7 +140,7 @@ public class ItemPackage implements ISalesPackage int count = 0; - count = InventoryUtil.GetCountOfObjectsRemoved((CraftInventory)player.GetPlayer().getInventory(), 9, (ItemStack)shopItem); + count = InventoryUtil.getCountOfObjectsRemoved((CraftInventory)player.GetPlayer().getInventory(), 9, (ItemStack)shopItem); /* TODO default for (int i=0; i < 9; i++) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java index b6134f98b..7dffcbba4 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java @@ -24,6 +24,8 @@ import mineplex.core.teleport.Teleport; import mineplex.core.updater.FileUpdater; import mineplex.core.updater.Updater; import mineplex.game.clans.clans.ClansManager; +import mineplex.game.clans.shop.building.BuildingShop; +import mineplex.game.clans.shop.pvp.PvpShop; import mineplex.minecraft.game.core.mechanics.Weapon; import net.minecraft.server.v1_7_R4.MinecraftServer; @@ -59,7 +61,7 @@ public class Clans extends JavaPlugin ItemStackFactory.Initialize(this, false); Recharge.Initialize(this); - _donationManager = new DonationManager(this, webServerAddress); + _donationManager = new DonationManager(this, _clientManager, webServerAddress); _serverConfiguration = new ServerConfiguration(this); @@ -84,9 +86,11 @@ public class Clans extends JavaPlugin new FriendManager(this, _clientManager, preferenceManager); new InventoryManager(this, _clientManager); - new ClansManager(this, serverStatusManager.getCurrentServerName(), _clientManager, _donationManager, blockRestore, teleport, webServerAddress); + ClansManager clans = new ClansManager(this, serverStatusManager.getCurrentServerName(), _clientManager, _donationManager, blockRestore, teleport, webServerAddress); new Recipes(this); new Farming(this); + new BuildingShop(clans, _clientManager, _donationManager); + new PvpShop(clans, _clientManager, _donationManager); //Updates getServer().getScheduler().scheduleSyncRepeatingTask(this, new Updater(this), 1, 1); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansGame.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansGame.java index 04c7fd530..5c126126b 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansGame.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansGame.java @@ -17,6 +17,7 @@ import org.bukkit.event.block.BlockIgniteEvent; import org.bukkit.event.block.BlockIgniteEvent.IgniteCause; import org.bukkit.event.block.BlockPistonExtendEvent; import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerQuitEvent; @@ -37,6 +38,7 @@ import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTime; import mineplex.core.common.util.UtilTime.TimeUnit; +import mineplex.core.creature.event.CreatureSpawnCustomEvent; import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; @@ -75,6 +77,13 @@ public class ClansGame extends MiniPlugin } } + @EventHandler + public void preventHorseSpawn(CreatureSpawnEvent event) + { + if (event.getEntityType() == EntityType.HORSE) + event.setCancelled(true); + } + @EventHandler public void deductEnergy(UpdateEvent event) { diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpItem.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpItem.java index 5d6aca0f7..3a3350a49 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpItem.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpItem.java @@ -7,19 +7,58 @@ import mineplex.core.shop.item.ShopItem; public class PvpItem extends ShopItem { - private static String LEFT_CLICK_BUY = C.cWhite + "Left-Click to Buy 1"; + private static String LEFT_CLICK_BUY = C.cYellow + "Left-Click" + C.cWhite + " to Buy " + C.cGreen + 1; + private static String RIGHT_CLICK_SELL = C.cYellow + "Right-Click" + C.cWhite + " to Sell " + C.cGreen + 1; + + private int _price; + private int _bulkCount; public PvpItem(Material type, byte data, int displayAmount, String name, int price, int bulkCount) { super(type, data, name, new String[] { - C.cYellow + C.Bold + name, C.cWhite + " ", LEFT_CLICK_BUY, C.cWhite + "Costs " + C.cGreen + "$" + price, C.cWhite + " ", - C.cWhite + "Shift Left-Click to Buy " + bulkCount, + C.cYellow + "Shift Left-Click" + C.cWhite + " to Buy " + C.cGreen + bulkCount, C.cWhite + "Costs " + C.cGreen + "$" + (price * bulkCount), + C.cWhite + " ", + RIGHT_CLICK_SELL, + C.cWhite + "Earns " + C.cGreen + "$" + (int)(price / 2), + C.cWhite + " ", + C.cYellow + "Shift Right-Click" + C.cWhite + " to Sell " + C.cGreen + "All", }, 0, false, false); + + _price = price; + _bulkCount = bulkCount; + } + + public PvpItem(Material type, byte data, int displayAmount, String name, int price) + { + super(type, data, name, new String[] + { + C.cWhite + " ", + LEFT_CLICK_BUY, + C.cWhite + "Costs " + C.cGreen + "$" + price, + C.cWhite + " ", + RIGHT_CLICK_SELL, + C.cWhite + "Earns " + C.cGreen + "$" + (int)(price / 2), + C.cWhite + " ", + C.cYellow + "Shift Right-Click" + C.cWhite + " to Sell " + C.cGreen + "All", + }, 0, false, false); + + _price = price; + _bulkCount = -1; + } + + public int getPrice() + { + return _price; + } + + public int getBulkCount() + { + return _bulkCount; } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpShopButton.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpShopButton.java index 145a424ef..66c92daa4 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpShopButton.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpShopButton.java @@ -1,13 +1,21 @@ package mineplex.game.clans.shop; +import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftInventory; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; +import mineplex.core.common.util.Callback; +import mineplex.core.common.util.F; +import mineplex.core.common.util.InventoryUtil; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.shop.item.IButton; +import mineplex.core.shop.item.ShopItem; import mineplex.core.shop.page.ShopPageBase; import mineplex.game.clans.clans.ClansManager; -public class PvpShopButton> implements IButton +public class PvpShopButton> implements IButton { protected PageType Page; protected PvpItem Item; @@ -19,14 +27,89 @@ public class PvpShopButton balance) + { + Page.PlayDenySound(player); + UtilPlayer.message(player, F.main(Page.getPlugin().getName(), "You do not have enough funds to purchase " + deliveryAmount + " " + Item.GetName() + ".")); + return; + } + else + { + Page.getDonationManager().RewardGold(new Callback() + { + public void run(Boolean result) + { + if (result) + { + Page.PlayAcceptSound(player); + ShopItem item = Item.clone(); + item.setAmount(deliveryAmount); + + player.getInventory().addItem(ItemStackFactory.Instance.CreateStack(Item.getType(), Item.getData().getData(), Item.getAmount(), Item.GetName())); + } + else + { + Page.PlayDenySound(player); + UtilPlayer.message(player, F.main(Page.getPlugin().getName(), "An error occurred processing your purchase.")); + } + } + }, "Clans", player.getName(), player.getUniqueId(), -cost); + } + } + else if (clickType == ClickType.RIGHT || clickType == ClickType.SHIFT_RIGHT) + { + int removed = 1; + ItemStack dumbItem = new ItemStack(Item.getType(), Item.getAmount(), Item.getDurability()); + + if (InventoryUtil.first((CraftInventory)player.getInventory(), 36, dumbItem, true) == -1) + { + Page.PlayDenySound(player); + UtilPlayer.message(player, F.main(Page.getPlugin().getName(), "You do not have " + deliveryAmount + " " + Item.GetName() + " in your inventory.")); + return; + } + + if (clickType == ClickType.RIGHT) + { + if (player.getInventory().contains(Item.getType(), Item.getAmount())) + InventoryUtil.removeItem((CraftInventory)player.getInventory(), 36, dumbItem); + } + else + removed = InventoryUtil.getCountOfObjectsRemoved((CraftInventory)player.getInventory(), 36, dumbItem); + + final int creditAmount = removed * Item.getPrice() / 2; + System.out.println("Crediting " + player.getName() + " with " + creditAmount + " gold."); + Page.getDonationManager().RewardGold(new Callback() + { + public void run(Boolean result) + { + if (result) + { + Page.PlayAcceptSound(player); + System.out.println("Credited " + player.getName() + " with " + creditAmount + " gold."); + } + else + { + Page.PlayDenySound(player); + UtilPlayer.message(player, F.main(Page.getPlugin().getName(), "An error occurred processing your return.")); + } + } + }, "Clans", player.getName(), player.getUniqueId(), creditAmount); } } - } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/BuildingPage.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/building/BuildingPage.java similarity index 65% rename from Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/BuildingPage.java rename to Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/building/BuildingPage.java index 67366d697..88832e197 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/BuildingPage.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/building/BuildingPage.java @@ -1,4 +1,4 @@ -package mineplex.game.clans.shop; +package mineplex.game.clans.shop.building; import org.bukkit.Material; @@ -6,25 +6,29 @@ import mineplex.core.account.CoreClientManager; import mineplex.core.donation.DonationManager; import mineplex.core.shop.page.ShopPageBase; import mineplex.game.clans.clans.ClansManager; +import mineplex.game.clans.shop.PvpItem; +import mineplex.game.clans.shop.PvpShopButton; public class BuildingPage extends ShopPageBase { public BuildingPage(ClansManager plugin, BuildingShop shop, CoreClientManager clientManager, DonationManager donationManager, org.bukkit.entity.Player player) { super(plugin, shop, clientManager, donationManager, "Building Supplies", player); + + BuildPage(); } @Override protected void BuildPage() { addPvpItem(1, new PvpItem(Material.STONE, (byte)0, 1, "Stone", 25, 64)); - addPvpItem(1, new PvpItem(Material.WOOD, (byte)0, 1, "Wood", 15, 64)); - addPvpItem(1, new PvpItem(Material.BRICK, (byte)0, 1, "Bricks", 30, 64)); - addPvpItem(1, new PvpItem(Material.SANDSTONE, (byte)0, 1, "Sandstone", 30, 64)); + addPvpItem(2, new PvpItem(Material.WOOD, (byte)0, 1, "Wood", 15, 64)); + addPvpItem(3, new PvpItem(Material.BRICK, (byte)0, 1, "Bricks", 30, 64)); + addPvpItem(4, new PvpItem(Material.SANDSTONE, (byte)0, 1, "Sandstone", 30, 64)); } public void addPvpItem(int slot, PvpItem item) { - AddButton(1, item, new PvpShopButton(this, item)); + AddButton(slot, item, new PvpShopButton(this, item)); } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/BuildingShop.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/building/BuildingShop.java similarity index 58% rename from Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/BuildingShop.java rename to Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/building/BuildingShop.java index 8813b6497..9c6263372 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/BuildingShop.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/building/BuildingShop.java @@ -1,8 +1,11 @@ -package mineplex.game.clans.shop; +package mineplex.game.clans.shop.building; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; import mineplex.core.account.CoreClientManager; +import mineplex.core.common.util.UtilPlayer; import mineplex.core.shop.ShopBase; import mineplex.core.shop.page.ShopPageBase; import mineplex.game.clans.clans.ClansManager; @@ -19,4 +22,14 @@ public class BuildingShop extends ShopBase { return new BuildingPage(Plugin, this, ClientManager, DonationManager, player); } + + @EventHandler + public void playerCmd(PlayerCommandPreprocessEvent event) + { + if (event.getMessage().startsWith("/gold")) + { + UtilPlayer.message(event.getPlayer(), "PVP SHOP > Gold balance : " + DonationManager.Get(event.getPlayer().getName()).getGold()); + event.setCancelled(true); + } + } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/pvp/PvpPage.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/pvp/PvpPage.java new file mode 100644 index 000000000..6ec15aadc --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/pvp/PvpPage.java @@ -0,0 +1,69 @@ +package mineplex.game.clans.shop.pvp; + +import org.bukkit.Material; + +import mineplex.core.account.CoreClientManager; +import mineplex.core.donation.DonationManager; +import mineplex.core.shop.page.ShopPageBase; +import mineplex.game.clans.clans.ClansManager; +import mineplex.game.clans.shop.PvpItem; +import mineplex.game.clans.shop.PvpShopButton; + +public class PvpPage extends ShopPageBase +{ + public PvpPage(ClansManager plugin, PvpShop shop, CoreClientManager clientManager, DonationManager donationManager, org.bukkit.entity.Player player) + { + super(plugin, shop, clientManager, donationManager, "Pvp Gear", player); + + BuildPage(); + } + + @Override + protected void BuildPage() + { + addPvpItem(9, new PvpItem(Material.GOLD_HELMET, (byte)0, 1, "Mage Helmet", 200, 4)); + addPvpItem(18, new PvpItem(Material.GOLD_CHESTPLATE, (byte)0, 1, "Mage Chestplate", 200, 4)); + addPvpItem(27, new PvpItem(Material.GOLD_LEGGINGS, (byte)0, 1, "Mage Leggings", 200, 4)); + addPvpItem(36, new PvpItem(Material.GOLD_BOOTS, (byte)0, 1, "Mage Boots", 200, 4)); + + addPvpItem(10, new PvpItem(Material.LEATHER_HELMET, (byte)0, 1, "Assassin Helmet", 200, 4)); + addPvpItem(19, new PvpItem(Material.LEATHER_CHESTPLATE, (byte)0, 1, "Assassin Chestplate", 200, 4)); + addPvpItem(28, new PvpItem(Material.LEATHER_LEGGINGS, (byte)0, 1, "Assassin Leggings", 200, 4)); + addPvpItem(37, new PvpItem(Material.LEATHER_BOOTS, (byte)0, 1, "Assassin Boots", 200, 4)); + + addPvpItem(11, new PvpItem(Material.CHAINMAIL_HELMET, (byte)0, 1, "Ranger Helmet", 200, 4)); + addPvpItem(20, new PvpItem(Material.CHAINMAIL_CHESTPLATE, (byte)0, 1, "Ranger Chestplate", 200, 4)); + addPvpItem(29, new PvpItem(Material.CHAINMAIL_LEGGINGS, (byte)0, 1, "Ranger Leggings", 200, 4)); + addPvpItem(38, new PvpItem(Material.CHAINMAIL_BOOTS, (byte)0, 1, "Ranger Boots", 200, 4)); + + addPvpItem(12, new PvpItem(Material.IRON_HELMET, (byte)0, 1, "Knight Helmet", 200, 4)); + addPvpItem(21, new PvpItem(Material.IRON_CHESTPLATE, (byte)0, 1, "Knight Chestplate", 200, 4)); + addPvpItem(30, new PvpItem(Material.IRON_LEGGINGS, (byte)0, 1, "Knight Leggings", 200, 4)); + addPvpItem(39, new PvpItem(Material.IRON_BOOTS, (byte)0, 1, "Knight Boots", 200, 4)); + + addPvpItem(13, new PvpItem(Material.DIAMOND_HELMET, (byte)0, 1, "Brute Helmet", 200, 4)); + addPvpItem(22, new PvpItem(Material.DIAMOND_CHESTPLATE, (byte)0, 1, "Brute Chestplate", 200, 4)); + addPvpItem(31, new PvpItem(Material.DIAMOND_LEGGINGS, (byte)0, 1, "Brute Leggings", 200, 4)); + addPvpItem(40, new PvpItem(Material.DIAMOND_BOOTS, (byte)0, 1, "Brute Boots", 200, 4)); + + addPvpItem(15, new PvpItem(Material.IRON_SWORD, (byte)0, 1, "Iron Sword", 100, 4)); + addPvpItem(16, new PvpItem(Material.DIAMOND_SWORD, (byte)0, 1, "Power Sword", 800, 4)); + addPvpItem(17, new PvpItem(Material.GOLD_SWORD, (byte)0, 1, "Booster Sword", 800, 4)); + + addPvpItem(24, new PvpItem(Material.IRON_AXE, (byte)0, 1, "Iron Axe", 100, 4)); + addPvpItem(25, new PvpItem(Material.DIAMOND_AXE, (byte)0, 1, "Power Axe", 800, 4)); + addPvpItem(26, new PvpItem(Material.GOLD_AXE, (byte)0, 1, "Booster Axe", 800, 4)); + + addPvpItem(33, new PvpItem(Material.BOW, (byte)0, 1, "Standard Bow", 100, 4)); + addPvpItem(34, new PvpItem(Material.ARROW, (byte)0, 16, "Arrows", 50, 4)); + + addPvpItem(51, new PvpItem(Material.TNT, (byte)0, 1, "TNT", 500, 16)); + addPvpItem(52, new PvpItem(Material.BREWING_STAND_ITEM, (byte)0, 1, "TNT Generator", 5000)); + addPvpItem(53, new PvpItem(Material.ENCHANTMENT_TABLE, (byte)0, 1, "Class Shop", 10000)); + } + + public void addPvpItem(int slot, PvpItem item) + { + AddButton(slot, item, new PvpShopButton(this, item)); + } +} diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/pvp/PvpShop.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/pvp/PvpShop.java new file mode 100644 index 000000000..ff1f31437 --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/pvp/PvpShop.java @@ -0,0 +1,22 @@ +package mineplex.game.clans.shop.pvp; + +import org.bukkit.entity.Player; + +import mineplex.core.account.CoreClientManager; +import mineplex.core.shop.ShopBase; +import mineplex.core.shop.page.ShopPageBase; +import mineplex.game.clans.clans.ClansManager; + +public class PvpShop extends ShopBase +{ + public PvpShop(ClansManager plugin, CoreClientManager clientManager, mineplex.core.donation.DonationManager donationManager) + { + super(plugin, clientManager, donationManager, "Pvp Gear"); + } + + @Override + protected ShopPageBase> BuildPagesFor(Player player) + { + return new PvpPage(Plugin, this, ClientManager, DonationManager, player); + } +} diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java index e1476c2bb..8e351ffa6 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java @@ -81,7 +81,7 @@ public class Hub extends JavaPlugin implements IRelation Recharge.Initialize(this); Punish punish = new Punish(this, webServerAddress, clientManager); BlockRestore blockRestore = new BlockRestore(this); - DonationManager donationManager = new DonationManager(this, webServerAddress); + DonationManager donationManager = new DonationManager(this, clientManager, webServerAddress); new ServerConfiguration(this); diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java index a38b5af5e..a1e535d03 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java @@ -48,7 +48,7 @@ public class StaffServer extends JavaPlugin CommandCenter.Instance.setClientManager(clientManager); Recharge.Initialize(this); - DonationManager donationManager = new DonationManager(this, webServerAddress); + DonationManager donationManager = new DonationManager(this, clientManager, webServerAddress); new Punish(this, webServerAddress, clientManager); new NpcManager(this, new Creature(this)); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java index 79569269e..f4d50c6bf 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java @@ -82,7 +82,7 @@ public class Arcade extends JavaPlugin ItemStackFactory.Initialize(this, false); Recharge.Initialize(this); - _donationManager = new DonationManager(this, webServerAddress); + _donationManager = new DonationManager(this, _clientManager, webServerAddress); _serverConfiguration = new ServerConfiguration(this); diff --git a/Website/LOCWebsite.suo b/Website/LOCWebsite.suo index 25a161edcc6877a93168f1870ffba9db3ea6ab20..6f5353f28eba9893653e3e51d8019c53210e5954 100644 GIT binary patch delta 12785 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 E7l%?6EC2ui delta 12719 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%0APlnqdlm+r5NfBGZFOaGuX9c!;R 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