From b8b6c031cd53e67e64c310ad479220db1db99014 Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Mon, 25 Aug 2014 23:56:58 -0700 Subject: [PATCH 1/4] Re-did and added a game to the quick game menu. Fixed npc triggers with non npcs named the same. Fixed naming pet longer than 16 chars. Added sugar cane to restricted block type for paintball gun Properly hooked in gadget block event for paitnball gun. Added auto purchase page on item gadget ammo empty. Added check on rank for customer support command. Fixed ConcurrentModificationException problem with spigot. --- .../core/cosmetic/ui/CosmeticShop.java | 9 + .../core/cosmetic/ui/page/GadgetPage.java | 2 +- .../core/cosmetic/ui/page/PetTagPage.java | 1 + .../core/disguise/DisguiseManager.java | 2 +- .../event/ItemGadgetOutOfAmmoEvent.java | 41 + .../core/gadget/gadgets/ItemPaintballGun.java | 5 + .../core/gadget/types/ItemGadget.java | 11 +- .../src/mineplex/core/npc/NpcManager.java | 30 + .../npc/event/NpcDamageByEntityEvent.java | 20 + .../src/mineplex/core/npc/event/NpcEvent.java | 44 + .../npc/event/NpcInteractEntityEvent.java | 21 + .../core/portal/Commands/ServerCommand.java | 2 +- .../core/preferences/ui/PreferencesShop.java | 2 +- .../src/mineplex/core/shop/ShopBase.java | 27 +- .../mineplex/hub/modules/StackerManager.java | 9 - .../mineplex/hub/server/ServerManager.java | 10 + .../hub/server/ui/ServerGameMenu.java | 110 ++- .../ui/{ => button}/SelectBHButton.java | 3 +- .../ui/{ => button}/SelectBRButton.java | 3 +- .../ui/{ => button}/SelectCSButton.java | 3 +- .../hub/server/ui/button/SelectDMTButton.java | 28 + .../ui/{ => button}/SelectDOMButton.java | 3 +- .../ui/{ => button}/SelectMINButton.java | 3 +- .../ui/{ => button}/SelectSGButton.java | 3 +- .../ui/{ => button}/SelectSSMButton.java | 3 +- .../hub/server/ui/button/SelectTDMButton.java | 28 + .../mineplex/servermonitor/ServerMonitor.java | 20 +- .../salespackage/command/RankCommand.java | 9 +- .../server/v1_7_R4/NetworkManager.java | 308 ++++++ .../server/v1_7_R4/PacketDataSerializer.java | 922 ++++++++++++++++++ 30 files changed, 1587 insertions(+), 95 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/event/ItemGadgetOutOfAmmoEvent.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/npc/event/NpcDamageByEntityEvent.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/npc/event/NpcEvent.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/npc/event/NpcInteractEntityEvent.java rename Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/{ => button}/SelectBHButton.java (82%) rename Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/{ => button}/SelectBRButton.java (82%) rename Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/{ => button}/SelectCSButton.java (82%) create mode 100644 Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectDMTButton.java rename Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/{ => button}/SelectDOMButton.java (82%) rename Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/{ => button}/SelectMINButton.java (82%) rename Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/{ => button}/SelectSGButton.java (82%) rename Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/{ => button}/SelectSSMButton.java (82%) create mode 100644 Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectTDMButton.java create mode 100644 Plugins/Nautilus.Core.CraftBukkit/src/net/minecraft/server/v1_7_R4/NetworkManager.java create mode 100644 Plugins/Nautilus.Core.CraftBukkit/src/net/minecraft/server/v1_7_R4/PacketDataSerializer.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/CosmeticShop.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/CosmeticShop.java index 58fff47f8..56eb416d3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/CosmeticShop.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/CosmeticShop.java @@ -1,14 +1,17 @@ package mineplex.core.cosmetic.ui; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; import org.bukkit.plugin.messaging.PluginMessageListener; import mineplex.core.account.CoreClientManager; import mineplex.core.common.CurrencyType; import mineplex.core.cosmetic.CosmeticManager; +import mineplex.core.cosmetic.ui.page.GadgetPage; import mineplex.core.cosmetic.ui.page.Menu; import mineplex.core.cosmetic.ui.page.PetTagPage; import mineplex.core.donation.DonationManager; +import mineplex.core.gadget.event.ItemGadgetOutOfAmmoEvent; import mineplex.core.inventory.InventoryManager; import mineplex.core.shop.ShopBase; import mineplex.core.shop.page.ShopPageBase; @@ -44,4 +47,10 @@ public class CosmeticShop extends ShopBase implements PluginMes } } } + + @EventHandler + public void itemGadgetEmptyAmmo(ItemGadgetOutOfAmmoEvent event) + { + new GadgetPage(Plugin, this, ClientManager, DonationManager, "Gadgets", event.getPlayer()).purchaseGadget(event.getPlayer(), event.getGadget()); + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java index c024bfcfb..9a6927479 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/GadgetPage.java @@ -123,7 +123,7 @@ public class GadgetPage extends ShopPageBase { if (Plugin.getInventoryManager().Get(player).getItemCount(gadget.GetName()) <= 0) { - PlayDenySound(player); + purchaseGadget(player, gadget); return; } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetTagPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetTagPage.java index 7cc873c9f..4baf499d2 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetTagPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/PetTagPage.java @@ -68,6 +68,7 @@ public class PetTagPage extends ShopPageBase PlayDenySound(Player); Shop.OpenPageForPlayer(Player, new PetPage(Plugin, Shop, ClientManager, DonationManager, "Pets", Player)); + return; } PetExtra tag = new PetExtra("Rename " + _pet.GetName() + " to " + _tagName, Material.NAME_TAG, 100); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java b/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java index 449d03393..27b1dd35a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java @@ -324,7 +324,7 @@ public class DisguiseManager extends MiniPlugin implements IPacketRunnable } } else if (packet instanceof PacketPlayOutEntityMetadata) - { + { int entityId = ((PacketPlayOutEntityMetadata)packet).a; if (_spawnPacketMap.containsKey(entityId) && owner.getEntityId() != entityId) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/event/ItemGadgetOutOfAmmoEvent.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/event/ItemGadgetOutOfAmmoEvent.java new file mode 100644 index 000000000..1e4f2f774 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/event/ItemGadgetOutOfAmmoEvent.java @@ -0,0 +1,41 @@ +package mineplex.core.gadget.event; + +import mineplex.core.gadget.types.ItemGadget; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class ItemGadgetOutOfAmmoEvent extends Event +{ + private static final HandlerList handlers = new HandlerList(); + + private Player _player; + private ItemGadget _gadget; + + public ItemGadgetOutOfAmmoEvent(Player player, ItemGadget gadget) + { + _player = player; + _gadget = gadget; + } + + public HandlerList getHandlers() + { + return handlers; + } + + public static HandlerList getHandlerList() + { + return handlers; + } + + public ItemGadget getGadget() + { + return _gadget; + } + + public Player getPlayer() + { + return _player; + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemPaintballGun.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemPaintballGun.java index 04fa4d4a8..34d4ed557 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemPaintballGun.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemPaintballGun.java @@ -5,6 +5,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; +import org.bukkit.Bukkit; import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.Material; @@ -75,12 +76,16 @@ public class ItemPaintballGun extends ItemGadget if (block.getType() == Material.CACTUS) return; + + if (block.getType() == Material.SUGAR_CANE_BLOCK) + return; } List blocks = new ArrayList(); blocks.addAll(UtilBlock.getInRadius(loc, 1.5d).keySet()); GadgetBlockEvent gadgetEvent = new GadgetBlockEvent(this, blocks); + Bukkit.getServer().getPluginManager().callEvent(gadgetEvent); if (gadgetEvent.isCancelled()) return; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ItemGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ItemGadget.java index f924605ae..d919f51cd 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ItemGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ItemGadget.java @@ -20,6 +20,7 @@ import mineplex.core.common.util.UtilGear; import mineplex.core.common.util.UtilInv; import mineplex.core.common.util.UtilPlayer; import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.event.ItemGadgetOutOfAmmoEvent; import mineplex.core.gadget.gadgets.Ammo; import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.recharge.Recharge; @@ -72,7 +73,7 @@ public abstract class ItemGadget extends Gadget itemLore.add(C.cBlack); itemLore.add(C.cWhite + "Your Ammo : " + Manager.getInventoryManager().Get(player).getItemCount(GetName())); - player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(GetDisplayMaterial(), GetDisplayData(), 1, F.item(GetName()))); + player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(GetDisplayMaterial(), GetDisplayData(), 1, F.item(Manager.getInventoryManager().Get(player).getItemCount(GetName()) + " " + GetName()))); if (inform) UtilPlayer.message(player, F.main("Gadget", "You equipped " + F.elem(GetName()) + ".")); @@ -143,13 +144,19 @@ public abstract class ItemGadget extends Gadget if (Manager.getInventoryManager().Get(player).getItemCount(GetName()) <= 0) { + UtilPlayer.message(player, F.main("Gadget", "You do not have any " + GetName() + " left.")); - Disable(player); + + ItemGadgetOutOfAmmoEvent ammoEvent = new ItemGadgetOutOfAmmoEvent(event.getPlayer(), this); + Bukkit.getServer().getPluginManager().callEvent(ammoEvent); + return; } Manager.getInventoryManager().addItemToInventory(player, getGadgetType().name(), GetName(), -1); + player.getInventory().setItem(Manager.getActiveItemSlot(), ItemStackFactory.Instance.CreateStack(GetDisplayMaterial(), GetDisplayData(), 1, F.item(Manager.getInventoryManager().Get(player).getItemCount(GetName()) + " " + GetName()))); + ActivateCustom(event.getPlayer()); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/npc/NpcManager.java b/Plugins/Mineplex.Core/src/mineplex/core/npc/NpcManager.java index 270442f9d..af51e43a3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/npc/NpcManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/npc/NpcManager.java @@ -14,6 +14,7 @@ import java.util.UUID; import net.minecraft.server.v1_7_R4.EntityAgeable; import net.minecraft.server.v1_7_R4.EntityInsentient; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.World.Environment; @@ -27,6 +28,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityCombustEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityTargetEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; @@ -43,6 +45,8 @@ import mineplex.core.common.util.UtilWorld; import mineplex.core.creature.Creature; import mineplex.core.creature.event.CreatureKillEntitiesEvent; import mineplex.core.npc.Commands.NpcCommand; +import mineplex.core.npc.event.NpcDamageByEntityEvent; +import mineplex.core.npc.event.NpcInteractEntityEvent; public class NpcManager extends MiniPlugin { @@ -118,6 +122,23 @@ public class NpcManager extends MiniPlugin } } + @EventHandler(priority = EventPriority.LOWEST) + public void OnEntityDamage(EntityDamageByEntityEvent event) + { + if (_npcs.containsKey(event.getEntity().getUniqueId().toString())) + { + if (event.getDamager() instanceof LivingEntity) + { + NpcDamageByEntityEvent npcEvent = new NpcDamageByEntityEvent((LivingEntity)event.getEntity(), (LivingEntity)event.getDamager()); + + Bukkit.getServer().getPluginManager().callEvent(npcEvent); + } + + event.setCancelled(true); + return; + } + } + @EventHandler(priority = EventPriority.LOWEST) public void OnCreatureKillEntities(CreatureKillEntitiesEvent event) { @@ -225,6 +246,10 @@ public class NpcManager extends MiniPlugin if (_npcs.containsKey(event.getRightClicked().getUniqueId().toString())) { + NpcInteractEntityEvent npcEvent = new NpcInteractEntityEvent((LivingEntity)event.getRightClicked(), event.getPlayer()); + + Bukkit.getServer().getPluginManager().callEvent(npcEvent); + event.setCancelled(true); return; } @@ -521,4 +546,9 @@ public class NpcManager extends MiniPlugin { return _npcs.get(uniqueId.toString()); } + + public boolean isNpc(LivingEntity entity) + { + return _npcs.containsKey(entity.getUniqueId().toString()); + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/npc/event/NpcDamageByEntityEvent.java b/Plugins/Mineplex.Core/src/mineplex/core/npc/event/NpcDamageByEntityEvent.java new file mode 100644 index 000000000..8cf1eb67f --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/npc/event/NpcDamageByEntityEvent.java @@ -0,0 +1,20 @@ +package mineplex.core.npc.event; + +import org.bukkit.entity.LivingEntity; + +public class NpcDamageByEntityEvent extends NpcEvent +{ + private LivingEntity _damager; + + public NpcDamageByEntityEvent(LivingEntity npc, LivingEntity damager) + { + super(npc); + + _damager = damager; + } + + public LivingEntity getDamager() + { + return _damager; + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/npc/event/NpcEvent.java b/Plugins/Mineplex.Core/src/mineplex/core/npc/event/NpcEvent.java new file mode 100644 index 000000000..db48f41ec --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/npc/event/NpcEvent.java @@ -0,0 +1,44 @@ +package mineplex.core.npc.event; + +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class NpcEvent extends Event +{ + private static final HandlerList handlers = new HandlerList(); + + private LivingEntity _npc; + + private boolean _cancelled = false; + + public NpcEvent(LivingEntity npc) + { + _npc = npc; + } + + public HandlerList getHandlers() + { + return handlers; + } + + public static HandlerList getHandlerList() + { + return handlers; + } + + public LivingEntity getNpc() + { + return _npc; + } + + public void setCancelled(boolean cancel) + { + _cancelled = cancel; + } + + public boolean isCancelled() + { + return _cancelled; + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/npc/event/NpcInteractEntityEvent.java b/Plugins/Mineplex.Core/src/mineplex/core/npc/event/NpcInteractEntityEvent.java new file mode 100644 index 000000000..f2370dc57 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/npc/event/NpcInteractEntityEvent.java @@ -0,0 +1,21 @@ +package mineplex.core.npc.event; + +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; + +public class NpcInteractEntityEvent extends NpcEvent +{ + private Player _player; + + public NpcInteractEntityEvent(LivingEntity npc, Player player) + { + super(npc); + + _player = player; + } + + public Player getPlayer() + { + return _player; + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/portal/Commands/ServerCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/portal/Commands/ServerCommand.java index 8f71b331d..c4af9984f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/portal/Commands/ServerCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/portal/Commands/ServerCommand.java @@ -93,7 +93,7 @@ public class ServerCommand extends CommandBase { UtilPlayer.message( player, - F.main(Plugin.GetName(), C.cRed + "You don't have permission to join " + C.cGold + args[0])); + F.main(Plugin.GetName(), C.cRed + "You don't have permission to join " + C.cGold + args[0] + " with /server")); } } }); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferencesShop.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferencesShop.java index 0116f162e..fa948f5b4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferencesShop.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/ui/PreferencesShop.java @@ -10,7 +10,7 @@ import org.bukkit.entity.Player; public class PreferencesShop extends ShopBase { - public PreferencesShop(PreferencesManager plugin, CoreClientManager clientManager, mineplex.core.donation.DonationManager donationManager) + public PreferencesShop(PreferencesManager plugin, CoreClientManager clientManager, mineplex.core.donation.DonationManager donationManager) { super(plugin, clientManager, donationManager, "User Preferences"); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/shop/ShopBase.java b/Plugins/Mineplex.Core/src/mineplex/core/shop/ShopBase.java index 97f69c058..d912758e2 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/shop/ShopBase.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/shop/ShopBase.java @@ -22,6 +22,9 @@ import mineplex.core.account.CoreClientManager; import mineplex.core.common.CurrencyType; import mineplex.core.common.util.NautHashMap; import mineplex.core.donation.DonationManager; +import mineplex.core.npc.NpcManager; +import mineplex.core.npc.event.NpcDamageByEntityEvent; +import mineplex.core.npc.event.NpcInteractEntityEvent; import mineplex.core.shop.page.ShopPageBase; public abstract class ShopBase implements Listener @@ -62,28 +65,22 @@ public abstract class ShopBase implements Listene } @EventHandler(priority = EventPriority.LOWEST) - public void OnPlayerDamageEntity(EntityDamageByEntityEvent event) + public void OnPlayerDamageEntity(NpcDamageByEntityEvent event) { - if (event.getEntity() instanceof LivingEntity) + if (event.getDamager() instanceof Player) { - if (event.getDamager() instanceof Player) - { - if (AttemptShopOpen((Player)event.getDamager(), (LivingEntity)event.getEntity())) - { - event.setCancelled(true); - } - } + if (AttemptShopOpen((Player)event.getDamager(), event.getNpc())) + { + event.setCancelled(true); + } } } @EventHandler(priority = EventPriority.LOWEST) - public void OnPlayerInteractEntity(PlayerInteractEntityEvent event) + public void OnPlayerInteractEntity(NpcInteractEntityEvent event) { - if (event.getRightClicked() instanceof LivingEntity) - { - if (AttemptShopOpen(event.getPlayer(), (LivingEntity)event.getRightClicked())) - event.setCancelled(true); - } + if (AttemptShopOpen(event.getPlayer(), (LivingEntity)event.getNpc())) + event.setCancelled(true); } private boolean AttemptShopOpen(Player player, LivingEntity entity) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/StackerManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/StackerManager.java index 65386a2f2..ddbe36297 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/StackerManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/StackerManager.java @@ -3,7 +3,6 @@ package mineplex.hub.modules; import java.util.HashSet; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.Sound; @@ -14,17 +13,11 @@ import org.bukkit.entity.Horse; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; -import org.bukkit.event.block.Action; -import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.util.Vector; import mineplex.core.MiniPlugin; -import mineplex.core.common.Rank; -import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; @@ -34,8 +27,6 @@ import mineplex.core.common.util.UtilGear; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.event.StackerEvent; -import mineplex.core.itemstack.ItemStackFactory; -import mineplex.core.mount.event.MountActivateEvent; import mineplex.core.projectile.IThrown; import mineplex.core.projectile.ProjectileManager; import mineplex.core.projectile.ProjectileUser; diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java index 9db284f4b..4203e8771 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java @@ -761,4 +761,14 @@ public class ServerManager extends MiniPlugin { return _hubManager; } + + public ShopBase getDrawMyThingShop() + { + return _serverNpcShopMap.get("Draw My Thing"); + } + + public ShopBase getTeamDeathmatchShop() + { + return _serverNpcShopMap.get("Team Deathmatch"); + } } diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java index 3ec401fd4..4e4680c77 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/ServerGameMenu.java @@ -14,24 +14,30 @@ import mineplex.core.donation.DonationManager; import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.shop.page.ShopPageBase; import mineplex.hub.server.ServerManager; +import mineplex.hub.server.ui.button.SelectBHButton; +import mineplex.hub.server.ui.button.SelectBRButton; +import mineplex.hub.server.ui.button.SelectCSButton; +import mineplex.hub.server.ui.button.SelectDMTButton; +import mineplex.hub.server.ui.button.SelectDOMButton; +import mineplex.hub.server.ui.button.SelectMINButton; +import mineplex.hub.server.ui.button.SelectSGButton; +import mineplex.hub.server.ui.button.SelectSSMButton; +import mineplex.hub.server.ui.button.SelectTDMButton; public class ServerGameMenu extends ShopPageBase { private List _superSmashCycle = new ArrayList(); private List _minigameCycle = new ArrayList(); - private List _turfFortsCycle = new ArrayList(); private int _ssmIndex; private int _minigameIndex; - private int _turfFortsIndex; public ServerGameMenu(ServerManager plugin, QuickShop quickShop, CoreClientManager clientManager, DonationManager donationManager, String name, Player player) { - super(plugin, quickShop, clientManager, donationManager, name, player, 9); + super(plugin, quickShop, clientManager, donationManager, name, player, 27); createSuperSmashCycle(); createMinigameCycle(); - createTurfFortsCycle(); BuildPage(); } @@ -39,16 +45,7 @@ public class ServerGameMenu extends ShopPageBase @Override protected void BuildPage() { - this.setItem(1, _superSmashCycle.get(_ssmIndex)); - this.setItem(2, _minigameCycle.get(_minigameIndex)); - this.setItem(3, ItemStackFactory.Instance.CreateStack(Material.IRON_SWORD.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Survival Games " + C.cGray + "Last Man Standing", new String[] - { - ChatColor.RESET + "", - ChatColor.RESET + "Search for chests to find loot and ", - ChatColor.RESET + "fight others to be the last man standing. ", - ChatColor.RESET + "Beware of the deep freeze!", - })); - this.setItem(4, ItemStackFactory.Instance.CreateStack(Material.IRON_PICKAXE.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "The Bridges " + C.cGray + "4 Team Survival", new String[] + this.setItem(1, ItemStackFactory.Instance.CreateStack(Material.IRON_PICKAXE.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "The Bridges " + C.cGray + "4 Team Survival", new String[] { ChatColor.RESET + "", ChatColor.RESET + "4 Teams get 10 minutes to prepare.", @@ -56,7 +53,18 @@ public class ServerGameMenu extends ShopPageBase ChatColor.RESET + "breaks loose as you battle to the", ChatColor.RESET + "death with the other teams.", })); - this.setItem(5, ItemStackFactory.Instance.CreateStack(Material.ANVIL.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Block Hunt " + C.cGray + "Cat and Mouse", new String[] + + this.setItem(3, ItemStackFactory.Instance.CreateStack(Material.IRON_SWORD.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Survival Games " + C.cGray + "Last Man Standing", new String[] + { + ChatColor.RESET + "", + ChatColor.RESET + "Search for chests to find loot and ", + ChatColor.RESET + "fight others to be the last man standing. ", + ChatColor.RESET + "Beware of the deep freeze!", + })); + + this.setItem(5, _superSmashCycle.get(_ssmIndex)); + + this.setItem(7, ItemStackFactory.Instance.CreateStack(Material.ANVIL.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Block Hunt " + C.cGray + "Cat and Mouse", new String[] { ChatColor.RESET + "", ChatColor.RESET + "Hide as blocks/animals, upgrade your ", @@ -64,15 +72,15 @@ public class ServerGameMenu extends ShopPageBase ChatColor.RESET + "the Hunters!", })); - this.setItem(6, ItemStackFactory.Instance.CreateStack(Material.BEACON.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Champions " + C.cGray + "Team Game", new String[] - { + this.setItem(18, ItemStackFactory.Instance.CreateStack(Material.BOOK_AND_QUILL.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Draw My Thing " + C.cGray + "Pictionary!", new String[] + { ChatColor.RESET + "", - ChatColor.RESET + "Customize one of five exciting champions", - ChatColor.RESET + "and battle with the opposing team for the", - ChatColor.RESET + "control points on the map.", + ChatColor.RESET + "Players take turns at drawing a random", + ChatColor.RESET + "word. Whoever guesses it within the time", + ChatColor.RESET + "limit gets some points!", })); - this.setItem(7, ItemStackFactory.Instance.CreateStack(98, (byte)2, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Castle Siege " + C.cGray + "Team Game", new String[] + this.setItem(20, ItemStackFactory.Instance.CreateStack(98, (byte)2, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Castle Siege " + C.cGray + "Team Game", new String[] { ChatColor.RESET + "", ChatColor.RESET + "Defenders must protect King Sparklez", @@ -80,30 +88,34 @@ public class ServerGameMenu extends ShopPageBase ChatColor.RESET + "until the sun rises!", })); - ButtonMap.put(1, new SelectSSMButton(this)); - ButtonMap.put(2, new SelectMINButton(this)); - ButtonMap.put(3, new SelectSGButton(this)); - ButtonMap.put(4, new SelectBRButton(this)); - ButtonMap.put(5, new SelectBHButton(this)); - ButtonMap.put(6, new SelectDOMButton(this)); - ButtonMap.put(7, new SelectCSButton(this)); - } - - private void createTurfFortsCycle() - { - _turfFortsCycle.add(ItemStackFactory.Instance.CreateStack(Material.WOOL.getId(), (byte)11, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Turf Forts " + C.cGray + "Arcade Minigame", new String [] - { + this.setItem(22, ItemStackFactory.Instance.CreateStack(Material.BEACON.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Dominate " + C.cGray + "Team Game", new String[] + { ChatColor.RESET + "", - ChatColor.RESET + "Use your archery skills to kill your", - ChatColor.RESET + "enemies and take over their turf!" + ChatColor.RESET + "Customize one of five exciting champions", + ChatColor.RESET + "and battle with the opposing team for the", + ChatColor.RESET + "control points on the map.", })); - _turfFortsCycle.add(ItemStackFactory.Instance.CreateStack(Material.WOOL.getId(), (byte)14, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Turf Forts " + C.cGray + "Arcade Minigame", new String [] - { - ChatColor.RESET + "", - ChatColor.RESET + "Use your archery skills to kill your", - ChatColor.RESET + "enemies and take over their turf!" - })); + this.setItem(24, ItemStackFactory.Instance.CreateStack(Material.GOLD_SWORD.getId(), (byte)0, 1, ChatColor.RESET + C.Bold + ChatColor.YELLOW + "Team Deathmatch " + C.cGray + "Team Game", new String[] + { + ChatColor.RESET + "", + ChatColor.RESET + "Customize one of five exciting champions", + ChatColor.RESET + "and battle with the opposing team to the", + ChatColor.RESET + "last man standing.", + })); + + this.setItem(26, _minigameCycle.get(_minigameIndex)); + + ButtonMap.put(1, new SelectBRButton(this)); + ButtonMap.put(3, new SelectSGButton(this)); + ButtonMap.put(5, new SelectSSMButton(this)); + ButtonMap.put(7, new SelectBHButton(this)); + + ButtonMap.put(18, new SelectDMTButton(this)); + ButtonMap.put(20, new SelectCSButton(this)); + ButtonMap.put(22, new SelectDOMButton(this)); + ButtonMap.put(24, new SelectTDMButton(this)); + ButtonMap.put(26, new SelectMINButton(this)); } private void createMinigameCycle() @@ -324,7 +336,6 @@ public class ServerGameMenu extends ShopPageBase { _ssmIndex++; _minigameIndex++; - _turfFortsIndex++; if (_ssmIndex >= _superSmashCycle.size()) _ssmIndex = 0; @@ -332,9 +343,6 @@ public class ServerGameMenu extends ShopPageBase if (_minigameIndex >= _minigameCycle.size()) _minigameIndex = 0; - if (_turfFortsIndex >= _turfFortsCycle.size()) - _turfFortsIndex = 0; - BuildPage(); } @@ -372,4 +380,14 @@ public class ServerGameMenu extends ShopPageBase { Plugin.getSurvivalGamesShop().attemptShopOpen(player); } + + public void openDMT(Player player) + { + Plugin.getDrawMyThingShop().attemptShopOpen(player); + } + + public void OpenTDM(Player player) + { + Plugin.getTeamDeathmatchShop().attemptShopOpen(player); + } } diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectBHButton.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectBHButton.java similarity index 82% rename from Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectBHButton.java rename to Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectBHButton.java index 153ff276f..4f90b6f58 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectBHButton.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectBHButton.java @@ -1,8 +1,9 @@ -package mineplex.hub.server.ui; +package mineplex.hub.server.ui.button; import org.bukkit.entity.Player; import mineplex.core.shop.item.IButton; +import mineplex.hub.server.ui.ServerGameMenu; public class SelectBHButton implements IButton { diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectBRButton.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectBRButton.java similarity index 82% rename from Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectBRButton.java rename to Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectBRButton.java index 966cca52c..7c31ed4a7 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectBRButton.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectBRButton.java @@ -1,8 +1,9 @@ -package mineplex.hub.server.ui; +package mineplex.hub.server.ui.button; import org.bukkit.entity.Player; import mineplex.core.shop.item.IButton; +import mineplex.hub.server.ui.ServerGameMenu; public class SelectBRButton implements IButton { diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectCSButton.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectCSButton.java similarity index 82% rename from Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectCSButton.java rename to Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectCSButton.java index 1034f5689..185e42d7e 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectCSButton.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectCSButton.java @@ -1,8 +1,9 @@ -package mineplex.hub.server.ui; +package mineplex.hub.server.ui.button; import org.bukkit.entity.Player; import mineplex.core.shop.item.IButton; +import mineplex.hub.server.ui.ServerGameMenu; public class SelectCSButton implements IButton { diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectDMTButton.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectDMTButton.java new file mode 100644 index 000000000..b310df634 --- /dev/null +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectDMTButton.java @@ -0,0 +1,28 @@ +package mineplex.hub.server.ui.button; + +import org.bukkit.entity.Player; + +import mineplex.core.shop.item.IButton; +import mineplex.hub.server.ui.ServerGameMenu; + +public class SelectDMTButton implements IButton +{ + private ServerGameMenu _menu; + + public SelectDMTButton(ServerGameMenu menu) + { + _menu = menu; + } + + @Override + public void ClickedLeft(Player player) + { + _menu.openDMT(player); + } + + @Override + public void ClickedRight(Player player) + { + ClickedLeft(player); + } +} diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectDOMButton.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectDOMButton.java similarity index 82% rename from Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectDOMButton.java rename to Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectDOMButton.java index bbc3a7db7..a6523f3d9 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectDOMButton.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectDOMButton.java @@ -1,8 +1,9 @@ -package mineplex.hub.server.ui; +package mineplex.hub.server.ui.button; import org.bukkit.entity.Player; import mineplex.core.shop.item.IButton; +import mineplex.hub.server.ui.ServerGameMenu; public class SelectDOMButton implements IButton { diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectMINButton.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectMINButton.java similarity index 82% rename from Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectMINButton.java rename to Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectMINButton.java index 3ce476d5e..99aad932d 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectMINButton.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectMINButton.java @@ -1,8 +1,9 @@ -package mineplex.hub.server.ui; +package mineplex.hub.server.ui.button; import org.bukkit.entity.Player; import mineplex.core.shop.item.IButton; +import mineplex.hub.server.ui.ServerGameMenu; public class SelectMINButton implements IButton { diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectSGButton.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectSGButton.java similarity index 82% rename from Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectSGButton.java rename to Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectSGButton.java index e918dee3e..ceca7fc55 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectSGButton.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectSGButton.java @@ -1,8 +1,9 @@ -package mineplex.hub.server.ui; +package mineplex.hub.server.ui.button; import org.bukkit.entity.Player; import mineplex.core.shop.item.IButton; +import mineplex.hub.server.ui.ServerGameMenu; public class SelectSGButton implements IButton { diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectSSMButton.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectSSMButton.java similarity index 82% rename from Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectSSMButton.java rename to Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectSSMButton.java index 0af74d7e4..b4cd28f25 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/SelectSSMButton.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectSSMButton.java @@ -1,8 +1,9 @@ -package mineplex.hub.server.ui; +package mineplex.hub.server.ui.button; import org.bukkit.entity.Player; import mineplex.core.shop.item.IButton; +import mineplex.hub.server.ui.ServerGameMenu; public class SelectSSMButton implements IButton { diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectTDMButton.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectTDMButton.java new file mode 100644 index 000000000..c4aca5e28 --- /dev/null +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/button/SelectTDMButton.java @@ -0,0 +1,28 @@ +package mineplex.hub.server.ui.button; + +import org.bukkit.entity.Player; + +import mineplex.core.shop.item.IButton; +import mineplex.hub.server.ui.ServerGameMenu; + +public class SelectTDMButton implements IButton +{ + private ServerGameMenu _menu; + + public SelectTDMButton(ServerGameMenu menu) + { + _menu = menu; + } + + @Override + public void ClickedLeft(Player player) + { + _menu.OpenTDM(player); + } + + @Override + public void ClickedRight(Player player) + { + ClickedLeft(player); + } +} diff --git a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java index 6d9a2918f..c43893973 100644 --- a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java +++ b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java @@ -89,12 +89,12 @@ public class ServerMonitor { if (isServerOffline(serverData)) { - System.out.println("------=[OFFLINE]=------=[" + serverData.getName() + ":" + serverData.getPublicAddress() + "]=------=[OFFLINE]=------"); + log("------=[OFFLINE]=------=[" + serverData.getName() + ":" + serverData.getPublicAddress() + "]=------=[OFFLINE]=------"); _badServers.put(serverData.getName(), true); } } - System.out.println(_badServers.size() + " bad servers."); + log(_badServers.size() + " bad servers."); } for (Iterator iterator = dedicatedServers.iterator(); iterator.hasNext();) @@ -128,7 +128,7 @@ public class ServerMonitor onlineServers.add(minecraftServer.getName()); if (minecraftServer.getTps() <= 17) - System.out.println("[Performance] " + minecraftServer.getName() + ":" + minecraftServer.getPublicAddress() + "] Running poorly at " + minecraftServer.getTps() + " TPS"); + log("[Performance] " + minecraftServer.getName() + ":" + minecraftServer.getPublicAddress() + "] Running poorly at " + minecraftServer.getTps() + " TPS"); } for (Iterator>> iterator = serverTracker.entrySet().iterator(); iterator.hasNext();) @@ -176,7 +176,7 @@ public class ServerMonitor { try { - System.out.println("Sleeping while processes run..."); + log("Sleeping while processes run..."); Thread.sleep(6000); } catch (InterruptedException e) @@ -187,7 +187,7 @@ public class ServerMonitor if (processWaits >= 10) { - System.out.println("Killing stale processes."); + log("Killing stale processes."); for (Iterator iterator = _processes.iterator(); iterator.hasNext();) { @@ -203,7 +203,7 @@ public class ServerMonitor try { - System.out.println("Natural sleep."); + log("Natural sleep."); Thread.sleep(10000); } catch (InterruptedException e) @@ -290,9 +290,9 @@ public class ServerMonitor if (announce) { if (error) - System.out.println("[" + serverName + ":" + serverAddress + "] Kill errored."); + log("[" + serverName + ":" + serverAddress + "] Kill errored."); else - System.out.println(message); + log(message); } } }); @@ -385,9 +385,9 @@ public class ServerMonitor public void run(Boolean error) { if (error) - System.out.println("[" + serverName + ":" + serverAddress + "] Errored " + serverName + "(" + groupPrefix+ "-" + serverNum + (free ? "-FREE" : "") + ")"); + log("[" + serverName + ":" + serverAddress + "] Errored " + serverName + "(" + groupPrefix+ "-" + serverNum + (free ? "-FREE" : "") + ")"); else - System.out.println("[" + serverName + ":" + serverAddress + "] Added " + serverName + "(" + groupPrefix+ "-" + serverNum + (free ? "-FREE" : "") + ")"); + log("[" + serverName + ":" + serverAddress + "] Added " + serverName + "(" + groupPrefix+ "-" + serverNum + (free ? "-FREE" : "") + ")"); } }); diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/RankCommand.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/RankCommand.java index afe63edd9..70afd046b 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/RankCommand.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/RankCommand.java @@ -24,7 +24,12 @@ public class RankCommand extends CommandBase String rank = args[1]; boolean perm = Boolean.parseBoolean(args[2]); - Plugin.getClientManager().SaveRank(playerName, mineplex.core.common.Rank.valueOf(rank), perm); - caller.sendMessage(F.main(Plugin.GetName(), playerName + "'s rank has been updated to " + rank + "!")); + final Rank rankEnum = Rank.valueOf(rank); + + if (rankEnum == Rank.HERO || rankEnum == Rank.ULTRA) + { + Plugin.getClientManager().SaveRank(playerName, mineplex.core.common.Rank.valueOf(rank), perm); + caller.sendMessage(F.main(Plugin.GetName(), playerName + "'s rank has been updated to " + rank + "!")); + } } } diff --git a/Plugins/Nautilus.Core.CraftBukkit/src/net/minecraft/server/v1_7_R4/NetworkManager.java b/Plugins/Nautilus.Core.CraftBukkit/src/net/minecraft/server/v1_7_R4/NetworkManager.java new file mode 100644 index 000000000..c70894293 --- /dev/null +++ b/Plugins/Nautilus.Core.CraftBukkit/src/net/minecraft/server/v1_7_R4/NetworkManager.java @@ -0,0 +1,308 @@ +package net.minecraft.server.v1_7_R4; + +import java.net.SocketAddress; +import java.util.Queue; +import javax.crypto.SecretKey; + +import net.minecraft.util.com.google.common.collect.Queues; +import net.minecraft.util.com.google.common.util.concurrent.ThreadFactoryBuilder; +import net.minecraft.util.com.mojang.authlib.properties.Property; +import net.minecraft.util.io.netty.channel.Channel; +import net.minecraft.util.io.netty.channel.ChannelFutureListener; +import net.minecraft.util.io.netty.channel.ChannelHandlerContext; +import net.minecraft.util.io.netty.channel.SimpleChannelInboundHandler; +import net.minecraft.util.io.netty.channel.local.LocalChannel; +import net.minecraft.util.io.netty.channel.local.LocalServerChannel; +import net.minecraft.util.io.netty.channel.nio.NioEventLoopGroup; +import net.minecraft.util.io.netty.handler.timeout.TimeoutException; +import net.minecraft.util.io.netty.util.AttributeKey; +import net.minecraft.util.io.netty.util.concurrent.GenericFutureListener; +import net.minecraft.util.org.apache.commons.lang3.Validate; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.MarkerManager; +// Spigot start +import com.google.common.collect.ImmutableSet; + +// Spigot end + +public class NetworkManager extends SimpleChannelInboundHandler +{ + + private static final Logger i = LogManager.getLogger(); + public static final Marker a = MarkerManager.getMarker("NETWORK"); + public static final Marker b = MarkerManager.getMarker("NETWORK_PACKETS", a); + public static final Marker c = MarkerManager.getMarker("NETWORK_STAT", a); + public static final AttributeKey d = new AttributeKey("protocol"); + public static final AttributeKey e = new AttributeKey("receivable_packets"); + public static final AttributeKey f = new AttributeKey("sendable_packets"); + public static final NioEventLoopGroup g = new NioEventLoopGroup(0, (new ThreadFactoryBuilder()) + .setNameFormat("Netty Client IO #%d").setDaemon(true).build()); + public static final NetworkStatistics h = new NetworkStatistics(); + private final boolean j; + private final Queue k = Queues.newConcurrentLinkedQueue(); + private final Queue l = Queues.newConcurrentLinkedQueue(); + private Channel m; + // Spigot Start + public SocketAddress n; + public java.util.UUID spoofedUUID; + public Property[] spoofedProfile; + public boolean preparing = true; + // Spigot End + private PacketListener o; + private EnumProtocol p; + private IChatBaseComponent q; + private boolean r; + // Spigot Start + public static final AttributeKey protocolVersion = new AttributeKey("protocol_version"); + public static final ImmutableSet SUPPORTED_VERSIONS = ImmutableSet.of(4, 5); + public static final int CURRENT_VERSION = 5; + + public static int getVersion(Channel attr) + { + Integer ver = attr.attr(protocolVersion).get(); + return (ver != null) ? ver : CURRENT_VERSION; + } + + public int getVersion() + { + return getVersion(this.m); + } + + // Spigot End + + public NetworkManager(boolean flag) + { + this.j = flag; + } + + public void channelActive(ChannelHandlerContext channelhandlercontext) throws Exception + { // CraftBukkit - throws Exception + super.channelActive(channelhandlercontext); + this.m = channelhandlercontext.channel(); + this.n = this.m.remoteAddress(); + // Spigot Start + this.preparing = false; + // Spigot End + this.a(EnumProtocol.HANDSHAKING); + } + + public void a(EnumProtocol enumprotocol) + { + this.p = (EnumProtocol) this.m.attr(d).getAndSet(enumprotocol); + this.m.attr(e).set(enumprotocol.a(this.j)); + this.m.attr(f).set(enumprotocol.b(this.j)); + this.m.config().setAutoRead(true); + i.debug("Enabled auto read"); + } + + public void channelInactive(ChannelHandlerContext channelhandlercontext) + { + this.close(new ChatMessage("disconnect.endOfStream", new Object[0])); + } + + public void exceptionCaught(ChannelHandlerContext channelhandlercontext, Throwable throwable) + { + ChatMessage chatmessage; + + if (throwable instanceof TimeoutException) + { + chatmessage = new ChatMessage("disconnect.timeout", new Object[0]); + } + else + { + chatmessage = new ChatMessage("disconnect.genericReason", + new Object[] { "Internal Exception: " + throwable }); + } + + this.close(chatmessage); + if (MinecraftServer.getServer().isDebugging()) + { + throwable.printStackTrace(); // Spigot + System.out.println("------------"); + for (StackTraceElement trace : Thread.currentThread().getStackTrace()) + { + System.out.println(trace); + } + } + } + + protected void a(ChannelHandlerContext channelhandlercontext, Packet packet) + { + if (this.m.isOpen()) + { + if (packet.a()) + { + packet.handle(this.o); + } + else + { + this.k.add(packet); + } + } + } + + public void a(PacketListener packetlistener) + { + Validate.notNull(packetlistener, "packetListener", new Object[0]); + i.debug("Set listener of {} to {}", new Object[] { this, packetlistener }); + this.o = packetlistener; + } + + public void handle(Packet packet, GenericFutureListener... agenericfuturelistener) + { + if (this.m != null && this.m.isOpen()) + { + this.i(); + this.b(packet, agenericfuturelistener); + } + else + { + this.l.add(new QueuedPacket(packet, agenericfuturelistener)); + } + } + + private void b(Packet packet, GenericFutureListener[] agenericfuturelistener) + { + EnumProtocol enumprotocol = EnumProtocol.a(packet); + EnumProtocol enumprotocol1 = (EnumProtocol) this.m.attr(d).get(); + + if (enumprotocol1 != enumprotocol) + { + i.debug("Disabled auto read"); + this.m.config().setAutoRead(false); + } + + if (this.m.eventLoop().inEventLoop()) + { + if (enumprotocol != enumprotocol1) + { + this.a(enumprotocol); + } + + this.m.writeAndFlush(packet).addListeners(agenericfuturelistener) + .addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE); + } + else + { + this.m.eventLoop().execute( + new QueuedProtocolSwitch(this, enumprotocol, enumprotocol1, packet, agenericfuturelistener)); + } + } + + private void i() + { + if (this.m != null && this.m.isOpen()) + { + while (!this.l.isEmpty()) + { + QueuedPacket queuedpacket = (QueuedPacket) this.l.poll(); + + this.b(QueuedPacket.a(queuedpacket), QueuedPacket.b(queuedpacket)); + } + } + } + + public void a() + { + this.i(); + EnumProtocol enumprotocol = (EnumProtocol) this.m.attr(d).get(); + + if (this.p != enumprotocol) + { + if (this.p != null) + { + this.o.a(this.p, enumprotocol); + } + + this.p = enumprotocol; + } + + if (this.o != null) + { + for (int i = 1000; !this.k.isEmpty() && i >= 0; --i) + { + Packet packet = (Packet) this.k.poll(); + + // CraftBukkit start + if (!this.isConnected() || !this.m.config().isAutoRead()) + { + continue; + } + // CraftBukkit end + packet.handle(this.o); + } + + this.o.a(); + } + + this.m.flush(); + } + + public SocketAddress getSocketAddress() + { + return this.n; + } + + public void close(IChatBaseComponent ichatbasecomponent) + { + // Spigot Start + this.preparing = false; + // Spigot End + if (this.m.isOpen()) + { + this.m.close(); + this.q = ichatbasecomponent; + } + } + + public boolean c() + { + return this.m instanceof LocalChannel || this.m instanceof LocalServerChannel; + } + + public void a(SecretKey secretkey) + { + this.m.pipeline().addBefore("splitter", "decrypt", new PacketDecrypter(MinecraftEncryption.a(2, secretkey))); + this.m.pipeline().addBefore("prepender", "encrypt", new PacketEncrypter(MinecraftEncryption.a(1, secretkey))); + this.r = true; + } + + public boolean isConnected() + { + return this.m != null && this.m.isOpen(); + } + + public PacketListener getPacketListener() + { + return this.o; + } + + public IChatBaseComponent f() + { + return this.q; + } + + public void g() + { + this.m.config().setAutoRead(false); + } + + protected void channelRead0(ChannelHandlerContext channelhandlercontext, Object object) + { + this.a(channelhandlercontext, (Packet) object); + } + + static Channel a(NetworkManager networkmanager) + { + return networkmanager.m; + } + + // Spigot Start + public SocketAddress getRawAddress() + { + return this.m.remoteAddress(); + } + // Spigot End +} diff --git a/Plugins/Nautilus.Core.CraftBukkit/src/net/minecraft/server/v1_7_R4/PacketDataSerializer.java b/Plugins/Nautilus.Core.CraftBukkit/src/net/minecraft/server/v1_7_R4/PacketDataSerializer.java new file mode 100644 index 000000000..4508f313c --- /dev/null +++ b/Plugins/Nautilus.Core.CraftBukkit/src/net/minecraft/server/v1_7_R4/PacketDataSerializer.java @@ -0,0 +1,922 @@ +package net.minecraft.server.v1_7_R4; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.channels.GatheringByteChannel; +import java.nio.channels.ScatteringByteChannel; +import java.nio.charset.Charset; + +import net.minecraft.util.com.google.common.base.Charsets; +import net.minecraft.util.io.netty.buffer.ByteBuf; +import net.minecraft.util.io.netty.buffer.ByteBufAllocator; +import net.minecraft.util.io.netty.buffer.ByteBufProcessor; + +import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftItemStack; // CraftBukkit + +public class PacketDataSerializer extends ByteBuf +{ + + private final ByteBuf a; + // Spigot Start + public final int version; + + public PacketDataSerializer(ByteBuf bytebuf) + { + this(bytebuf, NetworkManager.CURRENT_VERSION); + } + + public PacketDataSerializer(ByteBuf bytebuf, int version) + { + this.a = bytebuf; + this.version = version; + } + + // Spigot End + + public static int a(int i) + { + return (i & -128) == 0 ? 1 : ((i & -16384) == 0 ? 2 : ((i & -2097152) == 0 ? 3 + : ((i & -268435456) == 0 ? 4 : 5))); + } + + public int a() + { + int i = 0; + int j = 0; + + byte b0; + + do + { + b0 = this.readByte(); + i |= (b0 & 127) << j++ * 7; + if (j > 5) + { + throw new RuntimeException("VarInt too big"); + } + } + while ((b0 & 128) == 128); + + return i; + } + + public void b(int i) + { + while ((i & -128) != 0) + { + this.writeByte(i & 127 | 128); + i >>>= 7; + } + + this.writeByte(i); + } + + public void a(NBTTagCompound nbttagcompound) + { + if (nbttagcompound == null) + { + this.writeShort(-1); + } + else + { + byte[] abyte = NBTCompressedStreamTools.a(nbttagcompound); + + this.writeShort((short) abyte.length); + this.writeBytes(abyte); + } + } + + public NBTTagCompound b() + { + short short1 = this.readShort(); + + if (short1 < 0) + { + return null; + } + else + { + byte[] abyte = new byte[short1]; + + this.readBytes(abyte); + return NBTCompressedStreamTools.a(abyte, new NBTReadLimiter(2097152L)); + } + } + + public void a(ItemStack itemstack) + { + if (itemstack == null || itemstack.getItem() == null) + { // CraftBukkit - NPE fix itemstack.getItem() + this.writeShort(-1); + } + else + { + this.writeShort(Item.getId(itemstack.getItem())); + this.writeByte(itemstack.count); + this.writeShort(itemstack.getData()); + NBTTagCompound nbttagcompound = null; + + if (itemstack.getItem().usesDurability() || itemstack.getItem().s()) + { + nbttagcompound = itemstack.tag; + } + + this.a(nbttagcompound); + } + } + + public ItemStack c() + { + ItemStack itemstack = null; + short short1 = this.readShort(); + + if (short1 >= 0) + { + byte b0 = this.readByte(); + short short2 = this.readShort(); + + itemstack = new ItemStack(Item.getById(short1), b0, short2); + itemstack.tag = this.b(); + // CraftBukkit start + if (itemstack.tag != null) + { + CraftItemStack.setItemMeta(itemstack, CraftItemStack.getItemMeta(itemstack)); + } + // CraftBukkit end + } + + return itemstack; + } + + public String c(int i) throws IOException + { // CraftBukkit - throws IOException + int j = this.a(); + + if (j > i * 4) + { + throw new IOException("The received encoded string buffer length is longer than maximum allowed (" + j + + " > " + i * 4 + ")"); + } + else if (j < 0) + { + throw new IOException("The received encoded string buffer length is less than zero! Weird string!"); + } + else + { + String s = new String(this.readBytes(j).array(), Charsets.UTF_8); + + if (s.length() > i) + { + throw new IOException("The received string length is longer than maximum allowed (" + j + " > " + i + + ")"); + } + else + { + return s; + } + } + } + + public void a(String s) throws IOException + { // CraftBukkit - throws IOException + byte[] abyte = s.getBytes(Charsets.UTF_8); + + if (abyte.length > 32767) + { + throw new IOException("String too big (was " + s.length() + " bytes encoded, max " + 32767 + ")"); + } + else + { + this.b(abyte.length); + this.writeBytes(abyte); + } + } + + public int capacity() + { + return this.a.capacity(); + } + + public ByteBuf capacity(int i) + { + return this.a.capacity(i); + } + + public int maxCapacity() + { + return this.a.maxCapacity(); + } + + public ByteBufAllocator alloc() + { + return this.a.alloc(); + } + + public ByteOrder order() + { + return this.a.order(); + } + + public ByteBuf order(ByteOrder byteorder) + { + return this.a.order(byteorder); + } + + public ByteBuf unwrap() + { + return this.a.unwrap(); + } + + public boolean isDirect() + { + return this.a.isDirect(); + } + + public int readerIndex() + { + return this.a.readerIndex(); + } + + public ByteBuf readerIndex(int i) + { + return this.a.readerIndex(i); + } + + public int writerIndex() + { + return this.a.writerIndex(); + } + + public ByteBuf writerIndex(int i) + { + return this.a.writerIndex(i); + } + + public ByteBuf setIndex(int i, int j) + { + return this.a.setIndex(i, j); + } + + public int readableBytes() + { + return this.a.readableBytes(); + } + + public int writableBytes() + { + return this.a.writableBytes(); + } + + public int maxWritableBytes() + { + return this.a.maxWritableBytes(); + } + + public boolean isReadable() + { + return this.a.isReadable(); + } + + public boolean isReadable(int i) + { + return this.a.isReadable(i); + } + + public boolean isWritable() + { + return this.a.isWritable(); + } + + public boolean isWritable(int i) + { + return this.a.isWritable(i); + } + + public ByteBuf clear() + { + return this.a.clear(); + } + + public ByteBuf markReaderIndex() + { + return this.a.markReaderIndex(); + } + + public ByteBuf resetReaderIndex() + { + return this.a.resetReaderIndex(); + } + + public ByteBuf markWriterIndex() + { + return this.a.markWriterIndex(); + } + + public ByteBuf resetWriterIndex() + { + return this.a.resetWriterIndex(); + } + + public ByteBuf discardReadBytes() + { + return this.a.discardReadBytes(); + } + + public ByteBuf discardSomeReadBytes() + { + return this.a.discardSomeReadBytes(); + } + + public ByteBuf ensureWritable(int i) + { + return this.a.ensureWritable(i); + } + + public int ensureWritable(int i, boolean flag) + { + return this.a.ensureWritable(i, flag); + } + + public boolean getBoolean(int i) + { + return this.a.getBoolean(i); + } + + public byte getByte(int i) + { + return this.a.getByte(i); + } + + public short getUnsignedByte(int i) + { + return this.a.getUnsignedByte(i); + } + + public short getShort(int i) + { + return this.a.getShort(i); + } + + public int getUnsignedShort(int i) + { + return this.a.getUnsignedShort(i); + } + + public int getMedium(int i) + { + return this.a.getMedium(i); + } + + public int getUnsignedMedium(int i) + { + return this.a.getUnsignedMedium(i); + } + + public int getInt(int i) + { + return this.a.getInt(i); + } + + public long getUnsignedInt(int i) + { + return this.a.getUnsignedInt(i); + } + + public long getLong(int i) + { + return this.a.getLong(i); + } + + public char getChar(int i) + { + return this.a.getChar(i); + } + + public float getFloat(int i) + { + return this.a.getFloat(i); + } + + public double getDouble(int i) + { + return this.a.getDouble(i); + } + + public ByteBuf getBytes(int i, ByteBuf bytebuf) + { + return this.a.getBytes(i, bytebuf); + } + + public ByteBuf getBytes(int i, ByteBuf bytebuf, int j) + { + return this.a.getBytes(i, bytebuf, j); + } + + public ByteBuf getBytes(int i, ByteBuf bytebuf, int j, int k) + { + return this.a.getBytes(i, bytebuf, j, k); + } + + public ByteBuf getBytes(int i, byte[] abyte) + { + return this.a.getBytes(i, abyte); + } + + public ByteBuf getBytes(int i, byte[] abyte, int j, int k) + { + return this.a.getBytes(i, abyte, j, k); + } + + public ByteBuf getBytes(int i, ByteBuffer bytebuffer) + { + return this.a.getBytes(i, bytebuffer); + } + + public ByteBuf getBytes(int i, OutputStream outputstream, int j) throws IOException + { // CraftBukkit - throws IOException + return this.a.getBytes(i, outputstream, j); + } + + public int getBytes(int i, GatheringByteChannel gatheringbytechannel, int j) throws IOException + { // CraftBukkit - throws IOException + return this.a.getBytes(i, gatheringbytechannel, j); + } + + public ByteBuf setBoolean(int i, boolean flag) + { + return this.a.setBoolean(i, flag); + } + + public ByteBuf setByte(int i, int j) + { + return this.a.setByte(i, j); + } + + public ByteBuf setShort(int i, int j) + { + return this.a.setShort(i, j); + } + + public ByteBuf setMedium(int i, int j) + { + return this.a.setMedium(i, j); + } + + public ByteBuf setInt(int i, int j) + { + return this.a.setInt(i, j); + } + + public ByteBuf setLong(int i, long j) + { + return this.a.setLong(i, j); + } + + public ByteBuf setChar(int i, int j) + { + return this.a.setChar(i, j); + } + + public ByteBuf setFloat(int i, float f) + { + return this.a.setFloat(i, f); + } + + public ByteBuf setDouble(int i, double d0) + { + return this.a.setDouble(i, d0); + } + + public ByteBuf setBytes(int i, ByteBuf bytebuf) + { + return this.a.setBytes(i, bytebuf); + } + + public ByteBuf setBytes(int i, ByteBuf bytebuf, int j) + { + return this.a.setBytes(i, bytebuf, j); + } + + public ByteBuf setBytes(int i, ByteBuf bytebuf, int j, int k) + { + return this.a.setBytes(i, bytebuf, j, k); + } + + public ByteBuf setBytes(int i, byte[] abyte) + { + return this.a.setBytes(i, abyte); + } + + public ByteBuf setBytes(int i, byte[] abyte, int j, int k) + { + return this.a.setBytes(i, abyte, j, k); + } + + public ByteBuf setBytes(int i, ByteBuffer bytebuffer) + { + return this.a.setBytes(i, bytebuffer); + } + + public int setBytes(int i, InputStream inputstream, int j) throws IOException + { // CraftBukkit - throws IOException + return this.a.setBytes(i, inputstream, j); + } + + public int setBytes(int i, ScatteringByteChannel scatteringbytechannel, int j) throws IOException + { // CraftBukkit - throws IOException + return this.a.setBytes(i, scatteringbytechannel, j); + } + + public ByteBuf setZero(int i, int j) + { + return this.a.setZero(i, j); + } + + public boolean readBoolean() + { + return this.a.readBoolean(); + } + + public byte readByte() + { + return this.a.readByte(); + } + + public short readUnsignedByte() + { + return this.a.readUnsignedByte(); + } + + public short readShort() + { + return this.a.readShort(); + } + + public int readUnsignedShort() + { + return this.a.readUnsignedShort(); + } + + public int readMedium() + { + return this.a.readMedium(); + } + + public int readUnsignedMedium() + { + return this.a.readUnsignedMedium(); + } + + public int readInt() + { + return this.a.readInt(); + } + + public long readUnsignedInt() + { + return this.a.readUnsignedInt(); + } + + public long readLong() + { + return this.a.readLong(); + } + + public char readChar() + { + return this.a.readChar(); + } + + public float readFloat() + { + return this.a.readFloat(); + } + + public double readDouble() + { + return this.a.readDouble(); + } + + public ByteBuf readBytes(int i) + { + return this.a.readBytes(i); + } + + public ByteBuf readSlice(int i) + { + return this.a.readSlice(i); + } + + public ByteBuf readBytes(ByteBuf bytebuf) + { + return this.a.readBytes(bytebuf); + } + + public ByteBuf readBytes(ByteBuf bytebuf, int i) + { + return this.a.readBytes(bytebuf, i); + } + + public ByteBuf readBytes(ByteBuf bytebuf, int i, int j) + { + return this.a.readBytes(bytebuf, i, j); + } + + public ByteBuf readBytes(byte[] abyte) + { + return this.a.readBytes(abyte); + } + + public ByteBuf readBytes(byte[] abyte, int i, int j) + { + return this.a.readBytes(abyte, i, j); + } + + public ByteBuf readBytes(ByteBuffer bytebuffer) + { + return this.a.readBytes(bytebuffer); + } + + public ByteBuf readBytes(OutputStream outputstream, int i) throws IOException + { // CraftBukkit - throws IOException + return this.a.readBytes(outputstream, i); + } + + public int readBytes(GatheringByteChannel gatheringbytechannel, int i) throws IOException + { // CraftBukkit - throws IOException + return this.a.readBytes(gatheringbytechannel, i); + } + + public ByteBuf skipBytes(int i) + { + return this.a.skipBytes(i); + } + + public ByteBuf writeBoolean(boolean flag) + { + return this.a.writeBoolean(flag); + } + + public ByteBuf writeByte(int i) + { + return this.a.writeByte(i); + } + + public ByteBuf writeShort(int i) + { + return this.a.writeShort(i); + } + + public ByteBuf writeMedium(int i) + { + return this.a.writeMedium(i); + } + + public ByteBuf writeInt(int i) + { + return this.a.writeInt(i); + } + + public ByteBuf writeLong(long i) + { + return this.a.writeLong(i); + } + + public ByteBuf writeChar(int i) + { + return this.a.writeChar(i); + } + + public ByteBuf writeFloat(float f) + { + return this.a.writeFloat(f); + } + + public ByteBuf writeDouble(double d0) + { + return this.a.writeDouble(d0); + } + + public ByteBuf writeBytes(ByteBuf bytebuf) + { + return this.a.writeBytes(bytebuf); + } + + public ByteBuf writeBytes(ByteBuf bytebuf, int i) + { + return this.a.writeBytes(bytebuf, i); + } + + public ByteBuf writeBytes(ByteBuf bytebuf, int i, int j) + { + return this.a.writeBytes(bytebuf, i, j); + } + + public ByteBuf writeBytes(byte[] abyte) + { + return this.a.writeBytes(abyte); + } + + public ByteBuf writeBytes(byte[] abyte, int i, int j) + { + return this.a.writeBytes(abyte, i, j); + } + + public ByteBuf writeBytes(ByteBuffer bytebuffer) + { + return this.a.writeBytes(bytebuffer); + } + + public int writeBytes(InputStream inputstream, int i) throws IOException + { // CraftBukkit - throws IOException + return this.a.writeBytes(inputstream, i); + } + + public int writeBytes(ScatteringByteChannel scatteringbytechannel, int i) throws IOException + { // CraftBukkit - throws IOException + return this.a.writeBytes(scatteringbytechannel, i); + } + + public ByteBuf writeZero(int i) + { + return this.a.writeZero(i); + } + + public int indexOf(int i, int j, byte b0) + { + return this.a.indexOf(i, j, b0); + } + + public int bytesBefore(byte b0) + { + return this.a.bytesBefore(b0); + } + + public int bytesBefore(int i, byte b0) + { + return this.a.bytesBefore(i, b0); + } + + public int bytesBefore(int i, int j, byte b0) + { + return this.a.bytesBefore(i, j, b0); + } + + public int forEachByte(ByteBufProcessor bytebufprocessor) + { + return this.a.forEachByte(bytebufprocessor); + } + + public int forEachByte(int i, int j, ByteBufProcessor bytebufprocessor) + { + return this.a.forEachByte(i, j, bytebufprocessor); + } + + public int forEachByteDesc(ByteBufProcessor bytebufprocessor) + { + return this.a.forEachByteDesc(bytebufprocessor); + } + + public int forEachByteDesc(int i, int j, ByteBufProcessor bytebufprocessor) + { + return this.a.forEachByteDesc(i, j, bytebufprocessor); + } + + public ByteBuf copy() + { + return this.a.copy(); + } + + public ByteBuf copy(int i, int j) + { + return this.a.copy(i, j); + } + + public ByteBuf slice() + { + return this.a.slice(); + } + + public ByteBuf slice(int i, int j) + { + return this.a.slice(i, j); + } + + public ByteBuf duplicate() + { + return this.a.duplicate(); + } + + public int nioBufferCount() + { + return this.a.nioBufferCount(); + } + + public ByteBuffer nioBuffer() + { + return this.a.nioBuffer(); + } + + public ByteBuffer nioBuffer(int i, int j) + { + return this.a.nioBuffer(i, j); + } + + public ByteBuffer internalNioBuffer(int i, int j) + { + return this.a.internalNioBuffer(i, j); + } + + public ByteBuffer[] nioBuffers() + { + return this.a.nioBuffers(); + } + + public ByteBuffer[] nioBuffers(int i, int j) + { + return this.a.nioBuffers(i, j); + } + + public boolean hasArray() + { + return this.a.hasArray(); + } + + public byte[] array() + { + return this.a.array(); + } + + public int arrayOffset() + { + return this.a.arrayOffset(); + } + + public boolean hasMemoryAddress() + { + return this.a.hasMemoryAddress(); + } + + public long memoryAddress() + { + return this.a.memoryAddress(); + } + + public String toString(Charset charset) + { + return this.a.toString(charset); + } + + public String toString(int i, int j, Charset charset) + { + return this.a.toString(i, j, charset); + } + + public int hashCode() + { + return this.a.hashCode(); + } + + public boolean equals(Object object) + { + return this.a.equals(object); + } + + public int compareTo(ByteBuf bytebuf) + { + return this.a.compareTo(bytebuf); + } + + public String toString() + { + return this.a.toString(); + } + + public ByteBuf retain(int i) + { + return this.a.retain(i); + } + + public ByteBuf retain() + { + return this.a.retain(); + } + + public int refCnt() + { + return this.a.refCnt(); + } + + public boolean release() + { + return this.a.release(); + } + + public boolean release(int i) + { + return this.a.release(i); + } +} From 137b8692e433044dbefcd480f67267dd0d40e55f Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Tue, 26 Aug 2014 00:33:48 -0700 Subject: [PATCH 2/4] Added Gem booster use. --- .../core/cosmetic/CosmeticManager.java | 4 +- .../event/ActivateGemBoosterEvent.java | 44 +++++++++++ .../core/cosmetic/ui/CosmeticShop.java | 15 +++- .../mineplex/core/cosmetic/ui/page/Menu.java | 78 ++++++++++++------- .../mineplex/core/inventory/GemBooster.java | 7 +- .../src/mineplex/hub/HubManager.java | 2 +- .../src/nautilus/game/arcade/Arcade.java | 2 +- .../src/nautilus/game/arcade/GameFactory.java | 1 - .../arcade/managers/GameLobbyManager.java | 31 +++----- 9 files changed, 127 insertions(+), 57 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/cosmetic/event/ActivateGemBoosterEvent.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/CosmeticManager.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/CosmeticManager.java index ffae2320d..80f378357 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/CosmeticManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/CosmeticManager.java @@ -37,7 +37,7 @@ public class CosmeticManager extends MiniPlugin private boolean _showInterface = true; private int _interfaceSlot = 4; - public CosmeticManager(JavaPlugin plugin, CoreClientManager clientManager, DonationManager donationManager, InventoryManager inventoryManager, GadgetManager gadgetManager, MountManager mountManager, PetManager petManager) + public CosmeticManager(JavaPlugin plugin, CoreClientManager clientManager, DonationManager donationManager, InventoryManager inventoryManager, GadgetManager gadgetManager, MountManager mountManager, PetManager petManager, boolean useBooster) { super("Cosmetic Manager", plugin); @@ -46,7 +46,7 @@ public class CosmeticManager extends MiniPlugin _mountManager = mountManager; _petManager = petManager; - _shop = new CosmeticShop(this, clientManager, donationManager, _moduleName); + _shop = new CosmeticShop(this, clientManager, donationManager, _moduleName, useBooster); } public void showInterface(boolean showInterface) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/event/ActivateGemBoosterEvent.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/event/ActivateGemBoosterEvent.java new file mode 100644 index 000000000..9d7318bb1 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/event/ActivateGemBoosterEvent.java @@ -0,0 +1,44 @@ +package mineplex.core.cosmetic.event; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class ActivateGemBoosterEvent extends Event +{ + private static final HandlerList handlers = new HandlerList(); + + private Player _player; + + private boolean _cancelled = false; + + public ActivateGemBoosterEvent(Player player) + { + _player = player; + } + + public HandlerList getHandlers() + { + return handlers; + } + + public static HandlerList getHandlerList() + { + return handlers; + } + + public Player getPlayer() + { + return _player; + } + + public void setCancelled(boolean cancel) + { + _cancelled = cancel; + } + + public boolean isCancelled() + { + return _cancelled; + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/CosmeticShop.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/CosmeticShop.java index ed0313350..7d709cf94 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/CosmeticShop.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/CosmeticShop.java @@ -13,7 +13,6 @@ import mineplex.core.cosmetic.ui.page.PetTagPage; import mineplex.core.cosmetic.ui.page.TreasurePage; import mineplex.core.donation.DonationManager; import mineplex.core.gadget.event.ItemGadgetOutOfAmmoEvent; -import mineplex.core.inventory.InventoryManager; import mineplex.core.shop.ShopBase; import mineplex.core.shop.page.ShopPageBase; import mineplex.core.updater.UpdateType; @@ -21,10 +20,13 @@ import mineplex.core.updater.event.UpdateEvent; public class CosmeticShop extends ShopBase implements PluginMessageListener { - public CosmeticShop(CosmeticManager plugin, CoreClientManager clientManager, DonationManager donationManager, String name) + private boolean _useBooster; + + public CosmeticShop(CosmeticManager plugin, CoreClientManager clientManager, DonationManager donationManager, String name, boolean useBooster) { super(plugin, clientManager, donationManager, name, CurrencyType.Gems, CurrencyType.Coins); + _useBooster = useBooster; plugin.GetPlugin().getServer().getMessenger().registerIncomingPluginChannel(plugin.GetPlugin(), "MC|ItemName", this); } @@ -56,6 +58,7 @@ public class CosmeticShop extends ShopBase implements PluginMes { new GadgetPage(Plugin, this, ClientManager, DonationManager, "Gadgets", event.getPlayer()).purchaseGadget(event.getPlayer(), event.getGadget()); } + @EventHandler public void updateTreasure(UpdateEvent event) { @@ -67,4 +70,10 @@ public class CosmeticShop extends ShopBase implements PluginMes if (shop instanceof TreasurePage) ((TreasurePage) shop).update(); } - }} + } + + public boolean getBoosterEnabled() + { + return _useBooster; + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java index 8686cacf7..4394c3f90 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/Menu.java @@ -1,29 +1,26 @@ package mineplex.core.cosmetic.ui.page; -import org.bukkit.ChatColor; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; import mineplex.core.account.CoreClientManager; import mineplex.core.common.CurrencyType; import mineplex.core.common.util.C; -import mineplex.core.common.util.F; import mineplex.core.cosmetic.CosmeticManager; +import mineplex.core.cosmetic.event.ActivateGemBoosterEvent; import mineplex.core.cosmetic.ui.CosmeticShop; -import mineplex.core.cosmetic.ui.button.DeactivateGadgetButton; -import mineplex.core.cosmetic.ui.button.DeactivateMountButton; -import mineplex.core.cosmetic.ui.button.DeactivatePetButton; import mineplex.core.cosmetic.ui.button.OpenGadgets; import mineplex.core.cosmetic.ui.button.OpenMorphs; import mineplex.core.cosmetic.ui.button.OpenMounts; import mineplex.core.cosmetic.ui.button.OpenParticles; import mineplex.core.cosmetic.ui.button.OpenPets; -import mineplex.core.cosmetic.ui.button.TreasureButton; import mineplex.core.donation.DonationManager; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; import mineplex.core.inventory.GemBooster; import mineplex.core.mount.Mount; +import mineplex.core.shop.item.IButton; import mineplex.core.shop.item.ShopItem; import mineplex.core.shop.item.SingleButton; import mineplex.core.shop.page.ConfirmationPage; @@ -52,35 +49,48 @@ public class Menu extends ShopPageBase else { */ - AddItem(13, new ShopItem(Material.CHEST, C.cGold + treasureChestCount + " Treasure Chests", 1, false)); + AddItem(13, new ShopItem(Material.CHEST, C.cGold + treasureChestCount + " Treasure Chests (COMING SOON!)", 1, false)); //} - final GemBooster gemBoosterItem = new GemBooster(Plugin.getInventoryManager().Get(Player).getItemCount("Gem Booster")); + final GemBooster gemBoosterItem = new GemBooster(Shop.getBoosterEnabled(), Plugin.getInventoryManager().Get(Player).getItemCount("Gem Booster")); - if (DonationManager.Get(Player.getName()).GetBalance(CurrencyType.Coins) >= gemBoosterItem.GetCost(CurrencyType.Coins)) - { - AddButton(15, new ShopItem( - gemBoosterItem.GetDisplayMaterial(), - gemBoosterItem.GetDisplayName(), - gemBoosterItem.GetDescription(), - 1, - false), - new SingleButton() + + AddButton(15, new ShopItem( + gemBoosterItem.GetDisplayMaterial(), + gemBoosterItem.GetDisplayName(), + gemBoosterItem.GetDescription(), + 1, + false), + new IButton() + { + @Override + public void ClickedLeft(Player player) { - @Override - public void Clicked(Player player) + if (Shop.getBoosterEnabled()) { - Shop.OpenPageForPlayer(Player, new ConfirmationPage(Plugin, Shop, ClientManager, DonationManager, new Runnable() - { - public void run() - { - Plugin.getInventoryManager().addItemToInventory(Player, "Utility", "Gem Booster", 20); - Shop.OpenPageForPlayer(Player, new Menu(Plugin, Shop, ClientManager, DonationManager, Player)); - } - }, null, gemBoosterItem, CurrencyType.Coins, Player)); + ActivateGemBoosterEvent boosterEvent = new ActivateGemBoosterEvent(player); + Bukkit.getServer().getPluginManager().callEvent(boosterEvent); + + if (!boosterEvent.isCancelled()) + Plugin.getInventoryManager().addItemToInventory(Player, "Utility", "Gem Booster", -1); + } + else + { + purchaseGemBooster(gemBoosterItem, player); } } - ); + + @Override + public void ClickedRight(Player player) + { + purchaseGemBooster(gemBoosterItem, player); + } + } + ); + + if (DonationManager.Get(Player.getName()).GetBalance(CurrencyType.Coins) >= gemBoosterItem.GetCost(CurrencyType.Coins)) + { + } else { @@ -186,6 +196,18 @@ public class Menu extends ShopPageBase } } + private void purchaseGemBooster(GemBooster gemBoosterItem, Player player) + { + Shop.OpenPageForPlayer(Player, new ConfirmationPage(Plugin, Shop, ClientManager, DonationManager, new Runnable() + { + public void run() + { + Plugin.getInventoryManager().addItemToInventory(Player, "Utility", "Gem Booster", 20); + Shop.OpenPageForPlayer(Player, new Menu(Plugin, Shop, ClientManager, DonationManager, Player)); + } + }, null, gemBoosterItem, CurrencyType.Coins, Player)); + } + public void openParticles(Player player) { Shop.OpenPageForPlayer(player, new ParticlePage(Plugin, Shop, ClientManager, DonationManager, "Particles", player)); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/inventory/GemBooster.java b/Plugins/Mineplex.Core/src/mineplex/core/inventory/GemBooster.java index bc4b473cf..2431b67c4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/inventory/GemBooster.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/inventory/GemBooster.java @@ -5,20 +5,25 @@ import org.bukkit.entity.Player; import mineplex.core.common.CurrencyType; import mineplex.core.common.util.C; +import mineplex.core.gadget.types.ItemGadget; import mineplex.core.shop.item.SalesPackageBase; public class GemBooster extends SalesPackageBase { - public GemBooster(int gemBoosters) + public GemBooster(boolean enabled, int gemBoosters) { super("20 Gem Booster Pack", Material.EMERALD, (byte)0, new String[] { C.cYellow + "1000 Coins", " ", + (enabled ? C.cGreen + "Left-Click To Use:" : ""), C.cWhite + "Use these before games start to", C.cWhite + "boost the amount of Gems earned", C.cWhite + "for all players in the game!", " ", + C.cGreen + "Right-Click To Purchase:", + C.cWhite + "20 Gem Boosters for " + C.cYellow + "1000 Coins", + " ", C.cWhite + "Your Gem Boosters: " + C.cGreen + gemBoosters }, 1000, 20); diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java index 26a8532d4..ec1a5020b 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java @@ -157,7 +157,7 @@ public class HubManager extends MiniClientPlugin _mountManager = new MountManager(_plugin, clientManager, donationManager, blockRestore, _disguiseManager); _inventoryManager = new InventoryManager(plugin); _gadgetManager = new GadgetManager(_plugin, clientManager, donationManager, _inventoryManager, _mountManager, petManager, preferences, disguiseManager, blockRestore, new ProjectileManager(plugin)); - new CosmeticManager(_plugin, clientManager, donationManager, _inventoryManager, _gadgetManager, _mountManager, petManager); + new CosmeticManager(_plugin, clientManager, donationManager, _inventoryManager, _gadgetManager, _mountManager, petManager, false); _partyManager = partyManager; _preferences = preferences; 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 b4dbfd5c6..c972d0f14 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java @@ -116,7 +116,7 @@ public class Arcade extends JavaPlugin PetManager petManager = new PetManager(this, _clientManager, _donationManager, creature, webServerAddress); MountManager mountManager = new MountManager(this, _clientManager, _donationManager, blockRestore, disguiseManager); GadgetManager gadgetManager = new GadgetManager(this, _clientManager, _donationManager, inventoryManager, mountManager, petManager, preferenceManager, disguiseManager, blockRestore, projectileManager); - CosmeticManager cosmeticManager = new CosmeticManager(this, _clientManager, _donationManager, inventoryManager, gadgetManager, mountManager, petManager); + CosmeticManager cosmeticManager = new CosmeticManager(this, _clientManager, _donationManager, inventoryManager, gadgetManager, mountManager, petManager, true); cosmeticManager.setInterfaceSlot(7); //Arcade Manager diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameFactory.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameFactory.java index 7c2310a51..5ff22c544 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameFactory.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameFactory.java @@ -26,7 +26,6 @@ import nautilus.game.arcade.game.games.halloween.Halloween; import nautilus.game.arcade.game.games.hideseek.HideSeek; import nautilus.game.arcade.game.games.micro.Micro; import nautilus.game.arcade.game.games.milkcow.MilkCow; -import nautilus.game.arcade.game.games.minestrike.MineStrike; import nautilus.game.arcade.game.games.mineware.MineWare; import nautilus.game.arcade.game.games.quiver.Quiver; import nautilus.game.arcade.game.games.quiver.QuiverTeams; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameLobbyManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameLobbyManager.java index 1e88d7fd4..251c54dad 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameLobbyManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameLobbyManager.java @@ -41,6 +41,7 @@ import org.bukkit.scoreboard.Scoreboard; import mineplex.core.account.CoreClient; import mineplex.core.common.Rank; import mineplex.core.common.util.C; +import mineplex.core.common.util.F; import mineplex.core.common.util.MapUtil; import mineplex.core.common.util.NautHashMap; import mineplex.core.common.util.UtilEnt; @@ -51,6 +52,7 @@ import mineplex.core.common.util.UtilText; import mineplex.core.common.util.UtilText.TextAlign; import mineplex.core.common.util.UtilTime; import mineplex.core.common.util.UtilWorld; +import mineplex.core.cosmetic.event.ActivateGemBoosterEvent; import mineplex.core.donation.Donor; import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.packethandler.IPacketRunnable; @@ -1178,29 +1180,18 @@ public class GameLobbyManager implements IPacketRunnable, Listener } @EventHandler(priority = EventPriority.LOWEST) - public void GemBoosterInteract(PlayerInteractEvent event) + public void GemBoosterInteract(ActivateGemBoosterEvent event) { - if (Manager.IsTournamentServer()) + if (Manager.IsTournamentServer() || Manager.GetGame() == null || Manager.GetGame().GetState() != GameState.Recruit) + { + event.setCancelled(true); + + event.getPlayer().sendMessage(F.main("Arcade", "You can't use Gem Boosters right now.")); + return; + } - Player player = event.getPlayer(); - - if (player.getItemInHand() == null) - return; - - if (player.getItemInHand().getType() != Material.EMERALD) - return; - - if (Manager.GetGame() == null) - return; - - if (Manager.GetGame().GetState() != GameState.Recruit) - return; - - if (Manager.getInventoryManager().Get(player).getItemCount("Gem Booster") <= 0) - return; - - Manager.GetGame().AddGemBooster(player); + Manager.GetGame().AddGemBooster(event.getPlayer()); } @EventHandler(priority = EventPriority.LOWEST) From a4cf9e2f4b1ad73e05555cc32d64b6697fb6a98f Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Tue, 26 Aug 2014 00:52:51 -0700 Subject: [PATCH 3/4] Fixed stat bugs. --- .../src/mineplex/core/stats/StatsManager.java | 49 ++++++++++++------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java index 6610ccce6..ac3aa7378 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java @@ -48,29 +48,14 @@ public class StatsManager extends MiniClientPlugin } } - public void incrementStat(Player player, final String statName, int value) + public void incrementStat(Player player, final String statName, final int value) { int newValue = Get(player).addStat(statName, value); //Event UtilServer.getServer().getPluginManager().callEvent(new StatChangeEvent(player.getName(), statName, newValue - value, newValue)); - String uuidString = player.getUniqueId().toString(); - - synchronized (_statSync) - { - if (!_statUploadQueue.containsKey(uuidString)) - { - _statUploadQueue.put(uuidString, new NautHashMap()); - } - - if (!_statUploadQueue.get(uuidString).containsKey(statName)) - { - _statUploadQueue.get(uuidString).put(statName, 0); - } - - _statUploadQueue.get(uuidString).put(statName, value); - } + final String uuidString = player.getUniqueId().toString(); // Verify stat is in our local cache, if not add it remotely. if (!_stats.containsKey(statName)) @@ -81,6 +66,12 @@ public class StatsManager extends MiniClientPlugin { synchronized (_statSync) { + if (_stats.containsKey(statName)) + { + addToQueue(statName, uuidString, value); + return; + } + _repository.addStat(statName); _stats.clear(); @@ -89,10 +80,34 @@ public class StatsManager extends MiniClientPlugin { _stats.put(stat.Name, stat.Id); } + + addToQueue(statName, uuidString, value); } } }); } + else + { + synchronized (_statSync) + { + addToQueue(statName, uuidString, value); + } + } + } + + private void addToQueue(String statName, String uuidString, int value) + { + if (!_statUploadQueue.containsKey(uuidString)) + { + _statUploadQueue.put(uuidString, new NautHashMap()); + } + + if (!_statUploadQueue.get(uuidString).containsKey(statName)) + { + _statUploadQueue.get(uuidString).put(statName, 0); + } + + _statUploadQueue.get(uuidString).put(statName, value); } protected void saveStats() From 7a8ab5c96a6f5552726808345fbd3f1ab03eb359 Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Tue, 26 Aug 2014 00:53:41 -0700 Subject: [PATCH 4/4] Comment for weirdness. --- .../Mineplex.Core/src/mineplex/core/stats/StatsManager.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java index ac3aa7378..23837fe8d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java @@ -66,6 +66,9 @@ public class StatsManager extends MiniClientPlugin { synchronized (_statSync) { + // If many players come in for a new stat, when the first add finishes the others are queued to add again + // This makes a second check for the stat name (already added before lock was released) + // Then it pops into queue and forgets adding the new stat to db. if (_stats.containsKey(statName)) { addToQueue(statName, uuidString, value);