Mineplex2018-withcommit/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java

664 lines
17 KiB
Java
Raw Normal View History

2013-08-27 17:14:08 +02:00
package nautilus.game.arcade.managers;
2014-03-13 08:18:22 +01:00
import java.util.ArrayList;
2013-08-27 17:14:08 +02:00
import java.util.Iterator;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
2014-10-10 09:54:38 +02:00
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilDisplay;
2013-08-27 17:14:08 +02:00
import mineplex.core.common.util.UtilInv;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilTime;
2014-08-22 20:30:41 +02:00
import mineplex.minecraft.game.core.condition.Condition.ConditionType;
import mineplex.core.mount.Mount;
2014-08-22 20:30:41 +02:00
import mineplex.core.mount.types.MountDragon;
2013-08-27 17:14:08 +02:00
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.RestartServerEvent;
2013-08-27 17:14:08 +02:00
import mineplex.core.updater.event.UpdateEvent;
import nautilus.game.arcade.ArcadeManager;
import nautilus.game.arcade.GameType;
2014-04-05 07:52:23 +02:00
import nautilus.game.arcade.events.GamePrepareCountdownCommence;
2013-08-27 17:14:08 +02:00
import nautilus.game.arcade.events.GameStateChangeEvent;
2014-03-14 10:17:06 +01:00
import nautilus.game.arcade.events.PlayerPrepareTeleportEvent;
2013-08-27 17:14:08 +02:00
import nautilus.game.arcade.events.PlayerStateChangeEvent;
import nautilus.game.arcade.game.Game;
import nautilus.game.arcade.game.GameTeam;
import nautilus.game.arcade.game.Game.GameState;
2014-03-14 10:17:06 +01:00
import nautilus.game.arcade.game.GameTeam.PlayerState;
import nautilus.game.arcade.stats.StatTracker;
2013-08-27 17:14:08 +02:00
import org.bukkit.ChatColor;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.GameMode;
import org.bukkit.Sound;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
2013-08-27 17:14:08 +02:00
import org.bukkit.event.Listener;
public class GameManager implements Listener
{
ArcadeManager Manager;
private int _colorId = 0;
2013-08-27 17:14:08 +02:00
public GameManager(ArcadeManager manager)
{
Manager = manager;
Manager.GetPluginManager().registerEvents(this, Manager.GetPlugin());
}
@EventHandler
public void DisplayIP(UpdateEvent event)
{
if (event.getType() != UpdateType.FASTER)
return;
if (Manager.GetGame() != null && Manager.GetGame().GetState() != GameState.Live)
{
ChatColor col = ChatColor.RED;
if (_colorId == 1) col = ChatColor.YELLOW;
else if (_colorId == 2) col = ChatColor.GREEN;
else if (_colorId == 3) col = ChatColor.AQUA;
_colorId = (_colorId+1)%4;
String text = col + C.Bold + "US.MINEPLEX.COM EU.MINEPLEX.COM";
double health = 1;
if (Manager.GetGame().GetState() == GameState.Prepare)
{
health = (9 - (System.currentTimeMillis() - Manager.GetGame().GetStateTime())/1000d) / 9d;
}
else if (Manager.GetGame().GetState() == GameState.Recruit)
{
if (Manager.GetGame().GetCountdown() >= 0)
health = Manager.GetGame().GetCountdown() / 60d;
}
for (Player player : UtilServer.getPlayers())
UtilDisplay.displayTextBar(Manager.GetPlugin(), player, health, text);
for (Mount mount : Manager.getCosmeticManager().getMountManager().getMounts())
{
2014-08-22 20:30:41 +02:00
if (mount instanceof MountDragon)
{
2014-08-22 20:30:41 +02:00
((MountDragon) mount).SetName(text);
((MountDragon) mount).setHealthPercent(health);
}
}
}
}
2013-08-27 17:14:08 +02:00
@EventHandler
public void StateUpdate(UpdateEvent event)
{
if (event.getType() != UpdateType.SEC)
return;
Game game = Manager.GetGame();
if (game == null) return;
if (game.GetState() == GameState.Loading)
{
if (UtilTime.elapsed(game.GetStateTime(), 30000))
{
System.out.println("Game Load Expired.");
game.SetState(GameState.Dead);
}
}
2013-08-27 17:14:08 +02:00
else if (game.GetState() == GameState.Recruit)
{
//Stop Countdown!
if (game.GetCountdown() != -1 &&
UtilServer.getPlayers().length < Manager.GetPlayerMin() &&
2013-11-24 11:58:55 +01:00
!game.GetCountdownForce())
2013-08-27 17:14:08 +02:00
{
game.SetCountdown(-1);
Manager.GetLobby().DisplayWaiting();
}
2014-10-03 02:49:26 +02:00
if (Manager.IsGameAutoStart())
{
if (UtilServer.getPlayers().length >= Manager.GetPlayerFull())
StateCountdown(game, 20, false);
2013-08-27 17:14:08 +02:00
else if (UtilServer.getPlayers().length >= Manager.GetPlayerMin())
StateCountdown(game, 60, false);
else if (game.GetCountdown() != -1)
StateCountdown(game, -1, false);
}
2014-10-03 02:49:26 +02:00
else if (game.GetCountdown() != -1)
{
StateCountdown(game, -1, false);
}
2013-08-27 17:14:08 +02:00
}
else if (game.GetState() == GameState.Prepare)
{
2014-03-13 08:18:22 +01:00
if (game.CanStartPrepareCountdown())
2013-08-27 17:14:08 +02:00
{
2014-03-13 08:18:22 +01:00
if (UtilTime.elapsed(game.GetStateTime(), 9000))
2013-08-27 17:14:08 +02:00
{
2014-03-13 08:18:22 +01:00
for (Player player : UtilServer.getPlayers())
player.playSound(player.getLocation(), Sound.NOTE_PLING, 2f, 2f);
if (game.GetPlayers(true).size() < 2)
{
game.Announce(C.cWhite + C.Bold + game.GetName() + " ended, not enough players!");
game.SetState(GameState.Dead);
}
else
{
game.SetState(GameState.Live);
}
2013-08-27 17:14:08 +02:00
}
else
{
2014-03-13 08:18:22 +01:00
for (Player player : UtilServer.getPlayers())
player.playSound(player.getLocation(), Sound.NOTE_STICKS, 1f, 1f);
2013-08-27 17:14:08 +02:00
}
}
}
else if (game.GetState() == GameState.Live)
2013-08-27 17:14:08 +02:00
{
if (UtilTime.elapsed(game.GetStateTime(), game.GameTimeout) && Manager.IsGameTimeout())
2013-08-27 17:14:08 +02:00
{
2014-07-26 09:40:17 +02:00
game.HandleTimeout();
2013-08-27 17:14:08 +02:00
}
}
else if (game.GetState() == GameState.End)
{
if (UtilTime.elapsed(game.GetStateTime(), 10000))
{
game.SetState(GameState.Dead);
}
}
}
public void StateCountdown(Game game, int timer, boolean force)
{
//Always give time to pick team.
if (!game.GetCountdownForce() && !force && !UtilTime.elapsed(game.GetStateTime(), 15000))
{
return;
}
//Disabling Cosmetics
if (game.GetCountdown() <= 5 && game.GetCountdown() >= 0)
{
if (Manager.getCosmeticManager().isShowingInterface())
{
2014-08-11 07:33:45 +02:00
Manager.getCosmeticManager().setActive(false);
Manager.getCosmeticManager().disableItemsForGame();
}
}
2013-08-27 17:14:08 +02:00
if (force)
game.SetCountdownForce(true);
//Team Preference
TeamPreferenceJoin(game);
//Team Swap
TeamPreferenceSwap(game);
//Team Default
TeamDefaultJoin(game);
//Team Inform STILL Queued
if (game.GetCountdown() == -1)
{
game.InformQueuePositions();
//game.AnnounceGame();
2013-08-27 17:14:08 +02:00
}
//Initialise Countdown
if (force)
game.SetCountdownForce(true);
//Start Timer
if (game.GetCountdown() == -1)
game.SetCountdown(timer + 1);
//Decrease Timer
if (game.GetCountdown() > timer + 1 && timer != -1)
game.SetCountdown(timer + 1);
//Countdown--
if (game.GetCountdown() > 0)
game.SetCountdown(game.GetCountdown() - 1);
//Inform Countdown
if (game.GetCountdown() > 0)
{
Manager.GetLobby().WriteGameLine("starting in " + game.GetCountdown() + "...", 3, 159, (byte)13);
}
else
{
Manager.GetLobby().WriteGameLine("game in progress", 3, 159, (byte)13);
}
if (game.GetCountdown() > 0 && game.GetCountdown() <= 10)
for (Player player : UtilServer.getPlayers())
player.playSound(player.getLocation(), Sound.NOTE_PLING, 1f, 1f);
//Countdown Ended
if (game.GetCountdown() == 0)
game.SetState(GameState.Prepare);
}
@EventHandler
public void restartServerCheck(RestartServerEvent event)
{
if (Manager.GetGame() != null && Manager.GetGame().GetState() != GameState.Recruit)
event.setCancelled(true);
}
2014-09-18 07:44:48 +02:00
2013-08-27 17:14:08 +02:00
@EventHandler
public void KitRegister(GameStateChangeEvent event)
{
2013-09-23 08:00:35 +02:00
if (event.GetState() != event.GetGame().KitRegisterState)
2013-08-27 17:14:08 +02:00
return;
event.GetGame().RegisterKits();
}
@EventHandler
public void KitDeregister(GameStateChangeEvent event)
{
if (event.GetState() != GameState.Dead)
return;
event.GetGame().DeregisterKits();
event.GetGame().deRegisterStats();
2013-08-27 17:14:08 +02:00
}
2014-08-08 09:05:11 +02:00
2014-08-14 03:23:48 +02:00
2014-08-14 03:23:48 +02:00
@EventHandler
public void ScoreboardTitle(UpdateEvent event)
{
if (event.getType() != UpdateType.FASTEST)
return;
Game game = Manager.GetGame();
if (game == null) return;
game.GetScoreboard().UpdateTitle();
}
2013-08-27 17:14:08 +02:00
@EventHandler(priority = EventPriority.LOWEST) //BEFORE PARSE DATA
public void TeamGeneration(GameStateChangeEvent event)
{
if (event.GetState() != GameState.Recruit)
return;
Game game = event.GetGame();
2014-10-10 09:54:38 +02:00
int count = 1;
2013-08-27 17:14:08 +02:00
for (String team : game.WorldData.SpawnLocs.keySet())
{
ChatColor color;
if (team.equalsIgnoreCase("RED")) color = ChatColor.RED;
else if (team.equalsIgnoreCase("YELLOW")) color = ChatColor.YELLOW;
else if (team.equalsIgnoreCase("GREEN")) color = ChatColor.GREEN;
else if (team.equalsIgnoreCase("BLUE")) color = ChatColor.AQUA;
else
{
color = ChatColor.DARK_GREEN;
2014-09-11 09:44:57 +02:00
if (game.GetTeamList().size()%14 == 0) if (game.WorldData.SpawnLocs.size() > 1) color = ChatColor.RED;
if (game.GetTeamList().size()%14 == 1) color = ChatColor.YELLOW;
if (game.GetTeamList().size()%14 == 2) color = ChatColor.GREEN;
if (game.GetTeamList().size()%14 == 3) color = ChatColor.AQUA;
if (game.GetTeamList().size()%14 == 4) color = ChatColor.GOLD;
if (game.GetTeamList().size()%14 == 5) color = ChatColor.LIGHT_PURPLE;
if (game.GetTeamList().size()%14 == 6) color = ChatColor.DARK_BLUE;
if (game.GetTeamList().size()%14 == 7) color = ChatColor.WHITE;
if (game.GetTeamList().size()%14 == 8) color = ChatColor.BLUE;
if (game.GetTeamList().size()%14 == 9) color = ChatColor.DARK_GREEN;
if (game.GetTeamList().size()%14 == 10) color = ChatColor.DARK_PURPLE;
2014-10-10 09:54:38 +02:00
if (game.GetTeamList().size()%14 == 11) color = ChatColor.DARK_RED;
if (game.GetTeamList().size()%14 == 12) color = ChatColor.DARK_AQUA;
}
//Random Names
String teamName = team;
if (game.WorldData.SpawnLocs.size() > 12)
{
teamName = "" + count;
count++;
2013-08-27 17:14:08 +02:00
}
2014-10-10 09:54:38 +02:00
GameTeam newTeam = new GameTeam(game, teamName, color, game.WorldData.SpawnLocs.get(team));
2013-08-27 17:14:08 +02:00
game.AddTeam(newTeam);
}
//Restrict Kits
game.RestrictKits();
//Parse Data
game.ParseData();
}
@EventHandler(priority = EventPriority.MONITOR)
public void TeamScoreboardCreation(GameStateChangeEvent event)
{
if (event.GetState() != GameState.Recruit)
return;
2014-06-10 04:51:47 +02:00
event.GetGame().GetScoreboard().CreateTeams();
2013-08-27 17:14:08 +02:00
}
public void TeamPreferenceJoin(Game game)
{
//Preferred Team No Longer Full
for (GameTeam team : game.GetTeamPreferences().keySet())
{
Iterator<Player> queueIterator = game.GetTeamPreferences().get(team).iterator();
while (queueIterator.hasNext())
{
Player player = queueIterator.next();
if (!game.CanJoinTeam(team))
break;
2013-08-27 17:14:08 +02:00
queueIterator.remove();
if (!game.IsPlaying(player))
{
PlayerAdd(game, player, team);
}
else
{
game.SetPlayerTeam(player, team, true);
2013-08-27 17:14:08 +02:00
}
}
}
}
public void TeamPreferenceSwap(Game game)
{
//Preferred Team No Longer Full
for (GameTeam team : game.GetTeamPreferences().keySet())
{
Iterator<Player> queueIterator = game.GetTeamPreferences().get(team).iterator();
while (queueIterator.hasNext())
{
Player player = queueIterator.next();
GameTeam currentTeam = game.GetTeam(player);
//Not on team, cannot swap
if (currentTeam == null)
continue;
// Other without concurrent (order doesn't matter as first case will fire
if (team == currentTeam)
{
queueIterator.remove();
continue;
}
for (Player other : team.GetPlayers(false))
{
if (other.equals(player))
continue;
GameTeam otherPref = game.GetTeamPreference(other);
if (otherPref == null)
continue;
if (otherPref.equals(currentTeam))
{
UtilPlayer.message(player, F.main("Team", "You swapped team with " + F.elem(team.GetColor() + other.getName()) + "."));
UtilPlayer.message(other, F.main("Team", "You swapped team with " + F.elem(currentTeam.GetColor() + player.getName()) + "."));
//Player Swap
queueIterator.remove();
game.SetPlayerTeam(player, team, true);
2013-08-27 17:14:08 +02:00
//Other Swap
game.SetPlayerTeam(other, currentTeam, true);
break;
2013-08-27 17:14:08 +02:00
}
}
}
}
}
public void TeamDefaultJoin(Game game)
{
//Team Default
for (Player player : UtilServer.getPlayers())
{
if (player.isDead())
{
2014-03-15 05:49:01 +01:00
player.sendMessage(F.main("Afk Monitor", "You are being sent to the Lobby for being AFK."));
Manager.GetPortal().SendPlayerToServer(player, "Lobby");
}
else if (Manager.IsObserver(player))
{
2013-08-27 17:14:08 +02:00
}
else if (!game.IsPlaying(player) && Manager.IsTeamAutoJoin())
2013-08-27 17:14:08 +02:00
{
PlayerAdd(game, player, null);
}
}
}
@EventHandler
public void TeamQueueSizeUpdate(UpdateEvent event)
{
if (event.getType() != UpdateType.TICK)
return;
Game game = Manager.GetGame();
if (game == null) return;
for (GameTeam team : game.GetTeamList())
{
int amount = 0;
if (game.GetTeamPreferences().containsKey(team))
{
amount = game.GetTeamPreferences().get(team).size();
}
if (team.GetTeamEntity() == null)
continue;
2013-08-27 17:14:08 +02:00
if (game.GetCountdown() == -1)
{
team.GetTeamEntity().setCustomName(team.GetFormattedName() + " Team" + ChatColor.RESET + " " + amount + " Queued");
}
else
{
team.GetTeamEntity().setCustomName(team.GetPlayers(false).size() + " Players " + team.GetFormattedName() + " Team" + ChatColor.RESET + " " + amount + " Queued");
}
}
}
2013-08-27 17:14:08 +02:00
public boolean PlayerAdd(Game game, Player player, GameTeam team)
{
if (team == null)
team = game.ChooseTeam(player);
if (team == null)
return false;
game.SetPlayerTeam(player, team, true);
2013-08-27 17:14:08 +02:00
//Game Mode
player.setGameMode(GameMode.SURVIVAL);
return true;
}
@EventHandler(priority = EventPriority.LOW)
2013-08-27 17:14:08 +02:00
public void PlayerPrepare(GameStateChangeEvent event)
{
2014-03-13 08:18:22 +01:00
final Game game = event.GetGame();
2013-08-27 17:14:08 +02:00
if (event.GetState() != GameState.Prepare)
return;
2014-03-13 08:18:22 +01:00
final ArrayList<Player> players = game.GetPlayers(true);
2013-08-27 17:14:08 +02:00
//Prepare Players
2014-03-13 08:18:22 +01:00
for (int i=0 ; i<players.size() ; i++)
2013-08-27 17:14:08 +02:00
{
2014-03-13 08:18:22 +01:00
final Player player = players.get(i);
final GameTeam team = game.GetTeam(player);
UtilServer.getServer().getScheduler().runTaskLater(Manager.GetPlugin(), new Runnable()
{
public void run()
{
//Teleport
2014-03-14 10:17:06 +01:00
team.SpawnTeleport(player);
2014-03-13 08:18:22 +01:00
Manager.Clear(player);
UtilInv.Clear(player);
2013-08-27 17:14:08 +02:00
2014-03-13 08:18:22 +01:00
game.ValidateKit(player, game.GetTeam(player));
2013-08-27 17:14:08 +02:00
2014-03-13 08:18:22 +01:00
if (game.GetKit(player) != null)
game.GetKit(player).ApplyKit(player);
2014-03-14 10:17:06 +01:00
//Event
PlayerPrepareTeleportEvent playerStateEvent = new PlayerPrepareTeleportEvent(game, player);
UtilServer.getServer().getPluginManager().callEvent(playerStateEvent);
2014-03-13 08:18:22 +01:00
}
}, i * game.TickPerTeleport);
2013-08-27 17:14:08 +02:00
}
2014-03-13 08:18:22 +01:00
//Announce Game after every player is TP'd in
UtilServer.getServer().getScheduler().runTaskLater(Manager.GetPlugin(), new Runnable()
{
public void run()
{
game.AnnounceGame();
game.StartPrepareCountdown();
2014-04-05 07:52:23 +02:00
//Event
GamePrepareCountdownCommence event = new GamePrepareCountdownCommence(game);
UtilServer.getServer().getPluginManager().callEvent(event);
2014-03-13 08:18:22 +01:00
}
}, players.size() * game.TickPerTeleport);
//Spectators Move
for (Player player : UtilServer.getPlayers())
{
if (Manager.GetGame().IsAlive(player))
continue;
Manager.GetGame().SetSpectator(player);
}
2013-08-27 17:14:08 +02:00
}
@EventHandler
2014-03-22 00:44:31 +01:00
public void PlayerTeleportOut(GameStateChangeEvent event)
2013-08-27 17:14:08 +02:00
{
if (event.GetState() != GameState.Dead)
return;
2014-03-22 00:44:31 +01:00
final Player[] players = UtilServer.getPlayers();
//Prepare Players
for (int i=0 ; i<players.length ; i++)
2013-08-27 17:14:08 +02:00
{
2014-03-22 00:44:31 +01:00
final Player player = players[i];
UtilServer.getServer().getScheduler().runTaskLater(Manager.GetPlugin(), new Runnable()
{
public void run()
{
Manager.Clear(player);
UtilInv.Clear(player);
Manager.GetCondition().EndCondition(player, ConditionType.CLOAK, "Spectator");
player.eject();
player.leaveVehicle();
player.teleport(Manager.GetLobby().GetSpawn());
}
}, i);
2013-08-27 17:14:08 +02:00
}
}
2014-03-22 00:44:31 +01:00
@EventHandler
public void disguiseClean(GameStateChangeEvent event)
{
if (event.GetState() != GameState.Dead)
return;
Manager.GetDisguise().clearDisguises();
}
2013-08-27 17:14:08 +02:00
2014-01-18 02:56:00 +01:00
2013-08-27 17:14:08 +02:00
@EventHandler
public void WorldFireworksUpdate(UpdateEvent event)
{
if (event.getType() != UpdateType.FASTEST)
return;
Game game = Manager.GetGame();
if (game == null) return;
if (game.GetState() != GameState.End)
return;
Color color = Color.GREEN;
if (game.WinnerTeam != null)
{
if (game.WinnerTeam.GetColor() == ChatColor.RED) color = Color.RED;
else if (game.WinnerTeam.GetColor() == ChatColor.AQUA) color = Color.BLUE;
else if (game.WinnerTeam.GetColor() == ChatColor.YELLOW) color = Color.YELLOW;
else color = Color.LIME;
}
FireworkEffect effect = FireworkEffect.builder().flicker(false).withColor(color).with(Type.BALL_LARGE).trail(false).build();
try
{
Manager.GetFirework().playFirework(game.GetSpectatorLocation().clone().add(
Math.random()*160-80, 10 + Math.random()*20, Math.random()*160-80), effect);
}
catch (Exception e)
{
e.printStackTrace();
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void EndUpdate(UpdateEvent event)
{
if (event.getType() != UpdateType.SEC)
return;
Game game = Manager.GetGame();
if (game == null) return;
game.EndCheck();
}
@EventHandler(priority = EventPriority.MONITOR)
public void EndStateChange(PlayerStateChangeEvent event)
{
event.GetGame().EndCheck();
}
}