Make a start on the new server selection menu

This commit is contained in:
Sam 2018-07-27 19:00:02 +01:00 committed by Alexander Meech
parent bffd474322
commit 304833dbae
22 changed files with 599 additions and 1389 deletions

View File

@ -11,19 +11,23 @@ public class GameInfo
return Constants.GSON.fromJson(json, GameInfo.class);
}
private final String _game, _mode, _map, _serverType;
private final String _game, _mode, _map;
private final int _timer;
private final String[] _votingOn;
private final PermissionGroup _hostRank;
private final GameDisplayStatus _status;
private final GameJoinStatus _joinable;
public GameInfo(String game, String mode, String map, String serverType, int timer, String[] votingOn, PermissionGroup hostRank, GameDisplayStatus status, GameJoinStatus joinable)
public GameInfo()
{
this(null, null, null, -1, new String[0], null, GameDisplayStatus.CLOSING, GameJoinStatus.CLOSED);
}
public GameInfo(String game, String mode, String map, int timer, String[] votingOn, PermissionGroup hostRank, GameDisplayStatus status, GameJoinStatus joinable)
{
_game = game;
_mode = mode;
_map = map;
_serverType = serverType;
_timer = timer;
_votingOn = votingOn;
_hostRank = hostRank;
@ -46,11 +50,6 @@ public class GameInfo
return _map;
}
public String getServerType()
{
return _serverType;
}
public int getTimer()
{
return _timer;

View File

@ -16,7 +16,6 @@ import mineplex.core.MiniPlugin;
import mineplex.core.account.CoreClientManager;
import mineplex.core.account.permissions.PermissionGroup;
import mineplex.core.common.Constants;
import mineplex.core.common.util.Callback;
import mineplex.core.monitor.LagMeter;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
@ -100,23 +99,6 @@ public class ServerStatusManager extends MiniPlugin
}
}
public void retrieveServerStatuses(final Callback<Collection<MinecraftServer>> callback)
{
if (!_enabled)
return;
getPlugin().getServer().getScheduler().runTaskAsynchronously(getPlugin(), new Runnable()
{
public void run()
{
if (callback != null)
{
callback.run(_repository.getServerStatuses());
}
}
});
}
@EventHandler
public void saveServerStatus(UpdateEvent event)
{
@ -189,18 +171,14 @@ public class ServerStatusManager extends MiniPlugin
return _name;
}
public void retrieveServerGroups(final Callback<Collection<ServerGroup>> callback)
public Collection<ServerGroup> retrieveServerGroups()
{
if (!_enabled)
return;
getPlugin().getServer().getScheduler().runTaskAsynchronously(getPlugin(), () ->
{
if (callback != null)
{
callback.run(_repository.getServerGroups(null));
return _enabled ? _repository.getServerGroups(null) : null;
}
});
public Collection<MinecraftServer> retrieveServerStatuses()
{
return _enabled ? _repository.getServerStatuses() : null;
}
public Region getRegion()

View File

@ -3,7 +3,6 @@ package mineplex.core.world;
import java.io.File;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@ -29,9 +28,11 @@ public class MineplexWorld
_ironLocations = new LinkedHashMap<>();
_goldLocations = new LinkedHashMap<>();
_spongeLocations = new LinkedHashMap<>();
loadWorldConfig();
}
public void loadWorldConfig()
private void loadWorldConfig()
{
try
{
@ -237,16 +238,16 @@ public class MineplexWorld
public Map<String, List<Location>> getIronLocations()
{
return Collections.unmodifiableMap(_ironLocations);
return _ironLocations;
}
public Map<String, List<Location>> getGoldLocations()
{
return Collections.unmodifiableMap(_goldLocations);
return _goldLocations;
}
public Map<String, List<Location>> getSpongeLocations()
{
return Collections.unmodifiableMap(_spongeLocations);
return _spongeLocations;
}
}

View File

@ -94,7 +94,6 @@ import mineplex.core.updater.event.UpdateEvent;
import mineplex.core.world.MineplexWorld;
import mineplex.core.youtube.YoutubeManager;
import mineplex.hub.commands.GadgetToggle;
import mineplex.hub.commands.ListCommand;
import mineplex.hub.doublejump.JumpManager;
import mineplex.hub.gimmicks.AdminPunch;
import mineplex.hub.gimmicks.SecretAreas;
@ -166,7 +165,6 @@ public class HubManager extends MiniClientPlugin<HubClient> implements IChatMess
World world = Bukkit.getWorld("world");
_worldData = new MineplexWorld(world);
_worldData.loadWorldConfig();
_spawn = _worldData.getSpongeLocation("SPAWN");
_lookAt = _worldData.getSpongeLocations("LOOK_AT");
@ -314,7 +312,6 @@ public class HubManager extends MiniClientPlugin<HubClient> implements IChatMess
public void addCommands()
{
addCommand(new GadgetToggle(this));
addCommand(new ListCommand(this));
}
@EventHandler(priority = EventPriority.HIGHEST)

View File

@ -1,136 +0,0 @@
package mineplex.hub.commands;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import mineplex.core.Managers;
import mineplex.core.command.CommandBase;
import mineplex.core.common.util.C;
import mineplex.hub.HubManager;
import mineplex.hub.server.ServerInfo;
import mineplex.hub.server.ServerManager;
/**
* Lists player and version distributions
*/
public class ListCommand extends CommandBase<HubManager>
{
private ServerManager _serverManager;
public ListCommand(HubManager plugin)
{
super(plugin, HubManager.Perm.LIST_COMMAND, "list");
}
private ServerManager getServerManager()
{
if (_serverManager == null)
{
_serverManager = Managers.require(ServerManager.class);
}
return _serverManager;
}
@Override
public void Execute(Player player, String[] args)
{
if (args.length == 0)
{
reply(player, "List", "There are " + C.cGreen + Bukkit.getOnlinePlayers().size() +
C.cGray + " players online.");
return;
}
switch (args[0].toLowerCase())
{
case "network": // Lists the player distribution across the network
network(player);
return;
case "group": // Lists the player distribution across a group
group(player, args);
return;
case "servers": // Lists the available servers
ServerManager manager = Managers.get(ServerManager.class);
Set<String> allServers = manager.getAllServers();
reply(player, "List", "Available servers: " + allServers);
return;
default:
reply(player, "List", "Unknown directive: " + args[0]);
}
}
private void network(Player player)
{
int total = 0;
int maxTotal = 0;
ServerManager manager = getServerManager();
Set<String> groups = manager.getServerGroups();
Map<String, Integer> players = new HashMap<>();
for (String group : groups)
{
int groupCount = 0;
Collection<ServerInfo> servers = manager.getServerList(group);
for (ServerInfo info : servers)
{
groupCount += info.CurrentPlayers;
total += info.CurrentPlayers;
maxTotal += info.MaxPlayers;
}
players.put(group, groupCount);
}
reply(player, "List", "Network-wide player count:");
for (Map.Entry<String, Integer> entry : players.entrySet())
{
if (entry.getValue() == 0) continue;
reply(player, "List", C.cYellow + entry.getKey() + C.cGray + ": " + C.cGreen +
entry.getValue() + C.cGray + " online");
}
reply(player, "List", "Total: " + C.cGreen + total + C.cGray + " / " + C.cGreen + maxTotal);
}
private void group(Player player, String[] args)
{
if (args.length < 2)
{
reply(player, "List", "You must specify a server group!");
return;
}
ServerManager manager = Managers.get(ServerManager.class);
Set<String> allServers = manager.getAllServers();
List<ServerInfo> coll = new ArrayList<>();
for (String server : allServers)
{
if (args[0].equalsIgnoreCase("all") || server.toLowerCase().startsWith(args[1].toLowerCase()))
coll.add(manager.getServerInfo(server));
}
reply(player, "List", "Server info for group " + C.cBlue + args[1] + C.cGray + ":");
for (ServerInfo info : coll)
{
String line = C.cYellow + info.Name + C.cGray + ": " + info.CurrentPlayers + "/" + info.MaxPlayers;
reply(player, "List", line);
}
reply(player,"List", C.cYellow + "---------------");
}
}

View File

@ -0,0 +1,86 @@
package mineplex.hub.server;
import mineplex.core.game.status.GameInfo;
import mineplex.serverdata.data.MinecraftServer;
public class GameServer
{
private MinecraftServer _server;
private final String _prefix;
private final int _number;
private GameInfo _info;
private long _lastUpdate;
GameServer(MinecraftServer server)
{
_server = server;
// Split the server name to get it's prefix and number ("CW4-5" = "CW4" & 5)
String[] split = server.getName().split("-");
if (split.length > 1)
{
_prefix = split[0];
int number;
try
{
number = Integer.parseInt(split[1]);
}
catch (NumberFormatException ex)
{
number = 0;
}
_number = number;
}
else
{
_prefix = "null";
_number = 0;
}
}
public void setServer(MinecraftServer server)
{
_server = server;
_lastUpdate = System.currentTimeMillis();
}
public MinecraftServer getServer()
{
return _server;
}
public String getPrefix()
{
return _prefix;
}
public int getNumber()
{
return _number;
}
void setInfo(GameInfo info)
{
_info = info;
}
public GameInfo getInfo()
{
return _info;
}
public long getLastUpdate()
{
return _lastUpdate;
}
public boolean isDevServer()
{
return _number >= 777;
}
}

View File

@ -3,17 +3,15 @@ package mineplex.hub.server;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.LivingEntity;
@ -24,11 +22,12 @@ import org.bukkit.event.entity.EntityPortalEnterEvent;
import org.bukkit.event.entity.EntityPortalEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerPortalEvent;
import org.bukkit.util.Vector;
import org.bukkit.inventory.ItemStack;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.ImmutableMap;
import com.google.gson.JsonSyntaxException;
import mineplex.core.MiniPlugin;
import mineplex.core.ReflectivelyCreateMiniPlugin;
@ -37,17 +36,16 @@ import mineplex.core.account.permissions.Permission;
import mineplex.core.account.permissions.PermissionGroup;
import mineplex.core.achievement.AchievementManager;
import mineplex.core.boosters.BoosterManager;
import mineplex.core.common.util.Callback;
import mineplex.core.common.util.F;
import mineplex.core.common.util.NautHashMap;
import mineplex.core.common.util.UtilAction;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilTime;
import mineplex.core.donation.DonationManager;
import mineplex.core.game.status.GameInfo;
import mineplex.core.newnpc.NPC;
import mineplex.core.newnpc.NewNPCManager;
import mineplex.core.newnpc.StoredNPC;
import mineplex.core.newnpc.event.NPCInteractEvent;
import mineplex.core.party.PartyManager;
import mineplex.core.party.event.PartySelectServerEvent;
import mineplex.core.personalServer.PersonalServerManager;
import mineplex.core.portal.Intent;
@ -62,10 +60,9 @@ import mineplex.core.twofactor.TwoFactorAuth;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import mineplex.hub.HubManager;
import mineplex.hub.server.newui.ServerSelectionShop;
import mineplex.hub.server.ui.LobbyShop;
import mineplex.hub.server.ui.QuickShop;
import mineplex.hub.server.ui.ServerNpcShop;
import mineplex.serverdata.Region;
import mineplex.serverdata.data.MinecraftServer;
import mineplex.serverdata.data.ServerGroup;
@ -78,16 +75,17 @@ public class ServerManager extends MiniPlugin
FEATURE_SERVER,
}
private static final Random random = new Random();
private static final Random RANDOM = new Random();
private static final int TOP_SERVERS = 3; // The number of top contending servers for auto-joining games
private static final int MIN_SLOTS_REQUIRED = 12; // The number of slots the max server must have for auto-join
private static final long SELECT_SERVER_COOLDOWN = TimeUnit.SECONDS.toMillis(3);
private static final long SERVER_TIMEOUT = TimeUnit.SECONDS.toMillis(5);
private static final String MPS_PREFIX = "MPS";
public final long QUEUE_COOLDOWN = 2000; // Cooldown (in milliseconds) between queueing again for players
private final CoreClientManager _clientManager;
private final DonationManager _donationManager;
private final Portal _portal;
private final PartyManager _partyManager;
private final ServerStatusManager _statusManager;
private final HubManager _hubManager;
private final BoosterManager _boosterManager;
@ -98,39 +96,47 @@ public class ServerManager extends MiniPlugin
private final PersonalServerManager _personalServerManager;
private final Titles _titles;
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>();
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>();
// private NautHashMap<String, HashSet<ServerInfo>> _serverKeyInfoMap = new NautHashMap<String, HashSet<ServerInfo>>();
// private NautHashMap<String, Integer> _serverPlayerCounts = new NautHashMap<String, Integer>();
// 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>();
// Maps ServerGroup name to ServerGroup
private final Map<String, ServerGroup> _serverGroupsByName;
// Maps ServerGroup NPC name to ServerGroup
private final Map<String, ServerGroup> _serverGroupsByNPCName;
// Maps ServerGroup prefix (CW4) to a Map that maps server name (CW4-5) to GameServer
private final Map<String, Map<String, GameServer>> _gameServers;
// Maps ServerGroup prefix (CW4) to the number of players on that server
private final Map<String, Integer> _playersPlaying;
// Maps (in both directions) ServerGroup NPC name to the game room location
private final BiMap<String, Location> _serverNPCTeleport;
// Maps NPC name to the ServerGroup tags associated with that NPC
private final Map<String, String[]> _serverGroupTags = ImmutableMap.<String, String[]>builder()
.put("Master Builders", new String[] {"BLD"})
.put("Draw My Thing", new String[] {"DMT"})
.put("Micro Battles", new String[] {"MB"})
.put("Mixed Arcade", new String[] {"MIN"})
.put("Turf Wars", new String[] {"TF"})
.put("Speed Builders", new String[] {"SB"})
.put("Block Hunt", new String[] {"BH"})
.put("Cake Wars", new String[] {"CW2", "CW4"})
.put("Survival Games", new String[] {"HG", "SG2"})
.put("Skywars", new String[] {"SKY", "SKY2"})
.put("The Bridges", new String[] {"BR"})
.put("Mine-Strike", new String[] {"MS"})
.put("Super Smash Mobs", new String[] {"SSM", "SSM2"})
.put("Champions", new String[] {"DOM", "CTF"})
.put("Clans", new String[] {"ClansHub", "Clans"})
.put("Retro", new String[] {"RETRO"})
.put("Master Builders", new String[]{"BLD"})
.put("Draw My Thing", new String[]{"DMT"})
.put("Micro Battles", new String[]{"MB"})
.put("Mixed Arcade", new String[]{"MIN"})
.put("Turf Wars", new String[]{"TF"})
.put("Speed Builders", new String[]{"SB"})
.put("Block Hunt", new String[]{"BH"})
.put("Cake Wars", new String[]{"CW2", "CW4"})
.put("Survival Games", new String[]{"HG", "SG2"})
.put("Skywars", new String[]{"SKY", "SKY2"})
.put("The Bridges", new String[]{"BR"})
.put("Mine-Strike", new String[]{"MS"})
.put("Super Smash Mobs", new String[]{"SSM", "SSM2"})
.put("Champions", new String[]{"DOM", "CTF"})
.put("Clans", new String[]{"ClansHub", "Clans"})
.put("Retro", new String[]{"RETRO"})
.build();
private final QuickShop _quickShop;
private final LobbyShop _lobbyShop;
private final ServerSelectionShop _serverShop;
private boolean _alternateUpdateFire = false;
private boolean _retrieving = false;
private long _lastRetrieve = 0;
private boolean _alternateUpdateFire, _retrieving;
private long _lastRetrieve;
private ServerManager()
{
@ -139,7 +145,6 @@ public class ServerManager extends MiniPlugin
_clientManager = require(CoreClientManager.class);
_donationManager = require(DonationManager.class);
_portal = require(Portal.class);
_partyManager = require(PartyManager.class);
_statusManager = require(ServerStatusManager.class);
_hubManager = require(HubManager.class);
_boosterManager = require(BoosterManager.class);
@ -150,7 +155,12 @@ public class ServerManager extends MiniPlugin
_personalServerManager = require(PersonalServerManager.class);
_titles = require(Titles.class);
_serverGroupsByName = new HashMap<>();
_serverGroupsByNPCName = new HashMap<>();
_gameServers = new HashMap<>();
_playersPlaying = new HashMap<>();
_serverNPCTeleport = HashBiMap.create();
_hubManager.getWorldData().getSpongeLocations().forEach((key, locations) ->
{
String[] split = key.split(" ");
@ -175,6 +185,7 @@ public class ServerManager extends MiniPlugin
_quickShop = new QuickShop(this, _clientManager, _donationManager, "Quick Menu");
_lobbyShop = new LobbyShop(this, _clientManager, _donationManager, "Lobby Menu");
_serverShop = new ServerSelectionShop(this, _clientManager, _donationManager, "Server Menu");
NewNPCManager npcManager = require(NewNPCManager.class);
npcManager.spawnNPCs("GAME_", this::addNPCInfo);
@ -259,14 +270,7 @@ public class ServerManager extends MiniPlugin
return;
}
for (Entry<String, ServerNpcShop> entry : _serverNpcShopMap.entrySet())
{
if (npcName.equals(entry.getKey()))
{
entry.getValue().attemptShopOpen(player);
return;
}
}
openServerShop(player, npcName);
}
@EventHandler(priority = EventPriority.LOW)
@ -295,8 +299,7 @@ public class ServerManager extends MiniPlugin
}
Player player = (Player) event.getEntity();
Map<Location, String> teleports = _serverNPCTeleport.inverse();
Location location = UtilAlg.findClosest(player.getLocation(), teleports.keySet());
Location location = UtilAlg.findClosest(player.getLocation(), _serverNPCTeleport.values());
if (location == null || !Recharge.Instance.use(player, "Game Portal", 500, false, false))
{
@ -304,55 +307,48 @@ public class ServerManager extends MiniPlugin
}
player.teleport(location);
runSyncLater(() -> teleportOrOpen(player, teleports.get(location), false), 3);
runSyncLater(() -> teleportOrOpen(player, _serverNPCTeleport.inverse().get(location), false), 3);
}
@EventHandler
public void playerInteract(PlayerInteractEvent event)
{
if (_twofactor.isAuthenticating(event.getPlayer()) || _treasureManager.isOpeningTreasure(event.getPlayer()))
Player player = event.getPlayer();
ItemStack itemStack = player.getItemInHand();
if (_twofactor.isAuthenticating(player) || _treasureManager.isOpeningTreasure(player) || itemStack == null)
{
return;
}
if (event.getItem() != null && event.getItem().getType() == Material.COMPASS)
if (itemStack.getType() == Material.COMPASS)
{
_quickShop.attemptShopOpen(event.getPlayer());
_quickShop.attemptShopOpen(player);
}
else if (event.getItem() != null && event.getItem().getType() == Material.WATCH)
else if (itemStack.getType() == Material.WATCH)
{
_lobbyShop.attemptShopOpen(event.getPlayer());
_lobbyShop.attemptShopOpen(player);
}
}
public void addServerGroup(ServerGroup serverGroup)
{
_serverKeyInfoMap.put(serverGroup.getPrefix(), new HashSet<>());
_serverGroupsByName.put(serverGroup.getName(), serverGroup);
if (serverGroup.getServerNpcName() != null)
{
_serverGroupsByNPCName.put(serverGroup.getServerNpcName(), serverGroup);
}
}
public void addServerNpc(ServerGroup serverGroup)
public void openServerShop(Player player, String npcName)
{
_serverNpcShopMap.put(serverGroup.getServerNpcName(), new ServerNpcShop(this, _clientManager, _donationManager, serverGroup));
}
ServerGroup serverGroup = _serverGroupsByNPCName.get(npcName);
public Collection<ServerInfo> getServerList(String serverKey)
if (serverGroup != null)
{
return _serverKeyInfoMap.get(serverKey);
_serverShop.openServerPage(player, serverGroup);
}
public Set<String> getServerGroups()
{
return _serverKeyInfoMap.keySet();
}
public Set<String> getAllServers()
{
return _serverInfoMap.keySet();
}
public ServerInfo getServerInfo(String serverName)
{
return _serverInfoMap.get(serverName);
}
@EventHandler
@ -361,145 +357,108 @@ public class ServerManager extends MiniPlugin
_quickShop.attemptShopOpen(event.getPlayer());
}
@EventHandler
@EventHandler(priority = EventPriority.MONITOR)
public void updatePages(UpdateEvent event)
{
if (event.getType() != UpdateType.SEC)
{
return;
}
_quickShop.UpdatePages();
for (ServerNpcShop shop : _serverNpcShopMap.values())
{
shop.UpdatePages();
}
_serverShop.updatePages();
}
@EventHandler
public void updateServers(UpdateEvent event)
{
if (event.getType() != UpdateType.SEC || (_retrieving && System.currentTimeMillis() - _lastRetrieve <= 5000))
// Don't retrieve if we are already doing so and have not timed out.
if (event.getType() != UpdateType.SEC || (_retrieving && !UtilTime.elapsed(_lastRetrieve, SERVER_TIMEOUT)))
{
return;
}
_alternateUpdateFire = !_alternateUpdateFire;
if (!_alternateUpdateFire)
{
return;
}
_retrieving = true;
_statusManager.retrieveServerGroups(new Callback<Collection<ServerGroup>>()
runAsync(() ->
{
public void run(final Collection<ServerGroup> serverGroups)
// Get ServerGroups and Servers
Collection<ServerGroup> serverGroups = _statusManager.retrieveServerGroups();
Collection<MinecraftServer> serverStatusList = _statusManager.retrieveServerStatuses();
if (serverGroups == null || serverStatusList == null)
{
final NautHashMap<String, ServerGroup> serverGroupMap = new NautHashMap<String, ServerGroup>();
_retrieving = false;
_lastRetrieve = System.currentTimeMillis();
return;
}
// Clear cache
_serverGroupsByName.clear();
_serverGroupsByNPCName.clear();
_playersPlaying.clear();
for (ServerGroup serverGroup : serverGroups)
{
serverGroupMap.put(serverGroup.getName(), serverGroup);
addServerGroup(serverGroup);
}
_statusManager.retrieveServerStatuses(new Callback<Collection<MinecraftServer>>()
{
public void run(Collection<MinecraftServer> serverStatusList)
{
_serverPlayerCounts.clear();
for (MinecraftServer serverStatus : serverStatusList)
{
if (!_serverInfoMap.containsKey(serverStatus.getName()))
ServerGroup serverGroup = _serverGroupsByName.get(serverStatus.getGroup());
// ServerGroup of server not valid
if (serverGroup == null)
{
ServerInfo newServerInfo = new ServerInfo();
newServerInfo.Name = serverStatus.getName();
_serverInfoMap.put(serverStatus.getName(), newServerInfo);
continue;
}
String[] args = serverStatus.getMotd().split("\\|");
String tag = (serverStatus.getName() != null && serverStatus.getName().contains("-")) ? serverStatus.getName().split("-")[0] : "N/A";
//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.Server = serverStatus;
serverInfo.MOTD = args.length > 0 ? args[0] : serverStatus.getMotd();
serverInfo.CurrentPlayers = serverStatus.getPlayerCount();
serverInfo.MaxPlayers = serverStatus.getMaxPlayerCount();
for (String arg : args)
{
if (arg != null && arg.startsWith("HostRank.") && arg.length() > "HostRank.".length())
{
String identifier = arg.split("\\.")[1];
Map<String, GameServer> servers = _gameServers.computeIfAbsent(serverGroup.getPrefix(), k -> new HashMap<>());
GameServer gameServer = servers.computeIfAbsent(serverStatus.getName(), k -> new GameServer(serverStatus));
gameServer.setServer(serverStatus);
GameInfo gameInfo;
try
{
serverInfo.HostRank = PermissionGroup.valueOf(identifier);
gameInfo = GameInfo.fromString(serverStatus.getMotd());
}
catch (Exception e)
catch (JsonSyntaxException ex)
{
// Ignore
// Invalid MOTD. Most likely restarting or starting up
gameInfo = new GameInfo();
}
break;
}
}
gameServer.setInfo(gameInfo);
if (args.length > 1)
serverInfo.ServerType = args[1];
String prefix = gameServer.getPrefix();
if (args.length > 2)
serverInfo.Game = args[2];
if (args.length > 3)
serverInfo.Map = args[3];
_serverUpdate.put(serverStatus.getName(), System.currentTimeMillis());
if (_serverKeyInfoMap.containsKey(tag))
// Special case for MPS. Normally they are all separate ServerGroups however here we want to group them together
if (serverGroup.getHost() != null && !serverGroup.getHost().isEmpty())
{
_serverKeyInfoMap.get(tag).add(serverInfo);
if (!_serverPlayerCounts.containsKey(tag))
_serverPlayerCounts.put(tag, 0);
_serverPlayerCounts.put(tag, _serverPlayerCounts.get(tag) + serverInfo.CurrentPlayers);
}
prefix = MPS_PREFIX;
}
for (String name : _serverUpdate.keySet())
_playersPlaying.put(prefix, _playersPlaying.getOrDefault(prefix, 0) + gameServer.getServer().getPlayerCount());
}
_gameServers.values().forEach(map -> map.values().removeIf(gameServer ->
{
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;
_serverUpdate.put(name, -1L);
}
}
// Dead server, hasn't updated it's status in 5 seconds
return UtilTime.elapsed(gameServer.getLastUpdate(), SERVER_TIMEOUT);
}));
// Reset
_retrieving = false;
_lastRetrieve = System.currentTimeMillis();
}
});
}
});
updateCooldowns();
}
public PartyManager getPartyManager()
{
return _partyManager;
}
public void selectServer(Player player, ServerInfo serverInfo)
{
@ -518,7 +477,7 @@ public class ServerManager extends MiniPlugin
*/
public void selectServer(Player player, String serverType)
{
if (isOnCooldown(player))
if (!Recharge.Instance.use(player, "Select Server", SELECT_SERVER_COOLDOWN, false, false))
{
return;
}
@ -528,37 +487,6 @@ public class ServerManager extends MiniPlugin
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();
}
}
}
@ -568,7 +496,7 @@ public class ServerManager extends MiniPlugin
*/
public ServerInfo getBestServer(Player player, String serverKey)
{
Collection<ServerInfo> serverList = getServerList(serverKey);
Collection<ServerInfo> serverList = null;
if (serverList == null)
{
@ -591,7 +519,7 @@ public class ServerManager extends MiniPlugin
}
else
{
return servers.get(random.nextInt(count));
return servers.get(RANDOM.nextInt(count));
}
}
@ -627,68 +555,20 @@ public class ServerManager extends MiniPlugin
return serverInfo.MOTD.contains("Progress") || serverInfo.MOTD.contains("Restarting");
}
public void loadServers()
public Collection<GameServer> getServers(String prefix)
{
_serverInfoMap.clear();
_serverUpdate.clear();
for (String npcName : _serverKeyInfoMap.keySet())
{
_serverKeyInfoMap.get(npcName).clear();
Map<String, GameServer> servers = _gameServers.get(prefix);
return servers == null ? Collections.emptyList() : servers.values();
}
Region region = getPlugin().getConfig().getBoolean("serverstatus.us") ? Region.US : Region.EU;
try
private void loadServers()
{
for (ServerGroup serverGroup : mineplex.serverdata.servers.ServerManager.getServerRepository(region).getServerGroups(null))
{
addServerGroup(serverGroup);
_serverGroupsByName.clear();
_serverGroupsByNPCName.clear();
_gameServers.clear();
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;
while (blocks < 10 && (bottomVector.getBlockX() != topVector.getBlockX() || bottomVector.getBlockZ() != topVector.getBlockZ()))
{
_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++;
}
_portalToServerKey.put(bottomVector, serverGroup.getPrefix());
}
}
}
catch (Exception e)
{
System.out.println("ServerManager - Error parsing servergroups : " + e.getMessage());
}
// 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);
addServerGroup(new ServerGroup("Event", "Event Servers", "EVENT"));
addServerGroup(new ServerGroup("MPS", "Mineplex Player Servers", MPS_PREFIX));
}
public int getRequiredSlots(Player player, String serverType)
@ -701,22 +581,9 @@ public class ServerManager extends MiniPlugin
return slots;
}
public ServerNpcShop getShop(String name)
public int getGroupTagPlayerCount(String tag)
{
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;
return _playersPlaying.getOrDefault(tag, 0);
}
public ServerStatusManager getStatusManager()
@ -724,20 +591,11 @@ public class ServerManager extends MiniPlugin
return _statusManager;
}
public HubManager getHubManager()
{
return _hubManager;
}
public int getGroupTagPlayerCount(String tag)
{
if (_serverPlayerCounts.containsKey(tag))
return _serverPlayerCounts.get(tag);
else
return 0;
}
public String[] getServerTags(String npcName)
{
return _serverGroupTags.get(npcName);

View File

@ -0,0 +1,252 @@
package mineplex.hub.server.newui;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import mineplex.core.account.CoreClientManager;
import mineplex.core.common.util.C;
import mineplex.core.common.util.LineFormat;
import mineplex.core.common.util.UtilText;
import mineplex.core.donation.DonationManager;
import mineplex.core.game.status.GameInfo;
import mineplex.core.game.status.GameInfo.GameDisplayStatus;
import mineplex.core.itemstack.ItemBuilder;
import mineplex.core.shop.item.IButton;
import mineplex.core.shop.page.ShopPageBase;
import mineplex.hub.server.GameServer;
import mineplex.hub.server.ServerManager;
import mineplex.serverdata.data.ServerGroup;
public class ServerSelectionPage extends ShopPageBase<ServerManager, ServerSelectionShop>
{
private static final int STARTING_SLOT = 19;
private static final int MAX_SHOWN_SERVERS = 7;
private final ServerGroup _serverGroup;
private boolean _showInProgress;
ServerSelectionPage(ServerManager plugin, ServerSelectionShop shop, CoreClientManager clientManager, DonationManager donationManager, ServerGroup serverGroup, Player player)
{
super(plugin, shop, clientManager, donationManager, serverGroup.getServerNpcName(), player);
_serverGroup = serverGroup;
buildPage();
}
@Override
protected void buildPage()
{
if (_showInProgress)
{
// TODO MAKE
}
else
{
buildMainPage();
}
}
private void buildMainPage()
{
// Instant join
addRow(0, (byte) 3, new ItemBuilder(Material.DIAMOND_BLOCK)
.setTitle(C.cGreenB + "Click To Join Instantly!")
.setLore(UtilText.splitLineToArray(C.cGray + "Join the best server in an instant. No fiddling to find what server to join, let us pick one for you and join a game as fast as you can.", LineFormat.LORE)),
(player, clickType) ->
{
// TODO select best server
});
// Public Servers
List<GameServer> servers = new ArrayList<>(getPlugin().getServers(_serverGroup.getPrefix()));
int slot = STARTING_SLOT;
for (GameServer server : servers)
{
if (server.isDevServer())
{
addServer(slot++ + 9, server);
continue;
}
addServer(slot++, server);
if (slot >= STARTING_SLOT + MAX_SHOWN_SERVERS)
{
break;
}
}
// In Progress Servers
addRow(5, (byte) 4, new ItemBuilder(Material.GOLD_BLOCK)
.setTitle(C.cYellowB + "X Games In Progress")
.setLore(UtilText.splitLinesToArray(new String[]
{
"",
C.cWhite + C.Line + "Click to Spectate",
"",
C.cGray + "List all servers in the middle of playing. Find a random one to learn how to play better, or find one that your friend might be in."
}, LineFormat.LORE)),
(player, clickType) ->
{
// TODO show in progress servers
});
}
private void addRow(int row, byte glassData, ItemBuilder builder, IButton button)
{
ItemStack glass = builder.clone()
.setType(Material.STAINED_GLASS_PANE)
.setData(glassData)
.build();
for (int column = 0; column < 9; column++)
{
addButton(getSlot(row, column), column == 4 ? builder.build() : glass, button);
}
}
private void addServer(int slot, GameServer server)
{
GameInfo info = server.getInfo();
Material material;
byte data = 0;
String votingColour = null, votingStatus = null, votingOn = null;
String motd;
getPlugin().log(info.toString());
switch (info.getStatus())
{
case WAITING:
material = Material.STAINED_GLASS;
data = (byte) 8;
votingColour = C.cGray;
votingStatus = "Not Enough Players To Start";
motd = "Recruiting";
break;
case VOTING:
material = Material.STAINED_GLASS;
data = (byte) 5;
votingColour = C.cYellow;
votingStatus = "Voting is in Progress";
motd = "Voting Ends in " + timeString(info.getTimer());
break;
case STARTING:
material = Material.EMERALD_BLOCK;
votingColour = C.cGreen;
votingStatus = "Voting Already Finished!";
motd = "Starting in " + timeString(info.getTimer());
break;
case IN_PROGRESS:
material = Material.GOLD_BLOCK;
motd = "In Progress";
break;
default:
material = Material.IRON_BLOCK;
motd = "Not Open";
break;
}
if (_serverGroup.getGameVoting())
{
votingOn = "Game";
}
else if (_serverGroup.getMapVoting())
{
votingOn = "Map";
}
ItemBuilder builder = new ItemBuilder(material, data)
.setTitle(C.cGreenB + _serverGroup.getServerNpcName() + " Server " + server.getNumber())
.addLore("");
// If there's a game and the ServerGroup could run more than 1 game
if (info.getGame() != null && _serverGroup.getGames().contains(","))
{
builder.addLore(C.cYellow + "Game: " + C.cWhite + info.getGame());
}
if (info.getMode() != null)
{
builder.addLore(C.cYellow + "Mode: " + C.cWhite + info.getMode());
}
builder.addLore(
C.cYellow + "Players: " + C.cWhite + server.getServer().getPlayerCount() + "/" + server.getServer().getMaxPlayerCount(),
""
);
// Voting enabled
if (votingOn != null)
{
// Has information
if (votingStatus != null)
{
if (info.getStatus() != GameDisplayStatus.WAITING)
{
builder.addLore(votingColour + votingOn + " " + votingStatus);
}
else
{
builder.addLore(votingColour + votingStatus);
}
}
// Is voting
if (info.getStatus() == GameDisplayStatus.VOTING)
{
for (String value : info.getVotingOn())
{
builder.addLore(C.cYellow + votingOn + ": " + C.cWhite + value);
}
}
}
// Map
if (info.getMap() != null)
{
builder.addLore(C.cYellow + "Map: " + C.cWhite + info.getMap());
}
builder.addLore(
"",
C.cGreen + motd,
""
);
String footer;
switch (info.getJoinable())
{
case OPEN:
footer = "Click to Join!";
break;
case RANKS_ONLY:
footer = "ULTRA+ can join";
break;
default:
footer = "Closed";
break;
}
builder.addLore(C.cWhite + C.Line + footer);
addButton(slot, builder.build(), (player, clickType) ->
{
// TODO select server
});
}
private String timeString(int time)
{
return time + " Second" + (time == 1 ? "" : "s") + "...";
}
}

View File

@ -0,0 +1,35 @@
package mineplex.hub.server.newui;
import org.bukkit.entity.Player;
import mineplex.core.account.CoreClientManager;
import mineplex.core.donation.DonationManager;
import mineplex.core.shop.ShopBase;
import mineplex.core.shop.page.ShopPageBase;
import mineplex.hub.server.ServerManager;
import mineplex.serverdata.data.ServerGroup;
public class ServerSelectionShop extends ShopBase<ServerManager>
{
public ServerSelectionShop(ServerManager plugin, CoreClientManager clientManager, DonationManager donationManager, String name)
{
super(plugin, clientManager, donationManager, name);
}
@Override
protected ShopPageBase<ServerManager, ? extends ShopBase<ServerManager>> buildPagesFor(Player player)
{
return null;
}
public void openServerPage(Player player, ServerGroup group)
{
openPageForPlayer(player, new ServerSelectionPage(getPlugin(), this, getClientManager(), getDonationManager(), group, player));
}
public void updatePages()
{
getPageMap().values().forEach(ShopPageBase::refresh);
}
}

View File

@ -1,42 +0,0 @@
package mineplex.hub.server.ui;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import mineplex.core.account.CoreClientManager;
import mineplex.core.common.util.C;
import mineplex.core.donation.DonationManager;
import mineplex.core.itemstack.ItemBuilder;
import mineplex.core.shop.page.ShopPageBase;
import mineplex.hub.server.ServerManager;
public class CakeWarsServerTypePage extends ShopPageBase<ServerManager, ServerNpcShop>
{
CakeWarsServerTypePage(ServerManager plugin, ServerNpcShop shop, CoreClientManager clientManager, DonationManager donationManager, Player player)
{
super(plugin, shop, clientManager, donationManager, "Cake Wars", player, 27);
buildPage();
}
@Override
protected void buildPage()
{
addButton(12, new ItemBuilder(Material.CAKE).setTitle("Play " + C.cRedB + "Cake Wars " + C.cWhiteB + "Standard")
.addLore
(
C.blankLine,
C.Reset + C.cGreen + "Click to Play"
).build(),
(player, clickType) -> getShop().openPageForPlayer(player, new ServerNpcPage(getPlugin(), getShop(), getClientManager(), getDonationManager(), "Cake Wars Standard", player, "CW4")));
addButton(14, new ItemBuilder(Material.SUGAR).setTitle("Play " + C.cRedB + "Cake Wars " + C.cWhiteB + "Duos")
.addLore
(
C.blankLine,
C.Reset + C.cGreen + "Click to Play"
).build(),
(player, clickType) -> getShop().openPageForPlayer(player, new ServerNpcPage(getPlugin(), getShop(), getClientManager(), getDonationManager(), "Cake Wars Duos", player, "CW2")));
}
}

View File

@ -1,42 +0,0 @@
package mineplex.hub.server.ui;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import mineplex.core.account.CoreClientManager;
import mineplex.core.common.util.C;
import mineplex.core.donation.DonationManager;
import mineplex.core.itemstack.ItemBuilder;
import mineplex.core.shop.page.ShopPageBase;
import mineplex.hub.server.ServerManager;
public class ChampionsServerTypePage extends ShopPageBase<ServerManager, ServerNpcShop>
{
ChampionsServerTypePage(ServerManager plugin, ServerNpcShop shop, CoreClientManager clientManager, DonationManager donationManager, Player player)
{
super(plugin, shop, clientManager, donationManager, "Champions", player, 27);
buildPage();
}
@Override
protected void buildPage()
{
addButton(12, new ItemBuilder(Material.BEACON).setTitle("Play " + C.cGreen + "Champions Dominate")
.addLore
(
C.blankLine,
C.Reset + C.cGreen + "Click to Play"
).build(),
(player, clickType) -> getShop().openPageForPlayer(player, new ServerNpcPage(getPlugin(), getShop(), getClientManager(), getDonationManager(), "Champions Dominate", player, "DOM")));
addButton(14, new ItemBuilder(Material.BANNER).setTitle("Play " + C.cGreen + "Champions CTF")
.addLore
(
C.blankLine,
C.Reset + C.cGreen + "Click to Play"
).build(),
(player, clickType) -> getShop().openPageForPlayer(player, new ServerNpcPage(getPlugin(), getShop(), getClientManager(), getDonationManager(), "Champions CTF", player, "CTF")));
}
}

View File

@ -1,21 +1,11 @@
package mineplex.hub.server.ui;
import java.util.ArrayList;
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.common.util.C;
import mineplex.core.donation.DonationManager;
import mineplex.core.shop.item.ShopItem;
import mineplex.core.shop.page.ShopPageBase;
import mineplex.hub.server.LobbySorter;
import mineplex.hub.server.ServerInfo;
import mineplex.hub.server.ServerManager;
import mineplex.hub.server.ui.button.JoinServerButton;
public class LobbyMenu extends ShopPageBase<ServerManager, LobbyShop>
{
@ -34,51 +24,5 @@ public class LobbyMenu extends ShopPageBase<ServerManager, LobbyShop>
@Override
protected void buildPage()
{
List<ServerInfo> serverList = new ArrayList<>(getPlugin().getServerList(_serverGroup));
try
{
serverList.sort(new LobbySorter());
}
catch (Exception exception)
{
exception.printStackTrace();
}
int slot = 0;
String openFull = ChatColor.RESET + C.Line + "Get Ultra to join full servers!";
String openFullUltra = ChatColor.RESET + C.Line + "Click to join!";
for (ServerInfo serverInfo : serverList)
{
Material status = Material.IRON_BLOCK;
List<String> lore = new ArrayList<>();
slot = Integer.parseInt(serverInfo.Name.split("-")[1]) - 1;
if (slot >= 54)
continue;
if (serverInfo.Name.equalsIgnoreCase(getPlugin().getStatusManager().getCurrentServerName()))
status = Material.EMERALD_BLOCK;
lore.add(ChatColor.RESET + "");
lore.add(ChatColor.RESET + "" + ChatColor.YELLOW + "Players: " + ChatColor.WHITE + serverInfo.CurrentPlayers + "/" + serverInfo.MaxPlayers);
lore.add(ChatColor.RESET + "");
if (serverInfo.CurrentPlayers >= serverInfo.MaxPlayers)
{
if (!getClientManager().Get(getPlayer()).hasPermission(ServerManager.Perm.JOIN_FULL))
lore.add(openFull);
else
lore.add(openFullUltra);
}
else
lore.add(ChatColor.RESET + C.Line + "Click to join!");
if (status != Material.EMERALD_BLOCK)
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()]), Integer.parseInt(serverInfo.Name.substring(serverInfo.Name.indexOf('-') + 1)), false), new JoinServerButton(this, getPlugin(), serverInfo, getPlayer()));
else
addItem(slot, new ShopItem(status, ChatColor.UNDERLINE + "" + ChatColor.BOLD + "" + ChatColor.WHITE + "Server " + serverInfo.Name.substring(serverInfo.Name.indexOf('-') + 1), lore.toArray(new String[lore.size()]), Integer.parseInt(serverInfo.Name.substring(serverInfo.Name.indexOf('-') + 1)), false));
}
}
}

View File

@ -1,514 +0,0 @@
package mineplex.hub.server.ui;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.SkullMeta;
import mineplex.core.account.CoreClientManager;
import mineplex.core.common.util.C;
import mineplex.core.donation.DonationManager;
import mineplex.core.game.GameDisplay;
import mineplex.core.itemstack.ItemStackFactory;
import mineplex.core.shop.item.IButton;
import mineplex.core.shop.item.ShopItem;
import mineplex.core.shop.page.ShopPageInventory;
import mineplex.hub.server.ServerInfo;
import mineplex.hub.server.ServerManager;
import mineplex.hub.server.ServerSorter;
import mineplex.hub.server.ui.button.JoinServerButton;
public class ServerNpcPage extends ShopPageInventory<ServerManager, ServerNpcShop>
{
private static final int MAX_FULL_SERVERS = 3;
// Shop Item Messages
private static final String MESSAGE_BETA_GET_ULTRA = ChatColor.RESET + C.Line + "Get Ultra to join Tournament 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 _serverGroupName;
private boolean _onMainPage = true;
private IButton[] _buttons;
private ItemStack[] _items;
public ServerNpcPage(ServerManager plugin, ServerNpcShop shop, CoreClientManager clientManager, DonationManager donationManager, String name, Player player, String serverGroupName)
{
super(plugin, shop, clientManager, donationManager, name, player, 54);
_serverGroupName = serverGroupName;
buildPage();
}
@Override
protected void buildItems()
{
_items = new ItemStack[0];
_buttons = new IButton[0];
List<ServerInfo> serverList = new ArrayList<ServerInfo>(getPlugin().getServerList(_serverGroupName));
int slotsNeeded = 1;
if (serverList.size() > 0)
{
slotsNeeded = getPlugin().getRequiredSlots(getPlayer(), serverList.get(0).ServerType);
}
try
{
Collections.sort(serverList, new ServerSorter(slotsNeeded));
}
catch (Exception exception)
{
exception.printStackTrace();
}
if (_onMainPage)
{
buildAvailableServerPage(serverList, slotsNeeded);
}
else
{
buildInProgressServerPage(serverList, slotsNeeded);
}
}
private ShopItem buildShopItem(ServerInfo serverInfo, int slotsNeeded, boolean isDev)
{
boolean ownsUltraPackage = getDonationManager().Get(getPlayer()).ownsUnknownSalesPackage(serverInfo.ServerType + " ULTRA") || getClientManager().Get(getPlayer()).hasPermission(ServerManager.Perm.JOIN_FULL);
Material status = Material.REDSTONE_BLOCK;
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 = isDev ? Material.COMMAND : Material.EMERALD_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 + "");
lore.add(ChatColor.RESET + serverInfo.MOTD);
if (serverInfo.Name.contains("T_") && !ownsUltraPackage)
{
lore.add(MESSAGE_BETA_GET_ULTRA);
}
else
{
if (isInProgress(serverInfo))
{
if (serverInfo.MOTD.contains("Restarting"))
{
status = Material.IRON_BLOCK;
lore.add(MESSAGE_RESTARTING);
}
else
{
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(MESSAGE_FULL_GET_ULTRA);
}
else
{
lore.add(inProgress);
if (wait != null)
lore.add(wait);
}
}
}
}
else
{
if (serverInfo.CurrentPlayers >= serverInfo.MaxPlayers && !ownsUltraPackage)
{
lore.add(MESSAGE_FULL_GET_ULTRA);
}
else if (!serverInfo.MOTD.contains("Open in"))
{
if (isDev)
{
lore.add(ChatColor.RESET + C.cRed + "Warning: This is a test server run by a developer");
lore.add(ChatColor.RESET + C.cRed + "It may contain unreleased updates");
}
lore.add(MESSAGE_JOIN);
}
}
}
return new ShopItem(status, ChatColor.RESET + C.cGreen + C.Line + C.Bold + "Server " + serverInfo.Name.substring(serverInfo.Name.indexOf('-') + 1), lore.toArray(new String[lore.size()]), serverInfo.CurrentPlayers, false);
}
private void buildAvailableServerPage(List<ServerInfo> serverList, int slotsNeeded)
{
boolean hasDevServers = false;
for (Iterator<ServerInfo> iterator = serverList.iterator(); iterator.hasNext(); )
{
ServerInfo serverInfo = iterator.next();
if (serverInfo.isDevServer())
{
if (TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - serverInfo.Server.getCurrentTime()) < 5)
{
if (!isInProgress(serverInfo))
{
hasDevServers = true;
break;
}
}
else
{
iterator.remove();
}
}
}
boolean privateServer = serverList.size() > 0 && serverList.get(0).ServerType.equals("Player");
if (privateServer)
{
int staffSlot = 0;
int slot = 18;
for (ServerInfo serverInfo : serverList)
{
if (serverInfo.MOTD.contains("Private"))
continue;
if (serverInfo.MaxPlayers - serverInfo.CurrentPlayers <= 0)
continue;
if (serverInfo.HostRank != null && serverInfo.HostRank.hasPermission(ServerManager.Perm.FEATURE_SERVER) && staffSlot < 9)
{
addButton(staffSlot, getPrivateItem(serverInfo), new JoinServerButton(this, getPlugin(), serverInfo, getPlayer()));
staffSlot++;
}
else
{
if (slot >= 54)
continue;
addButton(slot, getPrivateItem(serverInfo), new JoinServerButton(this, getPlugin(), serverInfo, getPlayer()));
slot++;
}
}
return;
}
int gamesInProgress = 0;
if (!hasDevServers)
{
int normalSlotStart = 19;
int normalSlotEnd = 25;
int currentNormalSlot = normalSlotStart;
int fullCount = 0;
for (ServerInfo serverInfo : serverList)
{
if (isStarting(serverInfo) && hasEnoughSlots(serverInfo, slotsNeeded))
{
boolean full = serverInfo.MaxPlayers - serverInfo.CurrentPlayers <= 0;
if (full && fullCount >= MAX_FULL_SERVERS)
continue;
ShopItem shopItem = buildShopItem(serverInfo, slotsNeeded, false);
if (serverInfo.MOTD.contains("Open in"))
addItemStack(currentNormalSlot, shopItem);
else
addButton(currentNormalSlot, shopItem, new JoinServerButton(this, getPlugin(), serverInfo, getPlayer()));
if (full)
fullCount++;
currentNormalSlot++;
if (currentNormalSlot > normalSlotEnd)
break;
}
else if (isInProgress(serverInfo))
{
gamesInProgress++;
}
}
if (currentNormalSlot <= normalSlotEnd)
for (int i = currentNormalSlot; i <= normalSlotEnd; i++)
{
addItemStack(i, null);
}
}
else
{
int normalSlotStart = 10;
int normalSlotEnd = 16;
int currentNormalSlot = normalSlotStart;
int normalFullCount = 0;
int devSlotStart = 28;
int devSlotEnd = 34;
int currentDevSlot = devSlotStart;
int devFullCount = 0;
for (ServerInfo serverInfo : serverList)
{
boolean isDevServer = serverInfo.isDevServer();
if (isStarting(serverInfo) && hasEnoughSlots(serverInfo, slotsNeeded))
{
if (isDevServer && currentDevSlot > devSlotEnd)
continue;
else if (!isDevServer && currentNormalSlot > normalSlotEnd)
continue;
boolean full = serverInfo.MaxPlayers - serverInfo.CurrentPlayers <= 0;
if (full)
{
if (isDevServer && devFullCount >= MAX_FULL_SERVERS)
continue;
else if (!isDevServer && normalFullCount >= MAX_FULL_SERVERS)
continue;
}
ShopItem shopItem = buildShopItem(serverInfo, slotsNeeded, isDevServer);
if (serverInfo.MOTD.contains("Open in"))
addItemStack(isDevServer ? currentDevSlot : currentNormalSlot, shopItem);
else
addButton(isDevServer ? currentDevSlot : currentNormalSlot, shopItem, new JoinServerButton(this, getPlugin(), serverInfo, getPlayer()));
if (full)
{
if (isDevServer)
devFullCount++;
else
normalFullCount++;
}
if (isDevServer)
currentDevSlot++;
else
currentNormalSlot++;
}
else if (isInProgress(serverInfo))
{
gamesInProgress++;
}
}
if (currentNormalSlot <= normalSlotEnd)
for (int i = currentNormalSlot; i <= normalSlotEnd; i++)
{
addItemStack(i, null);
}
if (currentDevSlot <= devSlotEnd)
for (int i = currentDevSlot; i <= devSlotEnd; i++)
{
addItemStack(i, null);
}
}
addButton(40, new ShopItem(Material.GOLD_BLOCK, C.cAqua + gamesInProgress + " Game" + (gamesInProgress == 1 ? "" : "s") + " In Progress", new String[]{MESSAGE_SPECTATE}, gamesInProgress > 64 ? 64 : gamesInProgress, false), new IButton()
{
@Override
public void onClick(Player player, ClickType clickType)
{
_onMainPage = false;
}
});
addButton(4, ItemStackFactory.Instance.CreateStack(Material.DIAMOND_BLOCK, (byte) 0, 1, C.cGreen + "Click to join instantly!"), new IButton()
{
@Override
public void onClick(Player player, ClickType clickType)
{
getPlugin().selectServer(player, _serverGroupName);
}
});
}
public void addItemStack(int slot, ItemStack item)
{
if (_items.length <= slot)
{
if (item == null || item.getType() == Material.AIR)
{
return;
}
_items = Arrays.copyOf(_items, slot + 1);
_buttons = Arrays.copyOf(_buttons, slot + 1);
}
_items[slot] = item;
}
public void addButton(int slot, ItemStack item, IButton button)
{
if (_items.length <= slot)
{
_items = Arrays.copyOf(_items, slot + 1);
_buttons = Arrays.copyOf(_buttons, slot + 1);
}
_items[slot] = item;
_buttons[slot] = button;
}
private ShopItem getPrivateItem(ServerInfo serverInfo)
{
String hostName = serverInfo.Name.substring(0, serverInfo.Name.indexOf('-'));
String server = ChatColor.GREEN + C.Bold + serverInfo.Name;
String host = ChatColor.YELLOW + "Host: " + C.cWhite + hostName;
Material material = Material.SKULL_ITEM;
byte data = (byte) 3;
List<String> lore = new ArrayList<>();
lore.add(host);
lore.add(" ");
lore.add(ChatColor.RESET + C.cYellow + "Players: " + C.cWhite + serverInfo.CurrentPlayers + "/" + serverInfo.MaxPlayers);
lore.add(" ");
if (serverInfo.Game != null)
{
lore.add(ChatColor.RESET + C.cYellow + "Game: " + C.cWhite + serverInfo.Game);
GameDisplay display = GameDisplay.matchName(serverInfo.Game);
if (display != null)
{
material = display.getMaterial();
data = display.getMaterialData();
}
}
if (serverInfo.Map != null)
lore.add(ChatColor.RESET + C.cYellow + "Map: " + C.cWhite + serverInfo.Map);
if (serverInfo.HostRank != null && serverInfo.HostRank.hasPermission(ServerManager.Perm.FEATURE_SERVER))
{
lore.add(" ");
lore.add(ChatColor.RESET + "Host Rank: " + serverInfo.HostRank.getDisplay(true, false, true, true));
}
ShopItem shopItem = new ShopItem(material, data, server, lore.toArray(new String[0]), 1, false, false);
if (material == Material.SKULL_ITEM)
{
SkullMeta meta = (SkullMeta) shopItem.getItemMeta();
meta.setOwner(hostName);
shopItem.setItemMeta(meta);
}
return shopItem;
}
private boolean isStarting(ServerInfo serverInfo)
{
return (serverInfo.MOTD.contains("Starting") || serverInfo.MOTD.contains("Recruiting") || serverInfo.MOTD.contains("Generating") || serverInfo.MOTD.contains("Waiting") || serverInfo.MOTD.contains("Open"));
}
private boolean isInProgress(ServerInfo serverInfo)
{
return serverInfo.MOTD.contains("Progress") || serverInfo.MOTD.contains("Restarting");
}
private boolean hasEnoughSlots(ServerInfo serverInfo, int slotsNeeded)
{
return (serverInfo.MaxPlayers - serverInfo.CurrentPlayers) >= slotsNeeded;
}
private void buildInProgressServerPage(List<ServerInfo> serverList, int slotsNeeded)
{
int slot = 9;
ArrayList<ServerInfo> inProgress = new ArrayList<ServerInfo>();
for (ServerInfo serverInfo : serverList)
{
if (isInProgress(serverInfo))
{
ShopItem shopItem = buildShopItem(serverInfo, slotsNeeded, false);
addButton(slot, shopItem, new JoinServerButton(this, getPlugin(), serverInfo, getPlayer()));
inProgress.add(serverInfo);
}
}
for (ServerInfo serverInfo : inProgress)
{
if (inProgress.size() > 45 && slot > 9 && slot % 45 == 0)
{
addBackBed(slot + 4);
slot += 9;
}
ShopItem shopItem = buildShopItem(serverInfo, slotsNeeded, false);
addButton(slot, shopItem, new JoinServerButton(this, getPlugin(), serverInfo, getPlayer()));
slot++;
}
addBackBed(4);
}
private void addBackBed(int slot)
{
addButton(slot, new ShopItem(Material.BED, C.cGray + " \u21FD Go Back", new String[]
{}, 1, false), new IButton()
{
@Override
public void onClick(Player player, ClickType clickType)
{
_onMainPage = true;
buildPage();
}
});
}
public void Update()
{
getButtonMap().clear();
buildPage();
}
@Override
protected IButton[] getButtons()
{
return _buttons;
}
@Override
protected ItemStack[] getItems()
{
return _items;
}
}

View File

@ -1,71 +0,0 @@
package mineplex.hub.server.ui;
import org.bukkit.entity.Player;
import mineplex.core.account.CoreClientManager;
import mineplex.core.donation.DonationManager;
import mineplex.core.shop.ShopBase;
import mineplex.core.shop.page.ShopPageBase;
import mineplex.hub.server.ServerManager;
import mineplex.serverdata.data.ServerGroup;
public class ServerNpcShop extends ShopBase<ServerManager>
{
private final ServerGroup _serverGroup;
public ServerNpcShop(ServerManager plugin, CoreClientManager clientManager, DonationManager donationManager, ServerGroup serverGroup)
{
super(plugin, clientManager, donationManager, serverGroup.getServerNpcName());
_serverGroup = serverGroup;
}
@Override
protected ShopPageBase<ServerManager, ? extends ShopBase<ServerManager>> buildPagesFor(Player player)
{
switch (_serverGroup.getPrefix().toUpperCase())
{
case "SKY":
case "HG":
case "SSM":
return new ServerTypePage(getPlugin(), this, getClientManager(), getDonationManager(), player, _serverGroup);
case "CW2":
case "CW4":
return new CakeWarsServerTypePage(getPlugin(), this, getClientManager(), getDonationManager(), player);
case "DOM":
case "CTF":
return new ChampionsServerTypePage(getPlugin(), this, getClientManager(), getDonationManager(), player);
default:
return new ServerNpcPage(getPlugin(), this, getClientManager(), getDonationManager(), _serverGroup.getServerNpcName(), player, _serverGroup.getPrefix());
}
}
public void UpdatePages()
{
for (ShopPageBase<ServerManager, ? extends ShopBase<ServerManager>> page : getPlayerPageMap().values())
{
if (page instanceof ServerNpcPage)
{
((ServerNpcPage) page).Update();
}
else if (page instanceof ServerGameMenu)
{
((ServerGameMenu) page).Update();
}
}
}
protected void openShopForPlayer(Player player)
{
getPlugin().getHubManager().GetVisibility().addHiddenPlayer(player);
}
protected void closeShopForPlayer(Player player)
{
getPlugin().getHubManager().GetVisibility().removeHiddenPlayer(player);
}
}

View File

@ -1,77 +0,0 @@
package mineplex.hub.server.ui;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import mineplex.core.account.CoreClientManager;
import mineplex.core.common.util.C;
import mineplex.core.donation.DonationManager;
import mineplex.core.itemstack.ItemBuilder;
import mineplex.core.shop.page.ShopPageBase;
import mineplex.hub.server.ServerManager;
import mineplex.hub.server.ui.button.SelectTypeButton;
import mineplex.serverdata.data.ServerGroup;
public class ServerTypePage extends ShopPageBase<ServerManager, ServerNpcShop>
{
private ServerGroup _serverGroup;
public ServerTypePage(ServerManager plugin, ServerNpcShop shop, CoreClientManager clientManager,
DonationManager donationManager, Player player, ServerGroup serverGroup)
{
super(plugin, shop, clientManager, donationManager, serverGroup.getServerNpcName(), player, 27);
_serverGroup = serverGroup;
buildPage();
}
@Override
protected void buildPage()
{
String friendlyName = _serverGroup.getServerNpcName();
setItem(12, new ItemBuilder(Material.SKULL_ITEM, 1, (byte) 3).setTitle(C.Reset + C.cYellow + "Solo " + friendlyName)
.addLore(new String[]
{
C.Reset + "",
C.Reset + C.cRed + C.Bold + "WARNING: " + C.Reset + "Teaming in Solo Mode is bannable!",
C.Reset + "",
C.Reset + C.cGreen + "Click to Play",
}).build());
setItem(14, new ItemBuilder(Material.SKULL_ITEM, 2, (byte) 3).setTitle(C.Reset + C.cYellow + "Team " + friendlyName)
.addLore(new String[]
{
C.Reset + "",
C.Reset + C.cGray + "2 Player Teams",
C.Reset + "",
C.Reset + C.cGreen + "Click to Play"
}).build());
getButtonMap().put(12, new SelectTypeButton(this, false));
getButtonMap().put(14, new SelectTypeButton(this, true));
}
public void Update()
{
getButtonMap().clear();
buildPage();
}
public void selectServer(Player player, boolean team)
{
if (team)
{
getShop().openPageForPlayer(player, new ServerNpcPage(getPlugin(), getShop(), getClientManager(),
getDonationManager(), _serverGroup.getServerNpcName() + " Teams", player, _serverGroup.getTeamServerKey()));
}
else
{
getShop().openPageForPlayer(player, new ServerNpcPage(getPlugin(), getShop(), getClientManager(),
getDonationManager(), _serverGroup.getServerNpcName() + " Solo", player, _serverGroup.getPrefix()));
}
}
}

View File

@ -1,52 +0,0 @@
package mineplex.hub.server.ui.button;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import mineplex.core.shop.item.IButton;
import mineplex.core.shop.page.ShopPageBase;
import mineplex.hub.server.ServerInfo;
import mineplex.hub.server.ServerManager;
public class JoinServerButton implements IButton
{
private final ShopPageBase<?, ?> _page;
private final ServerManager _serverManager;
private final ServerInfo _serverInfo;
private final Player _player;
public JoinServerButton(ShopPageBase<?, ?> page, ServerManager serverManager, ServerInfo serverInfo, Player player)
{
_page = page;
_serverManager = serverManager;
_serverInfo = serverInfo;
_player = player;
}
@Override
public void onClick(Player player, ClickType clickType)
{
selectServer(player, _serverInfo);
}
public void selectServer(Player player, ServerInfo serverInfo)
{
if (serverInfo != null)
{
int slots = _serverManager.getRequiredSlots(player, serverInfo.ServerType);
if (serverInfo.getAvailableSlots() < slots && !(_page.getDonationManager().Get(_player).ownsUnknownSalesPackage(serverInfo.ServerType + " ULTRA") || _page.getClientManager().Get(_player).hasPermission(ServerManager.Perm.JOIN_FULL)))
{
_page.playDenySound(player);
}
else
{
_serverManager.selectServer(player, serverInfo);
}
}
else
{
_page.playDenySound(player);
}
}
}

View File

@ -1,25 +0,0 @@
package mineplex.hub.server.ui.button;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import mineplex.core.shop.item.IButton;
import mineplex.hub.server.ui.ServerTypePage;
public class SelectTypeButton implements IButton
{
private ServerTypePage _page;
private boolean _teamBased;
public SelectTypeButton(ServerTypePage page, boolean teamBased)
{
_page = page;
_teamBased = teamBased;
}
@Override
public void onClick(Player player, ClickType clickType)
{
_page.selectServer(player, _teamBased);
}
}

View File

@ -175,7 +175,7 @@ import nautilus.game.arcade.managers.lobby.LobbyManager;
import nautilus.game.arcade.managers.lobby.current.NewGameLobbyManager;
import nautilus.game.arcade.managers.lobby.legacy.LegacyGameLobbyManager;
import nautilus.game.arcade.managers.voting.Vote;
import nautilus.game.arcade.managers.voting.types.GameVote;
import nautilus.game.arcade.managers.voting.Voteable;
public class ArcadeManager extends MiniPlugin implements IRelation
{
@ -1057,24 +1057,25 @@ public class ArcadeManager extends MiniPlugin implements IRelation
// Null game - GameVote
if (nullGame)
{
game = "Voting";
map = game;
Vote vote = _gameCreationManager.getVotingManager().getCurrentVote();
if (vote instanceof GameVote)
{
votingOn = ((GameVote) vote).getValues().stream()
.map(GameType::getName)
.toArray(String[]::new);
}
game = null;
map = null;
}
// MapVote
else
{
game = _game.GetName();
mode = _game.GetMode();
map = "Voting";
map = null;
}
Vote<? extends Voteable> vote = _gameCreationManager.getVotingManager().getCurrentVote();
if (vote != null)
{
timer = vote.getTimer();
votingOn = vote.getValues().stream()
.map(Voteable::getDisplayName)
.toArray(String[]::new);
}
}
// No vote and game null. Staff-1 or pre game voting
@ -1087,7 +1088,12 @@ public class ArcadeManager extends MiniPlugin implements IRelation
{
game = _game.GetName();
mode = _game.GetMode();
// Has WorldData
if (_game.WorldData != null)
{
map = _game.WorldData.MapName;
}
// Game not in progress
if (_game.inLobby())
@ -1117,7 +1123,7 @@ public class ArcadeManager extends MiniPlugin implements IRelation
hostRank = _gameHostManager.getHostRank();
}
event.setMotd(new GameInfo(game, mode, map, _serverConfig.ServerType, timer, votingOn, hostRank, status, getJoinable()).toString());
event.setMotd(new GameInfo(game, mode, map, timer, votingOn, hostRank, status, getJoinable()).toString());
}
@EventHandler

View File

@ -336,6 +336,12 @@ public enum GameType implements Voteable
return _display.getName();
}
@Override
public String getDisplayName()
{
return getName();
}
public String GetLobbyName()
{
return _display.getLobbyName();

View File

@ -7,6 +7,8 @@ public interface Voteable
String getName();
String getDisplayName();
ItemStack getItemStack();
}

View File

@ -23,6 +23,7 @@ public class VotableMap implements Voteable
return _name;
}
@Override
public String getDisplayName()
{
String[] split = getName().split("_");

View File

@ -96,6 +96,8 @@ public class WorldData
World.setDifficulty(Difficulty.HARD);
World.setGameRuleValue("showDeathMessages", "false");
Host.getArcadeManager().runAsync(() ->
{
TimingManager.start("WorldData loading WorldConfig.");
//Load World Data
@ -111,10 +113,12 @@ public class WorldData
MaxZ = max.getBlockZ();
MapName = _mineplexWorld.getMapName();
Host.getArcadeManager().GetGameWorldManager().RegisterWorld(this);
TimingManager.stop("WorldData loading WorldConfig.");
});
});
});
}
private boolean loadUHCMap()