Mineplex2018-withcommit/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameLobbyManager.java
Jonathan Williams 8110506ac4 Fixed duplicate login issue with CoreClientManager
Added EloRanking and EloStart for elo games in Game.java

Refactored Elo code in Arcade to be based off of above values in Game

Changed Lobby scoreboard in Arcade to just Players at top current/max.
2014-05-06 09:06:39 -07:00

1133 lines
30 KiB
Java
Raw Blame History

package nautilus.game.arcade.managers;
import java.util.ArrayList;
import java.util.Collection;
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.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.FireworkEffect.Type;
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.PlayerQuitEvent;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.Team;
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.UtilServer;
import mineplex.core.common.util.UtilText;
import mineplex.core.common.util.UtilTime;
import mineplex.core.common.util.UtilWorld;
import mineplex.core.common.util.UtilText.TextAlign;
import mineplex.core.donation.Donor;
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.GameTeam;
import nautilus.game.arcade.game.Game.GameState;
import nautilus.game.arcade.kit.Kit;
import nautilus.game.arcade.kit.KitAvailability;
import net.minecraft.server.v1_7_R3.DataWatcher;
import net.minecraft.server.v1_7_R3.Packet;
import net.minecraft.server.v1_7_R3.PacketPlayOutSpawnEntityLiving;
import net.minecraft.server.v1_7_R3.PacketPlayOutEntityMetadata;
import net.minecraft.server.v1_7_R3.QueuedPacket;
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<Entity, LobbyEnt> _kits = new NautHashMap<Entity, LobbyEnt>();
private NautHashMap<Block, Material> _kitBlocks = new NautHashMap<Block, Material>();
private NautHashMap<Entity, LobbyEnt> _teams = new NautHashMap<Entity, LobbyEnt>();
private NautHashMap<Block, Material> _teamBlocks = new NautHashMap<Block, Material>();
private long _fireworkStart;
private Color _fireworkColor;
private int _advertiseStage = 0;
//Scoreboard
private NautHashMap<Player, Scoreboard> _scoreboardMap = new NautHashMap<Player, Scoreboard>();
private NautHashMap<Player, Integer> _gemMap = new NautHashMap<Player, Integer>();
private NautHashMap<Player, Integer> _eloMap = new NautHashMap<Player, Integer>();
private NautHashMap<Player, String> _kitMap = new NautHashMap<Player, String>();
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);
}
private void CreateScoreboard(Player player)
{
_scoreboardMap.put(player, Bukkit.getScoreboardManager().getNewScoreboard());
Scoreboard scoreboard = _scoreboardMap.get(player);
Objective objective = scoreboard.registerNewObjective("<EFBFBD>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());
}
}
}
}
for (Player otherPlayer : UtilServer.getPlayers())
{
AddPlayerToScoreboards(otherPlayer, null);
}
}
public Collection<Scoreboard> 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;
}
//UHC Empty
if (game.GetTeamList().size() > 10 && game.GetType() == GameType.UHC)
{
WriteTeamLine("Season", 0, 159, (byte)15);
WriteTeamLine("5", 1, 159, (byte)4);
WriteKitLine("Season", 0, 159, (byte)15);
WriteKitLine("5", 1, 159, (byte)4);
CreateScoreboards();
return;
}
//Standard
if (game.GetKits().length > 1 || game.GetType() != GameType.UHC)
{
//Display
ArrayList<GameTeam> teams = new ArrayList<GameTeam>();
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<teams.size() ; i++)
{
Location entLoc = _teamDisplay.clone().subtract(0, 0, i*space - offset);
SetKitTeamBlocks(entLoc.clone(), 35, teams.get(i).GetColorData(), _teamBlocks);
entLoc.add(0, 1.5, 0);
entLoc.getChunk().load();
Sheep ent = (Sheep)Manager.GetCreature().SpawnEntity(entLoc, EntityType.SHEEP);
ent.setRemoveWhenFarAway(false);
ent.setCustomNameVisible(true);
ent.setColor(DyeColor.getByWoolData(teams.get(i).GetColorData()));
UtilEnt.Vegetate(ent);
teams.get(i).SetTeamEntity(ent);
_teams.put(ent, new LobbyEnt(ent, entLoc, teams.get(i)));
}
}
//Double
else
{
//Text
WriteKitLine("Select", 0, 159, (byte)15);
WriteKitLine("Team", 1, 159, (byte)4);
//Display
ArrayList<GameTeam> teamsA = new ArrayList<GameTeam>();
ArrayList<GameTeam> teamsB = new ArrayList<GameTeam>();
for (int i=0 ; i<game.GetTeamList().size() ; i++)
{
if (i < game.GetTeamList().size()/2)
teamsA.add(game.GetTeamList().get(i));
else
teamsB.add(game.GetTeamList().get(i));
}
//A
{
//Positions
double space = 6;
double offset = (teamsA.size()-1)*space/2d;
for (int i=0 ; i<teamsA.size() ; i++)
{
Location entLoc = _teamDisplay.clone().subtract(0, 0, i*space - offset);
SetKitTeamBlocks(entLoc.clone(), 35, teamsA.get(i).GetColorData(), _teamBlocks);
entLoc.add(0, 1.5, 0);
entLoc.getChunk().load();
Sheep ent = (Sheep)Manager.GetCreature().SpawnEntity(entLoc, EntityType.SHEEP);
ent.setRemoveWhenFarAway(false);
ent.setCustomNameVisible(true);
ent.setColor(DyeColor.getByWoolData(teamsA.get(i).GetColorData()));
UtilEnt.Vegetate(ent);
teamsA.get(i).SetTeamEntity(ent);
_teams.put(ent, new LobbyEnt(ent, entLoc, teamsA.get(i)));
}
}
//B
{
//Positions
double space = 6;
double offset = (teamsB.size()-1)*space/2d;
for (int i=0 ; i<teamsB.size() ; i++)
{
Location entLoc = _kitDisplay.clone().subtract(0, 0, i*space - offset);
SetKitTeamBlocks(entLoc.clone(), 35, teamsB.get(i).GetColorData(), _teamBlocks);
entLoc.add(0, 1.5, 0);
entLoc.getChunk().load();
Sheep ent = (Sheep)Manager.GetCreature().SpawnEntity(entLoc, EntityType.SHEEP);
ent.setRemoveWhenFarAway(false);
ent.setCustomNameVisible(true);
ent.setColor(DyeColor.getByWoolData(teamsB.get(i).GetColorData()));
UtilEnt.Vegetate(ent);
teamsB.get(i).SetTeamEntity(ent);
_teams.put(ent, new LobbyEnt(ent, entLoc, teamsB.get(i)));
}
}
}
CreateScoreboards();
}
public void CreateKits(Game game)
{
//Text
WriteKitLine("Select", 0, 159, (byte)15);
WriteKitLine("Kit", 1, 159, (byte)4);
//Remove Old Ents
for (Entity ent : _kits.keySet())
ent.remove();
_kits.clear();
//Remove Blocks
for (Block block : _kitBlocks.keySet())
block.setType(_kitBlocks.get(block));
_kitBlocks.clear();
if (game.GetKits().length <= 1 && game.GetType() == GameType.UHC)
{
WriteKitLine(" ", 0, 159, (byte)15);
WriteKitLine(" ", 1, 159, (byte)4);
return;
}
//Display
ArrayList<Kit> kits = new ArrayList<Kit>();
for (Kit kit : game.GetKits())
{
if (kit.GetAvailability() != KitAvailability.Hide)
kits.add(kit);
}
//Smash
if (game.GetType() == GameType.Smash || game.GetType() == GameType.SurvivalGames)
{
WriteKitLine("Free", 0, 159, (byte)15);
WriteKitLine("Kits", 1, 159, (byte)4);
ArrayList<Kit> kitsA = new ArrayList<Kit>();
ArrayList<Kit> kitsB = new ArrayList<Kit>();
for (int i=0 ; i<kits.size() ; i++)
{
if (kits.get(i).GetAvailability() != KitAvailability.Blue) kitsA.add(kits.get(i));
else kitsB.add(kits.get(i));
}
{
//Positions
double space = 4;
double offset = (kitsA.size()-1)*space/2d;
for (int i=0 ; i<kitsA.size() ; i++)
{
Kit kit = kitsA.get(i);
if (kit.GetAvailability() == KitAvailability.Null)
continue;
Location entLoc = _kitDisplay.clone().subtract(0, 0, i*space - offset);
byte data = 4;
if (kit.GetAvailability() == KitAvailability.Green) data = 5;
else if (kit.GetAvailability() == KitAvailability.Blue) data = 3;
SetKitTeamBlocks(entLoc.clone(), 35, data, _kitBlocks);
entLoc.add(0, 1.5, 0);
entLoc.getChunk().load();
Entity ent = kit.SpawnEntity(entLoc);
if (ent == null)
continue;
_kits.put(ent, new LobbyEnt(ent, entLoc, kit));
}
}
{
//Positions
double space = 4;
double offset = (kitsB.size()-1)*space/2d;
for (int i=0 ; i<kitsB.size() ; i++)
{
Kit kit = kitsB.get(i);
if (kit.GetAvailability() == KitAvailability.Null)
continue;
Location entLoc = _teamDisplay.clone().subtract(0, 0, i*space - offset);
byte data = 4;
if (kit.GetAvailability() == KitAvailability.Green) data = 5;
else if (kit.GetAvailability() == KitAvailability.Blue) data = 3;
SetKitTeamBlocks(entLoc.clone(), 35, data, _kitBlocks);
entLoc.add(0, 1.5, 0);
entLoc.getChunk().load();
Entity ent = kit.SpawnEntity(entLoc);
if (ent == null)
continue;
_kits.put(ent, new LobbyEnt(ent, entLoc, kit));
}
}
return;
}
//Positions
double space = 4;
double offset = (kits.size()-1)*space/2d;
for (int i=0 ; i<kits.size() ; i++)
{
Kit kit = kits.get(i);
if (kit.GetAvailability() == KitAvailability.Null)
continue;
Location entLoc = _kitDisplay.clone().subtract(0, 0, i*space - offset);
byte data = 4;
if (kit.GetAvailability() == KitAvailability.Green) data = 5;
else if (kit.GetAvailability() == KitAvailability.Blue) data = 3;
SetKitTeamBlocks(entLoc.clone(), 35, data, _kitBlocks);
entLoc.add(0, 1.5, 0);
entLoc.getChunk().load();
Entity ent = kit.SpawnEntity(entLoc);
if (ent == null)
continue;
_kits.put(ent, new LobbyEnt(ent, entLoc, kit));
}
}
public void SetKitTeamBlocks(Location loc, int id, byte data, NautHashMap<Block, Material> 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 (Manager.IsTournamentServer())
{
if (_advertiseStage == 0)
{
WriteAdvertiseLine("TWITCH.TV", 0, 159, (byte)4);
WriteAdvertiseLine("CHARITY EVENT", 1, 159, (byte)15);
WriteAdvertiseLine(" ", 2, 159, (byte)15);
WriteAdvertiseLine("PROUDLY SPONSORED BY", 3, 159, (byte)15);
WriteAdvertiseLine("www.mineplex.com", 4, 159, (byte)4);
}
else if (_advertiseStage == 1)
{
WriteAdvertiseLine("Supporting", 0, 159, (byte)15);
WriteAdvertiseLine("ChildsPlay", 1, 159, (byte)4);
WriteAdvertiseLine("AbleGamers", 2, 159, (byte)4);
WriteAdvertiseLine("Extra Life", 3, 159, (byte)4);
WriteAdvertiseLine("Stand for the Silent", 4, 159, (byte)4);
}
return;
}
if (_advertiseStage == 0)
{
WriteAdvertiseLine("MINEPLEX ULTRA RANK", 0, 159, (byte)4);
WriteAdvertiseLine("UNLOCKS EVERYTHING", 1, 159, (byte)15);
WriteAdvertiseLine("IN EVERY GAME", 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<String, ChatColor> 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());
}
else
{
for (Player player : UtilServer.getPlayers())
{
if (!HasScoreboard(player))
{
CreateScoreboard(player);
}
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<Player, Scoreboard> entry : _scoreboardMap.entrySet())
{
Objective objective = entry.getValue().getObjective("<EFBFBD>l" + "Lobby");
if (Manager.GetGame() != null && Manager.GetGame().GetCountdown() >= 0)
{
if (Manager.GetGame().GetCountdown() > 0)
objective.setDisplayName(C.Bold + "<EFBFBD>lStarting in " + C.cGreen + "<EFBFBD>l" + Manager.GetGame().GetCountdown() + (Manager.GetGame().GetCountdown() == 1 ? " Second" : " Seconds"));
else if (Manager.GetGame().GetCountdown() == 0)
objective.setDisplayName(ChatColor.WHITE + "<EFBFBD>lIn Progress...");
}
else
{
objective.setDisplayName(ChatColor.GREEN + "<EFBFBD>l" + "Waiting for Players");
}
int line = 14;
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 (client.GetRank().Has(Rank.ULTRA) || donor.OwnsUnknownPackage(game.GetName() + " " + ent.GetKit().GetName()) || donor.OwnsUnknownPackage(Manager.GetServerConfig().ServerType + " ULTRA") || ent.GetKit().GetAvailability() == KitAvailability.Free)
{
entityName = ent.GetKit().GetAvailability().GetColor() + entityName;
}
else
{
entityName = ChatColor.RED + C.Bold + entityName;
if (ent.GetKit().GetAvailability() != KitAvailability.Blue)
entityName += ChatColor.RESET + " " + ChatColor.WHITE + C.Line + ent.GetKit().GetCost() + " Gems";
else
entityName += ChatColor.RESET + " " + ChatColor.WHITE + C.Line + "Ultra";
}
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<WatchableObject> watchables = new ArrayList<WatchableObject>();
for (WatchableObject watchableObject : (List<WatchableObject>)((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)
{
for (Scoreboard scoreboard : GetScoreboards())
{
for (Team team : scoreboard.getTeams())
team.removePlayer(player);
}
if (teamName == null)
teamName = "";
for (Scoreboard scoreboard : GetScoreboards())
{
String rankName = Manager.GetClients().Get(player).GetRank().Name;
if (!Manager.GetClients().Get(player).GetRank().Has(Rank.ULTRA) && Manager.GetDonation().Get(player.getName()).OwnsUnknownPackage(Manager.GetServerConfig().ServerType + " ULTRA"))
{
rankName = Rank.ULTRA.Name;
}
try
{
scoreboard.getTeam(rankName + 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) + "]");
}
}
}
}