package nautilus.game.arcade.managers; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Color; import org.bukkit.DyeColor; import org.bukkit.FireworkEffect; import org.bukkit.FireworkEffect.Type; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.Creature; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.entity.Sheep; import org.bukkit.entity.Slime; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityCombustEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Objective; 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.MapUtil; import mineplex.core.common.util.NautHashMap; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilInv; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilServer; 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.donation.Donor; import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.packethandler.IPacketRunnable; import mineplex.core.packethandler.PacketHandler; import mineplex.core.packethandler.PacketVerifier; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.GameType; import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.Game; import nautilus.game.arcade.game.Game.GameState; import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.kit.KitAvailability; import nautilus.game.arcade.kit.KitSorter; import net.minecraft.server.v1_7_R3.DataWatcher; import net.minecraft.server.v1_7_R3.Packet; import net.minecraft.server.v1_7_R3.PacketPlayOutEntityMetadata; import net.minecraft.server.v1_7_R3.PacketPlayOutSpawnEntityLiving; import net.minecraft.server.v1_7_R3.WatchableObject; public class GameLobbyManager implements IPacketRunnable, Listener { public ArcadeManager Manager; private Location _gameText; private Location _advText; private Location _kitText; private Location _teamText; private Location _kitDisplay; private Location _teamDisplay; private Location spawn; private NautHashMap _kits = new NautHashMap(); private NautHashMap _kitBlocks = new NautHashMap(); private NautHashMap _teams = new NautHashMap(); private NautHashMap _teamBlocks = new NautHashMap(); private long _fireworkStart; private Color _fireworkColor; private int _advertiseStage = 0; //Scoreboard private NautHashMap _scoreboardMap = new NautHashMap(); private NautHashMap _gemMap = new NautHashMap(); private NautHashMap _eloMap = new NautHashMap(); private NautHashMap _kitMap = new NautHashMap(); private int _oldPlayerCount = 0; public GameLobbyManager(ArcadeManager manager, PacketHandler packetHandler) { Manager = manager; packetHandler.AddPacketRunnable(this); World world = UtilWorld.getWorld("world"); spawn = new Location(world, 0, 104, 0); _gameText = new Location(world, 0, 130, 50); _kitText = new Location(world, -40, 120, 0); _teamText = new Location(world, 40, 120, 0); _advText = new Location(world, 0, 140, -60); _kitDisplay = new Location(world, -17, 101, 0); _teamDisplay = new Location(world, 18, 101, 0); Manager.GetPluginManager().registerEvents(this, Manager.GetPlugin()); } private boolean HasScoreboard(Player player) { return _scoreboardMap.containsKey(player); } public void CreateScoreboards() { for (Player player : UtilServer.getPlayers()) { CreateScoreboard(player, false); } for (Player otherPlayer : UtilServer.getPlayers()) { AddPlayerToScoreboards(otherPlayer, null); } } private void CreateScoreboard(Player player, boolean resendToAll) { _scoreboardMap.put(player, Bukkit.getScoreboardManager().getNewScoreboard()); Scoreboard scoreboard = _scoreboardMap.get(player); Objective objective = scoreboard.registerNewObjective("§l" + "Lobby", "dummy"); objective.setDisplaySlot(DisplaySlot.SIDEBAR); for (Rank rank : Rank.values()) { if (rank == Rank.ALL) { scoreboard.registerNewTeam(rank.Name).setPrefix(""); } else { scoreboard.registerNewTeam(rank.Name).setPrefix(rank.GetTag(true, true) + ChatColor.RESET + " " + ChatColor.WHITE); } if (Manager.GetGame() != null && !Manager.GetGame().GetTeamList().isEmpty()) { for (GameTeam team : Manager.GetGame().GetTeamList()) { if (rank == Rank.ALL) { scoreboard.registerNewTeam(rank.Name + team.GetName().toUpperCase()).setPrefix(team.GetColor() + ""); } else { scoreboard.registerNewTeam(rank.Name + team.GetName().toUpperCase()).setPrefix(rank.GetTag(true, true) + ChatColor.RESET + " " + team.GetColor()); } } } } if (resendToAll) { for (Player otherPlayer : UtilServer.getPlayers()) { String teamName = null; if (Manager.GetGame() != null && Manager.GetGame().GetTeam(otherPlayer) != null) teamName = Manager.GetGame().GetTeam(otherPlayer).GetName().toUpperCase(); AddPlayerToScoreboards(otherPlayer, teamName); } } } public Collection GetScoreboards() { return _scoreboardMap.values(); } public void WriteLine(Player player, int x, int y, int z, BlockFace face, int line, String text) { Location loc = player.getLocation(); loc.setX(x); loc.setY(y); loc.setZ(z); int id = 159; byte data = 15; if (player.getItemInHand() != null && player.getItemInHand().getType().isBlock() && player.getItemInHand().getType() != Material.AIR) { id = player.getItemInHand().getTypeId(); data = UtilInv.GetData(player.getItemInHand()); } if (line > 0) loc.add(0, line*-6, 0); UtilText.MakeText(text, loc, face, id, data, TextAlign.CENTER); player.sendMessage("Writing: " + text + " @ " + UtilWorld.locToStrClean(loc)); } public void WriteGameLine(String text, int line, int id, byte data) { Location loc = new Location(_gameText.getWorld(), _gameText.getX(), _gameText.getY(), _gameText.getZ()); if (line > 0) loc.add(0, line*-6, 0); BlockFace face = BlockFace.WEST; UtilText.MakeText(text, loc, face, id, data, TextAlign.CENTER); } public void WriteAdvertiseLine(String text, int line, int id, byte data) { Location loc = new Location(_advText.getWorld(), _advText.getX(), _advText.getY(), _advText.getZ()); if (line > 0) loc.add(0, line*-6, 0); BlockFace face = BlockFace.EAST; UtilText.MakeText(text, loc, face, id, data, TextAlign.CENTER); } public void WriteKitLine(String text, int line, int id, byte data) { Location loc = new Location(_kitText.getWorld(), _kitText.getX(), _kitText.getY(), _kitText.getZ()); if (line > 0) loc.add(0, line*-6, 0); BlockFace face = BlockFace.NORTH; UtilText.MakeText(text, loc, face, id, data, TextAlign.CENTER); } public void WriteTeamLine(String text, int line, int id, byte data) { Location loc = new Location(_teamText.getWorld(), _teamText.getX(), _teamText.getY(), _teamText.getZ()); if (line > 0) loc.add(0, line*-6, 0); BlockFace face = BlockFace.SOUTH; UtilText.MakeText(text, loc, face, id, data, TextAlign.CENTER); } public Location GetSpawn() { return spawn.clone().add(4 - Math.random()*8, 0, 4 - Math.random()*8); } @EventHandler(priority = EventPriority.MONITOR) public void TeamGeneration(GameStateChangeEvent event) { if (event.GetState() != GameState.Recruit) return; if (event.GetGame().GetMode() == null) WriteGameLine(event.GetGame().WorldData.MapName, 1, 159, (byte)4); else WriteGameLine(event.GetGame().WorldData.MapName, 2, 159, (byte)4); CreateTeams(event.GetGame()); } public void CreateTeams(Game game) { //Text WriteTeamLine("Select", 0, 159, (byte)15); WriteTeamLine("Team", 1, 159, (byte)4); //Remove Old Ents for (Entity ent : _teams.keySet()) ent.remove(); _teams.clear(); //Remove Blocks for (Block block : _teamBlocks.keySet()) block.setType(_teamBlocks.get(block)); _teamBlocks.clear(); //Smash if (game.GetType() == GameType.Smash || game.GetType() == GameType.SurvivalGames) { //Text WriteTeamLine("Ultra", 0, 159, (byte)15); WriteTeamLine("Kits", 1, 159, (byte)4); CreateScoreboards(); return; } //Standard if (game.GetKits().length > 1 || game.GetTeamList().size() < 6) { //Display ArrayList teams = new ArrayList(); for (GameTeam team : game.GetTeamList()) if (team.GetVisible()) teams.add(team); //Positions double space = 6; double offset = (teams.size()-1)*space/2d; for (int i=0 ; i teamsA = new ArrayList(); ArrayList teamsB = new ArrayList(); for (int i=0 ; i kits = new ArrayList(); for (Kit kit : game.GetKits()) { if (kit.GetAvailability() != KitAvailability.Hide) kits.add(kit); } // Sort kits by price Collections.sort(kits, new KitSorter()); //Smash if (game.GetType() == GameType.Smash || game.GetType() == GameType.SurvivalGames) { WriteKitLine("Free", 0, 159, (byte)15); WriteKitLine("Kits", 1, 159, (byte)4); ArrayList kitsA = new ArrayList(); ArrayList kitsB = new ArrayList(); for (int i=0 ; i blockMap) { //Coloring Block block = loc.clone().add( 0.5, 0, 0.5).getBlock(); blockMap.put(block, block.getType()); MapUtil.QuickChangeBlockAt(block.getLocation(), id, data); block = loc.clone().add(-0.5, 0, 0.5).getBlock(); blockMap.put(block, block.getType()); MapUtil.QuickChangeBlockAt(block.getLocation(), id, data); block = loc.clone().add( 0.5, 0, -0.5).getBlock(); blockMap.put(block, block.getType()); MapUtil.QuickChangeBlockAt(block.getLocation(), id, data); block = loc.clone().add(-0.5, 0, -0.5).getBlock(); blockMap.put(block, block.getType()); MapUtil.QuickChangeBlockAt(block.getLocation(), id, data); //Top block = loc.clone().add( 0.5, 1, 0.5).getBlock(); blockMap.put(block, block.getType()); MapUtil.QuickChangeBlockAt(block.getLocation(), 44, (byte)5); block = loc.clone().add(-0.5, 1, 0.5).getBlock(); blockMap.put(block, block.getType()); MapUtil.QuickChangeBlockAt(block.getLocation(), 44, (byte)5); block = loc.clone().add( 0.5, 1, -0.5).getBlock(); blockMap.put(block, block.getType()); MapUtil.QuickChangeBlockAt(block.getLocation(), 44, (byte)5); block = loc.clone().add(-0.5, 1, -0.5).getBlock(); blockMap.put(block, block.getType()); MapUtil.QuickChangeBlockAt(block.getLocation(), 44, (byte)5); //Floor for (int x=-2 ; x<2 ; x++) { for (int z=-2 ; z<2 ; z++) { block = loc.clone().add(x + 0.5, -1, z + 0.5).getBlock(); blockMap.put(block, block.getType()); MapUtil.QuickChangeBlockAt(block.getLocation(), id, data); } } //Outline for (int x=-3 ; x<3 ; x++) { for (int z=-3 ; z<3 ; z++) { block = loc.clone().add(x + 0.5, -1, z + 0.5).getBlock(); if (blockMap.containsKey(block)) continue; blockMap.put(block, block.getType()); MapUtil.QuickChangeBlockAt(block.getLocation(), 35, (byte)15); } } } public void AddKitLocation(Entity ent, Kit kit, Location loc) { _kits.put(ent, new LobbyEnt(ent, loc, kit)); } @EventHandler public void PlayerQuit(PlayerQuitEvent event) { _scoreboardMap.remove(event.getPlayer()); _gemMap.remove(event.getPlayer()); _kitMap.remove(event.getPlayer()); } @EventHandler(priority = EventPriority.LOWEST) public void DamageCancel(CustomDamageEvent event) { if (_kits.containsKey(event.GetDamageeEntity())) event.SetCancelled("Kit Cancel"); } @EventHandler public void Update(UpdateEvent event) { if (event.getType() == UpdateType.FAST) { spawn.getWorld().setTime(6000); spawn.getWorld().setStorm(false); spawn.getWorld().setThundering(false); } if (event.getType() == UpdateType.TICK) UpdateEnts(); if (event.getType() == UpdateType.FASTEST) UpdateFirework(); if (event.getType() == UpdateType.SEC) RemoveInvalidEnts(); if (event.getType() == UpdateType.SLOW) UpdateAdvertise(); ScoreboardDisplay(event); ScoreboardSet(event); } private void RemoveInvalidEnts() { for (Entity ent : UtilWorld.getWorld("world").getEntities()) { if (ent instanceof Creature || ent instanceof Slime) { if (_kits.containsKey(ent)) continue; if (_teams.containsKey(ent)) continue; if (ent.getPassenger() != null) continue; ent.remove(); } } } private void UpdateAdvertise() { if (Manager.GetGame() == null || Manager.GetGame().GetState() != GameState.Recruit) return; _advertiseStage = (_advertiseStage+1)%2; if (Manager.GetGame().AdvertiseText(this, _advertiseStage)) { return; } if (_advertiseStage == 0) { WriteAdvertiseLine("GET MINEPLEX ULTRA", 0, 159, (byte)4); WriteAdvertiseLine("FOR AMAZING", 1, 159, (byte)15); WriteAdvertiseLine("FUN TIMES", 2, 159, (byte)15); WriteAdvertiseLine("www.mineplex.com", 4, 159, (byte)15); } else if (_advertiseStage == 1) { WriteAdvertiseLine("KEEP CALM", 0, 159, (byte)4); WriteAdvertiseLine("AND", 1, 159, (byte)15); WriteAdvertiseLine("PLAY MINEPLEX", 2, 159, (byte)4); WriteAdvertiseLine("www.mineplex.com", 4, 159, (byte)15); } } public void UpdateEnts() { for (Entity ent : _kits.keySet()) ent.teleport(_kits.get(ent).GetLocation()); for (Entity ent : _teams.keySet()) ent.teleport(_teams.get(ent).GetLocation()); } public Kit GetClickedKit(Entity clicked) { for (LobbyEnt ent : _kits.values()) if (clicked.equals(ent.GetEnt())) return ent.GetKit(); return null; } public GameTeam GetClickedTeam(Entity clicked) { for (LobbyEnt ent : _teams.values()) if (clicked.equals(ent.GetEnt())) return ent.GetTeam(); return null; } public void RegisterFireworks(GameTeam winnerTeam) { if (winnerTeam != null) { _fireworkColor = Color.GREEN; if (winnerTeam.GetColor() == ChatColor.RED) _fireworkColor = Color.RED; if (winnerTeam.GetColor() == ChatColor.AQUA) _fireworkColor = Color.BLUE; if (winnerTeam.GetColor() == ChatColor.YELLOW) _fireworkColor = Color.YELLOW; _fireworkStart = System.currentTimeMillis(); } } public void UpdateFirework() { if (UtilTime.elapsed(_fireworkStart, 10000)) return; FireworkEffect effect = FireworkEffect.builder().flicker(false).withColor(_fireworkColor).with(Type.BALL_LARGE).trail(false).build(); try { Manager.GetFirework().playFirework(spawn.clone().add( Math.random()*160-80, 30 + Math.random()*10, Math.random()*160-80), effect); } catch (Exception e) { e.printStackTrace(); } } @EventHandler public void Combust(EntityCombustEvent event) { for (LobbyEnt ent : _kits.values()) if (event.getEntity().equals(ent.GetEnt())) { event.setCancelled(true); return; } } public void DisplayLast(Game game) { //Start Fireworks RegisterFireworks(game.WinnerTeam); } public void DisplayNext(Game game, HashMap pastTeams) { WriteGameLine(game.GetType().GetLobbyName(), 0, 159, (byte)14); if (game.GetMode() == null) WriteGameLine(" ", 1, 159, (byte)14); else WriteGameLine(game.GetMode(), 1, 159, (byte)14); DisplayWaiting(); CreateKits(game); CreateTeams(game); } public void DisplayWaiting() { WriteGameLine("waiting for players", 3, 159, (byte)13); } @EventHandler public void ScoreboardDisplay(UpdateEvent event) { if (event.getType() != UpdateType.FAST) return; if (Manager.GetGame() != null && (Manager.GetGame().GetState() != GameState.Loading && Manager.GetGame().GetState() != GameState.Recruit)) { for (Player player : UtilServer.getPlayers()) player.setScoreboard(Manager.GetGame().GetScoreboard().GetScoreboard()); } else { for (Player player : UtilServer.getPlayers()) { if (!HasScoreboard(player)) { CreateScoreboard(player, true); } else { player.setScoreboard(_scoreboardMap.get(player)); } } } } @EventHandler public void ScoreboardSet(UpdateEvent event) { if (event.getType() != UpdateType.FAST) return; if (Manager.GetGame() != null && !Manager.GetGame().DisplayLobbySide) { return; } for (Entry entry : _scoreboardMap.entrySet()) { Objective objective = entry.getValue().getObjective("§l" + "Lobby"); if (Manager.GetGame() != null && Manager.GetGame().GetCountdown() >= 0) { if (Manager.GetGame().GetCountdown() > 0) objective.setDisplayName(C.Bold + "§lStarting in " + C.cGreen + "§l" + Manager.GetGame().GetCountdown() + (Manager.GetGame().GetCountdown() == 1 ? " Second" : " Seconds")); else if (Manager.GetGame().GetCountdown() == 0) objective.setDisplayName(ChatColor.WHITE + "§lIn Progress..."); } else { objective.setDisplayName(ChatColor.GREEN + "§l" + "Waiting for Players"); } int line = 15; objective.getScore(" ").setScore(line--); objective.getScore(C.cYellow + "Players").setScore(line--); // Remove old entry.getValue().resetScores(_oldPlayerCount + "/" + Manager.GetPlayerFull()); // Set new objective.getScore(UtilServer.getPlayers().length + "/" + Manager.GetPlayerFull()).setScore(line--); if (Manager.GetGame() != null) { ChatColor teamColor = ChatColor.GRAY; String kitName = "None"; if (Manager.GetGame().GetTeam(entry.getKey()) != null) { teamColor = Manager.GetGame().GetTeam(entry.getKey()).GetColor(); } if (Manager.GetGame().GetKit(entry.getKey()) != null) { kitName = Manager.GetGame().GetKit(entry.getKey()).GetName() + ""; } if (teamColor == null) //Shorten Kit Name if (kitName.length() > 16) kitName = kitName.substring(0, 16); // Remove old entry.getValue().resetScores(C.cGray + C.Bold + "Kit"); entry.getValue().resetScores(_kitMap.get(entry.getKey()) + ""); // Set new objective.getScore(" ").setScore(line--); objective.getScore(teamColor + C.Bold + "Kit").setScore(line--); objective.getScore(kitName + "").setScore(line--); _kitMap.put(entry.getKey(), kitName + ""); } objective.getScore(" ").setScore(line--); objective.getScore(C.cGreen + C.Bold + "Gems").setScore(line--); // Remove old entry.getValue().resetScores(_gemMap.get(entry.getKey()) + " "); // Set new objective.getScore(Manager.GetDonation().Get(entry.getKey().getName()).GetGems() + " ").setScore(line--); _gemMap.put(entry.getKey(), Manager.GetDonation().Get(entry.getKey().getName()).GetGems()); if (Manager.GetGame() != null && Manager.GetGame().EloRanking) { objective.getScore(" ").setScore(line--); objective.getScore(C.cYellow + C.Bold + "Elo").setScore(line--); // Remove old entry.getValue().resetScores(_eloMap.get(entry.getKey()) + " "); // Set new objective.getScore(Manager.getEloManager().getElo(entry.getKey().getUniqueId(), Manager.GetGame().GetName()) + " ").setScore(line--); } } _oldPlayerCount = UtilServer.getPlayers().length; } private String GetKitCustomName(Player player, Game game, LobbyEnt ent) { CoreClient client = Manager.GetClients().Get(player); Donor donor = Manager.GetDonation().Get(player.getName()); String entityName = ent.GetKit().GetName(); if (!player.isOnline() || client == null || donor == null) return entityName; if (client.GetRank() == null) { System.out.println("client rank is null"); } if (game == null) { System.out.println("game is null"); } if (Manager == null) { System.out.println("Manager is null"); } if (Manager.GetServerConfig() == null) { System.out.println("Manager.GetServerConfig() is null"); } if (ent.GetKit().GetAvailability() == KitAvailability.Free || //Free donor.OwnsUnknownPackage(Manager.GetGame().GetName() + " " + ent.GetKit().GetName())) //Green or Blue { entityName = ent.GetKit().GetAvailability().GetColor() + entityName; } else { entityName = ChatColor.RED + C.Bold + entityName; entityName += ChatColor.RESET + " (" + C.cGreen + ent.GetKit().GetCost() + " Gems" + ChatColor.RESET + ")"; } return entityName; } @SuppressWarnings("unchecked") @Override public boolean run(Packet packet, Player owner, PacketVerifier packetList) { int entityId = -1; if (packet instanceof PacketPlayOutEntityMetadata) { entityId = ((PacketPlayOutEntityMetadata)packet).a; } else if (packet instanceof PacketPlayOutSpawnEntityLiving) { //entityId = ((Packet24MobSpawn)packet).a; } if (entityId != -1) { String customName = null; // Order important (_next and _prev overlap if games are same and will throw NPE on _game.GetName()) for (LobbyEnt ent : _kits.values()) { if (ent.GetEnt().getEntityId() == entityId && Manager.GetGame() != null) { customName = GetKitCustomName(owner, Manager.GetGame(), ent); break; } } if (customName != null) { try { if (packet instanceof PacketPlayOutEntityMetadata) { List watchables = new ArrayList(); for (WatchableObject watchableObject : (List)((PacketPlayOutEntityMetadata) packet).b) { WatchableObject newWatch = new WatchableObject(watchableObject.c(), watchableObject.a(), watchableObject.b()); if (newWatch.a() == 10) { newWatch.a(customName); } watchables.add(newWatch); } PacketPlayOutEntityMetadata newPacket = new PacketPlayOutEntityMetadata(); newPacket.a = entityId; newPacket.b = watchables; packetList.forceProcess(newPacket); return false; } else if (packet instanceof PacketPlayOutSpawnEntityLiving) { DataWatcher watcher = ((PacketPlayOutSpawnEntityLiving)packet).l; watcher.watch(10, customName); watcher.watch(11, Byte.valueOf((byte)1)); } } catch (IllegalArgumentException e) { e.printStackTrace(); } } } return true; } public void AddPlayerToScoreboards(Player player, String teamName) { if (teamName == null) teamName = ""; String rankName = Manager.GetClients().Get(player).GetRank().Name; boolean rankIsUltra = !Manager.GetClients().Get(player).GetRank().Has(Rank.ULTRA) && Manager.GetDonation().Get(player.getName()).OwnsUnknownPackage(Manager.GetServerConfig().ServerType + " ULTRA"); if (rankIsUltra) { rankName = Rank.ULTRA.Name; } teamName = rankName + teamName; for (Scoreboard scoreboard : GetScoreboards()) { try { scoreboard.getTeam(teamName).addPlayer(player); } catch (Exception e) { System.out.println("GameLobbyManager AddPlayerToScoreboard Error"); System.out.println("[" + rankName + teamName + "] adding [" + player.getName() + "]"); System.out.println("Team is Null [" + (scoreboard.getTeam(rankName + teamName) == null) + "]"); } } } @EventHandler public void GemBoosterUpdate(UpdateEvent event) { if (Manager.IsTournamentServer()) return; if (event.getType() != UpdateType.SEC) return; if (Manager.GetGame() == null) return; if (Manager.GetGame().GetState() != GameState.Recruit) return; for (Player player : UtilServer.getPlayers()) { if (!player.getInventory().contains(Material.EMERALD)) { player.getInventory().setItem( 7, ItemStackFactory.Instance.CreateStack(Material.EMERALD, (byte) 0, 1, (short) 0, C.cGreen + "Gem Booster", new String[] { "", ChatColor.RESET + "Boosts Gems earned for", ChatColor.RESET + "everyone in the game." })); } for (int i : player.getInventory().all(Material.EMERALD).keySet()) { ItemStack stack = player.getInventory().getItem(i); ItemMeta itemMeta = stack.getItemMeta(); itemMeta.setDisplayName(C.cGreen + "Gem Booster" + " " + C.cWhite + "Click for " + (100-Manager.GetGame().GemBoosters.size()*25) + "% Boost"); stack.setItemMeta(itemMeta); player.getInventory().setItem(i, stack); } } } @EventHandler(priority = EventPriority.LOWEST) public void HubClockInteract(PlayerInteractEvent event) { if (Manager.IsTournamentServer()) return; Player player = event.getPlayer(); if (player.getItemInHand() == null) return; if (player.getItemInHand().getType() != Material.EMERALD) return; if (Manager.GetGame() == null) return; Manager.GetGame().AddGemBooster(player); } }