diff --git a/Plugins/Libraries/BungeeCord.jar b/Plugins/Libraries/BungeeCord.jar index 24e5a7647..4ccf58cca 100644 Binary files a/Plugins/Libraries/BungeeCord.jar and b/Plugins/Libraries/BungeeCord.jar differ diff --git a/Plugins/Libraries/craftbukkit.jar b/Plugins/Libraries/craftbukkit.jar index 33a98bd29..c89d8f8c6 100644 Binary files a/Plugins/Libraries/craftbukkit.jar and b/Plugins/Libraries/craftbukkit.jar differ diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/Mineplexer.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/Mineplexer.java index a24de1edc..5f96ac69b 100644 --- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/Mineplexer.java +++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/Mineplexer.java @@ -3,11 +3,18 @@ package mineplex.bungee; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import mineplex.bungee.lobbyBalancer.LobbyBalancer; import mineplex.bungee.motd.MotdManager; import mineplex.bungee.playerCount.PlayerCount; import net.md_5.bungee.api.plugin.Plugin; +import net.md_5.bungee.conf.YamlConfig; public class Mineplexer extends Plugin { @@ -15,40 +22,50 @@ public class Mineplexer extends Plugin public void onEnable() { //_dynamicServers = new GlobalServer(this); + + /* + try + { + Field config = YamlConfig.class.getDeclaredField("config"); + config.setAccessible(true); + Map configMap = (Map)config.get(getProxy().getConfigurationAdapter()); + + System.out.println("Printing groups."); + for (String playerName : ((HashMap>)configMap.get("groups")).keySet()) + { + System.out.println(playerName); + + for (String rank : ((HashMap>)configMap.get("groups")).get(playerName)) + { + System.out.println("-" + rank); + } + } + + ((HashMap>)configMap.get("groups")).clear(); + ((HashMap>)configMap.get("groups")).put("defek7", Arrays.asList("admin", "owner")); + + config.set(getProxy().getConfigurationAdapter(), configMap); + System.out.println("Printing groups."); + for (String playerName : ((HashMap>)configMap.get("groups")).keySet()) + { + System.out.println(playerName); + + for (String rank : ((HashMap>)configMap.get("groups")).get(playerName)) + { + System.out.println("-" + rank); + } + } + } + catch (Exception e) + { + e.printStackTrace(); + } + */ + new MotdManager(this); new LobbyBalancer(this); new PlayerCount(this); new FileUpdater(this); - - /* - Socket socket = null; - DataInputStream dataInputStream = null; - DataOutputStream dataOutputStream = null; - - - try - { - socket = new Socket(); - socket.setSoTimeout(3000); - socket.setTcpNoDelay(true); - socket.setTrafficClass(18); - socket.connect(new InetSocketAddress("192.95.30.130", 4444)); - dataInputStream = new DataInputStream(socket.getInputStream()); - dataOutputStream = new DataOutputStream(socket.getOutputStream()); - - dataOutputStream.writeShort(71); - writeString("defek7", dataOutputStream); - - dataInputStream.read(); - System.out.println(dataInputStream.readByte()); - System.out.println(readString(dataInputStream, 16)); - System.out.println(readString(dataInputStream, 24)); - } - catch (Exception ex) - { - ex.printStackTrace(); - } - */ } protected String readString(DataInputStream dataInputStream, int maxLength) throws IOException diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/globalServer/GlobalServerRepository.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/globalServer/GlobalServerRepository.java index 897aebf48..a52322228 100644 --- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/globalServer/GlobalServerRepository.java +++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/globalServer/GlobalServerRepository.java @@ -7,7 +7,7 @@ import java.sql.SQLException; public class GlobalServerRepository { - private String _connectionString = "jdbc:mysql://sql.mineplex.com:3306/BungeeServers"; + private String _connectionString = "jdbc:mysql://db.mineplex.com:3306/BungeeServers"; private String _userName = "root"; private String _password = "tAbechAk3wR7tuTh"; diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbyBalancer.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbyBalancer.java index 7f1c534db..9870bf191 100644 --- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbyBalancer.java +++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbyBalancer.java @@ -22,7 +22,7 @@ public class LobbyBalancer implements Listener, Runnable private int _bestServerIndex = 0; private int _playersSentToBestServer = 0; - private int _maxPlayersToSendToBestServer = 0; + private int _maxPlayersToSendToBestServer = 1; public LobbyBalancer(Plugin plugin) { @@ -109,7 +109,9 @@ public class LobbyBalancer implements Listener, Runnable Collections.sort(_sortedLobbies, new LobbySorter()); _bestServerIndex = 0; - _maxPlayersToSendToBestServer = (_sortedLobbies.get(_bestServerIndex).MaxPlayers - _sortedLobbies.get(_bestServerIndex).Players) / 10; + + if (_sortedLobbies.size() > 0) + _maxPlayersToSendToBestServer = (_sortedLobbies.get(_bestServerIndex).MaxPlayers - _sortedLobbies.get(_bestServerIndex).Players) / 10; } } } diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbyBalancerRepository.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbyBalancerRepository.java index 7c3ca5dda..59eedba24 100644 --- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbyBalancerRepository.java +++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbyBalancerRepository.java @@ -11,7 +11,7 @@ import java.util.List; public class LobbyBalancerRepository { private Connection _connection = null; - private String _connectionString = "jdbc:mysql://sql.mineplex.com:3306/ServerStatus?autoReconnect=true&failOverReadOnly=false&maxReconnects=10"; + private String _connectionString = "jdbc:mysql://db.mineplex.com:3306/ServerStatus?autoReconnect=true&failOverReadOnly=false&maxReconnects=10"; private String _userName = "root"; private String _password = "tAbechAk3wR7tuTh"; private boolean _us; diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/MotdRepository.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/MotdRepository.java index 2bb1ccfff..582db1dc7 100644 --- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/MotdRepository.java +++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/MotdRepository.java @@ -9,7 +9,7 @@ import java.sql.SQLException; public class MotdRepository { private Connection _connection = null; - private String _connectionString = "jdbc:mysql://sql.mineplex.com:3306/BungeeServers?autoReconnect=true&failOverReadOnly=false&maxReconnects=10"; + private String _connectionString = "jdbc:mysql://db.mineplex.com:3306/BungeeServers?autoReconnect=true&failOverReadOnly=false&maxReconnects=10"; private String _userName = "root"; private String _password = "tAbechAk3wR7tuTh"; diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerCountRepository.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerCountRepository.java index 758139243..68ddf87d4 100644 --- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerCountRepository.java +++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerCountRepository.java @@ -10,7 +10,7 @@ import java.sql.Statement; public class PlayerCountRepository { private Connection _connection = null; - private String _connectionString = "jdbc:mysql://sql.mineplex.com:3306/BungeeServers?autoReconnect=true&failOverReadOnly=false&maxReconnects=10"; + private String _connectionString = "jdbc:mysql://db.mineplex.com:3306/BungeeServers?autoReconnect=true&failOverReadOnly=false&maxReconnects=10"; private String _userName = "root"; private String _password = "tAbechAk3wR7tuTh"; diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerTracker/PlayerTrackerRepository.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerTracker/PlayerTrackerRepository.java index dc70776ef..7eb53b2bc 100644 --- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerTracker/PlayerTrackerRepository.java +++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerTracker/PlayerTrackerRepository.java @@ -8,7 +8,7 @@ import java.sql.SQLException; public class PlayerTrackerRepository { - private String _connectionString = "jdbc:mysql://sql.mineplex.com:3306/PlayerTracker"; + private String _connectionString = "jdbc:mysql://db.mineplex.com:3306/PlayerTracker"; private String _userName = "root"; private String _password = "tAbechAk3wR7tuTh"; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java index f27aa982a..1cd631b24 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java @@ -19,6 +19,7 @@ import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; import org.bukkit.craftbukkit.libs.com.google.gson.Gson; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -138,6 +139,19 @@ public class CoreClientManager implements Listener event.disallow(Result.KICK_OTHER, "Error retrieving information from web, please retry in a minute."); } + + if (Bukkit.hasWhitelist() && !Get(event.getName()).GetRank().Has(Rank.MODERATOR)) + { + for (OfflinePlayer player : Bukkit.getWhitelistedPlayers()) + { + if (player.getName().equalsIgnoreCase(event.getName())) + { + return; + } + } + + event.disallow(Result.KICK_WHITELIST, "You are not whitelisted my friend."); + } } private void LoadClient(CoreClient client, String ipAddress) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/account/event/RetrieveClientInformationEvent.java b/Plugins/Mineplex.Core/src/mineplex/core/account/event/RetrieveClientInformationEvent.java index 1f8fa7aad..ddc6d7fa5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/account/event/RetrieveClientInformationEvent.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/account/event/RetrieveClientInformationEvent.java @@ -11,7 +11,7 @@ public class RetrieveClientInformationEvent extends Event private static final HandlerList handlers = new HandlerList(); private static Connection _connection; - private String _connectionString = "jdbc:mysql://sql.mineplex.com:3306/Stats?autoReconnect=true&failOverReadOnly=false&maxReconnects=10"; + private String _connectionString = "jdbc:mysql://db.mineplex.com:3306/Stats?autoReconnect=true&failOverReadOnly=false&maxReconnects=10"; private String _userName = "root"; private String _password = "tAbechAk3wR7tuTh"; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHackRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHackRepository.java index e273968ba..f61fb43e1 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHackRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHackRepository.java @@ -14,7 +14,7 @@ public class AntiHackRepository private String _serverName; private Connection _connection; - private String _connectionString = "jdbc:mysql://sql.mineplex.com:3306/Mineplex"; + private String _connectionString = "jdbc:mysql://db.mineplex.com:3306/Mineplex"; private String _userName = "root"; private String _password = "tAbechAk3wR7tuTh"; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseHorse.java b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseHorse.java new file mode 100644 index 000000000..d5193697c --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseHorse.java @@ -0,0 +1,89 @@ +package mineplex.core.disguise.disguises; + +import org.bukkit.entity.Horse; + +public class DisguiseHorse extends DisguiseAnimal +{ + public DisguiseHorse(org.bukkit.entity.Entity entity) + { + super(entity); + + DataWatcher.a(16, Integer.valueOf(0)); + DataWatcher.a(19, Byte.valueOf((byte) 0)); + DataWatcher.a(20, Integer.valueOf(0)); + DataWatcher.a(21, String.valueOf("")); + DataWatcher.a(22, Integer.valueOf(0)); + } + + @Override + protected int GetEntityTypeId() + { + return 100; + } + + public void setType(Horse.Variant horseType) + { + DataWatcher.watch(19, Byte.valueOf((byte) horseType.ordinal())); + } + + public Horse.Variant getType() + { + return Horse.Variant.values()[DataWatcher.getByte(19)]; + } + + public void setVariant(Horse.Color color) + { + DataWatcher.watch(20, Integer.valueOf(color.ordinal())); + } + + public Horse.Color getVariant() + { + return Horse.Color.values()[DataWatcher.getInt(20)]; + } + + private boolean w(int i) + { + return (DataWatcher.getInt(16) & i) != 0; + } + + public void kick() + { + b(32, false); + b(64, true); + } + + public void stopKick() + { + b(64, false); + } + + private void b(int i, boolean flag) + { + int j = DataWatcher.getInt(16); + + if (flag) + DataWatcher.watch(16, Integer.valueOf(j | i)); + else + DataWatcher.watch(16, Integer.valueOf(j & (i ^ 0xFFFFFFFF))); + } + + public String getOwnerName() + { + return DataWatcher.getString(21); + } + + public void setOwnerName(String s) + { + DataWatcher.watch(21, s); + } + + public int cf() + { + return DataWatcher.getInt(22); + } + + public void r(int i) + { + DataWatcher.watch(22, Integer.valueOf(i)); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/stats/Table.java b/Plugins/Mineplex.Core/src/mineplex/core/stats/Table.java index 8eb85635b..708cbc9bd 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/stats/Table.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/stats/Table.java @@ -17,7 +17,7 @@ public class Table { private static Connection _connection; - private String _connectionString = "jdbc:mysql://sql.mineplex.com:3306/Mineplex?autoReconnect=true&failOverReadOnly=false&maxReconnects=10"; + private String _connectionString = "jdbc:mysql://db.mineplex.com:3306/Mineplex?autoReconnect=true&failOverReadOnly=false&maxReconnects=10"; private String _userName = "root"; private String _password = "tAbechAk3wR7tuTh"; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/status/ServerStatusManager.java b/Plugins/Mineplex.Core/src/mineplex/core/status/ServerStatusManager.java index f310af53f..ead341558 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/status/ServerStatusManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/status/ServerStatusManager.java @@ -68,7 +68,7 @@ public class ServerStatusManager extends MiniPlugin { try { - GetPlugin().getConfig().addDefault("serverstatus.connectionurl", "jdbc:mysql://sql.mineplex.com:3306/ServerStatus"); + GetPlugin().getConfig().addDefault("serverstatus.connectionurl", "jdbc:mysql://db.mineplex.com:3306/ServerStatus"); GetPlugin().getConfig().set("serverstatus.connectionurl", GetPlugin().getConfig().getString("serverstatus.connectionurl")); GetPlugin().getConfig().addDefault("serverstatus.username", "root"); diff --git a/Plugins/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/Enjin.java b/Plugins/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/Enjin.java index 4b2353613..d31d59c5f 100644 --- a/Plugins/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/Enjin.java +++ b/Plugins/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/Enjin.java @@ -67,7 +67,7 @@ public class Enjin extends MiniPlugin implements CommandExecutor String name = args[1]; int amount = Integer.parseInt(args[2]); - _donationManager.RewardGems(null, name, "purchase", amount); + _donationManager.RewardGems(null, "purchase", name, amount); System.out.println("enjin gem"); } else if (args.length == 4 && args[0].equalsIgnoreCase("rank")) diff --git a/Plugins/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/EnjinTranslator.java b/Plugins/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/EnjinTranslator.java index cf6b73052..a37ab125b 100644 --- a/Plugins/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/EnjinTranslator.java +++ b/Plugins/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/EnjinTranslator.java @@ -15,7 +15,7 @@ public class EnjinTranslator extends JavaPlugin @Override public void onEnable() { - getConfig().addDefault(WEB_CONFIG, "http://api.mineplex.com/"); + getConfig().addDefault(WEB_CONFIG, "http://accounts.mineplex.com/"); getConfig().set(WEB_CONFIG, getConfig().getString(WEB_CONFIG)); saveConfig(); diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java index 8323e96ee..7e71e8cb9 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java @@ -56,7 +56,7 @@ public class Hub extends JavaPlugin implements INautilusPlugin, IRelation @Override public void onEnable() { - getConfig().addDefault(WEB_CONFIG, "http://api.mineplex.com/"); + getConfig().addDefault(WEB_CONFIG, "http://accounts.mineplex.com/"); getConfig().set(WEB_CONFIG, getConfig().getString(WEB_CONFIG)); saveConfig(); diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java index 5b240bc21..a87a7eaab 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java @@ -21,10 +21,12 @@ import org.bukkit.event.entity.ItemSpawnEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.server.ServerListPingEvent; @@ -35,6 +37,7 @@ import org.bukkit.scoreboard.Objective; import org.bukkit.scoreboard.Scoreboard; import mineplex.core.MiniClientPlugin; +import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; import mineplex.core.blockrestore.BlockRestore; import mineplex.core.common.Rank; @@ -281,6 +284,29 @@ public class HubManager extends MiniClientPlugin } } } + + @EventHandler(priority = EventPriority.LOW) + public void login(final PlayerLoginEvent event) + { + CoreClient client = _clientManager.Get(event.getPlayer().getName()); + + // Reserved Slot Check + if (Bukkit.getOnlinePlayers().length >= Bukkit.getServer().getMaxPlayers()) + { + if (!client.GetRank().Has(Rank.ULTRA)) + { + Bukkit.getScheduler().scheduleSyncDelayedTask(GetPlugin(), new Runnable() + { + public void run() + { + _portal.SendPlayerToServer(event.getPlayer(), "Lobby"); + } + }); + + event.allow(); + } + } + } @EventHandler(priority = EventPriority.LOW) public void PlayerJoin(PlayerJoinEvent event) diff --git a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/DynamicServerData.java b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/DynamicServerData.java index def0da33e..4b9a86957 100644 --- a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/DynamicServerData.java +++ b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/DynamicServerData.java @@ -25,4 +25,9 @@ public class DynamicServerData AvailableCPU -= groupData.RequiredCPU * count; AvailableRAM -= groupData.RequiredRAM * count; } + + public void printInfo() + { + System.out.println("DynamicServerData - Name:" + Name + " Address:" + Address + " RAM:" + AvailableRAM + " CPU:" + AvailableCPU); + } } diff --git a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ProcessRunner.java b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ProcessRunner.java index f75c3a721..6e2056ca7 100644 --- a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ProcessRunner.java +++ b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ProcessRunner.java @@ -7,9 +7,10 @@ public class ProcessRunner extends Thread { private ProcessBuilder _processBuilder; private Process _process; - private Runnable _runnable; + private GenericRunnable _runnable; boolean _done = false; + Boolean _error = false; ProcessRunner(String[] args) { @@ -28,8 +29,10 @@ public class ProcessRunner extends Thread String line = reader.readLine(); while(line != null) - { - System.out.println(line); + { + if (line.equals("255")) + _error = true; + line=reader.readLine(); } } @@ -42,11 +45,11 @@ public class ProcessRunner extends Thread _done = true; if (_runnable != null) - _runnable.run(); + _runnable.run(_error); } } - public void start(Runnable runnable) + public void start(GenericRunnable runnable) { super.start(); diff --git a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/Repository.java b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/Repository.java index b678c43fb..eb7474ed2 100644 --- a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/Repository.java +++ b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/Repository.java @@ -12,16 +12,16 @@ import java.util.List; public class Repository { - private String _connectionString = "jdbc:mysql://localhost:3306/ServerStatus"; + private String _connectionString = "jdbc:mysql://db.mineplex.com:3306/ServerStatus"; private String _userName = "root"; - private String _password = "y2D4atu3Pene2asw"; + private String _password = "tAbechAk3wR7tuTh"; private static String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS ServerStatus (id INT NOT NULL AUTO_INCREMENT, serverName VARCHAR(256), serverGroup VARCHAR(256), address VARCHAR(256), updated LONG, lastTimeWithPlayers LONG, motd VARCHAR(256), players INT, maxPlayers INT, tps INT, ram INT, maxRam INT, PRIMARY KEY (id));"; - private static String RETRIEVE_OLD_SERVER_STATUSES = "SELECT ServerStatus.serverName, DynamicServers.address, ServerStatus.address, motd, players, maxPlayers FROM ServerStatus INNER JOIN DynamicServers ON ServerStatus.address LIKE CONCAT(DynamicServers.privateAddress, '%') WHERE DynamicServers.US = false AND TIME_TO_SEC(TIMEDIFF(now(), ServerStatus.updated)) > 10;"; + private static String RETRIEVE_OLD_SERVER_STATUSES = "SELECT ServerStatus.serverName, DynamicServers.address, ServerStatus.address, motd, players, maxPlayers FROM ServerStatus INNER JOIN DynamicServers ON ServerStatus.address LIKE CONCAT(DynamicServers.privateAddress, '%') WHERE DynamicServers.US = true AND TIME_TO_SEC(TIMEDIFF(now(), ServerStatus.updated)) > 15;"; 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 LIKE CONCAT(DynamicServers.privateAddress, '%') WHERE DynamicServers.US = false GROUP BY DynamicServers.address, ServerStatus.serverGroup;"; - private static String RETRIEVE_SERVERGROUP_STATUSES = "SELECT ServerStatus.serverName, serverGroup, motd, DynamicServers.address, ServerStatus.address, players, maxPlayers, case when TIME_TO_SEC(TIMEDIFF(now(), ServerStatus.lastTimeWithPlayers)) > 300 then 1 else 0 end as empty FROM ServerStatus INNER JOIN DynamicServers ON ServerStatus.address LIKE CONCAT(DynamicServers.privateAddress, '%') WHERE DynamicServers.US = false AND TIME_TO_SEC(TIMEDIFF(now(), ServerStatus.updated)) <= 10"; + 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 LIKE CONCAT(DynamicServers.privateAddress, '%') WHERE DynamicServers.US = true GROUP BY DynamicServers.address, ServerStatus.serverGroup;"; + private static String RETRIEVE_SERVERGROUP_STATUSES = "SELECT ServerStatus.serverName, serverGroup, motd, DynamicServers.address, ServerStatus.address, players, maxPlayers, case when TIME_TO_SEC(TIMEDIFF(now(), ServerStatus.lastTimeWithPlayers)) > 300 then 1 else 0 end as empty FROM ServerStatus INNER JOIN DynamicServers ON ServerStatus.address LIKE CONCAT(DynamicServers.privateAddress, '%') WHERE DynamicServers.US = true AND TIME_TO_SEC(TIMEDIFF(now(), ServerStatus.updated)) <= 15"; private static String RETRIEVE_SERVER_GROUP_DATA = "SELECT groupName, prefix, scriptName, requiredRam, cpuRequired, requiredTotal, requiredJoinable FROM ServerGroups;"; private static String DELETE_SERVER_STATUS = "DELETE FROM ServerStatus WHERE address = ? AND serverName = ?;"; diff --git a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerGroupData.java b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerGroupData.java index e2da2c156..fa4fbaf8a 100644 --- a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerGroupData.java +++ b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerGroupData.java @@ -9,4 +9,9 @@ public class ServerGroupData public int RequiredCPU; public int RequiredTotalServers; public int RequiredJoinableServers; + + public void printInfo() + { + System.out.println("ServerGroupData - Name:" + Name + " Prefix:" + Prefix + " ScriptName:" + ScriptName + " RAM:" + RequiredRAM + " CPU:" + RequiredCPU + " ReqTotal:" + RequiredTotalServers + " ReqJoin:" + RequiredJoinableServers); + } } diff --git a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java index 4825af2f0..dd49ee973 100644 --- a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java +++ b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java @@ -1,5 +1,7 @@ package mineplex.servermonitor; +import java.io.BufferedReader; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -13,58 +15,14 @@ public class ServerMonitor private static Repository _repository = new Repository(); private static int _count = 0; private static HashSet _processes = new HashSet(); + private static HashMap _badServers = new HashMap(); public static void main (String args[]) { _repository.initialize(); while (true) - { - while (_processes.size() > 0) - { - for (Iterator iterator = _processes.iterator(); iterator.hasNext();) - { - ProcessRunner pr = iterator.next(); - - try - { - pr.join(100); - } - catch (InterruptedException e) - { - e.printStackTrace(); - } - - if (pr.isDone()) - iterator.remove(); - } - - try - { - System.out.println("Sleeping while processes run..."); - Thread.sleep(6000); - } - catch (InterruptedException e) - { - e.printStackTrace(); - } - - if (_count >= 10) - { - System.out.println("Killing stale processes."); - - for (Iterator iterator = _processes.iterator(); iterator.hasNext();) - { - iterator.next().abort(); - iterator.remove(); - } - } - - _count++; - } - - _count = 0; - + { for (ServerStatusData statusData : _repository.retrieveOldServerStatuses()) { System.out.println("----Old Server Status----> " + statusData.Address + ", " + statusData.Name); @@ -73,6 +31,31 @@ public class ServerMonitor } List dynamicServers = new ArrayList(_repository.retrieveDynamicServers()); + + if (_count % 15 == 0) + { + _badServers.clear(); + + for (DynamicServerData serverData : dynamicServers) + { + if (isServerOffline(serverData)) + { + System.out.println("------=[OFFLINE]=------=[" + serverData.Name + ":" + serverData.Address + "]=------=[OFFLINE]=------"); + _badServers.put(serverData.Name, true); + } + } + + System.out.println(_badServers.size() + " bad servers."); + } + + for (Iterator iterator = dynamicServers.iterator(); iterator.hasNext();) + { + DynamicServerData serverData = iterator.next(); + + if (_badServers.containsKey(serverData.Name)) + iterator.remove(); + } + Collection serverGroups = _repository.retrieveServerGroups(); HashMap groupStatusList = _repository.retrieveGroupStatusData(); @@ -99,10 +82,29 @@ public class ServerMonitor System.out.println("No best dynamic server available for group " + serverGroup.Name); break; } - - System.out.println("[" + bestServer.Name + ":" + bestServer.Address + "] Adding " + serverGroup.Name + " Req Total: " + serverGroup.RequiredTotalServers + " Req Joinable: " + serverGroup.RequiredJoinableServers + " | Actual Total: " + groupStatus.getTotalServers() + " Actual Joinable: " + groupStatus.getJoinableCount()); - startServer(bestServer, serverGroup, serverNum); + System.out.println("[" + bestServer.Name + ":" + bestServer.Address + "] Adding " + serverGroup.Name + " Req Total: " + serverGroup.RequiredTotalServers + " Req Joinable: " + serverGroup.RequiredJoinableServers + " | Actual Total: " + groupStatus.getTotalServers() + " Actual Joinable: " + groupStatus.getJoinableCount()); + + /* + // Kill if any previous attempts stack up + ServerStatusData newServer = new ServerStatusData(); + newServer.Address = bestServer.Address; + newServer.Name = serverGroup.Prefix + "-" + serverNum; + killServer(newServer, false); + + // Delay between kill and start so we don't kill the new process + try + { + Thread.sleep(100); + } + catch (InterruptedException e) + { + e.printStackTrace(); + } + */ + + startServer(bestServer, serverGroup, serverNum); + serversToAdd--; } @@ -114,6 +116,56 @@ public class ServerMonitor } } + int processWaits = 0; + + while (_processes.size() > 0) + { + for (Iterator iterator = _processes.iterator(); iterator.hasNext();) + { + ProcessRunner pr = iterator.next(); + + try + { + pr.join(100); + } + catch (InterruptedException e) + { + e.printStackTrace(); + } + + if (pr.isDone()) + iterator.remove(); + } + + if (_processes.size() > 0) + { + try + { + System.out.println("Sleeping while processes run..."); + Thread.sleep(6000); + } + catch (InterruptedException e) + { + e.printStackTrace(); + } + } + + if (processWaits >= 10) + { + System.out.println("Killing stale processes."); + + for (Iterator iterator = _processes.iterator(); iterator.hasNext();) + { + iterator.next().abort(); + iterator.remove(); + } + } + + processWaits++; + } + + processWaits = 0; + try { System.out.println("Natural sleep."); @@ -123,9 +175,83 @@ public class ServerMonitor { e.printStackTrace(); } + + _count++; } } + private static void killServer(final ServerStatusData serverToKill, final boolean announce) + { + String cmd = "/home/mineplex/easyRemoteKillServer.sh"; + + ProcessRunner pr = new ProcessRunner(new String[] {"/bin/sh", cmd, serverToKill.Address, serverToKill.Name}); + pr.start(new GenericRunnable() + { + public void run(Boolean error) + { + if (!error) + _repository.removeServerRecord(serverToKill); + + if (announce) + { + if (error) + System.out.println("[" + serverToKill.Name + ":" + serverToKill.Address + "] Kill errored."); + else + System.out.println("Sent kill command to " + serverToKill.Address + " for " + serverToKill.Name + " completed"); + } + } + }); + + try + { + pr.join(500); + } + catch (InterruptedException e1) + { + e1.printStackTrace(); + } + + + if (!pr.isDone()) + _processes.add(pr); + } + + private static boolean isServerOffline(DynamicServerData serverData) + { + boolean success = false; + + Process process = null; + String cmd = "/home/mineplex/isServerOnline.sh"; + + ProcessBuilder processBuilder = new ProcessBuilder(new String[] {"/bin/sh", cmd, serverData.Address}); + + try + { + process = processBuilder.start(); + process.waitFor(); + + BufferedReader reader=new BufferedReader(new InputStreamReader(process.getInputStream())); + String line = reader.readLine(); + + while(line != null) + { + success = line.equals("Success"); + + line=reader.readLine(); + } + } + catch (Exception e1) + { + e1.printStackTrace(); + } + finally + { + process.destroy(); + } + + return !success; + } + private static DynamicServerData getBestDynamicServer(Collection dynamicServers, ServerGroupData serverGroup) { DynamicServerData bestServer = null; @@ -157,11 +283,14 @@ public class ServerMonitor String cmd = "/home/mineplex/restartServer.sh"; ProcessRunner pr = new ProcessRunner(new String[] {"/bin/sh", cmd, serverToKill.Address, serverToKill.Name}); - pr.start(new Runnable() + pr.start(new GenericRunnable() { - public void run() + public void run(Boolean error) { - System.out.println("Restart command to " + serverToKill.Address + " for " + serverToKill.Name + " completed"); + if (error) + System.out.println("Restart command to " + serverToKill.Address + " for " + serverToKill.Name + " failed"); + else + System.out.println("Restart command to " + serverToKill.Address + " for " + serverToKill.Name + " completed"); } }); @@ -180,30 +309,7 @@ public class ServerMonitor private static void killServer(final ServerStatusData serverToKill) { - String cmd = "/home/mineplex/easyRemoteKillServer.sh"; - - ProcessRunner pr = new ProcessRunner(new String[] {"/bin/sh", cmd, serverToKill.Address, serverToKill.Name}); - pr.start(new Runnable() - { - public void run() - { - _repository.removeServerRecord(serverToKill); - System.out.println("Sent kill command to " + serverToKill.Address + " for " + serverToKill.Name + " completed"); - } - }); - - try - { - pr.join(500); - } - catch (InterruptedException e1) - { - e1.printStackTrace(); - } - - - if (!pr.isDone()) - _processes.add(pr); + killServer(serverToKill, true); } private static void startServer(final DynamicServerData serverSpace, final ServerGroupData serverGroup, final int serverNum) @@ -211,12 +317,14 @@ public class ServerMonitor String cmd = "/home/mineplex/easyRemoteStartServer.sh"; ProcessRunner pr = new ProcessRunner(new String[] {"/bin/sh", cmd, serverSpace.Address, serverSpace.PrivateAddress, serverGroup.ScriptName, serverGroup.Prefix + "-" + serverNum, "1", serverSpace.US ? "us" : "eu"}); - pr.start(new Runnable() + pr.start(new GenericRunnable() { - public void run() + public void run(Boolean error) { - serverSpace.setServerGroupCount(serverGroup, serverSpace.ServerGroupCount.containsKey(serverGroup.Name) ? (serverSpace.ServerGroupCount.get(serverGroup.Name) + 1) : 1); - System.out.println("Start command (" + serverSpace.Address + "," + serverGroup.ScriptName + "," + serverGroup.Prefix + "-" + serverNum + ", 1," + (serverSpace.US ? "us" : "eu") + ") completed"); + if (error) + System.out.println("[" + serverSpace.Name + ":" + serverSpace.Address + "] Errored " + serverGroup.Name + "(" + serverGroup.Prefix + "-" + serverNum + ")"); + else + System.out.println("[" + serverSpace.Name + ":" + serverSpace.Address + "] Added " + serverGroup.Name + "(" + serverGroup.Prefix + "-" + serverNum + ")"); } }); @@ -229,6 +337,7 @@ public class ServerMonitor e1.printStackTrace(); } + serverSpace.setServerGroupCount(serverGroup, serverSpace.ServerGroupCount.containsKey(serverGroup.Name) ? (serverSpace.ServerGroupCount.get(serverGroup.Name) + 1) : 1); if (!pr.isDone()) _processes.add(pr); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java index 5f4a32e16..1360bc04f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java @@ -90,7 +90,7 @@ public class Arcade extends JavaPlugin implements INautilusPlugin, IPlugin DeleteFolders(); //Configs - getConfig().addDefault(WEB_CONFIG, "http://api.mineplex.com/"); + getConfig().addDefault(WEB_CONFIG, "http://accounts.mineplex.com/"); getConfig().set(WEB_CONFIG, getConfig().getString(WEB_CONFIG)); saveConfig(); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java index 78e6118e8..4e735d939 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java @@ -159,6 +159,8 @@ public abstract class Game implements Listener public boolean RepairWeapons = true; + public boolean Autobalance = true; + public boolean AnnounceStay = true; public boolean AnnounceJoinQuit = true; public boolean AnnounceSilence = true; @@ -802,7 +804,7 @@ public abstract class Game implements Listener public boolean CanJoinTeam(GameTeam team) { - return team.GetSize() < Math.max(1, UtilServer.getPlayers().length/GetTeamList().size()); + return Autobalance ? team.GetSize() < Math.max(1, UtilServer.getPlayers().length/GetTeamList().size()) : true; } public GameTeam GetTeamPreference(Player player) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/TeamGame.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/TeamGame.java index fa471b069..2d2488d60 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/TeamGame.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/TeamGame.java @@ -1,20 +1,136 @@ package nautilus.game.arcade.game; import java.util.ArrayList; +import java.util.Iterator; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import mineplex.core.common.util.C; +import mineplex.core.common.util.NautHashMap; +import mineplex.core.common.util.UtilTime; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.GameType; import nautilus.game.arcade.kit.Kit; public abstract class TeamGame extends Game { + private NautHashMap _rejoinTime = new NautHashMap(); + protected NautHashMap RejoinTeam = new NautHashMap(); + public TeamGame(ArcadeManager manager, GameType gameType, Kit[] kits, String[] gameDesc) { super(manager, gameType, kits, gameDesc); } + + @EventHandler(priority = EventPriority.LOWEST) + public void PlayerQuit(PlayerQuitEvent event) + { + if (!InProgress()) + return; + + Player player = event.getPlayer(); + GameTeam team = GetTeam(player); + if (team == null) return; + + if (!team.IsAlive(player)) + return; + + team.RemovePlayer(player); + + if (player.isDead()) + return; + + if (!QuitOut) + { + //Store + _rejoinTime.put(player.getName(), System.currentTimeMillis()); + RejoinTeam.put(player.getName(), team); + GetLocationStore().put(player.getName(), player.getLocation()); + + //Announcement + Announce(team.GetColor() + C.Bold + player.getName() + " has disconnected! 3 minutes to reconnect."); + } + } + + @EventHandler(priority = EventPriority.LOWEST) + public void PlayerLoginAllow(PlayerLoginEvent event) + { + if (!InProgress() || QuitOut) + return; + + //Rejoined + GameTeam team = RejoinTeam.remove(event.getPlayer().getName()); + if (team != null && _rejoinTime.remove(event.getPlayer().getName()) != null) + { + team.AddPlayer(event.getPlayer()); + Announce(team.GetColor() + C.Bold + event.getPlayer().getName() + " has reconnected!"); + return; + } + + /* + //Owner Bypass + if (Manager.GetClients().Get(event.getPlayer()).GetRank().Has(Rank.OWNER)) + return; + + //Disallow + event.setResult(PlayerLoginEvent.Result.KICK_OTHER); + event.disallow(PlayerLoginEvent.Result.KICK_OTHER, ChatColor.YELLOW + "You cannot join this UHC."); + */ + } + + @EventHandler + public void PlayerRejoinExpire(UpdateEvent event) + { + if (event.getType() != UpdateType.SEC || QuitOut) + return; + + Iterator rejoinIterator = _rejoinTime.keySet().iterator(); + + while (rejoinIterator.hasNext()) + { + String name = rejoinIterator.next(); + + if (!UtilTime.elapsed(_rejoinTime.get(name), 180000)) + continue; + + rejoinIterator.remove(); + + //Get Team (By Name) + GameTeam team = RejoinTeam.remove(name); + if (team != null) + Announce(team.GetColor() + C.Bold + name + " did not reconnect in time!"); + } + } + + @EventHandler + public void RejoinCommand(PlayerCommandPreprocessEvent event) + { + if (!QuitOut && event.getPlayer().isOp() && event.getMessage().startsWith("/allowrejoin")) + { + String[] toks = event.getMessage().split(" "); + + if (toks.length <= 1) + { + event.getPlayer().sendMessage("Missing Param!"); + } + else + { + _rejoinTime.put(toks[1], System.currentTimeMillis()); + event.getPlayer().sendMessage("Allowed " + toks[1] + " to rejoin!"); + } + + event.setCancelled(true); + } + } + public void EndCheck() { if (!IsLive()) @@ -26,6 +142,14 @@ public abstract class TeamGame extends Game if (team.GetPlayers(true).size() > 0) teamsAlive.add(team); + if (!QuitOut) + { + //Offline Player Team + for (GameTeam team : RejoinTeam.values()) + teamsAlive.add(team); + } + + if (teamsAlive.size() <= 1) { //Announce diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/bridge/Bridge.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/bridge/Bridge.java index 7437ae32a..4a1e15bc5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/bridge/Bridge.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/bridge/Bridge.java @@ -5,6 +5,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; @@ -24,6 +25,7 @@ import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockFormEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.entity.EntityChangeBlockEvent; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.ItemSpawnEvent; import org.bukkit.event.inventory.PrepareItemCraftEvent; @@ -50,6 +52,7 @@ import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.events.PlayerDeathOutEvent; import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.game.TeamGame; +import nautilus.game.arcade.game.Game.GameState; import nautilus.game.arcade.game.games.bridge.kits.*; import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.ore.OreHider; @@ -118,30 +121,30 @@ public class Bridge extends TeamGame implements OreObsfucation _ore = new OreHider(); // Flags - this.DamageSelf = true; + DamageSelf = true; - this.ItemDrop = true; - this.ItemPickup = true; + ItemDrop = true; + ItemPickup = true; - this.PrivateBlocks = true; - this.BlockBreak = true; - this.BlockPlace = true; + PrivateBlocks = true; + BlockBreak = true; + BlockPlace = true; - this.InventoryOpen = true; + InventoryOpen = true; - this.WorldTimeSet = 2000; + WorldTimeSet = 2000; - this.WorldWaterDamage = 4; + WorldWaterDamage = 4; - this.CompassEnabled = true; + CompassEnabled = true; - this.DeathDropItems = true; + DeathDropItems = true; - this.GemMultiplier = 2.5; + GemMultiplier = 2.5; } @EventHandler - public void PlayerOut(PlayerDeathOutEvent event) + public void PlayerOut(final PlayerDeathOutEvent event) { if (_bridgesDown) return; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeletalHorse.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeletalHorse.java index d30a8d846..b1f75d1df 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeletalHorse.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSkeletalHorse.java @@ -14,6 +14,7 @@ import org.bukkit.inventory.ItemStack; import mineplex.core.common.util.C; import mineplex.core.common.util.UtilEnt; import mineplex.core.disguise.disguises.DisguiseCow; +import mineplex.core.disguise.disguises.DisguiseHorse; import mineplex.core.itemstack.ItemStackFactory; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.game.Game.GameState; @@ -88,7 +89,8 @@ public class KitSkeletalHorse extends SmashKit player.getInventory().setBoots(ItemStackFactory.Instance.CreateStack(Material.CHAINMAIL_BOOTS)); //Disguise - DisguiseCow disguise = new DisguiseCow(player); + DisguiseHorse disguise = new DisguiseHorse(player); + disguise.setType(Variant.SKELETON_HORSE); disguise.SetName(C.cYellow + player.getName()); disguise.SetCustomNameVisible(true); Manager.GetDisguise().disguise(disguise); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/uhc/UHC.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/uhc/UHC.java index c2a1d19ac..d6dad19dc 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/uhc/UHC.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/uhc/UHC.java @@ -84,10 +84,6 @@ import nautilus.game.arcade.managers.GameLobbyManager; public class UHC extends TeamGame { private NautHashMap _deathTime = new NautHashMap(); - - private NautHashMap _rejoinTime = new NautHashMap(); - private NautHashMap _rejoinTeam = new NautHashMap(); - private NautHashMap _combatTime = new NautHashMap(); private int _borders = 1000; @@ -577,6 +573,7 @@ public class UHC extends TeamGame event.setLeaveMessage(null); } + /* @EventHandler(priority = EventPriority.LOWEST) public void PlayerQuit(PlayerQuitEvent event) { @@ -590,11 +587,10 @@ public class UHC extends TeamGame team.RemovePlayer(player); - if (player.isDead()) return; - /* XXX + XXX if (true) { //Announcement @@ -603,7 +599,6 @@ public class UHC extends TeamGame player.damage(5000); return; } - */ if (_combatTime.containsKey(player.getName()) && !UtilTime.elapsed(_combatTime.get(player.getName()), 15000)) { @@ -613,15 +608,8 @@ public class UHC extends TeamGame player.damage(5000); return; } - - //Store - _rejoinTime.put(player.getName(), System.currentTimeMillis()); - _rejoinTeam.put(player.getName(), team); - GetLocationStore().put(player.getName(), player.getLocation()); - - //Announcement - Announce(team.GetColor() + C.Bold + player.getName() + " has disconnected! 30 minutes to reconnect."); } + */ @EventHandler public void DamageRecord(EntityDamageEvent event) @@ -723,56 +711,6 @@ public class UHC extends TeamGame } } - @EventHandler - public void PlayerRejoinExpire(UpdateEvent event) - { - if (event.getType() != UpdateType.SEC) - return; - - Iterator rejoinIterator = _rejoinTime.keySet().iterator(); - - while (rejoinIterator.hasNext()) - { - String name = rejoinIterator.next(); - - if (!UtilTime.elapsed(_rejoinTime.get(name), 1800000)) - continue; - - rejoinIterator.remove(); - - //Get Team (By Name) - GameTeam team = _rejoinTeam.remove(name); - if (team != null) - Announce(team.GetColor() + C.Bold + name + " did not reconnect in time!"); - } - } - - @EventHandler(priority = EventPriority.LOWEST) - public void PlayerLoginAllow(PlayerLoginEvent event) - { - if (!InProgress()) - return; - - //Rejoined - GameTeam team = _rejoinTeam.remove(event.getPlayer().getName()); - if (team != null && _rejoinTime.remove(event.getPlayer().getName()) != null) - { - team.AddPlayer(event.getPlayer()); - Announce(team.GetColor() + C.Bold + event.getPlayer().getName() + " has reconnected!"); - return; - } - - /* - //Owner Bypass - if (Manager.GetClients().Get(event.getPlayer()).GetRank().Has(Rank.OWNER)) - return; - - //Disallow - event.setResult(PlayerLoginEvent.Result.KICK_OTHER); - event.disallow(PlayerLoginEvent.Result.KICK_OTHER, ChatColor.YELLOW + "You cannot join this UHC."); - */ - } - private void CraftRecipes() { ShapelessRecipe goldMelon = new ShapelessRecipe(new ItemStack(Material.SPECKLED_MELON, 1)); @@ -990,27 +928,6 @@ public class UHC extends TeamGame } } - @EventHandler - public void RejoinCommand(PlayerCommandPreprocessEvent event) - { - if (event.getMessage().startsWith("/allowrejoin")) - { - String[] toks = event.getMessage().split(" "); - - if (toks.length <= 1) - { - event.getPlayer().sendMessage("Missing Param!"); - } - else - { - _rejoinTime.put(toks[1], System.currentTimeMillis()); - event.getPlayer().sendMessage("Allowed " + toks[1] + " to rejoin!"); - } - - event.setCancelled(true); - } - } - @EventHandler(priority = EventPriority.LOWEST) public void clearCreeperExplode(EntityExplodeEvent event) { @@ -1217,7 +1134,7 @@ public class UHC extends TeamGame teamsAlive.add(team); //Offline Player Team - for (GameTeam team : _rejoinTeam.values()) + for (GameTeam team : RejoinTeam.values()) teamsAlive.add(team); if (!_dragonMode && teamsAlive.size() == 1) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkHorseKick.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkHorseKick.java index a40480f39..7dcb3f09e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkHorseKick.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkHorseKick.java @@ -22,6 +22,7 @@ import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilTime; import mineplex.core.disguise.disguises.DisguiseBase; +import mineplex.core.disguise.disguises.DisguiseHorse; import mineplex.core.disguise.disguises.DisguisePig; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; @@ -67,11 +68,12 @@ public class PerkHorseKick extends Perk return; //Horse Animation - //DisguiseBase horse = Manager.GetDisguise().getDisguise(player); - //if (horse != null && horse instanceof DisguiseHorse) - //{ - //((CraftHorse)player).getHandle().p(true); //XXX MAKE LEGS KICK AIR HERE - //} + DisguiseBase horse = Manager.GetDisguise().getDisguise(player); + if (horse != null && horse instanceof DisguiseHorse) + { + ((DisguiseHorse)horse).kick(); + Manager.GetDisguise().updateDisguise(horse); + } //Animation _active.put(player, System.currentTimeMillis()); @@ -158,11 +160,12 @@ public class PerkHorseKick extends Perk playerIterator.remove(); //Horse Animation - //DisguiseBase horse = Manager.GetDisguise().getDisguise(player); - //if (horse != null && horse instanceof DisguiseHorse) - //{ - //((CraftHorse)player).getHandle().p(true); //XXX STOP KICKING AIR HERE - //} + DisguiseBase horse = Manager.GetDisguise().getDisguise(player); + if (horse != null && horse instanceof DisguiseHorse) + { + ((DisguiseHorse)horse).stopKick(); + Manager.GetDisguise().updateDisguise(horse); + } Manager.GetCondition().EndCondition(player, null, GetName()); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/world/WorldData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/world/WorldData.java index b49422b31..717960bea 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/world/WorldData.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/world/WorldData.java @@ -375,10 +375,12 @@ public class WorldData int x = event.GetX(); int z = event.GetZ(); + if (x >= MinX >> 4 && x <= MaxX >> 4 && z >= MinZ >> 4 && z <= MaxZ >> 4) { return; } + event.setCancelled(true); } diff --git a/Plugins/Nautilus.Game.Core/src/nautilus/game/core/GamePlugin.java b/Plugins/Nautilus.Game.Core/src/nautilus/game/core/GamePlugin.java index 8c2c06e93..ca976bce0 100644 --- a/Plugins/Nautilus.Game.Core/src/nautilus/game/core/GamePlugin.java +++ b/Plugins/Nautilus.Game.Core/src/nautilus/game/core/GamePlugin.java @@ -49,6 +49,7 @@ import mineplex.minecraft.game.core.mechanics.PistonJump; import mineplex.minecraft.game.core.mechanics.Weapon; import nautilus.game.core.util.NullChunkGenerator; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.generator.ChunkGenerator; import org.bukkit.plugin.java.JavaPlugin; @@ -83,68 +84,83 @@ public abstract class GamePlugin extends JavaPlugin implements IRelation @Override public void onEnable() { - getConfig().addDefault(WEB_CONFIG, "http://api.mineplex.com/"); - getConfig().set(WEB_CONFIG, getConfig().getString(WEB_CONFIG)); - saveConfig(); - - _spawnLocation = new Location(getServer().getWorlds().get(0), -7.5, 18.5, 24.5, 90, 0); - - ClientManager = CoreClientManager.Initialize(this, GetWebServerAddress()); - CommandCenter.Initialize(this, ClientManager); - - FakeEntityManager.Initialize(this); - ItemStackFactory.Initialize(this, true); - Recharge.Initialize(this); - - _moduleManager = new ModuleManager(); - - Updater updater = new Updater(this); - _creature = new Creature(this); - Energy = new Energy(this); - DonationManager = new DonationManager(this, GetWebServerAddress()); - ConditionManager = new SkillConditionManager(this); - CombatManager = new CombatManager(this); - _blockRestore = new BlockRestore(this); - _throw = new ProjectileManager(this); - _spawn = new Spawn(this); - _teleport = new Teleport(this, ClientManager, _spawn); - NpcManager = new NpcManager(this, _creature); - PacketHandler = new PacketHandler(this); - _damage = new DamageManager(this, CombatManager, NpcManager, new DisguiseManager(this, PacketHandler)); - _fire = new Fire(this, ConditionManager, _damage); - new Punish(this, GetWebServerAddress(), ClientManager); - new ServerStatusManager(this, new LagMeter(this, ClientManager)); - - - SkillManager = new SkillFactory(this, _damage, this, CombatManager, ConditionManager, _throw, _blockRestore, _fire, new Movement(this), _teleport, Energy, GetWebServerAddress()); - ClassManager = new ClassManager(this, ClientManager, DonationManager, SkillManager, GetWebServerAddress()); - new ItemFactory(this, _blockRestore, ClassManager, ConditionManager, _damage, Energy, _fire, _throw, GetWebServerAddress(), new HashSet()); - - new MessageManager(this, ClientManager); - - new Blood(this); - new JoinQuit(); - new Server(); - new AntiStack(this); - new MemoryFix(this); - new PistonJump(this); - new Weapon(this, Energy); - new FileUpdater(this, new Portal(this)); - - getServer().getScheduler().scheduleSyncRepeatingTask(this, updater, 1, 1); - - // _serverListener = new ServerListener(GetWebServerAddress(), getServer().getIp(), getServer().getPort() + 1); - // _serverListener.start(); - - //HubConnection = new ServerTalker(getConfig().getString(HUB_SERVER)); - // HubConnection.start(); - - //HubConnection.QueuePacket(new ServerReadyPacket(getServer().getIp() + ":" + getServer().getPort())); - - ClassShopManager shopManager = new ClassShopManager(this, ClassManager, SkillManager, null); - new ClassCombatShop(shopManager, ClientManager, DonationManager, "Select Class Here"); - new ClassCombatPurchaseShop(shopManager, ClientManager, DonationManager, "Skill Shop"); - new ClassCombatCustomBuildShop(shopManager, ClientManager, DonationManager, "Class Setup"); + try + { + getConfig().addDefault(WEB_CONFIG, "http://accounts.mineplex.com/"); + getConfig().set(WEB_CONFIG, getConfig().getString(WEB_CONFIG)); + saveConfig(); + + _spawnLocation = new Location(getServer().getWorlds().get(0), -7.5, 18.5, 24.5, 90, 0); + + ClientManager = CoreClientManager.Initialize(this, GetWebServerAddress()); + CommandCenter.Initialize(this, ClientManager); + + FakeEntityManager.Initialize(this); + ItemStackFactory.Initialize(this, true); + Recharge.Initialize(this); + + _moduleManager = new ModuleManager(); + + Updater updater = new Updater(this); + _creature = new Creature(this); + Energy = new Energy(this); + DonationManager = new DonationManager(this, GetWebServerAddress()); + ConditionManager = new SkillConditionManager(this); + CombatManager = new CombatManager(this); + _blockRestore = new BlockRestore(this); + _throw = new ProjectileManager(this); + _spawn = new Spawn(this); + _teleport = new Teleport(this, ClientManager, _spawn); + NpcManager = new NpcManager(this, _creature); + PacketHandler = new PacketHandler(this); + _damage = new DamageManager(this, CombatManager, NpcManager, new DisguiseManager(this, PacketHandler)); + _fire = new Fire(this, ConditionManager, _damage); + new Punish(this, GetWebServerAddress(), ClientManager); + new ServerStatusManager(this, new LagMeter(this, ClientManager)); + + + SkillManager = new SkillFactory(this, _damage, this, CombatManager, ConditionManager, _throw, _blockRestore, _fire, new Movement(this), _teleport, Energy, GetWebServerAddress()); + ClassManager = new ClassManager(this, ClientManager, DonationManager, SkillManager, GetWebServerAddress()); + new ItemFactory(this, _blockRestore, ClassManager, ConditionManager, _damage, Energy, _fire, _throw, GetWebServerAddress(), new HashSet()); + + new MessageManager(this, ClientManager); + + new Blood(this); + new JoinQuit(); + new Server(); + new AntiStack(this); + new MemoryFix(this); + new PistonJump(this); + new Weapon(this, Energy); + new FileUpdater(this, new Portal(this)); + + getServer().getScheduler().scheduleSyncRepeatingTask(this, updater, 1, 1); + + // _serverListener = new ServerListener(GetWebServerAddress(), getServer().getIp(), getServer().getPort() + 1); + // _serverListener.start(); + + //HubConnection = new ServerTalker(getConfig().getString(HUB_SERVER)); + // HubConnection.start(); + + //HubConnection.QueuePacket(new ServerReadyPacket(getServer().getIp() + ":" + getServer().getPort())); + + ClassShopManager shopManager = new ClassShopManager(this, ClassManager, SkillManager, null); + new ClassCombatShop(shopManager, ClientManager, DonationManager, "Select Class Here"); + new ClassCombatPurchaseShop(shopManager, ClientManager, DonationManager, "Skill Shop"); + new ClassCombatCustomBuildShop(shopManager, ClientManager, DonationManager, "Class Setup"); + } + catch (Exception exception) + { + System.out.println("Exception during startup. Restarting in 15 seconds."); + + getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() + { + public void run() + { + Bukkit.shutdown(); + } + }, 300L); + } } protected abstract String GetServerName(); diff --git a/Plugins/Nautilus.Game.Core/src/nautilus/game/core/arena/ArenaManager.java b/Plugins/Nautilus.Game.Core/src/nautilus/game/core/arena/ArenaManager.java index e0b8ed99b..a94025235 100644 --- a/Plugins/Nautilus.Game.Core/src/nautilus/game/core/arena/ArenaManager.java +++ b/Plugins/Nautilus.Game.Core/src/nautilus/game/core/arena/ArenaManager.java @@ -99,7 +99,6 @@ public class ArenaManager implements Listener, Runnabl String name = directory + _arenaCount; new File(name).mkdir(); - new File(name + File.separator + "region").mkdir(); // TODO Queue/Optimize unzip - currently 50ms on production server. ZipUtil.UnzipToDirectory(key, name); diff --git a/Plugins/Nautilus.Game.Core/src/nautilus/game/core/engine/GameEngine.java b/Plugins/Nautilus.Game.Core/src/nautilus/game/core/engine/GameEngine.java index 25a5a5bdb..df678cab7 100644 --- a/Plugins/Nautilus.Game.Core/src/nautilus/game/core/engine/GameEngine.java +++ b/Plugins/Nautilus.Game.Core/src/nautilus/game/core/engine/GameEngine.java @@ -1088,7 +1088,7 @@ public abstract class GameEngine, GameType game = GetGameForPlayer(player); PlayerType gamePlayer = game.GetPlayer(player); - if (ActiveGames.contains(game) || GamesInSetup.contains(game)) + if (game.IsActive() || GamesInSetup.contains(game)) { GamePlayerQuitEvent customEvent = new GamePlayerQuitEvent(game, gamePlayer); Plugin.getServer().getPluginManager().callEvent(customEvent); @@ -1109,7 +1109,7 @@ public abstract class GameEngine, } } - if (!online) + if (!online || Bukkit.getOnlinePlayers().length <= 1) Plugin.getServer().shutdown(); } else diff --git a/Plugins/Nautilus.Game.Core/src/nautilus/game/core/engine/TeamGameEngine.java b/Plugins/Nautilus.Game.Core/src/nautilus/game/core/engine/TeamGameEngine.java index c688af850..a5d174479 100644 --- a/Plugins/Nautilus.Game.Core/src/nautilus/game/core/engine/TeamGameEngine.java +++ b/Plugins/Nautilus.Game.Core/src/nautilus/game/core/engine/TeamGameEngine.java @@ -526,12 +526,18 @@ public abstract class TeamGameEngine event) + public void onGameFinished(final TeamGameFinishedEvent event) { - for (PlayerType player : event.GetGame().GetPlayers()) + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Plugin, new GenericRunnable(event.GetGame()) { - Portal.SendPlayerToServer(player.GetPlayer(), "Lobby"); - } + public void run() + { + for (PlayerType player : event.GetGame().GetPlayers()) + { + Portal.SendPlayerToServer(player.GetPlayer(), "Lobby"); + } + } + }, 100L); Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Plugin, new GenericRunnable(event.GetGame()) { diff --git a/Plugins/Nautilus.Game.Dominate/src/nautilus/game/dominate/engine/DominateGameEngine.java b/Plugins/Nautilus.Game.Dominate/src/nautilus/game/dominate/engine/DominateGameEngine.java index 13f92ceda..fcc8f9e13 100644 --- a/Plugins/Nautilus.Game.Dominate/src/nautilus/game/dominate/engine/DominateGameEngine.java +++ b/Plugins/Nautilus.Game.Dominate/src/nautilus/game/dominate/engine/DominateGameEngine.java @@ -33,6 +33,7 @@ public class DominateGameEngine extends TeamGameEngine CaptureThePigStats { get; set; } public List AccountTransactions { get; set; } - public List GemTransactions { get; set; } } } diff --git a/Website/LOC.Website.Common/Contexts/LOCContext.cs b/Website/LOC.Website.Common/Contexts/LOCContext.cs index ff2fb2b9c..2c0e9ffda 100644 --- a/Website/LOC.Website.Common/Contexts/LOCContext.cs +++ b/Website/LOC.Website.Common/Contexts/LOCContext.cs @@ -42,6 +42,8 @@ namespace LOC.Website.Common.Contexts public DbSet DominatePlayerStats { get; set; } public DbSet CaptureThePigPlayerStats { get; set; } + public DbSet GemTransactions { get; set; } + public DbSet MineKarts { get; set; } public DbSet Clans { get; set; } diff --git a/Website/LOC.Website.Common/Models/AccountAdministrator.cs b/Website/LOC.Website.Common/Models/AccountAdministrator.cs index 341d801b7..e2148a038 100644 --- a/Website/LOC.Website.Common/Models/AccountAdministrator.cs +++ b/Website/LOC.Website.Common/Models/AccountAdministrator.cs @@ -49,7 +49,7 @@ { using (var repository = _repositoryFactory.CreateRepository()) { - return repository.GetAll().Where(c => c.Name.ToUpper().Contains(name.ToUpper())).Include(x => x.Rank).ToList(); + return repository.GetAll().Where(c => c.Name == name).Include(x => x.Rank).ToList(); } } @@ -57,7 +57,7 @@ { using (var repository = _repositoryFactory.CreateRepository()) { - return repository.GetAll().Where(c => c.Name.ToUpper().Contains(name.ToUpper())).Select(y => y.Name).ToList(); + return repository.GetAll().Where(c => c.Name == name).Select(y => y.Name).ToList(); } } @@ -160,17 +160,17 @@ account.Gems += token.Amount; - var gemTransaction = new GemTransaction - { - Source = token.Source, - Account = account, - Amount = token.Amount - }; + if (!token.Source.Contains("Earned") && !token.Source.Contains("Tutorial") && !token.Source.Contains("Parkour")) + { + var gemTransaction = new GemTransaction + { + Source = token.Source, + Account = account, + Amount = token.Amount + }; - if (account.GemTransactions == null) - account.GemTransactions = new List(); - - account.GemTransactions.Add(gemTransaction); + repository.Add(gemTransaction); + } repository.Edit(account); repository.CommitChanges(); diff --git a/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml b/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml index 60208414b..fff84bdca 100644 --- a/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml +++ b/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml @@ -1,7 +1,6 @@  - @@ -17,31 +16,29 @@ - + - - + + - - - + - + @@ -51,19 +48,17 @@ - - - + - - + + @@ -74,24 +69,24 @@ - - + - - - + + + + + - @@ -99,7 +94,6 @@ - @@ -107,13 +101,15 @@ - + - + + + @@ -124,14 +120,12 @@ - - + - @@ -139,8 +133,9 @@ + - + @@ -152,19 +147,23 @@ - - + - + + + + + + @@ -173,26 +172,28 @@ + - + - + - + + + - @@ -200,9 +201,9 @@ - + - + @@ -210,7 +211,7 @@ - + @@ -219,6 +220,7 @@ + @@ -226,45 +228,42 @@ - + - - - + - + - - - + + - + - - + + - - + + - + + - - + @@ -272,97 +271,101 @@ - + - + - - + + + - + - + + + - + - + + - + - - + + - - + - + - + - - - - - + + + + - + - - - + + + - + - - - + + + + + - - + + - + - - + + - - - + + + - + - + @@ -372,145 +375,681 @@ - + + - - + + + + - - + + - - - + - - + + - - + + - - - - - + + - - + + + + - - - - + + + + - + - + + + + + - + + - + - + - + - + - - - + + + + - - - - + + + + + + - - + + - + + - + - + - + + - - - + + + - + - - + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Website/LOCWebsite.suo b/Website/LOCWebsite.suo index 3b2fdd7c3..878a80065 100644 Binary files a/Website/LOCWebsite.suo and b/Website/LOCWebsite.suo differ