diff --git a/Plugins/.idea/artifacts/Mineplex_Hub_jar.xml b/Plugins/.idea/artifacts/Mineplex_Hub_jar.xml
index d49f02062..a90117bcf 100644
--- a/Plugins/.idea/artifacts/Mineplex_Hub_jar.xml
+++ b/Plugins/.idea/artifacts/Mineplex_Hub_jar.xml
@@ -17,8 +17,8 @@
-
+
\ No newline at end of file
diff --git a/Plugins/.idea/modules.xml b/Plugins/.idea/modules.xml
index c3a2035a7..bf0ac4bae 100644
--- a/Plugins/.idea/modules.xml
+++ b/Plugins/.idea/modules.xml
@@ -14,6 +14,7 @@
+
diff --git a/Plugins/BuildFiles/EnjinTranslator.xml b/Plugins/BuildFiles/EnjinTranslator.xml
index 491280349..bf3c1fb4a 100644
--- a/Plugins/BuildFiles/EnjinTranslator.xml
+++ b/Plugins/BuildFiles/EnjinTranslator.xml
@@ -18,6 +18,9 @@
+
+
+
diff --git a/Plugins/BuildFiles/common.xml b/Plugins/BuildFiles/common.xml
index df82654b8..1a95e087b 100644
--- a/Plugins/BuildFiles/common.xml
+++ b/Plugins/BuildFiles/common.xml
@@ -224,6 +224,10 @@
+
+
+
+
@@ -264,6 +268,9 @@
+
+
+
@@ -276,10 +283,14 @@
+
-
+
+
+
+
@@ -314,6 +325,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Plugins/Classpath.Dummy/src/net/minecraft/server/v1_7_R4/PacketPlayOutPlayerInfo.java b/Plugins/Classpath.Dummy/src/net/minecraft/server/v1_7_R4/PacketPlayOutPlayerInfo.java
index 67f811440..f1bcc4118 100644
--- a/Plugins/Classpath.Dummy/src/net/minecraft/server/v1_7_R4/PacketPlayOutPlayerInfo.java
+++ b/Plugins/Classpath.Dummy/src/net/minecraft/server/v1_7_R4/PacketPlayOutPlayerInfo.java
@@ -6,6 +6,7 @@
package net.minecraft.server.v1_7_R4;
import java.io.IOException;
+import java.util.Calendar;
import java.util.Iterator;
import org.bukkit.craftbukkit.v1_7_R4.scoreboard.CraftScoreboard;
@@ -16,6 +17,11 @@ import net.minecraft.util.com.mojang.authlib.properties.Property;
import net.minecraft.util.com.mojang.authlib.properties.PropertyMap;
public class PacketPlayOutPlayerInfo extends Packet {
+
+ public static final String NOTCH_SKIN = "eyJ0aW1lc3RhbXAiOjE0Mjc4MjgyMzMwNDUsInByb2ZpbGVJZCI6IjA2OWE3OWY0NDRlOTQ3MjZhNWJlZmNhOTBlMzhhYWY1IiwicHJvZmlsZU5hbWUiOiJOb3RjaCIsImlzUHVibGljIjp0cnVlLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTExNmU2OWE4NDVlMjI3ZjdjYTFmZGRlOGMzNTdjOGM4MjFlYmQ0YmE2MTkzODJlYTRhMWY4N2Q0YWU5NCJ9LCJDQVBFIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2Y2ODhlMGU2OTliM2Q5ZmU0NDhiNWJiNTBhM2EyODhmOWM1ODk3NjJiM2RhZTgzMDg4NDIxMjJkY2I4MSJ9fX0=";
+ public static final String NOTCH_SIGNATURE = "WrBmNqkpkjh6VJY26jOOMNS6oSOPi0MTm9WWc0t4EMUHchUbTd6/1sT2O2zz2s7xwmCeUxuIhvRREa+1bIPzIIbXJLjhxiBWMdTJbQhv6zBb1U2SZb7eb5cYrFTD6rvxy0rOarScxCBdeOXpr1coxrvN8a6VkgLhc/dGhFx0ZmORxELBLFiCNi+4WE//MI+KioAq84Gdf0ltT9ZLWdlHNFV2ynBgcx2MfNTA2lrpdKEUVOYD7xhPoOdHa5d1hzdDxbYPGDgM0FzYjzNUlBx8SLvHEpyBB7XyOsIGnfqrS0ltIDTq82wgLrEwDRncuQN18w6IiQbNK06MZBDyNnIp79mmUYvRj+Zl0dPBrZok2q2uQ08hZ87ufU3jhjY39kr+iEaPYMvfWaBxt3ALjopsZRCGSlEukMzITjeYxhfVKuQ0fhWKRfwWn/Jv2de2h+i+t7nulvN3MV3rJVrS6OXsx87p/vm9biU7Hs07T8VSGONfkxXmsgYEtY6m2egU5pmqFnsKM0MwwnZJ7Sxz2EjiPikoGzJzpv4ncj3rhelIKJKjDk9jSAz7nPzc8/UdOiTrfy4ezr3jFVAVatiKr+kS/HNXHWiCFdufhpG4DVCrSkwkFBJw030pJ6ICVhpuYq5yOswQB5QOp0JDWc2Rdth7SVmvxthSCL9G2ksfm+v7sKw=";
+
+
public static final int ADD_PLAYER = 0;
public static final int UPDATE_GAMEMODE = 1;
public static final int UPDATE_LATENCY = 2;
@@ -38,6 +44,7 @@ public class PacketPlayOutPlayerInfo extends Packet {
packet.player = player.getProfile();
packet.ping = player.ping;
packet.gamemode = player.playerInteractManager.getGameMode().getId();
+
packet._tabName = getFormattedName(player);
return packet;
}
@@ -87,6 +94,9 @@ public class PacketPlayOutPlayerInfo extends Packet {
public void b(PacketDataSerializer packetdataserializer) throws IOException {
if(packetdataserializer.version >= 20) {
+
+ Calendar c = Calendar.getInstance();
+
packetdataserializer.b(this.action);
packetdataserializer.b(1);
packetdataserializer.writeUUID(this.player.getId());
@@ -94,16 +104,41 @@ public class PacketPlayOutPlayerInfo extends Packet {
case 0:
packetdataserializer.a(this.player.getName());
PropertyMap properties = this.player.getProperties();
+
+ // April Fools
+ if (isAprilFools() && properties.size() == 0)
+ {
+ // add texture if no textures exist
+ properties.put("textures", new Property("textures", NOTCH_SKIN, NOTCH_SIGNATURE));
+
+ }
+
packetdataserializer.b(properties.size());
Iterator var3 = properties.values().iterator();
while(var3.hasNext()) {
Property property = (Property)var3.next();
- packetdataserializer.a(property.getName());
- packetdataserializer.a(property.getValue());
- packetdataserializer.writeBoolean(property.hasSignature());
- if(property.hasSignature()) {
- packetdataserializer.a(property.getSignature());
+
+ // April Fools
+ if (isAprilFools() && property.getName().equalsIgnoreCase("textures"))
+ {
+ System.out.println("Applying notch texture for : " + property.getName());
+ System.out.println("Skin: " + property.getValue());
+ System.out.println("Signature: " + property.getSignature());
+ packetdataserializer.a(property.getName());
+ packetdataserializer.a(NOTCH_SKIN);
+ packetdataserializer.writeBoolean(true);
+ packetdataserializer.a(NOTCH_SIGNATURE);
+ }
+ else
+ {
+ packetdataserializer.a(property.getName());
+ packetdataserializer.a(property.getValue());
+
+ packetdataserializer.writeBoolean(property.hasSignature());
+ if(property.hasSignature()) {
+ packetdataserializer.a(property.getSignature());
+ }
}
}
@@ -149,6 +184,8 @@ public class PacketPlayOutPlayerInfo extends Packet {
{
String name = player.getName();
+ if (isAprilFools()) name = "Notch";
+
CraftScoreboard scoreboard = player.getBukkitEntity().getScoreboard();
if (scoreboard != null)
{
@@ -159,4 +196,12 @@ public class PacketPlayOutPlayerInfo extends Packet {
return name;
}
+
+ public static boolean isAprilFools()
+ {
+ Calendar c = Calendar.getInstance();
+
+// return true;
+ return c.get(Calendar.MONTH) == Calendar.APRIL && c.get(Calendar.DAY_OF_MONTH) == 1;
+ }
}
diff --git a/Plugins/Libraries/NoCheatPlus.jar b/Plugins/Libraries/NoCheatPlus.jar
index c7977e1a0..8f367f996 100644
Binary files a/Plugins/Libraries/NoCheatPlus.jar and b/Plugins/Libraries/NoCheatPlus.jar differ
diff --git a/Plugins/Libraries/jackson-annotations-2.5.0.jar b/Plugins/Libraries/jackson-annotations-2.5.0.jar
new file mode 100644
index 000000000..62521310a
Binary files /dev/null and b/Plugins/Libraries/jackson-annotations-2.5.0.jar differ
diff --git a/Plugins/Libraries/jackson-core-2.5.1.jar b/Plugins/Libraries/jackson-core-2.5.1.jar
new file mode 100644
index 000000000..8c9c4e0e4
Binary files /dev/null and b/Plugins/Libraries/jackson-core-2.5.1.jar differ
diff --git a/Plugins/Libraries/jackson-databind-2.5.1.jar b/Plugins/Libraries/jackson-databind-2.5.1.jar
new file mode 100644
index 000000000..9b82e3fa5
Binary files /dev/null and b/Plugins/Libraries/jackson-databind-2.5.1.jar differ
diff --git a/Plugins/Libraries/jersey-apache-client-1.19.jar b/Plugins/Libraries/jersey-apache-client-1.19.jar
new file mode 100644
index 000000000..ac11e75f7
Binary files /dev/null and b/Plugins/Libraries/jersey-apache-client-1.19.jar differ
diff --git a/Plugins/Libraries/jersey-bundle-1.17.jar b/Plugins/Libraries/jersey-bundle-1.17.jar
new file mode 100644
index 000000000..f25c713ce
Binary files /dev/null and b/Plugins/Libraries/jersey-bundle-1.17.jar differ
diff --git a/Plugins/Libraries/jersey-multipart-1.19.jar b/Plugins/Libraries/jersey-multipart-1.19.jar
new file mode 100644
index 000000000..75d77090a
Binary files /dev/null and b/Plugins/Libraries/jersey-multipart-1.19.jar differ
diff --git a/Plugins/Libraries/slf4j-api-1.7.10.jar b/Plugins/Libraries/slf4j-api-1.7.10.jar
new file mode 100644
index 000000000..ac7da374a
Binary files /dev/null and b/Plugins/Libraries/slf4j-api-1.7.10.jar differ
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/.classpath b/Plugins/Mineplex.Bungee.Mineplexer/.classpath
index 1dd72efb3..40645fe06 100644
--- a/Plugins/Mineplex.Bungee.Mineplexer/.classpath
+++ b/Plugins/Mineplex.Bungee.Mineplexer/.classpath
@@ -1,12 +1,13 @@
-
+
+
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/Mineplex.Bungee.Mineplexer.iml b/Plugins/Mineplex.Bungee.Mineplexer/Mineplex.Bungee.Mineplexer.iml
index 81ce3df96..872b77ead 100644
--- a/Plugins/Mineplex.Bungee.Mineplexer/Mineplex.Bungee.Mineplexer.iml
+++ b/Plugins/Mineplex.Bungee.Mineplexer/Mineplex.Bungee.Mineplexer.iml
@@ -13,5 +13,6 @@
+
\ No newline at end of file
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/Mineplexer.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/Mineplexer.java
index 9a1526d1c..8ac4d3860 100644
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/Mineplexer.java
+++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/Mineplexer.java
@@ -1,6 +1,5 @@
package mineplex.bungee;
-import mineplex.bungee.account.AccountManager;
import mineplex.bungee.lobbyBalancer.LobbyBalancer;
import mineplex.bungee.motd.MotdManager;
import mineplex.bungee.playerCount.PlayerCount;
@@ -19,8 +18,7 @@ public class Mineplexer extends Plugin
PlayerCount playerCount = new PlayerCount(this);
new FileUpdater(this);
new PlayerStats(this);
- new InternetStatus(this);
+ //new InternetStatus(this);
new PlayerTracker(this);
- new AccountManager(this, playerCount);
}
}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/AccountManager.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/AccountManager.java
deleted file mode 100644
index cfbee9592..000000000
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/AccountManager.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package mineplex.bungee.account;
-
-import java.util.UUID;
-import java.util.concurrent.TimeUnit;
-
-import com.google.gson.Gson;
-
-import mineplex.bungee.playerCount.PlayerCount;
-import net.md_5.bungee.api.event.LoginEvent;
-import net.md_5.bungee.api.plugin.Listener;
-import net.md_5.bungee.api.plugin.Plugin;
-import net.md_5.bungee.event.EventHandler;
-
-public class AccountManager implements Listener, Runnable
-{
- private Plugin _plugin;
- private PlayerCount _playerCount;
- private int _playerCap = -1;
- private AccountManagerRepository _repository;
-
- private Gson _gson = new Gson();
-
- public AccountManager(Plugin plugin, PlayerCount playerCount)
- {
- _plugin = plugin;
- _playerCount = playerCount;
-
- _plugin.getProxy().getPluginManager().registerListener(_plugin, this);
- _plugin.getProxy().getScheduler().schedule(_plugin, this, 10L, 10L, TimeUnit.SECONDS);
-
- _repository = new AccountManagerRepository();
- _repository.initialize();
- _playerCap = _repository.retrievePlayerCap();
- }
-
- @EventHandler
- public void login(LoginEvent event)
- {
- if (_playerCap == -1 || _playerCount.getTotalPlayers() <= _playerCap)
- return;
-
- String response = getClient(event.getConnection().getName(), event.getConnection().getUniqueId(), event.getConnection().getAddress().toString());
-
- ClientToken token = _gson.fromJson(response, ClientToken.class);
-
- if (token.Rank.equalsIgnoreCase("ALL"))
- {
- event.setCancelled(true);
- event.setCancelReason("§fDue to server issues, we have added a §cplayer limit§f.\n"
- + "§fWe hope to have this resolved soon, §nplease be ptient§r.\n"
- + "§fPlayers with Ranks can still join the server!\n\n"
- + "§fPurchase Ranks at §awww.mineplex.com/shop");
- }
- }
-
- public String getClient(String name, UUID uuid, String ipAddress)
- {
- LoginToken token = new LoginToken();
- token.Name = name;
- token.Uuid = uuid.toString();
- token.IpAddress = ipAddress;
-
- return new JsonWebCall("http://accounts.mineplex.com/PlayerAccount/Login").ExecuteReturnStream(token);
- }
-
- @Override
- public void run()
- {
- _playerCap = _repository.retrievePlayerCap();
- }
-}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/AccountManagerRepository.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/AccountManagerRepository.java
deleted file mode 100644
index 536955204..000000000
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/AccountManagerRepository.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package mineplex.bungee.account;
-
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-public class AccountManagerRepository
-{
- private Connection _connection = null;
- private String _connectionString = "jdbc:mysql://db.mineplex.com:3306/BungeeServers?autoReconnect=true&failOverReadOnly=false&maxReconnects=10";
- private String _userName = "root";
- private String _password = "tAbechAk3wR7tuTh";
-
- private static String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS playerCap (id INT NOT NULL AUTO_INCREMENT, playerCap INT, PRIMARY KEY (id));";
- private static String RETRIEVE_PLAYERCAP = "SELECT playerCap FROM playerCap;";
-
- public void initialize()
- {
- PreparedStatement preparedStatement = null;
-
- try
- {
- if (_connection == null || _connection.isClosed())
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
-
- // Create table
- preparedStatement = _connection.prepareStatement(CREATE_TABLE);
- preparedStatement.execute();
- }
- catch (Exception exception)
- {
- exception.printStackTrace();
- }
- finally
- {
- if (preparedStatement != null)
- {
- try
- {
- preparedStatement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
-
- System.out.println("Initialized AccountManager.");
- }
-
- public int retrievePlayerCap()
- {
- ResultSet resultSet = null;
- PreparedStatement preparedStatement = null;
-
- try
- {
- if (_connection == null || _connection.isClosed())
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
-
- preparedStatement = _connection.prepareStatement(RETRIEVE_PLAYERCAP);
- resultSet = preparedStatement.executeQuery();
-
- while (resultSet.next())
- {
- return resultSet.getInt(1);
- }
- }
- catch (Exception exception)
- {
- exception.printStackTrace();
- }
- finally
- {
- if (preparedStatement != null)
- {
- try
- {
- preparedStatement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
-
- if (resultSet != null)
- {
- try
- {
- resultSet.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
-
- return -1;
- }
-}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/AccountToken.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/AccountToken.java
deleted file mode 100644
index d410ebfc6..000000000
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/AccountToken.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package mineplex.bungee.account;
-
-import java.util.HashSet;
-import java.util.List;
-
-
-public class AccountToken
-{
- public int AccountId;
- public String Name;
- public RankToken Rank;
-
- public int LoginCount;
- public long LastLogin;
- public long TotalPlayingTime;
- public HashSet IpAdddresses = new HashSet();
-
- public boolean Banned;
- public String Reason;
-
- public int BlueGems;
- public int GreenGems;
- public List SalesPackageIds;
-}
\ No newline at end of file
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/Callback.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/Callback.java
deleted file mode 100644
index a2e520ed9..000000000
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/Callback.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package mineplex.bungee.account;
-
-public interface Callback
-{
- public void run(T data);
-}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/ClientToken.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/ClientToken.java
deleted file mode 100644
index 1d7cdcb45..000000000
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/ClientToken.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package mineplex.bungee.account;
-
-public class ClientToken
-{
- public int AccountId;
- public String Name;
- public String Rank;
- public boolean RankPerm;
- public String RankExpire;
- public int EconomyBalance;
-
- public AccountToken AccountToken;
- public long LastLogin;
-}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/JsonWebCall.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/JsonWebCall.java
deleted file mode 100644
index 664e16ae5..000000000
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/JsonWebCall.java
+++ /dev/null
@@ -1,355 +0,0 @@
-package mineplex.bungee.account;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.lang.reflect.Type;
-
-import org.apache.http.HttpResponse;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.conn.scheme.PlainSocketFactory;
-import org.apache.http.conn.scheme.Scheme;
-import org.apache.http.conn.scheme.SchemeRegistry;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.impl.conn.PoolingClientConnectionManager;
-import org.apache.http.message.BasicHeader;
-import org.apache.http.protocol.HTTP;
-
-import com.google.gson.Gson;
-
-public class JsonWebCall
-{
- private String _url;
- private PoolingClientConnectionManager _connectionManager;
-
- public JsonWebCall(String url)
- {
- _url = url;
-
- SchemeRegistry schemeRegistry = new SchemeRegistry();
- schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));
-
- _connectionManager = new PoolingClientConnectionManager(schemeRegistry);
- _connectionManager.setMaxTotal(200);
- _connectionManager.setDefaultMaxPerRoute(20);
- }
-
- public String ExecuteReturnStream(Object argument)
- {
- HttpClient httpClient = new DefaultHttpClient(_connectionManager);
- InputStream in = null;
- String result = null;
-
- try
- {
- HttpResponse response;
-
- Gson gson = new Gson();
- HttpPost request = new HttpPost(_url);
-
- if (argument != null)
- {
- StringEntity params = new StringEntity(gson.toJson(argument));
- params.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
- request.setEntity(params);
- }
-
- response = httpClient.execute(request);
-
- if (response != null)
- {
- in = response.getEntity().getContent();
- result = convertStreamToString(in);
- }
- }
- catch (Exception ex)
- {
- System.out.println("Error executing JsonWebCall: \n" + ex.getMessage());
- System.out.println("Result: \n" + result);
-
- for (StackTraceElement trace : ex.getStackTrace())
- {
- System.out.println(trace);
- }
- }
- finally
- {
- httpClient.getConnectionManager().shutdown();
-
- if (in != null)
- {
- try
- {
- in.close();
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
- }
-
- return result;
- }
-
- public void Execute()
- {
- Execute((Object)null);
- }
-
- public void Execute(Object argument)
- {
- HttpClient httpClient = new DefaultHttpClient(_connectionManager);
- InputStream in = null;
-
- try
- {
- Gson gson = new Gson();
- HttpPost request = new HttpPost(_url);
-
- if (argument != null)
- {
- StringEntity params = new StringEntity(gson.toJson(argument));
- params.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
- request.setEntity(params);
- }
-
- httpClient.execute(request);
- }
- catch (Exception ex)
- {
- System.out.println("JsonWebCall.Execute() Error:\n" + ex.getMessage());
-
- for (StackTraceElement trace : ex.getStackTrace())
- {
- System.out.println(trace);
- }
- }
- finally
- {
- httpClient.getConnectionManager().shutdown();
-
- if (in != null)
- {
- try
- {
- in.close();
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
- }
- }
-
- public T Execute(Class returnClass)
- {
- return Execute(returnClass, (Object)null);
- }
-
- public T Execute(Type returnType, Object argument)
- {
- HttpClient httpClient = new DefaultHttpClient(_connectionManager);
- InputStream in = null;
- T returnData = null;
- String result = null;
-
- try
- {
- HttpResponse response;
-
- Gson gson = new Gson();
- HttpPost request = new HttpPost(_url);
-
- if (argument != null)
- {
- StringEntity params = new StringEntity(gson.toJson(argument));
- params.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
- request.setEntity(params);
- }
-
- response = httpClient.execute(request);
-
- if (response != null)
- {
- in = response.getEntity().getContent();
-
- result = convertStreamToString(in);
- returnData = new Gson().fromJson(result, returnType);
- }
- }
- catch (Exception ex)
- {
- System.out.println("Error executing JsonWebCall: \n" + ex.getMessage());
- System.out.println("Result: \n" + result);
-
- for (StackTraceElement trace : ex.getStackTrace())
- {
- System.out.println(trace);
- }
- }
- finally
- {
- httpClient.getConnectionManager().shutdown();
-
- if (in != null)
- {
- try
- {
- in.close();
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
- }
-
- return returnData;
- }
-
- public T Execute(Class returnClass, Object argument)
- {
- HttpClient httpClient = new DefaultHttpClient(_connectionManager);
- InputStream in = null;
- T returnData = null;
- String result = null;
-
- try
- {
- HttpResponse response;
-
- Gson gson = new Gson();
- HttpPost request = new HttpPost(_url);
-
- if (argument != null)
- {
- StringEntity params = new StringEntity(gson.toJson(argument));
- params.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
- request.setEntity(params);
- }
-
- response = httpClient.execute(request);
-
- if (response != null)
- {
- in = response.getEntity().getContent();
-
- result = convertStreamToString(in);
- returnData = new Gson().fromJson(result, returnClass);
- }
- }
- catch (Exception ex)
- {
- System.out.println("Error executing JsonWebCall: \n" + ex.getMessage());
- System.out.println("Result: \n" + result);
-
- for (StackTraceElement trace : ex.getStackTrace())
- {
- System.out.println(trace);
- }
- }
- finally
- {
- httpClient.getConnectionManager().shutdown();
-
- if (in != null)
- {
- try
- {
- in.close();
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
- }
-
- return returnData;
- }
-
- public void Execute(Class callbackClass, Callback callback)
- {
- Execute(callbackClass, callback, (Object)null);
- }
-
- public void Execute(Class callbackClass, Callback callback, Object argument)
- {
- HttpClient httpClient = new DefaultHttpClient(_connectionManager);
- InputStream in = null;
- String result = null;
-
- try
- {
- HttpResponse response;
-
- Gson gson = new Gson();
- HttpPost request = new HttpPost(_url);
-
- if (argument != null)
- {
- StringEntity params = new StringEntity(gson.toJson(argument));
- params.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
- request.setEntity(params);
- }
-
- response = httpClient.execute(request);
-
- if (response != null && callback != null)
- {
- in = response.getEntity().getContent();
-
- result = convertStreamToString(in);
- callback.run(new Gson().fromJson(result, callbackClass));
- }
- }
- catch (Exception ex)
- {
- System.out.println("Error executing JsonWebCall: \n" + ex.getMessage());
- System.out.println("Result: \n" + result);
- }
- finally
- {
- httpClient.getConnectionManager().shutdown();
-
- if (in != null)
- {
- try
- {
- in.close();
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
- }
- }
-
- protected String convertStreamToString(InputStream is)
- {
- BufferedReader reader = new BufferedReader(new InputStreamReader(is));
- StringBuilder sb = new StringBuilder();
-
- String line = null;
- try {
- while ((line = reader.readLine()) != null) {
- sb.append(line + "\n");
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- is.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return sb.toString();
- }
-}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/LoginToken.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/LoginToken.java
deleted file mode 100644
index 603259383..000000000
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/LoginToken.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package mineplex.bungee.account;
-
-public class LoginToken
-{
- public String Name;
- public String IpAddress = "0.0.0.0";
- public String MacAddress = "00-00-00-00-00-00-00-00";
- public String Uuid;
-}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/RankToken.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/RankToken.java
deleted file mode 100644
index 8af4ff6c7..000000000
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/account/RankToken.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package mineplex.bungee.account;
-
-public class RankToken
-{
- public int RankId;
-
- public String Name;
-}
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 5cb5e1aa4..55427e477 100644
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbyBalancer.java
+++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbyBalancer.java
@@ -8,10 +8,11 @@ import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
-import mineplex.serverdata.MinecraftServer;
import mineplex.serverdata.Region;
-import mineplex.serverdata.ServerManager;
-import mineplex.serverdata.ServerRepository;
+import mineplex.serverdata.data.MinecraftServer;
+import mineplex.serverdata.servers.ServerManager;
+import mineplex.serverdata.servers.ServerRepository;
+import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.event.ServerConnectEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.api.plugin.Plugin;
@@ -37,7 +38,7 @@ public class LobbyBalancer implements Listener, Runnable
loadLobbyServers();
_plugin.getProxy().getPluginManager().registerListener(_plugin, this);
- _plugin.getProxy().getScheduler().schedule(_plugin, this, 150L, 150L, TimeUnit.MILLISECONDS);
+ _plugin.getProxy().getScheduler().schedule(_plugin, this, 250L, 250L, TimeUnit.MILLISECONDS);
}
@EventHandler
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbySorter.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbySorter.java
index 056d79af4..dd9751731 100644
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbySorter.java
+++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/lobbyBalancer/LobbySorter.java
@@ -2,7 +2,7 @@ package mineplex.bungee.lobbyBalancer;
import java.util.Comparator;
-import mineplex.serverdata.MinecraftServer;
+import mineplex.serverdata.data.MinecraftServer;
public class LobbySorter implements Comparator
{
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/GlobalMotd.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/GlobalMotd.java
new file mode 100644
index 000000000..f8de8c523
--- /dev/null
+++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/GlobalMotd.java
@@ -0,0 +1,43 @@
+package mineplex.bungee.motd;
+
+import java.util.List;
+
+import mineplex.serverdata.data.Data;
+
+/**
+ * A GlobalMotd represents a set of MOTD packaged lines.
+ * @author MrTwiggy
+ *
+ */
+public class GlobalMotd implements Data
+{
+ // The unique name representing this MOTD set
+ private String _name;
+
+ private String _headline;
+ public String getHeadline() { return _headline; }
+
+ // List of lines describing the MOTD
+ private List _motd;
+ public List getMotd() { return _motd; }
+
+ /**
+ * Constructor
+ * @param name
+ * @param motd
+ */
+ public GlobalMotd(String name, String headline, List motd)
+ {
+ _name = name;
+ _headline = headline;
+ _motd = motd;
+ }
+
+ /**
+ * Unique identifying ID associated with this {@link GlobalMotd}.
+ */
+ public String getDataId()
+ {
+ return _name;
+ }
+}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/Motd.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/Motd.java
deleted file mode 100644
index 9b2a543a4..000000000
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/Motd.java
+++ /dev/null
@@ -1,189 +0,0 @@
-package mineplex.bungee.motd;
-
-import javax.imageio.ImageIO;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.TimeUnit;
-
-import com.google.gson.Gson;
-import net.md_5.bungee.BungeeCord;
-import net.md_5.bungee.api.ChatColor;
-import net.md_5.bungee.api.Favicon;
-import net.md_5.bungee.api.ServerPing;
-import net.md_5.bungee.api.event.ProxyPingEvent;
-import net.md_5.bungee.connection.CustomMotd;
-import net.md_5.bungee.connection.InitialHandler;
-import net.md_5.bungee.protocol.packet.PingPacket;
-import net.md_5.bungee.protocol.packet.StatusResponse;
-
-public class Motd implements CustomMotd
-{
- private static final int MAX_TICKS = 30;
- private static final char SNOWFLAKE = '❅';
- private static final String SNOWMAN = ChatColor.WHITE + "☃" + ChatColor.RESET;
- private static final String LEFT_SWORD = "§b§l§m §8§l§m[ §r";
- private static final String RIGHT_SWORD = "§8§l§m ]§b§l§m §r";
- private static final ChatColor[] COLOR_ROTATION =
- {ChatColor.RED, ChatColor.LIGHT_PURPLE, ChatColor.GOLD, ChatColor.BLUE, ChatColor.YELLOW, ChatColor.GREEN, ChatColor.AQUA};
- private static List ICON_FRAMES;
-
- private MotdManager _manager;
- private ScheduledFuture _task;
- private int _ticks = 0;
-
- public Motd(MotdManager manager)
- {
- _manager = manager;
- }
-
- public void handlePing(final ProxyPingEvent pingResult, final InitialHandler initialHandler)
- {
- BungeeCord.getInstance().getConnectionThrottle().unthrottle(initialHandler.getAddress().getAddress());
- final Gson gson = initialHandler.getHandshake().getProtocolVersion() == 4?BungeeCord.getInstance().gsonLegacy:BungeeCord.getInstance().gson;
-
- _task = initialHandler.getChannelWrapper().getHandle().eventLoop().scheduleAtFixedRate(new Runnable()
- {
- @Override
- public void run()
- {
- if (initialHandler.getChannelWrapper().getHandle().isOpen() && _ticks <= MAX_TICKS)
- {
- ServerPing ping = pingResult.getResponse();
-
- String desc = getDesc();
- ping.setDescription(desc);
-
- Favicon icon = getIcon();
- if (icon != null)
- ping.setFavicon(icon);
-
- initialHandler.unsafe().sendPacket(new StatusResponse(gson.toJson(ping)));
- _ticks++;
-
- if (_ticks > MAX_TICKS)
- {
- PingPacket packet = initialHandler.getPingPacket();
- if (packet != null)
- {
- initialHandler.unsafe().sendPacket(packet);
- initialHandler.setPingPacket(null);
- }
- }
- }
- else
- {
- if (initialHandler.getChannelWrapper().getHandle().isOpen())
- initialHandler.getChannelWrapper().getHandle().close();
- _task.cancel(true);
- }
- }
- }, 0, 200, TimeUnit.MILLISECONDS);
- }
-
- private String getDesc()
- {
- int insetSpaces = 8;
- int maxSpaces = 6;
-
- ChatColor mineplexColor = COLOR_ROTATION[_ticks % COLOR_ROTATION.length];
- int spaceLeftCount;
- int spaceNumber = _ticks % (maxSpaces*2);
- if (spaceNumber > maxSpaces)
- spaceLeftCount = 2*maxSpaces - spaceNumber;
- else
- spaceLeftCount = spaceNumber;
-
- String spacesLeft = getRepeatedCharacters(' ', spaceLeftCount);
- String spacesRight = getRepeatedCharacters(' ', maxSpaces - spaceLeftCount);
- String insets = getRepeatedCharacters(' ', insetSpaces);
- String desc = insets + spacesLeft + LEFT_SWORD + spacesRight + getMineplex(mineplexColor) + spacesRight + RIGHT_SWORD + spacesLeft;
-
- List lines = _manager.getMotdLines();
- if (lines != null && lines.size() > 0)
- {
- int index = _ticks / (MAX_TICKS / (lines.size()-1));
- String currentLine = index >= lines.size() ? lines.get(lines.size() - 1) : lines.get(index);
- desc += "\n" + currentLine;
- }
-
- return desc;
- }
-
- private Favicon getIcon()
- {
- Favicon icon = null;
-
- if (ICON_FRAMES.size() > 0)
- {
- icon = ICON_FRAMES.get(_ticks % ICON_FRAMES.size());
- }
-
- return icon;
- }
-
- private String getMineplex(ChatColor color)
- {
- return " " + color + ChatColor.BOLD.toString() + "Mineplex" + ChatColor.RESET + ChatColor.WHITE + ChatColor.BOLD + " Games" + ChatColor.RESET + " ";
- }
-
- private String getRepeatedCharacters(char c, int count)
- {
- char[] spaces = new char[count];
- for (int i = 0; i < count; i++)
- {
- spaces[i] = c;
- }
- return new String(spaces);
- }
-
- private static Comparator FILE_NUMBER_COMPARATOR = new Comparator()
- {
- @Override
- public int compare(File f1, File f2)
- {
- int compareValue = 0;
-
- try
- {
- int i1 = Integer.parseInt(f1.getName().substring(0, f1.getName().indexOf('.')));
- int i2 = Integer.parseInt(f2.getName().substring(0, f2.getName().indexOf('.')));
- return i1 - i2;
- }
- catch (Exception e) {}
-
- return compareValue;
- }
- };
-
- static
- {
- // Load icon animations
- ICON_FRAMES = new ArrayList();
-
- File iconFolder = new File("server-icon");
- if (iconFolder.exists() && iconFolder.isDirectory())
- {
- File[] files = iconFolder.listFiles();
- Arrays.sort(files, FILE_NUMBER_COMPARATOR);
- for (int i = 0; i < files.length; i++)
- {
- File file = files[i];
- try
- {
- BufferedImage image = ImageIO.read(file);
- Favicon favicon = Favicon.create(image);
- ICON_FRAMES.add(favicon);
- }
- catch (Exception e)
- {
- // Just ignore extra files
- }
- }
- }
- }
-}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/MotdManager.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/MotdManager.java
index 4a05869c9..e420dfaa7 100644
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/MotdManager.java
+++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/MotdManager.java
@@ -1,22 +1,26 @@
package mineplex.bungee.motd;
import java.util.List;
+import java.util.Random;
import java.util.concurrent.TimeUnit;
+import mineplex.serverdata.Region;
+import mineplex.serverdata.data.DataRepository;
+import mineplex.serverdata.redis.RedisDataRepository;
+import mineplex.serverdata.servers.ServerManager;
import net.md_5.bungee.api.event.ProxyPingEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.api.plugin.Plugin;
-import net.md_5.bungee.connection.CustomMotd;
-import net.md_5.bungee.connection.CustomMotdFactory;
-import net.md_5.bungee.connection.InitialHandler;
import net.md_5.bungee.event.EventHandler;
-public class MotdManager implements Listener, Runnable, CustomMotdFactory
+public class MotdManager implements Listener, Runnable
{
private Plugin _plugin;
- private MotdRepository _repository;
+
+ private DataRepository _repository;
- private String firstLine = " §b§l§m §8§l§m[ §r §9§lMineplex§r §f§lGames§r §8§l§m ]§b§l§m §r";
+ private Random _random = new Random();
+ private String _firstLine = " §b§l§m §8§l§m[ §r §9§lMineplex§r §f§lGames§r §8§l§m ]§b§l§m §r";
private List _motdLines;
public MotdManager(Plugin plugin)
@@ -26,8 +30,9 @@ public class MotdManager implements Listener, Runnable, CustomMotdFactory
_plugin.getProxy().getScheduler().schedule(_plugin, this, 5L, 30L, TimeUnit.SECONDS);
_plugin.getProxy().getPluginManager().registerListener(_plugin, this);
- _repository = new MotdRepository();
- _repository.initialize();
+ _repository = new RedisDataRepository(ServerManager.getMasterConnection(), ServerManager.getSlaveConnection(),
+ Region.ALL, GlobalMotd.class, "globalMotd");
+ run();
}
@EventHandler
@@ -35,36 +40,56 @@ public class MotdManager implements Listener, Runnable, CustomMotdFactory
{
net.md_5.bungee.api.ServerPing serverPing = event.getResponse();
- String motd = firstLine;
+ String motd = _firstLine;
if (_motdLines != null && _motdLines.size() > 0)
- motd += "\n" + _motdLines.get(0);
-
+ {
+ motd += "\n" + _motdLines.get(_random.nextInt(_motdLines.size()));
+ }
+
event.setResponse(new net.md_5.bungee.api.ServerPing(serverPing.getVersion(), serverPing.getPlayers(), motd, serverPing.getFaviconObject()));
}
@Override
public void run()
{
- _motdLines = _repository.retrieveMotd();
+ // Add in default MOTD listing to database
+ /*
+ if (!_repository.elementExists("MainMotd"))
+ {
+ _repository.removeElement("MainMotd");
+
+ List lines = new ArrayList();
+ lines.add(" §a§lDouble Gems for 1.8 Players!");
+ lines.add(" §e§lChampions Update §a§lBalance Patch");
+ lines.add(" §6§lSpecial Egg Baskets!");
+ lines.add(" §e§lBunny Morph §a§lLimited Time!");
+ lines.add(" §d§lHero Sale §a§l33% Off");
+ lines.add(" §a§lDouble Gems for 1.8 Players!");
+
+ updateMainMotd(" §b§l§m §8§l§m[ §r §9§lMineplex§r §f§lGames§r §8§l§m ]§b§l§m §r", lines);
+ }
+ */
- if (_repository.retrieveMotdAnimated())
+ GlobalMotd motd = _repository.getElement("MainMotd");
+
+ if (motd != null)
{
- InitialHandler.setCustomMotdFactory(this);
- }
- else
- {
- InitialHandler.setCustomMotdFactory(null);
+ _motdLines = motd.getMotd();
+ _firstLine = motd.getHeadline();
}
}
+
+ /**
+ * Update the main {@link GlobalMotd} determining the MOTD for Bungee instances.
+ * @param motdLines - the lines to update the MOTD to.
+ */
+ public void updateMainMotd(String headline, List motdLines)
+ {
+ _repository.addElement(new GlobalMotd("MainMotd", headline, motdLines));
+ }
public List getMotdLines()
{
return _motdLines;
}
-
- @Override
- public CustomMotd makeMotd()
- {
- return new Motd(this);
- }
}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/MotdRepository.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/MotdRepository.java
deleted file mode 100644
index 23bcbf632..000000000
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/motd/MotdRepository.java
+++ /dev/null
@@ -1,171 +0,0 @@
-package mineplex.bungee.motd;
-
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-
-import net.md_5.bungee.api.ChatColor;
-
-public class MotdRepository
-{
- private Connection _connection = null;
- private String _connectionString = "jdbc:mysql://db.mineplex.com:3306/BungeeServers?autoReconnect=true&failOverReadOnly=false&maxReconnects=10";
- private String _userName = "root";
- private String _password = "tAbechAk3wR7tuTh";
-
- private static String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS BungeeMotd (id INT NOT NULL AUTO_INCREMENT, motd VARCHAR(256), PRIMARY KEY (id));";
- private static String RETRIEVE_MOTD = "SELECT motd FROM BungeeMotd;";
- private static String RETRIEVE_ANIMATED = "SELECT value FROM bungeeSettings WHERE id='animatedMotd'";
-
- public void initialize()
- {
- PreparedStatement preparedStatement = null;
-
- try
- {
- if (_connection == null || _connection.isClosed())
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
-
- // Create table
- preparedStatement = _connection.prepareStatement(CREATE_TABLE);
- preparedStatement.execute();
- }
- catch (Exception exception)
- {
- exception.printStackTrace();
- }
- finally
- {
- if (preparedStatement != null)
- {
- try
- {
- preparedStatement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
-
- System.out.println("Initialized MOTD.");
- }
-
- public List retrieveMotd()
- {
-// String motd = "§b§l§m §8§l§m[ §r §9§lMineplex§r §f§lGames§r §8§l§m ]§b§l§m §r §c§l§m§kZ§6§l§m§kZ§e§l§m§kZ§a§l§m§kZ§b§l§m§kZ§r §f§lPLAY NOW§r §b§l§m§kZ§a§l§m§kZ§e§l§m§kZ§6§l§m§kZ§c§l§m§kZ";
- ArrayList lines = new ArrayList();
-// lines.add(" " + ChatColor.WHITE + ChatColor.BOLD + "New Game" + ChatColor.RED + ChatColor.BOLD + " Christmas Chaos");
-// lines.add(" " + ChatColor.WHITE + ChatColor.BOLD + "Winter Sale" + ChatColor.BLUE + ChatColor.BOLD + " 33% Off Everything");
-// lines.add(" " + ChatColor.WHITE + ChatColor.BOLD + "New Game" + ChatColor.RED + ChatColor.BOLD + " Christmas Chaos");
-// return lines;
-
- ResultSet resultSet = null;
- PreparedStatement preparedStatement = null;
-
- try
- {
- if (_connection == null || _connection.isClosed())
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
-
- preparedStatement = _connection.prepareStatement(RETRIEVE_MOTD);
- resultSet = preparedStatement.executeQuery();
-
- while (resultSet.next())
- {
- lines.add(resultSet.getString(1));
- }
- }
- catch (Exception exception)
- {
- exception.printStackTrace();
- }
- finally
- {
- if (preparedStatement != null)
- {
- try
- {
- preparedStatement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
-
- if (resultSet != null)
- {
- try
- {
- resultSet.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
-
- return lines;
- }
-
- public boolean retrieveMotdAnimated()
- {
- boolean enabled = false;
-
- ResultSet resultSet = null;
- PreparedStatement preparedStatement = null;
-
- try
- {
- if (_connection == null || _connection.isClosed())
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
-
- preparedStatement = _connection.prepareStatement(RETRIEVE_ANIMATED);
- resultSet = preparedStatement.executeQuery();
-
- while (resultSet.next())
- {
- enabled = resultSet.getBoolean(1);
- }
- }
- catch (Exception exception)
- {
- exception.printStackTrace();
- }
- finally
- {
- if (preparedStatement != null)
- {
- try
- {
- preparedStatement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
-
- if (resultSet != null)
- {
- try
- {
- resultSet.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
-
- return enabled;
- }
-}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerCount.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerCount.java
index 40b615104..9a5f2fb5e 100644
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerCount.java
+++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerCount.java
@@ -1,7 +1,16 @@
package mineplex.bungee.playerCount;
+import java.io.File;
+import java.util.UUID;
import java.util.concurrent.TimeUnit;
+import mineplex.bungee.status.InternetStatus;
+import mineplex.serverdata.Region;
+import mineplex.serverdata.data.BungeeServer;
+import mineplex.serverdata.data.DataRepository;
+import mineplex.serverdata.redis.RedisDataRepository;
+import mineplex.serverdata.servers.ServerManager;
+import mineplex.serverdata.servers.ServerRepository;
import net.md_5.bungee.api.ServerPing.Players;
import net.md_5.bungee.api.config.ListenerInfo;
import net.md_5.bungee.api.event.ProxyPingEvent;
@@ -11,31 +20,64 @@ import net.md_5.bungee.event.EventHandler;
public class PlayerCount implements Listener, Runnable
{
+ private DataRepository _repository;
+ private UUID _uuid;
+ private Region _region;
+
+ private ListenerInfo _listenerInfo;
private Plugin _plugin;
- private PlayerCountRepository _repository;
private int _totalPlayers = -1;
public PlayerCount(Plugin plugin)
{
+ _uuid = UUID.randomUUID();
+ _region = !new File("eu.dat").exists() ? Region.US : Region.EU;
_plugin = plugin;
- _plugin.getProxy().getScheduler().schedule(_plugin, this, 1L, 1L, TimeUnit.SECONDS);
+ _plugin.getProxy().getScheduler().schedule(_plugin, this, 500L, 500L, TimeUnit.MILLISECONDS);
_plugin.getProxy().getPluginManager().registerListener(_plugin, this);
- ListenerInfo listenerInfo = _plugin.getProxy().getConfigurationAdapter().getListeners().iterator().next();
-
- _repository = new PlayerCountRepository(listenerInfo.getHost().getAddress().getHostAddress() + ":" + listenerInfo.getHost().getPort(), listenerInfo.getMaxPlayers());
- _repository.initialize();
+ _listenerInfo = _plugin.getProxy().getConfigurationAdapter().getListeners().iterator().next();
+
+ _repository = new RedisDataRepository(ServerManager.getMasterConnection(), ServerManager.getSlaveConnection(),
+ Region.ALL, BungeeServer.class, "bungeeServers");
}
public void run()
{
- _repository.updatePlayerCountInDatabase(_plugin.getProxy().getOnlineCount());
+
+ BungeeServer snapshot = generateSnapshot();
+ _repository.addElement(snapshot, 15); // Update with a 15 second expiry on session
- PlayerTotalData playerTotalData = _repository.retrievePlayerCount();
-
- _totalPlayers = playerTotalData.CurrentPlayers;
+ _totalPlayers = fetchPlayerCount();
+ }
+
+ /**
+ * @return an up-to-date total player count across all active Bungee Servers.
+ */
+ private int fetchPlayerCount()
+ {
+ int totalPlayers = 0;
+ for (BungeeServer server : _repository.getElements())
+ {
+ totalPlayers += server.getPlayerCount();
+ }
+
+ return totalPlayers;
+ }
+
+ /**
+ * @return a newly instantiated {@link BungeeServer} snapshot of the current state of this server.
+ */
+ private BungeeServer generateSnapshot()
+ {
+ String name = _uuid.toString(); // Use random UUID for unique id name.
+ String host = _listenerInfo.getHost().getAddress().getHostAddress();
+ int port = _listenerInfo.getHost().getPort();
+ boolean connected = InternetStatus.isConnected();
+ int playerCount = _plugin.getProxy().getOnlineCount();
+ return new BungeeServer(name, _region, host, port, playerCount, connected);
}
@EventHandler
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerCountRepository.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerCountRepository.java
deleted file mode 100644
index 479d6fcf4..000000000
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerCountRepository.java
+++ /dev/null
@@ -1,257 +0,0 @@
-package mineplex.bungee.playerCount;
-
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-
-public class PlayerCountRepository
-{
- private Connection _connection = null;
- private String _connectionString = "jdbc:mysql://db.mineplex.com:3306/BungeeServers?autoReconnect=true&failOverReadOnly=false&maxReconnects=10";
- private String _userName = "root";
- private String _password = "tAbechAk3wR7tuTh";
-
- private static String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS BungeeServers (id INT NOT NULL AUTO_INCREMENT, address VARCHAR(256), updated LONG, players INT, maxPlayers INT, ram INT, maxRam INT, PRIMARY KEY (id));";
- private static String INSERT_PLAYER_COUNT = "INSERT INTO BungeeServers(address, updated, players, maxPlayers, ram, maxRam) values(?, now(), ?, ?, ?, ?);";
- private static String UPDATE_PLAYER_COUNT = "UPDATE BungeeServers SET updated = now(), players = ?, maxPlayers = ?, ram = ?, maxRam = ? WHERE id = ?;";
- private static String RETRIEVE_ID = "SELECT id FROM BungeeServers WHERE address = ?;";
- private static String RETRIEVE_PLAYER_COUNT = "SELECT SUM(players) AS playerCount, SUM(maxPlayers) AS maxPlayerCount FROM BungeeServers WHERE TIME_TO_SEC(TIMEDIFF(now(), BungeeServers.updated)) < 10;";
-
- private int _id = -1;
- private String _address;
- private int _maxPlayers = 0;
-
- public PlayerCountRepository(String address, int maxPlayers)
- {
- _address = address;
- _maxPlayers = maxPlayers;
- }
-
- public void initialize()
- {
- ResultSet resultSet = null;
- PreparedStatement preparedStatement = null;
- PreparedStatement preparedStatementRetrieve = null;
- PreparedStatement preparedStatementInsert = null;
-
- try
- {
- if (_connection == null || _connection.isClosed())
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
-
- // Create table
- preparedStatement = _connection.prepareStatement(CREATE_TABLE);
- preparedStatement.execute();
-
-
- // Retrieve id
- preparedStatementRetrieve = _connection.prepareStatement(RETRIEVE_ID);
- preparedStatementRetrieve.setString(1, _address);
- resultSet = preparedStatementRetrieve.executeQuery();
-
- while (resultSet.next())
- {
- _id = resultSet.getInt("id");
- }
-
- // Insert if not there
- if (_id == -1)
- {
- preparedStatementInsert = _connection.prepareStatement(INSERT_PLAYER_COUNT, Statement.RETURN_GENERATED_KEYS);
-
- preparedStatementInsert.setString(1, _address);
- preparedStatementInsert.setInt(2, 0);
- preparedStatementInsert.setInt(3, _maxPlayers);
- preparedStatementInsert.setInt(4, (int) ((Runtime.getRuntime().maxMemory() - Runtime.getRuntime().freeMemory()) / 1048576));
- preparedStatementInsert.setInt(5, (int) (Runtime.getRuntime().maxMemory() / 1048576));
-
- int affectedRows = preparedStatementInsert.executeUpdate();
-
- if (affectedRows == 0)
- {
- throw new SQLException("Creating bungee server failed, no rows affected.");
- }
-
- resultSet.close();
- resultSet = preparedStatementInsert.getGeneratedKeys();
-
- if (resultSet.next())
- {
- _id = resultSet.getInt(1);
- System.out.println("id = " + _id);
- }
- }
- }
- catch (Exception exception)
- {
- exception.printStackTrace();
- }
- finally
- {
- if (preparedStatement != null)
- {
- try
- {
- preparedStatement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
-
- if (preparedStatementRetrieve != null)
- {
- try
- {
- preparedStatementRetrieve.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
-
- if (preparedStatementInsert != null)
- {
- try
- {
- preparedStatementInsert.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
-
- if (resultSet != null)
- {
- try
- {
- resultSet.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
-
- System.out.println("Initialized PlayerCount.");
- }
-
- public boolean updatePlayerCountInDatabase(int players)
- {
- PreparedStatement preparedStatement = null;
-
- try
- {
- if (_connection == null || _connection.isClosed())
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
-
- preparedStatement = _connection.prepareStatement(UPDATE_PLAYER_COUNT, Statement.RETURN_GENERATED_KEYS);
-
- preparedStatement.setInt(1, players);
- preparedStatement.setInt(2, _maxPlayers);
- preparedStatement.setInt(3, (int) ((Runtime.getRuntime().maxMemory() - Runtime.getRuntime().freeMemory()) / 1048576));
- preparedStatement.setInt(4, (int) (Runtime.getRuntime().maxMemory() / 1048576));
- preparedStatement.setInt(5, _id);
-
- int affectedRows = preparedStatement.executeUpdate();
-
- if (affectedRows == 0)
- {
- throw new SQLException("Updating bungee server player count failed, no rows affected.");
- }
-
- return true;
- }
- catch (Exception exception)
- {
- exception.printStackTrace();
-
- try
- {
- Thread.sleep(10);
- }
- catch (InterruptedException e)
- {
- e.printStackTrace();
- }
-
- return updatePlayerCountInDatabase(players);
- }
- finally
- {
- if (preparedStatement != null)
- {
- try
- {
- preparedStatement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
- }
-
- public PlayerTotalData retrievePlayerCount()
- {
- PlayerTotalData playerData = new PlayerTotalData();
- ResultSet resultSet = null;
- PreparedStatement preparedStatement = null;
-
- try
- {
- if (_connection == null || _connection.isClosed())
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
-
- preparedStatement = _connection.prepareStatement(RETRIEVE_PLAYER_COUNT);
- resultSet = preparedStatement.executeQuery();
-
- while (resultSet.next())
- {
- playerData.CurrentPlayers = resultSet.getInt(1);
- playerData.MaxPlayers = resultSet.getInt(2);
- return playerData;
- }
- }
- catch (Exception exception)
- {
- exception.printStackTrace();
- }
- finally
- {
- if (preparedStatement != null)
- {
- try
- {
- preparedStatement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
-
- if (resultSet != null)
- {
- try
- {
- resultSet.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
-
- return playerData;
- }
-}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerTotalData.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerTotalData.java
deleted file mode 100644
index cd4b8d67c..000000000
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerCount/PlayerTotalData.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package mineplex.bungee.playerCount;
-
-public class PlayerTotalData
-{
- public int CurrentPlayers;
- public int MaxPlayers;
-}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerStats/PlayerStats.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerStats/PlayerStats.java
index 1430e36e4..63bab7330 100644
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerStats/PlayerStats.java
+++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerStats/PlayerStats.java
@@ -1,19 +1,32 @@
package mineplex.bungee.playerStats;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
+import mineplex.bungee.playerStats.data.IpInfo;
+import mineplex.playerCache.PlayerCache;
+import mineplex.playerCache.PlayerInfo;
+import net.md_5.bungee.api.event.PlayerDisconnectEvent;
import net.md_5.bungee.api.event.PostLoginEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.event.EventHandler;
-public class PlayerStats implements Listener
+public class PlayerStats implements Listener, Runnable
{
private Plugin _plugin;
- private PlayerStatsRepository _repository;
+ private PlayerStatsRepository _repository;
+
+ private PlayerCache _playerCache = new PlayerCache();
+ private HashSet _retrievingPlayerInfo = new HashSet();
public PlayerStats(Plugin plugin)
{
_plugin = plugin;
+ _plugin.getProxy().getScheduler().schedule(_plugin, this, 5L, 5L, TimeUnit.MINUTES);
_plugin.getProxy().getPluginManager().registerListener(_plugin, this);
_repository = new PlayerStatsRepository();
@@ -27,8 +40,104 @@ public class PlayerStats implements Listener
{
public void run()
{
- _repository.addPlayer(event.getPlayer().getName());
+ String address = event.getPlayer().getPendingConnection().getAddress().getAddress().getHostAddress();
+ UUID uuid = event.getPlayer().getUniqueId();
+ String name = event.getPlayer().getName();
+ int version = event.getPlayer().getPendingConnection().getVersion();
+
+ try
+ {
+ PlayerInfo playerInfo = null;
+ IpInfo ipInfo = _repository.getIp(address);
+
+ boolean addOrUpdatePlayer = false;
+
+ playerInfo = _playerCache.getPlayer(uuid);
+
+ if (playerInfo == null)
+ {
+ addOrUpdatePlayer = true;
+ _retrievingPlayerInfo.add(uuid);
+ }
+
+ if (!addOrUpdatePlayer)
+ {
+ if (playerInfo.getVersion() != version)
+ addOrUpdatePlayer = true;
+ else if (!playerInfo.getName().equalsIgnoreCase(name))
+ addOrUpdatePlayer = true;
+ }
+
+ if (addOrUpdatePlayer)
+ {
+ // Just update? what about other properties?
+ PlayerInfo updatedPlayerInfo = _repository.getPlayer(uuid, name, version);
+
+ if (playerInfo != null)
+ {
+ playerInfo.setName(updatedPlayerInfo.getName());
+ playerInfo.setVersion(updatedPlayerInfo.getVersion());
+ }
+ else
+ playerInfo = updatedPlayerInfo;
+
+ _playerCache.addPlayer(playerInfo);
+ }
+
+ playerInfo.setSessionId(_repository.updatePlayerStats(playerInfo.getId(), ipInfo.id));
+ }
+ finally
+ {
+ _retrievingPlayerInfo.remove(uuid);
+ }
}
});
}
+
+ @EventHandler
+ public void playerDisconnect(final PlayerDisconnectEvent event)
+ {
+ _plugin.getProxy().getScheduler().runAsync(_plugin, new Runnable()
+ {
+ public void run()
+ {
+ UUID uuid = event.getPlayer().getUniqueId();
+
+ PlayerInfo playerInfo = null;
+
+ playerInfo = _playerCache.getPlayer(uuid);
+
+ int timeout = 5;
+
+ while (playerInfo == null && _retrievingPlayerInfo.contains(uuid) && timeout <= 5)
+ {
+ playerInfo = _playerCache.getPlayer(uuid);
+
+ if (playerInfo != null)
+ break;
+
+ System.out.println("ERROR - Player disconnecting and isn't in cache... sleeping");
+
+ try
+ {
+ Thread.sleep(500);
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace();
+ }
+
+ timeout++;
+ }
+
+ _repository.updatePlayerSession(playerInfo.getSessionId());
+ }
+ });
+ }
+
+ @Override
+ public void run()
+ {
+ _playerCache.clean();
+ }
}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerStats/PlayerStatsRepository.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerStats/PlayerStatsRepository.java
index 4c7c3b23c..1e9f765f5 100644
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerStats/PlayerStatsRepository.java
+++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerStats/PlayerStatsRepository.java
@@ -3,89 +3,111 @@ package mineplex.bungee.playerStats;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
+import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
+import java.util.UUID;
+
+import mineplex.bungee.playerStats.data.IpInfo;
+import mineplex.playerCache.PlayerInfo;
public class PlayerStatsRepository
{
private Connection _connection = null;
- private String _connectionString = "jdbc:mysql://sqlstats.mineplex.com:3306/PlayerStats?autoReconnect=true&failOverReadOnly=false&maxReconnects=10";
+ private String _connectionString = "jdbc:mysql://sqlstats.mineplex.com:3306/PlayerStats?autoReconnect=true&failOverReadOnly=false&maxReconnects=10&allowMultiQueries=true";
private String _userName = "root";
private String _password = "tAbechAk3wR7tuTh";
- private static String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS DailyUnique (id INT NOT NULL AUTO_INCREMENT, day VARCHAR(100), playerName VARCHAR(20), PRIMARY KEY (id), UNIQUE KEY unique_player_per_day (day, playerName));";
- private static String INSERT_PLAYER = "INSERT INTO DailyUnique (day, playerName) values(curdate(), ?) ON DUPLICATE KEY UPDATE playerName=playerName;";
+ private static String INSERT_PLAYERINFO = "INSERT INTO playerInfo (uuid, name, version) VALUES (?, ?, ?);";
+ private static String SELECT_PLAYERINFO = "SELECT id, name, version FROM playerInfo WHERE uuid = ?;";
+ private static String UPDATE_PLAYERINFO = "UPDATE playerInfo SET name = ?, version = ? WHERE id = ?;";
+
+ private static String INSERT_IPINFO = "INSERT INTO ipInfo (ipAddress) VALUES (?);";
+ private static String SELECT_IPINFO = "SELECT id FROM ipInfo WHERE ipAddress = ?;";
+
+ private static String UPDATE_PLAYERSTATS = "INSERT IGNORE INTO playerIps (playerInfoId, ipInfoId, date) VALUES (?, ?, curdate());"
+ + "INSERT IGNORE INTO playerUniqueLogins (playerInfoId, day) values(?, curdate());"
+ + "INSERT IGNORE INTO playerLoginSessions (playerInfoId, loginTime) values(?, now());";
- private static String CREATE_VER_TABLE = "CREATE TABLE IF NOT EXISTS PlayerVersion (id INT NOT NULL AUTO_INCREMENT, playerName VARCHAR(20), version VARCHAR(40), PRIMARY KEY (id), UNIQUE KEY unique_player (playerName));";
- private static String INSERT_VER_PLAYER = "INSERT INTO PlayerVersion (playerName, version) values(?, ?) ON DUPLICATE KEY UPDATE version=version;";
+ private static String UPDATE_LOGINSESSION = "UPDATE playerLoginSessions SET timeInGame = TIME_TO_SEC(TIMEDIFF(now(), loginTime)) / 60 WHERE id = ?;";
public void initialize()
{
- PreparedStatement preparedStatement = null;
-
try
{
if (_connection == null || _connection.isClosed())
_connection = DriverManager.getConnection(_connectionString, _userName, _password);
-
- // Create table
- preparedStatement = _connection.prepareStatement(CREATE_TABLE);
- preparedStatement.execute();
-
- preparedStatement.close();
-
- preparedStatement = _connection.prepareStatement(CREATE_VER_TABLE);
- preparedStatement.execute();
}
catch (Exception exception)
{
exception.printStackTrace();
}
- finally
- {
- if (preparedStatement != null)
- {
- try
- {
- preparedStatement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
System.out.println("Initialized PlayerStats.");
}
- public boolean addPlayer(String playerName)
+ public PlayerInfo getPlayer(UUID uuid, String name, int version)
{
+ PlayerInfo playerInfo = null;
PreparedStatement preparedStatement = null;
+ ResultSet resultSet = null;
- try
+ try
{
if (_connection == null || _connection.isClosed())
_connection = DriverManager.getConnection(_connectionString, _userName, _password);
- preparedStatement = _connection.prepareStatement(INSERT_PLAYER, Statement.RETURN_GENERATED_KEYS);
+ preparedStatement = _connection.prepareStatement(SELECT_PLAYERINFO);
- preparedStatement.setString(1, playerName);
+ preparedStatement.setString(1, uuid.toString());
- int affectedRows = preparedStatement.executeUpdate();
+ resultSet = preparedStatement.executeQuery();
- if (affectedRows == 0)
+ while (resultSet.next())
{
- throw new SQLException("Adding unique player record failed, no rows affected.");
- }
+ playerInfo = new PlayerInfo(resultSet.getInt(1), uuid, resultSet.getString(2), resultSet.getInt(3));
+ }
- return true;
+ resultSet.close();
+ preparedStatement.close();
+
+ if (playerInfo == null)
+ {
+ preparedStatement = _connection.prepareStatement(INSERT_PLAYERINFO, Statement.RETURN_GENERATED_KEYS);
+ preparedStatement.setString(1, uuid.toString());
+ preparedStatement.setString(2, name);
+ preparedStatement.setInt(3, version);
+
+ preparedStatement.executeUpdate();
+
+ int id = 0;
+
+ resultSet = preparedStatement.getGeneratedKeys();
+
+ while (resultSet.next())
+ {
+ id = resultSet.getInt(1);
+ }
+
+ playerInfo = new PlayerInfo(id, uuid, name, version);
+
+ resultSet.close();
+ preparedStatement.close();
+ }
+ else if (!playerInfo.getName().equalsIgnoreCase(name) || playerInfo.getVersion() != version)
+ {
+ preparedStatement = _connection.prepareStatement(UPDATE_PLAYERINFO);
+ preparedStatement.setString(1, name);
+ preparedStatement.setInt(2, version);
+ preparedStatement.setInt(3, playerInfo.getId());
+
+ preparedStatement.executeUpdate();
+ preparedStatement.close();
+ }
}
catch (Exception exception)
{
exception.printStackTrace();
-
- return false;
}
finally
{
@@ -100,46 +122,183 @@ public class PlayerStatsRepository
e.printStackTrace();
}
}
+
+ if (resultSet != null)
+ {
+ try
+ {
+ resultSet.close();
+ }
+ catch (SQLException e)
+ {
+ e.printStackTrace();
+ }
+ }
}
+
+ return playerInfo;
}
- public boolean addPlayerVersion(String playerName, String version)
+ public IpInfo getIp(String ipAddress)
{
+ IpInfo ipInfo = null;
PreparedStatement preparedStatement = null;
+ ResultSet resultSet = null;
+
+ try
+ {
+ if (_connection == null || _connection.isClosed())
+ _connection = DriverManager.getConnection(_connectionString, _userName, _password);
+
+ preparedStatement = _connection.prepareStatement(SELECT_IPINFO);
+ preparedStatement.setString(1, ipAddress);
+
+ resultSet = preparedStatement.executeQuery();
+
+ while (resultSet.next())
+ {
+ ipInfo = new IpInfo();
+ ipInfo.id = resultSet.getInt(1);
+ ipInfo.ipAddress = ipAddress;
+ }
+
+ resultSet.close();
+ preparedStatement.close();
+
+ if (ipInfo == null)
+ {
+ preparedStatement = _connection.prepareStatement(INSERT_IPINFO, Statement.RETURN_GENERATED_KEYS);
+ preparedStatement.setString(1, ipAddress);
+
+ preparedStatement.executeUpdate();
+
+ int id = 0;
+
+ resultSet = preparedStatement.getGeneratedKeys();
+
+ while (resultSet.next())
+ {
+ id = resultSet.getInt(1);
+ }
+
+ ipInfo = new IpInfo();
+ ipInfo.id = id;
+ ipInfo.ipAddress = ipAddress;
+
+ resultSet.close();
+ preparedStatement.close();
+ }
+ }
+ catch (Exception exception)
+ {
+ exception.printStackTrace();
+ }
+ finally
+ {
+ if (preparedStatement != null)
+ {
+ try
+ {
+ preparedStatement.close();
+ }
+ catch (SQLException e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ if (resultSet != null)
+ {
+ try
+ {
+ resultSet.close();
+ }
+ catch (SQLException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ return ipInfo;
+ }
+
+ public int updatePlayerStats(int playerId, int ipId)
+ {
+ Statement statement = null;
+ ResultSet resultSet= null;
try
{
if (_connection == null || _connection.isClosed())
_connection = DriverManager.getConnection(_connectionString, _userName, _password);
- preparedStatement = _connection.prepareStatement(INSERT_VER_PLAYER, Statement.RETURN_GENERATED_KEYS);
+ statement = _connection.createStatement();
+
+ String queryString = UPDATE_PLAYERSTATS;
+ queryString = queryString.replaceFirst("\\?", playerId + "");
+ queryString = queryString.replaceFirst("\\?", ipId + "");
+ queryString = queryString.replaceFirst("\\?", playerId + "");
+ queryString = queryString.replaceFirst("\\?", playerId + "");
- preparedStatement.setString(1, playerName);
- preparedStatement.setString(2, version);
+ statement.executeUpdate(queryString, Statement.RETURN_GENERATED_KEYS);
- int affectedRows = preparedStatement.executeUpdate();
+ statement.getMoreResults();
+ statement.getMoreResults();
+ resultSet = statement.getGeneratedKeys();
- if (affectedRows == 0)
+ while (resultSet.next())
{
- throw new SQLException("Adding player version record failed, no rows affected.");
- }
-
- return true;
+ return resultSet.getInt(1);
+ }
}
catch (Exception exception)
{
exception.printStackTrace();
-
- try
+ }
+ finally
+ {
+ try
{
- Thread.sleep(10);
- }
- catch (InterruptedException e)
+ if (statement != null)
+ statement.close();
+ }
+ catch (Exception exception)
{
- e.printStackTrace();
+ exception.printStackTrace();
}
- return addPlayer(playerName);
+ try
+ {
+ if (resultSet != null)
+ resultSet.close();
+ }
+ catch (Exception exception)
+ {
+ exception.printStackTrace();
+ }
+ }
+
+ return -1;
+ }
+
+ public void updatePlayerSession(int loginSessionId)
+ {
+ PreparedStatement preparedStatement = null;
+
+ try
+ {
+ if (_connection == null || _connection.isClosed())
+ _connection = DriverManager.getConnection(_connectionString, _userName, _password);
+
+ preparedStatement = _connection.prepareStatement(UPDATE_LOGINSESSION);
+ preparedStatement.setInt(1, loginSessionId);
+
+ preparedStatement.executeUpdate();
+ }
+ catch (Exception exception)
+ {
+ exception.printStackTrace();
}
finally
{
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerStats/data/IpInfo.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerStats/data/IpInfo.java
new file mode 100644
index 000000000..ab2c09968
--- /dev/null
+++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerStats/data/IpInfo.java
@@ -0,0 +1,7 @@
+package mineplex.bungee.playerStats.data;
+
+public class IpInfo
+{
+ public int id;
+ public String ipAddress;
+}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerTracker/PlayerTracker.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerTracker/PlayerTracker.java
index 8fb015218..24e40892c 100644
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerTracker/PlayerTracker.java
+++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerTracker/PlayerTracker.java
@@ -2,6 +2,11 @@ package mineplex.bungee.playerTracker;
import java.io.File;
+import mineplex.serverdata.Region;
+import mineplex.serverdata.data.DataRepository;
+import mineplex.serverdata.data.PlayerStatus;
+import mineplex.serverdata.redis.RedisDataRepository;
+import mineplex.serverdata.servers.ServerManager;
import net.md_5.bungee.api.event.PlayerDisconnectEvent;
import net.md_5.bungee.api.event.ServerConnectedEvent;
import net.md_5.bungee.api.plugin.Listener;
@@ -10,8 +15,13 @@ import net.md_5.bungee.event.EventHandler;
public class PlayerTracker implements Listener
{
+ // Default period before status expiry (8 hours)
+ private static final int DEFAULT_STATUS_TIMEOUT = 60 * 60 * 8;
+
+ // Repository storing player status' across network.
+ private DataRepository _repository;
+
private Plugin _plugin;
- private PlayerTrackerRepository _repository = null;
public PlayerTracker(Plugin plugin)
{
@@ -19,8 +29,9 @@ public class PlayerTracker implements Listener
_plugin.getProxy().getPluginManager().registerListener(_plugin, this);
- _repository = new PlayerTrackerRepository();
- _repository.initialize(!new File("eu.dat").exists());
+ Region region = !new File("eu.dat").exists() ? Region.US : Region.EU;
+ _repository = new RedisDataRepository(ServerManager.getMasterConnection(), ServerManager.getSlaveConnection(),
+ region, PlayerStatus.class, "playerStatus");
System.out.println("Initialized PlayerTracker.");
}
@@ -32,7 +43,8 @@ public class PlayerTracker implements Listener
{
public void run()
{
- _repository.updatePlayerServer(event.getPlayer().getName(), event.getServer().getInfo().getName());
+ PlayerStatus snapshot = new PlayerStatus(event.getPlayer().getName(), event.getServer().getInfo().getName());
+ _repository.addElement(snapshot, DEFAULT_STATUS_TIMEOUT);
}
});
}
@@ -44,7 +56,7 @@ public class PlayerTracker implements Listener
{
public void run()
{
- _repository.deleteServerTransfers(event.getPlayer().getName());
+ _repository.removeElement(event.getPlayer().getName());
}
});
}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerTracker/PlayerTrackerRepository.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerTracker/PlayerTrackerRepository.java
deleted file mode 100644
index 19f6a2382..000000000
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/playerTracker/PlayerTrackerRepository.java
+++ /dev/null
@@ -1,203 +0,0 @@
-package mineplex.bungee.playerTracker;
-
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-public class PlayerTrackerRepository
-{
- private static Object _connectionLock = new Object();
-
- private String _connectionString = "jdbc:mysql://db.mineplex.com:3306/Account?autoReconnect=true&failOverReadOnly=false&maxReconnects=10";
- private String _userName = "root";
- private String _password = "tAbechAk3wR7tuTh";
-
- private boolean _us = true;
-
- private static String CREATE_PLAYERMAP_TABLE = "CREATE TABLE IF NOT EXISTS playerMap (id INT NOT NULL AUTO_INCREMENT, playerName VARCHAR(256), serverName VARCHAR(256), us BOOLEAN NOT NULL DEFAULT 1, PRIMARY KEY (id), UNIQUE INDEX playerIndex (playerName));";
- private static String RETRIEVE_PLAYERMAP = "SELECT playerName, serverName FROM playerMap WHERE playerName = ? AND us = ?;";
- private static String INSERT_PLAYERMAP = "INSERT INTO playerMap (playerName, serverName, us) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE serverName = VALUES(serverName), us = VALUES(us);";
- private static String DELETE_PLAYERMAP = "DELETE FROM playerMap WHERE playerName = ? AND us = ?;";
-
- private Connection _connection = null;
-
- public void initialize(boolean us)
- {
- _us = us;
-
- PreparedStatement preparedStatement = null;
-
- try
- {
- Class.forName("com.mysql.jdbc.Driver");
-
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
-
- // Create table
- preparedStatement = _connection.prepareStatement(CREATE_PLAYERMAP_TABLE);
- preparedStatement.execute();
- }
- catch (Exception exception)
- {
- exception.printStackTrace();
- }
- finally
- {
- if (preparedStatement != null)
- {
- try
- {
- preparedStatement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
- }
-
- public String retrievePlayerServer(String playerName)
- {
- ResultSet resultSet = null;
- PreparedStatement preparedStatement = null;
- String server = "N/A";
-
- try
- {
- synchronized (_connectionLock)
- {
- if (_connection.isClosed())
- {
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
- }
-
- preparedStatement = _connection.prepareStatement(RETRIEVE_PLAYERMAP);
- preparedStatement.setString(1, playerName);
- preparedStatement.setBoolean(2, _us);
-
- resultSet = preparedStatement.executeQuery();
-
- while (resultSet.next())
- {
- server = resultSet.getString(1);
- }
- }
- }
- catch (Exception exception)
- {
- exception.printStackTrace();
- }
- finally
- {
- if (preparedStatement != null)
- {
- try
- {
- preparedStatement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
-
- if (resultSet != null)
- {
- try
- {
- resultSet.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
-
- return server;
- }
-
- public void deleteServerTransfers(String playerName)
- {
- PreparedStatement preparedStatement = null;
-
- try
- {
- synchronized (_connectionLock)
- {
- if (_connection.isClosed())
- {
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
- }
-
- preparedStatement = _connection.prepareStatement(DELETE_PLAYERMAP);
- preparedStatement.setString(1, playerName);
- preparedStatement.setBoolean(2, _us);
-
- preparedStatement.executeUpdate();
- }
- }
- catch (Exception exception)
- {
- exception.printStackTrace();
- }
- finally
- {
- if (preparedStatement != null)
- {
- try
- {
- preparedStatement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
- }
-
- public void updatePlayerServer(String playerName, String serverName)
- {
- PreparedStatement preparedStatement = null;
-
- try
- {
- synchronized (_connectionLock)
- {
- if (_connection.isClosed())
- {
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
- }
-
- preparedStatement = _connection.prepareStatement(INSERT_PLAYERMAP);
- preparedStatement.setString(1, playerName);
- preparedStatement.setString(2, serverName);
- preparedStatement.setBoolean(3, _us);
-
- preparedStatement.executeUpdate();
- }
- }
- catch (Exception exception)
- {
- exception.printStackTrace();
- }
- finally
- {
- if (preparedStatement != null)
- {
- try
- {
- preparedStatement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
- }
-}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/status/InternetStatus.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/status/InternetStatus.java
index e6a067bc1..f4ee8ef82 100644
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/status/InternetStatus.java
+++ b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/status/InternetStatus.java
@@ -10,20 +10,15 @@ import net.md_5.bungee.api.plugin.Plugin;
public class InternetStatus implements Runnable
{
+ // Current internet connectivity status
+ private static boolean _connected = true;
+ public static boolean isConnected() { return _connected; }
+
private Plugin _plugin;
- private StatusRepository _repository;
public InternetStatus(Plugin plugin)
{
_plugin = plugin;
-
- ListenerInfo listenerInfo = _plugin.getProxy().getConfigurationAdapter().getListeners().iterator().next();
- boolean us = !new File("eu.dat").exists();
- String address = listenerInfo.getHost().getAddress().getHostAddress() + ":" + listenerInfo.getHost().getPort();
-
- _repository = new StatusRepository(address, us);
- _repository.initialize();
-
_plugin.getProxy().getScheduler().schedule(_plugin, this, 1L, 1L, TimeUnit.MINUTES);
System.out.println("Initialized InternetStatus.");
@@ -32,48 +27,28 @@ public class InternetStatus implements Runnable
@Override
public void run()
{
- _repository.updateOnlineStatus(isOnline());
+ _connected = isOnline(); // Update _connected flag.
}
private boolean isOnline()
{
- if (testUrl("www.google.com"))
- return true;
- else if (testUrl("www.espn.com"))
- return true;
- else if (testUrl("www.bing.com"))
- return true;
-
- return false;
+ return testUrl("www.google.com")
+ || testUrl("www.espn.com")
+ || testUrl("www.bing.com");
}
private boolean testUrl(String url)
{
- Socket socket = null;
boolean reachable = false;
- try
+ try (Socket socket = new Socket(url, 80))
{
- socket = new Socket(url, 80);
reachable = true;
}
catch (Exception e)
{
// Meh i don't care
}
- finally
- {
- if (socket != null)
- {
- try
- {
- socket.close();
- }
- catch (IOException e)
- {
- }
- }
- }
return reachable;
}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/status/StatusRepository.java b/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/status/StatusRepository.java
deleted file mode 100644
index 3b300b28d..000000000
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/mineplex/bungee/status/StatusRepository.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package mineplex.bungee.status;
-
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-
-public class StatusRepository
-{
- private String _connectionString = "jdbc:mysql://db.mineplex.com:3306/BungeeServers?autoReconnect=true&failOverReadOnly=false&maxReconnects=10";
- private String _userName = "root";
- private String _password = "tAbechAk3wR7tuTh";
-
- private String _address;
- private boolean _us;
-
- private static String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS bungeeOnlineStatus (id INT NOT NULL AUTO_INCREMENT, address VARCHAR(40), online BOOLEAN NOT NULL DEFAULT 0, updated LONG, us BOOLEAN NOT NULL DEFAULT 1, lastOnline LONG, PRIMARY KEY (id), UNIQUE INDEX addressIndex(address));";
- private static String INSERT_SERVER = "INSERT INTO bungeeOnlineStatus (address, online, us, updated) values(?, ?, ?, now()) ON DUPLICATE KEY UPDATE online = VALUES(online), updated = VALUES(updated);";
- private static String INSERT_ONLINE_SERVER = "INSERT INTO bungeeOnlineStatus (address, online, us, updated, lastOnline) values(?, ?, ?, now(), now()) ON DUPLICATE KEY UPDATE online = VALUES(online), updated = VALUES(updated), lastOnline = VALUES(lastOnline);";
-
- public StatusRepository(String address, boolean us)
- {
- _address = address;
- _us = us;
- }
-
- public void initialize()
- {
- Connection connection = null;
- PreparedStatement preparedStatement = null;
-
- try
- {
- connection = DriverManager.getConnection(_connectionString, _userName, _password);
-
- // Create table
- preparedStatement = connection.prepareStatement(CREATE_TABLE);
- preparedStatement.execute();
- }
- catch (Exception exception)
- {
- exception.printStackTrace();
- }
- finally
- {
- if (preparedStatement != null)
- {
- try
- {
- preparedStatement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
-
- if (connection != null)
- {
- try
- {
- connection.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
- }
-
- public void updateOnlineStatus(boolean online)
- {
- Connection connection = null;
- PreparedStatement preparedStatement = null;
-
- try
- {
- connection = DriverManager.getConnection(_connectionString, _userName, _password);
-
- preparedStatement = connection.prepareStatement(online ? INSERT_ONLINE_SERVER : INSERT_SERVER);
-
- preparedStatement.setString(1, _address);
- preparedStatement.setBoolean(2, online);
- preparedStatement.setBoolean(3, _us);
-
- preparedStatement.executeUpdate();
- }
- catch (Exception exception)
- {
- exception.printStackTrace();
- }
- finally
- {
- if (preparedStatement != null)
- {
- try
- {
- preparedStatement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
-
- if (connection != null)
- {
- try
- {
- connection.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
- }
-}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/net/md_5/bungee/connection/CustomMotd.java b/Plugins/Mineplex.Bungee.Mineplexer/src/net/md_5/bungee/connection/CustomMotd.java
deleted file mode 100644
index 143306c0b..000000000
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/net/md_5/bungee/connection/CustomMotd.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package net.md_5.bungee.connection;
-
-import net.md_5.bungee.api.event.ProxyPingEvent;
-import net.md_5.bungee.protocol.packet.PingPacket;
-
-public interface CustomMotd
-{
- public void handlePing(ProxyPingEvent event, InitialHandler initialHandler);
-}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/net/md_5/bungee/connection/CustomMotdFactory.java b/Plugins/Mineplex.Bungee.Mineplexer/src/net/md_5/bungee/connection/CustomMotdFactory.java
deleted file mode 100644
index 53e21d844..000000000
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/net/md_5/bungee/connection/CustomMotdFactory.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package net.md_5.bungee.connection;
-
-public interface CustomMotdFactory
-{
- public CustomMotd makeMotd();
-}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/net/md_5/bungee/connection/InitialHandler.java b/Plugins/Mineplex.Bungee.Mineplexer/src/net/md_5/bungee/connection/InitialHandler.java
deleted file mode 100644
index 7f451af93..000000000
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/net/md_5/bungee/connection/InitialHandler.java
+++ /dev/null
@@ -1,487 +0,0 @@
-//
-// Source code recreated from a .class file by IntelliJ IDEA
-// (powered by Fernflower decompiler)
-//
-
-package net.md_5.bungee.connection;
-
-import com.google.common.base.Charsets;
-import com.google.common.base.Preconditions;
-import com.google.gson.Gson;
-import java.beans.ConstructorProperties;
-import java.math.BigInteger;
-import java.net.InetSocketAddress;
-import java.net.URLEncoder;
-import java.security.MessageDigest;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import javax.crypto.SecretKey;
-import net.md_5.bungee.BungeeCipher;
-import net.md_5.bungee.BungeeCord;
-import net.md_5.bungee.BungeeServerInfo;
-import net.md_5.bungee.EncryptionUtil;
-import net.md_5.bungee.UserConnection;
-import net.md_5.bungee.Util;
-import net.md_5.bungee.api.AbstractReconnectHandler;
-import net.md_5.bungee.api.Callback;
-import net.md_5.bungee.api.ChatColor;
-import net.md_5.bungee.api.Favicon;
-import net.md_5.bungee.api.ProxyServer;
-import net.md_5.bungee.api.ServerPing;
-import net.md_5.bungee.api.ServerPing.PlayerInfo;
-import net.md_5.bungee.api.ServerPing.Players;
-import net.md_5.bungee.api.ServerPing.Protocol;
-import net.md_5.bungee.api.chat.BaseComponent;
-import net.md_5.bungee.api.chat.TextComponent;
-import net.md_5.bungee.api.config.ListenerInfo;
-import net.md_5.bungee.api.config.ServerInfo;
-import net.md_5.bungee.api.connection.PendingConnection;
-import net.md_5.bungee.api.connection.ProxiedPlayer;
-import net.md_5.bungee.api.event.LoginEvent;
-import net.md_5.bungee.api.event.PlayerHandshakeEvent;
-import net.md_5.bungee.api.event.PostLoginEvent;
-import net.md_5.bungee.api.event.PreLoginEvent;
-import net.md_5.bungee.api.event.ProxyPingEvent;
-import net.md_5.bungee.chat.ComponentSerializer;
-import net.md_5.bungee.http.HttpClient;
-import net.md_5.bungee.netty.ChannelWrapper;
-import net.md_5.bungee.netty.HandlerBoss;
-import net.md_5.bungee.netty.PacketHandler;
-import net.md_5.bungee.netty.cipher.CipherDecoder;
-import net.md_5.bungee.netty.cipher.CipherEncoder;
-import net.md_5.bungee.protocol.DefinedPacket;
-import net.md_5.bungee.protocol.packet.EncryptionRequest;
-import net.md_5.bungee.protocol.packet.EncryptionResponse;
-import net.md_5.bungee.protocol.packet.Handshake;
-import net.md_5.bungee.protocol.packet.Kick;
-import net.md_5.bungee.protocol.packet.LegacyHandshake;
-import net.md_5.bungee.protocol.packet.LegacyPing;
-import net.md_5.bungee.protocol.packet.LoginRequest;
-import net.md_5.bungee.protocol.packet.LoginSuccess;
-import net.md_5.bungee.protocol.packet.PingPacket;
-import net.md_5.bungee.protocol.packet.PluginMessage;
-import net.md_5.bungee.protocol.packet.StatusRequest;
-import net.md_5.bungee.protocol.packet.StatusResponse;
-
-public class InitialHandler extends PacketHandler implements PendingConnection {
-
- private static CustomMotdFactory _customMotdFactory;
-
- private PingPacket _pingPacket;
- private final ProxyServer bungee;
- private ChannelWrapper ch;
- private final ListenerInfo listener;
- private Handshake handshake;
- private LoginRequest loginRequest;
- private EncryptionRequest request;
- private final List registerMessages = new ArrayList();
- private InitialHandler.State thisState;
- private final Unsafe unsafe;
- private boolean onlineMode;
- private InetSocketAddress virtualHost;
- private UUID uniqueId;
- private UUID offlineId;
- private LoginResult loginProfile;
- private boolean legacy;
-
- public void connected(ChannelWrapper channel) throws Exception {
- this.ch = channel;
- }
-
- public void exception(Throwable t) throws Exception {
- this.disconnect((String)(ChatColor.RED + Util.exception(t)));
- }
-
- public void handle(PluginMessage pluginMessage) throws Exception {
- if(pluginMessage.getTag().equals("REGISTER")) {
- Preconditions.checkState(this.registerMessages.size() < 128, "Too many channels registered");
- this.registerMessages.add(pluginMessage);
- }
-
- }
-
- public void handle(LegacyHandshake legacyHandshake) throws Exception {
- this.legacy = true;
- this.ch.getHandle().writeAndFlush(this.bungee.getTranslation("outdated_client", new Object[0]));
- this.ch.close();
- }
-
- public void handle(LegacyPing ping) throws Exception {
- this.legacy = true;
- final boolean v1_5 = ping.isV1_5();
- ServerPing legacy = new ServerPing(new Protocol(this.bungee.getName() + " " + this.bungee.getGameVersion(), this.bungee.getProtocolVersion()), new Players(this.listener.getMaxPlayers(), this.bungee.getOnlineCount(), (PlayerInfo[])null), this.listener.getMotd(), (Favicon)null);
- Callback callback = new Callback() {
- public void done(ProxyPingEvent result, Throwable error) {
- if(!InitialHandler.this.ch.isClosed()) {
- ServerPing legacy = result.getResponse();
- String kickMessage;
- if(v1_5) {
- kickMessage = ChatColor.DARK_BLUE + "\u0000" + 127 + '\u0000' + legacy.getVersion().getName() + '\u0000' + InitialHandler.getFirstLine(legacy.getDescription()) + '\u0000' + legacy.getPlayers().getOnline() + '\u0000' + legacy.getPlayers().getMax();
- } else {
- kickMessage = ChatColor.stripColor(InitialHandler.getFirstLine(legacy.getDescription())) + '§' + legacy.getPlayers().getOnline() + '§' + legacy.getPlayers().getMax();
- }
-
- InitialHandler.this.ch.getHandle().writeAndFlush(kickMessage);
- InitialHandler.this.ch.close();
- }
- }
- };
- this.bungee.getPluginManager().callEvent(new ProxyPingEvent(this, legacy, callback));
- }
-
- private static String getFirstLine(String str) {
- int pos = str.indexOf(10);
- return pos == -1?str:str.substring(0, pos);
- }
-
- public void handle(StatusRequest statusRequest) throws Exception {
- Preconditions.checkState(this.thisState == InitialHandler.State.STATUS, "Not expecting STATUS");
- ServerInfo forced = AbstractReconnectHandler.getForcedHost(this);
- String motd = forced != null?forced.getMotd():this.listener.getMotd();
- Callback pingBack = new Callback() {
- public void done(ServerPing result, Throwable error) {
- if(error != null) {
- result = new ServerPing();
- result.setDescription(InitialHandler.this.bungee.getTranslation("ping_cannot_connect", new Object[0]));
- InitialHandler.this.bungee.getLogger().log(Level.WARNING, "Error pinging remote server", error);
- }
-
- Callback callback = new Callback() {
- public void done(ProxyPingEvent pingResult, Throwable error) {
- // MINEPLEX
- if (_customMotdFactory != null)
- {
- _customMotdFactory.makeMotd().handlePing(pingResult, InitialHandler.this);
- }
- else
- {
- BungeeCord.getInstance().getConnectionThrottle().unthrottle(InitialHandler.this.getAddress().getAddress());
- Gson gson = InitialHandler.this.handshake.getProtocolVersion() == 4?BungeeCord.getInstance().gsonLegacy:BungeeCord.getInstance().gson;
- InitialHandler.this.unsafe.sendPacket(new StatusResponse(gson.toJson(pingResult.getResponse())));
- }
- }
- };
- InitialHandler.this.bungee.getPluginManager().callEvent(new ProxyPingEvent(InitialHandler.this, result, callback));
- }
- };
- if(forced != null && this.listener.isPingPassthrough()) {
- ((BungeeServerInfo)forced).ping(pingBack, this.handshake.getProtocolVersion());
- } else {
- int protocol = net.md_5.bungee.protocol.Protocol.supportedVersions.contains(Integer.valueOf(this.handshake.getProtocolVersion()))?this.handshake.getProtocolVersion():this.bungee.getProtocolVersion();
- pingBack.done(new ServerPing(new Protocol(this.bungee.getName() + " " + this.bungee.getGameVersion(), protocol), new Players(this.listener.getMaxPlayers(), this.bungee.getOnlineCount(), (PlayerInfo[])null), motd, BungeeCord.getInstance().config.getFaviconObject()), (Throwable)null);
- }
-
- this.thisState = InitialHandler.State.PING;
- }
-
- public void handle(final PingPacket ping) throws Exception {
-
- _pingPacket = ping;
-// if (thisState == State.PING) return; // MINEPLEX
-// Preconditions.checkState(this.thisState == InitialHandler.State.PING, "Not expecting PING");
-// getChannelWrapper().getHandle().eventLoop().schedule(new Runnable()
-// {
-// @Override
-// public void run()
-// {
-// unsafe.sendPacket(ping);
-// }
-// }, 6, TimeUnit.SECONDS);
-//
-// this.unsafe.sendPacket(ping);
-// this.disconnect((String)"");
- }
-
- public void handle(Handshake handshake) throws Exception {
- Preconditions.checkState(this.thisState == InitialHandler.State.HANDSHAKE, "Not expecting HANDSHAKE");
- this.handshake = handshake;
- this.ch.setVersion(handshake.getProtocolVersion());
- if(handshake.getHost().endsWith(".")) {
- handshake.setHost(handshake.getHost().substring(0, handshake.getHost().length() - 1));
- }
-
- this.virtualHost = InetSocketAddress.createUnresolved(handshake.getHost(), handshake.getPort());
- this.bungee.getLogger().log(Level.INFO, "{0} has connected", this);
- this.bungee.getPluginManager().callEvent(new PlayerHandshakeEvent(this, handshake));
- switch(handshake.getRequestedProtocol()) {
- case 1:
- this.thisState = InitialHandler.State.STATUS;
- this.ch.setProtocol(net.md_5.bungee.protocol.Protocol.STATUS);
- break;
- case 2:
- this.thisState = InitialHandler.State.USERNAME;
- this.ch.setProtocol(net.md_5.bungee.protocol.Protocol.LOGIN);
- break;
- default:
- throw new IllegalArgumentException("Cannot request protocol " + handshake.getRequestedProtocol());
- }
-
- }
-
- public void handle(LoginRequest loginRequest) throws Exception {
- Preconditions.checkState(this.thisState == InitialHandler.State.USERNAME, "Not expecting USERNAME");
- this.loginRequest = loginRequest;
- if(!net.md_5.bungee.protocol.Protocol.supportedVersions.contains(Integer.valueOf(this.handshake.getProtocolVersion()))) {
- this.disconnect((String)this.bungee.getTranslation("outdated_server", new Object[0]));
- } else if(this.getName().contains(".")) {
- this.disconnect((String)this.bungee.getTranslation("name_invalid", new Object[0]));
- } else if(this.getName().length() > 16) {
- this.disconnect((String)this.bungee.getTranslation("name_too_long", new Object[0]));
- } else {
- int limit = BungeeCord.getInstance().config.getPlayerLimit();
- if(limit > 0 && this.bungee.getOnlineCount() > limit) {
- this.disconnect((String)this.bungee.getTranslation("proxy_full", new Object[0]));
- } else if(!this.isOnlineMode() && this.bungee.getPlayer(this.getName()) != null) {
- this.disconnect((String)this.bungee.getTranslation("already_connected", new Object[0]));
- } else {
- Callback callback = new Callback() {
- public void done(PreLoginEvent result, Throwable error) {
- if(result.isCancelled()) {
- InitialHandler.this.disconnect((String)result.getCancelReason());
- } else if(!InitialHandler.this.ch.isClosed()) {
- if(InitialHandler.this.onlineMode) {
- InitialHandler.this.unsafe().sendPacket(InitialHandler.this.request = EncryptionUtil.encryptRequest());
- } else {
- InitialHandler.this.finish();
- }
-
- InitialHandler.this.thisState = InitialHandler.State.ENCRYPT;
- }
- }
- };
- this.bungee.getPluginManager().callEvent(new PreLoginEvent(this, callback));
- }
- }
- }
-
- public void handle(EncryptionResponse encryptResponse) throws Exception {
- Preconditions.checkState(this.thisState == InitialHandler.State.ENCRYPT, "Not expecting ENCRYPT");
- SecretKey sharedKey = EncryptionUtil.getSecret(encryptResponse, this.request);
- BungeeCipher decrypt = EncryptionUtil.getCipher(false, sharedKey);
- this.ch.addBefore("frame-decoder", "decrypt", new CipherDecoder(decrypt));
- BungeeCipher encrypt = EncryptionUtil.getCipher(true, sharedKey);
- this.ch.addBefore("frame-prepender", "encrypt", new CipherEncoder(encrypt));
- String encName = URLEncoder.encode(this.getName(), "UTF-8");
- MessageDigest sha = MessageDigest.getInstance("SHA-1");
- byte[][] encodedHash = new byte[][]{this.request.getServerId().getBytes("ISO_8859_1"), sharedKey.getEncoded(), EncryptionUtil.keys.getPublic().getEncoded()};
- int authURL = encodedHash.length;
-
- for(int handler = 0; handler < authURL; ++handler) {
- byte[] bit = encodedHash[handler];
- sha.update(bit);
- }
-
- String var11 = URLEncoder.encode((new BigInteger(sha.digest())).toString(16), "UTF-8");
- String var12 = "https://sessionserver.mojang.com/session/minecraft/hasJoined?username=" + encName + "&serverId=" + var11;
- Callback var13 = new Callback() {
- public void done(String result, Throwable error) {
- if(error == null) {
- LoginResult obj = (LoginResult)BungeeCord.getInstance().gson.fromJson(result, LoginResult.class);
- if(obj != null) {
- InitialHandler.this.loginProfile = obj;
- InitialHandler.this.uniqueId = Util.getUUID(obj.getId());
- InitialHandler.this.finish();
- return;
- }
-
- InitialHandler.this.disconnect((String)"Not authenticated with Minecraft.net");
- } else {
- InitialHandler.this.disconnect((String)InitialHandler.this.bungee.getTranslation("mojang_fail", new Object[0]));
- InitialHandler.this.bungee.getLogger().log(Level.SEVERE, "Error authenticating " + InitialHandler.this.getName() + " with minecraft.net", error);
- }
-
- }
- };
- HttpClient.get(var12, this.ch.getHandle().eventLoop(), var13);
- }
-
- private void finish() {
- ProxiedPlayer old = this.bungee.getPlayer(this.getName());
- if(old != null) {
- old.disconnect(this.bungee.getTranslation("already_connected", new Object[0]));
- }
-
- this.offlineId = UUID.nameUUIDFromBytes(("OfflinePlayer:" + this.getName()).getBytes(Charsets.UTF_8));
- if(this.uniqueId == null) {
- this.uniqueId = this.offlineId;
- }
-
- Callback complete = new Callback() {
- public void done(LoginEvent result, Throwable error) {
- if(result.isCancelled()) {
- InitialHandler.this.disconnect((String)result.getCancelReason());
- } else if(!InitialHandler.this.ch.isClosed()) {
- InitialHandler.this.ch.getHandle().eventLoop().execute(new Runnable() {
- public void run() {
- if(InitialHandler.this.ch.getHandle().isActive()) {
- if(InitialHandler.this.getVersion() >= 5) {
- InitialHandler.this.unsafe.sendPacket(new LoginSuccess(InitialHandler.this.getUniqueId().toString(), InitialHandler.this.getName()));
- } else {
- InitialHandler.this.unsafe.sendPacket(new LoginSuccess(InitialHandler.this.getUUID(), InitialHandler.this.getName()));
- }
-
- InitialHandler.this.ch.setProtocol(net.md_5.bungee.protocol.Protocol.GAME);
- UserConnection userCon = new UserConnection(InitialHandler.this.bungee, InitialHandler.this.ch, InitialHandler.this.getName(), InitialHandler.this);
- userCon.init();
- InitialHandler.this.bungee.getPluginManager().callEvent(new PostLoginEvent(userCon));
- ((HandlerBoss)InitialHandler.this.ch.getHandle().pipeline().get(HandlerBoss.class)).setHandler(new UpstreamBridge(InitialHandler.this.bungee, userCon));
- ServerInfo server;
- if(InitialHandler.this.bungee.getReconnectHandler() != null) {
- server = InitialHandler.this.bungee.getReconnectHandler().getServer(userCon);
- } else {
- server = AbstractReconnectHandler.getForcedHost(InitialHandler.this);
- }
-
- if(server == null) {
- server = InitialHandler.this.bungee.getServerInfo(InitialHandler.this.listener.getDefaultServer());
- }
-
- userCon.connect(server, (Callback)null, true);
- InitialHandler.this.thisState = InitialHandler.State.FINISHED;
- }
-
- }
- });
- }
- }
- };
- this.bungee.getPluginManager().callEvent(new LoginEvent(this, complete));
- }
-
- public void disconnect(String reason) {
- this.disconnect((BaseComponent[])TextComponent.fromLegacyText(reason));
- }
-
- public void disconnect(final BaseComponent... reason) {
- if(!this.ch.isClosed()) {
- this.ch.getHandle().eventLoop().schedule(new Runnable() {
- public void run() {
- InitialHandler.this.unsafe().sendPacket(new Kick(ComponentSerializer.toString(reason)));
- InitialHandler.this.ch.close();
- }
- }, 500L, TimeUnit.MILLISECONDS);
- }
-
- }
-
- public void disconnect(BaseComponent reason) {
- this.disconnect((BaseComponent[])(new BaseComponent[]{reason}));
- }
-
- public String getName() {
- return this.loginRequest == null?null:this.loginRequest.getData();
- }
-
- public int getVersion() {
- return this.handshake == null?-1:this.handshake.getProtocolVersion();
- }
-
- public InetSocketAddress getAddress() {
- return (InetSocketAddress)this.ch.getHandle().remoteAddress();
- }
-
- public Unsafe unsafe() {
- return this.unsafe;
- }
-
- public void setOnlineMode(boolean onlineMode) {
- Preconditions.checkState(this.thisState == InitialHandler.State.USERNAME, "Can only set online mode status whilst state is username");
- this.onlineMode = onlineMode;
- }
-
- public String getUUID() {
- return this.uniqueId.toString().replaceAll("-", "");
- }
-
- public String toString() {
- return "[" + (this.getName() != null?this.getName():this.getAddress()) + "] <-> InitialHandler";
- }
-
- @ConstructorProperties({"bungee", "listener"})
- public InitialHandler(ProxyServer bungee, ListenerInfo listener) {
- this.thisState = InitialHandler.State.HANDSHAKE;
- this.unsafe = new Unsafe() {
- public void sendPacket(DefinedPacket packet) {
- InitialHandler.this.ch.write(packet);
- }
- };
- this.onlineMode = BungeeCord.getInstance().config.isOnlineMode();
- this.bungee = bungee;
- this.listener = listener;
- }
-
- public ListenerInfo getListener() {
- return this.listener;
- }
-
- public Handshake getHandshake() {
- return this.handshake;
- }
-
- public LoginRequest getLoginRequest() {
- return this.loginRequest;
- }
-
- public List getRegisterMessages() {
- return this.registerMessages;
- }
-
- public boolean isOnlineMode() {
- return this.onlineMode;
- }
-
- public InetSocketAddress getVirtualHost() {
- return this.virtualHost;
- }
-
- public UUID getUniqueId() {
- return this.uniqueId;
- }
-
- public UUID getOfflineId() {
- return this.offlineId;
- }
-
- public LoginResult getLoginProfile() {
- return this.loginProfile;
- }
-
- public boolean isLegacy() {
- return this.legacy;
- }
-
- public ChannelWrapper getChannelWrapper()
- {
- return ch; //MINEPLEX
- }
-
- public PingPacket getPingPacket()
- {
- return _pingPacket; // MINEPLEX
- }
-
- public void setPingPacket(PingPacket packet)
- {
- _pingPacket = packet;
- }
-
- private static enum State {
- HANDSHAKE,
- STATUS,
- PING,
- USERNAME,
- ENCRYPT,
- FINISHED;
-
- private State() {
- }
- }
-
- public static void setCustomMotdFactory(CustomMotdFactory factory)
- {
- _customMotdFactory = factory;
- }
-}
diff --git a/Plugins/Mineplex.Bungee.Mineplexer/src/net/md_5/bungee/connection/PingHandler.java b/Plugins/Mineplex.Bungee.Mineplexer/src/net/md_5/bungee/connection/PingHandler.java
deleted file mode 100644
index 5a13701b8..000000000
--- a/Plugins/Mineplex.Bungee.Mineplexer/src/net/md_5/bungee/connection/PingHandler.java
+++ /dev/null
@@ -1,59 +0,0 @@
-//
-// Source code recreated from a .class file by IntelliJ IDEA
-// (powered by Fernflower decompiler)
-//
-
-package net.md_5.bungee.connection;
-
-import com.google.gson.Gson;
-import net.md_5.bungee.BungeeCord;
-import net.md_5.bungee.api.Callback;
-import net.md_5.bungee.api.ProxyServer;
-import net.md_5.bungee.api.ServerPing;
-import net.md_5.bungee.api.config.ServerInfo;
-import net.md_5.bungee.netty.ChannelWrapper;
-import net.md_5.bungee.netty.PacketHandler;
-import net.md_5.bungee.protocol.MinecraftDecoder;
-import net.md_5.bungee.protocol.MinecraftEncoder;
-import net.md_5.bungee.protocol.Protocol;
-import net.md_5.bungee.protocol.packet.Handshake;
-import net.md_5.bungee.protocol.packet.StatusRequest;
-import net.md_5.bungee.protocol.packet.StatusResponse;
-
-public class PingHandler extends PacketHandler {
- private final ServerInfo target;
- private final Callback callback;
- private final int protocol;
- private ChannelWrapper channel;
-
- public void connected(ChannelWrapper channel) throws Exception {
- this.channel = channel;
- MinecraftEncoder encoder = new MinecraftEncoder(Protocol.HANDSHAKE, false, this.protocol);
- channel.getHandle().pipeline().addAfter("frame-decoder", "packet-decoder", new MinecraftDecoder(Protocol.STATUS, false, ProxyServer.getInstance().getProtocolVersion()));
- channel.getHandle().pipeline().addAfter("frame-prepender", "packet-encoder", encoder);
- channel.write(new Handshake(this.protocol, this.target.getAddress().getHostString(), this.target.getAddress().getPort(), 1));
- encoder.setProtocol(Protocol.STATUS);
- channel.write(new StatusRequest());
- }
-
- public void exception(Throwable t) throws Exception {
- this.callback.done(null, t);
- }
-
- public void handle(StatusResponse statusResponse) throws Exception {
- Gson gson = this.protocol == 4?BungeeCord.getInstance().gsonLegacy:BungeeCord.getInstance().gson;
- this.callback.done(gson.fromJson(statusResponse.getResponse(), ServerPing.class), (Throwable)null);
- System.out.println("handle");
-// this.channel.close(); //MINEPLEX
- }
-
- public String toString() {
- return "[Ping Handler] -> " + this.target.getName();
- }
-
- public PingHandler(ServerInfo target, Callback callback, int protocol) {
- this.target = target;
- this.callback = callback;
- this.protocol = protocol;
- }
-}
diff --git a/Plugins/Mineplex.BungeeRotator/.classpath b/Plugins/Mineplex.BungeeRotator/.classpath
index feffdd123..e26939c64 100644
--- a/Plugins/Mineplex.BungeeRotator/.classpath
+++ b/Plugins/Mineplex.BungeeRotator/.classpath
@@ -1,12 +1,13 @@
-
-
-
+
-
+
+
+
+
diff --git a/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/BungeeRepository.java b/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/BungeeRepository.java
deleted file mode 100644
index 6a172e1a2..000000000
--- a/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/BungeeRepository.java
+++ /dev/null
@@ -1,142 +0,0 @@
-package mineplex.bungee;
-
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.List;
-
-public class BungeeRepository
-{
- // Yip Yip actual IP because if null route happens we can't resolve the HOSTNAME DERP FACE DEFEK7!!! -defek7
- private String _connectionString = "jdbc:mysql://db.mineplex.com:3306/BungeeServers?autoReconnect=true&failOverReadOnly=false&maxReconnects=10";
- private String _userName = "root";
- private String _password = "tAbechAk3wR7tuTh";
-
- private static String CREATE_ONLINE_TABLE = "CREATE TABLE IF NOT EXISTS bungeeOnlineStatus (id INT NOT NULL AUTO_INCREMENT, address VARCHAR(40), online BOOLEAN NOT NULL DEFAULT 0, updated LONG, us BOOLEAN NOT NULL DEFAULT 1, lastOnline LONG, PRIMARY KEY (id), UNIQUE INDEX addressIndex(address));";
- private static String CREATE_PLAYER_TABLE = "CREATE TABLE IF NOT EXISTS BungeeServers (id INT NOT NULL AUTO_INCREMENT, address VARCHAR(256), updated LONG, players INT, maxPlayers INT, ram INT, maxRam INT, PRIMARY KEY (id));";
-
- private static String RETRIEVE_SERVERS_PLAYERCOUNTS = "SELECT bos.address, players, maxPlayers, BungeeServers.updated, bos.lastOnline, BungeeServers.US, now() FROM BungeeServers INNER JOIN bungeeOnlineStatus AS bos ON bos.address = BungeeServers.address WHERE TIME_TO_SEC(TIMEDIFF(now(), BungeeServers.updated)) < 15;";
-
- public void initialize()
- {
- Connection connection = null;
- PreparedStatement preparedStatement = null;
-
- try
- {
- connection = DriverManager.getConnection(_connectionString, _userName, _password);
-
- // Create table
- preparedStatement = connection.prepareStatement(CREATE_ONLINE_TABLE);
- preparedStatement.execute();
-
- preparedStatement.close();
-
- preparedStatement = connection.prepareStatement(CREATE_PLAYER_TABLE);
- preparedStatement.execute();
- }
- catch (Exception exception)
- {
- exception.printStackTrace();
- }
- finally
- {
- if (preparedStatement != null)
- {
- try
- {
- preparedStatement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
-
- if (connection != null)
- {
- try
- {
- connection.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
- }
-
- public List getBungeeServers()
- {
- List bungeeServers = new ArrayList();
- Connection connection = null;
- PreparedStatement preparedStatement = null;
- ResultSet resultSet = null;
-
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
- try
- {
- connection = DriverManager.getConnection(_connectionString, _userName, _password);
-
- preparedStatement = connection.prepareStatement(RETRIEVE_SERVERS_PLAYERCOUNTS);
-
- resultSet = preparedStatement.executeQuery();
-
- while (resultSet.next())
- {
- long current = dateFormat.parse(resultSet.getString(7)).getTime();
- long updated = dateFormat.parse(resultSet.getString(4)).getTime();
- long lastOnline = dateFormat.parse(resultSet.getString(5)).getTime();
-
- if (current - updated <= 15000 && current - lastOnline <= 300000)
- {
- BungeeServer server = new BungeeServer();
- server.Address = resultSet.getString(1).split(":")[0];
- server.Players = resultSet.getInt(2);
- server.MaxPlayers = resultSet.getInt(3);
- server.US = resultSet.getBoolean(6);
-
- bungeeServers.add(server);
- }
- }
- }
- catch (Exception exception)
- {
- exception.printStackTrace();
- }
- finally
- {
- if (preparedStatement != null)
- {
- try
- {
- preparedStatement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
-
- if (connection != null)
- {
- try
- {
- connection.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
-
- return bungeeServers;
- }
-}
diff --git a/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/BungeeRotator.java b/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/BungeeRotator.java
index 359087bbe..d08510506 100644
--- a/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/BungeeRotator.java
+++ b/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/BungeeRotator.java
@@ -1,8 +1,10 @@
package mineplex.bungee;
+import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
@@ -15,19 +17,28 @@ import java.util.logging.Logger;
import mineplex.bungee.api.ApiDeleteCall;
import mineplex.bungee.api.ApiGetCall;
import mineplex.bungee.api.ApiPostCall;
+import mineplex.bungee.api.HttpCallBase;
import mineplex.bungee.api.token.ARecord;
import mineplex.bungee.api.token.DnsRecord;
import mineplex.bungee.api.token.DomainRecords;
+import mineplex.serverdata.Region;
+import mineplex.serverdata.data.BungeeServer;
+import mineplex.serverdata.data.DataRepository;
+import mineplex.serverdata.redis.RedisDataRepository;
+import mineplex.serverdata.servers.ServerManager;
public class BungeeRotator
{
- private static BungeeRepository _repository = null;
+ private static DataRepository _repository;
+ private static PlayerStatsRepository _ipRepository;
+ //private static ServerRepository _repository = null;
private static SimpleDateFormat _dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
private static Logger _logger = Logger.getLogger("BungeeRotator");
+ private static boolean _debug = false;
public static void main(String args[])
- {
+ {
try
{
Class.forName("com.mysql.jdbc.Driver");
@@ -56,7 +67,13 @@ public class BungeeRotator
e1.printStackTrace();
}
- _repository = new BungeeRepository();
+ _debug = new File("debug.dat").exists();
+
+ _repository = new RedisDataRepository(ServerManager.getMasterConnection(), ServerManager.getSlaveConnection(),
+ Region.ALL, BungeeServer.class, "bungeeServers");
+
+ _ipRepository = new PlayerStatsRepository();
+
BungeeSorter bungeeSorter = new BungeeSorter();
int maxRecordCount = 10;
@@ -64,92 +81,156 @@ public class BungeeRotator
{
try
{
- List bungeeServers = _repository.getBungeeServers();
- HashSet usServers = new HashSet();
- HashSet euServers = new HashSet();
-
+ List bungeeServers = new ArrayList(_repository.getElements());
Collections.sort(bungeeServers, bungeeSorter);
-
- for (BungeeServer server : bungeeServers)
+
+ if (_debug)
{
- if (usServers.size() < maxRecordCount && server.US)
+ int totalPlayers = 0;
+ int usPlayers = 0;
+ int euPlayers = 0;
+
+ for (BungeeServer server : bungeeServers)
{
- if (usServers.size() >= 2 && server.Players > 900)
+ if (server.getPublicAddress().equalsIgnoreCase("127.0.0.1"))
continue;
- log("SELECTED " + server.Address + " " + (server.US ? "us" : "eu") + " " + server.Players + "/" + server.MaxPlayers);
- usServers.add(server.Address);
- }
- else if (euServers.size() < maxRecordCount && !server.US)
- {
- if (euServers.size() >= 2 && server.Players > 900)
- continue;
+ totalPlayers += server.getPlayerCount();
- log("SELECTED " + server.Address + " " + (server.US ? "us" : "eu") + " " + server.Players + "/" + server.MaxPlayers);
- euServers.add(server.Address);
+ if (server.getRegion() == Region.US)
+ usPlayers += server.getPlayerCount();
+ else
+ euPlayers += server.getPlayerCount();
+
+ System.out.println(server.getRegion().toString() + " " + server.getPublicAddress() + " " + server.getPlayerCount() + "/" + server.getPlayerCount());
}
+
+ System.out.println("US Players : " + usPlayers);
+ System.out.println("EU Players : " + euPlayers);
+ System.out.println("Total Players : " + totalPlayers);
+ System.out.println("Count : " + bungeeServers.size());
}
-
- DomainRecords records = new ApiGetCall("https://api.dnsmadeeasy.com/V2.0/dns/managed/", 962728,
- "/records", "").Execute(DomainRecords.class);
- List recordsToDelete = new ArrayList();
- List recordsToAdd = new ArrayList();
-
- for (DnsRecord record : records.data)
+ else
{
- if (record.type.equalsIgnoreCase("A"))
+ HashSet usServers = new HashSet();
+ HashSet euServers = new HashSet();
+
+
+ for (BungeeServer server : bungeeServers)
{
- if (record.name.equalsIgnoreCase("us"))
+ if (server.getPublicAddress().equalsIgnoreCase("127.0.0.1"))
+ continue;
+
+ if (usServers.size() < maxRecordCount && server.getRegion() == Region.US)
{
- if (usServers.contains(record.value))
- usServers.remove(record.value);
- else
- recordsToDelete.add(record);
+ if (usServers.size() >= 2 && server.getPlayerCount() > 900)
+ continue;
+
+ log("SELECTED " + server.getPublicAddress() + " " + (server.getRegion() == Region.US ? "us" : "eu") + " " + server.getPlayerCount() + "/" + server.getPlayerCount());
+ usServers.add(server.getPublicAddress());
}
- else if (record.name.equalsIgnoreCase("eu"))
+ else if (euServers.size() < maxRecordCount && server.getRegion() != Region.US)
{
- if (euServers.contains(record.value))
- euServers.remove(record.value);
- else
- recordsToDelete.add(record);
+ if (euServers.size() >= 2 && server.getPlayerCount() > 900)
+ continue;
+
+ log("SELECTED " + server.getPublicAddress() + " " + (server.getRegion() == Region.US ? "us" : "eu") + " " + server.getPlayerCount() + "/" + server.getPlayerCount());
+ euServers.add(server.getPublicAddress());
}
}
+
+ DomainRecords records = new ApiGetCall("https://api.dnsmadeeasy.com/V2.0/dns/managed/", 962728,
+ "/records", "").Execute(DomainRecords.class);
+ List recordsToDelete = new ArrayList();
+ List recordsToAdd = new ArrayList();
+
+ for (DnsRecord record : records.data)
+ {
+ if (record.type.equalsIgnoreCase("A"))
+ {
+ if (record.name.equalsIgnoreCase("us"))
+ {
+ if (usServers.contains(record.value))
+ usServers.remove(record.value);
+ else
+ recordsToDelete.add(record);
+ }
+ else if (record.name.equalsIgnoreCase("eu"))
+ {
+ if (euServers.contains(record.value))
+ euServers.remove(record.value);
+ else
+ recordsToDelete.add(record);
+ }
+ }
+ }
+
+ for (String address : usServers)
+ {
+ recordsToAdd.add(new ARecord("us", address, 300));
+ log("Adding server address in DNS : " + "us " + address);
+ }
+
+ if (recordsToAdd.size() > 0)
+ {
+ new ApiPostCall("https://api.dnsmadeeasy.com/V2.0/dns/managed/", 962728, "/records/", "createMulti").Execute(recordsToAdd);
+ log("Created " + recordsToAdd.size() + " records.");
+ }
+
+ recordsToAdd.clear();
+
+ for (String address : euServers)
+ {
+ recordsToAdd.add(new ARecord("eu", address, 300));
+ log("Adding server address in DNS : " + "eu " + address);
+ }
+
+ if (recordsToAdd.size() > 0)
+ {
+ new ApiPostCall("https://api.dnsmadeeasy.com/V2.0/dns/managed/", 962728, "/records/", "createMulti").Execute(recordsToAdd);
+ log("Created " + recordsToAdd.size() + " records.");
+ }
+ recordsToAdd.clear();
+
+
+ if (recordsToDelete.size() > 0)
+ {
+ StringBuilder idBuilder = new StringBuilder();
+
+ for (DnsRecord record : recordsToDelete)
+ {
+ if (idBuilder.length() != 0)
+ idBuilder.append("&");
+
+ idBuilder.append("ids=" + record.id);
+ }
+
+ new ApiDeleteCall("https://api.dnsmadeeasy.com/V2.0/dns/managed/", 962728, "/records?" + idBuilder.toString()).Execute();
+ log("Deleted " + recordsToDelete.size() + " records.");
+ }
}
- for (String address : usServers)
+ List updatedAddresses = new ArrayList(1000);
+
+ for (IpInfo ipInfo : _ipRepository.getIpAddresses())
{
- recordsToAdd.add(new ARecord("us", address, 300));
- log("Addding server address in DNS : " + "us " + address);
+ IPGeoData recor = new HttpCallBase("http://www.freegeoip.net/json/" + ipInfo.ipAddress).Execute(IPGeoData.class);
+ ipInfo.countryCode = recor.country_code;
+ ipInfo.countryName = recor.country_name;
+ ipInfo.regionCode = recor.region_code;
+ ipInfo.regionName = recor.region_name;
+ ipInfo.city = recor.city;
+ ipInfo.zipCode = recor.zip_code;
+ ipInfo.timeZone = recor.time_zone;
+ ipInfo.latitude = recor.latitude;
+ ipInfo.longitude = recor.longitude;
+ ipInfo.metroCode = recor.metro_code;
+
+ updatedAddresses.add(ipInfo);
}
- for (String address : euServers)
- {
- recordsToAdd.add(new ARecord("eu", address, 300));
- log("Addding server address in DNS : " + "eu " + address);
- }
-
- if (recordsToAdd.size() > 0)
- {
- new ApiPostCall("https://api.dnsmadeeasy.com/V2.0/dns/managed/", 962728, "/records/", "createMulti").Execute(recordsToAdd);
- log("Created " + recordsToAdd.size() + " records.");
- }
-
- if (recordsToDelete.size() > 0)
- {
- StringBuilder idBuilder = new StringBuilder();
-
- for (DnsRecord record : recordsToDelete)
- {
- if (idBuilder.length() != 0)
- idBuilder.append("&");
-
- idBuilder.append("ids=" + record.id);
- }
-
- new ApiDeleteCall("https://api.dnsmadeeasy.com/V2.0/dns/managed/", 962728, "/records?" + idBuilder.toString()).Execute();
- log("Deleted " + recordsToDelete.size() + " records.");
- }
-
+ _ipRepository.updateIps(updatedAddresses);
+
try
{
Thread.sleep(15000);
@@ -162,6 +243,7 @@ public class BungeeRotator
}
catch (Exception ex)
{
+ ex.printStackTrace();
log("Error doing something : " + ex.getMessage());
try
diff --git a/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/BungeeServer.java b/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/BungeeServer.java
deleted file mode 100644
index dc56124f8..000000000
--- a/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/BungeeServer.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package mineplex.bungee;
-
-public class BungeeServer
-{
- public String Address;
- public int Players;
- public int MaxPlayers;
- public boolean US;
-}
diff --git a/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/BungeeSorter.java b/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/BungeeSorter.java
index c42f31f04..4bcdf55d7 100644
--- a/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/BungeeSorter.java
+++ b/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/BungeeSorter.java
@@ -2,14 +2,16 @@ package mineplex.bungee;
import java.util.Comparator;
+import mineplex.serverdata.data.BungeeServer;
+
public class BungeeSorter implements Comparator
{
public int compare(BungeeServer a, BungeeServer b)
{
- if (a.Players < b.Players)
+ if (a.getPlayerCount() < b.getPlayerCount())
return -1;
- if (b.Players < a.Players)
+ if (b.getPlayerCount() < a.getPlayerCount())
return 1;
return 0;
diff --git a/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/IPGeoData.java b/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/IPGeoData.java
new file mode 100644
index 000000000..9988f681c
--- /dev/null
+++ b/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/IPGeoData.java
@@ -0,0 +1,16 @@
+package mineplex.bungee;
+
+public class IPGeoData
+{
+ public String ip;
+ public String country_code;
+ public String country_name;
+ public String region_code;
+ public String region_name;
+ public String city;
+ public String zip_code;
+ public String time_zone;
+ public double latitude;
+ public double longitude;
+ public int metro_code;
+}
diff --git a/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/IpInfo.java b/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/IpInfo.java
new file mode 100644
index 000000000..44ad87a97
--- /dev/null
+++ b/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/IpInfo.java
@@ -0,0 +1,17 @@
+package mineplex.bungee;
+
+public class IpInfo
+{
+ public int id;
+ public String ipAddress;
+ public String countryCode;
+ public String countryName;
+ public String regionCode;
+ public String regionName;
+ public String city;
+ public String zipCode;
+ public String timeZone;
+ public double latitude;
+ public double longitude;
+ public int metroCode;
+}
diff --git a/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/PlayerStatsRepository.java b/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/PlayerStatsRepository.java
new file mode 100644
index 000000000..f5b298ae9
--- /dev/null
+++ b/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/PlayerStatsRepository.java
@@ -0,0 +1,146 @@
+package mineplex.bungee;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class PlayerStatsRepository
+{
+ private Connection _connection = null;
+ private String _connectionString = "jdbc:mysql://sqlstats.mineplex.com:3306/PlayerStats?autoReconnect=true&failOverReadOnly=false&maxReconnects=10&allowMultiQueries=true";
+ private String _userName = "root";
+ private String _password = "tAbechAk3wR7tuTh";
+
+ private static String SELECT_IPINFO = "SELECT id, ipAddress FROM ipInfo WHERE regionName IS NULL LIMIT 1000;";
+ private static String UPDATE_IPINFO = "UPDATE ipInfo SET countryCode = ?, countryName = ?, regionCode = ?, regionName = ?, city = ?, zipCode = ?, timeZone = ?, latitude = ?, longitude = ?, metroCode = ? WHERE id = ?;";
+
+ public void initialize()
+ {
+ try
+ {
+ if (_connection == null || _connection.isClosed())
+ _connection = DriverManager.getConnection(_connectionString, _userName, _password);
+ }
+ catch (Exception exception)
+ {
+ exception.printStackTrace();
+ }
+
+ System.out.println("Initialized PlayerStats.");
+ }
+
+ public List getIpAddresses()
+ {
+ List ipinfos = new ArrayList(1000);
+ PreparedStatement preparedStatement = null;
+ ResultSet resultSet = null;
+
+ try
+ {
+ if (_connection == null || _connection.isClosed())
+ _connection = DriverManager.getConnection(_connectionString, _userName, _password);
+
+ preparedStatement = _connection.prepareStatement(SELECT_IPINFO);
+
+ resultSet = preparedStatement.executeQuery();
+
+ while (resultSet.next())
+ {
+ IpInfo ipInfo = new IpInfo();
+ ipInfo.id = resultSet.getInt(1);
+ ipInfo.ipAddress = resultSet.getString(2);
+
+ ipinfos.add(ipInfo);
+ }
+
+ resultSet.close();
+ preparedStatement.close();
+ }
+ catch (Exception exception)
+ {
+ exception.printStackTrace();
+ }
+ finally
+ {
+ if (preparedStatement != null)
+ {
+ try
+ {
+ preparedStatement.close();
+ }
+ catch (SQLException e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ if (resultSet != null)
+ {
+ try
+ {
+ resultSet.close();
+ }
+ catch (SQLException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ return ipinfos;
+ }
+
+ public void updateIps(List ips)
+ {
+ PreparedStatement preparedStatement = null;
+
+ try
+ {
+ if (_connection == null || _connection.isClosed())
+ _connection = DriverManager.getConnection(_connectionString, _userName, _password);
+
+ preparedStatement = _connection.prepareStatement(UPDATE_IPINFO);
+
+ for (IpInfo ipInfo : ips)
+ {
+ preparedStatement.setString(1, ipInfo.countryCode);
+ preparedStatement.setString(2, ipInfo.countryName);
+ preparedStatement.setString(3, ipInfo.regionCode);
+ preparedStatement.setString(4, ipInfo.regionName);
+ preparedStatement.setString(5, ipInfo.city);
+ preparedStatement.setString(6, ipInfo.zipCode);
+ preparedStatement.setString(7, ipInfo.timeZone);
+ preparedStatement.setDouble(8, ipInfo.latitude);
+ preparedStatement.setDouble(9, ipInfo.longitude);
+ preparedStatement.setInt(10, ipInfo.metroCode);
+ preparedStatement.setInt(11, ipInfo.id);
+
+ preparedStatement.addBatch();
+ }
+
+ preparedStatement.executeBatch();
+ }
+ catch (Exception exception)
+ {
+ exception.printStackTrace();
+ }
+ finally
+ {
+ if (preparedStatement != null)
+ {
+ try
+ {
+ preparedStatement.close();
+ }
+ catch (SQLException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+}
diff --git a/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/api/DnsMadeEasyApiCallBase.java b/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/api/DnsMadeEasyApiCallBase.java
index 87ade774a..f4e7aac72 100644
--- a/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/api/DnsMadeEasyApiCallBase.java
+++ b/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/api/DnsMadeEasyApiCallBase.java
@@ -51,13 +51,13 @@ public abstract class DnsMadeEasyApiCallBase
try
{
String timeStamp = getServerTime();
- SecretKeySpec keySpec = new SecretKeySpec("8c9af8cc-d306-4df3-8de8-944deafa8239".getBytes(), "HmacSHA1");
+ SecretKeySpec keySpec = new SecretKeySpec("35bb3b97-3815-4b63-b60b-eb1882c07b40".getBytes(), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(keySpec);
byte[] hashBytes = mac.doFinal((timeStamp + "").getBytes());
Hex.encodeHexString(hashBytes);
- request.addHeader("x-dnsme-apiKey", "610e21ee-4250-4b55-b637-a1fcc3847850");
+ request.addHeader("x-dnsme-apiKey", "a9750980-b7df-4a7e-a047-2ade43628f0d");
request.addHeader("x-dnsme-requestDate", timeStamp + "");
request.addHeader("x-dnsme-hmac", Hex.encodeHexString(hashBytes));
request.addHeader("Content-Type", "application/json");
diff --git a/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/api/HttpCallBase.java b/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/api/HttpCallBase.java
new file mode 100644
index 000000000..d4e7b83b0
--- /dev/null
+++ b/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/api/HttpCallBase.java
@@ -0,0 +1,122 @@
+package mineplex.bungee.api;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.reflect.Type;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.conn.scheme.PlainSocketFactory;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.scheme.SchemeRegistry;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.conn.PoolingClientConnectionManager;
+
+import com.google.gson.Gson;
+
+public class HttpCallBase
+{
+ private String _url;
+
+ public HttpCallBase(String url)
+ {
+ _url = url;
+ }
+
+ public T Execute(Type returnType)
+ {
+ HttpGet request = new HttpGet(_url);
+
+ String response = execute(request);
+ System.out.println(response);
+ return new Gson().fromJson(response, returnType);
+ }
+
+ protected String execute(HttpRequestBase request)
+ {
+ SchemeRegistry schemeRegistry = new SchemeRegistry();
+ schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));
+
+ PoolingClientConnectionManager connectionManager = new PoolingClientConnectionManager(schemeRegistry);
+ connectionManager.setMaxTotal(200);
+ connectionManager.setDefaultMaxPerRoute(20);
+
+ HttpClient httpClient = new DefaultHttpClient(connectionManager);
+ InputStream in = null;
+ String response = "";
+
+ try
+ {
+ request.addHeader("Content-Type", "application/json");
+ HttpResponse httpResponse = httpClient.execute(request);
+
+ if (httpResponse != null)
+ {
+ in = httpResponse.getEntity().getContent();
+ response = convertStreamToString(in);
+ }
+ }
+ catch (Exception ex)
+ {
+ System.out.println("HttpCall Error:\n" + ex.getMessage());
+
+ for (StackTraceElement trace : ex.getStackTrace())
+ {
+ System.out.println(trace);
+ }
+ }
+ finally
+ {
+ httpClient.getConnectionManager().shutdown();
+
+ if (in != null)
+ {
+ try
+ {
+ in.close();
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ return response;
+ }
+
+ protected String convertStreamToString(InputStream is)
+ {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+ StringBuilder sb = new StringBuilder();
+
+ String line = null;
+ try
+ {
+ while ((line = reader.readLine()) != null)
+ {
+ sb.append(line + "\n");
+ }
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+ finally
+ {
+ try
+ {
+ is.close();
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ return sb.toString();
+ }
+}
diff --git a/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/api/token/DnsRecord.java b/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/api/token/DnsRecord.java
index a4d50c840..469b600be 100644
--- a/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/api/token/DnsRecord.java
+++ b/Plugins/Mineplex.BungeeRotator/src/mineplex/bungee/api/token/DnsRecord.java
@@ -6,6 +6,6 @@ public class DnsRecord
public String name;
public String type;
public String value;
- public String gtdLocation;
+ public String gtdLocation = "DEFAULT";
public int ttl;
}
diff --git a/Plugins/Mineplex.ChestConverter/.classpath b/Plugins/Mineplex.ChestConverter/.classpath
new file mode 100644
index 000000000..49e473eb4
--- /dev/null
+++ b/Plugins/Mineplex.ChestConverter/.classpath
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Plugins/Mineplex.ChestConverter/.externalToolBuilders/Chest.launch b/Plugins/Mineplex.ChestConverter/.externalToolBuilders/Chest.launch
new file mode 100644
index 000000000..ecc42cfd7
--- /dev/null
+++ b/Plugins/Mineplex.ChestConverter/.externalToolBuilders/Chest.launch
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Plugins/Mineplex.ChestConverter/.externalToolBuilders/New_Builder.launch b/Plugins/Mineplex.ChestConverter/.externalToolBuilders/New_Builder.launch
new file mode 100644
index 000000000..0c6e0f696
--- /dev/null
+++ b/Plugins/Mineplex.ChestConverter/.externalToolBuilders/New_Builder.launch
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Plugins/Mineplex.ChestConverter/.externalToolBuilders/ServerMonitor.launch b/Plugins/Mineplex.ChestConverter/.externalToolBuilders/ServerMonitor.launch
new file mode 100644
index 000000000..0c6e0f696
--- /dev/null
+++ b/Plugins/Mineplex.ChestConverter/.externalToolBuilders/ServerMonitor.launch
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Plugins/Mineplex.ChestConverter/.project b/Plugins/Mineplex.ChestConverter/.project
new file mode 100644
index 000000000..d1d373e2c
--- /dev/null
+++ b/Plugins/Mineplex.ChestConverter/.project
@@ -0,0 +1,37 @@
+
+
+ Mineplex.ChestConverter
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.ui.externaltools.ExternalToolBuilder
+ auto,full,incremental,
+
+
+ LaunchConfigHandle
+ <project>/.externalToolBuilders/ServerMonitor.launch
+
+
+
+
+ org.eclipse.ui.externaltools.ExternalToolBuilder
+ auto,full,incremental,
+
+
+ LaunchConfigHandle
+ <project>/.externalToolBuilders/Chest.launch
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/Plugins/Mineplex.ChestConverter/.settings/org.eclipse.core.resources.prefs b/Plugins/Mineplex.ChestConverter/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 000000000..99f26c020
--- /dev/null
+++ b/Plugins/Mineplex.ChestConverter/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/=UTF-8
diff --git a/Plugins/Mineplex.ChestConverter/.settings/org.eclipse.jdt.core.prefs b/Plugins/Mineplex.ChestConverter/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 000000000..7341ab168
--- /dev/null
+++ b/Plugins/Mineplex.ChestConverter/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.7
diff --git a/Plugins/Mineplex.ChestConverter/Mineplex.ServerMonitor.iml b/Plugins/Mineplex.ChestConverter/Mineplex.ServerMonitor.iml
new file mode 100644
index 000000000..53e69d8e1
--- /dev/null
+++ b/Plugins/Mineplex.ChestConverter/Mineplex.ServerMonitor.iml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Plugins/Mineplex.ChestConverter/src/mineplex/chestConverter/ChestConverter.java b/Plugins/Mineplex.ChestConverter/src/mineplex/chestConverter/ChestConverter.java
new file mode 100644
index 000000000..a9ddea664
--- /dev/null
+++ b/Plugins/Mineplex.ChestConverter/src/mineplex/chestConverter/ChestConverter.java
@@ -0,0 +1,46 @@
+package mineplex.chestConverter;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.logging.Logger;
+
+public class ChestConverter
+{
+ private static ChestConverterRepository _repository = null;
+ private static SimpleDateFormat _dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
+
+ public static void main (String args[])
+ {
+ _repository = new ChestConverterRepository();
+ int count = 5000;
+
+ while (true)
+ {
+ long time = System.currentTimeMillis();
+ HashMap playerMap = _repository.retrieveKeyInventoryBatch(count);
+
+ if (playerMap.size() == 0)
+ return;
+
+ _repository.incrementClient(playerMap, false);
+ _repository.deleteKeys(count);
+ try
+ {
+ log("Natural sleep. " + count + " took " + (System.currentTimeMillis() - time) / 1000 + " seconds.");
+ Thread.sleep(250);
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace();
+ }
+
+ break;
+ }
+ }
+
+ private static void log(String message)
+ {
+ System.out.println("[" + _dateFormat.format(new Date()) + "] " + message);
+ }
+}
diff --git a/Plugins/Mineplex.ChestConverter/src/mineplex/chestConverter/ChestConverterRepository.java b/Plugins/Mineplex.ChestConverter/src/mineplex/chestConverter/ChestConverterRepository.java
new file mode 100644
index 000000000..0970b1b4e
--- /dev/null
+++ b/Plugins/Mineplex.ChestConverter/src/mineplex/chestConverter/ChestConverterRepository.java
@@ -0,0 +1,316 @@
+package mineplex.chestConverter;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Map.Entry;
+
+public class ChestConverterRepository
+{
+ private String _connectionString = "jdbc:mysql://db.mineplex.com:3306/Account";
+ private String _userName = "root";
+ private String _password = "tAbechAk3wR7tuTh";
+
+ private static String RETRIEVE_CHESTS = "SELECT A.uuid, count FROM accountInventory INNER JOIN accounts AS A ON A.id = accountInventory.accountId WHERE itemId = 56 AND count > 0 ORDER BY accountInventory.id LIMIT ?;";
+ private static String RETRIEVE_KEYS = "SELECT A.uuid, count FROM accountInventory INNER JOIN accounts AS A ON A.id = accountInventory.accountId WHERE itemId = 67 AND count > 0 ORDER BY accountInventory.id LIMIT ?;";
+
+ private static String DELETE_CHESTS = "DELETE FROM accountInventory WHERE itemId = 56 ORDER BY accountInventory.id LIMIT ?";
+ private static String DELETE_KEYS = "DELETE FROM accountInventory WHERE itemId = 67 ORDER BY accountInventory.id LIMIT ?";
+
+ private static String INSERT_CLIENT_INVENTORY = "INSERT INTO accountInventory (accountId, itemId, count) SELECT accounts.id, ?, ? FROM accounts WHERE accounts.uuid = ? ON DUPLICATE KEY UPDATE count=count + VALUES(count);";
+ private static String UPDATE_CLIENT_INVENTORY = "UPDATE accountInventory AS AI INNER JOIN accounts ON AI.accountId = accounts.id SET AI.count = AI.count + ? WHERE accounts.uuid = ? AND AI.itemId = ?;";
+
+ private static Connection _connection;
+
+ public ChestConverterRepository()
+ {
+ PreparedStatement preparedStatement = null;
+
+ try
+ {
+ Class.forName("com.mysql.jdbc.Driver");
+
+ if (_connection == null || _connection.isClosed())
+ _connection = DriverManager.getConnection(_connectionString, _userName, _password);
+ }
+ catch (Exception exception)
+ {
+ exception.printStackTrace();
+ }
+ finally
+ {
+ if (preparedStatement != null)
+ {
+ try
+ {
+ preparedStatement.close();
+ }
+ catch (SQLException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ public HashMap retrieveChestInventoryBatch(int count)
+ {
+ HashMap playerList = new HashMap();
+
+ PreparedStatement preparedStatement = null;
+
+ try
+ {
+ if (_connection == null || _connection.isClosed())
+ _connection = DriverManager.getConnection(_connectionString, _userName, _password);
+
+ preparedStatement = _connection.prepareStatement(RETRIEVE_CHESTS);
+ preparedStatement.setInt(1, count);
+ ResultSet resultSet = preparedStatement.executeQuery();
+
+ while (resultSet.next())
+ {
+ playerList.put(resultSet.getString(1), resultSet.getInt(2));
+ }
+ }
+ catch (Exception exception)
+ {
+ exception.printStackTrace();
+ }
+ finally
+ {
+ if (preparedStatement != null)
+ {
+ try
+ {
+ preparedStatement.close();
+ }
+ catch (SQLException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ return playerList;
+ }
+
+ public HashMap retrieveKeyInventoryBatch(int count)
+ {
+ HashMap playerList = new HashMap();
+
+ PreparedStatement preparedStatement = null;
+
+ try
+ {
+ if (_connection == null || _connection.isClosed())
+ _connection = DriverManager.getConnection(_connectionString, _userName, _password);
+
+ preparedStatement = _connection.prepareStatement(RETRIEVE_KEYS);
+ preparedStatement.setInt(1, count);
+ ResultSet resultSet = preparedStatement.executeQuery();
+
+ while (resultSet.next())
+ {
+ playerList.put(resultSet.getString(1), resultSet.getInt(2));
+ }
+ }
+ catch (Exception exception)
+ {
+ exception.printStackTrace();
+ }
+ finally
+ {
+ if (preparedStatement != null)
+ {
+ try
+ {
+ preparedStatement.close();
+ }
+ catch (SQLException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ return playerList;
+ }
+
+ public void incrementClient(HashMap playerList, boolean chest)
+ {
+ PreparedStatement preparedStatement = null;
+
+ try
+ {
+ if (_connection == null || _connection.isClosed())
+ _connection = DriverManager.getConnection(_connectionString, _userName, _password);
+
+ preparedStatement = _connection.prepareStatement(UPDATE_CLIENT_INVENTORY);
+
+ for (Entry entry : playerList.entrySet())
+ {
+ preparedStatement.setInt(1, entry.getValue());
+ preparedStatement.setString(2, entry.getKey());
+ preparedStatement.setInt(3, chest ? 690 : 692);
+
+ preparedStatement.addBatch();
+
+ if (chest)
+ {
+ if (entry.getValue() > 20)
+ {
+ preparedStatement.setInt(1, 1);
+ preparedStatement.setString(2, entry.getKey());
+ preparedStatement.setInt(3, 692);
+
+ preparedStatement.addBatch();
+ }
+
+ if (entry.getValue() > 50)
+ {
+ preparedStatement.setInt(1, 1);
+ preparedStatement.setString(2, entry.getKey());
+ preparedStatement.setInt(3, 691);
+
+ preparedStatement.addBatch();
+ }
+ }
+ }
+
+ int[] rowsAffected = preparedStatement.executeBatch();
+ int i = 0;
+
+ preparedStatement.close();
+ preparedStatement = _connection.prepareStatement(INSERT_CLIENT_INVENTORY);
+
+ for (Entry entry : playerList.entrySet())
+ {
+ if (rowsAffected[i] < 1)
+ {
+ preparedStatement.setInt(1, chest ? 690 : 692);
+ preparedStatement.setInt(2, entry.getValue());
+ preparedStatement.setString(3, entry.getKey());
+
+ preparedStatement.addBatch();
+
+ if (chest)
+ {
+ if (entry.getValue() > 20)
+ {
+ preparedStatement.setInt(1, 692);
+ preparedStatement.setInt(2, 1);
+ preparedStatement.setString(3, entry.getKey());
+
+ preparedStatement.addBatch();
+ }
+
+ if (entry.getValue() > 50)
+ {
+ preparedStatement.setInt(1, 691);
+ preparedStatement.setInt(2, 1);
+ preparedStatement.setString(3, entry.getKey());
+
+ preparedStatement.addBatch();
+ }
+ }
+ }
+
+ i++;
+ }
+
+ preparedStatement.executeBatch();
+ }
+ catch (Exception exception)
+ {
+ exception.printStackTrace();
+ }
+ finally
+ {
+ if (preparedStatement != null)
+ {
+ try
+ {
+ preparedStatement.close();
+ }
+ catch (SQLException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ public void deleteChests(int count)
+ {
+ PreparedStatement preparedStatement = null;
+
+ try
+ {
+ if (_connection == null || _connection.isClosed())
+ _connection = DriverManager.getConnection(_connectionString, _userName, _password);
+
+ preparedStatement = _connection.prepareStatement(DELETE_CHESTS);
+ preparedStatement.setInt(1, count);
+ preparedStatement.executeUpdate();
+
+ System.out.println("Deleting " + count + " inventory records.");
+ }
+ catch (Exception exception)
+ {
+ exception.printStackTrace();
+ }
+ finally
+ {
+ if (preparedStatement != null)
+ {
+ try
+ {
+ preparedStatement.close();
+ }
+ catch (SQLException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ public void deleteKeys(int count)
+ {
+ PreparedStatement preparedStatement = null;
+
+ try
+ {
+ if (_connection == null || _connection.isClosed())
+ _connection = DriverManager.getConnection(_connectionString, _userName, _password);
+
+ preparedStatement = _connection.prepareStatement(DELETE_KEYS);
+ preparedStatement.setInt(1, count);
+ preparedStatement.executeUpdate();
+
+ System.out.println("Deleting " + count + " inventory records.");
+ }
+ catch (Exception exception)
+ {
+ exception.printStackTrace();
+ }
+ finally
+ {
+ if (preparedStatement != null)
+ {
+ try
+ {
+ preparedStatement.close();
+ }
+ catch (SQLException e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+}
diff --git a/Plugins/Mineplex.ChestConverter/src/mineplex/chestConverter/GenericRunnable.java b/Plugins/Mineplex.ChestConverter/src/mineplex/chestConverter/GenericRunnable.java
new file mode 100644
index 000000000..987c74db4
--- /dev/null
+++ b/Plugins/Mineplex.ChestConverter/src/mineplex/chestConverter/GenericRunnable.java
@@ -0,0 +1,6 @@
+package mineplex.chestConverter;
+
+public interface GenericRunnable
+{
+ void run(T t);
+}
diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java
index 1057b9b0d..790cae05c 100644
--- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java
+++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Rank.java
@@ -14,12 +14,15 @@ public enum Rank
SNR_MODERATOR("Sr.Mod", ChatColor.GOLD),
MODERATOR("Mod", ChatColor.GOLD),
HELPER("Helper", ChatColor.DARK_AQUA),
- MAPDEV("Mapper", ChatColor.BLUE),
- MAPLEAD("MapKing", ChatColor.DARK_PURPLE),
+ MAPDEV("Builder", ChatColor.BLUE),
+ MAPLEAD("MapLead", ChatColor.DARK_PURPLE),
+
+ EVENT("Event", ChatColor.WHITE),
//Staff ^^
YOUTUBE("YouTube", ChatColor.RED),
+ TWITCH("Twitch", ChatColor.DARK_PURPLE),
LEGEND("Legend", ChatColor.GREEN),
HERO("Hero", ChatColor.LIGHT_PURPLE),
ULTRA("Ultra", ChatColor.AQUA),
diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/F.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/F.java
index 90458fcfa..a387ba46a 100644
--- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/F.java
+++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/F.java
@@ -134,6 +134,13 @@ public class F
if (on) return indent + C.listTitle + variable + ": " + C.listValueOn + value;
else return indent + C.listTitle + variable + ": " + C.listValueOff + value;
}
+
+ public static String ed(boolean var)
+ {
+ if (var)
+ return C.listValueOn + "Enabled" + C.mBody;
+ return C.listValueOff + "Disabled" + C.mBody;
+ }
public static String oo(boolean var)
{
diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilAlg.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilAlg.java
index 0d6b0ea54..fad8f1eef 100644
--- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilAlg.java
+++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilAlg.java
@@ -6,6 +6,7 @@ import java.util.Set;
import java.util.TreeSet;
+
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
@@ -92,6 +93,10 @@ public class UtilAlg
if (y <= 0) pitch += 90;
else pitch -= 90;
+ //Fix for two vectors at same Y giving 180
+ if (pitch == 180)
+ pitch = 0;
+
return (float) pitch;
}
@@ -244,4 +249,15 @@ public class UtilAlg
return bestLoc;
}
+
+ public static boolean isInPyramid(Vector a, Vector b, double angleLimit)
+ {
+ return (Math.abs(GetPitch(a) - GetPitch(b)) < angleLimit) && (Math.abs(GetYaw(a) - GetYaw(b)) < angleLimit);
+ }
+
+ public static boolean isTargetInPlayerPyramid(Player player, Player target, double angleLimit)
+ {
+ return isInPyramid(player.getLocation().getDirection(), UtilAlg.getTrajectory(player.getEyeLocation(), target.getEyeLocation()), angleLimit) ||
+ isInPyramid(player.getLocation().getDirection(), UtilAlg.getTrajectory(player.getEyeLocation(), target.getLocation()), angleLimit);
+ }
}
diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java
index f9def152a..bf726be24 100644
--- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java
+++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java
@@ -379,7 +379,7 @@ public class UtilEnt
for (Entity cur : loc.getWorld().getEntities())
{
- if (!(cur instanceof LivingEntity) || (cur instanceof Player && ((Player)cur).getGameMode() == GameMode.CREATIVE))
+ if (!(cur instanceof LivingEntity) || UtilPlayer.isSpectator(cur))
continue;
LivingEntity ent = (LivingEntity)cur;
@@ -627,4 +627,9 @@ public class UtilEnt
return null;
}
+
+ public static boolean inWater(LivingEntity ent)
+ {
+ return ent.getLocation().getBlock().getTypeId() == 8 || ent.getLocation().getBlock().getTypeId() == 9;
+ }
}
diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilInv.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilInv.java
index b92b107c2..393922947 100644
--- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilInv.java
+++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilInv.java
@@ -3,7 +3,6 @@ package mineplex.core.common.util;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashSet;
-import java.util.List;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
@@ -68,20 +67,28 @@ public class UtilInv
{
return contains(player, null, item, data, required);
}
-
+
public static boolean contains(Player player, String itemNameContains, Material item, byte data, int required)
+ {
+ return contains(player, itemNameContains, item, data, required, true, true);
+ }
+
+ public static boolean contains(Player player, String itemNameContains, Material item, byte data, int required, boolean checkArmor, boolean checkCursor)
{
- for (int i : player.getInventory().all(item).keySet())
+ for (ItemStack stack : getItems(player, checkArmor, checkCursor))
{
if (required <= 0)
+ {
return true;
-
- ItemStack stack = player.getInventory().getItem(i);
+ }
if (stack == null)
continue;
+ if (stack.getType() != item)
+ continue;
+
if (stack.getAmount() <= 0)
continue;
@@ -152,34 +159,45 @@ public class UtilInv
player.saveData();
}
-
+
public static ArrayList getItems(Player player)
{
- ArrayList items = new ArrayList();
- PlayerInventory inv = player.getInventory();
+ return getItems(player, true, true);
+ }
- for (ItemStack item : inv.getContents())
- {
- if (item != null && item.getType() != Material.AIR)
- {
- items.add(item.clone());
- }
- }
-
- for (ItemStack item : inv.getArmorContents())
- {
- if (item != null && item.getType() != Material.AIR)
- {
- items.add(item.clone());
- }
- }
+ public static ArrayList getItems(Player player, boolean getArmor, boolean getCursor)
+ {
+ ArrayList items = new ArrayList();
+ PlayerInventory inv = player.getInventory();
- ItemStack cursorItem = player.getItemOnCursor();
+ for (ItemStack item : inv.getContents())
+ {
+ if (item != null && item.getType() != Material.AIR)
+ {
+ items.add(item.clone());
+ }
+ }
- if (cursorItem != null && cursorItem.getType() != Material.AIR)
- items.add(cursorItem.clone());
-
- return items;
+ if (getArmor)
+ {
+ for (ItemStack item : inv.getArmorContents())
+ {
+ if (item != null && item.getType() != Material.AIR)
+ {
+ items.add(item.clone());
+ }
+ }
+ }
+
+ if (getCursor)
+ {
+ ItemStack cursorItem = player.getItemOnCursor();
+
+ if (cursorItem != null && cursorItem.getType() != Material.AIR)
+ items.add(cursorItem.clone());
+ }
+
+ return items;
}
public static void drop(Player player, boolean clear)
diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilItem.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilItem.java
new file mode 100644
index 000000000..cdd967e05
--- /dev/null
+++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilItem.java
@@ -0,0 +1,130 @@
+package mineplex.core.common.util;
+
+import java.util.AbstractMap;
+import java.util.LinkedList;
+import java.util.Map.Entry;
+
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+public class UtilItem
+{
+ public static LinkedList> matchItem(Player caller, String items, boolean inform)
+ {
+ LinkedList> matchList = new LinkedList>();
+
+ String failList = "";
+
+ //Mass Search
+ for (String cur : items.split(","))
+ {
+ Entry match = searchItem(caller, cur, inform);
+
+ if (match != null)
+ matchList.add(match);
+
+ else
+ failList += cur + " " ;
+ }
+
+ if (inform && failList.length() > 0)
+ {
+ failList = failList.substring(0, failList.length() - 1);
+ UtilPlayer.message(caller, F.main("Item(s) Search", "" +
+ C.mBody + " Invalid [" +
+ C.mElem + failList +
+ C.mBody + "]."));
+ }
+
+ return matchList;
+ }
+
+ public static Entry searchItem(Player caller, String args, boolean inform)
+ {
+ LinkedList> matchList = new LinkedList>();
+
+ for (Material cur : Material.values())
+ {
+ //By Name
+ if (cur.toString().equalsIgnoreCase(args))
+ return new AbstractMap.SimpleEntry(cur, (byte)0);
+
+ if (cur.toString().toLowerCase().contains(args.toLowerCase()))
+ matchList.add(new AbstractMap.SimpleEntry(cur, (byte)0));
+
+ //By ID:Data
+ String[] arg = args.split(":");
+
+ //ID
+ int id = 0;
+ try
+ {
+ if (arg.length > 0)
+ id = Integer.parseInt(arg[0]);
+ }
+ catch (Exception e)
+ {
+ continue;
+ }
+
+ if (id != cur.getId())
+ continue;
+
+ //Data
+ byte data = 0;
+ try
+ {
+ if (arg.length > 1)
+ data = Byte.parseByte(arg[1]);
+ }
+ catch (Exception e)
+ {
+ continue;
+ }
+
+ return new AbstractMap.SimpleEntry(cur, data);
+ }
+
+ //No / Non-Unique
+ if (matchList.size() != 1)
+ {
+ if (!inform)
+ return null;
+
+ //Inform
+ UtilPlayer.message(caller, F.main("Item Search", "" +
+ C.mCount + matchList.size() +
+ C.mBody + " matches for [" +
+ C.mElem + args +
+ C.mBody + "]."));
+
+ if (matchList.size() > 0)
+ {
+ String matchString = "";
+ for (Entry cur : matchList)
+ matchString += F.elem(cur.getKey().toString()) + ", ";
+ if (matchString.length() > 1)
+ matchString = matchString.substring(0 , matchString.length() - 2);
+
+ UtilPlayer.message(caller, F.main("Item Search", "" +
+ C.mBody + "Matches [" +
+ C.mElem + matchString +
+ C.mBody + "]."));
+ }
+
+ return null;
+ }
+
+ return matchList.get(0);
+ }
+
+ public static String itemToStr(ItemStack item)
+ {
+ String data = "0";
+ if (item.getData() != null)
+ data = item.getData().getData() + "";
+
+ return item.getType() + ":" + item.getAmount() + ":" + item.getDurability() + ":" + data;
+ }
+}
diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java
index e5377e5f9..322a55134 100644
--- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java
+++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilPlayer.java
@@ -22,555 +22,575 @@ import net.minecraft.server.v1_7_R4.PlayerConnection;
public class UtilPlayer
{
- private static boolean hasIntersection(Vector3D p1, Vector3D p2, Vector3D min, Vector3D max)
- {
- final double epsilon = 0.0001f;
+ private static boolean hasIntersection(Vector3D p1, Vector3D p2, Vector3D min, Vector3D max)
+ {
+ final double epsilon = 0.0001f;
- Vector3D d = p2.subtract(p1).multiply(0.5);
- Vector3D e = max.subtract(min).multiply(0.5);
- Vector3D c = p1.add(d).subtract(min.add(max).multiply(0.5));
- Vector3D ad = d.abs();
+ Vector3D d = p2.subtract(p1).multiply(0.5);
+ Vector3D e = max.subtract(min).multiply(0.5);
+ Vector3D c = p1.add(d).subtract(min.add(max).multiply(0.5));
+ Vector3D ad = d.abs();
- if (Math.abs(c.x) > e.x + ad.x)
- return false;
- if (Math.abs(c.y) > e.y + ad.y)
- return false;
- if (Math.abs(c.z) > e.z + ad.z)
- return false;
+ if (Math.abs(c.x) > e.x + ad.x)
+ return false;
+ if (Math.abs(c.y) > e.y + ad.y)
+ return false;
+ if (Math.abs(c.z) > e.z + ad.z)
+ return false;
- if (Math.abs(d.y * c.z - d.z * c.y) > e.y * ad.z + e.z * ad.y + epsilon)
- return false;
- if (Math.abs(d.z * c.x - d.x * c.z) > e.z * ad.x + e.x * ad.z + epsilon)
- return false;
- if (Math.abs(d.x * c.y - d.y * c.x) > e.x * ad.y + e.y * ad.x + epsilon)
- return false;
+ if (Math.abs(d.y * c.z - d.z * c.y) > e.y * ad.z + e.z * ad.y + epsilon)
+ return false;
+ if (Math.abs(d.z * c.x - d.x * c.z) > e.z * ad.x + e.x * ad.z + epsilon)
+ return false;
+ if (Math.abs(d.x * c.y - d.y * c.x) > e.x * ad.y + e.y * ad.x + epsilon)
+ return false;
- return true;
- }
+ return true;
+ }
- private static class Vector3D
- {
+ private static class Vector3D
+ {
- // Use protected members, like Bukkit
- private final double x;
- private final double y;
- private final double z;
+ // Use protected members, like Bukkit
+ private final double x;
+ private final double y;
+ private final double z;
- private Vector3D(double x, double y, double z)
- {
- this.x = x;
- this.y = y;
- this.z = z;
- }
+ private Vector3D(double x, double y, double z)
+ {
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ }
- private Vector3D(Location location)
- {
- this(location.toVector());
- }
+ private Vector3D(Location location)
+ {
+ this(location.toVector());
+ }
- private Vector3D(Vector vector)
- {
- if (vector == null)
- throw new IllegalArgumentException("Vector cannot be NULL.");
- this.x = vector.getX();
- this.y = vector.getY();
- this.z = vector.getZ();
- }
+ private Vector3D(Vector vector)
+ {
+ if (vector == null)
+ throw new IllegalArgumentException("Vector cannot be NULL.");
+ this.x = vector.getX();
+ this.y = vector.getY();
+ this.z = vector.getZ();
+ }
- private Vector3D abs()
- {
- return new Vector3D(Math.abs(x), Math.abs(y), Math.abs(z));
- }
+ private Vector3D abs()
+ {
+ return new Vector3D(Math.abs(x), Math.abs(y), Math.abs(z));
+ }
- private Vector3D add(double x, double y, double z)
- {
- return new Vector3D(this.x + x, this.y + y, this.z + z);
- }
+ private Vector3D add(double x, double y, double z)
+ {
+ return new Vector3D(this.x + x, this.y + y, this.z + z);
+ }
- private Vector3D add(Vector3D other)
- {
- if (other == null)
- throw new IllegalArgumentException("other cannot be NULL");
+ private Vector3D add(Vector3D other)
+ {
+ if (other == null)
+ throw new IllegalArgumentException("other cannot be NULL");
- return new Vector3D(x + other.x, y + other.y, z + other.z);
- }
+ return new Vector3D(x + other.x, y + other.y, z + other.z);
+ }
- private Vector3D multiply(double factor)
- {
- return new Vector3D(x * factor, y * factor, z * factor);
- }
+ private Vector3D multiply(double factor)
+ {
+ return new Vector3D(x * factor, y * factor, z * factor);
+ }
- private Vector3D multiply(int factor)
- {
- return new Vector3D(x * factor, y * factor, z * factor);
- }
+ private Vector3D multiply(int factor)
+ {
+ return new Vector3D(x * factor, y * factor, z * factor);
+ }
- private Vector3D subtract(Vector3D other)
- {
- if (other == null)
- throw new IllegalArgumentException("other cannot be NULL");
- return new Vector3D(x - other.x, y - other.y, z - other.z);
- }
- }
+ private Vector3D subtract(Vector3D other)
+ {
+ if (other == null)
+ throw new IllegalArgumentException("other cannot be NULL");
+ return new Vector3D(x - other.x, y - other.y, z - other.z);
+ }
+ }
- public static Player getPlayerInSight(Player p, int range, boolean lineOfSight)
- {
- Location observerPos = p.getEyeLocation();
- Vector3D observerDir = new Vector3D(observerPos.getDirection());
- Vector3D observerStart = new Vector3D(observerPos);
- Vector3D observerEnd = observerStart.add(observerDir.multiply(range));
+ public static Player getPlayerInSight(Player p, int range, boolean lineOfSight)
+ {
+ Location observerPos = p.getEyeLocation();
+ Vector3D observerDir = new Vector3D(observerPos.getDirection());
+ Vector3D observerStart = new Vector3D(observerPos);
+ Vector3D observerEnd = observerStart.add(observerDir.multiply(range));
- Player hit = null;
+ Player hit = null;
- for (Entity entity : p.getNearbyEntities(range, range, range))
- {
+ for (Entity entity : p.getNearbyEntities(range, range, range))
+ {
- if (entity == p || (entity instanceof Player && ((Player) entity).getGameMode() == GameMode.CREATIVE))
- continue;
+ if (entity == p || UtilPlayer.isSpectator(entity))
+ continue;
- double theirDist = p.getEyeLocation().distance(entity.getLocation());
+ double theirDist = p.getEyeLocation().distance(entity.getLocation());
- if (lineOfSight
- && p.getLastTwoTargetBlocks(UtilBlock.blockAirFoliageSet, (int) Math.ceil(theirDist)).get(0).getLocation()
- .distance(p.getEyeLocation()) + 1 < theirDist)
- continue;
+ if (lineOfSight
+ && p.getLastTwoTargetBlocks(UtilBlock.blockAirFoliageSet, (int) Math.ceil(theirDist)).get(0).getLocation()
+ .distance(p.getEyeLocation()) + 1 < theirDist)
+ continue;
- Vector3D targetPos = new Vector3D(entity.getLocation());
- Vector3D minimum = targetPos.add(-0.5, 0, -0.5);
- Vector3D maximum = targetPos.add(0.5, 1.67, 0.5);
+ Vector3D targetPos = new Vector3D(entity.getLocation());
+ Vector3D minimum = targetPos.add(-0.5, 0, -0.5);
+ Vector3D maximum = targetPos.add(0.5, 1.67, 0.5);
- if (hasIntersection(observerStart, observerEnd, minimum, maximum))
- {
- if (hit == null
- || hit.getLocation().distanceSquared(observerPos) > entity.getLocation().distanceSquared(observerPos))
- {
- hit = (Player) entity;
- }
- }
- }
- return hit;
- }
+ if (hasIntersection(observerStart, observerEnd, minimum, maximum))
+ {
+ if (hit == null
+ || hit.getLocation().distanceSquared(observerPos) > entity.getLocation().distanceSquared(observerPos))
+ {
+ hit = (Player) entity;
+ }
+ }
+ }
+ return hit;
+ }
- /**
- * AviodAllies doesn't work. Leaving as a param as it sounds like something you may want in the future.
- */
- public static Entity getEntityInSight(Player player, int rangeToScan, boolean avoidAllies, boolean avoidNonLiving,
- boolean lineOfSight, float expandBoxesPercentage)
- {
- Location observerPos = player.getEyeLocation();
- Vector3D observerDir = new Vector3D(observerPos.getDirection());
- Vector3D observerStart = new Vector3D(observerPos);
- Vector3D observerEnd = observerStart.add(observerDir.multiply(rangeToScan));
+ /**
+ * AviodAllies doesn't work. Leaving as a param as it sounds like something you may want in the future.
+ */
+ public static Entity getEntityInSight(Player player, int rangeToScan, boolean avoidAllies, boolean avoidNonLiving,
+ boolean lineOfSight, float expandBoxesPercentage)
+ {
+ Location observerPos = player.getEyeLocation();
+ Vector3D observerDir = new Vector3D(observerPos.getDirection());
+ Vector3D observerStart = new Vector3D(observerPos);
+ Vector3D observerEnd = observerStart.add(observerDir.multiply(rangeToScan));
- Entity hit = null;
+ Entity hit = null;
- for (Entity entity : player.getNearbyEntities(rangeToScan, rangeToScan, rangeToScan))
- {
- if (entity == player || (entity instanceof Player && ((Player) entity).getGameMode() == GameMode.CREATIVE))
- continue;
+ for (Entity entity : player.getNearbyEntities(rangeToScan, rangeToScan, rangeToScan))
+ {
+ if (entity == player || UtilPlayer.isSpectator(entity))
+ continue;
- if (avoidNonLiving && !(entity instanceof LivingEntity))
- continue;
+ if (avoidNonLiving && !(entity instanceof LivingEntity))
+ continue;
- double theirDist = player.getEyeLocation().distance(entity.getLocation());
- if (lineOfSight
- && player.getLastTwoTargetBlocks(UtilBlock.blockAirFoliageSet, (int) Math.ceil(theirDist)).get(0)
- .getLocation().distance(player.getEyeLocation()) + 1 < theirDist)
- continue;
+ double theirDist = player.getEyeLocation().distance(entity.getLocation());
+ if (lineOfSight
+ && player.getLastTwoTargetBlocks(UtilBlock.blockAirFoliageSet, (int) Math.ceil(theirDist)).get(0)
+ .getLocation().distance(player.getEyeLocation()) + 1 < theirDist)
+ continue;
- Vector3D targetPos = new Vector3D(entity.getLocation());
+ Vector3D targetPos = new Vector3D(entity.getLocation());
- float width = (((CraftEntity) entity).getHandle().width / 1.8F) * expandBoxesPercentage;
+ float width = (((CraftEntity) entity).getHandle().width / 1.8F) * expandBoxesPercentage;
- Vector3D minimum = targetPos.add(-width, -0.1 / expandBoxesPercentage, -width);
- Vector3D maximum = targetPos.add(width, ((CraftEntity) entity).getHandle().length * expandBoxesPercentage, width);
+ Vector3D minimum = targetPos.add(-width, -0.1 / expandBoxesPercentage, -width);
+ Vector3D maximum = targetPos.add(width, ((CraftEntity) entity).getHandle().length * expandBoxesPercentage, width);
- if (hasIntersection(observerStart, observerEnd, minimum, maximum))
- {
- if (hit == null
- || hit.getLocation().distanceSquared(observerPos) > entity.getLocation().distanceSquared(observerPos))
- {
- hit = entity;
- }
- }
- }
- return hit;
- }
+ if (hasIntersection(observerStart, observerEnd, minimum, maximum))
+ {
+ if (hit == null
+ || hit.getLocation().distanceSquared(observerPos) > entity.getLocation().distanceSquared(observerPos))
+ {
+ hit = entity;
+ }
+ }
+ }
+ return hit;
+ }
- public static void message(Entity client, LinkedList messageList)
- {
- message(client, messageList, false);
- }
+ public static void message(Entity client, LinkedList messageList)
+ {
+ message(client, messageList, false);
+ }
- public static void message(Entity client, String message)
- {
- message(client, message, false);
- }
+ public static void message(Entity client, String message)
+ {
+ message(client, message, false);
+ }
- public static void message(Entity client, LinkedList messageList, boolean wiki)
- {
- for (String curMessage : messageList)
- {
- message(client, curMessage, wiki);
- }
- }
+ public static void message(Entity client, LinkedList messageList, boolean wiki)
+ {
+ for (String curMessage : messageList)
+ {
+ message(client, curMessage, wiki);
+ }
+ }
- public static void message(Entity client, String message, boolean wiki)
- {
- if (client == null)
- return;
+ public static void message(Entity client, String message, boolean wiki)
+ {
+ if (client == null)
+ return;
- if (!(client instanceof Player))
- return;
+ if (!(client instanceof Player))
+ return;
- /*
+ /*
if (wiki)
message = UtilWiki.link(message);
- */
-
- ((Player) client).sendMessage(message);
- }
-
- public static Player searchExact(String name)
- {
- for (Player cur : UtilServer.getPlayers())
- if (cur.getName().equalsIgnoreCase(name))
- return cur;
-
- return null;
- }
-
- public static Player searchExact(UUID uuid)
- {
- return UtilServer.getServer().getPlayer(uuid);
- }
-
- public static String searchCollection(Player caller, String player, Collection coll, String collName, boolean inform)
- {
- LinkedList matchList = new LinkedList();
-
- for (String cur : coll)
- {
- if (cur.equalsIgnoreCase(player))
- return cur;
-
- if (cur.toLowerCase().contains(player.toLowerCase()))
- matchList.add(cur);
- }
-
- // No / Non-Unique
- if (matchList.size() != 1)
- {
- if (!inform)
- return null;
-
- // Inform
- message(caller,
- F.main(collName + " Search", "" + C.mCount + matchList.size() + C.mBody + " matches for [" + C.mElem + player
- + C.mBody + "]."));
-
- if (matchList.size() > 0)
- {
- String matchString = "";
- for (String cur : matchList)
- matchString += cur + " ";
-
- message(caller,
- F.main(collName + " Search", "" + C.mBody + " Matches [" + C.mElem + matchString + C.mBody + "]."));
- }
-
- return null;
- }
-
- return matchList.get(0);
- }
-
- public static Player searchOnline(Player caller, String player, boolean inform)
- {
- LinkedList matchList = new LinkedList();
-
- for (Player cur : UtilServer.getPlayers())
- {
- if (cur.getName().equalsIgnoreCase(player))
- return cur;
-
- if (cur.getName().toLowerCase().contains(player.toLowerCase()))
- matchList.add(cur);
- }
-
- // No / Non-Unique
- if (matchList.size() != 1)
- {
- if (!inform)
- return null;
-
- // Inform
- message(caller,
- F.main("Online Player Search", "" + C.mCount + matchList.size() + C.mBody + " matches for [" + C.mElem
- + player + C.mBody + "]."));
-
- if (matchList.size() > 0)
- {
- String matchString = "";
- for (Player cur : matchList)
- matchString += F.elem(cur.getName()) + ", ";
- if (matchString.length() > 1)
- matchString = matchString.substring(0, matchString.length() - 2);
-
- message(caller,
- F.main("Online Player Search", "" + C.mBody + "Matches [" + C.mElem + matchString + C.mBody + "]."));
- }
-
- return null;
- }
-
- return matchList.get(0);
- }
-
- public static void searchOffline(List matches, final Callback callback, final Player caller,
- final String player, final boolean inform)
- {
- // No / Non-Unique
- if (matches.size() != 1)
- {
- if (!inform || !caller.isOnline())
- {
- callback.run(null);
- return;
- }
-
- // Inform
- message(caller,
- F.main("Offline Player Search", "" + C.mCount + matches.size() + C.mBody + " matches for [" + C.mElem
- + player + C.mBody + "]."));
-
- if (matches.size() > 0)
- {
- String matchString = "";
- for (String cur : matches)
- matchString += cur + " ";
- if (matchString.length() > 1)
- matchString = matchString.substring(0, matchString.length() - 1);
-
- message(caller,
- F.main("Offline Player Search", "" + C.mBody + "Matches [" + C.mElem + matchString + C.mBody + "]."));
- }
-
- callback.run(null);
- return;
- }
-
- callback.run(matches.get(0));
- }
-
- public static LinkedList matchOnline(Player caller, String players, boolean inform)
- {
- LinkedList matchList = new LinkedList();
-
- String failList = "";
-
- for (String cur : players.split(","))
- {
- Player match = searchOnline(caller, cur, inform);
-
- if (match != null)
- matchList.add(match);
-
- else
- failList += cur + " ";
- }
-
- if (inform && failList.length() > 0)
- {
- failList = failList.substring(0, failList.length() - 1);
- message(caller, F.main("Online Player(s) Search", "" + C.mBody + "Invalid [" + C.mElem + failList + C.mBody + "]."));
- }
-
- return matchList;
- }
-
- public static LinkedList getNearby(Location loc, double maxDist)
- {
- LinkedList nearbyMap = new LinkedList();
-
- for (Player cur : loc.getWorld().getPlayers())
- {
- if (cur.getGameMode() == GameMode.CREATIVE)
- continue;
-
- if (cur.isDead())
- continue;
-
- double dist = loc.toVector().subtract(cur.getLocation().toVector()).length();
-
- if (dist > maxDist)
- continue;
-
- for (int i = 0; i < nearbyMap.size(); i++)
- {
- if (dist < loc.toVector().subtract(nearbyMap.get(i).getLocation().toVector()).length())
- {
- nearbyMap.add(i, cur);
- break;
- }
- }
-
- if (!nearbyMap.contains(cur))
- nearbyMap.addLast(cur);
- }
-
- return nearbyMap;
- }
-
- public static Player getClosest(Location loc, Collection ignore)
- {
- Player best = null;
- double bestDist = 0;
-
- for (Player cur : loc.getWorld().getPlayers())
- {
- if (cur.getGameMode() == GameMode.CREATIVE)
- continue;
-
- if (cur.isDead())
- continue;
+ */
+
+ ((Player) client).sendMessage(message);
+ }
+
+ public static Player searchExact(String name)
+ {
+ for (Player cur : UtilServer.getPlayers())
+ if (cur.getName().equalsIgnoreCase(name))
+ return cur;
+
+ return null;
+ }
+
+ public static Player searchExact(UUID uuid)
+ {
+ return UtilServer.getServer().getPlayer(uuid);
+ }
+
+ public static String searchCollection(Player caller, String player, Collection coll, String collName, boolean inform)
+ {
+ LinkedList matchList = new LinkedList();
+
+ for (String cur : coll)
+ {
+ if (cur.equalsIgnoreCase(player))
+ return cur;
+
+ if (cur.toLowerCase().contains(player.toLowerCase()))
+ matchList.add(cur);
+ }
+
+ // No / Non-Unique
+ if (matchList.size() != 1)
+ {
+ if (!inform)
+ return null;
+
+ // Inform
+ message(caller,
+ F.main(collName + " Search", "" + C.mCount + matchList.size() + C.mBody + " matches for [" + C.mElem + player
+ + C.mBody + "]."));
+
+ if (matchList.size() > 0)
+ {
+ String matchString = "";
+ for (String cur : matchList)
+ matchString += cur + " ";
+
+ message(caller,
+ F.main(collName + " Search", "" + C.mBody + " Matches [" + C.mElem + matchString + C.mBody + "]."));
+ }
+
+ return null;
+ }
+
+ return matchList.get(0);
+ }
+
+ public static Player searchOnline(Player caller, String player, boolean inform)
+ {
+ LinkedList matchList = new LinkedList();
+
+ for (Player cur : UtilServer.getPlayers())
+ {
+ if (cur.getName().equalsIgnoreCase(player))
+ return cur;
+
+ if (cur.getName().toLowerCase().contains(player.toLowerCase()))
+ matchList.add(cur);
+ }
+
+ // No / Non-Unique
+ if (matchList.size() != 1)
+ {
+ if (!inform)
+ return null;
+
+ // Inform
+ message(caller,
+ F.main("Online Player Search", "" + C.mCount + matchList.size() + C.mBody + " matches for [" + C.mElem
+ + player + C.mBody + "]."));
+
+ if (matchList.size() > 0)
+ {
+ String matchString = "";
+ for (Player cur : matchList)
+ matchString += F.elem(cur.getName()) + ", ";
+ if (matchString.length() > 1)
+ matchString = matchString.substring(0, matchString.length() - 2);
+
+ message(caller,
+ F.main("Online Player Search", "" + C.mBody + "Matches [" + C.mElem + matchString + C.mBody + "]."));
+ }
+
+ return null;
+ }
+
+ return matchList.get(0);
+ }
+
+ public static void searchOffline(List matches, final Callback callback, final Player caller,
+ final String player, final boolean inform)
+ {
+ // No / Non-Unique
+ if (matches.size() != 1)
+ {
+ if (!inform || !caller.isOnline())
+ {
+ callback.run(null);
+ return;
+ }
+
+ // Inform
+ message(caller,
+ F.main("Offline Player Search", "" + C.mCount + matches.size() + C.mBody + " matches for [" + C.mElem
+ + player + C.mBody + "]."));
+
+ if (matches.size() > 0)
+ {
+ String matchString = "";
+ for (String cur : matches)
+ matchString += cur + " ";
+ if (matchString.length() > 1)
+ matchString = matchString.substring(0, matchString.length() - 1);
+
+ message(caller,
+ F.main("Offline Player Search", "" + C.mBody + "Matches [" + C.mElem + matchString + C.mBody + "]."));
+ }
+
+ callback.run(null);
+ return;
+ }
+
+ callback.run(matches.get(0));
+ }
+
+ public static LinkedList matchOnline(Player caller, String players, boolean inform)
+ {
+ LinkedList matchList = new LinkedList();
+
+ String failList = "";
+
+ for (String cur : players.split(","))
+ {
+ Player match = searchOnline(caller, cur, inform);
+
+ if (match != null)
+ matchList.add(match);
+
+ else
+ failList += cur + " ";
+ }
+
+ if (inform && failList.length() > 0)
+ {
+ failList = failList.substring(0, failList.length() - 1);
+ message(caller, F.main("Online Player(s) Search", "" + C.mBody + "Invalid [" + C.mElem + failList + C.mBody + "]."));
+ }
+
+ return matchList;
+ }
+
+ public static LinkedList getNearby(Location loc, double maxDist)
+ {
+ LinkedList nearbyMap = new LinkedList();
+
+ for (Player cur : loc.getWorld().getPlayers())
+ {
+ if (UtilPlayer.isSpectator(cur))
+ continue;
+
+ if (cur.isDead())
+ continue;
+
+ double dist = loc.toVector().subtract(cur.getLocation().toVector()).length();
+
+ if (dist > maxDist)
+ continue;
+
+ for (int i = 0; i < nearbyMap.size(); i++)
+ {
+ if (dist < loc.toVector().subtract(nearbyMap.get(i).getLocation().toVector()).length())
+ {
+ nearbyMap.add(i, cur);
+ break;
+ }
+ }
+
+ if (!nearbyMap.contains(cur))
+ nearbyMap.addLast(cur);
+ }
+
+ return nearbyMap;
+ }
+
+ public static Player getClosest(Location loc, Collection ignore)
+ {
+ Player best = null;
+ double bestDist = 0;
+
+ for (Player cur : loc.getWorld().getPlayers())
+ {
+ if (UtilPlayer.isSpectator(cur))
+ continue;
+
+ if (cur.isDead())
+ continue;
+
+ if (ignore != null && ignore.contains(cur))
+ continue;
+
+ double dist = UtilMath.offset(cur.getLocation(), loc);
+
+ if (best == null || dist < bestDist)
+ {
+ best = cur;
+ bestDist = dist;
+ }
+ }
- if (ignore != null && ignore.contains(cur))
- continue;
+ return best;
+ }
- double dist = UtilMath.offset(cur.getLocation(), loc);
+ public static Player getClosest(Location loc, Entity ignore)
+ {
+ Player best = null;
+ double bestDist = 0;
- if (best == null || dist < bestDist)
- {
- best = cur;
- bestDist = dist;
- }
- }
+ for (Player cur : loc.getWorld().getPlayers())
+ {
+ if (UtilPlayer.isSpectator(cur))
+ continue;
- return best;
- }
+ if (cur.isDead())
+ continue;
- public static Player getClosest(Location loc, Entity ignore)
- {
- Player best = null;
- double bestDist = 0;
+ if (ignore != null && ignore.equals(cur))
+ continue;
- for (Player cur : loc.getWorld().getPlayers())
- {
- if (cur.getGameMode() == GameMode.CREATIVE)
- continue;
+ double dist = UtilMath.offset(cur.getLocation(), loc);
- if (cur.isDead())
- continue;
+ if (best == null || dist < bestDist)
+ {
+ best = cur;
+ bestDist = dist;
+ }
+ }
- if (ignore != null && ignore.equals(cur))
- continue;
+ return best;
+ }
- double dist = UtilMath.offset(cur.getLocation(), loc);
+ public static void kick(Player player, String module, String message)
+ {
+ kick(player, module, message, true);
+ }
- if (best == null || dist < bestDist)
- {
- best = cur;
- bestDist = dist;
- }
- }
+ public static void kick(Player player, String module, String message, boolean log)
+ {
+ if (player == null)
+ return;
- return best;
- }
+ String out = ChatColor.RED + module + ChatColor.WHITE + " - " + ChatColor.YELLOW + message;
+ player.kickPlayer(out);
- public static void kick(Player player, String module, String message)
- {
- kick(player, module, message, true);
- }
+ // Log
+ if (log)
+ System.out.println("Kicked Client [" + player.getName() + "] for [" + module + " - " + message + "]");
+ }
- public static void kick(Player player, String module, String message, boolean log)
- {
- if (player == null)
- return;
+ public static HashMap getInRadius(Location loc, double dR)
+ {
+ HashMap players = new HashMap();
- String out = ChatColor.RED + module + ChatColor.WHITE + " - " + ChatColor.YELLOW + message;
- player.kickPlayer(out);
+ for (Player cur : loc.getWorld().getPlayers())
+ {
+ if (UtilPlayer.isSpectator(cur))
+ continue;
- // Log
- if (log)
- System.out.println("Kicked Client [" + player.getName() + "] for [" + module + " - " + message + "]");
- }
+ double offset = UtilMath.offset(loc, cur.getLocation());
- public static HashMap getInRadius(Location loc, double dR)
- {
- HashMap players = new HashMap();
+ if (offset < dR)
+ players.put(cur, 1 - (offset / dR));
+ }
- for (Player cur : loc.getWorld().getPlayers())
- {
- if (cur.getGameMode() == GameMode.CREATIVE)
- continue;
+ return players;
+ }
- double offset = UtilMath.offset(loc, cur.getLocation());
+ public static HashMap getPlayersInPyramid(Player player, double angleLimit, double distance)
+ {
+ HashMap players = new HashMap();
- if (offset < dR)
- players.put(cur, 1 - (offset / dR));
- }
+ for (Player cur : player.getWorld().getPlayers())
+ {
+ if (UtilPlayer.isSpectator(cur))
+ continue;
- return players;
- }
+ //Get lower offset (eye to eye, eye to feet)
+ double offset = Math.min(UtilMath.offset(player.getEyeLocation(), cur.getEyeLocation()),
+ UtilMath.offset(player.getEyeLocation(), cur.getLocation()));
- public static void health(Player player, double mod)
- {
- if (player.isDead())
- return;
+ if (offset < distance && UtilAlg.isTargetInPlayerPyramid(player, cur, angleLimit))
+ players.put(cur, 1 - (offset / distance));
+ }
- double health = player.getHealth() + mod;
+ return players;
+ }
- if (health < 0)
- health = 0;
+ public static void health(Player player, double mod)
+ {
+ if (player.isDead())
+ return;
- if (health > player.getMaxHealth())
- health = player.getMaxHealth();
+ double health = player.getHealth() + mod;
- player.setHealth(health);
- }
+ if (health < 0)
+ health = 0;
- public static void hunger(Player player, int mod)
- {
- if (player.isDead())
- return;
+ if (health > player.getMaxHealth())
+ health = player.getMaxHealth();
- int hunger = player.getFoodLevel() + mod;
+ player.setHealth(health);
+ }
- if (hunger < 0)
- hunger = 0;
+ public static void hunger(Player player, int mod)
+ {
+ if (player.isDead())
+ return;
- if (hunger > 20)
- hunger = 20;
+ int hunger = player.getFoodLevel() + mod;
- player.setFoodLevel(hunger);
- }
+ if (hunger < 0)
+ hunger = 0;
- public static boolean isOnline(String name)
- {
- return (searchExact(name) != null);
- }
+ if (hunger > 20)
+ hunger = 20;
- public static String safeNameLength(String name)
- {
- if (name.length() > 16)
- name = name.substring(0, 16);
+ player.setFoodLevel(hunger);
+ }
- return name;
- }
+ public static boolean isOnline(String name)
+ {
+ return (searchExact(name) != null);
+ }
- public static boolean isChargingBow(Player player)
- {
- if (!UtilGear.isMat(player.getItemInHand(), Material.BOW))
- return false;
+ public static String safeNameLength(String name)
+ {
+ if (name.length() > 16)
+ name = name.substring(0, 16);
- return (((CraftEntity) player).getHandle().getDataWatcher().getByte(0) & 1 << 4) != 0;
- }
+ return name;
+ }
- public static boolean is1_8(Player player)
- {
- return ((CraftPlayer) player).getHandle().playerConnection.networkManager.getVersion() >= 47;
- }
+ public static boolean isChargingBow(Player player)
+ {
+ if (!UtilGear.isMat(player.getItemInHand(), Material.BOW))
+ return false;
+
+ return (((CraftEntity) player).getHandle().getDataWatcher().getByte(0) & 1 << 4) != 0;
+ }
+
+ public static boolean is1_8(Player player)
+ {
+ return ((CraftPlayer) player).getHandle().playerConnection.networkManager.getVersion() >= 47;
+ }
public static void sendPacket(Player player, Packet... packets)
{
@@ -582,16 +602,23 @@ public class UtilPlayer
}
}
- /*
+ public static boolean isSpectator(Entity player)
+ {
+ if (player instanceof Player)
+ return ((CraftPlayer) player).getHandle().spectating;
+ return false;
+ }
+
+ /*
public void setListName(Player player, CoreClient client)
{
StringBuilder playerNameBuilder = new StringBuilder();
String prefixChar = "*";
-
+
if (client.NAC().IsUsing()) playerNameBuilder.append(ChatColor.GREEN + prefixChar);
else playerNameBuilder.append(ChatColor.DARK_GRAY + prefixChar);
-
+
if (client.Rank().Has(Rank.OWNER, false)) playerNameBuilder.append(ChatColor.AQUA + prefixChar + ChatColor.RED);
else if (client.Rank().Has(Rank.MODERATOR, false)) playerNameBuilder.append(ChatColor.AQUA + prefixChar + ChatColor.GOLD);
else if (client.Rank().Has(Rank.DIAMOND, false)) playerNameBuilder.append(ChatColor.AQUA + prefixChar + ChatColor.WHITE);
@@ -602,13 +629,13 @@ public class UtilPlayer
playerNameBuilder.append(player.getName());
String playerName = playerNameBuilder.toString();
-
+
if (playerNameBuilder.length() > 16)
{
playerName = playerNameBuilder.substring(0, 16);
}
-
+
player.setPlayerListName(playerName);
}
- */
+ */
}
diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java
new file mode 100644
index 000000000..0cec248f5
--- /dev/null
+++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilText.java
@@ -0,0 +1,23 @@
+package mineplex.core.common.util;
+
+import java.util.Collection;
+
+public class UtilText
+{
+ public static String listToString(Collection inputList, boolean comma)
+ {
+ String out = "";
+
+ for (T cur : inputList)
+ {
+ out += cur.toString() + (comma ? ", " : " ");
+ }
+
+ if (out.length() > 0)
+ {
+ out = out.substring(0, out.length()-(comma ? 2 : 1));
+ }
+
+ return out;
+ }
+}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/CustomTagFix.java b/Plugins/Mineplex.Core/src/mineplex/core/CustomTagFix.java
index bc4a9381f..eda40fc38 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/CustomTagFix.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/CustomTagFix.java
@@ -54,6 +54,7 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
private HashSet _ignoreSkulls = new HashSet();
private NautHashMap _exemptTimeMap = new NautHashMap();
+ private NautHashMap> _doubleStrike = new NautHashMap>();
private Field _destroyId;
@@ -76,6 +77,7 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
NCPHookManager.addHook(CheckType.MOVING_SURVIVALFLY, this);
NCPHookManager.addHook(CheckType.MOVING_PASSABLE, this);
+ NCPHookManager.addHook(CheckType.ALL, this);
}
@EventHandler
@@ -138,6 +140,24 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
iterator.remove();
}
}
+
+ for (Iterator>> iterator = _doubleStrike.entrySet().iterator(); iterator.hasNext();)
+ {
+ Entry> entry = iterator.next();
+
+ for (Iterator> innerIterator = entry.getValue().entrySet().iterator(); innerIterator.hasNext();)
+ {
+ final Entry entry2 = innerIterator.next();
+
+ if (System.currentTimeMillis() > entry2.getValue())
+ {
+ innerIterator.remove();
+ }
+ }
+
+ if (entry.getValue() == null || entry.getValue().size() == 0)
+ iterator.remove();
+ }
}
@EventHandler
@@ -556,11 +576,28 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
@Override
public boolean onCheckFailure(CheckType checkType, Player player, IViolationInfo violationInfo)
- {
- boolean failure = _exemptTimeMap.containsKey(player.getUniqueId());
+ {
+ boolean failure = false;
- if (failure)
- MovingData.getData(player).clearFlyData();
+ if (checkType == CheckType.MOVING_SURVIVALFLY || checkType == CheckType.MOVING_PASSABLE)
+ {
+ failure = _exemptTimeMap.containsKey(player.getUniqueId());
+
+ if (failure)
+ MovingData.getData(player).clearFlyData();
+ }
+
+ // This is the second strike system.
+ if (!failure)
+ {
+ if (!_doubleStrike.containsKey(player.getUniqueId()) || !_doubleStrike.get(player.getUniqueId()).containsKey(checkType.getParent()))
+ failure = true;
+
+ if (!_doubleStrike.containsKey(player.getUniqueId()))
+ _doubleStrike.put(player.getUniqueId(), new NautHashMap());
+
+ _doubleStrike.get(player.getUniqueId()).put(checkType.getParent(), System.currentTimeMillis() + 5000);
+ }
return failure;
}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/MiniDbClientPlugin.java b/Plugins/Mineplex.Core/src/mineplex/core/MiniDbClientPlugin.java
index 121ba66d7..92e2ea3cb 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/MiniDbClientPlugin.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/MiniDbClientPlugin.java
@@ -22,4 +22,9 @@ public abstract class MiniDbClientPlugin extends MiniCl
}
public abstract void processLoginResultSet(String playerName, ResultSet resultSet) throws SQLException;
+
+ public CoreClientManager getClientManager()
+ {
+ return ClientManager;
+ }
}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/account/AccountCache.java b/Plugins/Mineplex.Core/src/mineplex/core/account/AccountCache.java
new file mode 100644
index 000000000..e6ac95b35
--- /dev/null
+++ b/Plugins/Mineplex.Core/src/mineplex/core/account/AccountCache.java
@@ -0,0 +1,33 @@
+package mineplex.core.account;
+
+import java.util.UUID;
+
+import mineplex.serverdata.data.Data;
+
+public class AccountCache implements Data
+{
+ private UUID _uuid;
+ private Integer _id;
+
+ public AccountCache(UUID uuid, int id)
+ {
+ _uuid = uuid;
+ _id = id;
+ }
+
+ public UUID getUUID()
+ {
+ return _uuid;
+ }
+
+ public int getId()
+ {
+ return _id;
+ }
+
+ @Override
+ public String getDataId()
+ {
+ return _uuid.toString();
+ }
+}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClient.java b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClient.java
index 1da48fd9e..ebec4be13 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClient.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClient.java
@@ -6,7 +6,7 @@ import org.bukkit.entity.Player;
public class CoreClient
{
- private int _accountId;
+ private int _accountId = -1;
private String _name;
private Player _player;
private Rank _rank;
@@ -37,7 +37,7 @@ public class CoreClient
_player = player;
}
- public int GetAccountId()
+ public int getAccountId()
{
return _accountId;
}
@@ -48,7 +48,7 @@ public class CoreClient
_player = null;
}
- public void SetAccountId(int accountId)
+ public void setAccountId(int accountId)
{
_accountId = accountId;
}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java
index ec584c081..88aafb1af 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java
@@ -21,6 +21,10 @@ import mineplex.core.common.util.UtilPlayer;
import mineplex.core.timing.TimingManager;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
+import mineplex.serverdata.Region;
+import mineplex.serverdata.data.BungeeServer;
+import mineplex.serverdata.redis.RedisDataRepository;
+import mineplex.serverdata.servers.ServerManager;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
@@ -43,6 +47,7 @@ public class CoreClientManager extends MiniPlugin
private AccountRepository _repository;
private NautHashMap _clientList;
private HashSet _duplicateLoginGlitchPreventionList;
+ private RedisDataRepository _accountCacheRepository;
private NautHashMap _loginProcessors = new NautHashMap();
@@ -59,6 +64,9 @@ public class CoreClientManager extends MiniPlugin
_repository = new AccountRepository(plugin, webServer);
_clientList = new NautHashMap();
_duplicateLoginGlitchPreventionList = new HashSet();
+
+ _accountCacheRepository = new RedisDataRepository(ServerManager.getMasterConnection(), ServerManager.getSlaveConnection(),
+ Region.ALL, AccountCache.class, "accountCache");
}
public AccountRepository getRepository()
@@ -155,7 +163,7 @@ public class CoreClientManager extends MiniPlugin
catch(Exception exception)
{
event.disallow(Result.KICK_OTHER, "Error retrieving information from web, please retry in a minute.");
- System.out.println(exception.getMessage());
+ exception.printStackTrace();
}
finally
{
@@ -189,34 +197,45 @@ public class CoreClientManager extends MiniPlugin
{
public void run()
{
- ClientToken token = null;
- Gson gson = new Gson();
-
- // Fails if not in DB and if duplicate.
- UUID uuid = loadUUIDFromDB(playerName);
-
- if (uuid == null)
- uuid = UUIDFetcher.getUUIDOf(playerName);
-
- String response = _repository.getClientByUUID(uuid);
- token = gson.fromJson(response, ClientToken.class);
-
- client.SetAccountId(token.AccountId);
- client.SetRank(Rank.valueOf(token.Rank));
-
- _repository.login(_loginProcessors, uuid.toString(), client.GetPlayerName());
-
- // JSON sql response
- Bukkit.getServer().getPluginManager().callEvent(new ClientWebResponseEvent(response, uuid));
-
- Bukkit.getServer().getScheduler().runTask(getPlugin(), new Runnable()
+ try
{
- public void run()
+ ClientToken token = null;
+ Gson gson = new Gson();
+
+ // Fails if not in DB and if duplicate.
+ UUID uuid = loadUUIDFromDB(playerName);
+
+ if (uuid == null)
+ uuid = UUIDFetcher.getUUIDOf(playerName);
+
+ String response = _repository.getClientByUUID(uuid);
+ token = gson.fromJson(response, ClientToken.class);
+
+ client.SetRank(Rank.valueOf(token.Rank));
+
+ client.setAccountId(_repository.login(_loginProcessors, uuid.toString(), client.GetPlayerName()));
+
+ // JSON sql response
+ Bukkit.getServer().getPluginManager().callEvent(new ClientWebResponseEvent(response, uuid));
+
+ if (client.getAccountId() > 0)
+ _accountCacheRepository.addElement(new AccountCache(uuid, client.getAccountId()));
+ }
+ catch (Exception exception)
+ {
+ exception.printStackTrace();
+ }
+ finally
+ {
+ Bukkit.getServer().getScheduler().runTask(getPlugin(), new Runnable()
{
- if (runnable != null)
- runnable.run();
- }
- });
+ public void run()
+ {
+ if (runnable != null)
+ runnable.run();
+ }
+ });
+ }
}
});
}
@@ -234,7 +253,7 @@ public class CoreClientManager extends MiniPlugin
{
public void run()
{
- _repository.login(_loginProcessors, uuid.toString(), client.GetPlayerName());
+ client.setAccountId(_repository.login(_loginProcessors, uuid.toString(), client.GetPlayerName()));
_clientLoginLock.remove(client.GetPlayerName());
}
});
@@ -244,8 +263,7 @@ public class CoreClientManager extends MiniPlugin
TimingManager.stop(client.GetPlayerName() + " GetClient.");
token = gson.fromJson(response, ClientToken.class);
-
- client.SetAccountId(token.AccountId);
+
client.SetRank(Rank.valueOf(token.Rank));
// _repository.updateMysqlRank(uuid.toString(), token.Rank, token.RankPerm, new Timestamp(Date.parse(token.RankExpire)).toString());
@@ -272,6 +290,11 @@ public class CoreClientManager extends MiniPlugin
TimingManager.stop(client.GetPlayerName() + " LoadClient Total.");
+ System.out.println(client.GetPlayerName() + "'s account id = " + client.getAccountId());
+
+ if (client.getAccountId() > 0)
+ _accountCacheRepository.addElement(new AccountCache(uuid, client.getAccountId()));
+
return !_clientLoginLock.containsKey(client.GetPlayerName());
}
@@ -337,7 +360,7 @@ public class CoreClientManager extends MiniPlugin
}
}
- public void SaveRank(final String name, Rank rank, boolean perm)
+ public void SaveRank(final String name, final UUID uuid, Rank rank, boolean perm)
{
_repository.saveRank(new Callback()
{
@@ -350,7 +373,7 @@ public class CoreClientManager extends MiniPlugin
client.SetRank(newRank);
}
}
- }, name, rank, perm);
+ }, name, uuid, rank, perm);
}
public void checkPlayerNameExact(final Callback callback, final String playerName)
@@ -473,4 +496,9 @@ public class CoreClientManager extends MiniPlugin
return client.GetRank().Has(rank);
}
+
+ public int getCachedClientAccountId(UUID uuid)
+ {
+ return _accountCacheRepository.getElement(uuid.toString()).getId();
+ }
}
\ No newline at end of file
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/account/ILoginProcessor.java b/Plugins/Mineplex.Core/src/mineplex/core/account/ILoginProcessor.java
index 9ac886d69..aca0eb341 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/account/ILoginProcessor.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/account/ILoginProcessor.java
@@ -9,5 +9,5 @@ public interface ILoginProcessor
void processLoginResultSet(String playerName, ResultSet resultSet) throws SQLException;
- String getQuery(String uuid, String name);
+ String getQuery(int accountId, String uuid, String name);
}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/account/command/UpdateRank.java b/Plugins/Mineplex.Core/src/mineplex/core/account/command/UpdateRank.java
index 860cd124a..7bf400dd2 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/account/command/UpdateRank.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/account/command/UpdateRank.java
@@ -2,6 +2,7 @@ package mineplex.core.account.command;
import java.util.Iterator;
import java.util.List;
+import java.util.UUID;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
@@ -11,6 +12,7 @@ import mineplex.core.command.CommandBase;
import mineplex.core.common.Rank;
import mineplex.core.common.util.Callback;
import mineplex.core.common.util.F;
+import mineplex.core.common.util.UUIDFetcher;
import mineplex.core.common.util.UtilPlayer;
public class UpdateRank extends CommandBase
@@ -50,7 +52,7 @@ public class UpdateRank extends CommandBase
final Rank rank = tempRank;
- if ((rank == Rank.YOUTUBE && Plugin.Get(caller).GetRank().Has(Rank.OWNER)) || rank == Rank.MODERATOR || rank == Rank.HELPER || rank == Rank.ALL || rank == Rank.MAPDEV || rank == Rank.SNR_MODERATOR)
+ if (rank == Rank.YOUTUBE || rank == Rank.MODERATOR || rank == Rank.HELPER || rank == Rank.ALL || rank == Rank.MAPDEV || rank == Rank.SNR_MODERATOR)
{
Plugin.getRepository().matchPlayerName(new Callback>()
{
@@ -86,13 +88,18 @@ public class UpdateRank extends CommandBase
return;
}
+ UUID uuid = Plugin.loadUUIDFromDB(playerName);
+
+ if (uuid == null)
+ uuid = UUIDFetcher.getUUIDOf(playerName);
+
Plugin.getRepository().saveRank(new Callback()
{
public void run(Rank rank)
{
caller.sendMessage(F.main(Plugin.getName(), target + "'s rank has been updated to " + rank.Name + "!"));
}
- }, target, rank, true);
+ }, target, uuid, rank, true);
}
}, caller, playerName, true);
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/account/repository/AccountRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/account/repository/AccountRepository.java
index ae3ce09c2..5d45845fe 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/account/repository/AccountRepository.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/account/repository/AccountRepository.java
@@ -1,5 +1,6 @@
package mineplex.core.account.repository;
+import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
@@ -18,7 +19,7 @@ import mineplex.core.account.repository.token.RankUpdateToken;
import mineplex.core.common.Rank;
import mineplex.core.common.util.Callback;
import mineplex.core.common.util.NautHashMap;
-import mineplex.core.common.util.UUIDFetcher;
+import mineplex.core.database.DBPool;
import mineplex.core.database.DatabaseRunnable;
import mineplex.core.database.RepositoryBase;
import mineplex.core.database.ResultSetCallable;
@@ -30,7 +31,7 @@ import mineplex.core.server.remotecall.JsonWebCall;
public class AccountRepository extends RepositoryBase
{
private static String CREATE_ACCOUNT_TABLE = "CREATE TABLE IF NOT EXISTS accounts (id INT NOT NULL AUTO_INCREMENT, uuid VARCHAR(100), name VARCHAR(40), gems INT, rank VARCHAR(40), rankPerm BOOL, rankExpire LONG, lastLogin LONG, totalPlayTime LONG, PRIMARY KEY (id), UNIQUE INDEX uuidIndex (uuid), UNIQUE INDEX nameIndex (name), INDEX rankIndex (rank));";
- private static String ACCOUNT_LOGIN_NEW = "INSERT INTO accounts (uuid, name, lastLogin) values(?, ?, now()) ON DUPLICATE KEY UPDATE name=VALUES(name), lastLogin=VALUES(lastLogin);";
+ private static String ACCOUNT_LOGIN_NEW = "INSERT INTO accounts (uuid, name, lastLogin) values(?, ?, now());";
private static String UPDATE_ACCOUNT_RANK = "UPDATE accounts SET rank=?, rankPerm=false, rankExpire=now() + INTERVAL 1 MONTH WHERE uuid = ?;";
private static String UPDATE_ACCOUNT_RANK_DONOR = "UPDATE accounts SET rank=?, donorRank=?, rankPerm=false, rankExpire=now() + INTERVAL 1 MONTH WHERE uuid = ?;";
private static String UPDATE_ACCOUNT_RANK_PERM = "UPDATE accounts SET rank=?, rankPerm=true WHERE uuid = ?;";
@@ -43,34 +44,9 @@ public class AccountRepository extends RepositoryBase
public AccountRepository(JavaPlugin plugin, String webAddress)
{
- super(plugin, "jdbc:mysql://db.mineplex.com:3306/Account?autoReconnect=true&failOverReadOnly=false&maxReconnects=10&allowMultiQueries=true", "root", "tAbechAk3wR7tuTh");
+ super(plugin, DBPool.ACCOUNT);
_webAddress = webAddress;
-
- Statement statement = null;
-
- try
- {
- statement = getConnection().createStatement();
- }
- catch (Exception exception)
- {
- exception.printStackTrace();
- }
- finally
- {
- if (statement != null)
- {
- try
- {
- statement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
}
@Override
@@ -79,14 +55,40 @@ public class AccountRepository extends RepositoryBase
//executeUpdate(CREATE_ACCOUNT_TABLE);
}
- public void login(NautHashMap loginProcessors, String uuid, String name)
+ public int login(NautHashMap loginProcessors, String uuid, String name)
{
- Statement statement = null;
- ResultSet resultSet = null;
-
- try
+ int accountId = -1;
+ try (
+ Connection connection = getConnection();
+ Statement statement = connection.createStatement()
+ )
{
- statement = getConnection().createStatement();
+ statement.execute("SELECT id FROM accounts WHERE accounts.uuid = '" + uuid + "' LIMIT 1;");
+ ResultSet resultSet = statement.getResultSet();
+
+ while (resultSet.next())
+ {
+ accountId = resultSet.getInt(1);
+ }
+
+ if (accountId == -1)
+ {
+ final List tempList = new ArrayList(1);
+
+ executeInsert(ACCOUNT_LOGIN_NEW, new ResultSetCallable()
+ {
+ @Override
+ public void processResultSet(ResultSet resultSet) throws SQLException
+ {
+ while (resultSet.next())
+ {
+ tempList.add(resultSet.getInt(1));
+ }
+ }
+ },new ColumnVarChar("uuid", 100, uuid), new ColumnVarChar("name", 100, name));
+
+ accountId = tempList.get(0);
+ }
/*
boolean statementStatus = statement.execute(
@@ -100,10 +102,11 @@ public class AccountRepository extends RepositoryBase
);
*/
- String loginString = "UPDATE accounts SET name='" + name + "', lastLogin=now() WHERE accounts.uuid = '" + uuid + "';";
+ String loginString = "UPDATE accounts SET name='" + name + "', lastLogin=now() WHERE id = '" + accountId + "';";
+
for (ILoginProcessor loginProcessor : loginProcessors.values())
{
- loginString += loginProcessor.getQuery(uuid, name);
+ loginString += loginProcessor.getQuery(accountId, uuid, name);
}
statement.execute(loginString);
@@ -133,51 +136,22 @@ public class AccountRepository extends RepositoryBase
System.out.println("Done");
*/
-
- boolean accountExists = statement.getUpdateCount() != 0;
+ statement.getUpdateCount();
statement.getMoreResults();
+
for (ILoginProcessor loginProcessor : loginProcessors.values())
{
loginProcessor.processLoginResultSet(name, statement.getResultSet());
statement.getMoreResults();
}
-
- if (!accountExists)
- {
- executeUpdate(ACCOUNT_LOGIN_NEW, new ColumnVarChar("uuid", 100, uuid), new ColumnVarChar("name", 100, name));
- }
}
catch (Exception exception)
{
exception.printStackTrace();
}
- finally
- {
- if (statement != null)
- {
- try
- {
- statement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
-
- if (resultSet != null)
- {
- try
- {
- resultSet.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
+
+ return accountId;
}
public String GetClient(String name, UUID uuid, String ipAddress)
@@ -211,13 +185,13 @@ public class AccountRepository extends RepositoryBase
}
}, new ColumnVarChar("name", 100, name));
- if (uuids.size() > 1)
- return null;
+ if (uuids.size() > 0)
+ return uuids.get(uuids.size() - 1);
else
- return uuids.size() == 1 ? uuids.get(0) : null;
+ return null;
}
- public void saveRank(final Callback callback, final String name, final Rank rank, final boolean perm)
+ public void saveRank(final Callback callback, final String name, final UUID uuid, final Rank rank, final boolean perm)
{
final RankUpdateToken token = new RankUpdateToken();
token.Name = name;
@@ -231,16 +205,16 @@ public class AccountRepository extends RepositoryBase
if (rank == Rank.ULTRA || rank == Rank.HERO || rank == Rank.LEGEND)
{
if (perm)
- executeUpdate(UPDATE_ACCOUNT_RANK_DONOR_PERM, new ColumnVarChar("rank", 100, rank.toString()), new ColumnVarChar("donorRank", 100, rank.toString()), new ColumnVarChar("uuid", 100, UUIDFetcher.getUUIDOf(name).toString()));
+ executeUpdate(UPDATE_ACCOUNT_RANK_DONOR_PERM, new ColumnVarChar("rank", 100, rank.toString()), new ColumnVarChar("donorRank", 100, rank.toString()), new ColumnVarChar("uuid", 100, uuid.toString()));
else
- executeUpdate(UPDATE_ACCOUNT_RANK_DONOR, new ColumnVarChar("rank", 100, rank.toString()), new ColumnVarChar("donorRank", 100, rank.toString()), new ColumnVarChar("uuid", 100, UUIDFetcher.getUUIDOf(name).toString()));
+ executeUpdate(UPDATE_ACCOUNT_RANK_DONOR, new ColumnVarChar("rank", 100, rank.toString()), new ColumnVarChar("donorRank", 100, rank.toString()), new ColumnVarChar("uuid", 100, uuid.toString()));
}
else
{
if (perm)
- executeUpdate(UPDATE_ACCOUNT_RANK_PERM, new ColumnVarChar("rank", 100, rank.toString()), new ColumnVarChar("uuid", 100, UUIDFetcher.getUUIDOf(name).toString()));
+ executeUpdate(UPDATE_ACCOUNT_RANK_PERM, new ColumnVarChar("rank", 100, rank.toString()), new ColumnVarChar("uuid", 100, uuid.toString()));
else
- executeUpdate(UPDATE_ACCOUNT_RANK, new ColumnVarChar("rank", 100, rank.toString()), new ColumnVarChar("uuid", 100, UUIDFetcher.getUUIDOf(name).toString()));
+ executeUpdate(UPDATE_ACCOUNT_RANK, new ColumnVarChar("rank", 100, rank.toString()), new ColumnVarChar("uuid", 100, uuid.toString()));
}
Bukkit.getServer().getScheduler().runTask(Plugin, new Runnable()
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementManager.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementManager.java
index bef0baba7..a93b46ba3 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementManager.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementManager.java
@@ -209,6 +209,8 @@ public class AchievementManager extends MiniPlugin
level = Math.max(level, 50 + get(sender, Achievement.GLOBAL_GEM_HUNTER).getLevel());
else if (rank.Has(Rank.ADMIN))
level = Math.max(level, 30 + get(sender, Achievement.GLOBAL_GEM_HUNTER).getLevel());
+ else if (rank.Has(Rank.SNR_MODERATOR))
+ level = Math.max(level, 15);
else if (rank.Has(Rank.MODERATOR))
level = Math.max(level, 5);
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java
index ecb29e936..5101f26be 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/AntiHack.java
@@ -192,7 +192,7 @@ public class AntiHack extends MiniPlugin
if (player.equals(other))
continue;
- if (other.getGameMode() != GameMode.SURVIVAL)
+ if (other.getGameMode() != GameMode.SURVIVAL || UtilPlayer.isSpectator(player))
continue;
if (other.getVehicle() != null)
@@ -202,7 +202,7 @@ public class AntiHack extends MiniPlugin
return true;
}
- if (player.isFlying() || player.isInsideVehicle() || player.getGameMode() != GameMode.SURVIVAL)
+ if (player.isFlying() || player.isInsideVehicle() || player.getGameMode() != GameMode.SURVIVAL || UtilPlayer.isSpectator(player))
{
return true;
}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/antihack/types/Reach.java b/Plugins/Mineplex.Core/src/mineplex/core/antihack/types/Reach.java
index 390eebe4b..9bf8b4a00 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/antihack/types/Reach.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/antihack/types/Reach.java
@@ -8,6 +8,7 @@ import mineplex.core.antihack.AntiHack;
import mineplex.core.antihack.Detector;
import mineplex.core.common.util.UtilEvent;
import mineplex.core.common.util.UtilMath;
+import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
@@ -29,7 +30,7 @@ public class Reach extends MiniPlugin implements Detector
public Reach (AntiHack host)
{
- super("Speed Detector", host.getPlugin());
+ super("Reach Detector", host.getPlugin());
Host = host;
}
@@ -44,7 +45,7 @@ public class Reach extends MiniPlugin implements Detector
for (Player player : UtilServer.getPlayers())
{
- if (player.getGameMode() != GameMode.SURVIVAL)
+ if (player.getGameMode() != GameMode.SURVIVAL || UtilPlayer.isSpectator(player))
continue;
if (!_history.containsKey(player))
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/aprilfools/AprilFoolsManager.java b/Plugins/Mineplex.Core/src/mineplex/core/aprilfools/AprilFoolsManager.java
new file mode 100644
index 000000000..6507b48d6
--- /dev/null
+++ b/Plugins/Mineplex.Core/src/mineplex/core/aprilfools/AprilFoolsManager.java
@@ -0,0 +1,203 @@
+package mineplex.core.aprilfools;
+
+import java.util.Calendar;
+
+import org.bukkit.Sound;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.player.AsyncPlayerChatEvent;
+import org.bukkit.plugin.java.JavaPlugin;
+
+import mineplex.core.MiniPlugin;
+import mineplex.core.account.CoreClientManager;
+import mineplex.core.common.util.UtilMath;
+import mineplex.core.common.util.UtilServer;
+import mineplex.core.common.util.UtilTextMiddle;
+import mineplex.core.disguise.DisguiseManager;
+import mineplex.core.disguise.disguises.DisguiseCow;
+import mineplex.core.updater.UpdateType;
+import mineplex.core.updater.event.UpdateEvent;
+
+public class AprilFoolsManager extends MiniPlugin
+{
+ public static AprilFoolsManager Instance;
+
+ private boolean _enabled;
+ private DisguiseManager _disguiseManager;
+ private CoreClientManager _clientManager;
+
+ protected AprilFoolsManager(JavaPlugin plugin, CoreClientManager clientManager, DisguiseManager disguiseManager)
+ {
+ super("April Fools", plugin);
+
+ _disguiseManager = disguiseManager;
+ _clientManager = clientManager;
+
+ Calendar c = Calendar.getInstance();
+ _enabled = (c.get(Calendar.MONTH) == Calendar.APRIL && c.get(Calendar.DAY_OF_MONTH) == 1);
+ }
+
+ public static void Initialize(JavaPlugin plugin, CoreClientManager clientManager, DisguiseManager disguiseManager)
+ {
+ Instance = new AprilFoolsManager(plugin, clientManager, disguiseManager);
+ }
+
+ @EventHandler
+ public void updateEnabled(UpdateEvent event)
+ {
+ if (event.getType() != UpdateType.SLOW)
+ return;
+
+ Calendar c = Calendar.getInstance();
+ _enabled = (c.get(Calendar.MONTH) == Calendar.APRIL && c.get(Calendar.DAY_OF_MONTH) == 1);
+ }
+
+ @EventHandler(priority = EventPriority.LOW)
+ public void chatAdd(AsyncPlayerChatEvent event)
+ {
+ if (!_enabled)
+ return;
+
+ String[] words = event.getMessage().split(" ");
+
+ String out = "";
+ for (String word : words)
+ {
+ //Prefix
+ if (Math.random() > 0.85)
+ {
+ out += "moo";
+
+ for (int i=0 ; i 0.85)
+ {
+ out += word + " ";
+
+ out += "moo";
+
+ for (int i=0 ; i 0.99)
+ {
+ out += "moo";
+
+ for (int i=3 ; i 0.8)
+ {
+ if (_disguiseManager.getDisguise(player) instanceof DisguiseCow)
+ {
+ player.getWorld().playSound(player.getLocation(), Sound.COW_IDLE, (float)Math.random() + 0.5f, (float)Math.random() + 0.5f);
+ }
+ }
+
+ continue;
+ }
+
+ //Disguise
+ DisguiseCow disguise = new DisguiseCow(player);
+ disguise.setName(getName(player), _clientManager.Get(player).GetRank());
+ disguise.setCustomNameVisible(true);
+ _disguiseManager.disguise(disguise);
+ }
+ }
+
+ public boolean isActive()
+ {
+ return _enabled;
+ }
+
+ public String getName(Player player)
+ {
+ //Name
+ int index = 0;
+ boolean hitVowel = false;
+ for (int i=0 ; i 16)
+ name = name.substring(0, 16);
+
+ return name;
+ }
+
+ public void setEnabled(boolean b)
+ {
+ Calendar c = Calendar.getInstance();
+ _enabled = b && (c.get(Calendar.MONTH) == Calendar.APRIL && c.get(Calendar.DAY_OF_MONTH) == 1);
+ }
+}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/benefit/BenefitManager.java b/Plugins/Mineplex.Core/src/mineplex/core/benefit/BenefitManager.java
index fd45ee873..fe74c528b 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/benefit/BenefitManager.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/benefit/BenefitManager.java
@@ -78,8 +78,8 @@ public class BenefitManager extends MiniDbClientPlugin
}
@Override
- public String getQuery(String uuid, String name)
+ public String getQuery(int accountId, String uuid, String name)
{
- return "SELECT benefit FROM rankBenefits WHERE rankBenefits.uuid = '" + uuid + "';";
+ return "SELECT benefit FROM rankBenefits WHERE rankBenefits.accountId = '" + accountId + "';";
}
}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/benefit/BenefitManagerRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/benefit/BenefitManagerRepository.java
index 2fa7140aa..54723697b 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/benefit/BenefitManagerRepository.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/benefit/BenefitManagerRepository.java
@@ -3,6 +3,7 @@ package mineplex.core.benefit;
import java.sql.ResultSet;
import java.sql.SQLException;
+import mineplex.core.database.DBPool;
import mineplex.core.database.RepositoryBase;
import mineplex.core.database.column.ColumnVarChar;
@@ -10,13 +11,13 @@ import org.bukkit.plugin.java.JavaPlugin;
public class BenefitManagerRepository extends RepositoryBase
{
- // private static String CREATE_BENEFIT_TABLE = "CREATE TABLE IF NOT EXISTS rankBenefits (id INT NOT NULL AUTO_INCREMENT, uuid VARCHAR(100), benefit VARCHAR(100), PRIMARY KEY (id), INDEX rankUuid (uuid));";
+ private static String CREATE_BENEFIT_TABLE = "CREATE TABLE IF NOT EXISTS rankBenefits (id INT NOT NULL AUTO_INCREMENT, accountId INT, benefit VARCHAR(100), PRIMARY KEY (id), INDEX rankUuid (uuid));";
private static String INSERT_BENEFIT = "INSERT INTO rankBenefits (uuid, benefit) VALUES (?, ?);";
public BenefitManagerRepository(JavaPlugin plugin)
{
- super(plugin, "jdbc:mysql://db.mineplex.com:3306/Account?autoReconnect=true&failOverReadOnly=false&maxReconnects=10", "root", "tAbechAk3wR7tuTh");
+ super(plugin, DBPool.ACCOUNT);
}
@Override
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/database/DBPool.java b/Plugins/Mineplex.Core/src/mineplex/core/database/DBPool.java
index f542e1836..f148d31c5 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/database/DBPool.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/database/DBPool.java
@@ -7,24 +7,23 @@ import org.apache.commons.dbcp2.BasicDataSource;
public final class DBPool
{
- public static final DataSource ACCOUNT = openDataSource("jdbc:mysql://db.mineplex.com/Account", "root", "tAbechAk3wR7tuTh");
- public static final DataSource QUEUE = openDataSource("jdbc:mysql://db.mineplex.com/Queue", "root", "tAbechAk3wR7tuTh");
- public static final DataSource MINEPLEX = openDataSource("jdbc:mysql://db.mineplex.com:3306/Mineplex", "root", "tAbechAk3wR7tuTh");
+ public static final DataSource ACCOUNT = openDataSource("jdbc:mysql://db.mineplex.com/Account", "MilitaryPolice", "CUPr6Wuw2Rus$qap");
+ public static final DataSource QUEUE = openDataSource("jdbc:mysql://db.mineplex.com/Queue", "MilitaryPolice", "CUPr6Wuw2Rus$qap");
+ public static final DataSource MINEPLEX = openDataSource("jdbc:mysql://db.mineplex.com:3306/Mineplex", "MilitaryPolice", "CUPr6Wuw2Rus$qap");
public static final DataSource STATS_MINEPLEX = openDataSource("jdbc:mysql://sqlstats.mineplex.com:3306/Mineplex", "root", "tAbechAk3wR7tuTh");
private static DataSource openDataSource(String url, String username, String password)
{
BasicDataSource source = new BasicDataSource();
source.addConnectionProperty("autoReconnect", "true");
- source.setDefaultAutoCommit(true);
- source.setEnableAutoCommitOnReturn(true);
- source.setDefaultTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
+ source.addConnectionProperty("allowMultiQueries", "true");
+ source.setDefaultTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
source.setDriverClassName("com.mysql.jdbc.Driver");
source.setUrl(url);
source.setUsername(username);
source.setPassword(password);
- source.setMaxTotal(10);
- source.setMaxIdle(3);
+ source.setMaxTotal(4);
+ source.setMaxIdle(4);
source.setTimeBetweenEvictionRunsMillis(180 * 1000);
source.setSoftMinEvictableIdleTimeMillis(180 * 1000);
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/database/RepositoryBase.java b/Plugins/Mineplex.Core/src/mineplex/core/database/RepositoryBase.java
index b6ef9c898..ca1a57c4b 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/database/RepositoryBase.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/database/RepositoryBase.java
@@ -1,13 +1,14 @@
package mineplex.core.database;
import java.sql.Connection;
-import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Iterator;
+import javax.sql.DataSource;
+
import mineplex.core.common.util.NautHashMap;
import mineplex.core.database.column.Column;
import mineplex.core.updater.UpdateType;
@@ -20,70 +21,72 @@ import org.bukkit.plugin.java.JavaPlugin;
public abstract class RepositoryBase implements Listener
{
- protected static Object _connectionLock = new Object();
-
- private Connection _connection = null;
-
+ // Queue for failed processes
private static Object _queueLock = new Object();
-
private NautHashMap _failedQueue = new NautHashMap();
- private String _connectionString;
- private String _userName;
- private String _password;
+ private DataSource _dataSource; // Connection pool
+ protected JavaPlugin Plugin; // Plugin responsible for this repository
- protected JavaPlugin Plugin;
-
- public RepositoryBase(JavaPlugin plugin, String connectionString, String username, String password)
+ /**
+ * Constructor
+ * @param plugin - the {@link JavaPlugin} module responsible for this repository.
+ * @param dataSource - the {@link DataSource} responsible for providing the connection pool to this repository.
+ */
+ public RepositoryBase(JavaPlugin plugin, DataSource dataSource)
{
Plugin = plugin;
-
- _connectionString = connectionString;
- _userName = username;
- _password = password;
+ _dataSource = dataSource;
Bukkit.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable()
{
public void run()
{
- synchronized (_connectionLock)
- {
- initialize();
- update();
- }
+ initialize();
+ update();
}
});
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
-
+
protected abstract void initialize();
protected abstract void update();
+ /**
+ * @return the {@link DataSource} used by the repository for connection pooling.
+ */
+ protected DataSource getConnectionPool()
+ {
+ return _dataSource;
+ }
+
+ /**
+ * Requirements: {@link Connection}s must be closed after usage so they may be returned to the pool!
+ * @see Connection#close()
+ * @return a newly fetched {@link Connection} from the connection pool, if a connection can be made, null otherwise.
+ */
protected Connection getConnection()
{
- return getConnection(false);
- }
-
- protected Connection getConnection(boolean validate)
- {
- synchronized (_connectionLock)
+ try
{
- try
- {
- if (_connection == null || (validate && !_connection.isValid(2)))
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
+ return _dataSource.getConnection();
+ }
+ catch (SQLException e)
+ {
+ e.printStackTrace();
+ // TODO: Log connection failures?
+ return null;
}
-
- return _connection;
}
+ /**
+ * Execute a query against the repository.
+ * @param query - the concatenated query to execute in string form.
+ * @param columns - the column data values used for insertion into the query.
+ * @return the number of rows affected by this query in the repository.
+ */
protected int executeUpdate(String query, Column>...columns)
{
return executeInsert(query, null, columns);
@@ -91,17 +94,14 @@ public abstract class RepositoryBase implements Listener
protected int executeInsert(String query, ResultSetCallable callable, Column>...columns)
{
- PreparedStatement preparedStatement = null;
-
int affectedRows = 0;
- try
+ // Automatic resource management for handling/closing objects.
+ try (
+ Connection connection = getConnection();
+ PreparedStatement preparedStatement = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS)
+ )
{
- if (_connection == null)
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
-
- preparedStatement = _connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
-
for (int i=0; i < columns.length; i++)
{
columns[i].setValue(preparedStatement, i+1);
@@ -110,49 +110,24 @@ public abstract class RepositoryBase implements Listener
affectedRows = preparedStatement.executeUpdate();
if (callable != null)
+ {
callable.processResultSet(preparedStatement.getGeneratedKeys());
+ }
}
catch (SQLException exception)
{
- try
- {
- if (!_connection.isValid(5))
- {
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
- executeInsert(query, callable, columns);
- }
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
+ exception.printStackTrace();
}
catch (Exception exception)
{
exception.printStackTrace();
}
- finally
- {
- if (preparedStatement != null)
- {
- try
- {
- preparedStatement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
return affectedRows;
}
protected void executeQuery(PreparedStatement statement, ResultSetCallable callable, Column>...columns)
{
- ResultSet resultSet = null;
-
try
{
for (int i=0; i < columns.length; i++)
@@ -160,129 +135,41 @@ public abstract class RepositoryBase implements Listener
columns[i].setValue(statement, i+1);
}
- resultSet = statement.executeQuery();
-
- callable.processResultSet(resultSet);
+ try (ResultSet resultSet = statement.executeQuery())
+ {
+ callable.processResultSet(resultSet);
+ }
}
catch (SQLException exception)
{
- try
- {
- if (!_connection.isValid(5))
- {
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
- executeQuery(statement, callable, columns);
- }
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
+ exception.printStackTrace();
}
catch (Exception exception)
{
exception.printStackTrace();
}
- finally
- {
- if (resultSet != null)
- {
- try
- {
- resultSet.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
}
protected void executeQuery(String query, ResultSetCallable callable, Column>...columns)
{
- PreparedStatement preparedStatement = null;
-
- try
+ // Automatic resource management for handling/closing objects.
+ try (
+ Connection connection = getConnection();
+ PreparedStatement preparedStatement = connection.prepareStatement(query)
+ )
{
- if (_connection == null)
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
-
- preparedStatement = _connection.prepareStatement(query);
-
executeQuery(preparedStatement, callable, columns);
}
catch (SQLException exception)
{
- try
- {
- if (!_connection.isValid(5))
- {
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
- executeQuery(query, callable, columns);
- }
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
+ exception.printStackTrace();
}
catch (Exception exception)
{
exception.printStackTrace();
}
- finally
- {
- if (preparedStatement != null)
- {
- try
- {
- preparedStatement.close();
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
}
-
- protected int executeUpdate(PreparedStatement preparedStatement, Column>...columns)
- {
- int affectedRows = 0;
- try
- {
- for (int i=0; i < columns.length; i++)
- {
- columns[i].setValue(preparedStatement, i+1);
- }
-
- affectedRows = preparedStatement.executeUpdate();
- }
- catch (SQLException exception)
- {
- try
- {
- if (!_connection.isValid(5))
- {
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
- executeUpdate(preparedStatement, columns);
- }
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- catch (Exception exception)
- {
- exception.printStackTrace();
- }
-
- return affectedRows;
- }
-
protected void handleDatabaseCall(final DatabaseRunnable databaseRunnable, final String errorMessage)
{
Thread asyncThread = new Thread(new Runnable()
@@ -325,32 +212,6 @@ public abstract class RepositoryBase implements Listener
processFailedQueue();
}
- @EventHandler
- public void validateConnection(UpdateEvent event)
- {
- if (event.getType() != UpdateType.MIN_02)
- return;
-
- Bukkit.getScheduler().runTaskAsynchronously(Plugin, new Runnable()
- {
- public void run()
- {
- synchronized (_connectionLock)
- {
- try
- {
- if (_connection == null || !_connection.isValid(5))
- _connection = DriverManager.getConnection(_connectionString, _userName, _password);
- }
- catch (SQLException e)
- {
- e.printStackTrace();
- }
- }
- }
- });
- }
-
private void processFailedQueue()
{
synchronized (_queueLock)
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java b/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java
index bc8b4b5ae..bdcf593de 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java
@@ -6,6 +6,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.Map.Entry;
import net.minecraft.server.v1_7_R4.Block;
@@ -17,6 +18,7 @@ import net.minecraft.server.v1_7_R4.ChunkAddEntityEvent;
import net.minecraft.server.v1_7_R4.EntityPlayer;
import net.minecraft.server.v1_7_R4.Packet;
import net.minecraft.server.v1_7_R4.PacketPlayOutBed;
+import net.minecraft.server.v1_7_R4.PacketPlayOutEntityStatus;
import net.minecraft.server.v1_7_R4.PacketPlayOutMapChunk;
import net.minecraft.server.v1_7_R4.PacketPlayOutMapChunkBulk;
import net.minecraft.server.v1_7_R4.PacketPlayOutNamedEntitySpawn;
@@ -28,6 +30,7 @@ import net.minecraft.server.v1_7_R4.PacketPlayOutRelEntityMove;
import net.minecraft.server.v1_7_R4.PacketPlayOutRelEntityMoveLook;
import net.minecraft.server.v1_7_R4.PacketPlayOutEntityTeleport;
import net.minecraft.server.v1_7_R4.PacketPlayOutEntityMetadata;
+import net.minecraft.server.v1_7_R4.PacketPlayOutSpawnEntityLiving;
import net.minecraft.server.v1_7_R4.PacketPlayOutUpdateAttributes;
import net.minecraft.server.v1_7_R4.PacketPlayOutEntityEquipment;
import net.minecraft.server.v1_7_R4.PacketPlayOutNamedSoundEffect;
@@ -62,6 +65,7 @@ import mineplex.core.disguise.disguises.DisguiseBase;
import mineplex.core.disguise.disguises.DisguiseBlock;
import mineplex.core.disguise.disguises.DisguiseInsentient;
import mineplex.core.disguise.disguises.DisguisePlayer;
+import mineplex.core.disguise.disguises.DisguiseRabbit;
import mineplex.core.packethandler.IPacketHandler;
import mineplex.core.packethandler.PacketHandler;
import mineplex.core.packethandler.PacketVerifier;
@@ -80,6 +84,7 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
private NautHashMap> _disguisePlayerMap = new NautHashMap>();
private HashSet _blockedNames = new HashSet();
private NautHashMap> _futureDisguises = new NautHashMap>();
+ private NautHashMap> _lastRabbitHop = new NautHashMap>();
private boolean _handlingPacket = false;
@@ -93,6 +98,8 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
private Field _bedD;
private Field _xChunk;
private Field _zChunk;
+ private Field _eStatusId;
+ private Field _eStatusState;
private Chunk _bedChunk;
private boolean _bedPackets;
@@ -121,6 +128,10 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
_bedB.setAccessible(true);
_bedD = PacketPlayOutBed.class.getDeclaredField("d");
_bedD.setAccessible(true);
+ _eStatusId = PacketPlayOutEntityStatus.class.getDeclaredField("a");
+ _eStatusId.setAccessible(true);
+ _eStatusState = PacketPlayOutEntityStatus.class.getDeclaredField("b");
+ _eStatusState.setAccessible(true);
_bedChunk = new Chunk(null, 0, 0);
Field cSection = Chunk.class.getDeclaredField("sections");
@@ -221,6 +232,11 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
disguise.setEntity(event.GetEntity());
_spawnPacketMap.put(event.GetEntity().getEntityId(), disguise);
_entityDisguiseMap.remove(event.GetEntity().getUniqueId().toString());
+
+ if (disguise instanceof DisguiseRabbit)
+ {
+ _lastRabbitHop.put(disguise.GetEntityId(), new NautHashMap());
+ }
}
}
@@ -325,6 +341,7 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
{
_entityDisguiseMap.put(entity.getUniqueId().toString(), _spawnPacketMap.get(entity.getEntityId()));
_spawnPacketMap.remove(entity.getEntityId());
+ _lastRabbitHop.remove(entity.getEntityId());
}
}
}
@@ -374,6 +391,11 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
_spawnPacketMap.put(disguise.GetEntityId(), disguise);
_disguisePlayerMap.put(disguise, new HashSet());
+ if (disguise instanceof DisguiseRabbit)
+ {
+ _lastRabbitHop.put(disguise.GetEntityId(), new NautHashMap());
+ }
+
for (Player player : players)
addViewerToDisguise(disguise, player, false);
@@ -513,6 +535,63 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
final Player owner = packetInfo.getPlayer();
final PacketVerifier packetVerifier = packetInfo.getVerifier();
+ if (UtilPlayer.is1_8(owner)
+ && (packet instanceof PacketPlayOutRelEntityMoveLook || packet instanceof PacketPlayOutRelEntityMove))
+ {
+ int entityId = -1;
+
+ if (packet instanceof PacketPlayOutRelEntityMoveLook)
+ {
+ entityId = ((PacketPlayOutRelEntityMoveLook) packet).a;
+ }/*
+ else if (packet instanceof PacketPlayOutEntityLook)
+ {
+ entityId = ((PacketPlayOutEntityLook) packet).a;
+ }*/
+ else if (packet instanceof PacketPlayOutRelEntityMove)
+ {
+ PacketPlayOutRelEntityMove rPacket = (PacketPlayOutRelEntityMove) packet;
+
+ if (rPacket.b != 0 || rPacket.c != 0 || rPacket.d != 0)
+ {
+ entityId = rPacket.a;
+ }
+ }
+ /*else if (packet instanceof PacketPlayOutEntityTeleport)
+ {
+ entityId = ((PacketPlayOutEntityTeleport) packet).a;
+ }*/
+
+ if (_lastRabbitHop.containsKey(entityId))
+ {
+ NautHashMap rabbitHops = _lastRabbitHop.get(entityId);
+
+ if (rabbitHops != null)
+ {
+ long last = rabbitHops.containsKey(owner.getEntityId()) ? System.currentTimeMillis()
+ - rabbitHops.get(owner.getEntityId()) : 1000;
+
+ if (last > 500 || last < 100)
+ {
+ rabbitHops.put(owner.getEntityId(), System.currentTimeMillis());
+
+ PacketPlayOutEntityStatus entityStatus = new PacketPlayOutEntityStatus();
+ try
+ {
+ _eStatusId.set(entityStatus, entityId);
+ _eStatusState.set(entityStatus, (byte) 1);
+
+ handlePacket(entityStatus, packetVerifier);
+ }
+ catch (Exception ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+ }
+ }
+ }
+
if (packet instanceof PacketPlayOutPlayerInfo)
{
if (_blockedNames.contains(((PacketPlayOutPlayerInfo) packet).username))
@@ -520,10 +599,23 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
packetInfo.setCancelled(true);
}
}
- else if (packet instanceof PacketPlayOutSpawnEntity || packet instanceof PacketPlayOutNamedEntitySpawn)
+ else if (packet instanceof PacketPlayOutSpawnEntity || packet instanceof PacketPlayOutSpawnEntityLiving
+ || packet instanceof PacketPlayOutNamedEntitySpawn)
{
- int entityId = packet instanceof PacketPlayOutSpawnEntity ? ((PacketPlayOutSpawnEntity) packet).a
- : ((PacketPlayOutNamedEntitySpawn) packet).a;
+ int entityId = -1;
+
+ if (packet instanceof PacketPlayOutSpawnEntity)
+ {
+ entityId = ((PacketPlayOutSpawnEntity) packet).a;
+ }
+ else if (packet instanceof PacketPlayOutSpawnEntityLiving)
+ {
+ entityId = ((PacketPlayOutSpawnEntityLiving) packet).a;
+ }
+ else if (packet instanceof PacketPlayOutNamedEntitySpawn)
+ {
+ entityId = ((PacketPlayOutNamedEntitySpawn) packet).a;
+ }
if (_futureDisguises.containsKey(entityId))
{
@@ -737,6 +829,12 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
private void handleSpawnPackets(PacketInfo packetInfo, DisguiseBase disguise)
{
final Player player = packetInfo.getPlayer();
+
+ if (!UtilPlayer.is1_8(player) && disguise instanceof DisguiseRabbit)
+ {
+ return;
+ }
+
final PacketVerifier packetVerifier = packetInfo.getVerifier();
if (disguise instanceof DisguisePlayer)
@@ -795,54 +893,12 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
{
_disguisePlayerMap.get(disguise).remove(event.getPlayer());
}
- }
- /*public void reApplyDisguise(final DisguiseBase disguise, final Player player)
- {
- PacketPlayOutEntityDestroy destroyPacket = new PacketPlayOutEntityDestroy(disguise.GetEntityId());
-
- if (disguise.GetEntity() == ((CraftPlayer) player).getHandle())
- return;
-
- EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
-
- entityPlayer.playerConnection.sendPacket(destroyPacket);
-
- List tempArmor = new ArrayList();
-
- if (disguise instanceof DisguiseInsentient && disguise.GetEntity() instanceof LivingEntity)
+ for (Integer disguise : _lastRabbitHop.keySet())
{
- if (((DisguiseInsentient) disguise).armorVisible())
- {
- for (Packet armorPacket : ((DisguiseInsentient) disguise).getArmorPackets())
- tempArmor.add(armorPacket);
- }
+ _lastRabbitHop.get(disguise).remove(event.getPlayer().getEntityId());
}
-
- final List armorPackets = tempArmor;
-
- Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(getPlugin(), new Runnable()
- {
- public void run()
- {
- EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
- entityPlayer.playerConnection.sendPacket(disguise.GetSpawnPacket());
-
- if (disguise instanceof DisguisePlayer && ((DisguisePlayer) disguise).getSleepingDirection() != null)
- {
- for (Packet packet : getBedPackets(player.getLocation(), (DisguisePlayer) disguise))
- {
- entityPlayer.playerConnection.sendPacket(packet);
- }
- }
-
- for (Packet packet : armorPackets)
- {
- entityPlayer.playerConnection.sendPacket(packet);
- }
- }
- });
- }*/
+ }
private void prepareChunk(Location loc)
{
@@ -1007,6 +1063,7 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
if (!_spawnPacketMap.containsKey(entity.getEntityId()))
return;
+ _lastRabbitHop.remove(entity.getEntityId());
DisguiseBase disguise = _spawnPacketMap.remove(entity.getEntityId());
Collection extends Player> players = (disguise.Global ? Bukkit.getOnlinePlayers() : _disguisePlayerMap.remove(disguise));
@@ -1054,4 +1111,34 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
entityPlayer.playerConnection.sendPacket(disguise.GetMetaDataPacket());
}
}
+
+ @EventHandler
+ public void cleanDisguises(UpdateEvent event)
+ {
+ if (event.getType() != UpdateType.SLOWER || _disguisePlayerMap.isEmpty())
+ return;
+
+ for (Iterator disguiseIterator = _disguisePlayerMap.keySet().iterator(); disguiseIterator.hasNext();)
+ {
+ DisguiseBase disguise = disguiseIterator.next();
+
+ if (!(disguise.GetEntity() instanceof EntityPlayer))
+ continue;
+
+ EntityPlayer disguisedPlayer = (EntityPlayer)disguise.GetEntity();
+
+ if (Bukkit.getPlayerExact(disguisedPlayer.getName()) == null || !disguisedPlayer.isAlive() || !disguisedPlayer.valid)
+ disguiseIterator.remove();
+ else
+ {
+ for (Iterator playerIterator = _disguisePlayerMap.get(disguise).iterator(); playerIterator.hasNext();)
+ {
+ Player player = playerIterator.next();
+
+ if (!player.isOnline() || !player.isValid())
+ playerIterator.remove();
+ }
+ }
+ }
+ }
}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguisePlayer.java b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguisePlayer.java
index fa806d384..33126f3d6 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguisePlayer.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguisePlayer.java
@@ -1,5 +1,7 @@
package mineplex.core.disguise.disguises;
+import java.util.UUID;
+
import org.bukkit.Location;
import org.bukkit.block.BlockFace;
import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer;
@@ -31,7 +33,11 @@ public class DisguisePlayer extends DisguiseHuman
public void setProfile(GameProfile profile)
{
- _profile = profile;
+ GameProfile newProfile = new GameProfile(UUID.randomUUID(), profile.getName());
+
+ newProfile.getProperties().putAll(profile.getProperties());
+
+ _profile = newProfile;
}
public BlockFace getSleepingDirection()
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseRabbit.java b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseRabbit.java
new file mode 100644
index 000000000..cdde5fd6e
--- /dev/null
+++ b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseRabbit.java
@@ -0,0 +1,80 @@
+package mineplex.core.disguise.disguises;
+
+import net.minecraft.server.v1_7_R4.EnumEntitySize;
+import net.minecraft.server.v1_7_R4.MathHelper;
+import net.minecraft.server.v1_7_R4.Packet;
+import net.minecraft.server.v1_7_R4.PacketPlayOutSpawnEntityLiving;
+
+public class DisguiseRabbit extends DisguiseInsentient
+{
+
+ public DisguiseRabbit(org.bukkit.entity.Entity entity)
+ {
+ super(entity);
+
+ DataWatcher.a(4, Byte.valueOf((byte) 0));
+
+ DataWatcher.a(12, (byte) 0);
+ DataWatcher.a(15, Byte.valueOf((byte) 0));
+ DataWatcher.a(18, Byte.valueOf((byte) 0));
+ }
+
+ @Override
+ public Packet GetSpawnPacket()
+ {
+ PacketPlayOutSpawnEntityLiving packet = new PacketPlayOutSpawnEntityLiving();
+ packet.a = Entity.getId();
+ packet.b = (byte) 101;
+ packet.c = (int) EnumEntitySize.SIZE_2.a(Entity.locX);
+ packet.d = (int) MathHelper.floor(Entity.locY * 32.0D);
+ packet.e = (int) EnumEntitySize.SIZE_2.a(Entity.locZ);
+ packet.i = (byte) ((int) (Entity.yaw * 256.0F / 360.0F));
+ packet.j = (byte) ((int) (Entity.pitch * 256.0F / 360.0F));
+ packet.k = (byte) ((int) (Entity.yaw * 256.0F / 360.0F));
+
+ double var2 = 3.9D;
+ double var4 = 0;
+ double var6 = 0;
+ double var8 = 0;
+
+ if (var4 < -var2)
+ {
+ var4 = -var2;
+ }
+
+ if (var6 < -var2)
+ {
+ var6 = -var2;
+ }
+
+ if (var8 < -var2)
+ {
+ var8 = -var2;
+ }
+
+ if (var4 > var2)
+ {
+ var4 = var2;
+ }
+
+ if (var6 > var2)
+ {
+ var6 = var2;
+ }
+
+ if (var8 > var2)
+ {
+ var8 = var2;
+ }
+
+ packet.f = (int) (var4 * 8000.0D);
+ packet.g = (int) (var6 * 8000.0D);
+ packet.h = (int) (var8 * 8000.0D);
+
+ packet.l = DataWatcher;
+ packet.m = DataWatcher.b();
+
+ return packet;
+ }
+
+}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/CoinCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/CoinCommand.java
index 15219684c..3b6620451 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/donation/CoinCommand.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/CoinCommand.java
@@ -4,6 +4,7 @@ import java.util.UUID;
import org.bukkit.entity.Player;
+import mineplex.core.account.CoreClient;
import mineplex.core.command.CommandBase;
import mineplex.core.common.Rank;
import mineplex.core.common.util.Callback;
@@ -27,34 +28,39 @@ public class CoinCommand extends CommandBase
return;
}
- String targetName = args[0];
- String coinsString = args[1];
+ final String targetName = args[0];
+ final String coinsString = args[1];
Player target = UtilPlayer.searchExact(targetName);
if (target == null)
{
- UUID uuid = UUIDFetcher.getUUIDOf(targetName);
- if (uuid != null)
+ Plugin.getClientManager().loadClientByName(targetName, new Runnable()
{
- rewardCoins(caller, null, targetName, uuid, coinsString);
- }
- else
- {
- UtilPlayer.message(caller, F.main("Coin", "Could not find player " + F.name(targetName)));
- }
+ public void run()
+ {
+ CoreClient client = Plugin.getClientManager().Get(targetName);
+
+ if (client != null)
+ rewardCoins(caller, null, targetName, client.getAccountId(), coinsString);
+ else
+ {
+ UtilPlayer.message(caller, F.main("Coin", "Could not find player " + F.name(targetName)));
+ }
+ }
+ });
}
else
{
- rewardCoins(caller, target, target.getName(), target.getUniqueId(), coinsString);
+ rewardCoins(caller, target, target.getName(), Plugin.getClientManager().Get(target).getAccountId(), coinsString);
}
}
- private void rewardCoins(final Player caller, final Player target, final String targetName, final UUID uuid, String coinsString)
+ private void rewardCoins(final Player caller, final Player target, final String targetName, final int accountId, String coinsString)
{
try
{
int coins = Integer.parseInt(coinsString);
- rewardCoins(caller, target, targetName, uuid, coins);
+ rewardCoins(caller, target, targetName, accountId, coins);
}
catch (Exception e)
{
@@ -62,7 +68,7 @@ public class CoinCommand extends CommandBase
}
}
- private void rewardCoins(final Player caller, final Player target, final String targetName, final UUID uuid, final int coins)
+ private void rewardCoins(final Player caller, final Player target, final String targetName, final int accountId, final int coins)
{
Plugin.RewardCoins(new Callback()
{
@@ -75,6 +81,6 @@ public class CoinCommand extends CommandBase
UtilPlayer.message(target, F.main("Coin", F.name(caller.getName()) + " gave you " + F.elem(coins + " Coins") + "."));
}
}
- }, caller.getName(), targetName, uuid, coins);
+ }, caller.getName(), targetName, accountId, coins);
}
}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java
index cff2bdd9c..b8b2bf46b 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/DonationManager.java
@@ -58,7 +58,7 @@ public class DonationManager extends MiniDbClientPlugin
//_repository.updateGemsAndCoins(uuid, Get(token.Name).GetGems(), Get(token.Name).getCoins());
}
- public void PurchaseUnknownSalesPackage(final Callback callback, final String name, final UUID uuid, final String packageName, final boolean coinPurchase, final int cost, boolean oneTimePurchase)
+ public void PurchaseUnknownSalesPackage(final Callback callback, final String name, final int accountId, final String packageName, final boolean coinPurchase, final int cost, boolean oneTimePurchase)
{
final Donor donor = Bukkit.getPlayerExact(name) != null ? Get(name) : null;
@@ -89,7 +89,7 @@ public class DonationManager extends MiniDbClientPlugin
if (callback != null)
callback.run(response);
}
- }, name, uuid.toString(), packageName, coinPurchase, cost);
+ }, name, accountId, packageName, coinPurchase, cost);
}
public void PurchaseKnownSalesPackage(final Callback callback, final String name, final UUID uuid, final int cost, final int salesPackageId)
@@ -196,12 +196,12 @@ public class DonationManager extends MiniDbClientPlugin
_gemQueue.clear();
}
- public void RewardCoins(Callback callback, String caller, String name, UUID uuid, int amount)
+ public void RewardCoins(Callback callback, String caller, String name, int accountId, int amount)
{
- RewardCoins(callback, caller, name, uuid, amount, true);
+ RewardCoins(callback, caller, name, accountId, amount, true);
}
- public void RewardCoins(final Callback callback, final String caller, final String name, final UUID uuid, final int amount, final boolean updateTotal)
+ public void RewardCoins(final Callback callback, final String caller, final String name, final int accountId, final int amount, final boolean updateTotal)
{
_repository.rewardCoins(new Callback()
{
@@ -223,7 +223,7 @@ public class DonationManager extends MiniDbClientPlugin
callback.run(true);
}
}
- }, caller, name, uuid.toString(), amount);
+ }, caller, name, accountId, amount);
}
public void RewardCoinsLater(final String caller, final Player player, final int amount)
@@ -251,22 +251,35 @@ public class DonationManager extends MiniDbClientPlugin
if (event.getType() != UpdateType.SLOWER)
return;
- for (Player player : _coinQueue.keySet())
+ for (final Player player : _coinQueue.keySet())
{
- String caller = null;
- int total = 0;
+ String tempCaller = null;
+ int tempTotal = 0;
for (String curCaller : _coinQueue.get(player).keySet())
{
- caller = curCaller;
- total += _coinQueue.get(player).get(curCaller);
+ tempCaller = curCaller;
+ tempTotal += _coinQueue.get(player).get(curCaller);
}
+ final int total = tempTotal;
+ final String caller = tempCaller;
+
if (caller == null)
continue;
- //Actually Add Gems
- RewardCoins(null, caller, player.getName(), player.getUniqueId(), total, false);
+ if (player.isOnline() && player.isValid())
+ RewardCoins(null, caller, player.getName(), ClientManager.Get(player).getAccountId(), total, false);
+ else
+ {
+ Bukkit.getServer().getScheduler().runTaskAsynchronously(getPlugin(), new Runnable()
+ {
+ public void run()
+ {
+ RewardCoins(null, caller, player.getName(), ClientManager.getCachedClientAccountId(player.getUniqueId()), total, false);
+ }
+ });
+ }
System.out.println("Queue Added [" + player + "] with Coins [" + total + "] for [" + caller + "]");
@@ -278,12 +291,12 @@ public class DonationManager extends MiniDbClientPlugin
_coinQueue.clear();
}
- public void RewardGold(Callback callback, String caller, String name, UUID uuid, int amount)
+ public void RewardGold(Callback callback, String caller, String name, int accountId, int amount)
{
- RewardGold(callback, caller, name, uuid, amount, true);
+ RewardGold(callback, caller, name, accountId, amount, true);
}
- public void RewardGold(final Callback callback, final String caller, final String name, final UUID uuid, final int amount, final boolean updateTotal)
+ public void RewardGold(final Callback callback, final String caller, final String name, final int accountId, final int amount, final boolean updateTotal)
{
_repository.rewardGold(new Callback()
{
@@ -309,7 +322,7 @@ public class DonationManager extends MiniDbClientPlugin
if (callback != null)
callback.run(true);
}
- }, caller, name, uuid.toString(), amount);
+ }, caller, name, accountId, amount);
}
public void RewardGoldLater(final String caller, final Player player, final int amount)
@@ -352,7 +365,7 @@ public class DonationManager extends MiniDbClientPlugin
continue;
//Actually Add Gold
- RewardGold(null, caller, player.getName(), player.getUniqueId(), total, false);
+ RewardGold(null, caller, player.getName(), ClientManager.Get(player).getAccountId(), total, false);
System.out.println("Queue Added [" + player + "] with Gold [" + total + "] for [" + caller + "]");
@@ -375,15 +388,15 @@ public class DonationManager extends MiniDbClientPlugin
Get(playerName).addGold(_repository.retrieveDonorInfo(resultSet).getGold());
}
- @Override
- public String getQuery(String uuid, String name)
- {
- return "SELECT gold FROM accounts WHERE uuid = '" + uuid + "';";
- }
-
@Override
protected Donor AddPlayer(String player)
{
return new Donor();
}
+
+ @Override
+ public String getQuery(int accountId, String uuid, String name)
+ {
+ return "SELECT gold FROM accounts WHERE id = '" + accountId + "';";
+ }
}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/GoldCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/GoldCommand.java
index 99e12ed0d..384b0b997 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/donation/GoldCommand.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/GoldCommand.java
@@ -4,6 +4,7 @@ import java.util.UUID;
import org.bukkit.entity.Player;
+import mineplex.core.account.CoreClient;
import mineplex.core.command.CommandBase;
import mineplex.core.common.Rank;
import mineplex.core.common.util.Callback;
@@ -31,34 +32,39 @@ public class GoldCommand extends CommandBase
return;
}
- String targetName = args[0];
- String goldString = args[1];
+ final String targetName = args[0];
+ final String goldString = args[1];
Player target = UtilPlayer.searchExact(targetName);
if (target == null)
{
- UUID uuid = UUIDFetcher.getUUIDOf(targetName);
- if (uuid != null)
+ Plugin.getClientManager().loadClientByName(targetName, new Runnable()
{
- rewardGold(caller, null, targetName, uuid, goldString);
- }
- else
- {
- UtilPlayer.message(caller, F.main("Gold", "Could not find player " + F.name(targetName)));
- }
+ public void run()
+ {
+ CoreClient client = Plugin.getClientManager().Get(targetName);
+
+ if (client != null)
+ rewardGold(caller, null, targetName, client.getAccountId(), goldString);
+ else
+ {
+ UtilPlayer.message(caller, F.main("Gold", "Could not find player " + F.name(targetName)));
+ }
+ }
+ });
}
else
{
- rewardGold(caller, target, target.getName(), target.getUniqueId(), goldString);
+ rewardGold(caller, target, target.getName(), Plugin.getClientManager().Get(target).getAccountId(), goldString);
}
}
- private void rewardGold(final Player caller, final Player target, final String targetName, final UUID uuid, String goldString)
+ private void rewardGold(final Player caller, final Player target, final String targetName, final int accountId, String goldString)
{
try
{
int gold = Integer.parseInt(goldString);
- rewardGold(caller, target, targetName, uuid, gold);
+ rewardGold(caller, target, targetName, accountId, gold);
}
catch (Exception e)
{
@@ -66,7 +72,7 @@ public class GoldCommand extends CommandBase
}
}
- private void rewardGold(final Player caller, final Player target, final String targetName, final UUID uuid, final int gold)
+ private void rewardGold(final Player caller, final Player target, final String targetName, final int accountId, final int gold)
{
Plugin.RewardGold(new Callback()
{
@@ -79,6 +85,6 @@ public class GoldCommand extends CommandBase
UtilPlayer.message(target, F.main("Gold", F.name(caller.getName()) + " gave you " + F.elem(gold + " Gold") + "."));
}
}
- }, caller.getName(), targetName, uuid, gold);
+ }, caller.getName(), targetName, accountId, gold);
}
}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/DonationRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/DonationRepository.java
index 818c95df9..bd7a75a7b 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/DonationRepository.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/donation/repository/DonationRepository.java
@@ -2,12 +2,12 @@ package mineplex.core.donation.repository;
import java.sql.ResultSet;
import java.sql.SQLException;
-import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
import mineplex.core.common.util.Callback;
+import mineplex.core.database.DBPool;
import mineplex.core.database.DatabaseRunnable;
import mineplex.core.database.RepositoryBase;
import mineplex.core.database.column.ColumnInt;
@@ -22,18 +22,18 @@ import mineplex.core.server.util.TransactionResponse;
public class DonationRepository extends RepositoryBase
{
- private static String CREATE_COIN_TRANSACTION_TABLE = "CREATE TABLE IF NOT EXISTS accountCoinTransactions (id INT NOT NULL AUTO_INCREMENT, accounts_uuid VARCHAR(100), reason VARCHAR(100), coins INT, PRIMARY KEY (id), FOREIGN KEY (accounts_uuid) REFERENCES accounts(uuid), INDEX coinUuidIndex (accounts_uuid));";
- private static String CREATE_GEM_TRANSACTION_TABLE = "CREATE TABLE IF NOT EXISTS accountGemTransactions (id INT NOT NULL AUTO_INCREMENT, accounts_uuid VARCHAR(100), reason VARCHAR(100), gems INT, PRIMARY KEY (id), FOREIGN KEY (accounts_uuid) REFERENCES accounts(uuid), INDEX gemUuidIndex (accounts_uuid));";
- private static String INSERT_COIN_TRANSACTION = "INSERT INTO accountCoinTransactions(accounts_uuid, reason, coins) VALUES(?, ?, ?);";
- private static String UPDATE_ACCOUNT_COINS = "UPDATE accounts SET coins = coins + ? WHERE uuid = ?;";
- private static String UPDATE_ACCOUNT_GOLD = "UPDATE accounts SET gold = gold + ? WHERE uuid = ?;";
- private static String UPDATE_NULL_ACCOUNT_GEMS_AND_COINS_ = "UPDATE accounts SET gems = ?, coins = ? WHERE uuid = ? AND gems IS NULL AND coins IS NULL;";
+ private static String CREATE_COIN_TRANSACTION_TABLE = "CREATE TABLE IF NOT EXISTS accountCoinTransactions (id INT NOT NULL AUTO_INCREMENT, accountId INT, reason VARCHAR(100), coins INT, PRIMARY KEY (id), FOREIGN KEY (accountId) REFERENCES accounts(id));";
+ private static String CREATE_GEM_TRANSACTION_TABLE = "CREATE TABLE IF NOT EXISTS accountGemTransactions (id INT NOT NULL AUTO_INCREMENT, accountId INT, reason VARCHAR(100), gems INT, PRIMARY KEY (id), FOREIGN KEY (accountId) REFERENCES accounts(id));";
+ private static String INSERT_COIN_TRANSACTION = "INSERT INTO accountCoinTransactions(accountId, reason, coins) VALUES(?, ?, ?);";
+ private static String UPDATE_ACCOUNT_COINS = "UPDATE accounts SET coins = coins + ? WHERE id = ?;";
+ private static String UPDATE_ACCOUNT_GOLD = "UPDATE accounts SET gold = gold + ? WHERE id = ?;";
+ private static String UPDATE_NULL_ACCOUNT_GEMS_AND_COINS_ = "UPDATE accounts SET gems = ?, coins = ? WHERE id = ? AND gems IS NULL AND coins IS NULL;";
private String _webAddress;
public DonationRepository(JavaPlugin plugin, String webAddress)
{
- super(plugin, "jdbc:mysql://db.mineplex.com:3306/Account?autoReconnect=true&failOverReadOnly=false&maxReconnects=10", "root", "tAbechAk3wR7tuTh");
+ super(plugin, DBPool.ACCOUNT);
_webAddress = webAddress;
}
@@ -69,7 +69,7 @@ public class DonationRepository extends RepositoryBase
}), "Error purchasing known sales package in DonationRepository : ");
}
- public void PurchaseUnknownSalesPackage(final Callback callback, final String name, final String uuid, final String packageName, final boolean coinPurchase, final int cost)
+ public void PurchaseUnknownSalesPackage(final Callback callback, final String name, final int accountId, final String packageName, final boolean coinPurchase, final int cost)
{
final UnknownPurchaseToken token = new UnknownPurchaseToken();
token.AccountName = name;
@@ -86,8 +86,8 @@ public class DonationRepository extends RepositoryBase
{
if (coinPurchase)
{
- executeUpdate(UPDATE_ACCOUNT_COINS, new ColumnInt("coins", -cost), new ColumnVarChar("uuid", 100, uuid));
- executeUpdate(INSERT_COIN_TRANSACTION, new ColumnVarChar("uuid", 100, uuid), new ColumnVarChar("reason", 100, "Purchased " + packageName), new ColumnInt("coins", -cost));
+ executeUpdate(UPDATE_ACCOUNT_COINS, new ColumnInt("coins", -cost), new ColumnInt("id", accountId));
+ //executeUpdate(INSERT_COIN_TRANSACTION, new ColumnInt("id", accountId), new ColumnVarChar("reason", 100, "Purchased " + packageName), new ColumnInt("coins", -cost));
}
}
@@ -142,7 +142,7 @@ public class DonationRepository extends RepositoryBase
}), "Error updating player gem amount in DonationRepository : ");
}
- public void rewardCoins(final Callback callback, final String giver, String name, final String uuid, final int coins)
+ public void rewardCoins(final Callback callback, final String giver, String name, final int accountId, final int coins)
{
final GemRewardToken token = new GemRewardToken();
token.Source = giver;
@@ -155,8 +155,8 @@ public class DonationRepository extends RepositoryBase
{
if (response)
{
- executeUpdate(UPDATE_ACCOUNT_COINS, new ColumnInt("coins", coins), new ColumnVarChar("uuid", 100, uuid));
- executeUpdate(INSERT_COIN_TRANSACTION, new ColumnVarChar("uuid", 100, uuid), new ColumnVarChar("reason", 100, "Rewarded by " + giver), new ColumnInt("coins", coins));
+ executeUpdate(UPDATE_ACCOUNT_COINS, new ColumnInt("coins", coins), new ColumnInt("id", accountId));
+ //executeUpdate(INSERT_COIN_TRANSACTION, new ColumnInt("id", accountId), new ColumnVarChar("reason", 100, "Rewarded by " + giver), new ColumnInt("coins", coins));
}
Bukkit.getServer().getScheduler().runTask(Plugin, new Runnable()
@@ -179,13 +179,13 @@ public class DonationRepository extends RepositoryBase
}), "Error updating player coin amount in DonationRepository : ");
}
- public void rewardGold(final Callback callback, final String giver, final String name, final String uuid, final int gold)
+ public void rewardGold(final Callback callback, final String giver, final String name, final int accountId, final int gold)
{
handleDatabaseCall(new DatabaseRunnable(new Runnable()
{
public void run()
{
- if (executeUpdate(UPDATE_ACCOUNT_GOLD, new ColumnInt("gold", gold), new ColumnVarChar("uuid", 100, uuid)) < 1)
+ if (executeUpdate(UPDATE_ACCOUNT_GOLD, new ColumnInt("gold", gold), new ColumnInt("id", accountId)) < 1)
{
callback.run(false);
}
@@ -207,13 +207,13 @@ public class DonationRepository extends RepositoryBase
{
}
- public void updateGemsAndCoins(final UUID uuid, final int gems, final int coins)
+ public void updateGemsAndCoins(final int accountId, final int gems, final int coins)
{
handleDatabaseCall(new DatabaseRunnable(new Runnable()
{
public void run()
{
- executeUpdate(UPDATE_NULL_ACCOUNT_GEMS_AND_COINS_, new ColumnInt("gems", gems), new ColumnInt("coins", coins), new ColumnVarChar("uuid", 100, uuid.toString()));
+ executeUpdate(UPDATE_NULL_ACCOUNT_GEMS_AND_COINS_, new ColumnInt("gems", gems), new ColumnInt("coins", coins), new ColumnInt("id", accountId));
}
}), "Error updating player's null gems and coins DonationRepository : ");
}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/elo/EloManager.java b/Plugins/Mineplex.Core/src/mineplex/core/elo/EloManager.java
index 858e89198..01f927d39 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/elo/EloManager.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/elo/EloManager.java
@@ -114,7 +114,7 @@ public class EloManager extends MiniDbClientPlugin
}
@Override
- public String getQuery(String uuid, String name)
+ public String getQuery(int accountId, String uuid, String name)
{
return "SELECT gameType, elo FROM eloRating WHERE uuid = '" + uuid + "';";
}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/elo/EloRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/elo/EloRepository.java
index ba8f1428a..54503474f 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/elo/EloRepository.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/elo/EloRepository.java
@@ -5,6 +5,7 @@ import java.sql.SQLException;
import org.bukkit.plugin.java.JavaPlugin;
+import mineplex.core.database.DBPool;
import mineplex.core.database.RepositoryBase;
import mineplex.core.database.column.ColumnInt;
import mineplex.core.database.column.ColumnVarChar;
@@ -16,7 +17,7 @@ public class EloRepository extends RepositoryBase
public EloRepository(JavaPlugin plugin)
{
- super(plugin, "jdbc:mysql://db.mineplex.com:3306/Account?autoReconnect=true&failOverReadOnly=false&maxReconnects=10", "root", "tAbechAk3wR7tuTh");
+ super(plugin, DBPool.ACCOUNT);
initialize();
}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/friend/FriendManager.java b/Plugins/Mineplex.Core/src/mineplex/core/friend/FriendManager.java
index fe6a0d892..13b9e41e6 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/friend/FriendManager.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/friend/FriendManager.java
@@ -407,9 +407,9 @@ public class FriendManager extends MiniDbClientPlugin
}
@Override
- public String getQuery(String uuid, String name)
+ public String getQuery(int accountId, String uuid, String name)
{
- return "SELECT tA.Name, status, serverName, tA.lastLogin, now() FROM accountFriend INNER Join accounts AS fA ON fA.uuid = uuidSource INNER JOIN accounts AS tA ON tA.uuid = uuidTarget LEFT JOIN playerMap ON tA.name = playerName WHERE uuidSource = '"
+ return "SELECT tA.Name, status, tA.lastLogin, now() FROM accountFriend INNER Join accounts AS fA ON fA.uuid = uuidSource INNER JOIN accounts AS tA ON tA.uuid = uuidTarget WHERE uuidSource = '"
+ uuid + "';";
}
}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/friend/command/AddFriend.java b/Plugins/Mineplex.Core/src/mineplex/core/friend/command/AddFriend.java
index 706600eb6..7d2685edb 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/friend/command/AddFriend.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/friend/command/AddFriend.java
@@ -18,7 +18,7 @@ public class AddFriend extends CommandBase
@Override
public void Execute(final Player caller, final String[] args)
{
- if (args == null)
+ if (args == null || args.length < 1)
{
if (Plugin.getPreferenceManager().Get(caller).friendDisplayInventoryUI)
{
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/friend/data/FriendRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/friend/data/FriendRepository.java
index c285ab807..359220020 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/friend/data/FriendRepository.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/friend/data/FriendRepository.java
@@ -2,27 +2,45 @@ package mineplex.core.friend.data;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import mineplex.core.common.util.NautHashMap;
+import mineplex.core.database.DBPool;
import mineplex.core.database.RepositoryBase;
import mineplex.core.database.ResultSetCallable;
import mineplex.core.database.column.ColumnVarChar;
import mineplex.core.friend.FriendStatusType;
+import mineplex.serverdata.Region;
+import mineplex.serverdata.data.DataRepository;
+import mineplex.serverdata.data.PlayerStatus;
+import mineplex.serverdata.redis.RedisDataRepository;
+import mineplex.serverdata.servers.ServerManager;
public class FriendRepository extends RepositoryBase
{
private static String CREATE_FRIEND_TABLE = "CREATE TABLE IF NOT EXISTS accountFriend (id INT NOT NULL AUTO_INCREMENT, uuidSource VARCHAR(100), uuidTarget VARCHAR(100), status VARCHAR(100), PRIMARY KEY (id), UNIQUE INDEX uuidIndex (uuidSource, uuidTarget));";
- private static String RETRIEVE_MULTIPLE_FRIEND_RECORDS = "SELECT uuidSource, tA.Name, status, serverName, tA.lastLogin, now() FROM accountFriend INNER Join accounts AS fA ON fA.uuid = uuidSource INNER JOIN accounts AS tA ON tA.uuid = uuidTarget LEFT JOIN playerMap ON tA.name = playerName WHERE uuidSource IN ";
+ private static String RETRIEVE_MULTIPLE_FRIEND_RECORDS = "SELECT uuidSource, tA.Name, status, tA.lastLogin, now() FROM accountFriend INNER Join accounts AS fA ON fA.uuid = uuidSource INNER JOIN accounts AS tA ON tA.uuid = uuidTarget WHERE uuidSource IN ";
private static String ADD_FRIEND_RECORD = "INSERT INTO accountFriend (uuidSource, uuidTarget, status, created) SELECT fA.uuid AS uuidSource, tA.uuid AS uuidTarget, ?, now() FROM accounts as fA LEFT JOIN accounts AS tA ON tA.name = ? WHERE fA.name = ?;";
private static String UPDATE_MUTUAL_RECORD = "UPDATE accountFriend AS aF INNER JOIN accounts as fA ON aF.uuidSource = fA.uuid INNER JOIN accounts AS tA ON aF.uuidTarget = tA.uuid SET aF.status = ? WHERE tA.name = ? AND fA.name = ?;";
private static String DELETE_FRIEND_RECORD = "DELETE aF FROM accountFriend AS aF INNER JOIN accounts as fA ON aF.uuidSource = fA.uuid INNER JOIN accounts AS tA ON aF.uuidTarget = tA.uuid WHERE fA.name = ? AND tA.name = ?;";
+ // Repository holding active PlayerStatus data.
+ private DataRepository _repository;
+
public FriendRepository(JavaPlugin plugin)
{
- super(plugin, "jdbc:mysql://db.mineplex.com:3306/Account?autoReconnect=true&failOverReadOnly=false&maxReconnects=10", "root", "tAbechAk3wR7tuTh");
+ super(plugin, DBPool.ACCOUNT);
+
+ _repository = new RedisDataRepository(ServerManager.getMasterConnection(), ServerManager.getSlaveConnection(),
+ Region.currentRegion(), PlayerStatus.class, "playerStatus");
}
@Override
@@ -80,29 +98,35 @@ public class FriendRepository extends RepositoryBase
{
public void processResultSet(ResultSet resultSet) throws SQLException
{
+ Set