From fc18d0fbb152b5168f2b77c4952ad5c8ae9842c0 Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Thu, 10 Oct 2013 09:01:48 -0700 Subject: [PATCH] Added null check logging to arcade custom kit name. Removed wolf kit in SSM for release Cleaned up PlayerAccountController Fixed connection leak for mysql connections. Added server shutdown if server is empty for dominate. --- .../bungee/lobbyBalancer/LobbyBalancer.java | 11 - .../LobbyBalancerRepository.java | 15 +- .../playerCount/PlayerCountRepository.java | 30 ++- .../PlayerTrackerRepository.java | 15 +- .../core/status/ServerStatusRepository.java | 30 ++- .../arcade/game/games/smash/SuperSmash.java | 2 +- .../arcade/managers/GameLobbyManager.java | 26 +- .../nautilus/game/core/engine/GameEngine.java | 17 +- .../Controllers/PlayerAccountController.cs | 22 -- .../LOC.Website.Web.Publish.xml | 238 +++++++++--------- Website/LOCWebsite.suo | Bin 474624 -> 474624 bytes 11 files changed, 243 insertions(+), 163 deletions(-) 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 67d973d59..f4d6dd31c 100644 --- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbyBalancer.java +++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbyBalancer.java @@ -68,8 +68,6 @@ public class LobbyBalancer implements Listener, Runnable event.setTarget(_plugin.getProxy().getServerInfo(_sortedLobbies.get(_bestServerIndex).Name)); _playersSentToBestServer++; - - System.out.println("Spent " + (System.currentTimeMillis() - timeStart) + "ms selecting : " + _sortedLobbies.get(_bestServerIndex).Name + " for " + event.getPlayer().getName() + " Info [" + _bestServerIndex + ", " + _playersSentToBestServer + ", " + _maxPlayersToSendToBestServer + "]"); } } @@ -110,14 +108,5 @@ public class LobbyBalancer implements Listener, Runnable _bestServerIndex = 0; _maxPlayersToSendToBestServer = (_sortedLobbies.get(_bestServerIndex).MaxPlayers - _sortedLobbies.get(_bestServerIndex).Players) / 10; } - - System.out.println("Lobby balancer:"); - - - for (int i=0; i < _sortedLobbies.size(); i++) - { - ServerStatusData serverStatusData = _sortedLobbies.get(i); - System.out.println("#" + i + " " + serverStatusData.Name + " (" + serverStatusData.Players + "/" + serverStatusData.MaxPlayers + ")"); - } } } 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 ad18b7845..e54e555e4 100644 --- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbyBalancerRepository.java +++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbyBalancerRepository.java @@ -52,6 +52,7 @@ public class LobbyBalancerRepository public List retrieveServerStatuses() { Connection connection = null; + ResultSet resultSet = null; List serverData = new ArrayList(); try @@ -59,7 +60,7 @@ public class LobbyBalancerRepository connection = DriverManager.getConnection(_connectionString, _userName, _password); PreparedStatement preparedStatement = connection.prepareStatement(RETRIEVE_SERVER_STATUSES); - ResultSet resultSet = preparedStatement.executeQuery(); + resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { @@ -83,6 +84,18 @@ public class LobbyBalancerRepository } finally { + if (resultSet != null) + { + try + { + resultSet.close(); + } + catch (SQLException e) + { + e.printStackTrace(); + } + } + if (connection != null) { try 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 d10cb2ab2..7fc885bc4 100644 --- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerCountRepository.java +++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerCountRepository.java @@ -32,6 +32,7 @@ public class PlayerCountRepository public void initialize() { Connection connection = null; + ResultSet resultSet = null; try { @@ -45,7 +46,7 @@ public class PlayerCountRepository // Retrieve id PreparedStatement preparedStatementRetrieve = connection.prepareStatement(RETRIEVE_ID); preparedStatementRetrieve.setString(1, _address); - ResultSet resultSet = preparedStatementRetrieve.executeQuery(); + resultSet = preparedStatementRetrieve.executeQuery(); while (resultSet.next()) { @@ -85,6 +86,18 @@ public class PlayerCountRepository } finally { + if (resultSet != null) + { + try + { + resultSet.close(); + } + catch (SQLException e) + { + e.printStackTrace(); + } + } + if (connection != null) { try @@ -149,13 +162,14 @@ public class PlayerCountRepository { Connection connection = null; PlayerTotalData playerData = new PlayerTotalData(); + ResultSet resultSet = null; try { connection = DriverManager.getConnection(_connectionString, _userName, _password); PreparedStatement preparedStatement = connection.prepareStatement(RETRIEVE_PLAYER_COUNT); - ResultSet resultSet = preparedStatement.executeQuery(); + resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { @@ -170,6 +184,18 @@ public class PlayerCountRepository } finally { + if (resultSet != null) + { + try + { + resultSet.close(); + } + catch (SQLException e) + { + e.printStackTrace(); + } + } + if (connection != null) { try 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 8e39c4f6d..56600bd88 100644 --- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerTracker/PlayerTrackerRepository.java +++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerTracker/PlayerTrackerRepository.java @@ -106,6 +106,7 @@ public class PlayerTrackerRepository public String retrievePlayerServer(String name) { Connection connection = null; + ResultSet resultSet = null; try { @@ -113,7 +114,7 @@ public class PlayerTrackerRepository PreparedStatement preparedStatement = connection.prepareStatement(RETRIEVE_PLAYER_SERVER); preparedStatement.setString(1, name); - ResultSet resultSet = preparedStatement.executeQuery(); + resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { @@ -126,6 +127,18 @@ public class PlayerTrackerRepository } finally { + if (resultSet != null) + { + try + { + resultSet.close(); + } + catch (SQLException e) + { + e.printStackTrace(); + } + } + if (connection != null) { try diff --git a/Plugins/Mineplex.Core/src/mineplex/core/status/ServerStatusRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/status/ServerStatusRepository.java index 768ad0f64..a38c3cca7 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/status/ServerStatusRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/status/ServerStatusRepository.java @@ -41,6 +41,7 @@ public class ServerStatusRepository public void initialize() { Connection connection = null; + ResultSet resultSet = null; try { @@ -54,7 +55,7 @@ public class ServerStatusRepository // Retrieve id PreparedStatement preparedStatementRetrieve = connection.prepareStatement(RETRIEVE_ID); preparedStatementRetrieve.setString(1, _address); - ResultSet resultSet = preparedStatementRetrieve.executeQuery(); + resultSet = preparedStatementRetrieve.executeQuery(); while (resultSet.next()) { @@ -98,6 +99,18 @@ public class ServerStatusRepository } finally { + if (resultSet != null) + { + try + { + resultSet.close(); + } + catch (SQLException e) + { + e.printStackTrace(); + } + } + if (connection != null) { try @@ -165,6 +178,7 @@ public class ServerStatusRepository public List retrieveServerStatuses() { Connection connection = null; + ResultSet resultSet = null; List serverData = new ArrayList(); try @@ -172,7 +186,7 @@ public class ServerStatusRepository connection = DriverManager.getConnection(_connectionString, _userName, _password); PreparedStatement preparedStatement = connection.prepareStatement(RETRIEVE_SERVER_STATUSES); - ResultSet resultSet = preparedStatement.executeQuery(); + resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { @@ -192,6 +206,18 @@ public class ServerStatusRepository } finally { + if (resultSet != null) + { + try + { + resultSet.close(); + } + catch (SQLException e) + { + e.printStackTrace(); + } + } + if (connection != null) { try diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java index d0ff80fb6..844be1416 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/SuperSmash.java @@ -62,7 +62,7 @@ public class SuperSmash extends SoloGame new KitSkySquid(manager), new KitWitherSkeleton(manager), //new KitWither(manager), - new KitWolf(manager), + //new KitWolf(manager), }, diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameLobbyManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameLobbyManager.java index 672ce0816..c1830bc43 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameLobbyManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameLobbyManager.java @@ -960,14 +960,34 @@ public class GameLobbyManager implements IPacketRunnable, Listener private String GetKitCustomName(Player player, Game game, LobbyEnt ent) { - if (!player.isOnline()) - return ent.GetKit().GetName(); - CoreClient client = Manager.GetClients().Get(player); Donor donor = Manager.GetDonation().Get(player.getName()); String entityName = ent.GetKit().GetName(); + if (!player.isOnline() || client == null || donor == null) + return entityName; + + if (client.GetRank() == null) + { + System.out.println("client rank is null"); + } + + if (game == null) + { + System.out.println("game is null"); + } + + if (Manager == null) + { + System.out.println("Manager is null"); + } + + if (Manager.GetServerConfig() == null) + { + System.out.println("Manager.GetServerConfig() is null"); + } + if (client.GetRank().Has(Rank.ULTRA) || donor.OwnsUnknownPackage(game.GetName() + " " + ent.GetKit().GetName()) || donor.OwnsUnknownPackage(Manager.GetServerConfig().ServerType + " ULTRA") || ent.GetKit().GetAvailability() == KitAvailability.Free) { entityName = ChatColor.GREEN + entityName; 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 479bac91d..25a5a5bdb 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 @@ -1095,7 +1095,22 @@ public abstract class GameEngine, gamePlayer.StopTimePlay(); - //PendingPlayerRemoveMap.put(gamePlayer.getName(), System.currentTimeMillis() + LogoutPeriod * 1000); + boolean online = false; + + for (PlayerType otherPlayer : game.GetPlayers()) + { + if (gamePlayer == otherPlayer) + continue; + + if (otherPlayer.isOnline()) + { + online = true; + break; + } + } + + if (!online) + Plugin.getServer().shutdown(); } else { diff --git a/Website/LOC.Website.Web/Controllers/PlayerAccountController.cs b/Website/LOC.Website.Web/Controllers/PlayerAccountController.cs index 5f2a6b214..d0a0896ca 100644 --- a/Website/LOC.Website.Web/Controllers/PlayerAccountController.cs +++ b/Website/LOC.Website.Web/Controllers/PlayerAccountController.cs @@ -147,27 +147,6 @@ return Content(json, "application/json"); } - [HttpPost] - public ActionResult GemReward(GemRewardToken token) - { - var account = _accountAdministrator.GetAccountByName(token.Name); - account.Gems += token.Gems; - - var accountGemTransaction = new AccountGemTransaction - { - Account = account, - Earned = token.Earned, - Reason = token.Reason, - Source = token.Source - }; - - - _accountAdministrator.UpdateAccount(account); - - var json = JsonConvert.SerializeObject(token); - return Content(json, "application/json"); - } - [HttpPost] public ActionResult RankUpdate(RankUpdateToken token) { @@ -175,7 +154,6 @@ return Content(json, "application/json"); } - [HttpPost] public ActionResult PlayerVoted(string name) { diff --git a/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml b/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml index 4b2796cb2..337183661 100644 --- a/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml +++ b/Website/LOC.Website.Web/LOC.Website.Web.Publish.xml @@ -1,12 +1,12 @@  - + @@ -19,18 +19,15 @@ - - + - - + - @@ -44,27 +41,25 @@ - + - - - + - - + + @@ -75,50 +70,52 @@ - - + - - + + + + - - - + + - + - + + + - + @@ -127,20 +124,20 @@ - + - - + - + + - + @@ -154,44 +151,49 @@ - + + + + + + - + + - + - - + - + + - @@ -201,7 +203,7 @@ - + @@ -209,65 +211,61 @@ - - + + - + - + - + + - + - + - - + - - + + - - + - + - + - - + + - - + + - - + - - + - @@ -283,29 +281,28 @@ - + + - - + - + - + - @@ -313,18 +310,19 @@ - + - + + - + @@ -335,20 +333,23 @@ + - + + - + + @@ -356,52 +357,49 @@ - + - - + + - - - - - - + - - + - + + + - + + @@ -412,33 +410,32 @@ - + - - - - + - - + - - - + + + + + + @@ -446,84 +443,87 @@ - + + - + - - + + - + - - + + - - + + - - + + + - + - + - + + - - + + - + - - + + - + - - - - - + + + + + - + \ No newline at end of file diff --git a/Website/LOCWebsite.suo b/Website/LOCWebsite.suo index d65e30e7d7dcf4f2e5122c69e5a9e5cc78c5e188..5878bdd87085b8423eb5d09b76ebba5fcdac3657 100644 GIT binary patch delta 11637 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 z¬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 delta 12041 zcmZ{K4Oo;_-u|5PoM%8F9490~8i$dH2ysMgSyLRzl#paZL?xw>{ECcFiA+sLm(;Xq zk#==euesD#+lSd`YQ26fx@K-4`rhXZp!;6$-|LzSXXcsb zIUm2@{k!k`cllf3aY5cYZ%0 zHe0UDwbQg;xSh?UBNtg;=|43_*4*Nf&#gYz?6c|e#WUk~ zlx^$9X3IZMFOi$4$6WuA}BlN0v*k?f~gX3Ls**-}#}hwn)u`yeq~dOY#c zPq{R6IV+&R^(j_k}3vg2}$EU9

*%%Y_$2`EJaS)mqh0`TAQf-6!VZf$WwNn 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 z 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