Mineplex2018-withcommit/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java

961 lines
27 KiB
Java
Raw Normal View History

2013-08-27 17:14:08 +02:00
package mineplex.hub.server;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
2013-08-27 17:14:08 +02:00
import java.util.Set;
import mineplex.core.boosters.BoosterManager;
import mineplex.core.brawl.fountain.BrawlShopProvider;
import org.bukkit.Bukkit;
2013-08-27 17:14:08 +02:00
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.entity.LivingEntity;
2013-08-27 17:14:08 +02:00
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.EntityPortalEnterEvent;
import org.bukkit.event.entity.EntityPortalEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerPortalEvent;
import org.bukkit.event.player.PlayerQuitEvent;
2013-08-27 17:14:08 +02:00
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.Vector;
2013-08-27 17:14:08 +02:00
import mineplex.core.MiniDbClientPlugin;
2013-08-27 17:14:08 +02:00
import mineplex.core.account.CoreClientManager;
import mineplex.core.common.Rank;
import mineplex.core.common.util.C;
import mineplex.core.common.util.Callback;
2013-08-27 17:14:08 +02:00
import mineplex.core.common.util.F;
import mineplex.core.common.util.NautHashMap;
import mineplex.core.common.util.UtilAction;
import mineplex.core.common.util.UtilAlg;
2013-08-27 17:14:08 +02:00
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilTime;
import mineplex.core.common.util.UtilTime.TimeUnit;
import mineplex.core.donation.DonationManager;
import mineplex.core.itemstack.ItemStackFactory;
import mineplex.core.party.Party;
import mineplex.core.party.PartyManager;
2013-08-27 17:14:08 +02:00
import mineplex.core.portal.Portal;
import mineplex.core.recharge.Recharge;
import mineplex.core.shop.ShopBase;
import mineplex.core.status.ServerStatusManager;
2013-08-27 17:14:08 +02:00
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import mineplex.game.clans.core.repository.tokens.SimpleClanToken;
import mineplex.hub.HubManager;
import mineplex.hub.modules.StackerManager;
import mineplex.hub.queue.QueueManager;
import mineplex.hub.server.ui.LobbyShop;
import mineplex.hub.server.ui.QuickShop;
import mineplex.hub.server.ui.ServerCountSorter;
2013-08-27 17:14:08 +02:00
import mineplex.hub.server.ui.ServerNpcShop;
import mineplex.hub.server.ui.clans.ClansServerShop;
import mineplex.serverdata.Region;
import mineplex.serverdata.data.MinecraftServer;
import mineplex.serverdata.data.ServerGroup;
2013-08-27 17:14:08 +02:00
public class ServerManager extends MiniDbClientPlugin<SimpleClanToken> implements BrawlShopProvider
2013-08-27 17:14:08 +02:00
{
2014-09-13 09:52:44 +02:00
private static final Long FREE_PORTAL_TIMER = 20000L;
private static final Long BETA_PORTAL_TIMER = 120000L;
private static final Random random = new Random();
public final int TOP_SERVERS = 3; // The number of top contending servers for auto-joining games
public final int MIN_SLOTS_REQUIRED = 12; // The number of slots the max server must have for auto-join
public final long QUEUE_COOLDOWN = 2000; // Cooldown (in milliseconds) between queueing again for players
2013-08-27 17:14:08 +02:00
private CoreClientManager _clientManager;
private DonationManager _donationManager;
private Portal _portal;
private PartyManager _partyManager;
private ServerStatusManager _statusManager;
private HubManager _hubManager;
private BoosterManager _boosterManager;
private NautHashMap<String, Long> _queueCooldowns = new NautHashMap<String, Long>();
private NautHashMap<String, HashSet<ServerInfo>> _serverKeyInfoMap = new NautHashMap<String, HashSet<ServerInfo>>();
private NautHashMap<String, Integer> _serverPlayerCounts = new NautHashMap<String, Integer>();
2013-08-27 17:14:08 +02:00
private NautHashMap<String, ServerNpcShop> _serverNpcShopMap = new NautHashMap<String, ServerNpcShop>();
private NautHashMap<String, ServerInfo> _serverInfoMap = new NautHashMap<String, ServerInfo>();
private NautHashMap<String, Long> _serverUpdate = new NautHashMap<String, Long>();
private NautHashMap<Vector, String> _portalToServerKey = new NautHashMap<Vector, String>();
2015-12-21 08:23:59 +01:00
private ClansServerShop _clansShop;
2013-08-27 17:14:08 +02:00
// Join Time for Free Players Timer
private NautHashMap<String, Long> _joinTime = new NautHashMap<String, Long>();
private QuickShop _quickShop;
private LobbyShop _lobbyShop;
private boolean _alternateUpdateFire = false;
private boolean _retrieving = false;
private long _lastRetrieve = 0;
2013-08-27 17:14:08 +02:00
public ServerManager(JavaPlugin plugin, CoreClientManager clientManager, DonationManager donationManager, Portal portal, PartyManager partyManager, ServerStatusManager statusManager, HubManager hubManager, StackerManager stackerManager, QueueManager queueManager, BoosterManager boosterManager)
2013-08-27 17:14:08 +02:00
{
super("Server Manager", plugin, clientManager);
2013-08-27 17:14:08 +02:00
_clientManager = clientManager;
_donationManager = donationManager;
_portal = portal;
_partyManager = partyManager;
_statusManager = statusManager;
_hubManager = hubManager;
_boosterManager = boosterManager;
2013-08-27 17:14:08 +02:00
plugin.getServer().getMessenger().registerOutgoingPluginChannel(plugin, "BungeeCord");
loadServers();
_quickShop = new QuickShop(this, clientManager, donationManager, "Quick Menu");
_lobbyShop = new LobbyShop(this, clientManager, donationManager, "Lobby Menu");
// TODO: Find more appropriate place to initialize Clans server shop?
2015-12-21 08:23:59 +01:00
_clansShop = new ClansServerShop(this, _clientManager, _donationManager);
2013-08-27 17:14:08 +02:00
}
@EventHandler(priority = EventPriority.LOW)
public void playerPortalEvent(PlayerPortalEvent event)
{
event.setCancelled(true);
}
@EventHandler(priority = EventPriority.LOW)
public void entityPortalEvent(EntityPortalEvent event)
{
event.setCancelled(true);
}
@EventHandler(priority = EventPriority.LOW)
public void playerCheckPortalEvent(EntityPortalEnterEvent event)
2013-08-27 17:14:08 +02:00
{
if (!(event.getEntity() instanceof Player))
{
if (event.getEntity() instanceof LivingEntity)
UtilAction.velocity(event.getEntity(), UtilAlg.getTrajectory(event.getEntity().getLocation(), _hubManager.GetSpawn()), 1, true, 0.8, 0, 1, true);
return;
}
2014-08-01 08:22:01 +02:00
final Player player = (Player)event.getEntity();
2014-04-03 06:48:58 +02:00
if (!Recharge.Instance.use(player, "Portal Server", 1000, false, false))
return;
2014-08-01 08:22:01 +02:00
long timeUntilPortal = getMillisecondsUntilPortal(player, false);
2014-08-01 08:22:01 +02:00
if (!_hubManager.CanPortal(player) || timeUntilPortal > 0)
2013-08-27 17:14:08 +02:00
{
player.closeInventory();
2014-08-01 08:22:01 +02:00
if (timeUntilPortal > 0)
{
player.playSound(player.getEyeLocation(), Sound.CHICKEN_EGG_POP, 2, 2);
UtilPlayer.message(player, F.main("Server Portal", "You cannot join a server for " + C.cGreen + UtilTime.convertString(timeUntilPortal, 0, TimeUnit.SECONDS)));
2014-08-01 08:22:01 +02:00
}
UtilAction.velocity(player, UtilAlg.getTrajectory(player.getLocation(), _hubManager.GetSpawn()), 1.5, true, 0.8, 0, 1.0, true);
// Need to set their velocity again a tick later
// Setting Y-Velocity while in a portal doesn't seem to do anything... Science!
_plugin.getServer().getScheduler().runTask(_plugin, new Runnable()
{
@Override
public void run()
{
if (player != null && player.isOnline())
{
UtilAction.velocity(player, UtilAlg.getTrajectory(player.getLocation(), _hubManager.GetSpawn()), 1, true, 0.5, 0, 1.0, true);
}
}
});
return;
2013-08-27 17:14:08 +02:00
}
String serverKey = _portalToServerKey.get(player.getLocation().getBlock().getLocation().toVector());
if (serverKey != null)
{
List<ServerInfo> serverList = new ArrayList<ServerInfo>();
Collection<ServerInfo> servers = getServerList(serverKey);
if (servers != null && servers.size() > 0)
serverList.addAll(servers);
int slots = 1;
if (serverList.size() > 0)
{
slots = getRequiredSlots(player, serverList.get(0).ServerType);
}
try
{
Collections.sort(serverList, new ServerSorter(slots));
for (ServerInfo serverInfo : serverList)
{
if ((serverInfo.MOTD.contains("Starting") || serverInfo.MOTD.contains("Recruiting") || serverInfo.MOTD.contains("Waiting") || serverInfo.MOTD.contains("Cup")) && (serverInfo.MaxPlayers - serverInfo.CurrentPlayers) >= slots)
{
selectServer(player, serverInfo);
return;
}
}
}
catch (Exception exception)
{
exception.printStackTrace();
}
UtilPlayer.message(player, F.main("Server Portal", "There are currently no joinable servers!"));
}
}
@EventHandler
public void checkQueuePrompts(UpdateEvent event)
{
if (event.getType() != UpdateType.SEC)
return;
/*
for (final Player player : _queueManager.findPlayersNeedingPrompt())
{
player.playSound(player.getLocation(), Sound.ENDERDRAGON_GROWL, 5f, 1f);
Bukkit.getScheduler().runTaskLater(getPlugin(), new Runnable()
{
public void run()
{
if (player.isOnline())
{
_domShop.attemptShopOpen(player);
}
}
}, 20);
}
*/
}
@EventHandler(priority = EventPriority.LOW)
public void playerJoin(PlayerJoinEvent event)
{
event.getPlayer().getInventory().addItem(ItemStackFactory.Instance.CreateStack(Material.COMPASS.getId(), (byte)0, 1, ChatColor.GREEN + "Game Menu"));
event.getPlayer().getInventory().addItem(ItemStackFactory.Instance.CreateStack(Material.WATCH.getId(), (byte)0, 1, ChatColor.GREEN + "Lobby Menu"));
if (_clientManager.Get(event.getPlayer()).GetRank() == Rank.ALL)
{
_joinTime.put(event.getPlayer().getName(), System.currentTimeMillis());
}
}
@EventHandler
public void playerQuit(PlayerQuitEvent event)
{
_joinTime.remove(event.getPlayer().getName());
}
@EventHandler(priority = EventPriority.LOWEST)
public void playerInteract(PlayerInteractEvent event)
{
if (event.getItem() != null && event.getItem().getType() == Material.COMPASS)
{
_quickShop.attemptShopOpen(event.getPlayer());
}
else if (event.getItem() != null && event.getItem().getType() == Material.WATCH)
{
_lobbyShop.attemptShopOpen(event.getPlayer());
}
2013-08-27 17:14:08 +02:00
}
public Long getMillisecondsUntilPortal(Player player, boolean beta)
{
// Party party = _partyManager.GetParty(player);
long timeLeft = 0;
if (_joinTime.containsKey(player.getName()))
{
timeLeft = (_joinTime.get(player.getName()) - System.currentTimeMillis()) + (beta ? BETA_PORTAL_TIMER : FREE_PORTAL_TIMER);
if (timeLeft <= 0)
timeLeft = 0;
}
return timeLeft;
}
public void addServerGroup(ServerGroup serverGroup)
2013-08-27 17:14:08 +02:00
{
_serverKeyInfoMap.put(serverGroup.getPrefix(), new HashSet<ServerInfo>());
}
public void addServerNpc(ServerGroup serverGroup)
{
_serverNpcShopMap.put(serverGroup.getServerNpcName(), new ServerNpcShop(this, _clientManager, _donationManager, serverGroup));
2013-08-27 17:14:08 +02:00
}
public void removeServerNpc(String serverNpcName)
2013-08-27 17:14:08 +02:00
{
Set<ServerInfo> mappedServers = _serverKeyInfoMap.remove(serverNpcName);
2013-08-27 17:14:08 +02:00
_serverNpcShopMap.remove(serverNpcName);
if (mappedServers != null)
{
for (ServerInfo mappedServer : mappedServers)
{
boolean isMappedElseWhere = false;
for (String key : _serverKeyInfoMap.keySet())
2013-08-27 17:14:08 +02:00
{
for (ServerInfo value : _serverKeyInfoMap.get(key))
2013-08-27 17:14:08 +02:00
{
if (value.Name.equalsIgnoreCase(mappedServer.Name))
{
isMappedElseWhere = true;
break;
}
}
if (isMappedElseWhere)
break;
}
if (!isMappedElseWhere)
_serverInfoMap.remove(mappedServer.Name);
}
}
}
public Collection<ServerInfo> getServerList(String serverKey)
2013-08-27 17:14:08 +02:00
{
return _serverKeyInfoMap.get(serverKey);
2013-08-27 17:14:08 +02:00
}
public Set<String> getAllServers()
2013-08-27 17:14:08 +02:00
{
return _serverInfoMap.keySet();
}
public ServerInfo getServerInfo(String serverName)
2013-08-27 17:14:08 +02:00
{
return _serverInfoMap.get(serverName);
}
@EventHandler
public void updatePages(UpdateEvent event)
2013-08-27 17:14:08 +02:00
{
2014-12-24 07:36:33 +01:00
if (event.getType() != UpdateType.SEC)
2013-08-27 17:14:08 +02:00
return;
_quickShop.UpdatePages();
2013-08-27 17:14:08 +02:00
for (ServerNpcShop shop : _serverNpcShopMap.values())
2013-08-27 17:14:08 +02:00
{
shop.UpdatePages();
2013-08-27 17:14:08 +02:00
}
}
@EventHandler
public void updateServers(UpdateEvent event)
{
if (event.getType() != UpdateType.SEC || (_retrieving && System.currentTimeMillis() - _lastRetrieve <= 5000))
return;
2013-08-27 17:14:08 +02:00
_alternateUpdateFire = !_alternateUpdateFire;
if (!_alternateUpdateFire)
return;
_retrieving = true;
_statusManager.retrieveServerGroups(new Callback<Collection<ServerGroup>>()
2013-08-27 17:14:08 +02:00
{
public void run(final Collection<ServerGroup> serverGroups)
{
final NautHashMap<String, ServerGroup> serverGroupMap = new NautHashMap<String, ServerGroup>();
2014-12-23 11:15:33 +01:00
for (ServerGroup serverGroup : serverGroups)
{
serverGroupMap.put(serverGroup.getName(), serverGroup);
}
2014-12-23 11:15:33 +01:00
_statusManager.retrieveServerStatuses(new Callback<Collection<MinecraftServer>>()
{
public void run(Collection<MinecraftServer> serverStatusList)
{
_serverPlayerCounts.clear();
for (MinecraftServer serverStatus : serverStatusList)
{
if (!_serverInfoMap.containsKey(serverStatus.getName()))
{
ServerInfo newServerInfo = new ServerInfo();
newServerInfo.Name = serverStatus.getName();
_serverInfoMap.put(serverStatus.getName(), newServerInfo);
}
2014-12-23 11:15:33 +01:00
String[] args = serverStatus.getMotd().split("\\|");
String tag = (serverStatus.getName() != null && serverStatus.getName().contains("-")) ? serverStatus.getName().split("-")[0] : "N/A";
2014-12-23 11:15:33 +01:00
//Private Servers
if (serverGroupMap.containsKey(serverStatus.getGroup()))
{
ServerGroup serverGroup = serverGroupMap.get(serverStatus.getGroup());
if (serverGroup.getHost() != null && !serverGroup.getHost().isEmpty())
tag = "MPS";
}
ServerInfo serverInfo = _serverInfoMap.get(serverStatus.getName());
serverInfo.MOTD = args.length > 0 ? args[0] : serverStatus.getMotd();
serverInfo.CurrentPlayers = serverStatus.getPlayerCount();
serverInfo.MaxPlayers = serverStatus.getMaxPlayerCount();
2015-12-29 07:50:20 +01:00
for (String arg : args)
{
if (arg != null && arg.startsWith("HostRank.") && arg.length() > "HostRank.".length())
{
String rankEnum = arg.split("\\.")[1];
try
{
serverInfo.HostRank = Rank.valueOf(rankEnum);
}
catch (Exception e)
{
// Ignore
}
break;
}
}
2014-12-23 11:15:33 +01:00
if (args.length > 1)
serverInfo.ServerType = args[1];
2014-12-23 11:15:33 +01:00
if (args.length > 2)
serverInfo.Game = args[2];
2014-12-23 11:15:33 +01:00
if (args.length > 3)
serverInfo.Map = args[3];
2014-12-23 11:15:33 +01:00
_serverUpdate.put(serverStatus.getName(), System.currentTimeMillis());
2014-12-23 11:15:33 +01:00
if (_serverKeyInfoMap.containsKey(tag))
{
_serverKeyInfoMap.get(tag).add(serverInfo);
if (!_serverPlayerCounts.containsKey(tag))
_serverPlayerCounts.put(tag, 0);
_serverPlayerCounts.put(tag, _serverPlayerCounts.get(tag) + serverInfo.CurrentPlayers);
}
}
2014-12-23 11:15:33 +01:00
for (String name : _serverUpdate.keySet())
{
if (_serverUpdate.get(name) != -1L && System.currentTimeMillis() - _serverUpdate.get(name) > 5000)
{
ServerInfo serverInfo = _serverInfoMap.get(name);
serverInfo.MOTD = ChatColor.DARK_RED + "OFFLINE";
serverInfo.CurrentPlayers = 0;
serverInfo.MaxPlayers = 0;
2014-12-23 11:15:33 +01:00
_serverUpdate.put(name, -1L);
}
}
2014-12-23 11:15:33 +01:00
// Reset
_retrieving = false;
_lastRetrieve = System.currentTimeMillis();
}
});
2013-08-27 17:14:08 +02:00
}
});
updateCooldowns();
2013-08-27 17:14:08 +02:00
}
public void help(Player caller, String message)
2013-08-27 17:14:08 +02:00
{
UtilPlayer.message(caller, F.main(_moduleName, "Commands List:"));
UtilPlayer.message(caller, F.help("/servernpc create <name>", "<name> is name of npc.", Rank.OWNER));
UtilPlayer.message(caller, F.help("/servernpc delete <name>", "<name> is name of npc.", Rank.OWNER));
UtilPlayer.message(caller, F.help("/servernpc addserver <servernpc> | <name>", "Adds server.", Rank.OWNER));
UtilPlayer.message(caller, F.help("/servernpc removeserver <name>", "Removes server.", Rank.OWNER));
UtilPlayer.message(caller, F.help("/servernpc listnpcs", "Lists all server npcs.", Rank.OWNER));
UtilPlayer.message(caller, F.help("/servernpc listservers <servernpc>", "Lists all servers.", Rank.OWNER));
UtilPlayer.message(caller, F.help("/servernpc listoffline", "Shows all servers offline.", Rank.OWNER));
if (message != null)
UtilPlayer.message(caller, F.main(_moduleName, ChatColor.RED + message));
}
public void help(Player caller)
2013-08-27 17:14:08 +02:00
{
help(caller, null);
2013-08-27 17:14:08 +02:00
}
public PartyManager getPartyManager()
2013-08-27 17:14:08 +02:00
{
return _partyManager;
}
public void selectServer(org.bukkit.entity.Player player, ServerInfo serverInfo)
{
Party party = _partyManager.GetParty(player);
2013-08-27 17:14:08 +02:00
if (party == null || player.getName().equals(party.GetLeader()))
{
player.leaveVehicle();
player.eject();
_portal.sendPlayerToServer(player, serverInfo.Name);
}
2013-08-27 17:14:08 +02:00
}
/**
* Select a {@code serverType} for a {@code player} that wishes to automatically join the best server
* available for that server type.
* @param player - the player hoping to select a server
* @param serverType - the name of the type of server to be joined
*/
public void selectServer(Player player, String serverType)
{
if (isOnCooldown(player))
{
return;
}
ServerInfo bestServer = getBestServer(player, serverType);
if (bestServer != null)
{
selectServer(player, bestServer);
addCooldown(player);
}
}
private boolean isOnCooldown(Player player)
{
if (_queueCooldowns.containsKey(player.getName()))
{
long elapsed = System.currentTimeMillis() - _queueCooldowns.get(player.getName());
return elapsed < QUEUE_COOLDOWN;
}
return false;
}
private void addCooldown(Player player)
{
_queueCooldowns.put(player.getName(), System.currentTimeMillis());
}
private void updateCooldowns()
{
for (Iterator<String> playerIterator = _queueCooldowns.keySet().iterator(); playerIterator.hasNext();)
{
Player player = Bukkit.getPlayer(playerIterator.next());
if (player == null || !isOnCooldown(player))
{
playerIterator.remove();
}
}
}
/**
* @param serverType - the type of server that should be fetched
* @return the best server that a new player should join according to a {@code serverType} constraint.
*/
public ServerInfo getBestServer(Player player, String serverKey)
{
Collection<ServerInfo> serverList = getServerList(serverKey);
if (serverList == null) return null;
List<ServerInfo> servers = new ArrayList<ServerInfo>(serverList);
servers = fetchOpenServers(player, servers, servers.size()); // Removes all full servers from list
2015-08-03 12:55:33 +02:00
Collections.sort(servers, new ServerCountSorter());
int count = Math.min(servers.size(), TOP_SERVERS);
if (count > 0)
{
ServerInfo largestServer = servers.get(0);
if (largestServer.getAvailableSlots() >= MIN_SLOTS_REQUIRED || largestServer.MaxPlayers > 40)
{
return largestServer;
}
else
{
return servers.get(random.nextInt(count));
}
}
return null;
}
public List<ServerInfo> fetchOpenServers(Player player, List<ServerInfo> servers, int count)
{
List<ServerInfo> results = new ArrayList<ServerInfo>();
int requiredSlots = (servers.size() > 0) ? getRequiredSlots(player, servers.get(0).ServerType) : 0;
for (ServerInfo server : servers)
{
if (isInProgress(server))
continue;
if (results.size() >= count) break;
if (server.getAvailableSlots() > requiredSlots)
{
results.add(server);
}
}
return results;
}
private boolean isInProgress(ServerInfo serverInfo)
{
return serverInfo.MOTD.contains("Progress") || serverInfo.MOTD.contains("Restarting");
}
2013-08-27 17:14:08 +02:00
public void listServerNpcs(Player caller)
2013-08-27 17:14:08 +02:00
{
UtilPlayer.message(caller, F.main(getName(), "Listing Server Npcs:"));
2013-08-27 17:14:08 +02:00
for (String serverNpc : _serverKeyInfoMap.keySet())
2013-08-27 17:14:08 +02:00
{
UtilPlayer.message(caller, F.main(getName(), C.cYellow + serverNpc));
2013-08-27 17:14:08 +02:00
}
}
public void listServers(Player caller, String serverNpcName)
2013-08-27 17:14:08 +02:00
{
UtilPlayer.message(caller, F.main(getName(), "Listing Servers for '" + serverNpcName + "':"));
2013-08-27 17:14:08 +02:00
for (ServerInfo serverNpc : _serverKeyInfoMap.get(serverNpcName))
2013-08-27 17:14:08 +02:00
{
UtilPlayer.message(caller, F.main(getName(), C.cYellow + serverNpc.Name + C.cWhite + " - " + serverNpc.MOTD + " " + serverNpc.CurrentPlayers + "/" + serverNpc.MaxPlayers));
2013-08-27 17:14:08 +02:00
}
}
public void listOfflineServers(Player caller)
2013-08-27 17:14:08 +02:00
{
UtilPlayer.message(caller, F.main(getName(), "Listing Offline Servers:"));
2013-08-27 17:14:08 +02:00
for (ServerInfo serverNpc : _serverInfoMap.values())
{
if (serverNpc.MOTD.equalsIgnoreCase(ChatColor.DARK_RED + "OFFLINE"))
{
UtilPlayer.message(caller, F.main(getName(), C.cYellow + serverNpc.Name + C.cWhite + " - " + F.time(UtilTime.convertString(System.currentTimeMillis() - _serverUpdate.get(serverNpc.Name), 0, TimeUnit.FIT))));
2013-08-27 17:14:08 +02:00
}
}
}
public void loadServers()
2013-08-27 17:14:08 +02:00
{
_serverInfoMap.clear();
_serverUpdate.clear();
for (String npcName : _serverKeyInfoMap.keySet())
{
_serverKeyInfoMap.get(npcName).clear();
}
Region region = getPlugin().getConfig().getBoolean("serverstatus.us") ? Region.US : Region.EU;
2013-08-27 17:14:08 +02:00
try
{
for (ServerGroup serverGroup : mineplex.serverdata.servers.ServerManager.getServerRepository(region).getServerGroups(null))
2013-08-27 17:14:08 +02:00
{
2015-08-03 10:20:27 +02:00
addServerGroup(serverGroup);
2015-08-03 12:55:33 +02:00
if (!serverGroup.getServerNpcName().isEmpty())
addServerNpc(serverGroup);
if (!serverGroup.getPortalBottomCornerLocation().isEmpty() && !serverGroup.getPortalTopCornerLocation().isEmpty())
{
Vector bottomVector = ParseVector(serverGroup.getPortalBottomCornerLocation());
Vector topVector = ParseVector(serverGroup.getPortalTopCornerLocation());
int blocks = 0;
2013-08-27 17:14:08 +02:00
while (blocks < 10 && (bottomVector.getBlockX() != topVector.getBlockX() || bottomVector.getBlockZ() != topVector.getBlockZ()))
2013-08-27 17:14:08 +02:00
{
_portalToServerKey.put(new Vector(bottomVector.getBlockX(), bottomVector.getBlockY(), bottomVector.getBlockZ()), serverGroup.getPrefix());
if (bottomVector.getBlockX() != topVector.getBlockX())
{
bottomVector.add(new Vector(-(bottomVector.getBlockX() - topVector.getBlockX()) / Math.abs(bottomVector.getBlockX() - topVector.getBlockX()), 0, 0));
}
else if (bottomVector.getBlockZ() != topVector.getBlockZ())
{
bottomVector.add(new Vector(0, 0, -(bottomVector.getBlockZ() - topVector.getBlockZ()) / Math.abs(bottomVector.getBlockZ() - topVector.getBlockZ())));
}
blocks++;
2013-08-27 17:14:08 +02:00
}
_portalToServerKey.put(bottomVector, serverGroup.getPrefix());
2013-08-27 17:14:08 +02:00
}
}
}
catch (Exception e)
{
System.out.println("ServerManager - Error parsing servergroups : " + e.getMessage());
}
2015-08-03 02:41:42 +02:00
// AddServerNpc("Event Servers", "EVENT");
// AddServerNpc("Mineplex Player Servers", "MPS");
ServerGroup eventGroup = new ServerGroup("Event", "Event Servers", "EVENT");
ServerGroup mpsGroup = new ServerGroup("MPS", "Mineplex Player Servers", "MPS");
addServerNpc(eventGroup);
addServerGroup(eventGroup);
addServerNpc(mpsGroup);
addServerGroup(mpsGroup);
2013-08-27 17:14:08 +02:00
}
public int getRequiredSlots(Player player, String serverType)
{
int slots = 0;
Party party = _partyManager.GetParty(player);
if (party != null)
{
if (player.getName().equals(party.GetLeader()))
{
for (String name : party.GetPlayers())
{
Player partyPlayer = UtilPlayer.searchExact(name);
if (partyPlayer == null)
continue;
if (_clientManager.Get(partyPlayer).GetRank().has(Rank.ULTRA) || _donationManager.Get(partyPlayer.getName()).OwnsUnknownPackage(serverType + " ULTRA"))
continue;
slots++;
}
}
}
else
{
if (!_clientManager.Get(player).GetRank().has(Rank.ULTRA) && !_donationManager.Get(player.getName()).OwnsUnknownPackage(serverType + " ULTRA"))
slots++;
}
return slots;
}
public ServerNpcShop getMixedArcadeShop()
{
return _serverNpcShopMap.get("Mixed Arcade");
}
public ServerNpcShop getServerNPCShopByName(String name)
{
for(String shop : _serverNpcShopMap.keySet())
{
if(shop.equalsIgnoreCase(name))
{
return _serverNpcShopMap.get(shop);
}
}
return null;
}
public ServerNpcShop getSuperSmashMobsShop()
{
return _serverNpcShopMap.get("Super Smash Mobs");
}
@SuppressWarnings("rawtypes")
public ShopBase getDominateShop()
{
return _serverNpcShopMap.get("Dominate");
}
2015-12-21 08:23:59 +01:00
public ServerNpcShop getCtfShop()
{
return _serverNpcShopMap.get("Capture the Flag");
}
public ServerNpcShop getBridgesShop()
{
return _serverNpcShopMap.get("The Bridges");
}
public ServerNpcShop getSurvivalGamesShop()
{
2013-12-18 11:22:40 +01:00
return _serverNpcShopMap.get("Survival Games");
}
2016-01-29 09:56:49 +01:00
public ServerNpcShop getSpeedBuildersShop()
{
return _serverNpcShopMap.get("Speed Builders");
}
public ServerNpcShop getBlockHuntShop()
{
return _serverNpcShopMap.get("Block Hunt");
}
public ServerNpcShop getBetaShop()
{
2015-12-21 10:35:57 +01:00
return _serverNpcShopMap.get("Beta Monster Maze");
}
2015-12-21 08:23:59 +01:00
public ServerNpcShop getUHCShop()
{
return _serverNpcShopMap.get("Ultra Hardcore");
}
public ServerNpcShop getSKYShop()
{
return _serverNpcShopMap.get("Skywars");
}
public ServerNpcShop getPlayerGamesShop()
{
return _serverNpcShopMap.get("Mineplex Player Servers");
}
2015-12-21 08:23:59 +01:00
public ServerNpcShop getShop(String name)
{
return _serverNpcShopMap.get(name);
}
private Vector ParseVector(String vectorString)
{
Vector vector = new Vector();
String [] parts = vectorString.trim().split(" ");
vector.setX(Double.parseDouble(parts[0]));
vector.setY(Double.parseDouble(parts[1]));
vector.setZ(Double.parseDouble(parts[2]));
return vector;
}
public ServerStatusManager getStatusManager()
{
return _statusManager;
}
public ShopBase<ServerManager> getCastleSiegeShop()
{
return _serverNpcShopMap.get("Castle Siege");
}
public HubManager getHubManager()
{
return _hubManager;
}
public ShopBase<ServerManager> getDrawMyThingShop()
{
return _serverNpcShopMap.get("Draw My Thing");
}
public ShopBase<ServerManager> getTeamDeathmatchShop()
{
return _serverNpcShopMap.get("Team Deathmatch");
}
public ShopBase<ServerManager> getMinestrikeShop()
{
return _serverNpcShopMap.get("Mine-Strike");
}
2015-05-01 08:24:01 +02:00
public ShopBase<ServerManager> getWizardShop()
{
return _serverNpcShopMap.get("Wizards");
}
public int getGroupTagPlayerCount(String tag)
{
if (_serverPlayerCounts.containsKey(tag))
return _serverPlayerCounts.get(tag);
else
return 0;
}
public ShopBase<ServerManager> getBuildShop()
{
return _serverNpcShopMap.get("Master Builders");
}
2015-12-21 08:23:59 +01:00
public ClansServerShop getClansShop()
{
return _clansShop;
}
public ShopBase<ServerManager> getTypeWarsShop()
{
return _serverNpcShopMap.get("Type Wars");
}
public ShopBase<ServerManager> getValentinesShop()
{
return _serverNpcShopMap.get("Valentines Vendetta");
}
public ShopBase<ServerManager> getBrawlShop()
{
return _serverNpcShopMap.get("Weekend Brawl");
}
@Override
public String getQuery(int accountId, String uuid, String name)
{
return "SELECT clans.name, accountClan.clanRole, clanServer.serverName, clans.id FROM accountClan INNER JOIN clans ON clans.id = accountClan.clanId INNER JOIN clanServer ON clans.serverId = clanServer.id WHERE accountClan.accountId = " + accountId + ";";
}
@Override
public void processLoginResultSet(String playerName, int accountId, ResultSet resultSet) throws SQLException
{
SimpleClanToken clanToken = new SimpleClanToken();
while (resultSet.next())
{
String clanName = resultSet.getString(1);
String clanRole = resultSet.getString(2);
String homeServer = resultSet.getString(3);
int clanId = resultSet.getInt(4);
clanToken = new SimpleClanToken(clanName, clanRole, homeServer, clanId);
}
Set(playerName, clanToken);
}
@Override
protected SimpleClanToken AddPlayer(String player)
{
return new SimpleClanToken();
}
public BoosterManager getBoosterManager()
{
return _boosterManager;
}
2013-08-27 17:14:08 +02:00
}