Merge branch 'master' of ssh://184.154.0.242:7999/min/mineplex

This commit is contained in:
Chiss 2014-08-01 17:45:35 +10:00
commit fb1f4ed5ac
11 changed files with 638 additions and 522 deletions

View File

@ -2,7 +2,7 @@ package mineplex.core.portal.Commands;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import mineplex.core.command.*; import mineplex.core.command.CommandBase;
import mineplex.core.common.Rank; import mineplex.core.common.Rank;
import mineplex.core.common.util.C; import mineplex.core.common.util.C;
import mineplex.core.common.util.Callback; import mineplex.core.common.util.Callback;
@ -84,6 +84,13 @@ public class ServerCommand extends CommandBase<Portal>
else else
deniedAccess = true; deniedAccess = true;
} }
else if (!servUp.contains("FREE"))
{
if (playerRank.Has(Rank.ULTRA))
Plugin.SendPlayerToServerWithMessage(player, args[0]);
else
deniedAccess = true;
}
else else
{ {
Plugin.SendPlayerToServerWithMessage(player, args[0]); Plugin.SendPlayerToServerWithMessage(player, args[0]);

View File

@ -0,0 +1,19 @@
package mineplex.core.shop.item;
import org.bukkit.entity.Player;
public abstract class SingleButton implements IButton
{
public abstract void Clicked(Player player);
public void ClickedLeft(Player player)
{
Clicked(player);
}
public void ClickedRight(Player player)
{
Clicked(player);
}
}

View File

@ -9,4 +9,9 @@ public class ServerInfo
public String Map; public String Map;
public String ServerType; public String ServerType;
public String Game; public String Game;
public boolean isFree()
{
return Name.contains("FREE");
}
} }

View File

@ -12,7 +12,6 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Sound; import org.bukkit.Sound;
@ -25,6 +24,7 @@ import org.bukkit.event.entity.EntityPortalEvent;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerPortalEvent; import org.bukkit.event.player.PlayerPortalEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
@ -62,6 +62,8 @@ import mineplex.hub.server.ui.ServerNpcShop;
public class ServerManager extends MiniPlugin public class ServerManager extends MiniPlugin
{ {
private static final Long FREE_PORTAL_TIMER = 60000L;
private CoreClientManager _clientManager; private CoreClientManager _clientManager;
private DonationManager _donationManager; private DonationManager _donationManager;
private Portal _portal; private Portal _portal;
@ -78,6 +80,9 @@ public class ServerManager extends MiniPlugin
private NautHashMap<String, Long> _serverUpdate = new NautHashMap<String, Long>(); private NautHashMap<String, Long> _serverUpdate = new NautHashMap<String, Long>();
private NautHashMap<Vector, String> _serverPortalLocations = new NautHashMap<Vector, String>(); private NautHashMap<Vector, String> _serverPortalLocations = new NautHashMap<Vector, String>();
// Join Time for Free Players Timer
private NautHashMap<String, Long> _freeJoinTime = new NautHashMap<String, Long>();
private QueueShop _domShop; private QueueShop _domShop;
private QuickShop _quickShop; private QuickShop _quickShop;
private LobbyShop _lobbyShop; private LobbyShop _lobbyShop;
@ -103,7 +108,6 @@ public class ServerManager extends MiniPlugin
LoadServers(); LoadServers();
new ServerManagerUpdater(this);
_quickShop = new QuickShop(this, clientManager, donationManager, "Quick Menu"); _quickShop = new QuickShop(this, clientManager, donationManager, "Quick Menu");
_lobbyShop = new LobbyShop(this, clientManager, donationManager, "Lobby Menu"); _lobbyShop = new LobbyShop(this, clientManager, donationManager, "Lobby Menu");
//_domShop = new new QueueShop(_queueManager, clientManager, donationManager, "Dominate"); //_domShop = new new QueueShop(_queueManager, clientManager, donationManager, "Dominate");
@ -132,17 +136,40 @@ public class ServerManager extends MiniPlugin
return; return;
} }
Player player = (Player)event.getEntity(); final Player player = (Player)event.getEntity();
if (!_hubManager.CanPortal(player))
{
UtilAction.velocity(player, UtilAlg.getTrajectory(player.getLocation(), _hubManager.GetSpawn()), 1, true, 0.8, 0, 1, true);
return;
}
if (!Recharge.Instance.use(player, "Portal Server", 1000, false, false)) if (!Recharge.Instance.use(player, "Portal Server", 1000, false, false))
return; return;
long timeUntilPortal = getMillisecondsUntilPortal(player);
if (!_hubManager.CanPortal(player) || timeUntilPortal > 0)
{
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)));
}
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;
}
String serverName = _serverPortalLocations.get(player.getLocation().getBlock().getLocation().toVector()); String serverName = _serverPortalLocations.get(player.getLocation().getBlock().getLocation().toVector());
if (serverName != null) if (serverName != null)
@ -159,11 +186,16 @@ public class ServerManager extends MiniPlugin
try try
{ {
Collections.sort(serverList, new ServerSorter(slots)); Collections.sort(serverList, new ServerSorter(slots));
boolean hasUltra = _clientManager.Get(player).GetRank().Has(Rank.ULTRA);
for (ServerInfo serverInfo : serverList) 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) if ((serverInfo.MOTD.contains("Starting") || serverInfo.MOTD.contains("Recruiting") || serverInfo.MOTD.contains("Waiting") || serverInfo.MOTD.contains("Cup")) && (serverInfo.MaxPlayers - serverInfo.CurrentPlayers) >= slots)
{ {
// Make sure ultra players get put on premium servers, non premium gets placed on free servers
if (hasUltra == serverInfo.isFree())
continue;
SelectServer(player, serverInfo); SelectServer(player, serverInfo);
return; return;
} }
@ -175,7 +207,7 @@ public class ServerManager extends MiniPlugin
exception.printStackTrace(); exception.printStackTrace();
} }
player.sendMessage(F.main("Server Portal", "There are currently no joinable servers!")); UtilPlayer.message(player, F.main("Server Portal", "There are currently no joinable servers!"));
} }
} }
@ -209,6 +241,17 @@ public class ServerManager extends MiniPlugin
{ {
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.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")); 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)
{
_freeJoinTime.put(event.getPlayer().getName(), System.currentTimeMillis());
}
}
@EventHandler
public void playerQuit(PlayerQuitEvent event)
{
_freeJoinTime.remove(event.getPlayer().getName());
} }
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
@ -224,6 +267,36 @@ public class ServerManager extends MiniPlugin
} }
} }
public Long getMillisecondsUntilPortal(Player player)
{
// Party party = _partyManager.GetParty(player);
long timeLeft = 0;
if (_freeJoinTime.containsKey(player.getName()))
{
timeLeft = (_freeJoinTime.get(player.getName()) - System.currentTimeMillis()) + FREE_PORTAL_TIMER;
if (timeLeft <= 0)
{
_freeJoinTime.remove(player.getName());
timeLeft = 0;
}
}
// if (party != null)
// {
// if (player.getName().equals(party.GetLeader()))
// {
// for (Player partyPlayer : party.GetPlayersOnline())
// {
// if (!partyPlayer.equals(player))
// timeLeft = Math.max(timeLeft, getMillisecondsUntilPortal(partyPlayer));
// }
// }
// }
return timeLeft;
}
public void RemoveServer(String serverName) public void RemoveServer(String serverName)
{ {
for (String key : _serverKeyInfoMap.keySet()) for (String key : _serverKeyInfoMap.keySet())

View File

@ -1,180 +0,0 @@
package mineplex.hub.server;
import java.io.File;
import java.io.FileInputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.FileUtils;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import mineplex.core.common.util.NautHashMap;
import mineplex.core.logger.Logger;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
public class ServerManagerUpdater implements Listener
{
private ServerManager _plugin;
private NautHashMap<String, String> _jarMd5Map = new NautHashMap<String, String>();
private File _updateDirectory;
private boolean _needUpdate = false;
public ServerManagerUpdater(ServerManager plugin)
{
_plugin = plugin;
getCurrentMd5s();
boolean windows = System.getProperty("os.name").startsWith("Windows");
_updateDirectory = new File((windows ? "C:" : File.separator + "home" + File.separator + "mineplex") + File.separator + "update" + File.separator + "lobby");
_updateDirectory.mkdirs();
plugin.GetPluginManager().registerEvents(this, plugin.GetPlugin());
}
private void getCurrentMd5s()
{
File serverManagerDat = new File("ServerManager.dat");
FileInputStream fis = null;
try
{
fis = new FileInputStream(serverManagerDat);
_jarMd5Map.put(serverManagerDat.getName(), DigestUtils.md5Hex(fis));
}
catch (Exception ex)
{
Logger.Instance.log(ex);
System.out.println("ServerManagerUpdater: Error parsing ServerManager dat md5's");
ex.printStackTrace();
}
finally
{
if (fis != null)
{
try
{
fis.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
@EventHandler
public void checkForNewFiles(UpdateEvent event)
{
if (event.getType() != UpdateType.FAST)
return;
FilenameFilter statsFilter = new FilenameFilter()
{
public boolean accept(File paramFile, String paramString)
{
if (paramString.endsWith("dat"))
{
return true;
}
return false;
}
};
for (File f : _updateDirectory.listFiles(statsFilter))
{
FileInputStream fis = null;
try
{
if (_jarMd5Map.containsKey(f.getName()))
{
fis = new FileInputStream(f);
String md5 = DigestUtils.md5Hex(fis);
if (!md5.equals(_jarMd5Map.get(f.getName())))
{
_needUpdate = true;
}
}
}
catch (Exception ex)
{
Logger.Instance.log(ex);
System.out.println("ServerManagerUpdater: Error parsing dat md5's");
ex.printStackTrace();
}
finally
{
if (fis != null)
{
try
{
fis.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
if (_needUpdate)
{
updateFiles();
}
}
private void updateFiles()
{
_needUpdate = false;
boolean windows = System.getProperty("os.name").startsWith("Windows");
File updateDir = new File((windows ? "C:" : File.separator + "home" + File.separator + "mineplex") + File.separator + "update" + File.separator + "lobby");
File currentDir = new File(".");
updateDir.mkdirs();
FilenameFilter statsFilter = new FilenameFilter()
{
public boolean accept(File paramFile, String paramString)
{
if (paramString.endsWith("dat"))
{
return true;
}
return false;
}
};
for (File f : updateDir.listFiles(statsFilter))
{
try
{
FileUtils.copyFileToDirectory(f, currentDir);
}
catch (Exception ex)
{
Logger.Instance.log(ex);
System.out.println("ServerManagerUpdater: Error updating dats");
ex.printStackTrace();
}
}
getCurrentMd5s();
_plugin.LoadServers();
}
}

View File

@ -4,26 +4,40 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import mineplex.core.account.CoreClientManager; import mineplex.core.account.CoreClientManager;
import mineplex.core.common.Rank; import mineplex.core.common.Rank;
import mineplex.core.common.util.C; import mineplex.core.common.util.C;
import mineplex.core.common.util.F; import mineplex.core.common.util.UtilTime;
import mineplex.core.donation.DonationManager; import mineplex.core.donation.DonationManager;
import mineplex.core.logger.Logger; import mineplex.core.logger.Logger;
import mineplex.core.shop.item.ShopItem; import mineplex.core.shop.item.ShopItem;
import mineplex.core.shop.item.SingleButton;
import mineplex.core.shop.page.ShopPageBase; import mineplex.core.shop.page.ShopPageBase;
import mineplex.hub.server.ServerInfo; import mineplex.hub.server.ServerInfo;
import mineplex.hub.server.ServerManager; import mineplex.hub.server.ServerManager;
import mineplex.hub.server.ServerSorter; import mineplex.hub.server.ServerSorter;
import mineplex.hub.server.ui.button.JoinServerButton; import mineplex.hub.server.ui.button.JoinServerButton;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
public class ServerNpcPage extends ShopPageBase<ServerManager, ServerNpcShop> implements IServerPage public class ServerNpcPage extends ShopPageBase<ServerManager, ServerNpcShop> implements IServerPage
{ {
// Shop Item Messages
private static final String MESSAGE_SHOP_URL = ChatColor.RESET + "www.mineplex.com/shop";
private static final String MESSAGE_REQUIRES_PREMIUM = ChatColor.RESET + C.cRed + "Premium requires " + Rank.ULTRA.GetTag(false, false) + C.cRed + " or " + Rank.HERO.GetTag(false, false);
private static final String MESSAGE_BETA_GET_ULTRA = ChatColor.RESET + C.Line + "Get Ultra to join Beta servers!";
private static final String MESSAGE_JOIN = ChatColor.RESET + C.Line + "Click to Join";
private static final String MESSAGE_IN_PROGRESS = ChatColor.RESET + C.Line + "Game in Progress.";
private static final String MESSAGE_SPECTATE = ChatColor.RESET + C.Line + "Click to Spectate";
private static final String MESSAGE_WAIT = ChatColor.RESET + C.Line + "and wait for next game!";
private static final String MESSAGE_FULL_GET_ULTRA = ChatColor.RESET + C.Line + "Get Ultra to join full servers!";
private static final String MESSAGE_RESTARTING = ChatColor.RESET + C.Line + "This server will be open shortly!";
private String _serverNpcKey; private String _serverNpcKey;
private boolean _onMainPage = true;
private boolean _freeOnly;
public ServerNpcPage(ServerManager plugin, ServerNpcShop shop, CoreClientManager clientManager, DonationManager donationManager, String name, Player player, String serverNpcKey) public ServerNpcPage(ServerManager plugin, ServerNpcShop shop, CoreClientManager clientManager, DonationManager donationManager, String name, Player player, String serverNpcKey)
{ {
@ -38,17 +52,16 @@ public class ServerNpcPage extends ShopPageBase<ServerManager, ServerNpcShop> im
protected void BuildPage() protected void BuildPage()
{ {
List<ServerInfo> serverList = new ArrayList<ServerInfo>(Plugin.GetServerList(_serverNpcKey)); List<ServerInfo> serverList = new ArrayList<ServerInfo>(Plugin.GetServerList(_serverNpcKey));
int slotsNeeded = 1;
int slots = 1;
if (serverList.size() > 0) if (serverList.size() > 0)
{ {
slots = Plugin.GetRequiredSlots(Player, serverList.get(0).ServerType); slotsNeeded = Plugin.GetRequiredSlots(Player, serverList.get(0).ServerType);
} }
try try
{ {
Collections.sort(serverList, new ServerSorter(slots)); Collections.sort(serverList, new ServerSorter(slotsNeeded));
} }
catch (Exception exception) catch (Exception exception)
{ {
@ -56,137 +69,275 @@ public class ServerNpcPage extends ShopPageBase<ServerManager, ServerNpcShop> im
exception.printStackTrace(); exception.printStackTrace();
} }
int slot = 10;
int greenCount = 0;
int yellowCount = 0;
String openFull = ChatColor.RESET + C.Line + "Get Ultra to join full servers!";
String beta = ChatColor.RESET + C.Line + "Get Ultra to join Beta servers!";
String openFullUltra = ChatColor.RESET + C.Line + "Click to join!";
for (ServerInfo serverInfo : serverList) if (_onMainPage)
{ {
boolean ownsUltraPackage = DonationManager.Get(Player.getName()).OwnsUnknownPackage(serverInfo.ServerType + " ULTRA") || Client.GetRank().Has(Rank.ULTRA); buildAvailableServerPage(serverList, slotsNeeded);
}
else
{
buildInProgressServerPage(serverList, _freeOnly, slotsNeeded);
}
}
String inProgress = (serverInfo.Game == null || serverInfo.ServerType.equalsIgnoreCase("Competitive")) ? (ChatColor.RESET + C.Line + "Game in progress.") : (ChatColor.RESET + C.Line + "Click to spectate"); private void showClock(long milliseconds)
String inProgressLine2 = (serverInfo.Game == null || serverInfo.ServerType.equalsIgnoreCase("Competitive")) ? null : (ChatColor.RESET + C.Line + "and wait for next game!"); {
int seconds = (int) (milliseconds / 1000);
String timeLeft = UtilTime.convertString(milliseconds, 0, UtilTime.TimeUnit.SECONDS);
Material status = Material.REDSTONE_BLOCK; byte data = (byte) (milliseconds - (seconds * 1000) > 500 ? 15 : 14);
List<String> lore = new ArrayList<String>();
if (slot >= 53) ShopItem item = new ShopItem(Material.WOOL, data, ChatColor.RESET + C.Bold + "Free Server Timer", null, new String[] {
break; ChatColor.RESET + C.cGreen + timeLeft + " Remaining...",
ChatColor.RESET + "",
ChatColor.RESET + C.cYellow + "Free players must wait a short time",
ChatColor.RESET + C.cYellow + "to help lighten the load on our servers.",
ChatColor.RESET + "",
ChatColor.RESET + C.cAqua + "Ultra and Hero players have instant",
ChatColor.RESET + C.cAqua + "access to free and premium servers!",
ChatColor.RESET + "",
ChatColor.RESET + "Visit " + C.cGreen + "www.mineplex.com/shop" + C.cWhite + " for Premium!"
}, seconds, false, false);
if ((serverInfo.MOTD.contains("Starting") || serverInfo.MOTD.contains("Recruiting") || serverInfo.MOTD.contains("Waiting") || serverInfo.MOTD.contains("Cup")) && slot < 15 && (serverInfo.MaxPlayers - serverInfo.CurrentPlayers) >= slots) AddItem(20, item);
}
private void clearPage()
{
for (int i = 0; i < getSize(); i++)
{
setItem(i, null);
}
}
private ShopItem buildShopItem(ServerInfo serverInfo, int slotsNeeded)
{
boolean ownsUltraPackage = DonationManager.Get(Player.getName()).OwnsUnknownPackage(serverInfo.ServerType + " ULTRA") || Client.GetRank().Has(Rank.ULTRA);
Material status = Material.REDSTONE_BLOCK;
boolean free = serverInfo.isFree();
List<String> lore = new ArrayList<String>();
String inProgress = (serverInfo.Game == null || serverInfo.ServerType.equalsIgnoreCase("Competitive")) ? MESSAGE_IN_PROGRESS : MESSAGE_SPECTATE;
String wait = (serverInfo.Game == null || serverInfo.ServerType.equalsIgnoreCase("Competitive")) ? null : MESSAGE_WAIT;
if (isStarting(serverInfo) && (serverInfo.MaxPlayers - serverInfo.CurrentPlayers) >= slotsNeeded)
status = free ? Material.EMERALD_BLOCK : Material.DIAMOND_BLOCK;
else if (isInProgress(serverInfo))
status = Material.GOLD_BLOCK;
lore.add(ChatColor.RESET + "");
if (serverInfo.Game != null)
lore.add(ChatColor.RESET + C.cYellow + "Game: " + C.cWhite + serverInfo.Game);
if (serverInfo.Map != null && !serverInfo.ServerType.equalsIgnoreCase("Competitive"))
lore.add(ChatColor.RESET + C.cYellow + "Map: " + C.cWhite + serverInfo.Map);
lore.add(ChatColor.RESET + C.cYellow + "Players: " + C.cWhite + serverInfo.CurrentPlayers + "/" + serverInfo.MaxPlayers);
lore.add(ChatColor.RESET + "");
// Only show motd if the player has access
if (free || ownsUltraPackage)
lore.add(ChatColor.RESET + serverInfo.MOTD);
if (serverInfo.Name.contains("BETA") && !ownsUltraPackage)
{
lore.add(MESSAGE_BETA_GET_ULTRA);
}
else
{
if (isInProgress(serverInfo))
{ {
if (greenCount > 0 && serverInfo.MaxPlayers == serverInfo.CurrentPlayers) if (serverInfo.MOTD.contains("Restarting"))
continue;
slot += 1;
status = Material.EMERALD_BLOCK;
lore.add(ChatColor.RESET + "");
if (serverInfo.Game != null)
lore.add(ChatColor.RESET + "" + ChatColor.YELLOW + "Game: " + ChatColor.WHITE + serverInfo.Game);
if (serverInfo.Map != null && !serverInfo.ServerType.equalsIgnoreCase("Competitive"))
lore.add(ChatColor.RESET + "" + ChatColor.YELLOW + "Map: " + ChatColor.WHITE + serverInfo.Map);
lore.add(ChatColor.RESET + "" + ChatColor.YELLOW + "Players: " + ChatColor.WHITE + serverInfo.CurrentPlayers + "/" + serverInfo.MaxPlayers);
lore.add(ChatColor.RESET + "");
lore.add(ChatColor.RESET + serverInfo.MOTD);
if (serverInfo.Name.contains("BETA") && !ownsUltraPackage)
{ {
lore.add(beta); status = Material.IRON_BLOCK;
lore.add(MESSAGE_RESTARTING);
} }
else else
{ {
if (serverInfo.CurrentPlayers >= serverInfo.MaxPlayers) if (serverInfo.Game.equalsIgnoreCase("Survival Games"))
{ {
if (serverInfo.Game.equalsIgnoreCase("Survival Games")) lore.add(ChatColor.RESET + C.Line + "Full Survival Games servers");
lore.add(ChatColor.RESET + C.Line + "cannot be joined.");
}
else
{
if (!ownsUltraPackage)
{ {
lore.add(ChatColor.RESET + C.Line + "Full Survival Games servers"); if (free)
lore.add(ChatColor.RESET + C.Line + "cannot be joined."); lore.add(MESSAGE_FULL_GET_ULTRA);
else
{
lore.add(MESSAGE_REQUIRES_PREMIUM);
lore.add(MESSAGE_SHOP_URL);
}
} }
else else
{ {
if (!ownsUltraPackage) lore.add(inProgress);
lore.add(openFull); if (wait != null)
else lore.add(wait);
lore.add(openFullUltra);
} }
} }
else
{
lore.add(ChatColor.RESET + C.Line + "Click to join!");
}
} }
greenCount++;
}
else if (serverInfo.MOTD.contains("In") || serverInfo.MOTD.contains("Restarting"))
{
if (slot <= 15)
slot = 27;
else
slot++;
status = Material.GOLD_BLOCK;
lore.add(ChatColor.RESET + "");
if (serverInfo.Game != null)
lore.add(ChatColor.RESET + "" + ChatColor.YELLOW + "Game: " + ChatColor.WHITE + serverInfo.Game);
if (serverInfo.Map != null && !serverInfo.ServerType.equalsIgnoreCase("Competitive"))
lore.add(ChatColor.RESET + "" + ChatColor.YELLOW + "Map: " + ChatColor.WHITE + serverInfo.Map);
lore.add(ChatColor.RESET + "" + ChatColor.YELLOW + "Players: " + ChatColor.WHITE + serverInfo.CurrentPlayers + "/" + serverInfo.MaxPlayers);
lore.add(ChatColor.RESET + "");
lore.add(ChatColor.RESET + serverInfo.MOTD);
if (serverInfo.MOTD.contains("Restarting"))
{
lore.add(ChatColor.RESET + C.Line + "This server will be open shortly!");
status = Material.IRON_BLOCK;
}
else if (serverInfo.CurrentPlayers >= serverInfo.MaxPlayers)
{
if (!Client.GetRank().Has(Rank.ULTRA) || ownsUltraPackage)
lore.add(openFull);
else
{
lore.add(inProgress);
if (inProgressLine2 != null)
lore.add(inProgressLine2);
}
}
else
{
lore.add(inProgress);
if (inProgressLine2 != null)
lore.add(inProgressLine2);
}
yellowCount++;
} }
else else
continue; {
if (free || ownsUltraPackage)
AddButton(slot, new ShopItem(status, ChatColor.UNDERLINE + "" + ChatColor.BOLD + "" + ChatColor.WHITE + "Server " + serverInfo.Name.substring(serverInfo.Name.indexOf('-') + 1), lore.toArray(new String[lore.size()]), Math.max(1, serverInfo.CurrentPlayers), false), new JoinServerButton(this, serverInfo)); {
if (serverInfo.CurrentPlayers >= serverInfo.MaxPlayers && !ownsUltraPackage)
{
lore.add(MESSAGE_FULL_GET_ULTRA);
}
else
{
lore.add(MESSAGE_JOIN);
}
}
else
{
lore.add(MESSAGE_REQUIRES_PREMIUM);
lore.add(MESSAGE_SHOP_URL);
}
}
} }
while (greenCount < 3) return new ShopItem(status, ChatColor.RESET + C.Line + C.Bold + (free ? C.cGreen + "Free Server " : C.cAqua + "Premium Server ") + serverInfo.Name.split("-")[1], lore.toArray(new String[lore.size()]), serverInfo.CurrentPlayers, false);
}
private void buildAvailableServerPage(List<ServerInfo> serverList, int slotsNeeded)
{
int greenCount = 0;
int blueCount = 0;
int yellowFreeCount = 0;
int yellowUltraCount = 0;
int greenStartSlot = 19;
int blueStartSlot = 23;
boolean showGreen = true;
long portalTime = Plugin.getMillisecondsUntilPortal(Player);
if (portalTime > 0)
{ {
setItem(9 + ((greenCount + 1) * 2), null); showClock(portalTime);
greenCount++; showGreen = false;
} }
while (yellowCount < 18) for (ServerInfo serverInfo : serverList)
{ {
setItem(yellowCount + 27, null); boolean free = serverInfo.isFree();
yellowCount++; int slot = (free ? greenCount + greenStartSlot : blueCount + blueStartSlot);
if (isStarting(serverInfo) && hasEnoughSlots(serverInfo, slotsNeeded) && (free ? greenCount : blueCount) < 3)
{
if ((free && showGreen) || !free)
{
ShopItem shopItem = buildShopItem(serverInfo, slotsNeeded);
if (free)
greenCount++;
else
blueCount++;
AddButton(slot, shopItem, new JoinServerButton(this, serverInfo));
}
}
else
{
if (free)
yellowFreeCount++;
else
yellowUltraCount++;
}
}
// AddItem(11, new ShopItem(Material.IRON_BLOCK, C.cGreen + "Free Servers", new String[] {C.cGray + "Anyone can play!" }, 1, false));
// AddItem(15, new ShopItem(Material.IRON_BLOCK, C.cBlue + "Premium Servers", new String[] {C.cGray + "Available to " + Rank.ULTRA.GetTag(true, true) + ChatColor.RESET + C.cGray + " and " + Rank.HERO.GetTag(true, true) + ChatColor.RESET + C.cGray + "!" }, 1, false));
AddButton(38, new ShopItem(Material.GOLD_BLOCK, C.cGreen + yellowFreeCount + " Games In Progress", new String[]{MESSAGE_SPECTATE}, yellowFreeCount > 64 ? 1 : yellowFreeCount, false), new SingleButton()
{
@Override
public void Clicked(Player player)
{
long portalTime = Plugin.getMillisecondsUntilPortal(Player);
if (portalTime <= 0)
{
_onMainPage = false;
_freeOnly = true;
}
else
{
PlayDenySound(Player);
}
}
});
AddButton(42, new ShopItem(Material.GOLD_BLOCK, C.cAqua + yellowUltraCount + " Games In Progress", new String[]{MESSAGE_SPECTATE}, yellowUltraCount > 64 ? 1 : yellowUltraCount, false), new SingleButton()
{
@Override
public void Clicked(Player player)
{
_onMainPage = false;
_freeOnly = false;
}
});
// Clear empty slots
if (showGreen)
{
for (int i = greenCount + greenStartSlot; i < greenStartSlot + 3; i++)
{
setItem(i, null);
}
}
for (int i = blueCount + blueStartSlot; i < blueStartSlot + 3; i++)
{
setItem(i, null);
}
}
private boolean isStarting(ServerInfo serverInfo)
{
return (serverInfo.MOTD.contains("Starting") || serverInfo.MOTD.contains("Recruiting") || serverInfo.MOTD.contains("Waiting") || serverInfo.MOTD.contains("Cup"));
}
private boolean isInProgress(ServerInfo serverInfo)
{
return serverInfo.MOTD.contains("In") || serverInfo.MOTD.contains("Restarting");
}
private boolean hasEnoughSlots(ServerInfo serverInfo, int slotsNeeded)
{
return (serverInfo.MaxPlayers - serverInfo.CurrentPlayers) >= slotsNeeded;
}
private void buildInProgressServerPage(List<ServerInfo> serverList, boolean freeOnly, int slotsNeeded)
{
int slot = 9;
for (ServerInfo serverInfo : serverList)
{
if (isInProgress(serverInfo) && serverInfo.isFree() == freeOnly && slot < getSize())
{
ShopItem shopItem = buildShopItem(serverInfo, slotsNeeded);
AddButton(slot, shopItem, new JoinServerButton(this, serverInfo));
slot++;
}
}
AddButton(4, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[] { }, 1, false), new SingleButton()
{
@Override
public void Clicked(Player player)
{
clearPage();
_onMainPage = true;
}
});
while (slot < getSize())
{
setItem(slot, null);
slot++;
} }
} }
@ -200,7 +351,7 @@ public class ServerNpcPage extends ShopPageBase<ServerManager, ServerNpcShop> im
{ {
int slots = Plugin.GetRequiredSlots(player, serverInfo.ServerType); int slots = Plugin.GetRequiredSlots(player, serverInfo.ServerType);
if ((serverInfo.Name.contains("BETA") && !Client.GetRank().Has(Rank.ULTRA)) || (serverInfo.MaxPlayers - serverInfo.CurrentPlayers < slots && !(DonationManager.Get(Player.getName()).OwnsUnknownPackage(serverInfo.ServerType + " ULTRA") || Client.GetRank().Has(Rank.ULTRA)))) if ((serverInfo.Name.contains("BETA") && !Client.GetRank().Has(Rank.ULTRA)) || (!serverInfo.isFree() && !(DonationManager.Get(Player.getName()).OwnsUnknownPackage(serverInfo.ServerType + " ULTRA") || Client.GetRank().Has(Rank.ULTRA))) || (serverInfo.MaxPlayers - serverInfo.CurrentPlayers < slots && !(DonationManager.Get(Player.getName()).OwnsUnknownPackage(serverInfo.ServerType + " ULTRA") || Client.GetRank().Has(Rank.ULTRA))))
{ {
PlayDenySound(player); PlayDenySound(player);
return; return;

View File

@ -2,12 +2,11 @@ package mineplex.hub.server.ui.button;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import mineplex.core.shop.item.IButton; import mineplex.core.shop.item.SingleButton;
import mineplex.hub.server.ServerInfo; import mineplex.hub.server.ServerInfo;
import mineplex.hub.server.ui.IServerPage; import mineplex.hub.server.ui.IServerPage;
import mineplex.hub.server.ui.ServerNpcPage;
public class JoinServerButton implements IButton public class JoinServerButton extends SingleButton
{ {
private IServerPage _page; private IServerPage _page;
private ServerInfo _serverInfo; private ServerInfo _serverInfo;
@ -19,13 +18,7 @@ public class JoinServerButton implements IButton
} }
@Override @Override
public void ClickedLeft(Player player) public void Clicked(Player player)
{
_page.SelectServer(player, _serverInfo);
}
@Override
public void ClickedRight(Player player)
{ {
_page.SelectServer(player, _serverInfo); _page.SelectServer(player, _serverInfo);
} }

View File

@ -6,30 +6,86 @@ import java.util.List;
public class GroupStatusData public class GroupStatusData
{ {
private int _serverNum = 0;
private int _totalCount = 0; private int _totalCount = 0;
private int _joinableCount = 0; private int _joinableCount = 0;
private int _freeTotalCount = 0;
private int _freeJoinableCount = 0;
public int Players; public int Players;
public int MaxPlayers; public int MaxPlayers;
public int MaxServerNumber;
public List<ServerStatusData> EmptyServers = new ArrayList<ServerStatusData>(); public List<ServerStatusData> EmptyServers = new ArrayList<ServerStatusData>();
public List<ServerStatusData> KillServers = new ArrayList<ServerStatusData>(); public List<ServerStatusData> KillServers = new ArrayList<ServerStatusData>();
public HashMap<Integer, ServerStatusData> Servers = new HashMap<Integer, ServerStatusData>(); public HashMap<Integer, ServerStatusData> Servers = new HashMap<Integer, ServerStatusData>();
public HashMap<Integer, ServerStatusData> FreeServers = new HashMap<Integer, ServerStatusData>();
public void addServer(ServerStatusData serverStatusData) public void addServer(ServerStatusData serverStatusData)
{ {
if (Servers.containsKey(Integer.parseInt(serverStatusData.Name.split("-")[1]))) boolean free = serverStatusData.Name.contains("FREE");
checkForDuplicate(free ? FreeServers : Servers, serverStatusData, free);
Players += serverStatusData.Players;
MaxPlayers += serverStatusData.MaxPlayers;
if (serverStatusData.Motd != null && (serverStatusData.Motd.contains("Starting") || serverStatusData.Motd.contains("Recruiting") || serverStatusData.Motd.contains("Waiting") || serverStatusData.Motd.contains("Cup") || serverStatusData.Motd.isEmpty() || serverStatusData.Motd.equals("")))
{ {
ServerStatusData existingServer = Servers.get(Integer.parseInt(serverStatusData.Name.split("-")[1])); if (serverStatusData.Players < serverStatusData.MaxPlayers)
{
// Lobby joinable checking
if (serverStatusData.Motd.isEmpty() || serverStatusData.Motd.equals(""))
{
if (serverStatusData.MaxPlayers - serverStatusData.Players > 20)
{
if (free)
_freeJoinableCount++;
else
_joinableCount++;
}
}
else
{
if (free)
_freeJoinableCount++;
else
_joinableCount++;
}
}
}
if (free)
_freeTotalCount++;
else
_totalCount++;
if (serverStatusData.Empty)
{
EmptyServers.add(serverStatusData);
}
if (free)
{
FreeServers.put(Integer.parseInt(serverStatusData.Name.split("-")[1]), serverStatusData);
}
else
{
Servers.put(Integer.parseInt(serverStatusData.Name.split("-")[1]), serverStatusData);
}
}
private boolean checkForDuplicate(HashMap<Integer, ServerStatusData> serverMap, ServerStatusData serverStatusData, boolean free)
{
if (serverMap.containsKey(Integer.parseInt(serverStatusData.Name.split("-")[1])))
{
ServerStatusData existingServer = serverMap.get(Integer.parseInt(serverStatusData.Name.split("-")[1]));
int existingCount = existingServer.Players; int existingCount = existingServer.Players;
int newCount = serverStatusData.Players; int newCount = serverStatusData.Players;
if (newCount == 0 || newCount < existingCount) if (newCount == 0 || newCount < existingCount)
{ {
KillServers.add(serverStatusData); KillServers.add(serverStatusData);
return; return true;
} }
else if (existingCount == 0 || newCount > existingCount) else if (existingCount == 0 || newCount > existingCount)
{ {
@ -45,71 +101,56 @@ public class GroupStatusData
if (existingServer.Motd.isEmpty() || existingServer.Motd.equals("")) if (existingServer.Motd.isEmpty() || existingServer.Motd.equals(""))
{ {
if (serverStatusData.MaxPlayers - serverStatusData.Players > 20) if (serverStatusData.MaxPlayers - serverStatusData.Players > 20)
_joinableCount--; {
if (free)
_freeJoinableCount--;
else
_joinableCount--;
}
} }
else else
{ {
_joinableCount--; if (free)
_freeJoinableCount--;
else
_joinableCount--;
} }
} }
} }
} }
} }
Players += serverStatusData.Players; return false;
MaxPlayers += serverStatusData.MaxPlayers;
if (serverStatusData.Motd != null && (serverStatusData.Motd.contains("Starting") || serverStatusData.Motd.contains("Recruiting") || serverStatusData.Motd.contains("Waiting") || serverStatusData.Motd.contains("Cup") || serverStatusData.Motd.isEmpty() || serverStatusData.Motd.equals("")))
{
if (serverStatusData.Players < serverStatusData.MaxPlayers)
{
// Lobby joinable checking
if (serverStatusData.Motd.isEmpty() || serverStatusData.Motd.equals(""))
{
if (serverStatusData.MaxPlayers - serverStatusData.Players > 20)
{
_joinableCount++;
}
}
else
{
_joinableCount++;
}
}
}
_totalCount++;
if (serverStatusData.Empty)
{
EmptyServers.add(serverStatusData);
}
Servers.put(Integer.parseInt(serverStatusData.Name.split("-")[1]), serverStatusData);
} }
public int getTotalServers() public int getTotalServers(boolean free)
{ {
return _totalCount; return free ? _freeTotalCount : _totalCount;
} }
public int getJoinableCount() public int getJoinableCount(boolean free)
{ {
return _joinableCount; return free ? _freeJoinableCount : _joinableCount;
} }
public int getNextServerNumber() public int getNextServerNumber(boolean free)
{ {
_serverNum++; int startNumber = 1;
while (true) while (true)
{ {
if (!Servers.containsKey(_serverNum)) if (free)
{ {
return _serverNum; if (!FreeServers.containsKey(startNumber))
return startNumber;
}
else
{
if (!Servers.containsKey(startNumber))
return startNumber;
} }
_serverNum++; startNumber++;
} }
} }
} }

View File

@ -24,7 +24,7 @@ public class Repository
private static String CREATE_DYNAMIC_TABLE = "CREATE TABLE IF NOT EXISTS DynamicServers (id INT NOT NULL AUTO_INCREMENT, serverName VARCHAR(256), address VARCHAR(256), privateAddress VARCHAR(256), US BOOLEAN NOT NULL DEFAULT 'true', PRIMARY KEY (id));"; private static String CREATE_DYNAMIC_TABLE = "CREATE TABLE IF NOT EXISTS DynamicServers (id INT NOT NULL AUTO_INCREMENT, serverName VARCHAR(256), address VARCHAR(256), privateAddress VARCHAR(256), US BOOLEAN NOT NULL DEFAULT 'true', PRIMARY KEY (id));";
private static String RETRIEVE_AVAILABLE_SERVERS = "SELECT DynamicServers.serverName, DynamicServers.address, DynamicServers.privateAddress, DynamicServers.US, DynamicServers.availableCpu, DynamicServers.availableRam, ServerStatus.serverGroup, COUNT(*) As serverCount FROM DynamicServers LEFT JOIN ServerStatus ON ServerStatus.address = DynamicServers.privateAddress WHERE DynamicServers.US = ? GROUP BY DynamicServers.address, ServerStatus.serverGroup;"; private static String RETRIEVE_AVAILABLE_SERVERS = "SELECT DynamicServers.serverName, DynamicServers.address, DynamicServers.privateAddress, DynamicServers.US, DynamicServers.availableCpu, DynamicServers.availableRam, ServerStatus.serverGroup, COUNT(*) As serverCount FROM DynamicServers LEFT JOIN ServerStatus ON ServerStatus.address = DynamicServers.privateAddress WHERE DynamicServers.US = ? GROUP BY DynamicServers.address, ServerStatus.serverGroup;";
private static String RETRIEVE_SERVERGROUP_STATUSES = "SELECT ServerStatus.serverName, serverGroup, motd, DynamicServers.address, ServerStatus.address, ServerStatus.port, players, maxPlayers, case when TIME_TO_SEC(TIMEDIFF(now(), ServerStatus.lastTimeWithPlayers)) > 300 then 1 else 0 end as empty, now(), updated FROM ServerStatus INNER JOIN DynamicServers ON ServerStatus.address = DynamicServers.privateAddress WHERE DynamicServers.US = ?"; private static String RETRIEVE_SERVERGROUP_STATUSES = "SELECT ServerStatus.serverName, serverGroup, motd, DynamicServers.address, ServerStatus.address, ServerStatus.port, players, maxPlayers, case when TIME_TO_SEC(TIMEDIFF(now(), ServerStatus.lastTimeWithPlayers)) > 300 then 1 else 0 end as empty, now(), updated FROM ServerStatus INNER JOIN DynamicServers ON ServerStatus.address = DynamicServers.privateAddress WHERE DynamicServers.US = ?";
private static String RETRIEVE_SERVER_GROUP_DATA = "SELECT groupName, prefix, scriptName, requiredRam, cpuRequired, requiredTotal, requiredJoinable FROM ServerGroups;"; private static String RETRIEVE_SERVER_GROUP_DATA = "SELECT groupName, prefix, scriptName, requiredRam, cpuRequired, requiredTotal, requiredJoinable, arcadeGroup, worldZip, plugin, configPath, minPlayers, maxPlayers, pvp, tournament, generateFreeVersions, games, serverType, addNoCheat, portSection FROM ServerGroups;";
private static String DELETE_SERVER_STATUS = "DELETE FROM ServerStatus WHERE address = ? AND port = ? AND serverName = ?;"; private static String DELETE_SERVER_STATUS = "DELETE FROM ServerStatus WHERE address = ? AND port = ? AND serverName = ?;";
public static Connection connection; public static Connection connection;
@ -361,6 +361,19 @@ public class Repository
serverGroupData.RequiredCPU = resultSet.getInt(5); serverGroupData.RequiredCPU = resultSet.getInt(5);
serverGroupData.RequiredTotalServers = resultSet.getInt(6); serverGroupData.RequiredTotalServers = resultSet.getInt(6);
serverGroupData.RequiredJoinableServers = resultSet.getInt(7); serverGroupData.RequiredJoinableServers = resultSet.getInt(7);
serverGroupData.ArcadeGroup = resultSet.getBoolean(8);
serverGroupData.WorldZip = resultSet.getString(9);
serverGroupData.Plugin = resultSet.getString(10);
serverGroupData.ConfigPath = resultSet.getString(11);
serverGroupData.MinPlayers = resultSet.getInt(12);
serverGroupData.MaxPlayers = resultSet.getInt(13);
serverGroupData.Pvp = resultSet.getBoolean(14);
serverGroupData.Tournament = resultSet.getBoolean(15);
serverGroupData.GenerateFreeVersions = resultSet.getBoolean(16);
serverGroupData.Games = resultSet.getString(17);
serverGroupData.ServerType = resultSet.getString(18);
serverGroupData.AddNoCheat = resultSet.getBoolean(19);
serverGroupData.PortSection = resultSet.getInt(20);
if (!serverGroupMap.containsKey(serverGroupData.Name)) if (!serverGroupMap.containsKey(serverGroupData.Name))
serverGroupMap.put(serverGroupData.Name, serverGroupData); serverGroupMap.put(serverGroupData.Name, serverGroupData);

View File

@ -9,9 +9,18 @@ public class ServerGroupData
public int RequiredCPU; public int RequiredCPU;
public int RequiredTotalServers; public int RequiredTotalServers;
public int RequiredJoinableServers; public int RequiredJoinableServers;
public int PortSection;
public boolean ArcadeGroup;
public String WorldZip;
public String Plugin;
public String ConfigPath;
public int MinPlayers;
public int MaxPlayers;
public boolean Pvp;
public boolean Tournament;
public boolean GenerateFreeVersions;
public String Games;
public String ServerType;
public boolean AddNoCheat;
public void printInfo()
{
System.out.println("ServerGroupData - Name:" + Name + " Prefix:" + Prefix + " ScriptName:" + ScriptName + " RAM:" + RequiredRAM + " CPU:" + RequiredCPU + " ReqTotal:" + RequiredTotalServers + " ReqJoin:" + RequiredJoinableServers);
}
} }

View File

@ -69,153 +69,91 @@ public class ServerMonitor
for (ServerStatusData statusData : _repository.retrieveOldServerStatuses()) for (ServerStatusData statusData : _repository.retrieveOldServerStatuses())
{ {
/*
if (us)
{
if (!serverTracker.containsKey(statusData.Name))
{
restartServer(statusData);
serverTracker.put(statusData.Name, new AbstractMap.SimpleEntry<String, Long>(statusData.Address, System.currentTimeMillis()));
}
else if (System.currentTimeMillis() - serverTracker.get(statusData.Name).getValue() > 15000)
{
serverTracker.remove(statusData.Name);
System.out.println("-=[SERVER RESTART TOO SLOW]=- " + statusData.Name + " (Putting back in restart queue)");
}
}
else
*/
killServer(statusData); killServer(statusData);
} }
/* List<DynamicServerData> dynamicServers = new ArrayList<DynamicServerData>(_repository.retrieveDynamicServers());
if (us)
if (_count % 15 == 0)
{ {
// Remove successfully restarted US servers _badServers.clear();
for (GroupStatusData groupStatus : groupStatusList.values())
for (DynamicServerData serverData : dynamicServers)
{ {
for (ServerStatusData serverToKill : groupStatus.Servers.values()) if (isServerOffline(serverData))
{ {
if (serverTracker.containsKey(serverToKill.Name)) System.out.println("------=[OFFLINE]=------=[" + serverData.Name + ":" + serverData.Address + "]=------=[OFFLINE]=------");
serverTracker.remove(serverToKill.Name); log(serverData.Name + ":" + serverData.Address + " is OFFLINE.");
_badServers.put(serverData.Name, true);
} }
} }
} }
else
for (Iterator<DynamicServerData> iterator = dynamicServers.iterator(); iterator.hasNext();)
{ {
*/ DynamicServerData serverData = iterator.next();
List<DynamicServerData> dynamicServers = new ArrayList<DynamicServerData>(_repository.retrieveDynamicServers());
if (_count % 15 == 0) if (_badServers.containsKey(serverData.Name))
iterator.remove();
}
for (GroupStatusData groupStatus : groupStatusList.values())
{
for (ServerStatusData serverToKill : groupStatus.KillServers)
{ {
_badServers.clear(); System.out.println("----DUPLICATE SERVER----> " + serverToKill.Address + ", " + serverToKill.Name);
log("Duplicate server " + serverToKill.Name + ":" + serverToKill.Address + " is being killed.");
for (DynamicServerData serverData : dynamicServers) killServer(serverToKill);
{
if (isServerOffline(serverData))
{
System.out.println("------=[OFFLINE]=------=[" + serverData.Name + ":" + serverData.Address + "]=------=[OFFLINE]=------");
log(serverData.Name + ":" + serverData.Address + " is OFFLINE.");
_badServers.put(serverData.Name, true);
}
}
} }
for (Iterator<DynamicServerData> iterator = dynamicServers.iterator(); iterator.hasNext();) for (ServerStatusData serverToKill : groupStatus.Servers.values())
{ {
DynamicServerData serverData = iterator.next(); if (serverTracker.containsKey(serverToKill.Name))
serverTracker.remove(serverToKill.Name);
if (_badServers.containsKey(serverData.Name))
iterator.remove();
} }
for (GroupStatusData groupStatus : groupStatusList.values()) for (ServerStatusData serverToKill : groupStatus.FreeServers.values())
{ {
for (ServerStatusData serverToKill : groupStatus.KillServers) if (serverTracker.containsKey(serverToKill.Name))
{ serverTracker.remove(serverToKill.Name);
System.out.println("----DUPLICATE SERVER----> " + serverToKill.Address + ", " + serverToKill.Name); }
log("Duplicate server " + serverToKill.Name + ":" + serverToKill.Address + " is being killed."); }
killServer(serverToKill);
}
for (ServerStatusData serverToKill : groupStatus.Servers.values()) for (Iterator<Entry<String, Entry<String, Long>>> iterator = serverTracker.entrySet().iterator(); iterator.hasNext();)
{ {
if (serverTracker.containsKey(serverToKill.Name)) Entry<String, Entry<String, Long>> entry = iterator.next();
serverTracker.remove(serverToKill.Name);
} if (System.currentTimeMillis() - entry.getValue().getValue() > 15000)
{
System.out.println("-=[SERVER STARTUP TOO SLOW]=- " + entry.getKey());
ServerStatusData serverToKill = new ServerStatusData();
serverToKill.Name = entry.getKey();
serverToKill.Address = entry.getValue().getKey();
log("Server startup too slow " + serverToKill.Name + ":" + serverToKill.Address + " is being killed.");
killServer(serverToKill);
iterator.remove();
}
}
for (ServerGroupData serverGroup : serverGroups)
{
if (!groupStatusList.containsKey(serverGroup.Name))
{
groupStatusList.put(serverGroup.Name, new GroupStatusData());
} }
for (Iterator<Entry<String, Entry<String, Long>>> iterator = serverTracker.entrySet().iterator(); iterator.hasNext();) GroupStatusData groupStatus = groupStatusList.get(serverGroup.Name);
handleGroupChanges(dynamicServers, serverTracker, serverGroup, groupStatus, false);
if (serverGroup.GenerateFreeVersions && _count % 2 == 0)
{ {
Entry<String, Entry<String, Long>> entry = iterator.next(); handleGroupChanges(dynamicServers, serverTracker, serverGroup, groupStatus, true);
if (System.currentTimeMillis() - entry.getValue().getValue() > 15000)
{
System.out.println("-=[SERVER STARTUP TOO SLOW]=- " + entry.getKey());
ServerStatusData serverToKill = new ServerStatusData();
serverToKill.Name = entry.getKey();
serverToKill.Address = entry.getValue().getKey();
log("Server startup too slow " + serverToKill.Name + ":" + serverToKill.Address + " is being killed.");
killServer(serverToKill);
iterator.remove();
}
} }
}
for (ServerGroupData serverGroup : serverGroups)
{
if (!groupStatusList.containsKey(serverGroup.Name))
{
groupStatusList.put(serverGroup.Name, new GroupStatusData());
}
GroupStatusData groupStatus = groupStatusList.get(serverGroup.Name);
int serversToAdd = Math.max(serverGroup.RequiredTotalServers - groupStatus.getTotalServers(), serverGroup.RequiredJoinableServers - groupStatus.getJoinableCount());
int serversToKill = (groupStatus.getTotalServers() > serverGroup.RequiredTotalServers && groupStatus.getJoinableCount() > serverGroup.RequiredJoinableServers) ? Math.min(groupStatus.getJoinableCount() - serverGroup.RequiredJoinableServers, groupStatus.EmptyServers.size()) : 0;
// Minimum 1500 slot bufferzone
if (serverGroup.Name.equalsIgnoreCase("Lobby"))
{
if (groupStatus.MaxPlayers - groupStatus.Players < 1500)
serversToAdd = serverGroup.RequiredJoinableServers;
}
while (serversToAdd > 0)
{
int serverNum = groupStatus.getNextServerNumber();
Collections.sort(dynamicServers, new DynamicServerSorter());
DynamicServerData bestServer = getBestDynamicServer(dynamicServers, serverGroup);
if (bestServer == null)
{
System.out.println("No best dynamic server available for group " + serverGroup.Name);
break;
}
if (serverTracker.containsKey(serverGroup.Prefix + "-" + serverNum))
System.out.println("[WAITING] On " + serverGroup.Prefix + "-" + serverNum + " to finish starting...");
else
{
startServer(bestServer, serverGroup, serverNum);
serverTracker.put(serverGroup.Prefix + "-" + serverNum, new AbstractMap.SimpleEntry<String, Long>(bestServer.Address, System.currentTimeMillis()));
}
serversToAdd--;
}
while (serversToKill > 0)
{
System.out.println("[" + groupStatus.EmptyServers.get(0).Name + ":" + groupStatus.EmptyServers.get(0).Address + "] Killing " + serverGroup.Name + " Req Total: " + serverGroup.RequiredTotalServers + " Req Joinable: " + serverGroup.RequiredJoinableServers + " | Actual Total: " + groupStatus.getTotalServers() + " Actual Joinable: " + groupStatus.getJoinableCount());
log("Excess server " + groupStatus.EmptyServers.get(0).Name + ":" + groupStatus.EmptyServers.get(0).Address + " is being killed.");
killServer(groupStatus.EmptyServers.remove(0));
serversToKill--;
}
}
//}
int processWaits = 0; int processWaits = 0;
@ -281,6 +219,53 @@ public class ServerMonitor
} }
} }
private static void handleGroupChanges(List<DynamicServerData> dynamicServers, HashMap<String, Entry<String, Long>> serverTracker, ServerGroupData serverGroup, GroupStatusData groupStatus, boolean free)
{
int serversToAdd = Math.max(serverGroup.RequiredTotalServers - groupStatus.getTotalServers(free), serverGroup.RequiredJoinableServers - groupStatus.getJoinableCount(free));
int serversToKill = (groupStatus.getTotalServers(free) > serverGroup.RequiredTotalServers && groupStatus.getJoinableCount(free) > serverGroup.RequiredJoinableServers) ? Math.min(groupStatus.getJoinableCount(free) - serverGroup.RequiredJoinableServers, groupStatus.EmptyServers.size()) : 0;
if (free)
serversToAdd = Math.min(1, serversToAdd);
// Minimum 1500 slot bufferzone
if (serverGroup.Name.equalsIgnoreCase("Lobby"))
{
if (groupStatus.MaxPlayers - groupStatus.Players < 1500)
serversToAdd = serverGroup.RequiredJoinableServers;
}
while (serversToAdd > 0)
{
int serverNum = groupStatus.getNextServerNumber(free);
Collections.sort(dynamicServers, new DynamicServerSorter());
DynamicServerData bestServer = getBestDynamicServer(dynamicServers, serverGroup);
if (bestServer == null)
{
System.out.println("No best dynamic server available for group " + serverGroup.Name);
break;
}
if (serverTracker.containsKey(serverGroup.Prefix + "-" + serverNum))
System.out.println("[WAITING] On " + serverGroup.Prefix + "-" + serverNum + " to finish starting...");
else
{
startServer(bestServer, serverGroup, serverNum, free);
serverTracker.put(serverGroup.Prefix + "-" + serverNum, new AbstractMap.SimpleEntry<String, Long>(bestServer.Address, System.currentTimeMillis()));
}
serversToAdd--;
}
while (serversToKill > 0)
{
System.out.println("[" + groupStatus.EmptyServers.get(0).Name + ":" + groupStatus.EmptyServers.get(0).Address + "] Killing " + serverGroup.Name + " " + (free ? "FREE" : "PREMIUM") + " Req Total: " + serverGroup.RequiredTotalServers + " Req Joinable: " + serverGroup.RequiredJoinableServers + " | Actual Total: " + groupStatus.getTotalServers(free) + " Actual Joinable: " + groupStatus.getJoinableCount(free));
log("Excess server " + groupStatus.EmptyServers.get(0).Name + ":" + groupStatus.EmptyServers.get(0).Address + " is being killed.");
killServer(groupStatus.EmptyServers.remove(0));
serversToKill--;
}
}
private static void killServer(final ServerStatusData serverToKill, final boolean announce) private static void killServer(final ServerStatusData serverToKill, final boolean announce)
{ {
String cmd = "/home/mineplex/easyRemoteKillServer.sh"; String cmd = "/home/mineplex/easyRemoteKillServer.sh";
@ -413,19 +398,19 @@ public class ServerMonitor
killServer(serverToKill, true); killServer(serverToKill, true);
} }
private static void startServer(final DynamicServerData serverSpace, final ServerGroupData serverGroup, final int serverNum) private static void startServer(final DynamicServerData serverSpace, final ServerGroupData serverGroup, final int serverNum, final boolean free)
{ {
String cmd = "/home/mineplex/easyRemoteStartServer.sh"; String cmd = "/home/mineplex/easyRemoteStartServerCustom.sh";
ProcessRunner pr = new ProcessRunner(new String[] {"/bin/sh", cmd, serverSpace.Address, serverSpace.PrivateAddress, serverGroup.ScriptName, serverGroup.Prefix + "-" + serverNum, "1", serverSpace.US ? "us" : "eu"}); ProcessRunner pr = new ProcessRunner(new String[] {"/bin/sh", cmd, serverSpace.Address, serverSpace.PrivateAddress, serverGroup.PortSection + serverNum + "", serverGroup.RequiredRAM + "", serverGroup.WorldZip, serverGroup.Plugin, serverGroup.ConfigPath, serverGroup.Name, serverGroup.Prefix + "-" + serverNum, serverGroup.MinPlayers + "", serverGroup.MaxPlayers + "", serverGroup.Pvp + "", serverGroup.Tournament + "", free + "", serverSpace.US ? "true" : "false", serverGroup.ArcadeGroup + "", serverGroup.Games, serverGroup.ServerType, serverGroup.AddNoCheat + ""});
pr.start(new GenericRunnable<Boolean>() pr.start(new GenericRunnable<Boolean>()
{ {
public void run(Boolean error) public void run(Boolean error)
{ {
if (error) if (error)
System.out.println("[" + serverSpace.Name + ":" + serverSpace.Address + "] Errored " + serverGroup.Name + "(" + serverGroup.Prefix + "-" + serverNum + ")"); System.out.println("[" + serverSpace.Name + ":" + serverSpace.Address + "] Errored " + serverGroup.Name + "(" + serverGroup.Prefix + "-" + serverNum + (free ? "-FREE" : "") + ")");
else else
System.out.println("[" + serverSpace.Name + ":" + serverSpace.Address + "] Added " + serverGroup.Name + "(" + serverGroup.Prefix + "-" + serverNum + ")"); System.out.println("[" + serverSpace.Name + ":" + serverSpace.Address + "] Added " + serverGroup.Name + "(" + serverGroup.Prefix + "-" + serverNum + (free ? "-FREE" : "") + ")");
} }
}); });