8110506ac4
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.
1133 lines
30 KiB
Java
1133 lines
30 KiB
Java
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) + "]");
|
||
}
|
||
}
|
||
}
|
||
}
|