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 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 friendDatas = new HashSet(); while (resultSet.next()) { FriendStatus friend = new FriendStatus(); String uuidSource = resultSet.getString(1); friend.Name = resultSet.getString(2); - friend.Status = Enum.valueOf(FriendStatusType.class, resultSet.getString(3)); - friend.ServerName = resultSet.getString(4); - friend.Online = !(friend.ServerName == null || friend.ServerName.isEmpty()); - - friend.LastSeenOnline = resultSet.getTimestamp(6).getTime() - resultSet.getTimestamp(5).getTime(); + friend.Status = Enum.valueOf(FriendStatusType.class, resultSet.getString(3)); + friend.LastSeenOnline = resultSet.getTimestamp(5).getTime() - resultSet.getTimestamp(4).getTime(); if (!friends.containsKey(uuidSource)) friends.put(uuidSource, new FriendData()); friends.get(uuidSource).getFriends().add(friend); + + friendDatas.add(friends.get(uuidSource)); + } + + // Load the server status of friends for all sources. + for(FriendData friendData : friendDatas) + { + loadFriendStatuses(friendData); } } }); return friends; } - + public FriendData loadClientInformation(ResultSet resultSet) throws SQLException { FriendData friendData = new FriendData(); @@ -113,12 +137,59 @@ public class FriendRepository extends RepositoryBase friend.Name = resultSet.getString(1); friend.Status = Enum.valueOf(FriendStatusType.class, resultSet.getString(2)); - friend.ServerName = resultSet.getString(3); - friend.LastSeenOnline = resultSet.getTimestamp(5).getTime() - resultSet.getTimestamp(4).getTime(); - + friend.LastSeenOnline = resultSet.getTimestamp(4).getTime() - resultSet.getTimestamp(3).getTime(); + friend.ServerName = null; + friend.Online = (friend.ServerName != null); friendData.getFriends().add(friend); } + + loadFriendStatuses(friendData); return friendData; } + + /** + * Load the server status information for a list of {@link FriendStatus}. + * @param friendData - the {@link FriendStatus} object friends server status' are to be updated + * @param statuses - the fetched {@link PlayerStatus} associated with all online {@code friends}. + */ + public void loadFriendStatuses(FriendData friendData) + { + // Generate a set of all friend names + Set friendNames = new HashSet(); + for(FriendStatus status : friendData.getFriends()) + { + friendNames.add(status.Name); + } + + // Load PlayerStatus' for friends + Collection statuses = _repository.getElements(friendNames); + + // Load player statuses into a mapping + Map playerStatuses = new HashMap(); + for(PlayerStatus status : statuses) + { + playerStatuses.put(status.getName(), status); + } + + // Load status information into friend data. + for (FriendStatus friend : friendData.getFriends()) + { + PlayerStatus status = playerStatuses.get(friend.Name); + friend.Online = (status != null); + friend.ServerName = (friend.Online) ? status.getServer() : null; + } + } + + /** + * @param playerName - the name of the player whose current server status is being fetched + * @return the {@link MinecraftServer} name that the player matching {@code playerName} + * is currently online on, if they are online, null otherwise. + */ + public String fetchPlayerServer(String playerName) + { + PlayerStatus status = _repository.getElement(playerName); + + return (status == null) ? null : status.getServer(); + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/friend/redis/DeleteFriend.java b/Plugins/Mineplex.Core/src/mineplex/core/friend/redis/DeleteFriend.java new file mode 100644 index 000000000..3f7ff0438 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/friend/redis/DeleteFriend.java @@ -0,0 +1,24 @@ +package mineplex.core.friend.redis; + +import mineplex.serverdata.commands.ServerCommand; + +public class DeleteFriend extends ServerCommand +{ + private String _deleter; + private String _deleted; + + public String getDeleter() { return _deleter; } + public String getDeleted() { return _deleted; } + + public DeleteFriend(String deleter, String deleted) + { + _deleter = deleter; + _deleted = deleted; + } + + @Override + public void run() + { + // Utilitizes a callback functionality to seperate dependencies + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/friend/redis/DeleteFriendHandler.java b/Plugins/Mineplex.Core/src/mineplex/core/friend/redis/DeleteFriendHandler.java new file mode 100644 index 000000000..2cff73b84 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/friend/redis/DeleteFriendHandler.java @@ -0,0 +1,6 @@ +package mineplex.core.friend.redis; + +public class DeleteFriendHandler +{ + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/friend/redis/FriendRequest.java b/Plugins/Mineplex.Core/src/mineplex/core/friend/redis/FriendRequest.java new file mode 100644 index 000000000..3dfd23205 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/friend/redis/FriendRequest.java @@ -0,0 +1,24 @@ +package mineplex.core.friend.redis; + +import mineplex.serverdata.commands.ServerCommand; + +public class FriendRequest extends ServerCommand +{ + private String _requester; + private String _requested; + + public String getRequester() { return _requester; } + public String getRequested() { return _requested; } + + public FriendRequest(String requester, String requested) + { + _requester = requester; + _requested = requested; + } + + @Override + public void run() + { + // Utilitizes a callback functionality to seperate dependencies + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Core/src/mineplex/core/friend/redis/FriendRequestHandler.java b/Plugins/Mineplex.Core/src/mineplex/core/friend/redis/FriendRequestHandler.java new file mode 100644 index 000000000..7e43e2922 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/friend/redis/FriendRequestHandler.java @@ -0,0 +1,6 @@ +package mineplex.core.friend.redis; + +public class FriendRequestHandler +{ + +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java index 8f3a1d912..775206ffd 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java @@ -119,6 +119,7 @@ public class GadgetManager extends MiniPlugin addGadget(new MorphBlaze(this)); //addGadget(new MorphGeno(this)); addGadget(new MorphWither(this)); + addGadget(new MorphBunny(this)); // Particles addGadget(new ParticleFoot(this)); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemFleshHook.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemFleshHook.java index 165f662ed..44eb1ca17 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemFleshHook.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemFleshHook.java @@ -46,7 +46,7 @@ public class ItemFleshHook extends ItemGadget implements IThrown 1.6, false, 0, 0.2, 10, false); Manager.getProjectileManager().AddThrow(item, player, this, -1, true, true, true, - Sound.FIRE_IGNITE, 1.4f, 0.8f, ParticleType.CRIT, null, 0, UpdateType.TICK, 2d); + Sound.FIRE_IGNITE, 1.4f, 0.8f, ParticleType.CRIT, null, 0, UpdateType.TICK, 0.5f); //Inform UtilPlayer.message(player, F.main("Skill", "You used " + F.skill(GetName()) + ".")); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemMelonLauncher.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemMelonLauncher.java index faff21e22..a2ee2c308 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemMelonLauncher.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemMelonLauncher.java @@ -58,7 +58,7 @@ public class ItemMelonLauncher extends ItemGadget implements IThrown 1, false, 0, 0.2, 10, false); Manager.getProjectileManager().AddThrow(item, player, this, -1, true, true, true, - null, 1f, 1f, null, null, 0, UpdateType.TICK, 2d); + null, 1f, 1f, null, null, 0, UpdateType.TICK, 0.5f); //Inform UtilPlayer.message(player, F.main("Skill", "You used " + F.skill(GetName()) + ".")); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphBat.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphBat.java index 373abb30e..0d6d18762 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphBat.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphBat.java @@ -115,7 +115,7 @@ public class MorphBat extends MorphGadget implements IThrown 0.01, true, -0.3, 0, 10, false); Manager.getProjectileManager().AddThrow(item, player, this, -1, true, true, true, - null, 1f, 1f, null, null, 0, UpdateType.TICK, 3d); + null, 1f, 1f, null, null, 0, UpdateType.TICK, 0.5f); //Inform UtilPlayer.message(player, F.main("Skill", "You used " + F.skill("Poop") + ".")); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphBunny.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphBunny.java new file mode 100644 index 000000000..5026ebbd7 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphBunny.java @@ -0,0 +1,253 @@ +package mineplex.core.gadget.gadgets; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Color; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.FireworkEffect.Type; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.ItemDespawnEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerPickupItemEvent; +import org.bukkit.event.player.PlayerToggleSneakEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import mineplex.core.common.CurrencyType; +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilAction; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilEvent; +import mineplex.core.common.util.UtilFirework; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.common.util.UtilServer; +import mineplex.core.disguise.disguises.DisguiseRabbit; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.types.MorphGadget; +import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; + +public class MorphBunny extends MorphGadget +{ + private HashSet _jumpCharge = new HashSet(); + private HashMap _eggs = new HashMap(); + + public MorphBunny(GadgetManager manager) + { + super(manager, "Easter Bunny Morph", new String[] + { + C.cWhite + "Happy Easter!", + " ", + C.cYellow + "Charge Crouch" + C.cGray + " to use " + C.cGreen + "Super Jump", + C.cYellow + "Left Click" + C.cGray + " to use " + C.cGreen + "Hide Easter Egg", + " ", + C.cRed +C.Bold + "WARNING: " + ChatColor.RESET + "Hide Easter Egg uses 500 Coins" , + " ", + C.cPurple + "Special Limited Time Morph", + C.cPurple + "Purchase at www.mineplex.com/shop", + }, + -1, + Material.MONSTER_EGG, (byte)98); + } + + @Override + public void EnableCustom(final Player player) + { + this.ApplyArmor(player); + + DisguiseRabbit disguise = new DisguiseRabbit(player); + disguise.setName(player.getName(), Manager.getClientManager().Get(player).GetRank()); + disguise.setCustomNameVisible(true); + Manager.getDisguiseManager().disguise(disguise); + + player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 999999999, 1)); + player.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 999999999, 1)); + } + + @Override + public void DisableCustom(Player player) + { + _jumpCharge.remove(player); + this.RemoveArmor(player); + Manager.getDisguiseManager().undisguise(player); + + player.removePotionEffect(PotionEffectType.SPEED); + player.removePotionEffect(PotionEffectType.JUMP); + + } + + @EventHandler + public void jumpTrigger(PlayerToggleSneakEvent event) + { + Player player = event.getPlayer(); + + if (!IsActive(player)) + return; + + //Start + if (!event.getPlayer().isSneaking()) + { + if (UtilEnt.isGrounded(event.getPlayer())) + _jumpCharge.add(event.getPlayer()); + } + //Jump + else if (_jumpCharge.remove(event.getPlayer())) + { + float power = player.getExp(); + player.setExp(0f); + + UtilAction.velocity(player, power * 4, 0.4, 4, true); + + player.getWorld().playSound(player.getLocation(), Sound.CAT_HIT, 0.75f, 2f); + } + } + + @EventHandler + public void jumpBoost(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; + + Iterator jumpIter = _jumpCharge.iterator(); + + while (jumpIter.hasNext()) + { + Player player = jumpIter.next(); + + if (!player.isValid() || !player.isOnline() || !player.isSneaking()) + { + jumpIter.remove(); + continue; + } + + player.setExp(Math.min(0.9999f, player.getExp() + 0.03f)); + + player.playSound(player.getLocation(), Sound.FIZZ, 0.25f + player.getExp() * 0.5f, 0.5f + player.getExp()); + } + } + + @EventHandler + public void eggHide(PlayerInteractEvent event) + { + Player player = event.getPlayer(); + + if (!IsActive(player)) + return; + + if (!UtilEvent.isAction(event, ActionType.L)) + return; + + if (Manager.getDonationManager().Get(player.getName()).GetBalance(CurrencyType.Coins) < 500) + { + UtilPlayer.message(player, F.main("Gadget", "You do not have enough Coins.")); + return; + } + + if (!Recharge.Instance.use(player, "Hide Egg", 30000, true, false)) + return; + + //Color + + + //Item + ItemStack eggStack = ItemStackFactory.Instance.CreateStack(Material.MONSTER_EGG, (byte)0, 1, "Hidden Egg" + System.currentTimeMillis()); + eggStack.setDurability((short) 98); + + Item egg = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()), eggStack); + UtilAction.velocity(egg, player.getLocation().getDirection(), 0.2, false, 0, 0.2, 1, false); + + + Manager.getDonationManager().RewardCoinsLater(this.GetName() + " Egg Hide", player, -500); + + egg.setPickupDelay(40); + + _eggs.put(egg, player.getName()); + + //Announce + Bukkit.broadcastMessage(C.cYellow + C.Bold + player.getName() + + ChatColor.RESET + C.Bold + " hid an " + + C.cYellow + C.Bold + "Easter Egg" + + ChatColor.RESET + C.Bold + " worth " + + C.cYellow + C.Bold + "450 Coins"); + + for (Player other : UtilServer.getPlayers()) + other.playSound(other.getLocation(), Sound.CAT_HIT, 1.5f, 1.5f); + } + + @EventHandler + public void eggPickup(PlayerPickupItemEvent event) + { + if (_eggs.containsKey(event.getItem()) && !_eggs.get(event.getItem()).equals(event.getPlayer().getName())) + { + _eggs.remove(event.getItem()); + + event.setCancelled(true); + event.getItem().remove(); + + Manager.getDonationManager().RewardCoinsLater(GetName() + " Egg Pickup", event.getPlayer(), 450); + + event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.ORB_PICKUP, 1.5f, 0.75f); + event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.ORB_PICKUP, 1.5f, 1.25f); + + UtilFirework.playFirework(event.getItem().getLocation(), Type.BURST, Color.YELLOW, true, true); + + //Announce + Bukkit.broadcastMessage(C.cGold + C.Bold + event.getPlayer().getName() + + ChatColor.RESET + C.Bold + " found an " + + C.cGold + C.Bold + "Easter Egg" + + ChatColor.RESET + C.Bold + "! " + _eggs.size() + " Eggs left!"); + } + } + + @EventHandler + public void eggClean(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + return; + + Iterator eggIter = _eggs.keySet().iterator(); + + while (eggIter.hasNext()) + { + Item egg = eggIter.next(); + + if (!egg.isValid() || egg.getTicksLived() > 24000) + { + egg.remove(); + eggIter.remove(); + + //Announce + Bukkit.broadcastMessage( + ChatColor.RESET + C.Bold + "No one found an " + + C.cGold + C.Bold + "Easter Egg" + + ChatColor.RESET + C.Bold + "! " + _eggs.size() + " Eggs left!"); + } + else + { + UtilParticle.PlayParticle(ParticleType.SPELL, egg.getLocation().add(0, 0.1, 0), 0.1f, 0.1f, 0.1f, 0, 1); + } + } + } + + @EventHandler + public void eggDespawnCancel(ItemDespawnEvent event) + { + if (_eggs.containsKey(event.getEntity())) + event.setCancelled(true); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphPumpkinKing.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphPumpkinKing.java index da9dd87f5..13c83e5d9 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphPumpkinKing.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphPumpkinKing.java @@ -11,6 +11,7 @@ import mineplex.core.common.util.UtilServer; import mineplex.core.disguise.disguises.DisguiseSkeleton; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.types.MorphGadget; +import mineplex.core.visibility.VisibilityManager; public class MorphPumpkinKing extends MorphGadget { @@ -43,17 +44,8 @@ public class MorphPumpkinKing extends MorphGadget player.getInventory().setHelmet(new ItemStack(Material.JACK_O_LANTERN)); - Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Manager.getPlugin(), new Runnable() - { - public void run() - { - for (Player other : UtilServer.getPlayers()) - { - other.hidePlayer(player); - other.showPlayer(player); - } - } - }, 0); + VisibilityManager.Instance.setVisibility(player, false, UtilServer.getPlayers()); + VisibilityManager.Instance.setVisibility(player, true, UtilServer.getPlayers()); } @Override diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphVillager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphVillager.java index ccca1c2be..c2f0d04b1 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphVillager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphVillager.java @@ -98,7 +98,7 @@ public class MorphVillager extends MorphGadget implements IThrown //Throw Manager.getProjectileManager().AddThrow(gem, player, this, -1, true, true, true, - null, 1.4f, 0.8f, null, null, 0, UpdateType.TICK, 2d); + null, 1.4f, 0.8f, null, null, 0, UpdateType.TICK, 0.5f); Manager.getDonationManager().RewardGems(null, this.GetName() + " Throw", player.getName(), player.getUniqueId(), -20); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphWither.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphWither.java index 7ea7a5805..b77c840ff 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphWither.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphWither.java @@ -160,7 +160,7 @@ public class MorphWither extends MorphGadget for (Player player : GetActive()) { - if (player.getGameMode() == GameMode.CREATIVE) + if (UtilPlayer.isSpectator(player)) continue; player.setAllowFlight(true); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleBlizzard.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleBlizzard.java index ba0aa8b4e..f20373576 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleBlizzard.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleBlizzard.java @@ -34,7 +34,7 @@ public class ParticleBlizzard extends ParticleGadget C.cWhite + "Your double jumps and arrows", C.cWhite + "are enchanted with snow powers.", " ", - C.cPurple + "Purchased at www.mineplex.com/shop", + C.cPurple + "No longer available", }, -1, Material.SNOW_BALL, (byte)0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleHeart.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleHeart.java index ea3c6ea22..4418644cc 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleHeart.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ParticleHeart.java @@ -63,7 +63,7 @@ public class ParticleHeart extends ParticleGadget { if (other.equals(player)) continue; - if (other.getGameMode() != GameMode.SURVIVAL) + if (!UtilPlayer.isSpectator(other)) continue; if (_target.get(player).containsKey(other)) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/Gadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/Gadget.java index adef371a1..f2d6f79af 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/Gadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/Gadget.java @@ -5,6 +5,7 @@ import java.util.HashSet; import mineplex.core.common.CurrencyType; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.event.GadgetActivateEvent; import mineplex.core.shop.item.SalesPackageBase; @@ -69,7 +70,7 @@ public abstract class Gadget extends SalesPackageBase implements Listener if (gadgetEvent.isCancelled()) { - UtilPlayer.message(player, F.main("Inventory", "You cannot use Inventory Items.")); + UtilPlayer.message(player, F.main("Inventory", GetName() + " is not enabled.")); return; } @@ -77,6 +78,12 @@ public abstract class Gadget extends SalesPackageBase implements Listener Manager.setActive(player, this); } + public void DisableForAll() + { + for (Player player : UtilServer.getPlayers()) + Disable(player); + } + public void Disable(Player player) { if (IsActive(player)) @@ -93,4 +100,6 @@ public abstract class Gadget extends SalesPackageBase implements Listener { } + + } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MorphGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MorphGadget.java index d6b9074d5..47e121979 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MorphGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MorphGadget.java @@ -2,6 +2,8 @@ package mineplex.core.gadget.types; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.PlayerDeathEvent; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; @@ -29,4 +31,10 @@ public abstract class MorphGadget extends Gadget if (_active.remove(player)) UtilPlayer.message(player, F.main("Gadget", "You unmorphed from " + F.elem(GetName()) + ".")); } + + @EventHandler + public void playerDeath(PlayerDeathEvent event) + { + Disable(event.getEntity()); + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MusicGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MusicGadget.java index 7aa6d4dad..7dd175be3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MusicGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/MusicGadget.java @@ -46,7 +46,7 @@ public class MusicGadget extends Gadget if (gadgetEvent.isCancelled()) { - UtilPlayer.message(player, F.main("Inventory", "You cannot use Inventory Items here.")); + UtilPlayer.message(player, F.main("Inventory", GetName() + " is not enabled.")); return; } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ParticleGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ParticleGadget.java index b529a18ea..3dadb6995 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ParticleGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/ParticleGadget.java @@ -34,7 +34,7 @@ public abstract class ParticleGadget extends Gadget public boolean shouldDisplay(Player player) { - if (player.getGameMode() != GameMode.SURVIVAL) + if (UtilPlayer.isSpectator(player)) return false; if (Manager.hideParticles()) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/give/Give.java b/Plugins/Mineplex.Core/src/mineplex/core/give/Give.java new file mode 100644 index 000000000..29c79adb3 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/give/Give.java @@ -0,0 +1,133 @@ +package mineplex.core.give; + +import java.util.LinkedList; +import java.util.Map.Entry; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.java.JavaPlugin; + +import mineplex.core.MiniPlugin; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilInv; +import mineplex.core.common.util.UtilItem; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; +import mineplex.core.give.commands.GiveCommand; +import mineplex.core.itemstack.ItemStackFactory; + +public class Give extends MiniPlugin +{ + public static Give Instance; + + protected Give(JavaPlugin plugin) + { + super("Give Factory", plugin); + } + + public static void Initialize(JavaPlugin plugin) + { + Instance = new Give(plugin); + } + + @Override + public void addCommands() + { + addCommand(new GiveCommand(this)); + } + + public void parseInput(Player player, String[] args) + { + if (args.length == 0) + help(player); + + else if (args.length == 1) + give(player, player.getName(), args[0], "1"); + + else if (args.length == 2) + give(player, args[0], args[1], "1"); + + else + give(player, args[0], args[1], args[2]); + } + + public void help(Player player) + { + UtilPlayer.message(player, F.main("Give", "Commands List;")); + } + + public void give(Player player, String target, String itemNames, String amount) + { + //Item + LinkedList> itemList = new LinkedList>(); + itemList = UtilItem.matchItem(player, itemNames, true); + if (itemList.isEmpty()) + return; + + //Player + LinkedList giveList = new LinkedList(); + + if (target.equalsIgnoreCase("all")) + { + for (Player cur : UtilServer.getPlayers()) + giveList.add(cur); + } + else + { + giveList = UtilPlayer.matchOnline(player, target, true); + if (giveList.isEmpty()) + return; + } + + + //Amount + int count = 1; + try + { + count = Integer.parseInt(amount); + + if (count < 1) + { + UtilPlayer.message(player, F.main("Give", "Invalid Amount [" + amount + "]. Defaulting to [1].")); + count = 1; + } + } + catch (Exception e) + { + UtilPlayer.message(player, F.main("Give", "Invalid Amount [" + amount + "]. Defaulting to [1].")); + } + + //Create + String givenList = ""; + for (Player cur : giveList) + givenList += cur.getName() + " "; + if (givenList.length() > 0) + givenList = givenList.substring(0, givenList.length()-1); + + for (Entry curItem : itemList) + { + for (Player cur : giveList) + { + ItemStack stack = ItemStackFactory.Instance.CreateStack(curItem.getKey(), curItem.getValue(), count); + + //Give + if (UtilInv.insert(cur, stack)) + { + //Inform + if (!cur.equals(player)) + UtilPlayer.message(cur, F.main("Give", "You received " + F.item(count + " " + ItemStackFactory.Instance.GetName(curItem.getKey(), curItem.getValue(), false)) + " from " + F.elem(player.getName()) + ".")); + } + } + + if (target.equalsIgnoreCase("all")) + UtilPlayer.message(player, F.main("Give", "You gave " + F.item(count + " " + ItemStackFactory.Instance.GetName(curItem.getKey(), curItem.getValue(), false)) + " to " + F.elem("ALL")) + "."); + + else if (giveList.size() > 1) + UtilPlayer.message(player, F.main("Give", "You gave " + F.item(count + " " + ItemStackFactory.Instance.GetName(curItem.getKey(), curItem.getValue(), false)) + " to " + F.elem(givenList) + ".")); + + else + UtilPlayer.message(player, F.main("Give", "You gave " + F.item(count + " " + ItemStackFactory.Instance.GetName(curItem.getKey(), curItem.getValue(), false)) + " to " + F.elem(giveList.getFirst().getName()) + ".")); + } + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/give/commands/GiveCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/give/commands/GiveCommand.java new file mode 100644 index 000000000..78ddb95c0 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/give/commands/GiveCommand.java @@ -0,0 +1,21 @@ +package mineplex.core.give.commands; + +import org.bukkit.entity.Player; + +import mineplex.core.command.CommandBase; +import mineplex.core.common.Rank; +import mineplex.core.give.Give; + +public class GiveCommand extends CommandBase +{ + public GiveCommand(Give plugin) + { + super(plugin, Rank.ADMIN, "give", "g", "item", "i"); + } + + @Override + public void Execute(final Player caller, final String[] args) + { + Plugin.parseInput(caller, args); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/ignore/IgnoreManager.java b/Plugins/Mineplex.Core/src/mineplex/core/ignore/IgnoreManager.java index 482030f36..7edaa801f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/ignore/IgnoreManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/ignore/IgnoreManager.java @@ -236,7 +236,7 @@ public class IgnoreManager extends MiniDbClientPlugin } @Override - public String getQuery(String uuid, String name) + public String getQuery(int accountId, String uuid, String name) { return "SELECT tA.Name FROM accountIgnore INNER Join accounts AS fA ON fA.uuid = uuidIgnorer INNER JOIN accounts AS tA ON tA.uuid = uuidIgnored LEFT JOIN playerMap ON tA.name = playerName WHERE uuidIgnorer = '" + uuid + "';"; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/ignore/data/IgnoreRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/ignore/data/IgnoreRepository.java index 05a4480c5..aad60e65c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/ignore/data/IgnoreRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/ignore/data/IgnoreRepository.java @@ -3,6 +3,7 @@ package mineplex.core.ignore.data; import java.sql.ResultSet; import java.sql.SQLException; +import mineplex.core.database.DBPool; import mineplex.core.database.RepositoryBase; import mineplex.core.database.column.ColumnVarChar; @@ -16,8 +17,7 @@ public class IgnoreRepository extends RepositoryBase public IgnoreRepository(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/inventory/InventoryManager.java b/Plugins/Mineplex.Core/src/mineplex/core/inventory/InventoryManager.java index 577ed05f7..2cb728e5c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/inventory/InventoryManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/inventory/InventoryManager.java @@ -4,6 +4,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import java.util.Map; +import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -114,7 +115,7 @@ public class InventoryManager extends MiniDbClientPlugin if (callback != null) callback.run(success); } - }, player.getUniqueId().toString(), category, item, count); + }, player.getUniqueId(), category, item, count); } @@ -149,7 +150,7 @@ public class InventoryManager extends MiniDbClientPlugin return item; } - public void addItemToInventoryForOffline(final Callback callback, final String uuidString, final String category, final String item, final int count) + public void addItemToInventoryForOffline(final Callback callback, final UUID uuid, final String category, final String item, final int count) { Bukkit.getServer().getScheduler().runTaskAsynchronously(getPlugin(), new Runnable() { @@ -179,7 +180,7 @@ public class InventoryManager extends MiniDbClientPlugin synchronized (_inventoryLock) { - final boolean success = _repository.incrementClientInventoryItem(uuidString, _items.get(item).Id, count); + final boolean success = _repository.incrementClientInventoryItem(ClientManager.getCachedClientAccountId(uuid), _items.get(item).Id, count); if (callback != null) { @@ -224,7 +225,7 @@ public class InventoryManager extends MiniDbClientPlugin } } } - }, player.getUniqueId().toString(), category, item, count); + }, player.getUniqueId(), category, item, count); } } @@ -256,8 +257,8 @@ public class InventoryManager extends MiniDbClientPlugin } @Override - public String getQuery(String uuid, String name) + public String getQuery(int accountId, String uuid, String name) { - return "SELECT items.name, ic.name as category, count FROM accountInventory AS ai INNER JOIN items ON items.id = ai.itemId INNER JOIN itemCategories AS ic ON ic.id = items.categoryId INNER JOIN accounts ON accounts.id = ai.accountId WHERE accounts.uuid = '" + uuid + "';"; + return "SELECT items.name, ic.name as category, count FROM accountInventory AS ai INNER JOIN items ON items.id = ai.itemId INNER JOIN itemCategories AS ic ON ic.id = items.categoryId WHERE ai.accountId = '" + accountId + "';"; } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/inventory/command/GiveItemCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/inventory/command/GiveItemCommand.java index 28c92639e..86254b037 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/inventory/command/GiveItemCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/inventory/command/GiveItemCommand.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; @@ -44,7 +45,7 @@ public class GiveItemCommand extends CommandBase final String itemName = itemNameTemp; - Item item = Plugin.getItem(itemName); + final Item item = Plugin.getItem(itemName); Player player = UtilPlayer.searchExact(playerName); if (item == null) @@ -59,21 +60,28 @@ public class GiveItemCommand extends CommandBase } else { - UUID uuid = UUIDFetcher.getUUIDOf(playerName); - if (uuid != null) + Plugin.getClientManager().loadClientByName(playerName, new Runnable() { - Plugin.addItemToInventoryForOffline(new Callback() + public void run() { - public void run (Boolean success) + UUID uuid = Plugin.getClientManager().loadUUIDFromDB(playerName); + + if (uuid != null) { - UtilPlayer.message(caller, F.main("Item", "You gave " + F.elem(amount + " " + itemName) + " to offline player " + F.name(playerName))); + Plugin.addItemToInventoryForOffline(new Callback() + { + public void run (Boolean success) + { + UtilPlayer.message(caller, F.main("Item", "You gave " + F.elem(amount + " " + itemName) + " to offline player " + F.name(playerName))); + } + }, uuid, item.Category, item.Name, amount); } - }, uuid.toString(), item.Category, item.Name, amount); - } - else - { - UtilPlayer.message(caller, F.main("Item", "Player " + F.name(playerName) + " does not exist!")); - } + else + { + UtilPlayer.message(caller, F.main("Item", "Player " + F.name(playerName) + " does not exist!")); + } + } + }); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/inventory/data/InventoryRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/inventory/data/InventoryRepository.java index 2a1cb7f27..8679dec3e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/inventory/data/InventoryRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/inventory/data/InventoryRepository.java @@ -7,6 +7,7 @@ import java.util.List; import org.bukkit.plugin.java.JavaPlugin; +import mineplex.core.database.DBPool; import mineplex.core.database.RepositoryBase; import mineplex.core.database.ResultSetCallable; import mineplex.core.database.column.ColumnInt; @@ -26,12 +27,12 @@ public class InventoryRepository extends RepositoryBase private static String INSERT_CATEGORY = "INSERT INTO itemCategories (name) VALUES (?);"; private static String RETRIEVE_CATEGORIES = "SELECT id, name FROM itemCategories;"; - 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 String INSERT_CLIENT_INVENTORY = "INSERT INTO accountInventory (accountId, itemId, count) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE count=count + VALUES(count);"; + private static String UPDATE_CLIENT_INVENTORY = "UPDATE accountInventory SET count = count + ? WHERE accountId = ? AND itemId = ?;"; public InventoryRepository(JavaPlugin plugin) { - super(plugin, "jdbc:mysql://db.mineplex.com:3306/Account?autoReconnect=true&failOverReadOnly=false&maxReconnects=10", "root", "tAbechAk3wR7tuTh"); + super(plugin, DBPool.ACCOUNT); } @Override @@ -95,10 +96,14 @@ public class InventoryRepository extends RepositoryBase return items; } - public boolean incrementClientInventoryItem(String uuid, int itemId, int count) + public boolean incrementClientInventoryItem(int accountId, int itemId, int count) { - if (executeUpdate(UPDATE_CLIENT_INVENTORY, new ColumnInt("count", count), new ColumnVarChar("uuid", 100, uuid), new ColumnInt("itemid", itemId)) < 1) - return executeUpdate(INSERT_CLIENT_INVENTORY, new ColumnInt("itemid", itemId), new ColumnInt("count", count), new ColumnVarChar("uuid", 100, uuid)) > 0; + System.out.println("Updating " + accountId + "'s " + itemId + " with " + count); + if (executeUpdate(UPDATE_CLIENT_INVENTORY, new ColumnInt("count", count), new ColumnInt("id", accountId), new ColumnInt("itemid", itemId)) < 1) + { + System.out.println("Inserting " + accountId + "'s " + itemId + " with " + count); + return executeUpdate(INSERT_CLIENT_INVENTORY, new ColumnInt("id", accountId), new ColumnInt("itemid", itemId), new ColumnInt("count", count)) > 0; + } else return true; } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java index 73f893f1a..1ca8b9bc6 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/LeaderboardManager.java @@ -5,6 +5,7 @@ import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; import mineplex.core.spawn.command.SpawnCommand; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; @@ -58,9 +59,19 @@ public class LeaderboardManager extends MiniPlugin * @param value - the counter value used to increment the statistic * @return true, if the stat event was successfully triggered and logged, false otherwise. */ - public boolean onStatEvent(Player player, StatType type, int gamemode, int value) + public boolean onStatEvent(final Player player, final StatType type, final int gamemode, final int value) { - _statEvents.insertStatEvent(player.getName(), gamemode, _serverGroup, type.getTypeId(), value); + /* + // Asynchronously make DB call to insert stat event. + Bukkit.getScheduler().runTaskAsynchronously(getPlugin(), new Runnable() + { + public void run() + { + _statEvents.insertStatEvent(player.getName(), gamemode, _serverGroup, type.getTypeId(), value); + } + }); + */ + return true; } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/StatEventsRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/StatEventsRepository.java index 2e0888f1e..1679bc36d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/StatEventsRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/leaderboard/StatEventsRepository.java @@ -1,5 +1,6 @@ package mineplex.core.leaderboard; +import mineplex.core.database.DBPool; import mineplex.core.database.RepositoryBase; import mineplex.core.database.column.ColumnInt; import mineplex.core.database.column.ColumnVarChar; @@ -35,7 +36,7 @@ public class StatEventsRepository extends RepositoryBase */ public StatEventsRepository(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/message/MessageManager.java b/Plugins/Mineplex.Core/src/mineplex/core/message/MessageManager.java index ba41a8fc4..82081ee85 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/message/MessageManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/message/MessageManager.java @@ -35,8 +35,8 @@ import mineplex.core.punish.Punish; import mineplex.core.punish.PunishClient; import mineplex.core.punish.Punishment; import mineplex.core.punish.PunishmentSentence; -import mineplex.serverdata.ServerCommandManager; -import mineplex.serverdata.transfers.AnnouncementCommand; +import mineplex.serverdata.commands.AnnouncementCommand; +import mineplex.serverdata.commands.ServerCommandManager; public class MessageManager extends MiniClientPlugin { @@ -113,7 +113,6 @@ public class MessageManager extends MiniClientPlugin public String canReceiverMessageThem(String sender, Player target) { - // If the receiver has turned off private messaging and the sender isn't a mod if (!_preferences.Get(target).PrivateMessaging) { @@ -311,7 +310,6 @@ public class MessageManager extends MiniClientPlugin public void receiveMessage(Player to, RedisMessage globalMessage) { - if (globalMessage.isStaffMessage()) { // Message the receiver diff --git a/Plugins/Mineplex.Core/src/mineplex/core/message/commands/AnnounceCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/message/commands/AnnounceCommand.java index 248b1ce1a..e4c8865fb 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/message/commands/AnnounceCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/message/commands/AnnounceCommand.java @@ -7,7 +7,7 @@ import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilTextMiddle; import mineplex.core.message.MessageManager; -import mineplex.serverdata.transfers.AnnouncementCommand; +import mineplex.serverdata.commands.AnnouncementCommand; import org.bukkit.Bukkit; import org.bukkit.entity.Player; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/message/commands/GlobalCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/message/commands/GlobalCommand.java index e6009e48f..fae3d2a36 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/message/commands/GlobalCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/message/commands/GlobalCommand.java @@ -5,7 +5,7 @@ import mineplex.core.common.Rank; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; import mineplex.core.message.MessageManager; -import mineplex.serverdata.transfers.AnnouncementCommand; +import mineplex.serverdata.commands.AnnouncementCommand; import org.bukkit.Bukkit; import org.bukkit.entity.Player; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/message/redis/AnnouncementHandler.java b/Plugins/Mineplex.Core/src/mineplex/core/message/redis/AnnouncementHandler.java index 44ed0da46..81972dd76 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/message/redis/AnnouncementHandler.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/message/redis/AnnouncementHandler.java @@ -4,9 +4,9 @@ import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilTextMiddle; -import mineplex.serverdata.CommandCallback; -import mineplex.serverdata.ServerCommand; -import mineplex.serverdata.transfers.AnnouncementCommand; +import mineplex.serverdata.commands.AnnouncementCommand; +import mineplex.serverdata.commands.CommandCallback; +import mineplex.serverdata.commands.ServerCommand; import org.bukkit.Bukkit; import org.bukkit.entity.Player; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/message/redis/MessageHandler.java b/Plugins/Mineplex.Core/src/mineplex/core/message/redis/MessageHandler.java index 4f71cebbe..d42424a9f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/message/redis/MessageHandler.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/message/redis/MessageHandler.java @@ -4,8 +4,8 @@ import org.bukkit.Bukkit; import org.bukkit.entity.Player; import mineplex.core.message.MessageManager; -import mineplex.serverdata.CommandCallback; -import mineplex.serverdata.ServerCommand; +import mineplex.serverdata.commands.CommandCallback; +import mineplex.serverdata.commands.ServerCommand; public class MessageHandler implements CommandCallback { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/message/redis/RedisMessage.java b/Plugins/Mineplex.Core/src/mineplex/core/message/redis/RedisMessage.java index bf913e961..941ea76e5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/message/redis/RedisMessage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/message/redis/RedisMessage.java @@ -2,7 +2,7 @@ package mineplex.core.message.redis; import java.util.UUID; -import mineplex.serverdata.ServerCommand; +import mineplex.serverdata.commands.ServerCommand; /** * Used to send a admin or normal message between servers diff --git a/Plugins/Mineplex.Core/src/mineplex/core/message/redis/RedisMessageCallback.java b/Plugins/Mineplex.Core/src/mineplex/core/message/redis/RedisMessageCallback.java index 069d6fc4a..11a634d37 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/message/redis/RedisMessageCallback.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/message/redis/RedisMessageCallback.java @@ -2,7 +2,7 @@ package mineplex.core.message.redis; import java.util.UUID; -import mineplex.serverdata.ServerCommand; +import mineplex.serverdata.commands.ServerCommand; /** * Used as a response in return to a admin or normal message between servers. diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/Mount.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/Mount.java index a326e9e42..3e346cc57 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/Mount.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/Mount.java @@ -14,6 +14,7 @@ import org.bukkit.event.player.PlayerQuitEvent; import mineplex.core.common.CurrencyType; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; import mineplex.core.mount.event.MountActivateEvent; import mineplex.core.shop.item.SalesPackageBase; @@ -46,7 +47,7 @@ public abstract class Mount extends SalesPackageBase implements Listener if (gadgetEvent.isCancelled()) { - UtilPlayer.message(player, F.main("Inventory", "You cannot use Inventory Items.")); + UtilPlayer.message(player, F.main("Inventory", GetName() + " is not enabled.")); return; } @@ -55,6 +56,12 @@ public abstract class Mount extends SalesPackageBase implements Listener } public abstract void EnableCustom(Player player); public abstract void Disable(Player player); + + public void DisableForAll() + { + for (Player player : UtilServer.getPlayers()) + Disable(player); + } @EventHandler public void PlayerJoin(PlayerJoinEvent event) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/npc/command/RefreshCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/npc/command/RefreshCommand.java index 24eca9ed5..f77033b26 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/npc/command/RefreshCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/npc/command/RefreshCommand.java @@ -14,7 +14,7 @@ public class RefreshCommand extends CommandBase { public RefreshCommand(NpcManager plugin) { - super(plugin, Rank.DEVELOPER, "refresh"); + super(plugin, Rank.SNR_MODERATOR, "refresh"); } @Override diff --git a/Plugins/Mineplex.Core/src/mineplex/core/party/Party.java b/Plugins/Mineplex.Core/src/mineplex/core/party/Party.java index e476b48c2..b5e048f9f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/party/Party.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/party/Party.java @@ -16,10 +16,10 @@ import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilTime; import mineplex.core.party.redis.RedisPartyData; import mineplex.serverdata.Region; -import mineplex.serverdata.ServerGroup; -import mineplex.serverdata.ServerManager; -import mineplex.serverdata.transfers.ServerTransfer; -import mineplex.serverdata.transfers.TransferCommand; +import mineplex.serverdata.commands.ServerTransfer; +import mineplex.serverdata.commands.TransferCommand; +import mineplex.serverdata.data.ServerGroup; +import mineplex.serverdata.servers.ServerManager; import org.bukkit.Bukkit; import org.bukkit.ChatColor; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/party/PartyManager.java b/Plugins/Mineplex.Core/src/mineplex/core/party/PartyManager.java index 89afcd12b..dcf6403e0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/party/PartyManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/party/PartyManager.java @@ -5,6 +5,7 @@ import java.util.Iterator; import mineplex.core.MiniPlugin; import mineplex.core.account.CoreClientManager; +import mineplex.core.common.util.NautHashMap; import mineplex.core.party.commands.PartyCommand; import mineplex.core.party.redis.RedisPartyData; import mineplex.core.party.redis.RedisPartyHandler; @@ -13,7 +14,7 @@ import mineplex.core.portal.ServerTransferEvent; import mineplex.core.preferences.PreferencesManager; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; -import mineplex.serverdata.ServerCommandManager; +import mineplex.serverdata.commands.ServerCommandManager; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -29,7 +30,7 @@ public class PartyManager extends MiniPlugin private Portal _portal; private String _serverName; - public HashSet _parties = new HashSet(); + public NautHashMap _partyLeaderMap = new NautHashMap(); public PartyManager(JavaPlugin plugin, Portal portal, CoreClientManager clientManager, PreferencesManager preferenceManager) { @@ -64,7 +65,7 @@ public class PartyManager extends MiniPlugin { Party party = new Party(this); party.JoinParty(player); - _parties.add(party); + _partyLeaderMap.put(player.getName(), party); return party; } @@ -76,51 +77,31 @@ public class PartyManager extends MiniPlugin public void addParty(Party party) { - for (Party parties : _parties) - { - if (parties.GetLeader().equalsIgnoreCase(party.GetLeader())) - { - parties.resetWaitingTime(); - - return; - } - } - - _parties.add(party); + if (_partyLeaderMap.containsKey(party.GetLeader())) + _partyLeaderMap.get(party.GetLeader()).resetWaitingTime(); + else + _partyLeaderMap.put(party.GetLeader(), party); } @EventHandler public void serverTransfer(ServerTransferEvent event) { - for (Party party : _parties) + Party party = _partyLeaderMap.get(event.getPlayer().getName()); + + if (party != null) { - if (party.GetLeader().equals(event.getPlayer().getName())) + party.switchedServer(); + + RedisPartyData data = new RedisPartyData(party, _serverName); + data.setTargetServers(event.getServer()); + data.publish(); + + for (Player player : party.GetPlayersOnline()) { - party.switchedServer(); - - boolean destLobby = event.getServer().equalsIgnoreCase("lobby"); - - RedisPartyData data = new RedisPartyData(party, destLobby ? _serverName : null); - - if (!destLobby) + if (player != event.getPlayer()) { - data.setTargetServers(event.getServer()); + _portal.sendPlayerToServer(player, event.getServer(), false); } - - data.publish(); - - if (!destLobby) - { - for (Player player : party.GetPlayersOnline()) - { - if (player != event.getPlayer()) - { - _portal.sendPlayerToServer(player, event.getServer(), false); - } - } - } - - break; } } } @@ -130,7 +111,7 @@ public class PartyManager extends MiniPlugin { try { - for (Party party : _parties) + for (Party party : _partyLeaderMap.values()) { party.PlayerJoin(event.getPlayer()); } @@ -144,7 +125,7 @@ public class PartyManager extends MiniPlugin @EventHandler public void PlayerQuit(PlayerQuitEvent event) { - for (Party party : _parties) + for (Party party : _partyLeaderMap.values()) { party.PlayerQuit(event.getPlayer()); } @@ -158,7 +139,7 @@ public class PartyManager extends MiniPlugin ExpireParties(); - for (Party party : _parties) + for (Party party : _partyLeaderMap.values()) { party.ExpireInvitees(); party.UpdateScoreboard(); @@ -167,7 +148,7 @@ public class PartyManager extends MiniPlugin public void ExpireParties() { - Iterator partyIterator = _parties.iterator(); + Iterator partyIterator = _partyLeaderMap.values().iterator(); while (partyIterator.hasNext()) { @@ -184,7 +165,7 @@ public class PartyManager extends MiniPlugin public Party GetParty(Player player) { - for (Party party : _parties) + for (Party party : _partyLeaderMap.values()) { if (party.GetPlayers().contains(player.getName())) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/party/redis/RedisPartyData.java b/Plugins/Mineplex.Core/src/mineplex/core/party/redis/RedisPartyData.java index f47f83391..cec09d728 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/party/redis/RedisPartyData.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/party/redis/RedisPartyData.java @@ -1,11 +1,10 @@ package mineplex.core.party.redis; import mineplex.core.party.Party; -import mineplex.serverdata.ServerCommand; +import mineplex.serverdata.commands.ServerCommand; public class RedisPartyData extends ServerCommand { - private String[] _players; private String _leader; private String _previousServer; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/party/redis/RedisPartyHandler.java b/Plugins/Mineplex.Core/src/mineplex/core/party/redis/RedisPartyHandler.java index fbd3a4bc2..e88aeb675 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/party/redis/RedisPartyHandler.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/party/redis/RedisPartyHandler.java @@ -2,8 +2,8 @@ package mineplex.core.party.redis; import mineplex.core.party.Party; import mineplex.core.party.PartyManager; -import mineplex.serverdata.CommandCallback; -import mineplex.serverdata.ServerCommand; +import mineplex.serverdata.commands.CommandCallback; +import mineplex.serverdata.commands.ServerCommand; public class RedisPartyHandler implements CommandCallback { @@ -17,9 +17,14 @@ public class RedisPartyHandler implements CommandCallback @Override public void run(ServerCommand command) { - RedisPartyData data = (RedisPartyData) command; + final RedisPartyData data = (RedisPartyData) command; - _partyManager.addParty(new Party(_partyManager, data)); + _partyManager.getPlugin().getServer().getScheduler().runTask(_partyManager.getPlugin(), new Runnable() + { + public void run() + { + _partyManager.addParty(new Party(_partyManager, data)); + } + }); } - } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/personalServer/HostEventServerCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/personalServer/HostEventServerCommand.java new file mode 100644 index 000000000..566c95a04 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/personalServer/HostEventServerCommand.java @@ -0,0 +1,24 @@ +package mineplex.core.personalServer; + +import org.bukkit.entity.Player; + +import mineplex.core.command.CommandBase; +import mineplex.core.common.Rank; +import mineplex.core.recharge.Recharge; + +public class HostEventServerCommand extends CommandBase +{ + public HostEventServerCommand(PersonalServerManager plugin) + { + super(plugin, Rank.ADMIN, "hostevent"); + } + + @Override + public void Execute(Player caller, String[] args) + { + if (!Recharge.Instance.use(caller, "Host Event", 30000, false, false)) + return; + + Plugin.hostServer(caller, caller.getName(), true); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/personalServer/HostServerCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/personalServer/HostServerCommand.java index 2c12e1d8d..b09c4cc54 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/personalServer/HostServerCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/personalServer/HostServerCommand.java @@ -19,6 +19,6 @@ public class HostServerCommand extends CommandBase if (!Recharge.Instance.use(caller, "Host Server", 30000, false, false)) return; - Plugin.hostServer(caller, caller.getName()); + Plugin.hostServer(caller, caller.getName(), false); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/personalServer/PersonalServerManager.java b/Plugins/Mineplex.Core/src/mineplex/core/personalServer/PersonalServerManager.java index ca7477137..22b0f6e19 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/personalServer/PersonalServerManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/personalServer/PersonalServerManager.java @@ -23,9 +23,9 @@ import mineplex.core.common.util.UtilPlayer; import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.recharge.Recharge; import mineplex.serverdata.Region; -import mineplex.serverdata.ServerGroup; -import mineplex.serverdata.ServerManager; -import mineplex.serverdata.ServerRepository; +import mineplex.serverdata.data.ServerGroup; +import mineplex.serverdata.servers.ServerManager; +import mineplex.serverdata.servers.ServerRepository; public class PersonalServerManager extends MiniPlugin { @@ -100,6 +100,7 @@ public class PersonalServerManager extends MiniPlugin public void addCommands() { addCommand(new HostServerCommand(this)); + addCommand(new HostEventServerCommand(this)); } private void setupConfigValues() @@ -117,23 +118,26 @@ public class PersonalServerManager extends MiniPlugin } } - public void hostServer(Player player, String serverName) + public void hostServer(Player player, String serverName, boolean eventServer) { int ram = 1024; int cpu = 1; Rank rank = _clientManager.Get(player).GetRank(); - if (rank.Has(Rank.SNR_MODERATOR) || rank == Rank.YOUTUBE) + if (eventServer || rank.Has(Rank.SNR_MODERATOR) || rank == Rank.YOUTUBE) { ram = 2048; - cpu = 3; + cpu = 4; } - createGroup(player, serverName, ram, cpu, 12, 24, "Smash"); + if (eventServer) + createGroup(player, "EVENT", ram, cpu, 40, 80, "Event", eventServer); + else + createGroup(player, serverName, ram, cpu, 40, 80, "Smash", eventServer); } - private void createGroup(final Player host, final String serverName, final int ram, final int cpu, final int minPlayers, final int maxPlayers, final String games) + private void createGroup(final Player host, final String serverName, final int ram, final int cpu, final int minPlayers, final int maxPlayers, final String games, final boolean event) { getPlugin().getServer().getScheduler().runTaskAsynchronously(getPlugin(), new Runnable() { @@ -144,7 +148,7 @@ public class PersonalServerManager extends MiniPlugin if (existingServerGroup.getPrefix().equalsIgnoreCase(serverName) || existingServerGroup.getName().equalsIgnoreCase(serverName)) { if (host.getName().equalsIgnoreCase(existingServerGroup.getHost())) - host.sendMessage(F.main(getName(), "Your server is still being created. If you haven't been connected in 20 seconds, type /server " + serverName + "-1.")); + host.sendMessage(F.main(getName(), "Your server is still being created or already exists. If you haven't been connected in 20 seconds, type /server " + serverName + "-1.")); else host.sendMessage(C.cRed + "Sorry, but you're not allowed to create a MPS server because you have chosen a name to glitch the system :)"); @@ -153,7 +157,7 @@ public class PersonalServerManager extends MiniPlugin } final ServerGroup serverGroup = new ServerGroup(serverName, serverName, host.getName(), ram, cpu, 1, 0, UtilMath.random.nextInt(250) + 19999, true, "arcade.zip", "Arcade.jar", "plugins/Arcade/", minPlayers, maxPlayers, - true, false, false, games, "Player", true, false, true, false, true, true, false, false, false, false, true, true, true, false, false, "", _us ? Region.US : Region.EU); + true, false, false, games, "Player", true, event, false, true, false, true, true, false, false, false, false, true, true, true, false, false, "", _us ? Region.US : Region.EU); getPlugin().getServer().getScheduler().runTaskAsynchronously(getPlugin(), new Runnable() { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java index 40f7815f0..84a1a2664 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java @@ -42,49 +42,11 @@ public class PetFactory _pets.put(EntityType.OCELOT, new Pet("Cat", EntityType.OCELOT, 6000)); _pets.put(EntityType.MUSHROOM_COW, new Pet("Mooshroom", EntityType.MUSHROOM_COW, 5000)); _pets.put(EntityType.WITHER, new Pet("Widder", EntityType.WITHER, -1)); - - List petTokens = new ArrayList(); - - for (Pet pet : _pets.values()) - { - PetSalesToken petToken = new PetSalesToken(); - petToken.Name = pet.GetPetName(); - petToken.PetType = pet.GetPetType().toString(); - - petTokens.add(petToken); - } - - for (PetSalesToken petToken : _repository.GetPets(petTokens)) - { - if (_pets.containsKey(EntityType.valueOf(petToken.PetType))) - { - _pets.get(EntityType.valueOf(petToken.PetType)).Update(petToken); - } - } } private void CreatePetExtras() { _petExtras.put(Material.SIGN, new PetExtra("Name Tag", Material.NAME_TAG, 100)); - - List petExtraTokens = new ArrayList(); - - for (PetExtra petExtra : _petExtras.values()) - { - PetExtraToken petToken = new PetExtraToken(); - petToken.Name = petExtra.GetName(); - petToken.Material = petExtra.GetMaterial().toString(); - - petExtraTokens.add(petToken); - } - - for (PetExtraToken token : _repository.GetPetExtras(petExtraTokens)) - { - if (_petExtras.containsKey(Material.valueOf(token.Material))) - { - _petExtras.get(Material.valueOf(token.Material)).Update(token); - } - } } public Collection GetPets() diff --git a/Plugins/Mineplex.Core/src/mineplex/core/portal/Portal.java b/Plugins/Mineplex.Core/src/mineplex/core/portal/Portal.java index 6ffb71e89..ad96a3879 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/portal/Portal.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/portal/Portal.java @@ -23,13 +23,13 @@ import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilTabTitle; import mineplex.core.portal.Commands.SendCommand; import mineplex.core.portal.Commands.ServerCommand; -import mineplex.serverdata.MinecraftServer; import mineplex.serverdata.Region; -import mineplex.serverdata.ServerCommandManager; -import mineplex.serverdata.ServerManager; -import mineplex.serverdata.ServerRepository; -import mineplex.serverdata.transfers.ServerTransfer; -import mineplex.serverdata.transfers.TransferCommand; +import mineplex.serverdata.commands.ServerCommandManager; +import mineplex.serverdata.commands.ServerTransfer; +import mineplex.serverdata.commands.TransferCommand; +import mineplex.serverdata.data.MinecraftServer; +import mineplex.serverdata.servers.ServerManager; +import mineplex.serverdata.servers.ServerRepository; public class Portal extends MiniPlugin { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/portal/TransferHandler.java b/Plugins/Mineplex.Core/src/mineplex/core/portal/TransferHandler.java index 279cae834..32b8907f0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/portal/TransferHandler.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/portal/TransferHandler.java @@ -1,9 +1,9 @@ package mineplex.core.portal; -import mineplex.serverdata.CommandCallback; -import mineplex.serverdata.ServerCommand; -import mineplex.serverdata.transfers.ServerTransfer; -import mineplex.serverdata.transfers.TransferCommand; +import mineplex.serverdata.commands.CommandCallback; +import mineplex.serverdata.commands.ServerCommand; +import mineplex.serverdata.commands.ServerTransfer; +import mineplex.serverdata.commands.TransferCommand; import org.bukkit.Bukkit; import org.bukkit.entity.Player; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesManager.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesManager.java index 5c95b395d..b24e700ba 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesManager.java @@ -36,28 +36,12 @@ public class PreferencesManager extends MiniDbClientPlugin { super("Preferences", plugin, clientManager); - setupConfigValues(); - - _repository = new PreferencesRepository(plugin, plugin.getConfig().getString("preferences.connectionurl")); + _repository = new PreferencesRepository(plugin); _shop = new PreferencesShop(this, clientManager, donationManager); addCommand(new PreferencesCommand(this)); } - private void setupConfigValues() - { - try - { - getPlugin().getConfig().addDefault("preferences.connectionurl", "jdbc:mysql://db.mineplex.com:3306/Account?autoReconnect=true&failOverReadOnly=false&maxReconnects=10"); - getPlugin().getConfig().set("preferences.connectionurl", getPlugin().getConfig().getString("preferences.connectionurl")); - getPlugin().saveConfig(); - } - catch (Exception e) - { - e.printStackTrace(); - } - } - @Override protected UserPreferences AddPlayer(String player) { @@ -128,7 +112,7 @@ public class PreferencesManager extends MiniDbClientPlugin } @Override - public String getQuery(String uuid, String name) + public String getQuery(int accountId, String uuid, String name) { return "SELECT games, visibility, showChat, friendChat, privateMessaging, partyRequests, invisibility, forcefield, showMacReports, ignoreVelocity, pendingFriendRequests, friendDisplayInventoryUI FROM accountPreferences WHERE accountPreferences.uuid = '" + uuid + "' LIMIT 1;"; } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java index 9b3678016..44852c23e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesRepository.java @@ -1,5 +1,6 @@ package mineplex.core.preferences; +import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -8,18 +9,19 @@ import java.util.Map.Entry; 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.column.ColumnVarChar; public class PreferencesRepository extends RepositoryBase { - private static String CREATE_ACCOUNT_TABLE = "CREATE TABLE IF NOT EXISTS accountPreferences (id INT NOT NULL AUTO_INCREMENT, uuid VARCHAR(256), games BOOL NOT NULL DEFAULT 1, visibility BOOL NOT NULL DEFAULT 1, showChat BOOL NOT NULL DEFAULT 1, friendChat BOOL NOT NULL DEFAULT 1, privateMessaging BOOL NOT NULL DEFAULT 1, partyRequests BOOL NOT NULL DEFAULT 0, invisibility BOOL NOT NULL DEFAULT 0, forcefield BOOL NOT NULL DEFAULT 0, showMacReports BOOL NOT NULL DEFAULT 0, ignoreVelocity BOOL NOT NULL DEFAULT 0, PRIMARY KEY (id), UNIQUE INDEX uuid_index (uuid));"; + //private static String CREATE_ACCOUNT_TABLE = "CREATE TABLE IF NOT EXISTS accountPreferences (id INT NOT NULL AUTO_INCREMENT, uuid VARCHAR(256), games BOOL NOT NULL DEFAULT 1, visibility BOOL NOT NULL DEFAULT 1, showChat BOOL NOT NULL DEFAULT 1, friendChat BOOL NOT NULL DEFAULT 1, privateMessaging BOOL NOT NULL DEFAULT 1, partyRequests BOOL NOT NULL DEFAULT 0, invisibility BOOL NOT NULL DEFAULT 0, forcefield BOOL NOT NULL DEFAULT 0, showMacReports BOOL NOT NULL DEFAULT 0, ignoreVelocity BOOL NOT NULL DEFAULT 0, PRIMARY KEY (id), UNIQUE INDEX uuid_index (uuid));"; private static String INSERT_ACCOUNT = "INSERT INTO accountPreferences (uuid) VALUES (?) ON DUPLICATE KEY UPDATE uuid=uuid;"; private static String UPDATE_ACCOUNT_PREFERENCES = "UPDATE accountPreferences SET games = ?, visibility = ?, showChat = ?, friendChat = ?, privateMessaging = ?, partyRequests = ?, invisibility = ?, forcefield = ?, showMacReports = ?, ignoreVelocity = ?, pendingFriendRequests = ?, friendDisplayInventoryUI = ? WHERE uuid=?;"; - public PreferencesRepository(JavaPlugin plugin, String connectionString) + public PreferencesRepository(JavaPlugin plugin) { - super(plugin, connectionString, "root", "tAbechAk3wR7tuTh"); + super(plugin, DBPool.ACCOUNT); } @Override @@ -35,12 +37,12 @@ public class PreferencesRepository extends RepositoryBase public void saveUserPreferences(NautHashMap preferences) { - PreparedStatement preparedStatement = null; - - try + try + ( + Connection connection = getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_ACCOUNT_PREFERENCES); + ) { - preparedStatement = getConnection().prepareStatement(UPDATE_ACCOUNT_PREFERENCES); - for (Entry entry : preferences.entrySet()) { preparedStatement.setBoolean(1, entry.getValue().HubGames); @@ -92,20 +94,6 @@ public class PreferencesRepository extends RepositoryBase { exception.printStackTrace(); } - finally - { - if (preparedStatement != null) - { - try - { - preparedStatement.close(); - } - catch (SQLException e) - { - e.printStackTrace(); - } - } - } } public UserPreferences loadClientInformation(final ResultSet resultSet) throws SQLException diff --git a/Plugins/Mineplex.Core/src/mineplex/core/projectile/ProjectileManager.java b/Plugins/Mineplex.Core/src/mineplex/core/projectile/ProjectileManager.java index bf3b827b5..a3e3fb661 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/projectile/ProjectileManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/projectile/ProjectileManager.java @@ -31,54 +31,46 @@ public class ProjectileManager extends MiniPlugin } public void AddThrow(Entity thrown, LivingEntity thrower, IThrown callback, - long expireTime, boolean hitPlayer, boolean hitBlock, boolean idle, double hitboxMult) + long expireTime, boolean hitPlayer, boolean hitBlock, boolean idle, float hitboxGrow) { _thrown.put(thrown, new ProjectileUser(this, thrown, thrower, callback, expireTime, hitPlayer, hitBlock, idle, false, - null, 1f, 1f, null, 0, null, null, hitboxMult, null)); + null, 1f, 1f, null, 0, null, null, hitboxGrow)); } public void AddThrow(Entity thrown, LivingEntity thrower, IThrown callback, - long expireTime, boolean hitPlayer, boolean hitBlock, boolean idle, double hitboxMult, DisguiseManager disguise) - { - _thrown.put(thrown, new ProjectileUser(this, thrown, thrower, callback, - expireTime, hitPlayer, hitBlock, idle, false, - null, 1f, 1f, null, 0, null, null, hitboxMult, disguise)); - } - - public void AddThrow(Entity thrown, LivingEntity thrower, IThrown callback, - long expireTime, boolean hitPlayer, boolean hitBlock, boolean idle, boolean pickup, double hitboxMult) + long expireTime, boolean hitPlayer, boolean hitBlock, boolean idle, boolean pickup, float hitboxGrow) { _thrown.put(thrown, new ProjectileUser(this, thrown, thrower, callback, expireTime, hitPlayer, hitBlock, idle, pickup, - null, 1f, 1f, null, 0, null, null, hitboxMult, null)); + null, 1f, 1f, null, 0, null, null, hitboxGrow)); } public void AddThrow(Entity thrown, LivingEntity thrower, IThrown callback, long expireTime, boolean hitPlayer, boolean hitBlock, boolean idle, - Sound sound, float soundVolume, float soundPitch, Effect effect, int effectData, UpdateType effectRate , double hitboxMult) + Sound sound, float soundVolume, float soundPitch, Effect effect, int effectData, UpdateType effectRate , float hitboxGrow) { _thrown.put(thrown, new ProjectileUser(this, thrown, thrower, callback, expireTime, hitPlayer, hitBlock, idle, false, - sound, soundVolume, soundPitch, effect, effectData, effectRate, null, hitboxMult, null)); + sound, soundVolume, soundPitch, effect, effectData, effectRate, null, hitboxGrow)); } public void AddThrow(Entity thrown, LivingEntity thrower, IThrown callback, long expireTime, boolean hitPlayer, boolean hitBlock, boolean idle, - Sound sound, float soundVolume, float soundPitch, ParticleType particle, Effect effect, int effectData, UpdateType effectRate, double hitboxMult) + Sound sound, float soundVolume, float soundPitch, ParticleType particle, Effect effect, int effectData, UpdateType effectRate, float hitboxGrow) { _thrown.put(thrown, new ProjectileUser(this, thrown, thrower, callback, expireTime, hitPlayer, hitBlock, idle, false, - sound, soundVolume, soundPitch, effect, effectData, effectRate, particle, hitboxMult, null)); + sound, soundVolume, soundPitch, effect, effectData, effectRate, particle, hitboxGrow)); } public void AddThrow(Entity thrown, LivingEntity thrower, IThrown callback, long expireTime, boolean hitPlayer, boolean hitBlock, boolean idle, - Sound sound, float soundVolume, float soundPitch, ParticleType particle, UpdateType effectRate, double hitboxMult) + Sound sound, float soundVolume, float soundPitch, ParticleType particle, UpdateType effectRate, float hitboxMult) { _thrown.put(thrown, new ProjectileUser(this, thrown, thrower, callback, expireTime, hitPlayer, hitBlock, idle, false, - sound, soundVolume, soundPitch, null, 0, effectRate, particle, hitboxMult, null)); + sound, soundVolume, soundPitch, null, 0, effectRate, particle, hitboxMult)); } @EventHandler diff --git a/Plugins/Mineplex.Core/src/mineplex/core/projectile/ProjectileUser.java b/Plugins/Mineplex.Core/src/mineplex/core/projectile/ProjectileUser.java index 83807fbc3..251022932 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/projectile/ProjectileUser.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/projectile/ProjectileUser.java @@ -3,7 +3,9 @@ package mineplex.core.projectile; import mineplex.core.updater.event.UpdateEvent; import mineplex.core.updater.UpdateType; import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.disguise.DisguiseManager; import mineplex.core.disguise.disguises.DisguiseSquid; @@ -47,14 +49,14 @@ public class ProjectileUser private int _effectData = 0; private UpdateType _effectRate = UpdateType.TICK; - private DisguiseManager _disguise; - + private double _hitboxGrow; + public ProjectileUser(ProjectileManager throwInput, Entity thrown, LivingEntity thrower, IThrown callback, long expireTime, boolean hitPlayer, boolean hitBlock, boolean idle, boolean pickup, Sound sound, float soundVolume, float soundPitch, Effect effect, int effectData, UpdateType effectRate, ParticleType particle, - double hitboxMult, DisguiseManager disguise) + double hitboxMult) { Throw = throwInput; @@ -76,7 +78,7 @@ public class ProjectileUser _effectData = effectData; _effectRate = effectRate; - _disguise = disguise; + _hitboxGrow = hitboxMult; } public void Effect(UpdateEvent event) @@ -103,89 +105,93 @@ public class ProjectileUser return true; } - double distanceToEntity = 0.0D; - LivingEntity victim = null; - - net.minecraft.server.v1_7_R4.Entity nmsEntity = ((CraftEntity)_thrown).getHandle(); - Vec3D vec3d = Vec3D.a(nmsEntity.locX, nmsEntity.locY, nmsEntity.locZ); - Vec3D vec3d1 = Vec3D.a(nmsEntity.locX + nmsEntity.motX, nmsEntity.locY + nmsEntity.motY, nmsEntity.locZ + nmsEntity.motZ); - - MovingObjectPosition finalObjectPosition = nmsEntity.world.rayTrace(vec3d, vec3d1, false, true, false); - vec3d = Vec3D.a(nmsEntity.locX, nmsEntity.locY, nmsEntity.locZ); - vec3d1 = Vec3D.a(nmsEntity.locX + nmsEntity.motX, nmsEntity.locY + nmsEntity.motY, nmsEntity.locZ + nmsEntity.motZ); + if (_hitPlayer) + { + double distanceToEntity = 0.0D; + LivingEntity victim = null; + + net.minecraft.server.v1_7_R4.Entity nmsEntity = ((CraftEntity)_thrown).getHandle(); + Vec3D vec3d = Vec3D.a(nmsEntity.locX, nmsEntity.locY, nmsEntity.locZ); + Vec3D vec3d1 = Vec3D.a(nmsEntity.locX + nmsEntity.motX, nmsEntity.locY + nmsEntity.motY, nmsEntity.locZ + nmsEntity.motZ); + + MovingObjectPosition finalObjectPosition = nmsEntity.world.rayTrace(vec3d, vec3d1, false, true, false); + vec3d = Vec3D.a(nmsEntity.locX, nmsEntity.locY, nmsEntity.locZ); + vec3d1 = Vec3D.a(nmsEntity.locX + nmsEntity.motX, nmsEntity.locY + nmsEntity.motY, nmsEntity.locZ + nmsEntity.motZ); - if (finalObjectPosition != null) - { - vec3d1 = Vec3D.a(finalObjectPosition.pos.a, finalObjectPosition.pos.b, finalObjectPosition.pos.c); - } - - for (Object entity : ((CraftWorld)_thrown.getWorld()).getHandle().getEntities(((CraftEntity)_thrown).getHandle(), ((CraftEntity)_thrown).getHandle().boundingBox.a(((CraftEntity)_thrown).getHandle().motX, ((CraftEntity)_thrown).getHandle().motY, ((CraftEntity)_thrown).getHandle().motZ).grow(1.0D, 1.0D, 1.0D))) - { - if (entity instanceof net.minecraft.server.v1_7_R4.Entity) - { - Entity bukkitEntity = ((net.minecraft.server.v1_7_R4.Entity) entity).getBukkitEntity(); - - if (bukkitEntity instanceof LivingEntity) - { - LivingEntity ent = (LivingEntity)bukkitEntity; - - //Avoid Self - if (ent.equals(_thrower)) - continue; - - if (ent instanceof Player) - if (((Player)ent).getGameMode() == GameMode.CREATIVE) + if (finalObjectPosition != null) + { + vec3d1 = Vec3D.a(finalObjectPosition.pos.a, finalObjectPosition.pos.b, finalObjectPosition.pos.c); + } + + for (Object entity : ((CraftWorld)_thrown.getWorld()).getHandle().getEntities(((CraftEntity)_thrown).getHandle(), + ((CraftEntity)_thrown).getHandle().boundingBox.a( + ((CraftEntity)_thrown).getHandle().motX, + ((CraftEntity)_thrown).getHandle().motY, + ((CraftEntity)_thrown).getHandle().motZ).grow(_hitboxGrow, _hitboxGrow, _hitboxGrow))) + { + if (entity instanceof net.minecraft.server.v1_7_R4.Entity) + { + Entity bukkitEntity = ((net.minecraft.server.v1_7_R4.Entity) entity).getBukkitEntity(); + + if (bukkitEntity instanceof LivingEntity) + { + LivingEntity ent = (LivingEntity)bukkitEntity; + + //Avoid Self + if (ent.equals(_thrower)) continue; - - EntityType disguise = null; - if (_disguise != null && _disguise.getDisguise(ent) != null) - { - if (_disguise.getDisguise(ent) instanceof DisguiseSquid) - disguise = EntityType.SQUID; - } + + //Creative or Spec + if (ent instanceof Player) + if (((Player)ent).getGameMode() == GameMode.CREATIVE || UtilPlayer.isSpectator(ent)) + continue; - float f1 = (float)(nmsEntity.boundingBox.a() * .6); - AxisAlignedBB axisalignedbb1 = ((CraftEntity)ent).getHandle().boundingBox.grow(f1, f1, f1); - MovingObjectPosition entityCollisionPosition = axisalignedbb1.a(vec3d, vec3d1); - - if (entityCollisionPosition != null) - { - double d1 = vec3d.distanceSquared(entityCollisionPosition.pos); - if ((d1 < distanceToEntity) || (distanceToEntity == 0.0D)) + //float f1 = (float)(nmsEntity.boundingBox.a() * 0.6f); + AxisAlignedBB axisalignedbb1 = ((CraftEntity)ent).getHandle().boundingBox.grow(1F, 1F, 1F); + MovingObjectPosition entityCollisionPosition = axisalignedbb1.a(vec3d, vec3d1); + + if (entityCollisionPosition != null) { - victim = ent; - distanceToEntity = d1; + if (_thrower instanceof Player) + ((Player)_thrower).playSound(_thrower.getLocation(), Sound.ORB_PICKUP, 1f, 1.25f); + + double d1 = vec3d.distanceSquared(entityCollisionPosition.pos); + if ((d1 < distanceToEntity) || (distanceToEntity == 0.0D)) + { + victim = ent; + distanceToEntity = d1; + } } } - } - } - } - - if (victim != null) - { - finalObjectPosition = new MovingObjectPosition(((CraftLivingEntity)victim).getHandle()); + } + } - _callback.Collide(victim, null, this); - return true; - } - - if (finalObjectPosition != null) - { - if (_hitBlock) + if (victim != null) { - Block block = _thrown.getWorld().getBlockAt(finalObjectPosition.b, finalObjectPosition.c, finalObjectPosition.d); - if (!UtilBlock.airFoliage(block) && !block.isLiquid()) + finalObjectPosition = new MovingObjectPosition(((CraftLivingEntity)victim).getHandle()); + + _callback.Collide(victim, null, this); + return true; + } + + if (finalObjectPosition != null) + { + if (_hitBlock) { - nmsEntity.motX = ((float) (finalObjectPosition.pos.a - nmsEntity.locX)); - nmsEntity.motY = ((float) (finalObjectPosition.pos.b - nmsEntity.locY)); - nmsEntity.motZ = ((float) (finalObjectPosition.pos.c - nmsEntity.locZ)); - float f2 = MathHelper.sqrt(nmsEntity.motX * nmsEntity.motX + nmsEntity.motY * nmsEntity.motY + nmsEntity.motZ * nmsEntity.motZ); - nmsEntity.locX -= nmsEntity.motX / f2 * 0.0500000007450581D; - nmsEntity.locY -= nmsEntity.motY / f2 * 0.0500000007450581D; - nmsEntity.locZ -= nmsEntity.motZ / f2 * 0.0500000007450581D; - - _callback.Collide(null, block, this); - return true; + Block block = _thrown.getWorld().getBlockAt(finalObjectPosition.b, finalObjectPosition.c, finalObjectPosition.d); + if (!UtilBlock.airFoliage(block) && !block.isLiquid()) + { + nmsEntity.motX = ((float) (finalObjectPosition.pos.a - nmsEntity.locX)); + nmsEntity.motY = ((float) (finalObjectPosition.pos.b - nmsEntity.locY)); + nmsEntity.motZ = ((float) (finalObjectPosition.pos.c - nmsEntity.locZ)); + float f2 = MathHelper.sqrt(nmsEntity.motX * nmsEntity.motX + nmsEntity.motY * nmsEntity.motY + nmsEntity.motZ * nmsEntity.motZ); + nmsEntity.locX -= nmsEntity.motX / f2 * 0.0500000007450581D; + nmsEntity.locY -= nmsEntity.motY / f2 * 0.0500000007450581D; + nmsEntity.locZ -= nmsEntity.motZ / f2 * 0.0500000007450581D; + + _callback.Collide(null, block, this); + return true; + } } } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/punish/Command/PunishCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/punish/Command/PunishCommand.java index 6c43e8025..b578a2566 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/punish/Command/PunishCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/punish/Command/PunishCommand.java @@ -41,6 +41,23 @@ public class PunishCommand extends CommandBase final String finalReason = reason; + //Match exact online first + Player target = UtilPlayer.searchExact(playerName); + if (target != null) + { + Plugin.GetRepository().LoadPunishClient(playerName, new Callback() + { + public void run(PunishClientToken clientToken) + { + Plugin.LoadClient(clientToken); + new PunishPage(Plugin, caller, playerName, finalReason); + } + }); + + return; + } + + //Check repo Plugin.GetRepository().MatchPlayerName(new Callback>() { public void run(List matches) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/punish/Punish.java b/Plugins/Mineplex.Core/src/mineplex/core/punish/Punish.java index ad0cf6594..adaceb736 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/punish/Punish.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/punish/Punish.java @@ -16,7 +16,7 @@ import mineplex.core.common.util.UtilTime.TimeUnit; import mineplex.core.punish.Command.PunishCommand; import mineplex.core.punish.Tokens.PunishClientToken; import mineplex.core.punish.Tokens.PunishmentToken; -import mineplex.serverdata.ServerCommandManager; +import mineplex.serverdata.commands.ServerCommandManager; import org.bukkit.Bukkit; import org.bukkit.Sound; @@ -44,7 +44,7 @@ public class Punish extends MiniPlugin _clientManager = clientManager; _repository = new PunishRepository(webServerAddress); - ServerCommandManager.getInstance().registerCommandType("PunishCommand", mineplex.serverdata.transfers.PunishCommand.class, new PunishmentHandler(this)); + ServerCommandManager.getInstance().registerCommandType("PunishCommand", mineplex.serverdata.commands.PunishCommand.class, new PunishmentHandler(this)); } public PunishRepository GetRepository() @@ -167,7 +167,7 @@ public class Punish extends MiniPlugin if (target != null) target.kickPlayer(kickReason); else - new mineplex.serverdata.transfers.PunishCommand(playerName, true, false, kickReason).publish(); + new mineplex.serverdata.commands.PunishCommand(playerName, true, false, kickReason).publish(); } }); @@ -193,7 +193,7 @@ public class Punish extends MiniPlugin target.playSound(target.getLocation(), Sound.CAT_MEOW, 1f, 1f); } else - new mineplex.serverdata.transfers.PunishCommand(playerName, false, finalDuration != 0, F.main("Punish", F.elem(C.cGray + C.Bold + (finalDuration != 0 ? "Mute" : "Warning") + " Reason: ") + reason)).publish(); + new mineplex.serverdata.commands.PunishCommand(playerName, false, finalDuration != 0, F.main("Punish", F.elem(C.cGray + C.Bold + (finalDuration != 0 ? "Mute" : "Warning") + " Reason: ") + reason)).publish(); _repository.LoadPunishClient(playerName, new Callback() { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/punish/PunishmentHandler.java b/Plugins/Mineplex.Core/src/mineplex/core/punish/PunishmentHandler.java index 8b245bd4c..a6169b6e0 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/punish/PunishmentHandler.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/punish/PunishmentHandler.java @@ -3,9 +3,9 @@ package mineplex.core.punish; import mineplex.core.common.util.Callback; import mineplex.core.common.util.UtilPlayer; import mineplex.core.punish.Tokens.PunishClientToken; -import mineplex.serverdata.CommandCallback; -import mineplex.serverdata.ServerCommand; -import mineplex.serverdata.transfers.PunishCommand; +import mineplex.serverdata.commands.CommandCallback; +import mineplex.serverdata.commands.PunishCommand; +import mineplex.serverdata.commands.ServerCommand; import org.bukkit.Bukkit; import org.bukkit.entity.Player; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/report/Report.java b/Plugins/Mineplex.Core/src/mineplex/core/report/Report.java index 5e7ab4592..3367b15ab 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/report/Report.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/report/Report.java @@ -3,7 +3,7 @@ package mineplex.core.report; import java.util.HashSet; import java.util.Set; -import mineplex.serverdata.Data; +import mineplex.serverdata.data.Data; public class Report implements Data { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/report/ReportManager.java b/Plugins/Mineplex.Core/src/mineplex/core/report/ReportManager.java index fb3f439c0..a6f7fd59b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/report/ReportManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/report/ReportManager.java @@ -9,9 +9,10 @@ import mineplex.core.command.CommandCenter; import mineplex.core.common.util.UtilPlayer; import mineplex.core.portal.Portal; import mineplex.core.report.command.ReportNotification; -import mineplex.serverdata.DataRepository; -import mineplex.serverdata.RedisDataRepository; import mineplex.serverdata.Region; +import mineplex.serverdata.Utility; +import mineplex.serverdata.data.DataRepository; +import mineplex.serverdata.redis.RedisDataRepository; import org.bukkit.ChatColor; import org.bukkit.entity.Player; @@ -75,9 +76,9 @@ public class ReportManager { reportRepository.removeElement(String.valueOf(reportId)); // Remove report from redis database removeActiveReport(reportId); - int closerId = getPlayerAccount(reportCloser).GetAccountId(); + int closerId = getPlayerAccount(reportCloser).getAccountId(); String playerName = getReport(reportId).getPlayerName(); - int playerId = getPlayerAccount(playerName).GetAccountId(); + int playerId = getPlayerAccount(playerName).getAccountId(); String server = null; // TODO: Get current server name reportSqlRepository.logReport(reportId, playerId, server, closerId, result, reason); @@ -85,7 +86,7 @@ public class ReportManager { for (String reporterName : report.getReporters()) { CoreClient reporterAccount = getPlayerAccount(reporterName); - ReportProfile reportProfile = getReportProfile(String.valueOf(reporterAccount.GetAccountId())); + ReportProfile reportProfile = getReportProfile(String.valueOf(reporterAccount.getAccountId())); reportProfile.onReportClose(result); reportProfiles.addElement(reportProfile); } @@ -112,14 +113,14 @@ public class ReportManager { // TODO: Send display message to handler when they arrive on the server // with info about the case/report. - int handlerId = getPlayerAccount(reportHandler).GetAccountId(); + int handlerId = getPlayerAccount(reportHandler).getAccountId(); reportSqlRepository.logReportHandling(reportId, handlerId); // Log handling into sql database } } public void reportPlayer(Player reporter, Player reportedPlayer, String reason) { - int reporterId = getPlayerAccount(reporter).GetAccountId(); + int reporterId = getPlayerAccount(reporter).getAccountId(); ReportProfile reportProfile = getReportProfile(String.valueOf(reporterId)); if (reportProfile.canReport()) @@ -189,7 +190,7 @@ public class ReportManager { */ public int generateReportId() { - JedisPool pool = ((RedisDataRepository) reportRepository).getJedisPool(); + JedisPool pool = Utility.getPool(true); Jedis jedis = pool.getResource(); long uniqueReportId = -1; @@ -231,7 +232,7 @@ public class ReportManager { private int getAccountId(String playerName) { - return getPlayerAccount(playerName).GetAccountId(); + return getPlayerAccount(playerName).getAccountId(); } /** diff --git a/Plugins/Mineplex.Core/src/mineplex/core/report/ReportProfile.java b/Plugins/Mineplex.Core/src/mineplex/core/report/ReportProfile.java index 2192676d4..1f70102ce 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/report/ReportProfile.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/report/ReportProfile.java @@ -1,6 +1,6 @@ package mineplex.core.report; -import mineplex.serverdata.Data; +import mineplex.serverdata.data.Data; public class ReportProfile implements Data { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/report/ReportRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/report/ReportRepository.java index 968010e9c..4a9f91215 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/report/ReportRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/report/ReportRepository.java @@ -7,6 +7,7 @@ import java.util.UUID; import java.util.Map.Entry; 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.ColumnInt; @@ -40,7 +41,7 @@ This will be used to determine if staff are handling public ReportRepository(JavaPlugin plugin, String connectionString) { - super(plugin, connectionString, "root", "tAbechAk3wR7tuTh"); // TODO: Config file for host/pass? + super(plugin, DBPool.ACCOUNT); } @Override diff --git a/Plugins/Mineplex.Core/src/mineplex/core/report/command/ReportNotification.java b/Plugins/Mineplex.Core/src/mineplex/core/report/command/ReportNotification.java index 3b670328d..7d9d0153a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/report/command/ReportNotification.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/report/command/ReportNotification.java @@ -4,7 +4,7 @@ import org.bukkit.entity.Player; import mineplex.core.common.util.UtilServer; import mineplex.core.report.ReportManager; -import mineplex.serverdata.ServerCommand; +import mineplex.serverdata.commands.ServerCommand; public class ReportNotification extends ServerCommand { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/resourcepack/ResPackManager.java b/Plugins/Mineplex.Core/src/mineplex/core/resourcepack/ResPackManager.java index 2e5d8490b..cbc2c24ff 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/resourcepack/ResPackManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/resourcepack/ResPackManager.java @@ -4,9 +4,9 @@ import org.bukkit.Bukkit; import org.bukkit.entity.Player; import mineplex.core.resourcepack.redis.RedisUnloadResPack; -import mineplex.serverdata.CommandCallback; -import mineplex.serverdata.ServerCommand; -import mineplex.serverdata.ServerCommandManager; +import mineplex.serverdata.commands.CommandCallback; +import mineplex.serverdata.commands.ServerCommand; +import mineplex.serverdata.commands.ServerCommandManager; public class ResPackManager implements CommandCallback { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/resourcepack/redis/RedisUnloadResPack.java b/Plugins/Mineplex.Core/src/mineplex/core/resourcepack/redis/RedisUnloadResPack.java index 88876b510..ecd970213 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/resourcepack/redis/RedisUnloadResPack.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/resourcepack/redis/RedisUnloadResPack.java @@ -1,6 +1,6 @@ package mineplex.core.resourcepack.redis; -import mineplex.serverdata.ServerCommand; +import mineplex.serverdata.commands.ServerCommand; public class RedisUnloadResPack extends ServerCommand { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/reward/RewardManager.java b/Plugins/Mineplex.Core/src/mineplex/core/reward/RewardManager.java index febfd0af3..775ab3cd5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/reward/RewardManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/reward/RewardManager.java @@ -76,31 +76,31 @@ public class RewardManager // Gadgets addReward(new InventoryReward(inventoryManager, "Paintballs", "Paintball Gun", (int)(100*(minValue/500)), (int)(100*(maxValue/500)), - new ItemStack(Material.GOLD_BARDING), rarity, 1)); + new ItemStack(Material.GOLD_BARDING), rarity, 10)); addReward(new InventoryReward(inventoryManager, "Fireworks", "Fireworks", (int)(50*(minValue/500)), (int)(50*(maxValue/500)), - new ItemStack(Material.FIREWORK), rarity, 1)); + new ItemStack(Material.FIREWORK), rarity, 10)); addReward(new InventoryReward(inventoryManager, "Melons", "Melon Launcher", (int)(50*(minValue/500)), (int)(50*(maxValue/500)), - new ItemStack(Material.MELON_BLOCK), rarity, 1)); + new ItemStack(Material.MELON_BLOCK), rarity, 10)); addReward(new InventoryReward(inventoryManager, "Flesh Hooks", "Flesh Hook", (int)(40*(minValue/500)), (int)(40*(maxValue/500)), - new ItemStack(Material.getMaterial(131)), rarity, 1)); + new ItemStack(Material.getMaterial(131)), rarity, 10)); addReward(new InventoryReward(inventoryManager, "Pearls", "Ethereal Pearl", (int)(30*(minValue/500)), (int)(30*(maxValue/500)), - new ItemStack(Material.ENDER_PEARL), rarity, 1)); + new ItemStack(Material.ENDER_PEARL), rarity, 10)); addReward(new InventoryReward(inventoryManager, "Bat Swarms", "Bat Blaster", (int)(20*(minValue/500)), (int)(20*(maxValue/500)), - new ItemStack(Material.IRON_BARDING), rarity, 1)); + new ItemStack(Material.IRON_BARDING), rarity, 10)); addReward(new InventoryReward(inventoryManager, "TNT", "TNT", (int)(20*(minValue/500)), (int)(20*(maxValue/500)), - new ItemStack(Material.TNT), rarity, 1)); + new ItemStack(Material.TNT), rarity, 10)); } public void addUncommon(DonationManager donationManager, InventoryManager inventoryManager, PetManager petManager, double minValue, double maxValue) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/CoinReward.java b/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/CoinReward.java index bcbeddb3a..a0023e137 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/CoinReward.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/CoinReward.java @@ -1,9 +1,5 @@ package mineplex.core.reward.rewards; -/** - * Created by shaun on 2014-09-08. - */ - import java.util.Random; import org.bukkit.entity.Player; @@ -16,9 +12,6 @@ import mineplex.core.reward.RewardData; import mineplex.core.reward.RewardManager; import mineplex.core.reward.RewardRarity; -/** - * Created by shaun on 2014-09-08. - */ public class CoinReward extends Reward { private DonationManager _donationManager; @@ -53,7 +46,7 @@ public class CoinReward extends Reward { } - }, "Treasure Chest", player.getName(), player.getUniqueId(), gemsToReward); + }, "Treasure Chest", player.getName(), _donationManager.getClientManager().Get(player).getAccountId(), gemsToReward); return new RewardData(getRarity().getColor() + gemsToReward + " Coins", new ItemStack(175)); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/RankReward.java b/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/RankReward.java index 92e8c8bdc..815edb705 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/RankReward.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/RankReward.java @@ -1,11 +1,14 @@ package mineplex.core.reward.rewards; +import java.util.UUID; + import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import mineplex.core.account.CoreClientManager; import mineplex.core.common.Rank; +import mineplex.core.common.util.UUIDFetcher; import mineplex.core.reward.Reward; import mineplex.core.reward.RewardData; import mineplex.core.reward.RewardRarity; @@ -21,7 +24,6 @@ public class RankReward extends Reward _clientManager = clientManager; } - @Override public RewardData giveRewardCustom(Player player) { @@ -34,7 +36,7 @@ public class RankReward extends Reward return new RewardData(getRarity().getColor() + "Rank Upgrade Error", new ItemStack(Material.PAPER)); _clientManager.Get(player).SetRank(rank); - _clientManager.getRepository().saveRank(null, player.getName(), rank, true); + _clientManager.getRepository().saveRank(null, player.getName(), player.getUniqueId(), rank, true); return new RewardData(getRarity().getColor() + rank.Name + " Rank", new ItemStack(Material.NETHER_STAR)); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/UnknownPackageReward.java b/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/UnknownPackageReward.java index 77e6cff3d..6e041ee9b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/UnknownPackageReward.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/reward/rewards/UnknownPackageReward.java @@ -31,7 +31,7 @@ public class UnknownPackageReward extends Reward @Override protected RewardData giveRewardCustom(Player player) { - _donationManager.PurchaseUnknownSalesPackage(null, player.getName(), player.getUniqueId(), _packageName, true, 0, true); + _donationManager.PurchaseUnknownSalesPackage(null, player.getName(), _donationManager.getClientManager().Get(player).getAccountId(), _packageName, true, 0, true); return new RewardData(getRarity().getColor() + _name, _itemStack); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/serverConfig/ServerConfiguration.java b/Plugins/Mineplex.Core/src/mineplex/core/serverConfig/ServerConfiguration.java index c8541bd38..d0c29b368 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/serverConfig/ServerConfiguration.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/serverConfig/ServerConfiguration.java @@ -5,22 +5,30 @@ import java.lang.reflect.Field; import net.minecraft.server.v1_7_R4.PlayerList; import org.bukkit.craftbukkit.v1_7_R4.CraftServer; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerLoginEvent.Result; import org.bukkit.plugin.java.JavaPlugin; import mineplex.core.MiniPlugin; +import mineplex.core.account.CoreClientManager; +import mineplex.core.common.Rank; import mineplex.serverdata.Region; -import mineplex.serverdata.ServerGroup; -import mineplex.serverdata.ServerManager; +import mineplex.serverdata.data.ServerGroup; +import mineplex.serverdata.servers.ServerManager; public class ServerConfiguration extends MiniPlugin { + private CoreClientManager _clientManager; + private Field _playerListMaxPlayers; private ServerGroup _serverGroup; - public ServerConfiguration(JavaPlugin plugin) + public ServerConfiguration(JavaPlugin plugin, CoreClientManager clientManager) { super("Server Configuration", plugin); + _clientManager = clientManager; Region region = plugin.getConfig().getBoolean("serverstatus.us") ? Region.US : Region.EU; String groupName = plugin.getConfig().getString("serverstatus.group"); @@ -45,6 +53,13 @@ public class ServerConfiguration extends MiniPlugin ((CraftServer)_plugin.getServer()).getServer().setTexturePack(_serverGroup.getResourcePack()); } + @EventHandler + public void onPlayerLogin(PlayerLoginEvent event) + { + if (_serverGroup.getStaffOnly() && !_clientManager.Get(event.getPlayer().getName()).GetRank().Has(event.getPlayer(), Rank.HELPER, false)) + event.disallow(Result.KICK_OTHER, "This is a staff only server."); + } + public ServerGroup getServerGroup() { return _serverGroup; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/shop/page/ConfirmationPage.java b/Plugins/Mineplex.Core/src/mineplex/core/shop/page/ConfirmationPage.java index fe2dfa558..89b05f239 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/shop/page/ConfirmationPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/shop/page/ConfirmationPage.java @@ -147,7 +147,7 @@ public class ConfirmationPage } else { - synchronized (_statSync) - { - addToQueue(statName, player, value); - } + addToQueue(statName, player, value); } } private void addToQueue(String statName, Player player, int value) { - if (!_statUploadQueue.containsKey(player)) + synchronized (_statSync) { - _statUploadQueue.put(player, new NautHashMap()); + if (!_statUploadQueue.containsKey(player)) + _statUploadQueue.put(player, new NautHashMap()); + + if (!_statUploadQueue.get(player).containsKey(statName)) + _statUploadQueue.get(player).put(statName, 0); + + _statUploadQueue.get(player).put(statName, _statUploadQueue.get(player).get(statName) + value); } - - if (!_statUploadQueue.get(player).containsKey(statName)) - { - _statUploadQueue.get(player).put(statName, 0); - } - - _statUploadQueue.get(player).put(statName, value); } protected void saveStats() @@ -121,7 +118,7 @@ public class StatsManager extends MiniDbClientPlugin try { - NautHashMap> uploadQueue = new NautHashMap>(); + NautHashMap> uploadQueue = new NautHashMap>(); synchronized (_statSync) { @@ -132,7 +129,7 @@ public class StatsManager extends MiniDbClientPlugin if (player.isOnline()) continue; - String uploadKey = player.getUniqueId().toString(); + int uploadKey = ClientManager.getCachedClientAccountId(player.getUniqueId()); uploadQueue.put(uploadKey, new NautHashMap()); @@ -155,14 +152,14 @@ public class StatsManager extends MiniDbClientPlugin } } - public boolean incrementStat(final String uuidString, final String statName, final int value) + public boolean incrementStat(final int accountId, final String statName, final int value) { if (_stats.containsKey(statName)) return false; - final NautHashMap> uploadQueue = new NautHashMap>(); - uploadQueue.put(uuidString, new NautHashMap()); - uploadQueue.get(uuidString).put(_stats.get(statName), value); + final NautHashMap> uploadQueue = new NautHashMap>(); + uploadQueue.put(accountId, new NautHashMap()); + uploadQueue.get(accountId).put(_stats.get(statName), value); runAsync(new Runnable() { @@ -200,8 +197,8 @@ public class StatsManager extends MiniDbClientPlugin } @Override - public String getQuery(String uuid, String name) + public String getQuery(int accountId, String uuid, String name) { - return "SELECT stats.name, value FROM accountStats INNER JOIN stats ON stats.id = accountStats.statId INNER JOIN accounts ON accountStats.accountId = accounts.id WHERE accounts.uuid = '" + uuid + "';"; + return "SELECT stats.name, value FROM accountStats INNER JOIN stats ON stats.id = accountStats.statId WHERE accountStats.accountId = '" + accountId + "';"; } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsRepository.java index 827b3605c..23d3daa9d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsRepository.java @@ -9,6 +9,7 @@ import java.util.List; 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; @@ -18,6 +19,7 @@ import org.jooq.DSLContext; import org.jooq.Insert; import org.jooq.Record2; import org.jooq.Result; +import org.jooq.SQLDialect; import org.jooq.Update; import org.jooq.impl.DSL; @@ -31,7 +33,7 @@ public class StatsRepository extends RepositoryBase public StatsRepository(JavaPlugin plugin) { - super(plugin, "jdbc:mysql://db.mineplex.com:3306/Account?autoReconnect=true&failOverReadOnly=false&maxReconnects=10", "root", "tAbechAk3wR7tuTh"); + super(plugin, DBPool.ACCOUNT); } @Override @@ -75,33 +77,32 @@ public class StatsRepository extends RepositoryBase } @SuppressWarnings("rawtypes") - public void saveStats(NautHashMap> uploadQueue) + public void saveStats(NautHashMap> uploadQueue) { try { - - DSLContext context = DSL.using(getConnection(true)); + DSLContext context = DSL.using(getConnectionPool(), SQLDialect.MYSQL); List updates = new ArrayList<>(); List inserts = new ArrayList<>(); - for (String uuid : uploadQueue.keySet()) + for (int accountId : uploadQueue.keySet()) { - for (Integer statId : uploadQueue.get(uuid).keySet()) + for (Integer statId : uploadQueue.get(accountId).keySet()) { Update update = context .update(Tables.accountStats) - .set(Tables.accountStats.value, Tables.accountStats.value.plus(uploadQueue.get(uuid).get(statId))) - .where(Tables.accountStats.accountId.eq(context.select(Tables.accounts.id).from(Tables.accounts).where(Tables.accounts.uuid.eq(uuid)))) + .set(Tables.accountStats.value, Tables.accountStats.value.plus(uploadQueue.get(accountId).get(statId))) + .where(Tables.accountStats.accountId.eq(accountId)) .and(Tables.accountStats.statId.eq(statId)); updates.add(update); Insert insert = context .insertInto(Tables.accountStats) - .set(Tables.accountStats.accountId, context.select(Tables.accounts.id).from(Tables.accounts).where(Tables.accounts.uuid.eq(uuid))) + .set(Tables.accountStats.accountId, accountId) .set(Tables.accountStats.statId, statId) - .set(Tables.accountStats.value, uploadQueue.get(uuid).get(statId)); + .set(Tables.accountStats.value, uploadQueue.get(accountId).get(statId)); inserts.add(insert); } @@ -133,7 +134,7 @@ public class StatsRepository extends RepositoryBase synchronized (this) { - context = DSL.using(getConnection()); + context = DSL.using(getConnectionPool(), SQLDialect.MYSQL); } Result> result = context.select(Tables.stats.name, Tables.accountStats.value).from(Tables.accountStats) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/stats/command/GiveStatCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/stats/command/GiveStatCommand.java index 3ce6a847b..35293a2b5 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/stats/command/GiveStatCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/stats/command/GiveStatCommand.java @@ -1,13 +1,11 @@ package mineplex.core.stats.command; -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.F; -import mineplex.core.common.util.UUIDFetcher; import mineplex.core.common.util.UtilPlayer; import mineplex.core.stats.StatsManager; @@ -31,20 +29,29 @@ public class GiveStatCommand extends CommandBase { Player player = UtilPlayer.searchOnline(caller, args[0], true); - String statName = args[1]; + String tempStatName = args[1]; for (int i = 2; i < args.length - 1; i++) { - statName += " " + args[i]; + tempStatName += " " + args[i]; } + final String statName = tempStatName; + if (player == null) { - UUID uuid = UUIDFetcher.getUUIDOf(args[0]); - if (uuid != null) + Plugin.getClientManager().loadClientByName(args[0], new Runnable() { - Plugin.incrementStat(uuid.toString(), statName, Integer.parseInt(args[args.length - 1])); - } + public void run() + { + final CoreClient client = Plugin.getClientManager().Get(args[0]); + + if (client != null) + Plugin.incrementStat(client.getAccountId(), statName, Integer.parseInt(args[args.length - 1])); + else + caller.sendMessage(F.main(Plugin.getName(), "Couldn't find " + args[0] + "'s account!")); + } + }); } else { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/status/ServerStatusManager.java b/Plugins/Mineplex.Core/src/mineplex/core/status/ServerStatusManager.java index f466d2c37..2033584ba 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/status/ServerStatusManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/status/ServerStatusManager.java @@ -14,19 +14,19 @@ import mineplex.core.common.util.Callback; import mineplex.core.monitor.LagMeter; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; -import mineplex.serverdata.MinecraftServer; import mineplex.serverdata.Region; -import mineplex.serverdata.ServerCommandManager; -import mineplex.serverdata.ServerGroup; -import mineplex.serverdata.ServerManager; -import mineplex.serverdata.ServerRepository; import mineplex.serverdata.Utility; -import mineplex.serverdata.transfers.SuicideCommand; +import mineplex.serverdata.commands.ServerCommandManager; +import mineplex.serverdata.commands.SuicideCommand; +import mineplex.serverdata.data.MinecraftServer; +import mineplex.serverdata.data.ServerGroup; +import mineplex.serverdata.servers.ServerManager; +import mineplex.serverdata.servers.ServerRepository; public class ServerStatusManager extends MiniPlugin { // The default timeout (in seconds) before the ServerStatus expires. - public final int DEFAULT_SERVER_TIMEOUT = 15; + public final int DEFAULT_SERVER_TIMEOUT = 30; private ServerRepository _repository; private CoreClientManager _clientManager; @@ -70,10 +70,10 @@ public class ServerStatusManager extends MiniPlugin getPlugin().getConfig().addDefault("serverstatus.connectionurl", "db.mineplex.com:3306"); getPlugin().getConfig().set("serverstatus.connectionurl", getPlugin().getConfig().getString("serverstatus.connectionurl")); - getPlugin().getConfig().addDefault("serverstatus.username", "root"); + getPlugin().getConfig().addDefault("serverstatus.username", "MilitaryPolice"); getPlugin().getConfig().set("serverstatus.username", getPlugin().getConfig().getString("serverstatus.username")); - getPlugin().getConfig().addDefault("serverstatus.password", "tAbechAk3wR7tuTh"); + getPlugin().getConfig().addDefault("serverstatus.password", "CUPr6Wuw2Rus$qap"); getPlugin().getConfig().set("serverstatus.password", getPlugin().getConfig().getString("serverstatus.password")); getPlugin().getConfig().addDefault("serverstatus.us", true); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/status/SuicideHandler.java b/Plugins/Mineplex.Core/src/mineplex/core/status/SuicideHandler.java index bad96db7c..a3f59cc44 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/status/SuicideHandler.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/status/SuicideHandler.java @@ -2,10 +2,10 @@ package mineplex.core.status; import mineplex.core.common.util.F; import mineplex.core.portal.Portal; -import mineplex.serverdata.CommandCallback; import mineplex.serverdata.Region; -import mineplex.serverdata.ServerCommand; -import mineplex.serverdata.transfers.SuicideCommand; +import mineplex.serverdata.commands.CommandCallback; +import mineplex.serverdata.commands.ServerCommand; +import mineplex.serverdata.commands.SuicideCommand; import org.bukkit.Bukkit; import org.bukkit.entity.Player; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java b/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java index 547215abd..79c342ce9 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java @@ -23,7 +23,7 @@ import mineplex.core.common.util.NautHashMap; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilWorld; -import mineplex.serverdata.ServerCommandManager; +import mineplex.serverdata.commands.ServerCommandManager; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -45,7 +45,7 @@ public class Teleport extends MiniPlugin super("Teleport", plugin); _serverName = getPlugin().getConfig().getString("serverstatus.name"); - + RedisLocateHandler locateHandler = new RedisLocateHandler(this); ServerCommandManager.getInstance().registerCommandType("RedisLocate", RedisLocate.class, locateHandler); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/teleport/redis/RedisLocate.java b/Plugins/Mineplex.Core/src/mineplex/core/teleport/redis/RedisLocate.java index b2d62a2c2..8cacaac53 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/teleport/redis/RedisLocate.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/teleport/redis/RedisLocate.java @@ -2,7 +2,7 @@ package mineplex.core.teleport.redis; import java.util.UUID; -import mineplex.serverdata.ServerCommand; +import mineplex.serverdata.commands.ServerCommand; public class RedisLocate extends ServerCommand { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/teleport/redis/RedisLocateCallback.java b/Plugins/Mineplex.Core/src/mineplex/core/teleport/redis/RedisLocateCallback.java index 32d469e87..1c18f27f8 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/teleport/redis/RedisLocateCallback.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/teleport/redis/RedisLocateCallback.java @@ -2,7 +2,7 @@ package mineplex.core.teleport.redis; import java.util.UUID; -import mineplex.serverdata.ServerCommand; +import mineplex.serverdata.commands.ServerCommand; public class RedisLocateCallback extends ServerCommand { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/teleport/redis/RedisLocateHandler.java b/Plugins/Mineplex.Core/src/mineplex/core/teleport/redis/RedisLocateHandler.java index 29d14069d..82694bda2 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/teleport/redis/RedisLocateHandler.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/teleport/redis/RedisLocateHandler.java @@ -2,9 +2,10 @@ package mineplex.core.teleport.redis; import org.bukkit.Bukkit; import org.bukkit.entity.Player; + import mineplex.core.teleport.Teleport; -import mineplex.serverdata.CommandCallback; -import mineplex.serverdata.ServerCommand; +import mineplex.serverdata.commands.CommandCallback; +import mineplex.serverdata.commands.ServerCommand; public class RedisLocateHandler implements CommandCallback { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/timing/TimeData.java b/Plugins/Mineplex.Core/src/mineplex/core/timing/TimeData.java index 4e3093d75..2a00de525 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/timing/TimeData.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/timing/TimeData.java @@ -4,6 +4,7 @@ public class TimeData { public TimeData(String title, long time) { + Title = title; Started = time; LastMarker = time; Total = 0L; @@ -13,15 +14,17 @@ public class TimeData public long Started; public long LastMarker; public long Total; + public int Count = 0; public void addTime() { Total += System.currentTimeMillis() - LastMarker; LastMarker = System.currentTimeMillis(); + Count++; } public void printInfo() { - System.out.println("]==[TIME DATA]==[" + Title + " took " + Total + "ms in the last " + (System.currentTimeMillis() - Started) + "ms"); + System.out.println("]==[TIME DATA]==[ " + Count + " " + Title + " took " + Total + "ms in the last " + (System.currentTimeMillis() - Started) + "ms"); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/timing/TimingManager.java b/Plugins/Mineplex.Core/src/mineplex/core/timing/TimingManager.java index a19401664..762edb3d4 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/timing/TimingManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/timing/TimingManager.java @@ -94,6 +94,20 @@ public class TimingManager implements Listener } } + public static void endTotal(String title, boolean print) + { + if (!Debug) + return; + + synchronized(_totalLock) + { + TimeData data = _totalList.remove(title); + + if (data != null && print) + data.printInfo(); + } + } + public static void printTotals() { if (!Debug) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureManager.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureManager.java index 2c48445e3..8eb5f02a3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureManager.java @@ -42,8 +42,8 @@ public class TreasureManager extends MiniPlugin _rewardManager = new RewardManager(clientManager, donationManager, inventoryManager, petManager, 100, 250, 500, 1000, - 1500, 2500, - 6000, 12000, + 4000, 6000, + 12000, 32000, true); World world = Bukkit.getWorlds().get(0); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/updater/FileUpdater.java b/Plugins/Mineplex.Core/src/mineplex/core/updater/FileUpdater.java index 5e325cf7d..4b11a5e29 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/updater/FileUpdater.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/updater/FileUpdater.java @@ -21,8 +21,8 @@ import mineplex.core.portal.Portal; import mineplex.core.updater.event.RestartServerEvent; import mineplex.core.updater.event.UpdateEvent; import mineplex.serverdata.Region; -import mineplex.serverdata.ServerCommandManager; -import mineplex.serverdata.transfers.RestartCommand; +import mineplex.serverdata.commands.RestartCommand; +import mineplex.serverdata.commands.ServerCommandManager; public class FileUpdater extends MiniPlugin { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/updater/RestartHandler.java b/Plugins/Mineplex.Core/src/mineplex/core/updater/RestartHandler.java index 51a89cd14..de7e613fe 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/updater/RestartHandler.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/updater/RestartHandler.java @@ -2,10 +2,10 @@ package mineplex.core.updater; import mineplex.core.common.util.F; import mineplex.core.portal.Portal; -import mineplex.serverdata.CommandCallback; import mineplex.serverdata.Region; -import mineplex.serverdata.ServerCommand; -import mineplex.serverdata.transfers.RestartCommand; +import mineplex.serverdata.commands.CommandCallback; +import mineplex.serverdata.commands.RestartCommand; +import mineplex.serverdata.commands.ServerCommand; import org.bukkit.Bukkit; import org.bukkit.entity.Player; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/updater/RestartServerCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/updater/RestartServerCommand.java index 1540e0c27..ff2a51f08 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/updater/RestartServerCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/updater/RestartServerCommand.java @@ -9,7 +9,7 @@ import mineplex.core.common.util.Callback; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; import mineplex.core.portal.Portal; -import mineplex.serverdata.transfers.RestartCommand; +import mineplex.serverdata.commands.RestartCommand; public class RestartServerCommand extends CommandBase { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/visibility/VisibilityData.java b/Plugins/Mineplex.Core/src/mineplex/core/visibility/VisibilityData.java new file mode 100644 index 000000000..b5f08c4dd --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/visibility/VisibilityData.java @@ -0,0 +1,110 @@ +package mineplex.core.visibility; + +import java.util.Iterator; + +import mineplex.core.common.util.NautHashMap; +import mineplex.core.recharge.Recharge; +import mineplex.core.timing.TimingManager; + +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; +import org.bukkit.entity.Player; + +public class VisibilityData +{ + private NautHashMap _shouldHide = new NautHashMap(); + private NautHashMap _lastState = new NautHashMap(); + + public void updatePlayer(Player player, Player target, boolean hide) + { + TimingManager.stopTotal("VisData updatePlayer"); + + if (_lastState.containsKey(target) && _lastState.get(target) == hide) + { + //Already this state, do nothing + TimingManager.stopTotal("VisData updatePlayer"); + return; + } + + if (attemptToProcess(player, target, hide)) + { + //Clear old + _shouldHide.remove(target); + } + else + { + //Store + _shouldHide.put(target, hide); + } + + TimingManager.stopTotal("VisData updatePlayer"); + } + + //Process New + private boolean attemptToProcess(Player player, Player target, boolean hide) + { + TimingManager.startTotal("VisData attemptToProcess"); + + if (Recharge.Instance.use(player, "VIS " + target.getName(), 250, false, false)) + { + //Use craftplayer because i recall jon added something where + //it would still send the packet, even if the client thought it was already the state. + + if (hide) + { + TimingManager.startTotal("Hide Player"); + ((CraftPlayer)player).hidePlayer(target, true, true); + TimingManager.stopTotal("Hide Player"); + } + else + { + TimingManager.startTotal("Show Player"); + player.showPlayer(target); + TimingManager.stopTotal("Show Player"); + } + + _lastState.put(target, hide); + + TimingManager.stopTotal("VisData attemptToProcess"); + return true; + } + + TimingManager.stopTotal("VisData attemptToProcess"); + return false; + } + + //Process Update + public void attemptToProcessUpdate(Player player) + { + TimingManager.startTotal("VisData attemptToProcessUpdate shouldHide"); + if (!_shouldHide.isEmpty()) + { + for (Iterator targetIter = _shouldHide.keySet().iterator(); targetIter.hasNext();) + { + Player target = targetIter.next(); + boolean hide = _shouldHide.get(target); + + if (!target.isOnline() || !target.isValid() || attemptToProcess(player, target, hide)) + { + targetIter.remove(); + } + } + } + TimingManager.stopTotal("VisData attemptToProcessUpdate shouldHide"); + + + TimingManager.startTotal("VisData attemptToProcessUpdate lastState"); + if (!_lastState.isEmpty()) + { + for (Iterator targetIter = _lastState.keySet().iterator(); targetIter.hasNext();) + { + Player target = targetIter.next(); + + if (!target.isOnline() || !target.isValid()) + { + targetIter.remove(); + } + } + } + TimingManager.stopTotal("VisData attemptToProcessUpdate lastState"); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/visibility/VisibilityManager.java b/Plugins/Mineplex.Core/src/mineplex/core/visibility/VisibilityManager.java new file mode 100644 index 000000000..4336048d5 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/visibility/VisibilityManager.java @@ -0,0 +1,111 @@ +package mineplex.core.visibility; + +import java.util.Iterator; + +import mineplex.core.MiniPlugin; +import mineplex.core.common.util.NautHashMap; +import mineplex.core.common.util.UtilServer; +import mineplex.core.timing.TimingManager; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.plugin.java.JavaPlugin; + +public class VisibilityManager extends MiniPlugin +{ + public static VisibilityManager Instance; + + private NautHashMap _data = new NautHashMap(); + + protected VisibilityManager(JavaPlugin plugin) + { + super("Visibility Manager", plugin); + } + + public static void Initialize(JavaPlugin plugin) + { + Instance = new VisibilityManager(plugin); + } + + public VisibilityData getDataFor(Player player) + { + if (!_data.containsKey(player)) + _data.put(player, new VisibilityData()); + + return _data.get(player); + } + + public void setVisibility(Player target, boolean isVisible, Player... viewers) + { + TimingManager.startTotal("VisMan SetVis"); + + for (Player player : viewers) + { + if (player.equals(target)) + continue; + + getDataFor(player).updatePlayer(player, target, !isVisible); + } + + TimingManager.stopTotal("VisMan SetVis"); + } + + public void refreshPlayerToAll(Player player) + { + setVisibility(player, false, UtilServer.getPlayers()); + setVisibility(player, true, UtilServer.getPlayers()); + } + + @EventHandler + public void update(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; + + TimingManager.startTotal("VisMan Update"); + + Iterator playerIter = _data.keySet().iterator(); + + while (playerIter.hasNext()) + { + Player player = playerIter.next(); + + if (!player.isOnline() || !player.isValid()) + { + playerIter.remove(); + continue; + } + + _data.get(player).attemptToProcessUpdate(player); + } + + TimingManager.stopTotal("VisMan Update"); + } + + @EventHandler + public void quit(PlayerQuitEvent event) + { + _data.remove(event.getPlayer()); + } + + @EventHandler + public void updateDebug(UpdateEvent event) + { + if (event.getType() != UpdateType.MIN_01) + return; + + System.out.println(" "); + TimingManager.endTotal("VisMan update", true); + TimingManager.endTotal("VisMan setVis", true); + TimingManager.endTotal("VisData attemptToProcess", true); + TimingManager.endTotal("VisData updatePlayer", true); + TimingManager.endTotal("VisData attemptToProcessUpdate shouldHide", true); + TimingManager.endTotal("VisData attemptToProcessUpdate lastState", true); + TimingManager.endTotal("Hide Player", true); + TimingManager.endTotal("Show Player", true); + System.out.println(" "); + } +} diff --git a/Plugins/Mineplex.Database/src/jOOQConfig.xml b/Plugins/Mineplex.Database/src/jOOQConfig.xml index a690df4e8..f1827b5be 100644 --- a/Plugins/Mineplex.Database/src/jOOQConfig.xml +++ b/Plugins/Mineplex.Database/src/jOOQConfig.xml @@ -4,8 +4,8 @@ com.mysql.jdbc.Driver jdbc:mysql://db.mineplex.com:3306 - root - tAbechAk3wR7tuTh + MilitaryPolice + CUPr6Wuw2Rus$qap diff --git a/Plugins/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/Enjin.java b/Plugins/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/Enjin.java index f2ec8cb08..e663d6e77 100644 --- a/Plugins/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/Enjin.java +++ b/Plugins/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/Enjin.java @@ -17,6 +17,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.plugin.java.JavaPlugin; import mineplex.core.MiniPlugin; +import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; import mineplex.core.common.Rank; import mineplex.core.common.util.Callback; @@ -144,105 +145,95 @@ public class Enjin extends MiniPlugin implements CommandExecutor if (label.equalsIgnoreCase("enjin_mineplex")) { final String name = args[1]; - UUID uuid = null; - if (_cachedUUIDs.containsKey(name)) - uuid = _cachedUUIDs.get(name).getKey(); - else + _clientManager.loadClientByName(name, new Runnable() { - // Fails if not in DB and if duplicate. - uuid = _clientManager.loadUUIDFromDB(name); - - if (uuid == null) - uuid = UUIDFetcher.getUUIDOf(name); - } - - if (uuid == null) - { - System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + ", no UUID."); - return true; - } - - final UUID playerUUID = uuid; - - _cachedUUIDs.put(name, new AbstractMap.SimpleEntry(playerUUID, System.currentTimeMillis() + 240000)); - - if (args.length == 3 && args[0].equalsIgnoreCase("gem")) - { - final int amount = Integer.parseInt(args[2]); - - _donationManager.RewardGems(new Callback() + public void run() { - public void run (Boolean response) + final CoreClient client = _clientManager.Get(name); + + if (client == null) { - if (response) - { - System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + amount + " gems."); - } + System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + ", isn't in our database."); + } + else + { + UUID uuid = null; + + if (_cachedUUIDs.containsKey(name)) + uuid = _cachedUUIDs.get(name).getKey(); else { - _commandQueue.add(new QueuedCommand(sender, command, label, args)); - System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + amount + " gems. Queuing for run later."); + // Fails if not in DB and if duplicate. + uuid = _clientManager.loadUUIDFromDB(name); + + if (uuid == null) + uuid = UUIDFetcher.getUUIDOf(name); } - } - }, "purchase", name, playerUUID, amount); - } - else if (args.length == 3 && args[0].equalsIgnoreCase("coin")) - { - final int amount = Integer.parseInt(args[2]); - - _donationManager.RewardCoins(new Callback() - { - public void run (Boolean response) - { - if (response) + + if (uuid == null) { - System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + amount + " coins."); + System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + ", no UUID."); + return; } - else - { - _commandQueue.add(new QueuedCommand(sender, command, label, args)); - System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + amount + " coins. Queuing for run later."); - } - } - }, "purchase", name, playerUUID, amount); - } - else if (args.length == 3 && args[0].equalsIgnoreCase("booster")) - { - int amount = Integer.parseInt(args[2]); - - _donationManager.PurchaseUnknownSalesPackage(null, name, playerUUID, "Gem Booster " + amount, false, 0, false); - _repository.addGemBooster(name, amount); - System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + amount + " Gem Boosters" + "."); - } - else if (args.length >= 3 && args[0].equalsIgnoreCase("key")) - { - final int amount = Integer.parseInt(args[2]); - - if (args.length == 4) - { - _inventoryManager.addItemToInventoryForOffline(new Callback() - { - public void run(Boolean success) - { - if (success) - System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + amount + " Treasure Keys" + "."); - else + + final UUID playerUUID = uuid; + + _cachedUUIDs.put(name, new AbstractMap.SimpleEntry(playerUUID, System.currentTimeMillis() + 240000)); + + if (args.length == 3 && args[0].equalsIgnoreCase("gem")) + { + final int amount = Integer.parseInt(args[2]); + + _donationManager.RewardGems(new Callback() { - // Add arg so we don't add back to windows api call - _commandQueue.add(new QueuedCommand(sender, command, label, new String[] { args[0], args[1], args[2], "noaccountchange" })); - System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + amount + " Treasure Keys. Queuing for run later."); - } + public void run (Boolean response) + { + if (response) + { + System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + amount + " gems."); + } + else + { + _commandQueue.add(new QueuedCommand(sender, command, label, args)); + System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + amount + " gems. Queuing for run later."); + } + } + }, "purchase", name, playerUUID, amount); + } + else if (args.length == 3 && args[0].equalsIgnoreCase("coin")) + { + final int amount = Integer.parseInt(args[2]); + + _donationManager.RewardCoins(new Callback() + { + public void run (Boolean response) + { + if (response) + { + System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + amount + " coins."); + } + else + { + _commandQueue.add(new QueuedCommand(sender, command, label, args)); + System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + amount + " coins. Queuing for run later."); + } + } + }, "purchase", name, client.getAccountId(), amount); } - }, playerUUID.toString(), "Treasure", "Treasure Key", amount); - } - else - { - _donationManager.PurchaseUnknownSalesPackage(new Callback() - { - public void run(TransactionResponse data) + else if (args.length == 3 && args[0].equalsIgnoreCase("booster")) + { + int amount = Integer.parseInt(args[2]); + + _donationManager.PurchaseUnknownSalesPackage(null, name, client.getAccountId(), "Gem Booster " + amount, false, 0, false); + _repository.addGemBooster(name, amount); + System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + amount + " Gem Boosters" + "."); + } + else if (args.length >= 3 && args[0].equalsIgnoreCase("key")) { - if (data == TransactionResponse.Success) + final int amount = Integer.parseInt(args[2]); + + if (args.length == 4) { _inventoryManager.addItemToInventoryForOffline(new Callback() { @@ -257,149 +248,175 @@ public class Enjin extends MiniPlugin implements CommandExecutor System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + amount + " Treasure Keys. Queuing for run later."); } } - }, playerUUID.toString(), "Treasure", "Treasure Key", amount); + }, playerUUID, "Treasure", "Treasure Key", amount); } else { - _commandQueue.add(new QueuedCommand(sender, command, label, args)); - System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + amount + " Treasure Keys. Queuing for run later."); + _donationManager.PurchaseUnknownSalesPackage(new Callback() + { + public void run(TransactionResponse data) + { + if (data == TransactionResponse.Success) + { + _inventoryManager.addItemToInventoryForOffline(new Callback() + { + public void run(Boolean success) + { + if (success) + System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + amount + " Treasure Keys" + "."); + else + { + // Add arg so we don't add back to windows api call + _commandQueue.add(new QueuedCommand(sender, command, label, new String[] { args[0], args[1], args[2], "noaccountchange" })); + System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + amount + " Treasure Keys. Queuing for run later."); + } + } + }, playerUUID, "Treasure", "Treasure Key", amount); + } + else + { + _commandQueue.add(new QueuedCommand(sender, command, label, args)); + System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + amount + " Treasure Keys. Queuing for run later."); + } + } + }, name, client.getAccountId(), "Treasure Key " + amount, false, 0, false); } } - }, name, playerUUID, "Treasure Key " + amount, false, 0, false); - } - } - else if (args.length >= 3 && args[0].equalsIgnoreCase("chest")) - { - final int amount = Integer.parseInt(args[2]); - - if (args.length == 4) - { - _inventoryManager.addItemToInventoryForOffline(new Callback() - { - public void run(Boolean success) - { - if (success) - System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + amount + " Treasure Chests" + "."); + else if (args.length >= 3 && args[0].equalsIgnoreCase("chest")) + { + final int amount = Integer.parseInt(args[2]); + + if (args.length == 4) + { + _inventoryManager.addItemToInventoryForOffline(new Callback() + { + public void run(Boolean success) + { + if (success) + System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + amount + " Treasure Chests" + "."); + else + { + // Add arg so we don't add back to windows api call + _commandQueue.add(new QueuedCommand(sender, command, label, new String[] { args[0], args[1], args[2], "noaccountchange" })); + System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + amount + " Treasure Chests. Queuing for run later."); + } + } + }, playerUUID, "Utility", "Treasure Chest", amount); + } else { - // Add arg so we don't add back to windows api call - _commandQueue.add(new QueuedCommand(sender, command, label, new String[] { args[0], args[1], args[2], "noaccountchange" })); - System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + amount + " Treasure Chests. Queuing for run later."); + _donationManager.PurchaseUnknownSalesPackage(new Callback() + { + public void run(TransactionResponse data) + { + _inventoryManager.addItemToInventoryForOffline(new Callback() + { + public void run(Boolean success) + { + if (success) + System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + amount + " Treasure Chests" + "."); + else + { + // Add arg so we don't add back to windows api call + _commandQueue.add(new QueuedCommand(sender, command, label, new String[] { args[0], args[1], args[2], "noaccountchange" })); + System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + amount + " Treasure Chests. Queuing for run later."); + } + } + }, playerUUID, "Utility", "Treasure Chest", amount); + } + }, name, client.getAccountId(), "Treasure Chest " + amount, false, 0, false); } } - }, playerUUID.toString(), "Utility", "Treasure Chest", amount); - } - else - { - _donationManager.PurchaseUnknownSalesPackage(new Callback() - { - public void run(TransactionResponse data) + else if (args.length == 4 && args[0].equalsIgnoreCase("rank")) { - _inventoryManager.addItemToInventoryForOffline(new Callback() + final Rank rank = mineplex.core.common.Rank.valueOf(args[2]); + final boolean perm = Boolean.parseBoolean(args[3]); + + _clientManager.loadClientByName(name, new Runnable() { - public void run(Boolean success) + public void run() { - if (success) - System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + amount + " Treasure Chests" + "."); + if (_clientManager.Get(name).GetRank() == Rank.ALL || !_clientManager.Get(name).GetRank().Has(rank) || _clientManager.Get(name).GetRank() == rank) + { + _clientManager.SaveRank(name, playerUUID, rank, perm); + System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + rank + " " + (perm ? "permanently." : "for 1 month.")); + } else { - // Add arg so we don't add back to windows api call - _commandQueue.add(new QueuedCommand(sender, command, label, new String[] { args[0], args[1], args[2], "noaccountchange" })); - System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + amount + " Treasure Chests. Queuing for run later."); + System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " DENIED INFERIOR " + rank + " " + (perm ? "permanently." : "for 1 month.")); } } - }, playerUUID.toString(), "Utility", "Treasure Chest", amount); + }); } - }, name, playerUUID, "Treasure Chest " + amount, false, 0, false); - } - } - else if (args.length == 4 && args[0].equalsIgnoreCase("rank")) - { - final Rank rank = mineplex.core.common.Rank.valueOf(args[2]); - final boolean perm = Boolean.parseBoolean(args[3]); - - _clientManager.loadClientByName(name, new Runnable() - { - public void run() - { - if (_clientManager.Get(name).GetRank() == Rank.ALL || !_clientManager.Get(name).GetRank().Has(rank) || _clientManager.Get(name).GetRank() == rank) + else if (args.length >= 3 && args[0].equalsIgnoreCase("purchase")) { - _clientManager.SaveRank(name, rank, perm); - System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + rank + " " + (perm ? "permanently." : "for 1 month.")); - } - else - { - System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " DENIED INFERIOR " + rank + " " + (perm ? "permanently." : "for 1 month.")); - } - } - }); - } - else if (args.length >= 3 && args[0].equalsIgnoreCase("purchase")) - { - final int amount = Integer.parseInt(args[2]); - final String category = args[3]; - String tempName = args[4]; - - for (int i = 5; i < args.length; i++) - { - tempName += " " + args[i]; - } - - final String packageName = tempName; - - _donationManager.PurchaseUnknownSalesPackage(new Callback() - { - public void run(TransactionResponse data) - { - if (data == TransactionResponse.Success) - { - _inventoryManager.addItemToInventoryForOffline(new Callback() + final int amount = Integer.parseInt(args[2]); + final String category = args[3]; + String tempName = args[4]; + + for (int i = 5; i < args.length; i++) { - public void run(Boolean success) + tempName += " " + args[i]; + } + + final String packageName = tempName; + + _donationManager.PurchaseUnknownSalesPackage(new Callback() + { + public void run(TransactionResponse data) { - if (success) - System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + amount + " " + packageName + "."); + if (data == TransactionResponse.Success) + { + _inventoryManager.addItemToInventoryForOffline(new Callback() + { + public void run(Boolean success) + { + if (success) + System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + amount + " " + packageName + "."); + else + { + // Add arg so we don't add back to windows api call + _commandQueue.add(new QueuedCommand(sender, command, label, new String[] { args[0], args[1], args[2], "noaccountchange" })); + System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + packageName + ". Queuing for run later."); + } + } + }, playerUUID, category, packageName, amount); + } else { - // Add arg so we don't add back to windows api call - _commandQueue.add(new QueuedCommand(sender, command, label, new String[] { args[0], args[1], args[2], "noaccountchange" })); - System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + packageName + ". Queuing for run later."); + _commandQueue.add(new QueuedCommand(sender, command, label, args)); + System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + amount + " Treasure Keys. Queuing for run later."); } } - }, playerUUID.toString(), category, packageName, amount); + }, name, client.getAccountId(), packageName, false, 0, false); } - else - { - _commandQueue.add(new QueuedCommand(sender, command, label, args)); - System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + amount + " Treasure Keys. Queuing for run later."); + else if (args.length >= 3 && args[0].equalsIgnoreCase("unban")) + { + String reason = args[2]; + + for (int i = 3; i < args.length; i++) + { + reason += " " + args[i]; + } + + _punish.RemoveBan(name, reason); + System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " unbanned for " + reason); + } + else if (args.length >= 3 && args[0].equalsIgnoreCase("ban")) + { + String reason = args[2]; + + for (int i = 3; i < args.length; i++) + { + reason += " " + args[i]; + } + + _punish.AddPunishment(name, Category.Other, reason, null, 3, true, -1); + System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " banned for " + reason); } } - }, name, playerUUID, packageName, false, 0, false); - } - else if (args.length >= 3 && args[0].equalsIgnoreCase("unban")) - { - String reason = args[2]; - - for (int i = 3; i < args.length; i++) - { - reason += " " + args[i]; } - - _punish.RemoveBan(name, reason); - System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " unbanned for " + reason); - } - else if (args.length >= 3 && args[0].equalsIgnoreCase("ban")) - { - String reason = args[2]; - - for (int i = 3; i < args.length; i++) - { - reason += " " + args[i]; - } - - _punish.AddPunishment(name, Category.Other, reason, null, 3, true, -1); - System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " banned for " + reason); - } + }); } } catch (Exception exception) diff --git a/Plugins/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/TempRepository.java b/Plugins/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/TempRepository.java index e052ee72e..ba4cd2729 100644 --- a/Plugins/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/TempRepository.java +++ b/Plugins/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/TempRepository.java @@ -2,6 +2,7 @@ package mineplex.enjinTranslator; 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; @@ -12,7 +13,7 @@ public class TempRepository extends RepositoryBase public TempRepository(JavaPlugin plugin) { - super(plugin, "jdbc:mysql://db.mineplex.com:3306/Account?autoReconnect=true&failOverReadOnly=false&maxReconnects=10", "root", "tAbechAk3wR7tuTh"); + super(plugin, DBPool.ACCOUNT); } public void addGemBooster(String name, int amount) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java index 923169189..6c61713e8 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java @@ -60,7 +60,7 @@ public class Clans extends JavaPlugin _donationManager = new DonationManager(this, _clientManager, webServerAddress); - new ServerConfiguration(this); + new ServerConfiguration(this, _clientManager); PreferencesManager preferenceManager = new PreferencesManager(this, _clientManager, _donationManager); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/repository/ClanRepository.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/repository/ClanRepository.java index 109d4354e..e22160e3c 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/repository/ClanRepository.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/repository/ClanRepository.java @@ -9,6 +9,7 @@ import java.util.UUID; 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.ColumnBoolean; @@ -59,7 +60,7 @@ public class ClanRepository extends RepositoryBase public ClanRepository(JavaPlugin plugin, String serverName) { - super(plugin, "jdbc:mysql://db.mineplex.com:3306/Account?autoReconnect=true&failOverReadOnly=false&maxReconnects=10", "root", "tAbechAk3wR7tuTh"); + super(plugin, DBPool.ACCOUNT); _serverName = serverName; } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/fields/repository/FieldRepository.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/fields/repository/FieldRepository.java index cad9425ef..f5be7a077 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/fields/repository/FieldRepository.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/fields/repository/FieldRepository.java @@ -7,6 +7,7 @@ import java.util.List; import org.bukkit.plugin.java.JavaPlugin; +import mineplex.core.database.DBPool; import mineplex.core.database.RepositoryBase; import mineplex.core.database.ResultSetCallable; import mineplex.core.database.column.ColumnByte; @@ -31,7 +32,7 @@ public class FieldRepository extends RepositoryBase public FieldRepository(JavaPlugin plugin) { - super(plugin, "jdbc:mysql://db.mineplex.com:3306/Account?autoReconnect=true&failOverReadOnly=false&maxReconnects=10", "root", "tAbechAk3wR7tuTh"); + super(plugin, DBPool.ACCOUNT); } public List getFieldBlocks(String server) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpShopButton.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpShopButton.java index cb2b186df..962ea019c 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpShopButton.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/PvpShopButton.java @@ -69,7 +69,7 @@ public class PvpShopButton> imple UtilPlayer.message(player, F.main(Page.getPlugin().getName(), "An error occurred processing your purchase.")); } } - }, "Clans", player.getName(), player.getUniqueId(), -cost); + }, "Clans", player.getName(), Page.getClientManager().Get(player).getAccountId(), -cost); } } else if (clickType == ClickType.RIGHT || clickType == ClickType.SHIFT_RIGHT) @@ -109,7 +109,7 @@ public class PvpShopButton> imple UtilPlayer.message(player, F.main(Page.getPlugin().getName(), "An error occurred processing your return.")); } } - }, "Clans", player.getName(), player.getUniqueId(), creditAmount); + }, "Clans", player.getName(), Page.getClientManager().Get(player).getAccountId(), creditAmount); } } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/energy/EnergyShopButton.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/energy/EnergyShopButton.java index c0d416d3b..5398daf50 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/energy/EnergyShopButton.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/energy/EnergyShopButton.java @@ -50,7 +50,7 @@ public class EnergyShopButton implements IButton _clanInfo.adjustEnergy(energy); _page.refresh(); } - }, "Energy Purchase", player.getName(), player.getUniqueId(), -goldCost, true); + }, "Energy Purchase", player.getName(), _page.getClientManager().Get(player).getAccountId(), -goldCost, true); } } diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java index 865b402a2..17b648f21 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java @@ -8,6 +8,7 @@ import mineplex.core.TablistFix; import mineplex.core.account.CoreClientManager; import mineplex.core.achievement.AchievementManager; import mineplex.core.antihack.AntiHack; +import mineplex.core.aprilfools.AprilFoolsManager; import mineplex.core.blockrestore.BlockRestore; import mineplex.core.chat.Chat; import mineplex.core.command.CommandCenter; @@ -17,6 +18,7 @@ import mineplex.core.donation.DonationManager; import mineplex.core.elo.EloManager; import mineplex.core.energy.Energy; import mineplex.core.friend.FriendManager; +import mineplex.core.give.Give; import mineplex.core.hologram.HologramManager; import mineplex.core.ignore.IgnoreManager; import mineplex.core.itemstack.ItemStackFactory; @@ -44,6 +46,7 @@ import mineplex.core.task.TaskManager; import mineplex.core.teleport.Teleport; import mineplex.core.updater.FileUpdater; import mineplex.core.updater.Updater; +import mineplex.core.visibility.VisibilityManager; import mineplex.hub.modules.StackerManager; import mineplex.hub.poll.PollManager; import mineplex.hub.queue.QueueManager; @@ -82,11 +85,12 @@ public class Hub extends JavaPlugin implements IRelation ItemStackFactory.Initialize(this, false); Recharge.Initialize(this); + VisibilityManager.Initialize(this); Give.Initialize(this); Punish punish = new Punish(this, webServerAddress, clientManager); BlockRestore blockRestore = new BlockRestore(this); DonationManager donationManager = new DonationManager(this, clientManager, webServerAddress); - new ServerConfiguration(this); + new ServerConfiguration(this, clientManager); //Other Modules PacketHandler packetHandler = new PacketHandler(this); @@ -112,13 +116,13 @@ public class Hub extends JavaPlugin implements IRelation StatsManager statsManager = new StatsManager(this, clientManager); AchievementManager achievementManager = new AchievementManager(statsManager, clientManager, donationManager); - + PartyManager partyManager = new PartyManager(this, portal, clientManager, preferenceManager); HubManager hubManager = new HubManager(this, blockRestore, clientManager, donationManager, new ConditionManager(this), disguiseManager, new TaskManager(this, webServerAddress), portal, partyManager, preferenceManager, petManager, pollManager, statsManager, achievementManager, new HologramManager(this)); QueueManager queueManager = new QueueManager(this, clientManager, donationManager, new EloManager(this, clientManager), partyManager); - + new ServerManager(this, clientManager, donationManager, portal, partyManager, serverStatusManager, hubManager, new StackerManager(hubManager), queueManager); new Chat(this, clientManager, preferenceManager, serverStatusManager.getCurrentServerName()); new MemoryFix(this); @@ -135,6 +139,8 @@ public class Hub extends JavaPlugin implements IRelation //new Replay(this, packetHandler); new PersonalServerManager(this, clientManager); + AprilFoolsManager.Initialize(this, clientManager, disguiseManager); + CombatManager combatManager = new CombatManager(this); ProjectileManager throwManager = new ProjectileManager(this); @@ -142,7 +148,7 @@ public class Hub extends JavaPlugin implements IRelation DamageManager damage = new DamageManager(this, combatManager, npcManager, disguiseManager); Fire fire = new Fire(this, conditionManager, damage); - Teleport teleport = new Teleport(this); + Teleport teleport = new Teleport(this); Energy energy = new Energy(this); energy.setEnabled(false); diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java index bd0712857..ebff189d5 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/HubManager.java @@ -1,6 +1,7 @@ package mineplex.hub; import java.util.ArrayList; +import java.util.Calendar; import java.util.HashMap; import org.bukkit.Bukkit; @@ -45,6 +46,7 @@ import mineplex.core.MiniClientPlugin; import mineplex.core.account.CoreClient; import mineplex.core.account.CoreClientManager; import mineplex.core.achievement.AchievementManager; +import mineplex.core.aprilfools.AprilFoolsManager; import mineplex.core.blockrestore.BlockRestore; import mineplex.core.common.Rank; import mineplex.core.common.util.C; @@ -91,7 +93,7 @@ import mineplex.hub.modules.NewsManager; import mineplex.hub.modules.ParkourManager; import mineplex.hub.modules.TextManager; import mineplex.hub.modules.UHCManager; -import mineplex.hub.modules.VisibilityManager; +import mineplex.hub.modules.HubVisibilityManager; import mineplex.hub.modules.WorldManager; import mineplex.hub.poll.PollManager; import mineplex.hub.tutorial.TutorialManager; @@ -116,7 +118,7 @@ public class HubManager extends MiniClientPlugin private StatsManager _statsManager; private GadgetManager _gadgetManager; private MountManager _mountManager; - private VisibilityManager _visibilityManager; + private HubVisibilityManager _visibilityManager; private TutorialManager _tutorialManager; private TextManager _textCreator; private ParkourManager _parkour; @@ -183,7 +185,7 @@ public class HubManager extends MiniClientPlugin _partyManager = partyManager; _preferences = preferences; _tutorialManager = new TutorialManager(this, donationManager, taskManager, _textCreator); - _visibilityManager = new VisibilityManager(this); + _visibilityManager = new HubVisibilityManager(this); _forcefieldManager = new ForcefieldManager(this); addCommand(new ForcefieldRadius(_forcefieldManager)); @@ -510,18 +512,22 @@ public class HubManager extends MiniClientPlugin public void PlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); + String playerName = player.getName(); + + // April Fools + if (AprilFoolsManager.Instance.isActive()) + playerName = AprilFoolsManager.Instance.getName(player); //Public Message if (_clientManager.Get(player).GetRank() != Rank.LEGEND) event.setJoinMessage(null); else { - event.setJoinMessage(C.cGreen + C.Bold + "Legend " + player.getName() + " has joined!"); + event.setJoinMessage(C.cGreen + C.Bold + "Legend " + playerName + " has joined!"); UtilFirework.playFirework(player.getEyeLocation(), org.bukkit.FireworkEffect.Type.BALL_LARGE, Color.LIME, true, true); player.getWorld().playSound(player.getEyeLocation(), Sound.WITHER_SPAWN, 2f, 1f); } - - + //Teleport player.teleport(GetSpawn().add(0, 10, 0)); @@ -622,6 +628,11 @@ public class HubManager extends MiniClientPlugin } Player player = event.getPlayer(); + String playerName = player.getName(); + + // April Fools + if (AprilFoolsManager.Instance.isActive()) + playerName = AprilFoolsManager.Instance.getName(player); Rank rank = GetClients().Get(player).GetRank(); @@ -647,7 +658,7 @@ public class HubManager extends MiniClientPlugin event.getRecipients().clear(); event.setMessage(event.getMessage().substring(1, event.getMessage().length())); - event.setFormat(levelStr + C.cDPurple + C.Bold + "Party " + C.cWhite + C.Bold + "%1$s " + C.cPurple + "%2$s"); + event.setFormat(levelStr + C.cDPurple + C.Bold + "Party " + C.cWhite + C.Bold + playerName + " " + C.cPurple + "%2$s"); for (String name : party.GetPlayers()) { @@ -664,7 +675,7 @@ public class HubManager extends MiniClientPlugin } return; - } + } else { for (Player other : UtilServer.getPlayers()) @@ -676,7 +687,7 @@ public class HubManager extends MiniClientPlugin } event.setMessage(event.getMessage()); - event.setFormat(levelStr + rankStr + C.cYellow + "%1$s " + C.cWhite + "%2$s"); + event.setFormat(levelStr + rankStr + C.cYellow + playerName + " " + C.cWhite + "%2$s"); } } } @@ -909,7 +920,7 @@ public class HubManager extends MiniClientPlugin return _statsManager; } - public VisibilityManager GetVisibility() + public HubVisibilityManager GetVisibility() { return _visibilityManager; } diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/mail/MailRepository.java b/Plugins/Mineplex.Hub/src/mineplex/hub/mail/MailRepository.java index 59e7e796c..af43ab9f5 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/mail/MailRepository.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/mail/MailRepository.java @@ -6,9 +6,11 @@ import java.util.UUID; import org.bukkit.plugin.java.JavaPlugin; +import mineplex.core.database.DBPool; import mineplex.core.database.RepositoryBase; import mineplex.database.Tables; import mineplex.database.tables.records.MailRecord; + import org.jooq.DSLContext; import org.jooq.Result; import org.jooq.impl.DSL; @@ -19,8 +21,8 @@ public class MailRepository extends RepositoryBase public MailRepository(JavaPlugin plugin, MailManager manager) { - super(plugin, "jdbc:mysql://db.mineplex.com:3306/Account?autoReconnect=true&failOverReadOnly=false&maxReconnects=10", "root", "tAbechAk3wR7tuTh"); - + super(plugin, DBPool.ACCOUNT); + _manager = manager; } diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/ForcefieldManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/ForcefieldManager.java index 0683060e9..425ce1a0f 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/ForcefieldManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/ForcefieldManager.java @@ -42,7 +42,7 @@ public class ForcefieldManager extends MiniPlugin for (Player player : UtilServer.getPlayers()) { - if (Manager.getPreferences().Get(player).HubForcefield) + if (Manager.getPreferences().Get(player).HubForcefield && Manager.GetClients().Get(player).GetRank().Has(Rank.ADMIN)) { for (Player other : UtilServer.getPlayers()) { diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/VisibilityManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/HubVisibilityManager.java similarity index 78% rename from Plugins/Mineplex.Hub/src/mineplex/hub/modules/VisibilityManager.java rename to Plugins/Mineplex.Hub/src/mineplex/hub/modules/HubVisibilityManager.java index dd0502113..f7ce210aa 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/VisibilityManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/HubVisibilityManager.java @@ -20,16 +20,17 @@ import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilServer; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; +import mineplex.core.visibility.VisibilityManager; import mineplex.hub.HubManager; -public class VisibilityManager extends MiniPlugin +public class HubVisibilityManager extends MiniPlugin { public HubManager Manager; private HashMap _particle = new HashMap(); private HashSet _hiddenPlayers = new HashSet(); - public VisibilityManager(HubManager manager) + public HubVisibilityManager(HubManager manager) { super("Visibility Manager", manager.getPlugin()); @@ -54,28 +55,32 @@ public class VisibilityManager extends MiniPlugin } @EventHandler - public void UpdateVisibility(UpdateEvent event) + public void updateVisibility(UpdateEvent event) { - if (event.getType() != UpdateType.FAST) + if (event.getType() != UpdateType.SEC) return; for (Player player : UtilServer.getPlayers()) { - boolean hideMe = Manager.getPreferences().Get(player).Invisibility || _hiddenPlayers.contains(player); + boolean hideMe = Manager.GetTutorial().InTutorial(player) || + UtilMath.offset2d(player.getLocation(), Manager.GetSpawn()) == 0 || + Manager.getPreferences().Get(player).Invisibility || + _hiddenPlayers.contains(player); for (Player other : UtilServer.getPlayers()) { if (player.equals(other)) continue; - if (hideMe || !Manager.getPreferences().Get(other).ShowPlayers || UtilMath.offset2d(player.getLocation(), Manager.GetSpawn()) == 0 || - Manager.GetTutorial().InTutorial(other) || Manager.GetTutorial().InTutorial(player)) + if (hideMe || + !Manager.getPreferences().Get(other).ShowPlayers || + Manager.GetTutorial().InTutorial(other)) { - ((CraftPlayer)other).hidePlayer(player, true, false); + VisibilityManager.Instance.setVisibility(player, false, other); } else { - other.showPlayer(player); + VisibilityManager.Instance.setVisibility(player, true, other); } } } diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/NewsManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/NewsManager.java index a2e3f6919..727b3c312 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/NewsManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/NewsManager.java @@ -76,8 +76,19 @@ public class NewsManager extends MiniPlugin String[] newsStrings = new String[maxPosition]; for (Iterator iterator = newsEntries.keySet().iterator(); iterator.hasNext();) { - String newsPosition = iterator.next(); - newsStrings[Integer.parseInt(newsPosition) - 1] = newsEntries.get(newsPosition); + int newsPos = Integer.parseInt(iterator.next()); + + ChatColor col = ChatColor.RED; + if (newsPos == 1) col = ChatColor.GOLD; + else if (newsPos == 2) col = ChatColor.YELLOW; + else if (newsPos == 3) col = ChatColor.GREEN; + else if (newsPos == 4) col = ChatColor.AQUA; + else if (newsPos == 5) col = ChatColor.LIGHT_PURPLE; + + newsStrings[newsPos - 1] = col + C.Bold + "MINEPLEX" + ChatColor.RESET + " - " + newsEntries.get(newsPos + ""); + + if (newsStrings[newsPos - 1].length() > 64) + newsStrings[newsPos - 1] = newsStrings[newsPos - 1].substring(0, 64); } _news = newsStrings; @@ -230,13 +241,6 @@ public class NewsManager extends MiniPlugin if (event.getType() != UpdateType.FASTEST) return; - //Mineplex Color - ChatColor col = ChatColor.RED; - if (_mineplexIndex == 1) col = ChatColor.GOLD; - else if (_mineplexIndex == 2) col = ChatColor.YELLOW; - else if (_mineplexIndex == 3) col = ChatColor.GREEN; - else if (_mineplexIndex == 4) col = ChatColor.AQUA; - else if (_mineplexIndex == 5) col = ChatColor.LIGHT_PURPLE; _mineplexIndex = (_mineplexIndex + 1)%6; //News Change @@ -250,16 +254,11 @@ public class NewsManager extends MiniPlugin // Resets newsIndex if outside of bounds of news array after RefreshNews but before UtilTime.elapsed above _newsIndex = 0; } - - //Text - String text = col + C.Bold + "MINEPLEX" + ChatColor.RESET + " - " + _news[_newsIndex]; - if (text.length() > 64) - text = text.substring(0, 64); double healthPercent = (double)_newsIndex/(double)(_news.length-1); + String text = _news[_newsIndex]; UtilTextTop.display(text, UtilServer.getPlayers()); - for (Creature pet : Manager.getPetManager().getPets()) { if (pet instanceof Wither) @@ -275,7 +274,7 @@ public class NewsManager extends MiniPlugin ((MountDragon)mount).SetName(text); //((MountDragon)mount).setHealthPercent(healthPercent); } - } + } for (Gadget gadget : Manager.GetGadget().getGadgets(GadgetType.Morph)) { diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/StackerManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/StackerManager.java index 0259a4cd3..76a74e62a 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/StackerManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/StackerManager.java @@ -206,7 +206,7 @@ public class StackerManager extends MiniPlugin implements IThrown UtilAction.velocity(throwee, thrower.getLocation().getDirection(), 1.8, false, 0, 0.3, 2, false); - _projectileManager.AddThrow(throwee, thrower, this, -1, true, false, true, false, 2.4d); + _projectileManager.AddThrow(throwee, thrower, this, -1, true, false, true, false, 0.5f); //Portal Delay Manager.SetPortalDelay(thrower); diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/WorldManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/WorldManager.java index c2782cbff..c02a3c6a0 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/modules/WorldManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/modules/WorldManager.java @@ -209,6 +209,9 @@ public class WorldManager extends MiniPlugin if (!(ent instanceof Item)) continue; + if (((Item)ent).getItemStack().getType() == Material.MONSTER_EGG) + continue; + if (ent.getTicksLived() > 1200) ent.remove(); } diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/poll/PollManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/poll/PollManager.java index 68f88e47f..18f92ae15 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/poll/PollManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/poll/PollManager.java @@ -216,8 +216,8 @@ public class PollManager extends MiniDbClientPlugin } @Override - public String getQuery(String uuid, String name) + public String getQuery(int accountId, String uuid, String name) { - return "SELECT pollId, value FROM accountPolls INNER JOIN accounts ON accountPolls.accountId = accounts.id WHERE accounts.uuid = '" + uuid + "';"; + return "SELECT pollId, value FROM accountPolls WHERE accountPolls.accountId = '" + accountId + "';"; } } diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/poll/PollRepository.java b/Plugins/Mineplex.Hub/src/mineplex/hub/poll/PollRepository.java index 0015a87ea..e38e980ec 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/poll/PollRepository.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/poll/PollRepository.java @@ -8,6 +8,7 @@ import java.util.UUID; import org.bukkit.plugin.java.JavaPlugin; +import mineplex.core.database.DBPool; import mineplex.core.database.RepositoryBase; import mineplex.core.database.ResultSetCallable; import mineplex.core.database.column.ColumnInt; @@ -28,7 +29,7 @@ public class PollRepository extends RepositoryBase public PollRepository(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.Hub/src/mineplex/hub/server/ServerManager.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java index 5b7aa65f4..597de1c2b 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ServerManager.java @@ -57,8 +57,8 @@ import mineplex.hub.queue.ui.QueueShop; import mineplex.hub.server.ui.LobbyShop; import mineplex.hub.server.ui.QuickShop; import mineplex.hub.server.ui.ServerNpcShop; -import mineplex.serverdata.MinecraftServer; -import mineplex.serverdata.ServerGroup; +import mineplex.serverdata.data.MinecraftServer; +import mineplex.serverdata.data.ServerGroup; public class ServerManager extends MiniPlugin { diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/LobbyMenu.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/LobbyMenu.java index f47ee6a16..90cc6faa1 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/LobbyMenu.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/LobbyMenu.java @@ -57,7 +57,7 @@ public class LobbyMenu extends ShopPageBase implements slot = Integer.parseInt(serverInfo.Name.split("-")[1]) - 1; if (slot >= 54) - break; + continue; if (serverInfo.Name.equalsIgnoreCase(getPlugin().getStatusManager().getCurrentServerName())) status = Material.EMERALD_BLOCK; @@ -81,6 +81,12 @@ public class LobbyMenu extends ShopPageBase implements else addItem(slot, new ShopItem(status, ChatColor.UNDERLINE + "" + ChatColor.BOLD + "" + ChatColor.WHITE + "Server " + serverInfo.Name.substring(serverInfo.Name.indexOf('-') + 1), lore.toArray(new String[lore.size()]), Integer.parseInt(serverInfo.Name.substring(serverInfo.Name.indexOf('-') + 1)), false)); } + + while (slot < 54) + { + clear(slot); + slot++; + } } public void Update() diff --git a/Plugins/Mineplex.MapParser/src/mineplex/mapparser/GameType.java b/Plugins/Mineplex.MapParser/src/mineplex/mapparser/GameType.java index a321727b7..1973bcbfc 100644 --- a/Plugins/Mineplex.MapParser/src/mineplex/mapparser/GameType.java +++ b/Plugins/Mineplex.MapParser/src/mineplex/mapparser/GameType.java @@ -6,6 +6,7 @@ public enum GameType Other("Other"), Unknown("Unknown"), Lobby("Lobby"), + Event("Mineplex Event"), BaconBrawl("Bacon Brawl"), Barbarians("A Barbarians Life"), @@ -58,6 +59,7 @@ public enum GameType ZombieSurvival("Zombie Survival"), Upload("Upload"), + Submissions("Submissions"), InProgress("In Progress"), diff --git a/Plugins/Mineplex.MapParser/src/mineplex/mapparser/command/ListCommand.java b/Plugins/Mineplex.MapParser/src/mineplex/mapparser/command/ListCommand.java index 835973fb1..8935eb777 100644 --- a/Plugins/Mineplex.MapParser/src/mineplex/mapparser/command/ListCommand.java +++ b/Plugins/Mineplex.MapParser/src/mineplex/mapparser/command/ListCommand.java @@ -34,6 +34,9 @@ public class ListCommand extends BaseCommand for (GameType gameType : GameType.values()) { + if (gameType == GameType.InProgress) + continue; + if (listMaps(player, gameType, colorSwitch)) colorSwitch = !colorSwitch; } @@ -41,16 +44,22 @@ public class ListCommand extends BaseCommand else if (args.length == 1) { GameType gameType = null; - try + if (args[0].equalsIgnoreCase("p")) { - gameType = GameType.valueOf(args[0]); + gameType = GameType.InProgress; } - catch (Exception e) + else { - getPlugin().sendValidGameTypes(player); + try + { + gameType = GameType.valueOf(args[0]); + } + catch (Exception e) + { + getPlugin().sendValidGameTypes(player); + } } - - + UtilPlayer.message(player, F.main("Parser", "Listing Maps for gametype " + F.elem(gameType.GetName()))); listMaps(player, gameType, false); } diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Class/ClientClass.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Class/ClientClass.java index c42d12107..ae8816f3a 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Class/ClientClass.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Class/ClientClass.java @@ -26,6 +26,7 @@ import mineplex.minecraft.game.classcombat.Class.repository.token.SlotToken; import mineplex.minecraft.game.classcombat.Skill.ISkill; import mineplex.minecraft.game.classcombat.Skill.ISkill.SkillType; import mineplex.minecraft.game.classcombat.Skill.SkillFactory; +import mineplex.minecraft.game.classcombat.Skill.Knight.AxeThrow; import mineplex.minecraft.game.classcombat.item.ItemFactory; public class ClientClass @@ -372,6 +373,14 @@ public class ClientClass { _client.GetPlayer().getInventory().setItem(defaultItem.getKey(), defaultItem.getValue()); } + + for (ISkill skill : _skillMap.values()) + { + if (skill instanceof AxeThrow) + { + ((AxeThrow)skill).Reset(_client.GetPlayer()); + } + } } public void ResetToDefaults(boolean equipItems, boolean equipDefaultArmor) @@ -555,4 +564,30 @@ public class ClientClass } } + + //This is used to fix a dual class bug using Twitch broadcasting GUI (F6) + public void validateClassSkills(Player player) + { + if (_gameClass == null || _skillMap == null) + return; + + for (SkillType type : SkillType.values()) + { + if (type == SkillType.GlobalPassive) + continue; + + if (!_skillMap.containsKey(type)) + continue; + + ISkill skill = _skillMap.get(type); + + if (skill.GetClassType() != _gameClass.GetType()) + { + skill.Reset(player); + RemoveSkill(skill); + + System.out.println("[" + player.getName() + " / " + _gameClass.GetType() + "] Removed Invalid " + skill.GetClassType() + " Skill (" + skill.GetName() + ")"); + } + } + } } diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Assassin.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Assassin.java index 94dea13b0..62dc3852b 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Assassin.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Assassin.java @@ -23,7 +23,7 @@ public class Assassin extends Skill SetDesc(new String[] { "Permanent Speed II.", - "Fall damage reduced by 1." + "Fall damage reduced by 1.5." }); } @@ -87,7 +87,7 @@ public class Assassin extends Skill int level = getLevel(player); if (level == 0) return; - event.AddMod(null, GetName(), -1, false); + event.AddMod(null, GetName(), -1.5, false); } @Override diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Blink.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Blink.java index 7a1d5f331..66b2682dd 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Blink.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Blink.java @@ -70,11 +70,14 @@ public class Blink extends SkillActive return false; } - //Mastery + //Deblink if (_loc.containsKey(player) && _blinkTime.containsKey(player)) if (!UtilTime.elapsed(_blinkTime.get(player), 5000)) { - Deblink(player, level); + //Require 500ms after blink to deblink + if (UtilTime.elapsed(_blinkTime.get(player), 500)) + Deblink(player, level); + return false; } diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Flash.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Flash.java index 9e3890b3c..58f2a0046 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Flash.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Flash.java @@ -53,7 +53,7 @@ public class Flash extends SkillActive @Override public String GetRechargeString() { - return "Recharge: #11#-1 Seconds per Charge"; + return "Recharge: #10#-1 Seconds per Charge"; } @Override @@ -98,7 +98,7 @@ public class Flash extends SkillActive if (charges >= 1 + level) continue; - if (!mineplex.core.recharge.Recharge.Instance.use(cur, "Flash Recharge", 11000 - (1000 * level), false, false)) + if (!mineplex.core.recharge.Recharge.Instance.use(cur, "Flash Recharge", 10000 - (1000 * level), false, false)) continue; _flash.put(cur, charges + 1); diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Illusion.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Illusion.java index f640e6181..dc0d6aef1 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Illusion.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/Illusion.java @@ -34,6 +34,7 @@ import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilWorld; +import mineplex.core.disguise.disguises.DisguisePig; import mineplex.core.disguise.disguises.DisguisePlayer; import mineplex.minecraft.game.classcombat.Skill.SkillActive; import mineplex.minecraft.game.classcombat.Skill.SkillFactory; @@ -120,14 +121,10 @@ public class Illusion extends SkillActive for (Player other : UtilServer.getPlayers()) if (UtilMath.offset2d(skel, other) < 70) inRange.add(other); - - Player[] disguiseList = new Player[inRange.size()]; - for (int i=0 ; i locs = _locMap.remove(player); diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/SilencingArrow.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/SilencingArrow.java index 2af2d2345..2a9b18a2f 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/SilencingArrow.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/SilencingArrow.java @@ -50,7 +50,7 @@ public class SilencingArrow extends SkillActive SetDesc(new String[] { "Your next arrow will Silence", - "target for #3#3 seconds.", + "target for #1#3 seconds.", "", "Silence stops skills being used." }); diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/SmokeArrow.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/SmokeArrow.java index 29135e56f..9327aafa9 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/SmokeArrow.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/SmokeArrow.java @@ -50,7 +50,7 @@ public class SmokeArrow extends SkillActive SetDesc(new String[] { "Your next arrow will give Blindness", - "to target for #3#1 seconds." + "and Slow 2 to target for #3#1 seconds." }); } @@ -127,6 +127,7 @@ public class SmokeArrow extends SkillActive //Confuse double dur = 3 + level; Factory.Condition().Factory().Blind(GetName(), damagee, damager, dur, 0, true, true, true); + Factory.Condition().Factory().Slow(GetName(), damagee, damager, dur, 1, true, true, true, true); //Effect damagee.getWorld().playSound(damagee.getLocation(), Sound.BLAZE_BREATH, 2.5f, 2.0f); diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/SmokeBomb.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/SmokeBomb.java index c7ddc4924..96de20042 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/SmokeBomb.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Assassin/SmokeBomb.java @@ -46,7 +46,7 @@ public class SmokeBomb extends Skill @Override public String GetRechargeString() { - return "Recharge: #90#-15 Seconds"; + return "Recharge: #60#-10 Seconds"; } @EventHandler @@ -75,7 +75,7 @@ public class SmokeBomb extends Skill return; } - if (!Recharge.Instance.use(player, GetName(), GetName(level), 90000 - (level * 15000), true, false)) + if (!Recharge.Instance.use(player, GetName(), GetName(level), 60000 - (level * 10000), true, false)) return; //Action diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/BlockToss.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/BlockToss.java index 8375c2ae5..9bf9994fc 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/BlockToss.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/BlockToss.java @@ -2,6 +2,7 @@ package mineplex.minecraft.game.classcombat.Skill.Brute; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import org.bukkit.Bukkit; import org.bukkit.Effect; @@ -25,6 +26,7 @@ import mineplex.core.recharge.Recharge; import mineplex.core.updater.event.UpdateEvent; import mineplex.core.updater.UpdateType; import mineplex.core.common.util.UtilAction; +import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilGear; import mineplex.core.common.util.UtilServer; @@ -55,9 +57,6 @@ public class BlockToss extends SkillCharge implements IThrown "dealing up to #6#1 damage.", "", GetChargeString(), - "", - "You can only pick up Stone, Dirt,", - "Cobblestone, Sand, Gravel or Snow." }); } @@ -98,24 +97,13 @@ public class BlockToss extends SkillCharge implements IThrown UtilPlayer.message(player, F.main("Skill", "You cannot use " + F.skill(GetName()) + " in water.")); return; } - + + Block grab = event.getClickedBlock(); + //Recharge if (!Recharge.Instance.use(player, GetName(), 1000, false, false)) return; - - Block grab = event.getClickedBlock(); - - int id = event.getClickedBlock().getTypeId(); - - if ( - id != 1 && - id != 2 && - id != 3 && - id != 12 && - id != 13 && - id != 80) - return; - + //Door if (grab.getRelative(BlockFace.UP).getTypeId() == 64 || grab.getRelative(BlockFace.UP).getTypeId() == 71) { @@ -143,7 +131,6 @@ public class BlockToss extends SkillCharge implements IThrown //Block to Item FallingBlock block = player.getWorld().spawnFallingBlock(player.getEyeLocation(), event.getClickedBlock().getType(), (byte)0); - Factory.BlockRestore().Add(event.getClickedBlock(), 0, (byte)0, 10000); //Action player.eject(); @@ -211,7 +198,7 @@ public class BlockToss extends SkillCharge implements IThrown //Action UtilAction.velocity(block, cur.getLocation().getDirection(), mult, false, 0, 0, 1, true); Factory.Projectile().AddThrow(block, cur, this, -1, true, true, true, - null, 0, 0, null, 0, UpdateType.FASTEST, 2.5d); + null, 0, 0, null, 0, UpdateType.FASTEST, 1.2f); //Event UtilServer.getServer().getPluginManager().callEvent(new SkillEvent(cur, GetName(), ClassType.Brute)); @@ -240,7 +227,7 @@ public class BlockToss extends SkillCharge implements IThrown //Damage Event Factory.Damage().NewDamageEvent(target, data.GetThrower(), null, - DamageCause.CUSTOM, data.GetThrown().getVelocity().length() * (2.5 + 0.5 * level), true, true, false, + DamageCause.CUSTOM, data.GetThrown().getVelocity().length() * (3 + 0.6 * level), true, true, false, UtilEnt.getName(data.GetThrower()), GetName()); //Block to Item @@ -278,34 +265,26 @@ public class BlockToss extends SkillCharge implements IThrown if (event.getType() != UpdateType.TICK) return; - HashSet fallen = new HashSet(); - - for (FallingBlock cur : _falling.keySet()) + Iterator fallIter = _falling.keySet().iterator(); + + while (fallIter.hasNext()) { - if (cur.isDead() || !cur.isValid()) - fallen.add(cur); - } - - for (FallingBlock cur : fallen) - { - _falling.remove(cur); - Block block = cur.getLocation().getBlock(); + FallingBlock fall = fallIter.next(); - int id = block.getTypeId(); - if ( - id != 1 && - id != 2 && - id != 3 && - id != 4 && - id != 12 && - id != 13 && - id != 80) + if (!fall.isDead() && fall.isValid()) continue; - + + fallIter.remove(); + + Block block = fall.getLocation().getBlock(); + + if (block.getType() != fall.getMaterial()) + continue; + block.setTypeIdAndData(0, (byte)0, false); //Block Replace - Factory.BlockRestore().Add(block, cur.getBlockId(), (byte)0, 10000); + Factory.BlockRestore().Add(block, fall.getBlockId(), (byte)0, 10000); //Effect block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getTypeId()); diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Bloodlust.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Bloodlust.java index f857bad86..1101d4d65 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Bloodlust.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Bloodlust.java @@ -8,6 +8,8 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; +import com.mysql.jdbc.Util; + import mineplex.minecraft.game.classcombat.Class.IPvpClass.ClassType; import mineplex.core.common.util.F; import mineplex.core.updater.event.UpdateEvent; @@ -32,9 +34,9 @@ public class Bloodlust extends Skill SetDesc(new String[] { - "When an enemy dies within #8#2 blocks,", - "you go into a Bloodlust, receiving", - "Speed 1 and Strength 1 for #4#2 seconds.", + "When you kill an enemy, you go into", + "a Bloodlust, receiving Speed 1 and", + "Strength 1 for #4#2 seconds.", "You also heal #0#1 health.", "", "Bloodlust can stack up to 3 times,", @@ -47,50 +49,53 @@ public class Bloodlust extends Skill { if (!(event.GetEvent().getEntity() instanceof Player)) return; + + if (event.GetLog().GetKiller() == null || !event.GetLog().GetKiller().IsPlayer()) + return; - for (Player cur : UtilServer.getPlayers()) - { - if (Expire(cur)) - continue; + Player player = UtilPlayer.searchExact(event.GetLog().GetKiller().GetName()); + if (player == null) + return; - if (!Factory.Relation().canHurt(cur, (Player)event.GetEvent().getEntity())) - continue; - - if (cur.equals(event.GetEvent().getEntity())) - continue; + if (!Factory.Relation().canHurt(player, (Player)event.GetEvent().getEntity())) + return; - //Level - int level = getLevel(cur); - if (level == 0) continue; + if (player.equals(event.GetEvent().getEntity())) + return; - //Offset - double distance = 4 + (4 * level); - if (UtilMath.offset(event.GetEvent().getEntity().getLocation(), cur.getLocation()) > distance) - continue; + //Level + int level = getLevel(player); + if (level == 0) + return; + + //Offset + double distance = 4 + (4 * level); + if (UtilMath.offset(event.GetEvent().getEntity().getLocation(), player.getLocation()) > distance) + return; - //Strength - int str = 0; - if (_str.containsKey(cur)) - str = _str.get(cur) + 1; - str = Math.min(str, 3); - _str.put(cur, str); + //Strength + int str = 0; + if (_str.containsKey(player)) + str = _str.get(player) + 1; + str = Math.min(str, 2); + _str.put(player, str); - //Time - double dur = 4 + (2 * level); - _time.put(cur, (System.currentTimeMillis() + (long)(dur*1000))); + //Time + double dur = 4 + (2 * level); + _time.put(player, (System.currentTimeMillis() + (long)(dur*1000))); - //Condition - Factory.Condition().Factory().Speed(GetName(), cur, event.GetEvent().getEntity(), dur, str, false, true, true); - Factory.Condition().Factory().Strength(GetName(), cur, event.GetEvent().getEntity(), dur, 0, false, true, true); + //Condition + Factory.Condition().Factory().Speed(GetName(), player, event.GetEvent().getEntity(), dur, str, false, true, true); + Factory.Condition().Factory().Strength(GetName(), player, event.GetEvent().getEntity(), dur, 0, false, true, true); - UtilPlayer.health(cur, level); - - //Inform - UtilPlayer.message(cur, F.main(GetClassType().name(), "You entered " + F.skill(GetName(level)) + " at " + F.elem("Level " + (str+1)) + ".")); + UtilPlayer.health(player, level); + + //Inform + UtilPlayer.message(player, F.main(GetClassType().name(), "You entered " + F.skill(GetName(level)) + " at " + F.elem("Level " + (str+1)) + ".")); + + //Effect + player.getWorld().playSound(player.getLocation(), Sound.ZOMBIE_PIG_ANGRY, 2f, 0.6f); - //Effect - cur.getWorld().playSound(cur.getLocation(), Sound.ZOMBIE_PIG_ANGRY, 2f, 0.6f); - } } @EventHandler @@ -120,13 +125,13 @@ public class Bloodlust extends Skill return false; } - + @EventHandler public void Particle(UpdateEvent event) { if (event.getType() != UpdateType.TICK) return; - + for (Entity ent : _str.keySet()) { UtilParticle.PlayParticle(ParticleType.RED_DUST, ent.getLocation(), diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Colossus.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Colossus.java index e19886d4a..4b210921e 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Colossus.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Colossus.java @@ -17,8 +17,8 @@ public class Colossus extends Skill SetDesc(new String[] { - "You are so huge that you do not", - "take any knockback from attacks." + "You are so huge that you take", + "#15#20 % less knockback from attacks." }); } @@ -36,7 +36,7 @@ public class Colossus extends Skill //Damage event.AddMod(damagee.getName(), GetName(), 0, false); - event.SetKnockback(false); + event.AddKnockback(GetName(), 0.85 - 0.20*level); } @Override diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/CripplingBlow.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/CripplingBlow.java index 9d85fd230..252d4cd22 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/CripplingBlow.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/CripplingBlow.java @@ -23,7 +23,7 @@ public class CripplingBlow extends Skill SetDesc(new String[] { "Your powerful axe attacks give", - "targets Slow 1 for 1.5 second,", + "targets Slow 2 for 1.5 second,", "as well as no knockback." }); } @@ -53,7 +53,7 @@ public class CripplingBlow extends Skill if (level == 0) return; //Stun - Factory.Condition().Factory().Slow(GetName(), damagee, damager, 0.5 + 0.5 * 1, 0, false, true, false, true); + Factory.Condition().Factory().Slow(GetName(), damagee, damager, 0.5 + 0.5 * 1, 1, false, true, false, true); //Damage event.AddMod(damager.getName(), GetName(), 0, true); diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/DwarfToss.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/DwarfToss.java index 7eaf5165a..26e292bd3 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/DwarfToss.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/DwarfToss.java @@ -2,6 +2,7 @@ package mineplex.minecraft.game.classcombat.Skill.Brute; import java.util.HashSet; +import org.bukkit.Bukkit; import org.bukkit.EntityEffect; import org.bukkit.GameMode; import org.bukkit.Material; @@ -36,6 +37,8 @@ public class DwarfToss extends SkillActive private HashSet _used = new HashSet(); private NautHashMap _holding = new NautHashMap(); private NautHashMap _time = new NautHashMap(); + + private long _chargeTime = 2500; public DwarfToss(SkillFactory skills, String name, ClassType classType, SkillType skillType, int cost, int levels, @@ -57,7 +60,9 @@ public class DwarfToss extends SkillActive "Release Block to throw with #1.2#0.2 velocity.", "", "Players you are holding cannot harm", - "you, or be harmed by others." + "you, or be harmed by others.", + "", + "Takes 2.5 seconds to fully charge." }); } @@ -150,7 +155,7 @@ public class DwarfToss extends SkillActive if (target instanceof Player) { - if (((Player)target).getGameMode() != GameMode.SURVIVAL) + if (UtilPlayer.isSpectator(target)) { UtilPlayer.message(player, F.main(GetClassType().name(), F.name(((Player)target).getName()) + " is not attackable.")); return; @@ -298,28 +303,44 @@ public class DwarfToss extends SkillActive UtilPlayer.message(cur, F.main(GetClassType().name(), F.name(UtilEnt.getName(target)) + " escaped your " + F.skill(GetName(level)) + ".")); } - for (Player cur : throwSet) + for (final Player cur : throwSet) { - LivingEntity target = _holding.remove(cur); - _time.remove(cur); + final LivingEntity target = _holding.remove(cur); + long time = _time.remove(cur); int level = getLevel(cur); + //Time Reduce + double timeScale = 1; + if (time < _chargeTime) + { + timeScale = Math.max(0.25, ((double)time/(double)_chargeTime)); + } + //Throw cur.eject(); target.leaveVehicle(); - double mult = 1.2 + (0.2 * level); - - UtilAction.velocity(target, cur.getLocation().getDirection(), mult, false, 0, 0.2, 1.2, true); + final double mult = (1.2 + (0.2 * level)) * timeScale; - //Condition - Factory.Condition().Factory().Falling(GetName(), target, cur, 10, false, true); + //Delay + Bukkit.getScheduler().scheduleSyncDelayedTask(Factory.getPlugin(), new Runnable() + { + @Override + public void run() + { + UtilAction.velocity(target, cur.getLocation().getDirection(), mult, false, 0, 0.2, 1.2, true); + + //Condition + Factory.Condition().Factory().Falling(GetName(), target, cur, 10, false, true); + + //Effect + target.playEffect(EntityEffect.HURT); + } + + }, 4); //Inform UtilPlayer.message(cur, F.main(GetClassType().name(), "You threw " + F.name(UtilEnt.getName(target)) + " with " + F.skill(GetName(level)) + ".")); UtilPlayer.message(target, F.main(GetClassType().name(), F.name(cur.getName()) + " threw you with " + F.skill(GetName(level)) + ".")); - - //Effect - target.playEffect(EntityEffect.HURT); } } diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/FleshHook.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/FleshHook.java index 865b16460..2d10d7972 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/FleshHook.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/FleshHook.java @@ -108,7 +108,7 @@ public class FleshHook extends SkillActiveCharge implements IThrown 1 + charge , false, 0, 0.2, 20, false); Factory.Projectile().AddThrow(item, cur, this, -1, true, true, true, - Sound.FIRE_IGNITE, 1.4f, 0.8f, ParticleType.CRIT, UpdateType.TICK, 1.5d); + Sound.FIRE_IGNITE, 1.4f, 0.8f, ParticleType.CRIT, UpdateType.TICK, 0.6f); //Inform UtilPlayer.message(cur, F.main(GetClassType().name(), "You used " + F.skill(GetName(level)) + ".")); diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Overwhelm.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Overwhelm.java index dd16ffaca..50001ce48 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Overwhelm.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Overwhelm.java @@ -23,7 +23,7 @@ public class Overwhelm extends Skill "than your target, you deal 0.25", "bonus damage", "", - "Maximum of #0#1 bonus damage." + "Maximum of #0.5#0.5 bonus damage." }); } @@ -52,7 +52,7 @@ public class Overwhelm extends Skill int level = getLevel(damager); if (level == 0) return; - diff = Math.min(diff, level); + diff = Math.min(diff, 0.5 + 0.5 * level); //Damage event.AddMod(damager.getName(), GetName(), diff, true); diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Takedown.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Takedown.java index ec8ff837f..7c02a07ed 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Takedown.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Takedown.java @@ -116,7 +116,7 @@ public class Takedown extends SkillActive for (Player player : GetUsers()) if (_live.containsKey(player)) for (Player other : player.getWorld().getPlayers()) - if (other.getGameMode() == GameMode.SURVIVAL) + if (!UtilPlayer.isSpectator(other)) if (!other.equals(player)) if (Factory.Relation().canHurt(player, other)) if (UtilMath.offset(player, other) < 2) diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Taunt.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Taunt.java index 86c033eef..982616076 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Taunt.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/Taunt.java @@ -103,7 +103,7 @@ public class Taunt extends SkillActive for (Player player : GetUsers()) if (_live.containsKey(player)) for (Player other : player.getWorld().getPlayers()) - if (other.getGameMode() == GameMode.SURVIVAL) + if (!UtilPlayer.isSpectator(other)) if (!other.equals(player)) if (Factory.Relation().canHurt(player, other)) if (UtilMath.offset(player, other) < 7 && UtilMath.offset(player, other) > 2) diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/WhirlwindAxe.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/WhirlwindAxe.java index 8c93a2b43..ec172fd73 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/WhirlwindAxe.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Brute/WhirlwindAxe.java @@ -42,9 +42,8 @@ public class WhirlwindAxe extends SkillActive SetDesc(new String[] { "Whirl your axes around rapidly dealing", - "#4#1 damage to nearby enemies, and", - "pulling enemies within #5#1 blocks", - "towards you.", + "up to #3#1 damage to enemies within", + "#4#1 blocks, pulling them towards you.", }); this.setAchievementSkill(true); @@ -66,17 +65,21 @@ public class WhirlwindAxe extends SkillActive public void Skill(final Player player, int level) { //Pull + Damage - HashMap targets = UtilEnt.getInRadius(player.getLocation(), 5d + 1 * level); + HashMap targets = UtilEnt.getInRadius(player.getLocation(), 4d + 1 * level); for (LivingEntity cur : targets.keySet()) { if (cur.equals(player)) continue; + if (cur instanceof Player) + if (!Factory.Relation().canHurt((Player)cur, player)) + continue; + //Damage Event if (UtilMath.offset(cur, player) < 4) { Factory.Damage().NewDamageEvent(cur, player, null, - DamageCause.CUSTOM, 4 + level, false, true, false, + DamageCause.CUSTOM, 2 + (1 + level) * targets.get(cur), false, true, false, player.getName(), GetName()); } diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/AxeThrow.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/AxeThrow.java index daf1b4245..d521f4987 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/AxeThrow.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/AxeThrow.java @@ -27,6 +27,7 @@ import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; import mineplex.core.projectile.IThrown; import mineplex.core.projectile.ProjectileUser; +import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.minecraft.game.classcombat.Skill.SkillActive; @@ -53,13 +54,13 @@ public class AxeThrow extends SkillActive implements IThrown SetDesc(new String[] { "Throw your axe with #0.7#0.1 velocity, ", - "dealing #6.5#0.5 damage.", + "dealing #5.5#0.5 damage.", "", "You pull your axe back to you when it", "collides with anything.", "", "Your axe is returned to you if you do", - "not pick it up within #20#-2 seconds." + "not pick it up within #15#-1 seconds." }); setAchievementSkill(true); @@ -90,7 +91,7 @@ public class AxeThrow extends SkillActive implements IThrown player.setItemInHand(null); //Projectile - Factory.Projectile().AddThrow(item, player, this, -1, true, true, true, false, 2.5d); + Factory.Projectile().AddThrow(item, player, this, -1, true, true, true, false, 0.4f); //Store _thrown.put(item, player); @@ -111,7 +112,7 @@ public class AxeThrow extends SkillActive implements IThrown if (level <= 0) return; - double damage = 6.5 + 0.5 * level; + double damage = 5.5 + 0.5 * level; //Damage Event Factory.Damage().NewDamageEvent(target, data.GetThrower(), null, @@ -186,7 +187,7 @@ public class AxeThrow extends SkillActive implements IThrown int level = getLevel(player); - if (item.getTicksLived() > 400 - level * 40) + if (item.getTicksLived() > 300 - level * 20) { _thrown.get(item).getInventory().addItem(item.getItemStack()); item.remove(); @@ -212,7 +213,7 @@ public class AxeThrow extends SkillActive implements IThrown } } } - + @Override public void Reset(Player player) { diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/Cleave.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/Cleave.java index dceb3c54a..16ca24d2d 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/Cleave.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/Cleave.java @@ -21,8 +21,8 @@ public class Cleave extends Skill SetDesc(new String[] { - "Your attacks deal #40#20 % damage to", - "all enemies within #1.5#0.5 Blocks", + "Your attacks deal #25#25 % damage to", + "all enemies within 3 Blocks", "of your target enemy.", "", "This only works with Axes." @@ -59,7 +59,7 @@ public class Cleave extends Skill event.AddMod(damager.getName(), GetName(), 0, false); //Splash - for (Player other : UtilPlayer.getNearby(damagee.getLocation(), 1.5 + (0.5 * level))) + for (Player other : UtilPlayer.getNearby(damagee.getLocation(), 3)) { if (!other.equals(damagee) && !other.equals(damager)) if (Factory.Relation().canHurt(damager, other)) diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/DefensiveStance.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/DefensiveStance.java index 24819aabb..d77e626db 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/DefensiveStance.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/DefensiveStance.java @@ -15,6 +15,7 @@ import org.bukkit.util.Vector; import mineplex.minecraft.game.classcombat.Class.IPvpClass.ClassType; import mineplex.minecraft.game.core.damage.CustomDamageEvent; import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilTime; import mineplex.minecraft.game.classcombat.Skill.SkillActive; import mineplex.minecraft.game.classcombat.Skill.SkillFactory; @@ -39,7 +40,7 @@ public class DefensiveStance extends SkillActive SetDesc(new String[] { - "While Blocking, you are immune to all", + "While Blocking, you take 75% less", "damage from attacks infront of you." }); } @@ -85,6 +86,9 @@ public class DefensiveStance extends SkillActive if (event.GetCause() != DamageCause.ENTITY_ATTACK && event.GetCause() != DamageCause.PROJECTILE) return; + + if (UtilEnt.inWater(event.GetDamageeEntity())) + return; Player damagee = event.GetDamageePlayer(); if (damagee == null) return; @@ -112,7 +116,7 @@ public class DefensiveStance extends SkillActive } //Damage - event.SetCancelled(GetName() + " Defense"); + event.AddMult(GetName(), GetName(), 0.25, false); //Effect damagee.getWorld().playSound(damagee.getLocation(), Sound.ZOMBIE_METAL, 1f, 2f); diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/Deflection.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/Deflection.java index 75bae265b..32b148220 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/Deflection.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/Deflection.java @@ -29,7 +29,7 @@ public class Deflection extends Skill { "Prepare to deflect incoming attacks.", "You gain 1 Charge every #5#-1 seconds.", - "You can store a maximum of #2#1 Charges.", + "You can store a maximum of #1#1 Charges.", "", "When you are attacked, the damage is", "reduced by the number of your Charges,", @@ -73,7 +73,7 @@ public class Deflection extends Skill if (!Recharge.Instance.use(cur, GetName(), 5000 - (1000 * level), false, false)) continue; - int max = 2 + (1 * level); + int max = 1 + (1 * level); int charge = 1; if (_charges.containsKey(cur)) diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/HiltSmash.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/HiltSmash.java index 6979bbcff..9e743cea2 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/HiltSmash.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Knight/HiltSmash.java @@ -17,6 +17,7 @@ import mineplex.minecraft.game.core.damage.CustomDamageEvent; import mineplex.core.common.util.F; import mineplex.core.updater.event.UpdateEvent; import mineplex.core.updater.UpdateType; +import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; @@ -46,13 +47,19 @@ public class HiltSmash extends SkillActive { "Smash the hilt of your sword into", "your opponent, dealing #2#1 damage", - "and Slow 4 for #0.5#0.5 seconds." + "and Slow 3 for #0.5#0.5 seconds." }); } @Override public boolean CustomCheck(Player player, int level) { + if (UtilEnt.inWater(player)) + { + UtilPlayer.message(player, F.main("Skill", "You cannot use " + F.skill(GetName()) + " in water.")); + return false; + } + if (_used.contains(player)) return false; @@ -111,6 +118,9 @@ public class HiltSmash extends SkillActive { if (event.isCancelled()) return; + + if (UtilEnt.inWater(event.getPlayer())) + return; Player player = event.getPlayer(); @@ -123,12 +133,15 @@ public class HiltSmash extends SkillActive Entity ent = event.getRightClicked(); + if (UtilPlayer.isSpectator(ent)) + return; + if (ent == null) return; if (!(ent instanceof LivingEntity)) return; - + if (UtilMath.offset(player, ent) > 4) { UtilPlayer.message(player, F.main(GetClassType().name(), "You missed " + F.skill(GetName()) + ".")); @@ -169,7 +182,7 @@ public class HiltSmash extends SkillActive return; //Condition - Factory.Condition().Factory().Slow(GetName(), damagee, damager, 0.5 + 0.5 * level, 4, false, true, true, true); + Factory.Condition().Factory().Slow(GetName(), damagee, damager, 0.5 + 0.5 * level, 2, false, true, true, true); //Effect damagee.getWorld().playSound(damagee.getLocation(), Sound.ZOMBIE_WOOD, 1f, 1.2f); diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/ArcticArmor.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/ArcticArmor.java index 07e9cbe6c..954680e46 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/ArcticArmor.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/ArcticArmor.java @@ -45,7 +45,7 @@ public class ArcticArmor extends Skill "", "Create a freezing area around you", "in a #3#1 Block radius. Allies inside", - "this area receive Protection 2.", + "this area receive Protection 1.", "", "You are permanently immune to the", "Slowing effect of snow." @@ -176,7 +176,7 @@ public class ArcticArmor extends Skill //Protection for (Player other : UtilPlayer.getNearby(cur.getLocation(), 3 + getLevel(cur))) if (!Factory.Relation().canHurt(cur, other) || other.equals(cur)) - Factory.Condition().Factory().Protection(GetName(), other, cur, 1.9, 1, false, true, true); + Factory.Condition().Factory().Protection(GetName(), other, cur, 1.9, 0, false, true, true); } } @@ -188,7 +188,7 @@ public class ArcticArmor extends Skill for (Player cur : UtilServer.getPlayers()) { - if (cur.getGameMode() != GameMode.SURVIVAL) + if (UtilPlayer.isSpectator(cur)) continue; if (cur.getEyeLocation().getBlock().getType() == Material.ICE) diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/Blizzard.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/Blizzard.java index 83782befe..5616119ee 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/Blizzard.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/Blizzard.java @@ -66,7 +66,7 @@ public class Blizzard extends SkillActive @Override public String GetEnergyString() { - return "Energy: #32#-2 per Second"; + return "Energy: #34#-2 per Second"; } @Override @@ -113,7 +113,7 @@ public class Blizzard extends SkillActive } //Energy - if (!Factory.Energy().Use(cur, GetName(), 1.6 - (0.1 * level), true, true)) + if (!Factory.Energy().Use(cur, GetName(), 1.7 - (0.1 * level), true, true)) { _active.remove(cur); continue; @@ -234,7 +234,7 @@ public class Blizzard extends SkillActive { Entry entry = snowBallIterator.next(); - if (!entry.getValue().isOnline()) + if (!entry.getKey().isValid() || entry.getKey().getTicksLived() > 60 || !entry.getValue().isOnline()) snowBallIterator.remove(); } } diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/FreezingBlast.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/FreezingBlast.java index 906ccf605..5a60452db 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/FreezingBlast.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/FreezingBlast.java @@ -70,7 +70,7 @@ public class FreezingBlast extends SkillActive implements IThrown Item item = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()), ItemStackFactory.Instance.CreateStack(79)); item.setVelocity(player.getLocation().getDirection()); Factory.Projectile().AddThrow(item, player, this, -1, true, true, true, - Sound.FIZZ, 0.6f, 1.6f, null, 0, UpdateType.FASTEST, 2d); + Sound.FIZZ, 0.6f, 1.6f, null, 0, UpdateType.FASTEST, 1f); //Inform UtilPlayer.message(player, F.main(GetClassType().name(), "You used " + F.skill(GetName(level)) + ".")); diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/GlacialBlade.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/GlacialBlade.java index 1e1e22255..aa7e359f0 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/GlacialBlade.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/GlacialBlade.java @@ -7,8 +7,10 @@ import org.bukkit.block.Block; import org.bukkit.entity.Item; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; import org.bukkit.event.block.Action; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; import mineplex.minecraft.game.classcombat.Class.IPvpClass.ClassType; import mineplex.core.itemstack.ItemStackFactory; @@ -42,7 +44,7 @@ public class GlacialBlade extends SkillActive implements IThrown SetDesc(new String[] { "Swinging your sword releases a", - "shard of ice, dealing 4 damage", + "shard of ice, dealing 3.5 damage", "to anything it hits.", "", "Will not work if enemies are close." @@ -71,7 +73,7 @@ public class GlacialBlade extends SkillActive implements IThrown Item item = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()).subtract(0, 0.2, 0), ItemStackFactory.Instance.CreateStack(370)); UtilAction.velocity(item, player.getLocation().getDirection(), 1.6, false, 0, 0.2, 10, false); Factory.Projectile().AddThrow(item, player, this, -1, true, true, true, - null, 0, 0, ParticleType.SNOW_SHOVEL, UpdateType.TICK, 1.5d); + null, 0, 0, ParticleType.SNOW_SHOVEL, UpdateType.TICK, 0.3f); //Effect item.getWorld().playSound(item.getLocation(), Sound.ORB_PICKUP, 1f, 2f); @@ -91,7 +93,7 @@ public class GlacialBlade extends SkillActive implements IThrown //Damage Factory.Damage().NewDamageEvent(target, data.GetThrower(), null, - DamageCause.CUSTOM, 4, false, true, false, + DamageCause.CUSTOM, 3.5, false, true, false, UtilEnt.getName(data.GetThrower()), GetName()); } diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/IcePrison.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/IcePrison.java index 592c595f8..339669ce4 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/IcePrison.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/IcePrison.java @@ -48,7 +48,7 @@ public class IcePrison extends SkillActive implements IThrown { "Launch an icy orb. When it collides,", "it creates a hollow sphere of ice", - "thats lasts for #2#1.5 seconds.", + "thats lasts for #2#1 seconds.", }); } @@ -70,11 +70,11 @@ public class IcePrison extends SkillActive implements IThrown //Action Item item = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()), ItemStackFactory.Instance.CreateStack(79)); item.setVelocity(player.getLocation().getDirection()); - Factory.Projectile().AddThrow(item, player, this, System.currentTimeMillis() + 2000, true, false, false, - Sound.FIZZ, 0.6f, 1.6f, ParticleType.SNOW_SHOVEL, UpdateType.TICK, 2d); - + Factory.Projectile().AddThrow(item, player, this, -1, true, true, true, + Sound.FIZZ, 0.6f, 1.6f, ParticleType.SNOW_SHOVEL, UpdateType.TICK, 1.5f); + //Inform - UtilPlayer.message(player, F.main(GetClassType().name(), "You used " + F.skill(GetName(level)) + ".")); + UtilPlayer.message(player, F.main(GetClassType().name(), "You used " + F.skill(GetName(level)) + ".")); //Effect item.getWorld().playSound(item.getLocation(), Sound.SILVERFISH_HIT, 2f, 1f); @@ -148,7 +148,7 @@ public class IcePrison extends SkillActive implements IThrown if (!UtilBlock.airFoliage(freeze)) return; - long time = 4000 + (1500 * level); + long time = 2500 + (1000 * level); int yDiff = freeze.getY() - mid.getY(); diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/Inferno.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/Inferno.java index 1fb9140b6..cced308da 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/Inferno.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/Inferno.java @@ -53,7 +53,7 @@ public class Inferno extends SkillActive @Override public String GetEnergyString() { - return "Energy: #30#-2 per Second"; + return "Energy: #34#-2 per Second"; } @Override @@ -100,7 +100,7 @@ public class Inferno extends SkillActive } //Energy - if (!Factory.Energy().Use(cur, GetName(), 1.5 - (0.1 * level), true, false)) + if (!Factory.Energy().Use(cur, GetName(), 1.7 - (0.1 * level), true, false)) { _active.remove(cur); continue; diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/LifeBondsData.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/LifeBondsData.java index 62b15b37b..a2a54c0fa 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/LifeBondsData.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/LifeBondsData.java @@ -33,8 +33,7 @@ public class LifeBondsData return true; } - - _loc.add(UtilAlg.getTrajectory(_loc, _target.getLocation().add(0, 0.8, 0)).multiply(0.5)); + _loc.add(UtilAlg.getTrajectory(_loc, _target.getLocation().add(0, 0.8, 0)).multiply(0.9)); UtilParticle.PlayParticle(ParticleType.HEART, _loc, 0, 0, 0, 0, 1); return false; diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/LightningOrb.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/LightningOrb.java index c7119f0b1..692be267a 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/LightningOrb.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/LightningOrb.java @@ -78,8 +78,8 @@ public class LightningOrb extends SkillActive implements IThrown "Launch a lightning orb. Upon a direct", "hit with player, or #5#-0.4 seconds, it will", "strike all enemies within #3#0.5 Blocks ", - "with lightning, giving them Slow 3", - "for #2#1 seconds." + "with lightning, giving them Slow 2", + "for 4 seconds." }); } @@ -102,7 +102,7 @@ public class LightningOrb extends SkillActive implements IThrown Item item = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()), ItemStackFactory.Instance.CreateStack(57)); item.setVelocity(player.getLocation().getDirection()); Factory.Projectile().AddThrow(item, player, this, System.currentTimeMillis() + 5000 - (400 * level), true, false, false, - Sound.FIZZ, 0.6f, 1.6f, ParticleType.FIREWORKS_SPARK, UpdateType.TICK, 1.5d); + Sound.FIZZ, 0.6f, 1.6f, ParticleType.FIREWORKS_SPARK, UpdateType.TICK, 0.6f); //Inform UtilPlayer.message(player, F.main(GetClassType().name(), "You used " + F.skill(GetName(level)) + ".")); @@ -179,7 +179,7 @@ public class LightningOrb extends SkillActive implements IThrown if (cur.equals(player)) continue; - Factory.Condition().Factory().Slow(GetName(), cur, player, 2 + (1 * level), 2, false, true, true, true); + Factory.Condition().Factory().Slow(GetName(), cur, player, 4, 1, false, true, true, true); } Bukkit.getPluginManager().callEvent(new LightningOrbEvent(player, struck)); diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/StaticLazer.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/StaticLazer.java index 10e364d40..7c343e2d6 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/StaticLazer.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/StaticLazer.java @@ -33,7 +33,7 @@ public class StaticLazer extends SkillChargeSword int cost, int maxLevel) { super(skills, name, classType, skillType, cost, maxLevel, - 0.012f, 0.008f, + 0.012f, 0.004f, 12000, -1000, true, true, false, true); @@ -45,11 +45,12 @@ public class StaticLazer extends SkillChargeSword GetChargeString(), "Taking damage cancels charge.", "", - "Deals up to #7#1 damage and travels", - "up to #20#10 blocks.", + "Deals #6#1 damage and travels up to", + "#20#10 blocks.", }); - _fireOnFull = true; + _fireOnFull = false; + _energyPerCharge = 1.2f; setAchievementSkill(true); } @@ -58,6 +59,12 @@ public class StaticLazer extends SkillChargeSword { return "Recharge: " + "#12#-1 Seconds"; } + + @Override + public String GetEnergyString() + { + return "Energy: " + "24 per Second"; + } @Override public void DoSkillCustom(Player player, float charge) @@ -105,7 +112,7 @@ public class StaticLazer extends SkillChargeSword //Damage Event Factory.Damage().NewDamageEvent(other, player, null, - DamageCause.CUSTOM, (2 + (5 + level) * hit.get(other)) * charge, true, true, false, + DamageCause.CUSTOM, 6 + level * charge, true, true, false, player.getName(), GetName()); } diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/Void.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/Void.java index 149ae1336..950ce0293 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/Void.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Mage/Void.java @@ -33,7 +33,7 @@ public class Void extends Skill "Drop Axe/Sword to Toggle.", "", "While in void form, you receive", - "Slow 2, take no knockback and", + "Slow 3, take no knockback and", "use no energy to swing weapons.", "", "Reduces incoming damage by #1#1 , but", @@ -144,8 +144,8 @@ public class Void extends Skill continue; //Condition - Factory.Condition().Factory().Invisible(GetName(), cur, cur, 1.9, 0, false, true, true); - Factory.Condition().Factory().Slow(GetName(), cur, cur, 1.9, 1, false, true, false, true); + Factory.Condition().Factory().Invisible(GetName(), cur, cur, 1.9, 1, false, true, true); + Factory.Condition().Factory().Slow(GetName(), cur, cur, 1.9, 2, false, true, false, true); } } diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Agility.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Agility.java index fb2a899f3..aff5b5bc0 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Agility.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Agility.java @@ -45,7 +45,7 @@ public class Agility extends SkillActive SetDesc(new String[] { "Sprint with great agility, gaining", - "Speed I for #3#1 seconds. You take", + "Speed 2 for #3#1 seconds. You take", "#45#5 % less damage and take no knockback.", "", "Agility ends if you Left-Click." @@ -68,7 +68,7 @@ public class Agility extends SkillActive public void Skill(Player player, int level) { //Action - Factory.Condition().Factory().Speed(GetName(), player, player, 3 + level, 0, false, true, true); + Factory.Condition().Factory().Speed(GetName(), player, player, 3 + level, 1, false, true, true); _active.add(player); //Inform diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Disengage.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Disengage.java index 231db08bb..a5e872bcb 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Disengage.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Disengage.java @@ -21,6 +21,7 @@ import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilTime; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.minecraft.game.classcombat.Skill.SkillActive; import mineplex.minecraft.game.classcombat.Skill.SkillFactory; @@ -28,7 +29,8 @@ import mineplex.minecraft.game.classcombat.Skill.SkillFactory; public class Disengage extends SkillActive { private HashMap _prepare = new HashMap(); - + private HashMap _fall = new HashMap(); + public Disengage(SkillFactory skills, String name, ClassType classType, SkillType skillType, int cost, int levels, int energy, int energyMod, @@ -118,8 +120,10 @@ public class Disengage extends SkillActive //Condition Factory.Condition().Factory().Slow(GetName(), damager, damagee, 2.5 + (0.5 * level), 3, false, true, true, true); - Factory.Condition().Factory().Invulnerable(GetName(), damagee, damagee, 2, false, false); + Factory.Condition().Factory().Invulnerable(GetName(), damagee, damagee, 1, false, false); + _fall.put(damagee, System.currentTimeMillis()); + //Effect damagee.getWorld().playSound(damager.getLocation(), Sound.ZOMBIE_METAL, 0.5f, 1.6f); UtilParticle.PlayParticle(ParticleType.ANGRY_VILLAGER, damager.getEyeLocation(), 0, 0, 0, 0, 1); @@ -135,26 +139,53 @@ public class Disengage extends SkillActive { if (event.getType() != UpdateType.TICK) return; - + for (Player cur : GetUsers()) { - if (!_prepare.containsKey(cur)) - continue; - - if (System.currentTimeMillis() > _prepare.get(cur)) + if (_fall.containsKey(cur)) { - //Remove - _prepare.remove(cur); - - //Inform - UtilPlayer.message(cur, F.main(GetClassType().name(), "You failed to " + F.skill(GetName()) + ".")); + if (UtilTime.elapsed(_fall.get(cur), 2000)) + { + if (UtilEnt.isGrounded(cur) || UtilTime.elapsed(_fall.get(cur), 20000)) + { + _fall.remove(cur); + } + } } + + if (_prepare.containsKey(cur)) + { + if (System.currentTimeMillis() > _prepare.get(cur)) + { + //Remove + _prepare.remove(cur); + + //Inform + UtilPlayer.message(cur, F.main(GetClassType().name(), "You failed to " + F.skill(GetName()) + ".")); + } + } + } + } + + @EventHandler(priority = EventPriority.LOW) + public void fallCancel(CustomDamageEvent event) + { + if (event.IsCancelled()) + return; + + if (event.GetCause() != DamageCause.FALL) + return; + + if (_fall.remove(event.GetDamageeEntity()) != null) + { + event.SetCancelled(GetName() + " Fall"); } } @Override public void Reset(Player player) { + _fall.remove(player); _prepare.remove(player); } } diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/HealingShot.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/HealingShot.java index c29eb1021..571880344 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/HealingShot.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/HealingShot.java @@ -55,7 +55,7 @@ public class HealingShot extends SkillActive { "Prepare a healing shot;", "Your next arrow will give its target", - "Regeneration 1 for #2#2 seconds,", + "Regeneration 2 for #5#1 seconds,", "and remove all negative effects." }); } @@ -148,7 +148,7 @@ public class HealingShot extends SkillActive projectile.remove(); //Regen - Factory.Condition().Factory().Regen(GetName(), damagee, damager, 2 + 2 * level, 0, false, true, true); + Factory.Condition().Factory().Regen(GetName(), damagee, damager, 3 + 2 * level, 1, false, true, true); //Remove Bad damagee.setFireTicks(0); diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/HeavyArrows.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/HeavyArrows.java index 6f1a142cd..9848193ed 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/HeavyArrows.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/HeavyArrows.java @@ -39,7 +39,7 @@ public class HeavyArrows extends Skill "as well as #1#1 additional damage.", "", "You also receive #10#10 % knockback", - "when firing arrows.", + "when firing arrows if not sneaking.", }); } @@ -59,11 +59,11 @@ public class HeavyArrows extends Skill if (level == 0) return; //Backboost - if (Recharge.Instance.use(player, GetName(), 500, false, false)) + if (!player.isSneaking() && Recharge.Instance.use(player, GetName(), 750, false, false)) { double vel = (event.getProjectile().getVelocity().length() * (0.1 + 0.1 * level)); UtilAction.velocity(player, player.getLocation().getDirection().multiply(-1), vel, - false, 0, 0.2, 0.6, true); + false, 0, 0.3, 0.6, true); } //Decrease Speed diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Longshot.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Longshot.java index a3abf916e..fc8b497d9 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Longshot.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Longshot.java @@ -24,8 +24,12 @@ public class Longshot extends Skill SetDesc(new String[] { - "Arrows do an additional 1 damage", "for every #4#-0.5 Blocks they travelled,", - "however, their base damage is", "reduced by 3.", "", "Maximum of #5#5 additional damage." + "Arrows do an additional 1 damage", + "for every #4#-0.5 Blocks they travelled,", + "however, their base damage is", + "reduced by 5.", + "", + "Maximum of #6#6 additional damage." }); } @@ -70,8 +74,11 @@ public class Longshot extends Skill double length = UtilMath.offset(loc, projectile.getLocation()); // Damage - double damage = Math.min(5 + 5 * level, (length / (4 - 0.5 * level)) - 3); + double damage = Math.min(6 + 6 * level, (length / (4 - 0.5 * level)) - 5); + if (damage < 0) + damage = 0; + event.AddMod(damager.getName(), GetName(), damage, damage > 0); } diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Overcharge.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Overcharge.java index e4e71d223..88412d922 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Overcharge.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Overcharge.java @@ -40,7 +40,7 @@ public class Overcharge extends SkillChargeBow "", GetChargeString(), "", - "Deals up to #0#1 bonus damage." + "Deals up to #1.5#1.5 bonus damage." }); } diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Sharpshooter.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Sharpshooter.java index 5fa378428..6946be806 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Sharpshooter.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/Sharpshooter.java @@ -72,7 +72,10 @@ public class Sharpshooter extends Skill Player player = _arrows.remove(projectile); int level = getLevel(player); - + + if (event.GetDamagerEntity(true) != null && event.GetDamagerEntity(true).equals(event.GetDamageeEntity())) + return; + if (_hitCount.containsKey(player)) { //Damage diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/VitalitySpores.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/VitalitySpores.java index 55abc63f9..fa39af241 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/VitalitySpores.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/VitalitySpores.java @@ -6,6 +6,7 @@ import org.bukkit.event.EventHandler; import mineplex.minecraft.game.classcombat.Class.IPvpClass.ClassType; import mineplex.core.updater.event.UpdateEvent; import mineplex.core.updater.UpdateType; +import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilTime; @@ -40,12 +41,12 @@ public class VitalitySpores extends Skill int level = getLevel(cur); if (level == 0) continue; - if (UtilTime.elapsed(Factory.Combat().Get(cur).GetLastDamaged(), 12000 - 2000*level)) + if (UtilTime.elapsed(Factory.Combat().Get(cur).GetLastDamaged(), 5000 - 1000*level)) { //Factory.Condition().Factory().Regen(GetName(), cur, cur, 3.9 + 2*level, 0, false, true, true); UtilPlayer.health(cur, 1); - UtilParticle.PlayParticle(ParticleType.HEART, cur.getEyeLocation(), 0, 0.2f, 0, 0, 1); + UtilParticle.PlayParticle(ParticleType.HEART, cur.getEyeLocation().add(UtilAlg.getBehind(cur.getLocation().getDirection().multiply(0.5))), 0, 0.2f, 0, 0, 1); } } } diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/WolfsPounce.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/WolfsPounce.java index 22b6bf1eb..277bf1da1 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/WolfsPounce.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/Ranger/WolfsPounce.java @@ -33,7 +33,7 @@ public class WolfsPounce extends SkillChargeSword { super(skills, name, classType, skillType, cost, maxLevel, 0.012f, 0.008f, - 7000, -1000, true, true, + 8000, -1000, true, true, false, false); SetDesc(new String[] @@ -61,7 +61,7 @@ public class WolfsPounce extends SkillChargeSword public void DoSkillCustom(Player player, float charge) { //Action - UtilAction.velocity(player, 0.4 + (1.4*charge), 0.2, 0.2 + (0.7*charge), true); + UtilAction.velocity(player, 0.4 + (1.4*charge), 0.2, 0.3 + (0.8*charge), true); _live.put(player, System.currentTimeMillis()); //Inform @@ -88,7 +88,7 @@ public class WolfsPounce extends SkillChargeSword if (!_live.containsKey(player)) continue; - if (!UtilTime.elapsed(_live.get(player), 2000)) + if (!UtilTime.elapsed(_live.get(player), 1000)) continue; _live.remove(player); @@ -102,7 +102,7 @@ public class WolfsPounce extends SkillChargeSword for (Player other : player.getWorld().getPlayers()) { - if (other.getGameMode() != GameMode.SURVIVAL) + if (UtilPlayer.isSpectator(other)) continue; if (other.equals(player)) diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/SkillCharge.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/SkillCharge.java index 2825c5f93..9925302f8 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/SkillCharge.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/SkillCharge.java @@ -14,6 +14,8 @@ public class SkillCharge extends Skill protected float _rateBase; protected float _rateBoost; + protected float _energyPerCharge = 0; + public SkillCharge(SkillFactory skills, String name, ClassType classType, SkillType skillType, int cost, int maxLevel, float base, float boost) @@ -36,6 +38,24 @@ public class SkillCharge extends Skill _charge.put(player, 0f); float charge = _charge.get(player); + + if (charge >= 1) + { + //Display + DisplayProgress(player, GetName(level), charge); + return true; + } + + //Energy + if (_energyPerCharge > 0) + { + if (!Factory.Energy().Use(player, GetName(), _energyPerCharge, true, false)) + { + //Display + DisplayProgress(player, GetName(level), charge); + return true; + } + } //Increase Charge charge = Math.min(1f, charge + _rateBase + (_rateBoost * level)); diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/SkillFactory.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/SkillFactory.java index 543e45572..1e24bc023 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/SkillFactory.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/Skill/SkillFactory.java @@ -142,7 +142,7 @@ public class SkillFactory extends MiniPlugin implements ISkillFactory //Passive C AddSkill(new BreakFall(this, "Break Fall", ClassType.Global, SkillType.GlobalPassive, 1, 3)); AddSkill(new Resistance(this, "Resistance", ClassType.Global, SkillType.GlobalPassive, 1, 3)); - AddSkill(new Cooldown(this, "Quick Recovery", ClassType.Global, SkillType.GlobalPassive, 1, 3)); + //AddSkill(new Cooldown(this, "Quick Recovery", ClassType.Global, SkillType.GlobalPassive, 1, 3)); //AddSkill(new Rations(this, "Rations", ClassType.Global, SkillType.GlobalPassive, 1, 2)); AddSkill(new Fitness(this, "Mana Pool", ClassType.Mage, SkillType.GlobalPassive, 1, 3)); @@ -171,7 +171,7 @@ public class SkillFactory extends MiniPlugin implements ISkillFactory AddSkill(new Illusion(this, "Illusion", ClassType.Assassin, SkillType.Sword, 1, 4, 50, -4, - 20000, -1000, true, + 17000, -1000, true, new Material[] {Material.IRON_SWORD, Material.GOLD_SWORD, Material.DIAMOND_SWORD}, new Action[] {Action.RIGHT_CLICK_AIR, Action.RIGHT_CLICK_BLOCK})); @@ -193,7 +193,7 @@ public class SkillFactory extends MiniPlugin implements ISkillFactory AddSkill(new Leap(this, "Leap", ClassType.Assassin, SkillType.Axe, 1, 4, 36, -3, - 9500, -1500, true, + 10500, -1500, true, new Material[] {Material.IRON_AXE, Material.GOLD_AXE, Material.DIAMOND_AXE}, new Action[] {Action.RIGHT_CLICK_AIR, Action.RIGHT_CLICK_BLOCK})); @@ -282,7 +282,7 @@ public class SkillFactory extends MiniPlugin implements ISkillFactory //Passive B AddSkill(new CripplingBlow(this, "Crippling Blow", ClassType.Brute, SkillType.PassiveB, 2, 1)); - AddSkill(new Colossus(this, "Colossus", ClassType.Brute, SkillType.PassiveB, 2, 1)); + AddSkill(new Colossus(this, "Colossus", ClassType.Brute, SkillType.PassiveB, 1, 3)); AddSkill(new Overwhelm(this, "Overwhelm", ClassType.Brute, SkillType.PassiveB, 1, 3)); } @@ -301,7 +301,7 @@ public class SkillFactory extends MiniPlugin implements ISkillFactory AddSkill(new Riposte(this, "Riposte", ClassType.Knight, SkillType.Sword, 1, 5, 0, 0, - 10000, -1000, false, + 11000, -1000, false, new Material[] {Material.IRON_SWORD, Material.GOLD_SWORD, Material.DIAMOND_SWORD}, new Action[] {Action.RIGHT_CLICK_AIR, Action.RIGHT_CLICK_BLOCK})); @@ -331,14 +331,14 @@ public class SkillFactory extends MiniPlugin implements ISkillFactory AddSkill(new ShieldSmash(this, "Shield Smash", ClassType.Knight, SkillType.Axe, 1, 5, 0, 0, - 8000, -1000, true, + 10000, -1000, true, new Material[] {Material.IRON_AXE, Material.GOLD_AXE, Material.DIAMOND_AXE}, new Action[] {Action.RIGHT_CLICK_AIR, Action.RIGHT_CLICK_BLOCK})); AddSkill(new AxeThrow(this, "Roped Axe Throw", ClassType.Knight, SkillType.Axe, 1, 5, 0, 0, - 3000, -450, true, + 2200, -200, true, new Material[] {Material.IRON_AXE, Material.GOLD_AXE, Material.DIAMOND_AXE}, new Action[] {Action.RIGHT_CLICK_AIR, Action.RIGHT_CLICK_BLOCK})); @@ -386,7 +386,7 @@ public class SkillFactory extends MiniPlugin implements ISkillFactory AddSkill(new FireBlast(this, "Fire Blast", ClassType.Mage, SkillType.Axe, 1, 5, 60, -3, - 11000, -1000, true, + 13000, -1000, true, new Material[] {Material.IRON_AXE, Material.GOLD_AXE, Material.DIAMOND_AXE}, new Action[] {Action.RIGHT_CLICK_AIR, Action.RIGHT_CLICK_BLOCK})); @@ -434,7 +434,7 @@ public class SkillFactory extends MiniPlugin implements ISkillFactory AddSkill(new GlacialBlade(this, "Glacial Blade", ClassType.Mage, SkillType.PassiveB, 1, 3, 16, -2, - 1300, -300, false, + 1200, -200, false, new Material[] {Material.IRON_SWORD, Material.GOLD_SWORD, Material.DIAMOND_SWORD}, new Action[] {Action.LEFT_CLICK_AIR, Action.LEFT_CLICK_BLOCK})); @@ -476,7 +476,7 @@ public class SkillFactory extends MiniPlugin implements ISkillFactory AddSkill(new HealingShot(this, "Healing Shot", ClassType.Ranger, SkillType.Bow, 1, 4, 0, 0, - 20000, -2000, true, + 20000, -3000, true, new Material[] {Material.BOW}, new Action[] {Action.LEFT_CLICK_AIR, Action.LEFT_CLICK_BLOCK})); @@ -504,7 +504,7 @@ public class SkillFactory extends MiniPlugin implements ISkillFactory AddSkill(new RopedArrow(this, "Roped Arrow", ClassType.Ranger, SkillType.Bow, 1, 4, 0, 0, - 10000, -1500, false, + 9000, -1000, false, new Material[] {Material.BOW}, new Action[] {Action.LEFT_CLICK_AIR, Action.LEFT_CLICK_BLOCK})); diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/item/ItemUsable.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/item/ItemUsable.java index c3ce1c928..d781731bd 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/item/ItemUsable.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/item/ItemUsable.java @@ -160,7 +160,7 @@ public abstract class ItemUsable extends Item implements IThrown org.bukkit.entity.Item ent = player.getWorld().dropItem(player.getEyeLocation(), ItemStackFactory.Instance.CreateStack(GetType())); UtilAction.velocity(ent, player.getLocation().getDirection(), _throwPower, false, 0, 0.2, 10, false); - Factory.Throw().AddThrow(ent, player, this, expire, _throwPlayer, _throwBlock, _throwIdle, _throwPickup, 1d); + Factory.Throw().AddThrow(ent, player, this, expire, _throwPlayer, _throwBlock, _throwIdle, _throwPickup, 0.5f); ThrowCustom(event, ent); } diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/item/Throwable/ProximityExplosive.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/item/Throwable/ProximityExplosive.java index 5930ef5e5..b8d2f31ab 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/item/Throwable/ProximityExplosive.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/item/Throwable/ProximityExplosive.java @@ -90,7 +90,7 @@ public class ProximityExplosive extends ItemUsable @EventHandler(priority = EventPriority.LOW) public void Pickup(PlayerPickupItemEvent event) { - if (event.getPlayer().getGameMode() != GameMode.SURVIVAL) + if (UtilPlayer.isSpectator(event.getPlayer())) return; if (((CraftPlayer)event.getPlayer()).getHandle().spectating) diff --git a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/item/Throwable/ProximityZapper.java b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/item/Throwable/ProximityZapper.java index 8ed69d3e8..33da5e43d 100644 --- a/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/item/Throwable/ProximityZapper.java +++ b/Plugins/Mineplex.Minecraft.Game.ClassCombat/src/mineplex/minecraft/game/classcombat/item/Throwable/ProximityZapper.java @@ -87,7 +87,7 @@ public class ProximityZapper extends ItemUsable @EventHandler(priority = EventPriority.LOW) public void Pickup(PlayerPickupItemEvent event) { - if (event.getPlayer().getGameMode() != GameMode.SURVIVAL) + if (UtilPlayer.isSpectator(event.getPlayer())) return; if (((CraftPlayer)event.getPlayer()).getHandle().spectating) diff --git a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/condition/ConditionEffect.java b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/condition/ConditionEffect.java index 7ae2ed2c9..2d8bb799f 100644 --- a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/condition/ConditionEffect.java +++ b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/condition/ConditionEffect.java @@ -4,6 +4,7 @@ import mineplex.minecraft.game.core.condition.Condition.ConditionType; import mineplex.minecraft.game.core.damage.CustomDamageEvent; import mineplex.core.updater.event.UpdateEvent; import mineplex.core.updater.UpdateType; +import mineplex.core.visibility.VisibilityManager; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilTime; @@ -18,7 +19,6 @@ import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityTargetEvent; import org.bukkit.potion.PotionEffectType; - import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; public class ConditionEffect implements Listener @@ -81,14 +81,20 @@ public class ConditionEffect implements Listener //Hide if (Manager.IsCloaked(ent)) - for (Player other : Bukkit.getServer().getOnlinePlayers()) - ((CraftPlayer)other).hidePlayer(player, true, false); - //Show - else + { for (Player other : Bukkit.getServer().getOnlinePlayers()) { - other.showPlayer(player); + VisibilityManager.Instance.setVisibility(player, false, other); } + } + //Show + else + { + for (Player other : Bukkit.getServer().getOnlinePlayers()) + { + VisibilityManager.Instance.setVisibility(player, true, other); + } + } } } diff --git a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/condition/conditions/Cloak.java b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/condition/conditions/Cloak.java index 2a230161c..b0d233bb2 100644 --- a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/condition/conditions/Cloak.java +++ b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/condition/conditions/Cloak.java @@ -6,6 +6,8 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import mineplex.core.common.util.UtilServer; +import mineplex.core.visibility.VisibilityManager; import mineplex.minecraft.game.core.condition.Condition; import mineplex.minecraft.game.core.condition.ConditionManager; @@ -30,11 +32,8 @@ public class Cloak extends Condition if (!(_ent instanceof Player)) return; - for (Player other : _ent.getServer().getOnlinePlayers()) - { - other.hidePlayer((Player)_ent); - } - + VisibilityManager.Instance.setVisibility((Player)_ent, false, UtilServer.getPlayers()); + for (Entity ent : _ent.getWorld().getEntities()) { if (!(ent instanceof Creature)) @@ -54,10 +53,6 @@ public class Cloak extends Condition { super.Remove(); - for (Player other : _ent.getServer().getOnlinePlayers()) - { - //other.hidePlayer((Player)_ent); - other.showPlayer((Player)_ent); - } + VisibilityManager.Instance.setVisibility((Player)_ent, true, UtilServer.getPlayers()); } } diff --git a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/damage/CustomDamageEvent.java b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/damage/CustomDamageEvent.java index ff33ab273..e7b460fe3 100644 --- a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/damage/CustomDamageEvent.java +++ b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/damage/CustomDamageEvent.java @@ -50,7 +50,7 @@ public class CustomDamageEvent extends Event implements Cancellable { _eventCause = cause; - if (initialSource == null || initialReason == null) + //if (initialSource == null || initialReason == null) _initialDamage = damage; _damageeEntity = damagee; @@ -66,7 +66,7 @@ public class CustomDamageEvent extends Event implements Cancellable _ignoreArmor = ignoreArmor; if (initialSource != null && initialReason != null) - AddMod(initialSource, initialReason, damage, true); + AddMod(initialSource, initialReason, 0, true); if (_eventCause == DamageCause.FALL) _ignoreArmor = true; @@ -116,11 +116,11 @@ public class CustomDamageEvent extends Event implements Cancellable { double damage = GetDamageInitial(); - for (DamageChange mult : _damageMult) - damage *= mult.GetDamage(); - for (DamageChange mult : _damageMod) damage += mult.GetDamage(); + + for (DamageChange mult : _damageMult) + damage *= mult.GetDamage(); return damage; } @@ -243,6 +243,15 @@ public class CustomDamageEvent extends Event implements Cancellable _damagerPlayer = (Player)ent; } + public void setDamagee(LivingEntity ent) + { + _damageeEntity = ent; + + _damageePlayer = null; + if (ent instanceof Player) + _damageePlayer = (Player)ent; + } + public void changeReason(String initial, String reason) { for (DamageChange change : _damageMod) @@ -307,4 +316,6 @@ public class CustomDamageEvent extends Event implements Cancellable { SetCancelled("No reason given because SOMEONE IS AN IDIOT"); } + + } diff --git a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/damage/DamageManager.java b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/damage/DamageManager.java index e8dc6d55a..69a258f60 100644 --- a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/damage/DamageManager.java +++ b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/damage/DamageManager.java @@ -21,6 +21,7 @@ import net.minecraft.server.v1_7_R4.DamageSource; import net.minecraft.server.v1_7_R4.EntityHuman; import net.minecraft.server.v1_7_R4.EntityLiving; +import org.bukkit.Bukkit; import org.bukkit.EntityEffect; import org.bukkit.GameMode; import org.bukkit.Location; @@ -99,9 +100,17 @@ public class DamageManager extends MiniPlugin //Pre-Event Modifications if (!DisableDamageChanges) WeaponDamage(event, damager); + + double damage = event.getDamage(); + + //Consistent Arrow Damage + if (projectile != null && projectile instanceof Arrow) + { + damage = projectile.getVelocity().length() * 3; + } //New Event - NewDamageEvent(damagee, damager, projectile, event.getCause(), event.getDamage(), true, false, false, null, null, preCancel); + NewDamageEvent(damagee, damager, projectile, event.getCause(), damage, true, false, false, null, null, preCancel); //System.out.println(UtilEnt.getName(damagee) + " by " + event.getCause() + " at " + UtilWorld.locToStr(damagee.getLocation())); @@ -182,6 +191,12 @@ public class DamageManager extends MiniPlugin event.SetCancelled("Damagee in Creative"); return; } + + if (UtilPlayer.isSpectator(damagee)) + { + event.SetCancelled("Damagee in Spectator"); + return; + } //Limit Mob/World Damage Rate if (!event.IgnoreRate()) diff --git a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/explosion/CustomExplosion.java b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/explosion/CustomExplosion.java index 6cb9fc654..181a230db 100644 --- a/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/explosion/CustomExplosion.java +++ b/Plugins/Mineplex.Minecraft.Game.Core/src/mineplex/minecraft/game/core/explosion/CustomExplosion.java @@ -44,30 +44,43 @@ public class CustomExplosion extends Explosion private boolean _damageBlocksEqually; private boolean _createFire; private boolean _ignoreRate = true; + private float _blockExplosionSize; public CustomExplosion(DamageManager manager, Location loc, float explosionSize, String deathCause) { super(((CraftWorld) loc.getWorld()).getHandle(), null, loc.getX(), loc.getY(), loc.getZ(), explosionSize); + _world = ((CraftWorld) loc.getWorld()).getHandle(); _manager = manager; _damageReason = deathCause; + _blockExplosionSize = explosionSize; + } + + public CustomExplosion setBlockExplosionSize(float explosionSize) + { + _blockExplosionSize = explosionSize; + + return this; } public CustomExplosion setIgnoreRate(boolean ignoreRate) { _ignoreRate = ignoreRate; + return this; } public CustomExplosion setDamageBlocks(boolean damageBlocks) { b = damageBlocks; + return this; } public CustomExplosion setBlocksDamagedEqually(boolean damageEqually) { _damageBlocksEqually = damageEqually; + return this; } @@ -98,7 +111,7 @@ public class CustomExplosion extends Explosion @Override public void a() { - if (this.size < 0.1F) + if (Math.max(_blockExplosionSize, this.size) < 0.1F) { return; } @@ -122,7 +135,7 @@ public class CustomExplosion extends Explosion d3 /= d6; d4 /= d6; d5 /= d6; - float f1 = this.size * (0.7F + this._world.random.nextFloat() * 0.6F); + float f1 = this._blockExplosionSize * (0.7F + this._world.random.nextFloat() * 0.6F); double d0 = this.posX; double d1 = this.posY; @@ -229,7 +242,7 @@ public class CustomExplosion extends Explosion { this._world.makeSound(this.posX, this.posY, this.posZ, "random.explode", 4.0F, (1.0F + (this._world.random.nextFloat() - this._world.random.nextFloat()) * 0.2F) * 0.7F); - if ((this.size >= 2.0F) && (this.b)) + if ((this._blockExplosionSize >= 2.0F) && (this.b)) this._world.addParticle("hugeexplosion", this.posX, this.posY, this.posZ, 1.0D, 0.0D, 0.0D); else { @@ -292,7 +305,7 @@ public class CustomExplosion extends Explosion d3 /= d6; d4 /= d6; d5 /= d6; - double d7 = 0.5D / (d6 / this.size + 0.1D); + double d7 = 0.5D / (d6 / this._blockExplosionSize + 0.1D); d7 *= (this._world.random.nextFloat() * this._world.random.nextFloat() + 0.3F); d3 *= d7; @@ -307,7 +320,7 @@ public class CustomExplosion extends Explosion { if (block.a(this) && _dropItems) { - block.dropNaturally(this._world, i, j, k, this._world.getData(i, j, k), size, 0); + block.dropNaturally(this._world, i, j, k, this._world.getData(i, j, k), _blockExplosionSize, 0); } this._world.setTypeAndData(i, j, k, Blocks.AIR, 0, 3); @@ -337,7 +350,7 @@ public class CustomExplosion extends Explosion } } - PacketPlayOutExplosion explosion = new PacketPlayOutExplosion(this.posX, this.posY, this.posZ, this.size, + PacketPlayOutExplosion explosion = new PacketPlayOutExplosion(this.posX, this.posY, this.posZ, this._blockExplosionSize, new ArrayList(), null); for (Player p : Bukkit.getOnlinePlayers()) ((CraftPlayer) p).getHandle().playerConnection.sendPacket(explosion); diff --git a/Plugins/Mineplex.PlayerCache/.classpath b/Plugins/Mineplex.PlayerCache/.classpath new file mode 100644 index 000000000..7a237e253 --- /dev/null +++ b/Plugins/Mineplex.PlayerCache/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Plugins/Mineplex.PlayerCache/.project b/Plugins/Mineplex.PlayerCache/.project new file mode 100644 index 000000000..0abebe638 --- /dev/null +++ b/Plugins/Mineplex.PlayerCache/.project @@ -0,0 +1,17 @@ + + + Mineplex.PlayerCache + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/Plugins/Mineplex.PlayerCache/.settings/org.eclipse.jdt.core.prefs b/Plugins/Mineplex.PlayerCache/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..7341ab168 --- /dev/null +++ b/Plugins/Mineplex.PlayerCache/.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.PlayerCache/Mineplex.PlayerCache.iml b/Plugins/Mineplex.PlayerCache/Mineplex.PlayerCache.iml new file mode 100644 index 000000000..54892e832 --- /dev/null +++ b/Plugins/Mineplex.PlayerCache/Mineplex.PlayerCache.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Plugins/Mineplex.PlayerCache/src/mineplex/playerCache/PlayerCache.java b/Plugins/Mineplex.PlayerCache/src/mineplex/playerCache/PlayerCache.java new file mode 100644 index 000000000..15cffb719 --- /dev/null +++ b/Plugins/Mineplex.PlayerCache/src/mineplex/playerCache/PlayerCache.java @@ -0,0 +1,37 @@ +package mineplex.playerCache; + +import java.util.UUID; + +import mineplex.serverdata.Region; +import mineplex.serverdata.redis.RedisDataRepository; +import mineplex.serverdata.servers.ServerManager; + +public class PlayerCache +{ + private RedisDataRepository _repository; + + public PlayerCache() + { + _repository = new RedisDataRepository( + ServerManager.getMasterConnection(), + ServerManager.getSlaveConnection(), + Region.ALL, + PlayerInfo.class, + "playercache"); + } + + public void addPlayer(PlayerInfo player) + { + _repository.addElement(player, 60 * 60 * 6); // 6 Hours + } + + public PlayerInfo getPlayer(UUID uuid) + { + return _repository.getElement(uuid.toString()); + } + + public void clean() + { + _repository.clean(); + } +} diff --git a/Plugins/Mineplex.PlayerCache/src/mineplex/playerCache/PlayerInfo.java b/Plugins/Mineplex.PlayerCache/src/mineplex/playerCache/PlayerInfo.java new file mode 100644 index 000000000..700839ccb --- /dev/null +++ b/Plugins/Mineplex.PlayerCache/src/mineplex/playerCache/PlayerInfo.java @@ -0,0 +1,86 @@ +package mineplex.playerCache; + +import java.util.UUID; + +import mineplex.serverdata.data.Data; + +public class PlayerInfo implements Data +{ + private int _id; + private UUID _uuid; + private String _name; + private boolean _online; + private long _lastUniqueLogin; + private long _loginTime; + private int _sessionId; + private int _version; + + public PlayerInfo(int id, UUID uuid, String name, int version) + { + _id = id; + _uuid = uuid; + _name = name; + _version = version; + } + + @Override + public String getDataId() + { + return _uuid.toString(); + } + + public int getId() + { + return _id; + } + + public UUID getUUID() + { + return _uuid; + } + + public String getName() + { + return _name; + } + + public boolean getOnline() + { + return _online; + } + + public long getLastUniqueLogin() + { + return _lastUniqueLogin; + } + + public long getLoginTime() + { + return _loginTime; + } + + public int getSessionId() + { + return _sessionId; + } + + public int getVersion() + { + return _version; + } + + public void setSessionId(int sessionId) + { + _sessionId = sessionId; + } + + public void setName(String name) + { + _name = name; + } + + public void setVersion(int version) + { + _version = version; + } +} diff --git a/Plugins/Mineplex.Queuer/src/mineplex/queuer/QueueParty.java b/Plugins/Mineplex.Queuer/src/mineplex/queuer/QueueParty.java index 54791737c..19dd01fdb 100644 --- a/Plugins/Mineplex.Queuer/src/mineplex/queuer/QueueParty.java +++ b/Plugins/Mineplex.Queuer/src/mineplex/queuer/QueueParty.java @@ -4,8 +4,8 @@ import java.util.Collection; import java.util.HashSet; import java.util.Set; -import mineplex.serverdata.Data; import mineplex.serverdata.Region; +import mineplex.serverdata.data.Data; public class QueueParty implements Data { diff --git a/Plugins/Mineplex.Queuer/src/mineplex/queuer/QueueRepository.java b/Plugins/Mineplex.Queuer/src/mineplex/queuer/QueueRepository.java index 212ea83a5..eeef5c327 100644 --- a/Plugins/Mineplex.Queuer/src/mineplex/queuer/QueueRepository.java +++ b/Plugins/Mineplex.Queuer/src/mineplex/queuer/QueueRepository.java @@ -9,14 +9,16 @@ import java.util.Set; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; -import mineplex.serverdata.DataRepository; -import mineplex.serverdata.MinecraftServer; -import mineplex.serverdata.RedisDataRepository; import mineplex.serverdata.Region; -import mineplex.serverdata.ServerManager; -import mineplex.serverdata.ServerRepository; -import mineplex.serverdata.transfers.ServerTransfer; -import mineplex.serverdata.transfers.TransferCommand; +import mineplex.serverdata.Utility; +import mineplex.serverdata.commands.ServerTransfer; +import mineplex.serverdata.commands.TransferCommand; +import mineplex.serverdata.data.DataRepository; +import mineplex.serverdata.data.MinecraftServer; +import mineplex.serverdata.redis.RedisDataRepository; +import mineplex.serverdata.servers.ConnectionData; +import mineplex.serverdata.servers.ServerManager; +import mineplex.serverdata.servers.ServerRepository; public class QueueRepository { @@ -29,9 +31,9 @@ public class QueueRepository * @param port - the designated port of the QueueRepository database * @param region - the region of server queues to manage */ - public QueueRepository(String host, int port, Region region) + public QueueRepository(ConnectionData connectionData, Region region) { - this._partyRepository = new RedisDataRepository(host, port, region, + this._partyRepository = new RedisDataRepository(connectionData, region, QueueParty.class, "queue-parties"); } @@ -43,7 +45,7 @@ public class QueueRepository */ public QueueRepository(Region region) { - this(ServerManager.DEFAULT_REDIS_HOST, ServerManager.DEFAULT_REDIS_PORT, region); + this(ServerManager.getMasterConnection(), region); } public QueueParty getQueueParty(int partyId) diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/Region.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/Region.java index dda067632..5bc846b37 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/Region.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/Region.java @@ -1,5 +1,7 @@ package mineplex.serverdata; +import java.io.File; + /** * Region enumerates the various geographical regions where Mineplex servers are * hosted. @@ -11,4 +13,12 @@ public enum Region US, EU, ALL; + + /** + * @return the geographical {@link Region} of the current running process. + */ + public static Region currentRegion() + { + return !new File("eu.dat").exists() ? Region.US : Region.EU; + } } diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/ServerManager.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/ServerManager.java deleted file mode 100644 index 66f843ae4..000000000 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/ServerManager.java +++ /dev/null @@ -1,48 +0,0 @@ -package mineplex.serverdata; - -import java.util.HashMap; -import java.util.Map; - -/** - * ServerManager handles the creation/management of {@link ServerRepository}s for use. - * @author Ty - * - */ -public class ServerManager -{ - // The host of the default redis database used for server repository - public final static String DEFAULT_REDIS_HOST = "10.33.53.16"; - - // The default port used by redis databases - public final static int DEFAULT_REDIS_PORT = 6379; - - // The cached repository instances - private static Map repositories = new HashMap(); - - /** - * @param host - the host url used to connect to the database - * @param port - the port to connect to the repository - * @param region - the geographical region of the {@link ServerRepository}. - * @return a newly instanced (or cached) {@link ServerRepository} for the specified {@code region}. - */ - public static ServerRepository getServerRepository(String host, int port, Region region) - { - if (repositories.containsKey(region)) return repositories.get(region); - - ServerRepository repository = new RedisServerRepository(host, port, region); - repositories.put(region, repository); - return repository; - } - - /** - * {@code host} defaults to {@value DEFAULT_REDIS_HOST} and - * {@code port} defaults to {@value DEFAULT_REDIS_PORT}. - * - * @see #getServerRepository(String, int, Region) - */ - public static ServerRepository getServerRepository(Region region) - { - return getServerRepository(DEFAULT_REDIS_HOST, DEFAULT_REDIS_PORT, region); - } - -} diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/Utility.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/Utility.java index 1682033ec..b848f99cd 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/Utility.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/Utility.java @@ -1,5 +1,7 @@ package mineplex.serverdata; +import mineplex.serverdata.servers.ConnectionData; +import mineplex.serverdata.servers.ServerManager; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; @@ -20,7 +22,8 @@ public class Utility public static Gson getGson() { return _gson; } // Public static jedis pool for interacting with central default jedis repo. - private static JedisPool _jedisPool; + private static JedisPool _masterPool; + private static JedisPool _slavePool; /** * @param object - the (non-null) object to serialize @@ -66,7 +69,8 @@ public class Utility public static long currentTimeSeconds() { long currentTime = 0; - Jedis jedis = getPool().getResource(); + JedisPool pool = getPool(false); + Jedis jedis = pool.getResource(); try { @@ -74,7 +78,7 @@ public class Utility } finally { - getPool().returnResource(jedis); + pool.returnResource(jedis); } return currentTime; @@ -87,7 +91,8 @@ public class Utility public static long currentTimeMillis() { long currentTime = 0; - Jedis jedis = getPool().getResource(); + JedisPool pool = getPool(false); + Jedis jedis = pool.getResource(); try { @@ -95,20 +100,44 @@ public class Utility } finally { - getPool().returnResource(jedis); + pool.returnResource(jedis); } return currentTime * 1000; } - public static JedisPool getPool() + /** + * @param connData - the connection data specifying the database to be connected to. + * @return a newly instantiated {@link JedisPool} connected to the provided {@link ConnectionData} repository. + */ + public static JedisPool generatePool(ConnectionData connData) { - if (_jedisPool == null) + return new JedisPool(new JedisPoolConfig(), connData.getHost(), connData.getPort()); + } + + /** + * @param writeable - whether or not the Jedis connections returned should be writeable to. + * @return a globally available {@link JedisPool} + */ + public static JedisPool getPool(boolean writeable) + { + if (writeable) { - _jedisPool = new JedisPool(new JedisPoolConfig(), - ServerManager.DEFAULT_REDIS_HOST, ServerManager.DEFAULT_REDIS_PORT); + if (_masterPool == null) + { + _masterPool = generatePool(ServerManager.getMasterConnection()); + } + + return _masterPool; + } + else + { + if (_slavePool == null) + { + _slavePool = generatePool(ServerManager.getSlaveConnection()); + } + + return _slavePool; } - - return _jedisPool; } } diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/transfers/AnnouncementCommand.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/AnnouncementCommand.java similarity index 85% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/transfers/AnnouncementCommand.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/AnnouncementCommand.java index cc2e5c271..d7c8d87d6 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/transfers/AnnouncementCommand.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/AnnouncementCommand.java @@ -1,6 +1,5 @@ -package mineplex.serverdata.transfers; +package mineplex.serverdata.commands; -import mineplex.serverdata.ServerCommand; public class AnnouncementCommand extends ServerCommand { diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/CommandCallback.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/CommandCallback.java similarity index 67% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/CommandCallback.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/CommandCallback.java index 0e0c86cf3..cd172b8e5 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/CommandCallback.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/CommandCallback.java @@ -1,4 +1,5 @@ -package mineplex.serverdata; +package mineplex.serverdata.commands; + public interface CommandCallback { diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/CommandType.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/CommandType.java similarity index 92% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/CommandType.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/CommandType.java index 9e0b34edb..9f541b8b8 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/CommandType.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/CommandType.java @@ -1,4 +1,5 @@ -package mineplex.serverdata; +package mineplex.serverdata.commands; + public class CommandType { diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/transfers/PunishCommand.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/PunishCommand.java similarity index 88% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/transfers/PunishCommand.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/PunishCommand.java index 8fbb6e899..ee7d91632 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/transfers/PunishCommand.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/PunishCommand.java @@ -1,6 +1,5 @@ -package mineplex.serverdata.transfers; +package mineplex.serverdata.commands; -import mineplex.serverdata.ServerCommand; public class PunishCommand extends ServerCommand { diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/transfers/RestartCommand.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/RestartCommand.java similarity index 84% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/transfers/RestartCommand.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/RestartCommand.java index 2f857f061..fe7038db0 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/transfers/RestartCommand.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/RestartCommand.java @@ -1,7 +1,6 @@ -package mineplex.serverdata.transfers; +package mineplex.serverdata.commands; import mineplex.serverdata.Region; -import mineplex.serverdata.ServerCommand; public class RestartCommand extends ServerCommand { diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/ServerCommand.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/ServerCommand.java similarity index 97% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/ServerCommand.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/ServerCommand.java index 2bfd1b8ee..5f6e546b8 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/ServerCommand.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/ServerCommand.java @@ -1,4 +1,5 @@ -package mineplex.serverdata; +package mineplex.serverdata.commands; + public abstract class ServerCommand { diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/ServerCommandListener.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/ServerCommandListener.java similarity index 96% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/ServerCommandListener.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/ServerCommandListener.java index 946ecc80d..835b58d26 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/ServerCommandListener.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/ServerCommandListener.java @@ -1,4 +1,4 @@ -package mineplex.serverdata; +package mineplex.serverdata.commands; import redis.clients.jedis.JedisPubSub; diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/ServerCommandManager.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/ServerCommandManager.java similarity index 80% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/ServerCommandManager.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/ServerCommandManager.java index 541a0f50a..d3b88546f 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/ServerCommandManager.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/ServerCommandManager.java @@ -1,8 +1,10 @@ -package mineplex.serverdata; +package mineplex.serverdata.commands; import java.util.HashMap; import java.util.Map; +import mineplex.serverdata.Utility; +import mineplex.serverdata.servers.ServerManager; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; @@ -15,7 +17,8 @@ public class ServerCommandManager public final String SERVER_COMMANDS_CHANNEL = "commands.server"; - private JedisPool _jedisPool; + private JedisPool _writePool; + private JedisPool _readPool; private Map _commandTypes; private String _localServerName; @@ -27,8 +30,9 @@ public class ServerCommandManager */ private ServerCommandManager() { - _jedisPool = new JedisPool(new JedisPoolConfig(), ServerManager.DEFAULT_REDIS_HOST, - ServerManager.DEFAULT_REDIS_PORT); + _writePool = Utility.generatePool(ServerManager.getMasterConnection()); // Publish to master instance + _readPool = Utility.generatePool(ServerManager.getSlaveConnection()); // Read from slave instance + _commandTypes = new HashMap(); initialize(); @@ -40,7 +44,7 @@ public class ServerCommandManager */ private void initialize() { - final Jedis jedis = _jedisPool.getResource(); + final Jedis jedis = _readPool.getResource(); // Spin up a new thread and subscribe to the Redis pubsub network Thread thread = new Thread("Redis Manager") @@ -57,7 +61,7 @@ public class ServerCommandManager } finally { - _jedisPool.returnResource(jedis); + _readPool.returnResource(jedis); } } }; @@ -75,7 +79,7 @@ public class ServerCommandManager { public void run() { - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _writePool.getResource(); try { @@ -89,7 +93,7 @@ public class ServerCommandManager } finally { - _jedisPool.returnResource(jedis); + _writePool.returnResource(jedis); } } }).start(); @@ -112,25 +116,18 @@ public class ServerCommandManager { Class commandClazz = _commandTypes.get(commandType).getCommandType(); final ServerCommand serverCommand = Utility.deserialize(serializedCommand, commandClazz); - - if (!serverCommand.isTargetServer(_localServerName)) - return; - - new Thread("Redis Command " + commandType) + + if (serverCommand.isTargetServer(_localServerName)) { - public void run() + // TODO: Run synchronously? + CommandCallback callback = _commandTypes.get(commandType).getCallback(); + serverCommand.run(); // Run server command without callback + + if (callback != null) { - // TODO: Run synchronously? - CommandCallback callback = _commandTypes.get(commandType).getCallback(); - serverCommand.run(); // Run server command without callback - - if (callback != null) - { - callback.run(serverCommand); // Run callback - } + callback.run(serverCommand); // Run callback } - - }; + } } } diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/transfers/ServerTransfer.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/ServerTransfer.java similarity index 94% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/transfers/ServerTransfer.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/ServerTransfer.java index c0893814d..cd16165b0 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/transfers/ServerTransfer.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/ServerTransfer.java @@ -1,4 +1,4 @@ -package mineplex.serverdata.transfers; +package mineplex.serverdata.commands; public class ServerTransfer { diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/transfers/SuicideCommand.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/SuicideCommand.java similarity index 84% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/transfers/SuicideCommand.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/SuicideCommand.java index ef7d83cb2..7bbc0ac6d 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/transfers/SuicideCommand.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/SuicideCommand.java @@ -1,7 +1,6 @@ -package mineplex.serverdata.transfers; +package mineplex.serverdata.commands; import mineplex.serverdata.Region; -import mineplex.serverdata.ServerCommand; public class SuicideCommand extends ServerCommand { diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/transfers/TransferCommand.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/TransferCommand.java similarity index 89% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/transfers/TransferCommand.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/TransferCommand.java index bc74ca9fd..15ac416ba 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/transfers/TransferCommand.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/commands/TransferCommand.java @@ -1,6 +1,5 @@ -package mineplex.serverdata.transfers; +package mineplex.serverdata.commands; -import mineplex.serverdata.ServerCommand; /** * The TransferCommand is sent across the server network to notify diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/BungeeServer.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/BungeeServer.java new file mode 100644 index 000000000..669e6e5f2 --- /dev/null +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/BungeeServer.java @@ -0,0 +1,57 @@ +package mineplex.serverdata.data; + +import mineplex.serverdata.Region; +import mineplex.serverdata.data.Data; + +public class BungeeServer implements Data +{ + // The name of this server. + private String _name; + public String getName() { return _name; } + + // The geographical region of this Bungee Server. + private Region _region; + public Region getRegion() { return _region; } + + // The number of players currently online. + private int _playerCount; + public int getPlayerCount() { return _playerCount; } + + // The public I.P address used by players to connect to the server. + private String _publicAddress; + public String getPublicAddress() { return _publicAddress; } + + // The port the server is currently running/listening on. + private int _port; + public int getPort() { return _port; } + + // Whether the Bungee server can connect to the internet. + private boolean _connected; + public boolean isConnected() { return _connected; } + + /** + * Class constructor + * @param name + * @param publicAddress + * @param port + * @param playerCount + * @param connected + */ + public BungeeServer(String name, Region region, String publicAddress, int port, int playerCount, boolean connected) + { + _name = name; + _region = region; + _playerCount = playerCount; + _publicAddress = publicAddress; + _port = port; + _connected = connected; + } + + /** + * Unique identifying ID for this Bungee Server. + */ + public String getDataId() + { + return _name; + } +} diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/Data.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/Data.java similarity index 82% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/Data.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/Data.java index a69049c3b..34bb2ddda 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/Data.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/Data.java @@ -1,4 +1,5 @@ -package mineplex.serverdata; +package mineplex.serverdata.data; + public interface Data { diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/DataRepository.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/DataRepository.java similarity index 86% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/DataRepository.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/DataRepository.java index e2940f8df..fb9f9e7c4 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/DataRepository.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/DataRepository.java @@ -1,4 +1,4 @@ -package mineplex.serverdata; +package mineplex.serverdata.data; import java.util.Collection; @@ -15,6 +15,8 @@ public interface DataRepository public Collection getElements(); public T getElement(String dataId); + + public Collection getElements(Collection dataIds); public void addElement(T element, int timeout); diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/DedicatedServer.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/DedicatedServer.java similarity index 98% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/DedicatedServer.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/DedicatedServer.java index c0ae10014..59191a7f4 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/DedicatedServer.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/DedicatedServer.java @@ -1,8 +1,10 @@ -package mineplex.serverdata; +package mineplex.serverdata.data; import java.util.HashMap; import java.util.Map; +import mineplex.serverdata.Region; + public class DedicatedServer { diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/MinecraftServer.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/MinecraftServer.java similarity index 98% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/MinecraftServer.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/MinecraftServer.java index 1bc052f88..b1aaf1c97 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/MinecraftServer.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/MinecraftServer.java @@ -1,4 +1,4 @@ -package mineplex.serverdata; +package mineplex.serverdata.data; public class MinecraftServer { diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/PlayerStatus.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/PlayerStatus.java new file mode 100644 index 000000000..509006ca0 --- /dev/null +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/PlayerStatus.java @@ -0,0 +1,33 @@ +package mineplex.serverdata.data; + +import mineplex.serverdata.data.Data; + +public class PlayerStatus implements Data +{ + // The name of this server. + private String _name; + public String getName() { return _name; } + + // The current message of the day (MOTD) of the server. + private String _server; + public String getServer() { return _server; } + + /** + * Class constructor + * @param name + * @param server + */ + public PlayerStatus(String name, String server) + { + _name = name; + _server = server; + } + + /** + * Unique identifying String ID associated with this {@link PlayerStatus}. + */ + public String getDataId() + { + return _name; + } +} diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/ServerGroup.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/ServerGroup.java similarity index 97% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/ServerGroup.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/ServerGroup.java index bee342916..40d36f875 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/ServerGroup.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/ServerGroup.java @@ -1,4 +1,4 @@ -package mineplex.serverdata; +package mineplex.serverdata.data; import java.util.Collection; import java.util.HashMap; @@ -6,6 +6,8 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import mineplex.serverdata.Region; + public class ServerGroup { private HashMap _dataMap = null; @@ -50,6 +52,7 @@ public class ServerGroup private String _games; private String _serverType; private boolean _addNoCheat; + private boolean _addWorldEdit; private boolean _whitelist; private boolean _staffOnly; private String _resourcePack = ""; @@ -80,6 +83,7 @@ public class ServerGroup _games = data.get("games"); _serverType = data.get("serverType"); _addNoCheat = Boolean.valueOf(data.get("addNoCheat")); + _addWorldEdit = Boolean.valueOf(data.get("addWorldEdit")); _teamRejoin = Boolean.valueOf(data.get("teamRejoin")); _teamAutoJoin = Boolean.valueOf(data.get("teamAutoJoin")); _teamForceBalance = Boolean.valueOf(data.get("teamForceBalance")); @@ -103,7 +107,7 @@ public class ServerGroup } public ServerGroup(String name, String prefix, String host, int ram, int cpu, int totalServers, int joinable, int portSection, boolean arcade, String worldZip, String plugin, String configPath - , int minPlayers, int maxPlayers, boolean pvp, boolean tournament, boolean tournamentPoints, String games, String serverType, boolean noCheat, boolean teamRejoin + , int minPlayers, int maxPlayers, boolean pvp, boolean tournament, boolean tournamentPoints, String games, String serverType, boolean noCheat, boolean worldEdit, boolean teamRejoin , boolean teamAutoJoin, boolean teamForceBalance, boolean gameAutoStart, boolean gameTimeout, boolean rewardGems, boolean rewardItems, boolean rewardStats , boolean rewardAchievements, boolean hotbarInventory, boolean hotbarHubClock, boolean playerKickIdle, boolean staffOnly, boolean whitelist, String resourcePack, Region region) { @@ -127,6 +131,7 @@ public class ServerGroup _games = games; _serverType = serverType; _addNoCheat = noCheat; + _addWorldEdit = worldEdit; _teamRejoin = teamRejoin; _teamAutoJoin = teamAutoJoin; _teamForceBalance = teamForceBalance; @@ -185,6 +190,7 @@ public class ServerGroup public String getGames() { return _games; } public String getServerType() { return _serverType; } public boolean getAddNoCheat() { return _addNoCheat; } + public boolean getAddWorldEdit() { return _addWorldEdit; } public boolean getWhitelist() { return _whitelist; } public boolean getStaffOnly() { return _staffOnly; } public String getResourcePack() { return _resourcePack; } diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/RedisDataRepository.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/redis/RedisDataRepository.java similarity index 71% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/RedisDataRepository.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/redis/RedisDataRepository.java index 2577ca1bc..a49de5b64 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/RedisDataRepository.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/redis/RedisDataRepository.java @@ -1,4 +1,4 @@ -package mineplex.serverdata; +package mineplex.serverdata.redis; import java.util.ArrayList; import java.util.Collection; @@ -6,6 +6,12 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import mineplex.serverdata.Region; +import mineplex.serverdata.Utility; +import mineplex.serverdata.data.Data; +import mineplex.serverdata.data.DataRepository; +import mineplex.serverdata.servers.ConnectionData; +import mineplex.serverdata.servers.ServerManager; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; @@ -20,35 +26,45 @@ public class RedisDataRepository implements DataRepository // The delimiter character used for redis key paths public final char KEY_DELIMITER = '.'; - // The pool used to retrieve jedis instances. - private JedisPool _jedisPool; - public JedisPool getJedisPool() { return _jedisPool; } + // The pools used to retrieve jedis instances. + private JedisPool _writePool; + private JedisPool _readPool; // The geographical region of the servers stored by this ServerRepository private Region _region; + // The class type of the elements stored in this repository private Class _elementType; + // A unique label designating the elements and this repository. private String _elementLabel; /** * Class constructor + * @param writeConn + * @param readConn * @param host * @param port * @param region */ - public RedisDataRepository(String host, int port, Region region, + public RedisDataRepository(ConnectionData writeConn, ConnectionData readConn, Region region, Class elementType, String elementLabel) { - _jedisPool = new JedisPool(new JedisPoolConfig(), host, port); + _writePool = Utility.generatePool(writeConn); + _readPool = (writeConn == readConn) ? _writePool : Utility.generatePool(readConn); _region = region; _elementType = elementType; _elementLabel = elementLabel; } + public RedisDataRepository(ConnectionData conn, Region region, Class elementType, String elementLabel) + { + this(conn, conn, region, elementType, elementLabel); + } + public RedisDataRepository(Region region, Class elementType, String elementLabel) { - this(ServerManager.DEFAULT_REDIS_HOST, ServerManager.DEFAULT_REDIS_PORT, region, + this(ServerManager.getMasterConnection(), ServerManager.getSlaveConnection(), region, elementType, elementLabel); } @@ -69,20 +85,27 @@ public class RedisDataRepository implements DataRepository @Override public Collection getElements() + { + return getElements(getActiveElements()); + } + + @Override + public Collection getElements(Collection dataIds) { Collection elements = new HashSet(); - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _readPool.getResource(); try { Pipeline pipeline = jedis.pipelined(); List> responses = new ArrayList>(); - for (String dataId : getActiveElements()) + for (String dataId : dataIds) { responses.add(pipeline.get(generateKey(dataId))); } + // Block until all requests have received pipelined responses pipeline.sync(); for (Response response : responses) @@ -99,25 +122,25 @@ public class RedisDataRepository implements DataRepository catch (JedisConnectionException exception) { exception.printStackTrace(); - _jedisPool.returnBrokenResource(jedis); + _readPool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { - _jedisPool.returnResource(jedis); + _readPool.returnResource(jedis); } } return elements; } - + @Override public T getElement(String dataId) { T element = null; - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _readPool.getResource(); try { @@ -128,14 +151,14 @@ public class RedisDataRepository implements DataRepository catch (JedisConnectionException exception) { exception.printStackTrace(); - _jedisPool.returnBrokenResource(jedis); + _readPool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { - _jedisPool.returnResource(jedis); + _readPool.returnResource(jedis); } } @@ -145,7 +168,7 @@ public class RedisDataRepository implements DataRepository @Override public void addElement(T element, int timeout) { - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _writePool.getResource(); try { @@ -163,14 +186,14 @@ public class RedisDataRepository implements DataRepository catch (JedisConnectionException exception) { exception.printStackTrace(); - _jedisPool.returnBrokenResource(jedis); + _writePool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { - _jedisPool.returnResource(jedis); + _writePool.returnResource(jedis); } } } @@ -178,7 +201,7 @@ public class RedisDataRepository implements DataRepository @Override public void addElement(T element) { - addElement(element, 1000 * 60 * 60 * 24 * 7 * 4 * 12 * 10); // Set the timeout to 10 years + addElement(element, 60 * 60 * 24 * 7 * 4 * 12 * 10); // Set the timeout to 10 years } @Override @@ -190,7 +213,7 @@ public class RedisDataRepository implements DataRepository @Override public void removeElement(String dataId) { - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _writePool.getResource(); try { @@ -198,21 +221,21 @@ public class RedisDataRepository implements DataRepository String dataKey = generateKey(dataId); Transaction transaction = jedis.multi(); - transaction.set(dataKey, null); + transaction.del(dataKey); transaction.zrem(setKey, dataId); transaction.exec(); } catch (JedisConnectionException exception) { exception.printStackTrace(); - _jedisPool.returnBrokenResource(jedis); + _writePool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { - _jedisPool.returnResource(jedis); + _writePool.returnResource(jedis); } } } @@ -226,7 +249,7 @@ public class RedisDataRepository implements DataRepository @Override public int clean() { - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _writePool.getResource(); try { @@ -243,14 +266,14 @@ public class RedisDataRepository implements DataRepository catch (JedisConnectionException exception) { exception.printStackTrace(); - _jedisPool.returnBrokenResource(jedis); + _writePool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { - _jedisPool.returnResource(jedis); + _writePool.returnResource(jedis); } } @@ -260,7 +283,7 @@ public class RedisDataRepository implements DataRepository protected Set getActiveElements() { Set dataIds = new HashSet(); - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _readPool.getResource(); try { @@ -271,14 +294,14 @@ public class RedisDataRepository implements DataRepository catch (JedisConnectionException exception) { exception.printStackTrace(); - _jedisPool.returnBrokenResource(jedis); + _readPool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { - _jedisPool.returnResource(jedis); + _readPool.returnResource(jedis); } } @@ -288,7 +311,7 @@ public class RedisDataRepository implements DataRepository protected Set getDeadElements() { Set dataIds = new HashSet(); - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _readPool.getResource(); try { @@ -299,14 +322,14 @@ public class RedisDataRepository implements DataRepository catch (JedisConnectionException exception) { exception.printStackTrace(); - _jedisPool.returnBrokenResource(jedis); + _readPool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { - _jedisPool.returnResource(jedis); + _readPool.returnResource(jedis); } } diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/RedisServerRepository.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/redis/RedisServerRepository.java similarity index 83% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/RedisServerRepository.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/redis/RedisServerRepository.java index af57c8f04..971c8dd24 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/RedisServerRepository.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/redis/RedisServerRepository.java @@ -1,4 +1,4 @@ -package mineplex.serverdata; +package mineplex.serverdata.redis; import java.util.ArrayList; import java.util.Collection; @@ -9,9 +9,15 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import mineplex.serverdata.Region; +import mineplex.serverdata.Utility; +import mineplex.serverdata.data.DedicatedServer; +import mineplex.serverdata.data.MinecraftServer; +import mineplex.serverdata.data.ServerGroup; +import mineplex.serverdata.servers.ConnectionData; +import mineplex.serverdata.servers.ServerRepository; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; -import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.Pipeline; import redis.clients.jedis.Response; import redis.clients.jedis.Transaction; @@ -31,7 +37,8 @@ public class RedisServerRepository implements ServerRepository public final char KEY_DELIMITER = '.'; // The pool used to retrieve jedis instances. - private JedisPool _jedisPool; + private JedisPool _writePool; + private JedisPool _readPool; // The geographical region of the servers stored by this ServerRepository private Region _region; @@ -41,17 +48,24 @@ public class RedisServerRepository implements ServerRepository * @param host * @param port */ - public RedisServerRepository(String host, int port, Region region) + public RedisServerRepository(ConnectionData writeConn, ConnectionData readConn, Region region) { - this._jedisPool = new JedisPool(new JedisPoolConfig(), host, port); - this._region = region; + _writePool = Utility.generatePool(writeConn); + _readPool = (writeConn == readConn) ? _writePool : Utility.generatePool(readConn); + _region = region; } @Override public Collection getServerStatuses() + { + return getServerStatusesByPrefix(""); + } + + @Override + public Collection getServerStatusesByPrefix(String prefix) { Collection servers = new HashSet(); - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _readPool.getResource(); try { @@ -61,8 +75,11 @@ public class RedisServerRepository implements ServerRepository List> responses = new ArrayList>(); for (String serverName : getActiveNames(setKey)) { - String dataKey = concatenate(setKey, serverName); - responses.add(pipeline.get(dataKey)); + if (prefix.isEmpty() || serverName.startsWith(prefix)) + { + String dataKey = concatenate(setKey, serverName); + responses.add(pipeline.get(dataKey)); + } } pipeline.sync(); @@ -81,20 +98,20 @@ public class RedisServerRepository implements ServerRepository catch (JedisConnectionException exception) { exception.printStackTrace(); - _jedisPool.returnBrokenResource(jedis); + _readPool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { - _jedisPool.returnResource(jedis); + _readPool.returnResource(jedis); } } return servers; } - + @Override public Collection getServersByGroup(String serverGroup) { @@ -115,7 +132,7 @@ public class RedisServerRepository implements ServerRepository public MinecraftServer getServerStatus(String serverName) { MinecraftServer server = null; - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _readPool.getResource(); try { @@ -127,14 +144,14 @@ public class RedisServerRepository implements ServerRepository catch (JedisConnectionException exception) { exception.printStackTrace(); - _jedisPool.returnBrokenResource(jedis); + _readPool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { - _jedisPool.returnResource(jedis); + _readPool.returnResource(jedis); } } @@ -144,7 +161,7 @@ public class RedisServerRepository implements ServerRepository @Override public void updataServerStatus(MinecraftServer serverData, int timeout) { - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _writePool.getResource(); try { @@ -162,14 +179,14 @@ public class RedisServerRepository implements ServerRepository catch (JedisConnectionException exception) { exception.printStackTrace(); - _jedisPool.returnBrokenResource(jedis); + _writePool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { - _jedisPool.returnResource(jedis); + _writePool.returnResource(jedis); } } } @@ -177,7 +194,7 @@ public class RedisServerRepository implements ServerRepository @Override public void removeServerStatus(MinecraftServer serverData) { - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _writePool.getResource(); try { @@ -193,14 +210,14 @@ public class RedisServerRepository implements ServerRepository catch (JedisConnectionException exception) { exception.printStackTrace(); - _jedisPool.returnBrokenResource(jedis); + _writePool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { - _jedisPool.returnResource(jedis); + _writePool.returnResource(jedis); } } } @@ -215,7 +232,7 @@ public class RedisServerRepository implements ServerRepository public Collection getDedicatedServers() { Collection servers = new HashSet(); - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _readPool.getResource(); try { @@ -254,14 +271,14 @@ public class RedisServerRepository implements ServerRepository catch (JedisConnectionException exception) { exception.printStackTrace(); - _jedisPool.returnBrokenResource(jedis); + _readPool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { - _jedisPool.returnResource(jedis); + _readPool.returnResource(jedis); } } @@ -272,7 +289,7 @@ public class RedisServerRepository implements ServerRepository public Collection getServerGroups(Collection serverStatuses) { Collection servers = new HashSet(); - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _readPool.getResource(); try { @@ -311,14 +328,14 @@ public class RedisServerRepository implements ServerRepository catch (JedisConnectionException exception) { exception.printStackTrace(); - _jedisPool.returnBrokenResource(jedis); + _readPool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { - _jedisPool.returnResource(jedis); + _readPool.returnResource(jedis); } } @@ -333,7 +350,7 @@ public class RedisServerRepository implements ServerRepository protected Set getActiveNames(String key) { Set names = new HashSet(); - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _readPool.getResource(); try { @@ -344,14 +361,14 @@ public class RedisServerRepository implements ServerRepository catch (JedisConnectionException exception) { exception.printStackTrace(); - _jedisPool.returnBrokenResource(jedis); + _readPool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { - _jedisPool.returnResource(jedis); + _readPool.returnResource(jedis); } } @@ -365,7 +382,7 @@ public class RedisServerRepository implements ServerRepository protected Set getDeadNames(String key) { Set names = new HashSet(); - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _readPool.getResource(); try { @@ -376,14 +393,14 @@ public class RedisServerRepository implements ServerRepository catch (JedisConnectionException exception) { exception.printStackTrace(); - _jedisPool.returnBrokenResource(jedis); + _readPool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { - _jedisPool.returnResource(jedis); + _readPool.returnResource(jedis); } } @@ -404,7 +421,7 @@ public class RedisServerRepository implements ServerRepository public Collection getDeadServers() { Set servers = new HashSet(); - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _readPool.getResource(); try { @@ -434,14 +451,14 @@ public class RedisServerRepository implements ServerRepository catch (JedisConnectionException exception) { exception.printStackTrace(); - _jedisPool.returnBrokenResource(jedis); + _readPool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { - _jedisPool.returnResource(jedis); + _readPool.returnResource(jedis); } } @@ -451,7 +468,7 @@ public class RedisServerRepository implements ServerRepository @Override public void updateServerGroup(ServerGroup serverGroup) { - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _writePool.getResource(); try { @@ -469,14 +486,14 @@ public class RedisServerRepository implements ServerRepository catch (JedisConnectionException exception) { exception.printStackTrace(); - _jedisPool.returnBrokenResource(jedis); + _writePool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { - _jedisPool.returnResource(jedis); + _writePool.returnResource(jedis); } } } @@ -484,7 +501,7 @@ public class RedisServerRepository implements ServerRepository @Override public void removeServerGroup(ServerGroup serverGroup) { - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _writePool.getResource(); try { @@ -500,14 +517,14 @@ public class RedisServerRepository implements ServerRepository catch (JedisConnectionException exception) { exception.printStackTrace(); - _jedisPool.returnBrokenResource(jedis); + _writePool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { - _jedisPool.returnResource(jedis); + _writePool.returnResource(jedis); } } } @@ -516,7 +533,7 @@ public class RedisServerRepository implements ServerRepository public ServerGroup getServerGroup(String serverGroup) { ServerGroup server = null; - Jedis jedis = _jedisPool.getResource(); + Jedis jedis = _readPool.getResource(); try { String key = concatenate("servergroups", serverGroup); @@ -527,20 +544,20 @@ public class RedisServerRepository implements ServerRepository catch (JedisConnectionException exception) { exception.printStackTrace(); - _jedisPool.returnBrokenResource(jedis); + _readPool.returnBrokenResource(jedis); jedis = null; } finally { if (jedis != null) { - _jedisPool.returnResource(jedis); + _readPool.returnResource(jedis); } } return server; } - + /* * = "US" or "EU" * serverstatus.minecraft.. stores the JSON encoded information of an active MinecraftServer instance. diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/servers/ConnectionData.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/servers/ConnectionData.java new file mode 100644 index 000000000..efb265fc1 --- /dev/null +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/servers/ConnectionData.java @@ -0,0 +1,28 @@ +package mineplex.serverdata.servers; + +/** + * ConnectionData stores information relevant for initiating a connection to a repository. + * @author MrTwiggy + * + */ +public class ConnectionData +{ + + private String _host; // The host URL to connect to repository + public String getHost() { return _host; } + + private int _port; // The port to connect to repository + public int getPort() { return _port; } + + /** + * Constructor + * @param host - the host URL defining the repository + * @param port - the port used for connection to repository + */ + public ConnectionData(String host, int port) + { + _host = host; + _port = port; + } +} + diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/DedicatedServerSorter.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/servers/DedicatedServerSorter.java similarity index 87% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/DedicatedServerSorter.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/servers/DedicatedServerSorter.java index f6ef77ed6..8f5b6853f 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/DedicatedServerSorter.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/servers/DedicatedServerSorter.java @@ -1,7 +1,9 @@ -package mineplex.serverdata; +package mineplex.serverdata.servers; import java.util.Comparator; +import mineplex.serverdata.data.DedicatedServer; + public class DedicatedServerSorter implements Comparator { @Override diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/servers/ServerManager.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/servers/ServerManager.java new file mode 100644 index 000000000..81a87c6a4 --- /dev/null +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/servers/ServerManager.java @@ -0,0 +1,71 @@ +package mineplex.serverdata.servers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +import mineplex.serverdata.Region; +import mineplex.serverdata.redis.RedisServerRepository; + +/** + * ServerManager handles the creation/management of {@link ServerRepository}s for use. + * @author Ty + * + */ +public class ServerManager +{ + + // Connection host to server database + private static final String DATABASE_HOST = "10.33.53.16"; + + // Ports associated with slave redis instances + private static final int[] SLAVE_PORTS = {6377, 6378, 6380, 6381, 6382}; + private static Random random = new Random(); + + // The cached repository instances + private static Map repositories = new HashMap(); + + /** + * @param host - the host url used to connect to the database + * @param port - the port to connect to the repository + * @param region - the geographical region of the {@link ServerRepository}. + * @return a newly instanced (or cached) {@link ServerRepository} for the specified {@code region}. + */ + public static ServerRepository getServerRepository(ConnectionData writeConn, ConnectionData readConn, Region region) + { + if (repositories.containsKey(region)) return repositories.get(region); + + ServerRepository repository = new RedisServerRepository(writeConn, readConn, region); + repositories.put(region, repository); + return repository; + } + + /** + * {@code host} defaults to {@value DEFAULT_REDIS_HOST} and + * {@code port} defaults to {@value DEFAULT_REDIS_PORT}. + * + * @see #getServerRepository(String, int, Region) + */ + public static ServerRepository getServerRepository(Region region) + { + return getServerRepository(getMasterConnection(), getSlaveConnection(), region); + } + + /** + * @return the {@link ConnectionData} associated with the master instance connection. + */ + public static ConnectionData getMasterConnection() + { + return new ConnectionData(DATABASE_HOST, 6379); + } + + /** + * Non-Deterministic: Generates random slave instance connection. + * @return the {@link ConnectionData} associated with a random slave connection. + */ + public static ConnectionData getSlaveConnection() + { + int port = SLAVE_PORTS[random.nextInt(SLAVE_PORTS.length)]; + return new ConnectionData(DATABASE_HOST, port); + } +} diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/ServerRepository.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/servers/ServerRepository.java similarity index 89% rename from Plugins/Mineplex.ServerData/src/mineplex/serverdata/ServerRepository.java rename to Plugins/Mineplex.ServerData/src/mineplex/serverdata/servers/ServerRepository.java index cd5e4a881..37b119766 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/ServerRepository.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/servers/ServerRepository.java @@ -1,6 +1,11 @@ -package mineplex.serverdata; +package mineplex.serverdata.servers; import java.util.Collection; +import java.util.List; + +import mineplex.serverdata.data.DedicatedServer; +import mineplex.serverdata.data.MinecraftServer; +import mineplex.serverdata.data.ServerGroup; /** * The ServerRepository is used for storing/retrieving active sessions @@ -18,6 +23,8 @@ public interface ServerRepository */ public Collection getServerStatuses(); + public Collection getServerStatusesByPrefix(String prefix); + public Collection getServersByGroup(String serverGroup); /** @@ -70,5 +77,4 @@ public interface ServerRepository void updateServerGroup(ServerGroup serverGroup); public void removeServerGroup(ServerGroup serverGroup); - } diff --git a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/MinecraftPing.java b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/MinecraftPing.java new file mode 100644 index 000000000..e101cc0c7 --- /dev/null +++ b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/MinecraftPing.java @@ -0,0 +1,102 @@ +package mineplex.servermonitor; + +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; +import com.google.gson.Gson; + +public class MinecraftPing { + + /** + * Fetches a {@link MinecraftPingReply} for the supplied hostname. + * Assumed timeout of 2s and port of 25565. + * + * @param hostname - a valid String hostname + * @return {@link MinecraftPingReply} + * @throws IOException + */ + public MinecraftPingReply getPing(final String hostname) throws IOException { + return this.getPing(new MinecraftPingOptions().setHostname(hostname)); + } + + /** + * Fetches a {@link MinecraftPingReply} for the supplied options. + * + * @param options - a filled instance of {@link MinecraftPingOptions} + * @return {@link MinecraftPingReply} + * @throws IOException + */ + public MinecraftPingReply getPing(final MinecraftPingOptions options) throws IOException { + MinecraftPingUtil.validate(options.getHostname(), "Hostname cannot be null."); + MinecraftPingUtil.validate(options.getPort(), "Port cannot be null."); + + final Socket socket = new Socket(); + socket.connect(new InetSocketAddress(options.getHostname(), options.getPort()), options.getTimeout()); + + final DataInputStream in = new DataInputStream(socket.getInputStream()); + final DataOutputStream out = new DataOutputStream(socket.getOutputStream()); + + //> Handshake + + ByteArrayOutputStream handshake_bytes = new ByteArrayOutputStream(); + DataOutputStream handshake = new DataOutputStream(handshake_bytes); + + handshake.writeByte(MinecraftPingUtil.PACKET_HANDSHAKE); + MinecraftPingUtil.writeVarInt(handshake, MinecraftPingUtil.PROTOCOL_VERSION); + MinecraftPingUtil.writeVarInt(handshake, options.getHostname().length()); + handshake.writeBytes(options.getHostname()); + handshake.writeShort(options.getPort()); + MinecraftPingUtil.writeVarInt(handshake, MinecraftPingUtil.STATUS_HANDSHAKE); + + MinecraftPingUtil.writeVarInt(out, handshake_bytes.size()); + out.write(handshake_bytes.toByteArray()); + + //> Status request + + out.writeByte(0x01); // Size of packet + out.writeByte(MinecraftPingUtil.PACKET_STATUSREQUEST); + + //< Status response + + MinecraftPingUtil.readVarInt(in); // Size + int id = MinecraftPingUtil.readVarInt(in); + + MinecraftPingUtil.io(id == -1, "Server prematurely ended stream."); + MinecraftPingUtil.io(id != MinecraftPingUtil.PACKET_STATUSREQUEST, "Server returned invalid packet."); + + int length = MinecraftPingUtil.readVarInt(in); + MinecraftPingUtil.io(length == -1, "Server prematurely ended stream."); + MinecraftPingUtil.io(length == 0, "Server returned unexpected value."); + + byte[] data = new byte[length]; + in.readFully(data); + String json = new String(data, options.getCharset()); + + //> Ping + + out.writeByte(0x09); // Size of packet + out.writeByte(MinecraftPingUtil.PACKET_PING); + out.writeLong(System.currentTimeMillis()); + + //< Ping + + MinecraftPingUtil.readVarInt(in); // Size + id = MinecraftPingUtil.readVarInt(in); + MinecraftPingUtil.io(id == -1, "Server prematurely ended stream."); + //MinecraftPingUtil.io(id != MinecraftPingUtil.PACKET_PING, "Server returned invalid packet."); + + // Close + + handshake.close(); + handshake_bytes.close(); + out.close(); + in.close(); + socket.close(); + + return new Gson().fromJson(json, MinecraftPingReply.class); + } + +} \ No newline at end of file diff --git a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/MinecraftPingOptions.java b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/MinecraftPingOptions.java new file mode 100644 index 000000000..1cbe0a4da --- /dev/null +++ b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/MinecraftPingOptions.java @@ -0,0 +1,45 @@ +package mineplex.servermonitor; + +public class MinecraftPingOptions +{ + private String hostname; + private int port = 25565; + private int timeout = 2000; + private String charset = "UTF-8"; + + public MinecraftPingOptions setHostname(String hostname) { + this.hostname = hostname; + return this; + } + + public MinecraftPingOptions setPort(int port) { + this.port = port; + return this; + } + + public MinecraftPingOptions setTimeout(int timeout) { + this.timeout = timeout; + return this; + } + + public MinecraftPingOptions setCharset(String charset) { + this.charset = charset; + return this; + } + + public String getHostname() { + return this.hostname; + } + + public int getPort() { + return this.port; + } + + public int getTimeout() { + return this.timeout; + } + + public String getCharset() { + return this.charset; + } +} diff --git a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/MinecraftPingReply.java b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/MinecraftPingReply.java new file mode 100644 index 000000000..f6aecde32 --- /dev/null +++ b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/MinecraftPingReply.java @@ -0,0 +1,103 @@ +package mineplex.servermonitor; + +import java.util.List; + +public class MinecraftPingReply { + + private String description; + private Players players; + private Version version; + private String favicon; + + /** + * @return the MOTD + */ + public String getDescription() { + return this.description; + } + + public Players getPlayers() { + return this.players; + } + + /** + * @return @{link Version} + */ + public Version getVersion() { + return this.version; + } + + /** + * @return Base64 encoded favicon image + */ + public String getFavicon() { + return this.favicon; + } + + public class Players { + private int max; + private int online; + private List sample; + + /** + * @return Maximum player count + */ + public int getMax() { + return this.max; + } + + /** + * @return Online player count + */ + public int getOnline() { + return this.online; + } + + /** + * @return List of some players (if any) specified by server + */ + public List getSample() { + return this.sample; + } + } + + public class Player { + private String name; + private String id; + + /** + * @return Name of player + */ + public String getName() { + return this.name; + } + + /** + * @return Unknown + */ + public String getId() { + return this.id; + } + + } + + public class Version { + private String name; + private int protocol; + + /** + * @return Version name (ex: 13w41a) + */ + public String getName() { + return this.name; + } + + /** + * @return Protocol version + */ + public int getProtocol() { + return this.protocol; + } + } + +} diff --git a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/MinecraftPingUtil.java b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/MinecraftPingUtil.java new file mode 100644 index 000000000..11a01db51 --- /dev/null +++ b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/MinecraftPingUtil.java @@ -0,0 +1,63 @@ +package mineplex.servermonitor; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +public class MinecraftPingUtil { + + public static byte PACKET_HANDSHAKE = 0x00, PACKET_STATUSREQUEST = 0x00, PACKET_PING = 0x01; + public static int PROTOCOL_VERSION = 4; + public static int STATUS_HANDSHAKE = 1; + + public static void validate(final Object o, final String m) + { + if (o == null) + { + throw new RuntimeException(m); + } + } + + public static void io(final boolean b, final String m) throws IOException + { + if (b) + { + throw new IOException(m); + } + } + + public static int readVarInt(DataInputStream in) throws IOException + { + int i = 0; + int j = 0; + while (true) { + int k = in.readByte(); + + i |= (k & 0x7F) << j++ * 7; + + if (j > 5) + throw new RuntimeException("VarInt too big"); + + if ((k & 0x80) != 128) + break; + } + + return i; + } + + public static void writeVarInt(DataOutputStream out, int paramInt) throws IOException + { + while (true) + { + if ((paramInt & 0xFFFFFF80) == 0) + { + out.writeByte(paramInt); + return; + } + + out.writeByte(paramInt & 0x7F | 0x80); + paramInt >>>= 7; + } + } + +} diff --git a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java index beab18166..889dd4ef4 100644 --- a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java +++ b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerMonitor.java @@ -20,15 +20,15 @@ import java.util.logging.FileHandler; import java.util.logging.Logger; import mineplex.core.common.util.NautHashMap; -import mineplex.serverdata.DedicatedServer; -import mineplex.serverdata.DedicatedServerSorter; -import mineplex.serverdata.MinecraftServer; import mineplex.serverdata.Region; -import mineplex.serverdata.ServerGroup; -import mineplex.serverdata.ServerManager; -import mineplex.serverdata.ServerRepository; -import mineplex.serverdata.transfers.RestartCommand; -import mineplex.serverdata.transfers.SuicideCommand; +import mineplex.serverdata.commands.RestartCommand; +import mineplex.serverdata.commands.SuicideCommand; +import mineplex.serverdata.data.DedicatedServer; +import mineplex.serverdata.data.MinecraftServer; +import mineplex.serverdata.data.ServerGroup; +import mineplex.serverdata.servers.DedicatedServerSorter; +import mineplex.serverdata.servers.ServerManager; +import mineplex.serverdata.servers.ServerRepository; public class ServerMonitor { @@ -54,6 +54,18 @@ public class ServerMonitor public static void main (String args[]) { + /* + MinecraftPingReply data = null; + try + { + data = new MinecraftPing().getPing(new MinecraftPingOptions().setHostname("127.0.0.1").setPort(25565)); + } + catch (IOException e2) + { + e2.printStackTrace(); + } + System.out.println(data.getDescription() + " " + data.getPlayers().getOnline()); + */ _region = !new File("eu.dat").exists() ? Region.US : Region.EU; _debug = new File("debug.dat").exists(); _repository = ServerManager.getServerRepository(_region); // Fetches and connects to server repo @@ -169,7 +181,7 @@ public class ServerMonitor log("Saved Dedicated Server Stats."); _historyRepository.saveServerGroupStats((int)totalCPU, (int)totalRAM, _serverGroupMap.values()); log("Saved ServerGroup Stats."); - _historyRepository.saveNetworkStats(usedCpuPercent, usedRamPercent, availableCPU, availableRAM, _region); + //_historyRepository.saveNetworkStats(usedCpuPercent, usedRamPercent, availableCPU, availableRAM, _region); log("Saved Network Stats."); for (ServerGroup groupStatus : _serverGroups) @@ -218,6 +230,9 @@ public class ServerMonitor for (MinecraftServer minecraftServer : _serverStatuses) { + if (minecraftServer.getGroup().equalsIgnoreCase("Testing")) + continue; + onlineServers.add(minecraftServer.getName()); if (minecraftServer.getTps() <= 17) @@ -357,10 +372,10 @@ public class ServerMonitor _deadServers.clear(); for (MinecraftServer deadServer : _repository.getDeadServers()) { - if (deadServer.getUptime() <= 10) + if (deadServer.getUptime() <= 10 || deadServer.getGroup().equalsIgnoreCase("Testing")) continue; - if (deadServers.contains(deadServer.getName())) + if (_count == 0 || deadServers.contains(deadServer.getName())) { killServer(deadServer.getName(), deadServer.getPublicAddress(), deadServer.getPlayerCount(), "[KILLED] [DEAD] " + deadServer.getName() + ":" + deadServer.getPublicAddress(), true); @@ -415,6 +430,7 @@ public class ServerMonitor if (availableSlots < 1500) { serversToAdd = Math.max(1, (1500 - availableSlots) / serverGroup.getMaxPlayers()); + serversToAdd = Math.min(250 - totalServers, serversToAdd); serversToKill = 0; } else if (serversToKill > 0) @@ -427,6 +443,8 @@ public class ServerMonitor if (serversToRestart <= 5) serversToRestart = 0; } + + } else if (serverGroup.getName().equalsIgnoreCase("Halloween")) { @@ -452,6 +470,10 @@ public class ServerMonitor if (joinableServers > maxUHC) serversToKill = maxUHC - joinableServers; } + else if (serverGroup.getName().equalsIgnoreCase("Testing")) + { + return; + } // KILL, CLEAN, THEN ADD while (serversToKill > 0) @@ -476,12 +498,12 @@ public class ServerMonitor if (bestServer == null) { - System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!! NO DEDICATED SERVER AVAILABLE FOR GROUP " + serverGroup.getName() + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + log("!!!!!!!!!!!!!!!!!!!!!!!!!!!! NO DEDICATED SERVER AVAILABLE FOR GROUP " + serverGroup.getName() + " !!!!!!!!!!!!!!!!!!!!!!!!!!!!"); break; } if (serverTracker.containsKey(serverGroup.getPrefix() + "-" + serverNum)) - System.out.println("[WAITING] On " + serverGroup.getPrefix() + "-" + serverNum + " to finish starting..."); + log("[WAITING] On " + serverGroup.getPrefix() + "-" + serverNum + " to finish starting..."); else { startServer(bestServer, serverGroup, serverNum, free); @@ -540,7 +562,7 @@ public class ServerMonitor try { - pr.join(500); + pr.join(50); } catch (InterruptedException e1) { @@ -625,7 +647,7 @@ public class ServerMonitor final String serverName = serverSpace.getName(); final String serverAddress = serverSpace.getPublicAddress(); - ProcessRunner pr = new ProcessRunner(new String[] {"/bin/sh", cmd, serverAddress, serverSpace.getPrivateAddress(), (serverGroup.getPortSection() + serverNum) + "", serverGroup.getRequiredRam() + "", serverGroup.getWorldZip(), serverGroup.getPlugin(), serverGroup.getConfigPath(), serverGroup.getName(), serverGroup.getPrefix() + "-" + serverNum, serverSpace.isUsRegion() ? "true" : "false", serverGroup.getAddNoCheat() + "" }); + ProcessRunner pr = new ProcessRunner(new String[] {"/bin/sh", cmd, serverAddress, serverSpace.getPrivateAddress(), (serverGroup.getPortSection() + serverNum) + "", serverGroup.getRequiredRam() + "", serverGroup.getWorldZip(), serverGroup.getPlugin(), serverGroup.getConfigPath(), serverGroup.getName(), serverGroup.getPrefix() + "-" + serverNum, serverSpace.isUsRegion() ? "true" : "false", serverGroup.getAddNoCheat() + "", serverGroup.getAddWorldEdit() + "" }); pr.start(new GenericRunnable() { public void run(Boolean error) @@ -640,7 +662,7 @@ public class ServerMonitor try { - pr.join(500); + pr.join(100); } catch (InterruptedException e1) { diff --git a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerSorter.java b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerSorter.java index 9f07a6127..06ea39063 100644 --- a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerSorter.java +++ b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/ServerSorter.java @@ -2,7 +2,7 @@ package mineplex.servermonitor; import java.util.Comparator; -import mineplex.serverdata.MinecraftServer; +import mineplex.serverdata.data.MinecraftServer; public class ServerSorter implements Comparator { diff --git a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/StatusHistoryRepository.java b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/StatusHistoryRepository.java index 8917d302a..e2f94098c 100644 --- a/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/StatusHistoryRepository.java +++ b/Plugins/Mineplex.ServerMonitor/src/mineplex/servermonitor/StatusHistoryRepository.java @@ -9,15 +9,14 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import mineplex.serverdata.DedicatedServer; import mineplex.serverdata.Region; -import mineplex.serverdata.ServerGroup; +import mineplex.serverdata.data.DedicatedServer; +import mineplex.serverdata.data.ServerGroup; import mineplex.servermonitor.data.BungeeStatusData; public class StatusHistoryRepository { private String _connectionString = "jdbc:mysql://sqlstats.mineplex.com:3306/ServerStats"; - private String _bungeeConnectionString = "jdbc:mysql://db.mineplex.com:3306/BungeeServers"; private String _userName = "root"; private String _password = "tAbechAk3wR7tuTh"; @@ -47,9 +46,6 @@ public class StatusHistoryRepository if (_connection == null || _connection.isClosed()) _connection = DriverManager.getConnection(_connectionString, _userName, _password); - if (_bungeeconnection == null || _bungeeconnection.isClosed()) - _bungeeconnection = DriverManager.getConnection(_bungeeConnectionString, _userName, _password); - // Create table preparedStatement = _connection.prepareStatement(CREATE_GROUP_TABLE); preparedStatement.execute(); @@ -152,8 +148,8 @@ public class StatusHistoryRepository for (DedicatedServer dedicatedServer : dedicatedServers) { - double usedCpu = (1d - (double)dedicatedServer.getAvailableCpu() / (double)dedicatedServer.getMaxCpu()) * 100d; - double usedRam = (1d - (double)dedicatedServer.getAvailableRam() / (double)dedicatedServer.getMaxRam()) * 100d; + double usedCpu = dedicatedServer.getMaxCpu() == 0 ? 0 : (1d - (double)dedicatedServer.getAvailableCpu() / (double)dedicatedServer.getMaxCpu()) * 100d; + double usedRam = dedicatedServer.getMaxRam() == 0 ? 0 : (1d - (double)dedicatedServer.getAvailableRam() / (double)dedicatedServer.getMaxRam()) * 100d; preparedStatement.setString(1, dedicatedServer.getName()); preparedStatement.setString(2, dedicatedServer.getPrivateAddress()); @@ -189,6 +185,7 @@ public class StatusHistoryRepository public void saveNetworkStats(double usedCpuPercent, double usedRamPercent, double availableCPU, double availableRAM, Region region) { + /* int totalPlayers = 0; List bungeeStatuses = new ArrayList(); @@ -318,5 +315,6 @@ public class StatusHistoryRepository } } } + */ } } diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java index 290de3835..73917dafe 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/StaffServer.java @@ -1,5 +1,7 @@ package mineplex.staffServer; +import java.util.UUID; + import mineplex.core.account.CoreClientManager; import mineplex.core.antihack.AntiHack; import mineplex.core.chat.Chat; @@ -74,9 +76,16 @@ public class StaffServer extends JavaPlugin Bukkit.getWorlds().get(0).setSpawnLocation(0, 102, 0); ((CraftServer)getServer()).setWhitelist(true); - ((CraftServer)getServer()).getHandle().addWhitelist(new ProfileLoader(UUIDFetcher.getUUIDOf("NDrew").toString(), "NDrew").loadProfile()); - ((CraftServer)getServer()).getHandle().addWhitelist(new ProfileLoader(UUIDFetcher.getUUIDOf("Morena").toString(), "Morena").loadProfile()); - ((CraftServer)getServer()).getHandle().addWhitelist(new ProfileLoader(UUIDFetcher.getUUIDOf("Revolark").toString(), "Revolark").loadProfile()); - ((CraftServer)getServer()).getHandle().addWhitelist(new ProfileLoader(UUIDFetcher.getUUIDOf("EvilEsther").toString(), "EvilEsther").loadProfile()); + + ((CraftServer)getServer()).getHandle().addWhitelist(new GameProfile(UUID.fromString("377bdea3-badc-448d-81c1-65db43b17ea4"), "Strutt20")); + ((CraftServer)getServer()).getHandle().addWhitelist(new GameProfile(UUID.fromString("cf1b629c-cc55-4eb4-be9e-3ca86dfc7b9d"), "mannalou")); + ((CraftServer)getServer()).getHandle().addWhitelist(new GameProfile(UUID.fromString("04a484d0-93e0-4777-a70c-808046917e3a"), "EvilEsther")); + ((CraftServer)getServer()).getHandle().addWhitelist(new GameProfile(UUID.fromString("adaa7613-6683-400f-baf8-7272c04b2cb4"), "Timmy48081_")); + ((CraftServer)getServer()).getHandle().addWhitelist(new GameProfile(UUID.fromString("2d5fd31b-0aa5-41db-a62d-a4611a24349a"), "ishh")); + ((CraftServer)getServer()).getHandle().addWhitelist(new GameProfile(UUID.fromString("1def99f1-ae43-4917-a5dc-138dc73aaf36"), "FireStar891")); + ((CraftServer)getServer()).getHandle().addWhitelist(new GameProfile(UUID.fromString("a133d8bf-128c-47e1-b63c-33c278371593"), "blondebug")); + ((CraftServer)getServer()).getHandle().addWhitelist(new GameProfile(UUID.fromString("52eb645e-58e8-4a3f-a7dc-5c7a5e382232"), "blackfiend")); + ((CraftServer)getServer()).getHandle().addWhitelist(new GameProfile(UUID.fromString("0c4dd677-8e84-4755-8e66-f426a16b55bd"), "axegirl")); + ((CraftServer)getServer()).getHandle().addWhitelist(new GameProfile(UUID.fromString("d3965dbc-f9cc-4e5d-9306-5be2a23ad6cb"), "Dooskee")); } } diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/customerSupport/CustomerSupport.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/customerSupport/CustomerSupport.java index 49f82a18c..bc9c5ca94 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/customerSupport/CustomerSupport.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/customerSupport/CustomerSupport.java @@ -103,9 +103,7 @@ public class CustomerSupport extends MiniPlugin caller.sendMessage(C.cBlue + "Coins : " + C.cYellow + donor.getCoins()); caller.sendMessage(C.cBlue + "Gems : " + C.cYellow + donor.GetGems()); - int coinTransactionTotal = 0; int enjinCoinsReceived = 0; - int coinSpentTotal = 0; int oldChestsReceived = 0; int ancientChestsReceived = 0; int mythicalChestsReceived = 0; @@ -114,8 +112,6 @@ public class CustomerSupport extends MiniPlugin { if (transaction.Source.equalsIgnoreCase("Poll") || transaction.Source.equalsIgnoreCase("Halloween Pumpkin") || transaction.Source.equalsIgnoreCase("Treasure Chest") || transaction.Source.equalsIgnoreCase("Coin Party Bomb Pickup") || transaction.Source.contains("Reward") || transaction.Source.contains("purchase")) { - coinTransactionTotal += transaction.Amount; - if (transaction.Source.contains("purchase")) enjinCoinsReceived += transaction.Amount; } @@ -123,8 +119,6 @@ public class CustomerSupport extends MiniPlugin for (TransactionToken transaction : donor.getTransactions()) { - coinSpentTotal += transaction.Coins; - if (transaction.SalesPackageName.startsWith("Old Chest")) { if (transaction.Coins == 0 && transaction.Gems == 0) @@ -165,15 +159,6 @@ public class CustomerSupport extends MiniPlugin caller.sendMessage(C.cBlue + "Ancient Chests Received : " + C.cYellow + ancientChestsReceived); caller.sendMessage(C.cBlue + "Mythical Chests Received : " + C.cYellow + mythicalChestsReceived); - int coinsMissing = coinTransactionTotal - (donor.getCoins() + coinSpentTotal); - - if (coinsMissing > 0) - { - caller.sendMessage(C.cRed + "Coins missing!"); - new JsonMessage("[").color("blue").extra(C.cGreen + "Apply Missing Coins").color("green").click("run_command", "/sales coin " + playerName + " " + coinsMissing) - .add("] ").color("blue").add("Missing Coins.").color("yellow").sendToPlayer(caller); - } - caller.sendMessage(C.cDGreen + C.Strike + "============================================="); _salesPackageManager.displaySalesPackages(caller, playerName); caller.sendMessage(C.cDGreen + C.Strike + "============================================="); diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/PasswordRepository.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/PasswordRepository.java index 796bde45d..20cb041e0 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/PasswordRepository.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/password/PasswordRepository.java @@ -7,6 +7,7 @@ import java.util.List; import org.bukkit.plugin.java.JavaPlugin; +import mineplex.core.database.DBPool; import mineplex.core.database.RepositoryBase; import mineplex.core.database.ResultSetCallable; import mineplex.core.database.column.ColumnVarChar; @@ -23,8 +24,7 @@ public class PasswordRepository extends RepositoryBase public PasswordRepository(JavaPlugin plugin, String serverName) { - super(plugin, "jdbc:mysql://db.mineplex.com:3306/Account?autoReconnect=true&failOverReadOnly=false&maxReconnects=10", "root", "tAbechAk3wR7tuTh"); - + super(plugin, DBPool.ACCOUNT); _serverName = serverName; } diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/SalesPackageManager.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/SalesPackageManager.java index 8e6b656fc..e3ef2eba3 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/SalesPackageManager.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/SalesPackageManager.java @@ -15,6 +15,8 @@ import mineplex.staffServer.salespackage.command.Sales; import mineplex.staffServer.salespackage.salespackages.AncientChest; import mineplex.staffServer.salespackage.salespackages.ApplyKits; import mineplex.staffServer.salespackage.salespackages.Coins; +import mineplex.staffServer.salespackage.salespackages.DefaultRank; +import mineplex.staffServer.salespackage.salespackages.EasterBunny; import mineplex.staffServer.salespackage.salespackages.FrostLord; import mineplex.staffServer.salespackage.salespackages.GemHunter; import mineplex.staffServer.salespackage.salespackages.LifetimeHero; @@ -49,6 +51,7 @@ public class SalesPackageManager extends MiniPlugin AddSalesPackage(new Coins(this, 75000)); AddSalesPackage(new MonthlyUltra(this)); AddSalesPackage(new MonthlyHero(this)); + AddSalesPackage(new DefaultRank(this)); AddSalesPackage(new LifetimeUltra(this)); AddSalesPackage(new LifetimeHero(this)); AddSalesPackage(new LifetimeLegend(this)); @@ -59,6 +62,7 @@ public class SalesPackageManager extends MiniPlugin AddSalesPackage(new AncientChest(this)); AddSalesPackage(new MythicalChest(this)); AddSalesPackage(new FrostLord(this)); + AddSalesPackage(new EasterBunny(this)); } private void AddSalesPackage(SalesPackageBase salesPackage) diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/CoinCommand.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/CoinCommand.java index 6d9d2087f..cd977bf80 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/CoinCommand.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/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.F; @@ -18,20 +19,28 @@ public class CoinCommand extends CommandBase } @Override - public void Execute(Player caller, String[] args) + public void Execute(final Player caller, String[] args) { if (args == null || args.length != 2) return; - String playerName = args[0]; - int amount = Integer.parseInt(args[1]); + final String playerName = args[0]; + final int amount = Integer.parseInt(args[1]); - UUID uuid = Plugin.getClientManager().loadUUIDFromDB(playerName); - - if (uuid == null) - UUIDFetcher.getUUIDOf(playerName); - - Plugin.getDonationManager().RewardCoins(null, caller.getName(), playerName, uuid, amount); - caller.sendMessage(F.main(Plugin.getName(), "Added " + amount + " coins to " + playerName + "'s account!")); + Plugin.getClientManager().loadClientByName(playerName, new Runnable() + { + public void run() + { + CoreClient client = Plugin.getClientManager().Get(playerName); + + if (client != null) + { + Plugin.getDonationManager().RewardCoins(null, caller.getName(), playerName, client.getAccountId(), amount); + caller.sendMessage(F.main(Plugin.getName(), "Added " + amount + " coins to " + playerName + "'s account!")); + } + else + caller.sendMessage(F.main(Plugin.getName(), "Couldn't find " + playerName + "'s account!")); + } + }); } } diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/GemHunterCommand.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/GemHunterCommand.java index d5c2bb514..87d3749a7 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/GemHunterCommand.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/GemHunterCommand.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.F; @@ -18,26 +19,37 @@ public class GemHunterCommand extends CommandBase } @Override - public void Execute(Player caller, String[] args) + public void Execute(final Player caller, String[] args) { if (args == null || args.length != 2) return; - String playerName = args[0]; - int amount = Integer.parseInt(args[1]); - int experience = 0; - UUID uuid = Plugin.getClientManager().loadUUIDFromDB(playerName); + final String playerName = args[0]; + final int amount = Integer.parseInt(args[1]); + int tempExp = 0; - if (uuid == null) - UUIDFetcher.getUUIDOf(playerName); - if (amount == 4) - experience = 70000; + tempExp = 70000; else if (amount == 8) - experience = 220000; + tempExp = 220000; - Plugin.getDonationManager().PurchaseUnknownSalesPackage(null, playerName, uuid, "Gem Hunter Level " + amount, false, 0, false); - Plugin.getStatsManager().incrementStat(uuid.toString(), "Global.GemsEarned", experience); - caller.sendMessage(F.main(Plugin.getName(), "Added Level " + amount + " Gem Hunter to " + playerName + "'s account!")); + final int experience = tempExp; + + Plugin.getClientManager().loadClientByName(playerName, new Runnable() + { + public void run() + { + CoreClient client = Plugin.getClientManager().Get(playerName); + + if (client != null) + { + Plugin.getDonationManager().PurchaseUnknownSalesPackage(null, playerName, client.getAccountId(), "Gem Hunter Level " + amount, false, 0, false); + Plugin.getStatsManager().incrementStat(client.getAccountId(), "Global.GemsEarned", experience); + caller.sendMessage(F.main(Plugin.getName(), "Added Level " + amount + " Gem Hunter to " + playerName + "'s account!")); + } + else + caller.sendMessage(F.main(Plugin.getName(), "Couldn't find " + playerName + "'s account!")); + } + }); } } diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/ItemCommand.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/ItemCommand.java index fa59c5699..336fd3c46 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/ItemCommand.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/ItemCommand.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; @@ -37,11 +38,6 @@ public class ItemCommand extends CommandBase } final String itemName = tempName; - final UUID uuid = Plugin.getClientManager().loadUUIDFromDB(playerName); - - if (uuid == null) - UUIDFetcher.getUUIDOf(playerName); - final int amount = amountSpecified; if (!Plugin.getInventoryManager().validCategory(category)) @@ -56,23 +52,37 @@ public class ItemCommand extends CommandBase return; } - Plugin.getDonationManager().PurchaseUnknownSalesPackage(new Callback() + Plugin.getClientManager().loadClientByName(playerName, new Runnable() { - public void run(TransactionResponse data) + public void run() { - Plugin.getInventoryManager().addItemToInventoryForOffline(new Callback() + final UUID uuid = Plugin.getClientManager().loadUUIDFromDB(playerName); + final CoreClient client = Plugin.getClientManager().Get(playerName); + + if (uuid != null) { - public void run(Boolean success) + Plugin.getDonationManager().PurchaseUnknownSalesPackage(new Callback() { - if (success) - UtilPlayer.message(caller, F.main(Plugin.getName(), playerName + " received " + amount + " " + itemName + ".")); - else + public void run(TransactionResponse data) { - UtilPlayer.message(caller, F.main(Plugin.getName(), "ERROR processing " + playerName + " " + amount + " " + itemName + ".")); + Plugin.getInventoryManager().addItemToInventoryForOffline(new Callback() + { + public void run(Boolean success) + { + if (success) + UtilPlayer.message(caller, F.main(Plugin.getName(), playerName + " received " + amount + " " + itemName + ".")); + else + { + UtilPlayer.message(caller, F.main(Plugin.getName(), "ERROR processing " + playerName + " " + amount + " " + itemName + ".")); + } + } + }, uuid, category, itemName, amount); } - } - }, uuid.toString(), category, itemName, amount); + }, playerName, client.getAccountId(), (amount == 1 ? itemName : itemName + " " + amount), false, 0, false); + } + else + caller.sendMessage(F.main(Plugin.getName(), "Couldn't find " + playerName + "'s account!")); } - }, playerName, uuid, (amount == 1 ? itemName : itemName + " " + amount), false, 0, false); + }); } } diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/RankCommand.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/RankCommand.java index 88a90a113..ae576601c 100644 --- a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/RankCommand.java +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/command/RankCommand.java @@ -1,10 +1,13 @@ package mineplex.staffServer.salespackage.command; +import java.util.UUID; + import org.bukkit.entity.Player; import mineplex.core.command.CommandBase; import mineplex.core.common.Rank; import mineplex.core.common.util.F; +import mineplex.core.common.util.UUIDFetcher; import mineplex.staffServer.salespackage.SalesPackageManager; public class RankCommand extends CommandBase @@ -24,11 +27,16 @@ public class RankCommand extends CommandBase String rank = args[1]; boolean perm = Boolean.parseBoolean(args[2]); + UUID uuid = Plugin.getClientManager().loadUUIDFromDB(playerName); + + if (uuid == null) + uuid = UUIDFetcher.getUUIDOf(playerName); + final Rank rankEnum = Rank.valueOf(rank); - if (rankEnum == Rank.HERO || rankEnum == Rank.ULTRA || rankEnum == Rank.LEGEND) + if (rankEnum == Rank.HERO || rankEnum == Rank.ULTRA || rankEnum == Rank.LEGEND || rankEnum == Rank.ALL) { - Plugin.getClientManager().SaveRank(playerName, mineplex.core.common.Rank.valueOf(rank), perm); + Plugin.getClientManager().SaveRank(playerName, uuid, mineplex.core.common.Rank.valueOf(rank), perm); caller.sendMessage(F.main(Plugin.getName(), playerName + "'s rank has been updated to " + rank + "!")); } } diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/salespackages/DefaultRank.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/salespackages/DefaultRank.java new file mode 100644 index 000000000..e6c509b34 --- /dev/null +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/salespackages/DefaultRank.java @@ -0,0 +1,20 @@ +package mineplex.staffServer.salespackage.salespackages; + +import mineplex.staffServer.salespackage.SalesPackageManager; + +import org.bukkit.entity.Player; + +public class DefaultRank extends SalesPackageBase +{ + public DefaultRank(SalesPackageManager manager) + { + super(manager, "Default Rank"); + } + + public void displayToAgent(Player agent, String playerName) + { + addButton(agent, "/sales rank " + playerName + " ALL false", " Default Rank."); + agent.sendMessage(" "); + addBackButton(agent, playerName); + } +} diff --git a/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/salespackages/EasterBunny.java b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/salespackages/EasterBunny.java new file mode 100644 index 000000000..6aacf8014 --- /dev/null +++ b/Plugins/Mineplex.StaffServer/src/mineplex/staffServer/salespackage/salespackages/EasterBunny.java @@ -0,0 +1,20 @@ +package mineplex.staffServer.salespackage.salespackages; + +import mineplex.staffServer.salespackage.SalesPackageManager; + +import org.bukkit.entity.Player; + +public class EasterBunny extends SalesPackageBase +{ + public EasterBunny(SalesPackageManager manager) + { + super(manager, "Easter Bunny Morph"); + } + + public void displayToAgent(Player agent, String playerName) + { + addButton(agent, "/sales item " + playerName + " 1 Morph Easter Bunny Morph", "Give Easter Bunny Morph."); + agent.sendMessage(" "); + addBackButton(agent, playerName); + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java index 0d9b55a5e..ae9ca9b08 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java @@ -21,6 +21,7 @@ import mineplex.core.disguise.DisguiseManager; import mineplex.core.donation.DonationManager; import mineplex.core.friend.FriendManager; import mineplex.core.gadget.GadgetManager; +import mineplex.core.give.Give; import mineplex.core.hologram.HologramManager; import mineplex.core.ignore.IgnoreManager; import mineplex.core.inventory.InventoryManager; @@ -44,6 +45,7 @@ import mineplex.core.status.ServerStatusManager; import mineplex.core.teleport.Teleport; import mineplex.core.updater.FileUpdater; import mineplex.core.updater.Updater; +import mineplex.core.visibility.VisibilityManager; import mineplex.minecraft.game.core.combat.CombatManager; import mineplex.minecraft.game.core.damage.DamageManager; import nautilus.game.arcade.game.GameServerConfig; @@ -83,17 +85,18 @@ public class Arcade extends JavaPlugin ItemStackFactory.Initialize(this, false); Recharge.Initialize(this); + VisibilityManager.Initialize(this); + Give.Initialize(this); _donationManager = new DonationManager(this, _clientManager, webServerAddress); - _serverConfiguration = new ServerConfiguration(this); + _serverConfiguration = new ServerConfiguration(this, _clientManager); PreferencesManager preferenceManager = new PreferencesManager(this, _clientManager, _donationManager); Creature creature = new Creature(this); ServerStatusManager serverStatusManager = new ServerStatusManager(this, _clientManager, new LagMeter(this, _clientManager)); LeaderboardManager leaderboardManager = new LeaderboardManager(this, _clientManager); - new Spawn(this, serverStatusManager.getCurrentServerName()); Teleport teleport = new Teleport(this); Portal portal = new Portal(this, _clientManager, serverStatusManager.getCurrentServerName()); new FileUpdater(this, portal, serverStatusManager.getCurrentServerName(), serverStatusManager.getRegion()); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java index b3b0ebb14..80b110a3d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeManager.java @@ -2,7 +2,6 @@ package nautilus.game.arcade; import java.io.File; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map.Entry; @@ -15,6 +14,7 @@ import org.bukkit.OfflinePlayer; import org.bukkit.Sound; import org.bukkit.craftbukkit.v1_7_R4.entity.CraftEntity; import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; +import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -31,6 +31,7 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.server.ServerListPingEvent; +import org.bukkit.util.Vector; import com.google.common.base.Objects; @@ -120,13 +121,14 @@ import nautilus.game.arcade.managers.GameSpectatorManager; import nautilus.game.arcade.managers.GameStatManager; import nautilus.game.arcade.managers.GameTournamentManager; import nautilus.game.arcade.managers.GameWorldManager; +import nautilus.game.arcade.managers.HolidayManager; import nautilus.game.arcade.managers.IdleManager; import nautilus.game.arcade.managers.MiscManager; import nautilus.game.arcade.shop.ArcadeShop; public class ArcadeManager extends MiniPlugin implements IRelation { - // Modules + // Modules private BlockRestore _blockRestore; private Blood _blood; private Chat _chat; @@ -142,9 +144,7 @@ public class ArcadeManager extends MiniPlugin implements IRelation private Fire _fire; private ProjectileManager _projectileManager; - - - private Portal _portal; + private Portal _portal; private ArcadeShop _arcadeShop; //Champions Modules @@ -175,11 +175,12 @@ public class ArcadeManager extends MiniPlugin implements IRelation private AchievementManager _achievementManager; private StatsManager _statsManager; private PartyManager _partyManager; + private PreferencesManager _preferencesManager; private TaskManager _taskManager; - private ArcadeRepository _arcadeRepository; private PacketHandler _packetHandler; + private IPacketHandler _resourcePacketHandler; private String _resourcePackUrl; private boolean _resourcePackRequired; @@ -213,6 +214,7 @@ public class ArcadeManager extends MiniPlugin implements IRelation _blood = blood; + _preferencesManager = preferences; _explosionManager = new Explosion(plugin, _blockRestore); _explosionManager.SetDebris(false); @@ -280,9 +282,8 @@ public class ArcadeManager extends MiniPlugin implements IRelation new MiscManager(this); _hologramManager = hologramManager; _idleManager = new IdleManager(this); - //new HalloweenManager(this); + //new HolidayManager(this); - _arcadeRepository = new ArcadeRepository(plugin); // Game Addons new CompassAddon(plugin, this); new SoupAddon(plugin, this); @@ -554,6 +555,11 @@ public class ArcadeManager extends MiniPlugin implements IRelation { return _gameWorldManager; } + + public PreferencesManager getPreferences() + { + return _preferencesManager; + } public StatsManager GetStatsManager() { @@ -686,8 +692,10 @@ public class ArcadeManager extends MiniPlugin implements IRelation @EventHandler public void MessageJoin(PlayerJoinEvent event) { + String name = event.getPlayer().getName(); + if (_game != null && _game.AnnounceJoinQuit) - event.setJoinMessage(F.sys("Join", GetColor(event.getPlayer()) + event.getPlayer().getName())); + event.setJoinMessage(F.sys("Join", GetColor(event.getPlayer()) + name)); else event.setJoinMessage(null); @@ -696,8 +704,10 @@ public class ArcadeManager extends MiniPlugin implements IRelation @EventHandler public void MessageQuit(PlayerQuitEvent event) { + String name = event.getPlayer().getName(); + if (_game == null || _game.AnnounceJoinQuit) - event.setQuitMessage(F.sys("Quit", GetColor(event.getPlayer()) + event.getPlayer().getName())); + event.setQuitMessage(F.sys("Quit", GetColor(event.getPlayer()) + name)); else event.setQuitMessage(null); } @@ -734,7 +744,7 @@ public class ArcadeManager extends MiniPlugin implements IRelation player.getOpenInventory().getType() != InventoryType.CREATIVE) return; - if (!UtilGear.isMat(player.getInventory().getItem(8), Material.WATCH)) + if (!UtilGear.isMat(player.getInventory().getItem(8), Material.WATCH) && !UtilGear.isMat(player.getInventory().getItem(8), Material.SPECKLED_MELON)) { player.getInventory().setItem( 8, @@ -841,6 +851,9 @@ public class ArcadeManager extends MiniPlugin implements IRelation player.setFireTicks(0); player.setFallDistance(0); + + player.eject(); + player.leaveVehicle(); player.setLevel(0); player.setExp(0f); @@ -1123,18 +1136,16 @@ public class ArcadeManager extends MiniPlugin implements IRelation } else if (event.GetState() == GameState.Prepare || event.GetState() == GameState.Loading || event.GetState() == GameState.Dead) { - if (getCosmeticManager().isShowingInterface()) + if (event.GetGame().GadgetsDisabled) { - getCosmeticManager().setActive(false); - getCosmeticManager().disableItemsForGame(); + if (getCosmeticManager().isShowingInterface()) + { + getCosmeticManager().setActive(false); + getCosmeticManager().disableItemsForGame(); + } } } } - - public ArcadeRepository getArcadeRepository() - { - return _arcadeRepository; - } /*public void saveBasicStats(final Game game) { @@ -1273,6 +1284,37 @@ public class ArcadeManager extends MiniPlugin implements IRelation return _partyManager; } + public void addSpectator(Player player, boolean teleport) + { + if (GetGame() == null) + return; + + Clear(player); + + if (teleport) + player.teleport(GetGame().GetSpectatorLocation()); + + //Set Spec State + player.setVelocity(new Vector(0,1,0)); + player.setAllowFlight(true); + player.setFlying(true); + player.setFlySpeed(0.1f); + ((CraftPlayer) player).getHandle().spectating = true; + ((CraftPlayer) player).getHandle().k = false; + + GetCondition().Factory().Cloak("Spectator", player, player, 7777, true, true); + + //Game Team + GetGame().GetScoreboard().SetPlayerTeam(player, "SPEC"); + } + + public boolean isSpectator(Entity player) + { + if (player instanceof Player) + return UtilPlayer.isSpectator((Player)player); + return false; + } + @EventHandler public void onSecond(UpdateEvent event) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeRepository.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeRepository.java deleted file mode 100644 index e89736280..000000000 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/ArcadeRepository.java +++ /dev/null @@ -1,107 +0,0 @@ -package nautilus.game.arcade; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import org.bukkit.plugin.java.JavaPlugin; - -import mineplex.core.database.RepositoryBase; -import mineplex.database.Tables; -//import mineplex.database.tables.records.GamesRecord; -import org.jooq.DSLContext; -import org.jooq.Query; -import org.jooq.impl.DSL; - -public class ArcadeRepository extends RepositoryBase -{ - private final String serverName; - - public ArcadeRepository(JavaPlugin plugin) - { - super(plugin, "jdbc:mysql://db.mineplex.com:3306/Account?autoReconnect=true&failOverReadOnly=false&maxReconnects=10", "root", "tAbechAk3wR7tuTh"); - - serverName = plugin.getConfig().getString("serverstatus.name"); - } - - @Override - protected void initialize() - { - - } - - @Override - protected void update() - { - - } - - /*public void saveBasicStats(GameType type, boolean tournament, int duration, Map players) - { - DSLContext context; - - synchronized (this) - { - context = DSL.using(getConnection()); - } - - GamesRecord record = context.newRecord(Tables.games); - record.setDuration(duration); - record.setTournament(tournament); - record.setType(type.name()); - record.setServer(serverName); - record.store(); - - List queryList = new ArrayList<>(players.size()); - - for (Map.Entry entry : players.entrySet()) - { - Query query = context - .insertInto(Tables.gamePlayers) - .set(Tables.gamePlayers.gameId, record.getId()) - .set(Tables.gamePlayers.accountId, DSL.select(Tables.accounts.id) - .from(Tables.accounts) - .where(Tables.accounts.uuid.eq(entry.getKey().toString()))) - .set(Tables.gamePlayers.winner, entry.getValue()); - - queryList.add(query); - } - - context.batch(queryList).execute(); - } - - public void saveLeaderboardStats(int tournamentId, int gameId, Map players) - { - DSLContext context; - - synchronized (this) - { - context = DSL.using(getConnection()); - } - - List queryList = new ArrayList<>(players.size()); - - for (Map.Entry entry : players.entrySet()) - { - int winIncrement = entry.getValue() ? 1 : 0; - - Query query = context - .insertInto(Tables.tournamentLeaderboard) - .set(Tables.tournamentLeaderboard.tournamentId, tournamentId) - .set(Tables.tournamentLeaderboard.gameId, gameId) - .set(Tables.tournamentLeaderboard.accountId, DSL.select(Tables.accounts.id) - .from(Tables.accounts) - .where(Tables.accounts.uuid.eq(entry.getKey().toString()))) - .set(Tables.tournamentLeaderboard.wins, winIncrement) - .set(Tables.tournamentLeaderboard.total, 1) - .onDuplicateKeyUpdate() - .set(Tables.tournamentLeaderboard.wins, Tables.tournamentLeaderboard.wins.plus(winIncrement)) - .set(Tables.tournamentLeaderboard.total, Tables.tournamentLeaderboard.total.plus(1)); - - queryList.add(query); - } - - context.batch(queryList).execute(); - }*/ -} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameFactory.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameFactory.java index 0f44f4930..4ff89e234 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameFactory.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameFactory.java @@ -21,6 +21,7 @@ import nautilus.game.arcade.game.games.dragonriders.DragonRiders; import nautilus.game.arcade.game.games.dragons.Dragons; import nautilus.game.arcade.game.games.dragons.DragonsTeams; import nautilus.game.arcade.game.games.draw.Draw; +import nautilus.game.arcade.game.games.event.EventGame; import nautilus.game.arcade.game.games.evolution.Evolution; import nautilus.game.arcade.game.games.gravity.Gravity; import nautilus.game.arcade.game.games.halloween.Halloween; @@ -43,7 +44,7 @@ import nautilus.game.arcade.game.games.spleef.Spleef; import nautilus.game.arcade.game.games.spleef.SpleefTeams; import nautilus.game.arcade.game.games.squidshooter.SquidShooter; import nautilus.game.arcade.game.games.stacker.Stacker; -import nautilus.game.arcade.game.games.survivalgames.SurvivalGames; +import nautilus.game.arcade.game.games.survivalgames.SurvivalGames; import nautilus.game.arcade.game.games.survivalgames.SurvivalGamesTeams; import nautilus.game.arcade.game.games.paintball.Paintball; import nautilus.game.arcade.game.games.tug.Tug; @@ -78,6 +79,7 @@ public class GameFactory else if (gameType == GameType.DragonEscapeTeams) return new DragonEscapeTeams(_manager); else if (gameType == GameType.DragonRiders) return new DragonRiders(_manager); else if (gameType == GameType.Draw) return new Draw(_manager); + else if (gameType == GameType.Event) return new EventGame(_manager); else if (gameType == GameType.Evolution) return new Evolution(_manager); else if (gameType == GameType.Gravity) return new Gravity(_manager); else if (gameType == GameType.Halloween) return new Halloween(_manager); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java index 28a6a668b..51b184488 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/GameType.java @@ -53,7 +53,9 @@ public enum GameType UHC("Ultra Hardcore", Material.GOLDEN_APPLE, (byte)0, GameCategory.SURVIVAL, 46), WitherAssault("Wither Assault", Material.SKULL_ITEM, (byte)1, GameCategory.ARCADE, 47), Wizards("Wizards", Material.BLAZE_ROD, (byte)0, GameCategory.SURVIVAL, 48), - ZombieSurvival("Zombie Survival", Material.SKULL_ITEM, (byte)2, GameCategory.SURVIVAL, 49); + ZombieSurvival("Zombie Survival", Material.SKULL_ITEM, (byte)2, GameCategory.SURVIVAL, 49), + + Event("Mineplex Event", Material.CAKE, (byte)0, GameCategory.EVENT, 999); String _name; String _lobbyName; @@ -118,6 +120,6 @@ public enum GameType public static enum GameCategory { - SURVIVAL, CLASSICS, CHAMPIONS, ARCADE; + SURVIVAL, CLASSICS, CHAMPIONS, ARCADE, EVENT; } } \ No newline at end of file diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/addons/CompassAddon.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/addons/CompassAddon.java index b75c4df35..5d121b2ce 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/addons/CompassAddon.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/addons/CompassAddon.java @@ -95,7 +95,7 @@ public class CompassAddon extends MiniPlugin if (target != null) { - if (Manager.GetGame().CompassGiveItem || player.getGameMode() != GameMode.SURVIVAL) + if (Manager.GetGame().CompassGiveItem || Manager.isSpectator(player)) if (!player.getInventory().contains(Material.COMPASS)) { if (player.getOpenInventory() == null || player.getOpenInventory().getCursor() == null || player.getOpenInventory().getCursor().getType() != Material.COMPASS) @@ -198,7 +198,7 @@ public class CompassAddon extends MiniPlugin event.setCancelled(true); - if (event.getAction() == Action.LEFT_CLICK_AIR || event.getAction() == Action.LEFT_CLICK_BLOCK || !Manager.GetGame().CompassSpectatorMenu) + if (event.getAction() == Action.LEFT_CLICK_AIR || event.getAction() == Action.LEFT_CLICK_BLOCK) { // Teleport to nearest player when you left click compass @@ -270,14 +270,4 @@ public class CompassAddon extends MiniPlugin _spectatorShop.update(); } - // This prevents other modules from cancelling clicks in - @EventHandler(priority = EventPriority.HIGH) - public void onInventoryClick(InventoryClickEvent event) - { - if (event.getClickedInventory() != null && event.getWhoClicked() != null && event.getWhoClicked().getGameMode() == GameMode.CREATIVE && event.getClickedInventory().getTitle().equals("Spectator Menu")) - { - event.setCancelled(false); - } - } - } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/SetCommand.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/SetCommand.java index b4fc74c58..1b7e0e24d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/SetCommand.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/SetCommand.java @@ -3,6 +3,7 @@ package nautilus.game.arcade.command; import java.util.ArrayList; import java.util.List; +import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -12,6 +13,7 @@ import nautilus.game.arcade.game.Game.GameState; import mineplex.core.command.CommandBase; import mineplex.core.common.Rank; import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilPlayer; public class SetCommand extends CommandBase { @@ -35,7 +37,10 @@ public class SetCommand extends CommandBase String game = args[0].toLowerCase(); if (args.length > 1) + { Plugin.GetGameCreationManager().MapPref = args[1]; + UtilPlayer.message(caller, C.cAqua + C.Bold + "Map Preference: " + ChatColor.RESET + args[1]); + } //Parse Game ArrayList matches = new ArrayList(); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/StopCommand.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/StopCommand.java index f7ef95f94..13fa1b5f5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/StopCommand.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/command/StopCommand.java @@ -13,7 +13,7 @@ public class StopCommand extends CommandBase { public StopCommand(ArcadeManager plugin) { - super(plugin, Rank.ADMIN, "stop"); + super(plugin, Rank.ADMIN, new Rank[] {Rank.MAPLEAD}, "stop"); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java index 8b6ac7d57..647de8bc1 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/Game.java @@ -139,14 +139,17 @@ public abstract class Game implements Listener public boolean DamagePvE = true; public boolean DamageEvP = true; public boolean DamageSelf = true; + public boolean DamageFall = true; public boolean DamageTeamSelf = false; public boolean DamageTeamOther = true; public boolean BlockBreak = false; + public boolean BlockBreakCreative = false; public HashSet BlockBreakAllow = new HashSet(); public HashSet BlockBreakDeny = new HashSet(); public boolean BlockPlace = false; + public boolean BlockPlaceCreative = false; public HashSet BlockPlaceAllow = new HashSet(); public HashSet BlockPlaceDeny = new HashSet(); @@ -193,8 +196,6 @@ public abstract class Game implements Listener public boolean PrepareFreeze = true; - public boolean RepairWeapons = true; - private double _itemMergeRadius = 0; public boolean AnnounceStay = true; @@ -212,11 +213,14 @@ public abstract class Game implements Listener public boolean StrictAntiHack = false; public boolean DisableKillCommand = true; + + public boolean GadgetsDisabled = true; + + public boolean TeleportsDisqualify = true; //Addons public boolean CompassEnabled = false; public boolean CompassGiveItem = true; - public boolean CompassSpectatorMenu = true; public boolean SoupEnabled = true; public boolean TeamArmor = false; @@ -837,24 +841,6 @@ public abstract class Game implements Listener return SpectatorSpawn; } - public void SetSpectator(Player player, boolean teleport) - { - Manager.Clear(player); - - if (teleport) - player.teleport(GetSpectatorLocation()); - - player.setGameMode(GameMode.CREATIVE); - player.setFlying(true); - player.setFlySpeed(0.1f); - ((CraftPlayer) player).getHandle().spectating = true; - ((CraftPlayer) player).getHandle().k = false; - - Manager.GetCondition().Factory().Cloak("Spectator", player, player, 7777, true, true); - - Scoreboard.SetPlayerTeam(player, "SPEC"); - } - @EventHandler public void eloStart(PlayerLoginEvent event) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/GameTeam.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/GameTeam.java index 87e8f7f6f..a1aad7241 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/GameTeam.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/GameTeam.java @@ -10,6 +10,7 @@ import mineplex.core.common.util.F; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; +import mineplex.core.visibility.VisibilityManager; import nautilus.game.arcade.game.GameTeam.PlayerState; import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.kit.KitAvailability; @@ -140,14 +141,7 @@ public class GameTeam UtilPlayer.message(player, F.main("Team", _color + C.Bold + "You joined " + _name + " Team") + "."); - for (Player other : UtilServer.getPlayers()) - { - if (other.equals(player)) - continue; - - other.hidePlayer(player); - other.showPlayer(player); - } + VisibilityManager.Instance.refreshPlayerToAll(player); } public void RemovePlayer(Player player) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/BaconBrawl.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/BaconBrawl.java index 475b6452e..e66165d86 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/BaconBrawl.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/BaconBrawl.java @@ -24,7 +24,7 @@ public class BaconBrawl extends SoloGame new Kit[] { new KitPig(manager), - new KitBabyPig(manager), + new KitMamaPig(manager), new KitSheepPig(manager) }, diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/kits/KitBabyPig.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/kits/KitBabyPig.java deleted file mode 100644 index 82c09b245..000000000 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/kits/KitBabyPig.java +++ /dev/null @@ -1,84 +0,0 @@ -package nautilus.game.arcade.game.games.baconbrawl.kits; - -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Pig; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import mineplex.core.common.util.C; -import mineplex.core.common.util.UtilEnt; -import mineplex.core.disguise.disguises.DisguiseChicken; -import mineplex.core.disguise.disguises.DisguisePig; -import mineplex.core.itemstack.ItemStackFactory; -import nautilus.game.arcade.ArcadeManager; -import nautilus.game.arcade.kit.Kit; -import nautilus.game.arcade.kit.KitAvailability; -import nautilus.game.arcade.kit.Perk; -import nautilus.game.arcade.kit.perks.PerkBaconBlast; -import nautilus.game.arcade.kit.perks.PerkSpeed; - -public class KitBabyPig extends Kit -{ - public KitBabyPig(ArcadeManager manager) - { - super(manager, "Bebe Piggles", KitAvailability.Gem, - - new String[] - { - "Tiny pig runs so fast!" - }, - - new Perk[] - { - new PerkBaconBlast(), - new PerkSpeed(1), - }, - EntityType.PIG, - new ItemStack(Material.PORK)); - } - - @Override - public void GiveItems(Player player) - { - player.getInventory().addItem(ItemStackFactory.Instance.CreateStack(Material.IRON_AXE)); - - //Disguise - DisguisePig disguise = new DisguisePig(player); - disguise.setName(C.cYellow + player.getName()); - disguise.setCustomNameVisible(true); - disguise.setBaby(); - Manager.GetDisguise().disguise(disguise); - } - - @Override - public Entity SpawnEntity(Location loc) - { - EntityType type = _entityType; - if (type == EntityType.PLAYER) - type = EntityType.ZOMBIE; - - LivingEntity entity = (LivingEntity) Manager.GetCreature().SpawnEntity(loc, type); - - entity.setRemoveWhenFarAway(false); - entity.setCustomName(GetAvailability().GetColor() + GetName() + " Kit"); - entity.setCustomNameVisible(true); - entity.getEquipment().setItemInHand(_itemInHand); - - if (type == EntityType.PIG) - { - Pig sheep = (Pig)entity; - sheep.setBaby(); - } - - UtilEnt.Vegetate(entity); - - SpawnCustom(entity); - - return entity; - } -} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/kits/KitMamaPig.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/kits/KitMamaPig.java new file mode 100644 index 000000000..4852415a5 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/kits/KitMamaPig.java @@ -0,0 +1,94 @@ +package nautilus.game.arcade.game.games.baconbrawl.kits; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Pig; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.inventory.ItemStack; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.disguise.disguises.DisguisePig; +import mineplex.core.itemstack.ItemStackFactory; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; +import nautilus.game.arcade.kit.perks.PerkBaconBlast; +import nautilus.game.arcade.kit.perks.PerkSpeed; +import net.minecraft.server.v1_7_R4.PacketPlayOutEntityDestroy; + +public class KitMamaPig extends Kit +{ + public KitMamaPig(ArcadeManager manager) + { + super(manager, "Mama Piggles", KitAvailability.Gem, + + new String[] + { + "Maba & Baby Piggles fight together!" + }, + + new Perk[] + { + new PerkBaconBlast(), + new PerkSpeed(1), + }, + EntityType.PIG, + new ItemStack(Material.PORK)); + } + + @Override + public void GiveItems(final Player player) + { + player.getInventory().addItem(ItemStackFactory.Instance.CreateStack(Material.IRON_AXE)); + + //Disguise + DisguisePig disguise = new DisguisePig(player); + disguise.setName(C.cYellow + player.getName()); + disguise.setCustomNameVisible(false); + Manager.GetDisguise().disguise(disguise); + + Manager.GetGame().CreatureAllowOverride = true; + final Pig pig = player.getWorld().spawn(player.getEyeLocation(), Pig.class); + pig.setBaby(); + pig.setAgeLock(true); + pig.setCustomName(C.cYellow + player.getName()); + pig.setCustomNameVisible(false); + Manager.GetGame().CreatureAllowOverride = false; + + player.setPassenger(pig); + + Bukkit.getScheduler().runTaskLater(Manager.getPlugin(), new Runnable() + { + @Override + public void run() + { + UtilPlayer.sendPacket(player, new PacketPlayOutEntityDestroy(new int[] { pig.getEntityId() })); + } + }, 2); + } + + @EventHandler(priority=EventPriority.LOWEST) + public void damageTransfer(CustomDamageEvent event) + { + if (event.IsCancelled()) + return; + + if (!(event.GetDamageeEntity() instanceof Pig)) + return; + + Pig pig = (Pig)event.GetDamageeEntity(); + + if (pig.getVehicle() == null || !(pig.getVehicle() instanceof LivingEntity)) + return; + + event.setDamagee((LivingEntity)pig.getVehicle()); + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/kits/KitPig.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/kits/KitPig.java index 627da5201..db9071a12 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/kits/KitPig.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/kits/KitPig.java @@ -43,7 +43,7 @@ public class KitPig extends Kit //Disguise DisguisePig disguise = new DisguisePig(player); disguise.setName(C.cYellow + player.getName()); - disguise.setCustomNameVisible(true); + disguise.setCustomNameVisible(false); Manager.GetDisguise().disguise(disguise); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/kits/KitSheepPig.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/kits/KitSheepPig.java index 934909313..3a63d31ff 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/kits/KitSheepPig.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/baconbrawl/kits/KitSheepPig.java @@ -50,7 +50,7 @@ public class KitSheepPig extends Kit //Disguise DisguiseSheep disguise = new DisguiseSheep(player); disguise.setName(C.cYellow + player.getName()); - disguise.setCustomNameVisible(true); + disguise.setCustomNameVisible(false); disguise.setColor(DyeColor.PINK); Manager.GetDisguise().disguise(disguise); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/bridge/Bridge.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/bridge/Bridge.java index 40dee17c5..b496a7530 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/bridge/Bridge.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/bridge/Bridge.java @@ -143,8 +143,6 @@ public class Bridge extends TeamGame implements OreObsfucation "Special loot is located in the center.", "The last team alive wins!" }); - - this.CompassSpectatorMenu = false; _ore = new OreHider(); @@ -634,7 +632,7 @@ public class Bridge extends TeamGame implements OreObsfucation _lavaSource = WorldData.GetDataLocs("BLACK"); } - + private void ParseIceBridge() { if (WorldData.GetCustomLocs("WATER_HEIGHT").isEmpty()) @@ -1193,7 +1191,7 @@ public class Bridge extends TeamGame implements OreObsfucation if (type != Material.GOLDEN_APPLE && type != Material.GOLDEN_CARROT && - type != Material.FLINT_AND_STEEL) + type != Material.FLINT_AND_STEEL && type != Material.HOPPER) return; if (!(event.getInventory() instanceof CraftingInventory)) @@ -1221,6 +1219,9 @@ public class Bridge extends TeamGame implements OreObsfucation //Display Individual Players if (this.GetPlayers(true).size() < 10) { + if (!team.IsTeamAlive()) + continue; + Scoreboard.WriteBlank(); for (Player player : team.GetPlayers(true)) @@ -1230,7 +1231,7 @@ public class Bridge extends TeamGame implements OreObsfucation } //Display Players Alive - else + else { Scoreboard.WriteBlank(); Scoreboard.Write(team.GetColor() + team.GetName() + " Team"); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiege.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiege.java index 48268d889..0713e43d4 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiege.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/CastleSiege.java @@ -195,8 +195,6 @@ public class CastleSiege extends TeamGame this.WorldTimeSet = 14000; //14000 this.BlockPlaceAllow.add(85); - this.CompassSpectatorMenu = false; - _kingName = C.cYellow + C.Bold + "King Sparklez"; GameTeam notRedTeam = null; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanBrawler.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanBrawler.java index b39f56de8..2ebc6c976 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanBrawler.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/castlesiege/kits/KitHumanBrawler.java @@ -32,7 +32,7 @@ public class KitHumanBrawler extends KitHuman new Perk[] { new PerkSeismicSlamCS(), - new PerkCleave(0.75), + new PerkCleave(0.75, true), }, EntityType.ZOMBIE, new ItemStack(Material.IRON_AXE)); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/ChampionsDominate.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/ChampionsDominate.java index 59f2f34d4..a3b8b3edd 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/ChampionsDominate.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/ChampionsDominate.java @@ -2,6 +2,8 @@ package nautilus.game.arcade.game.games.champions; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; import mineplex.minecraft.game.core.combat.DeathMessageType; import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.ArcadeManager; @@ -53,7 +55,7 @@ public class ChampionsDominate extends Domination "Diamond Weapons deal 7 damage", }; - + Manager.GetDamage().UseSimpleWeaponDamage = false; Manager.getCosmeticManager().setHideParticles(true); @@ -65,7 +67,7 @@ public class ChampionsDominate extends Domination EloStart = 1000; this.DisableKillCommand = false; - + registerStatTrackers( new KillReasonStatTracker(this, "Backstab", "Assassination", false), new ElectrocutionStatTracker(this), @@ -120,4 +122,16 @@ public class ChampionsDominate extends Domination if (player.getOpenInventory().getTopInventory().getType() == InventoryType.CHEST) player.closeInventory(); } + + @EventHandler + public void validateSkills(UpdateEvent event) + { + if (event.getType() == UpdateType.SEC) + { + for (Player player : GetPlayers(true)) + { + Manager.getClassManager().Get(player).validateClassSkills(player); + } + } + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/ChampionsTDM.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/ChampionsTDM.java index 9af73ce5c..490688277 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/ChampionsTDM.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/ChampionsTDM.java @@ -8,6 +8,8 @@ import org.bukkit.event.inventory.InventoryType; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; import mineplex.minecraft.game.core.combat.DeathMessageType; import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.ArcadeManager; @@ -54,7 +56,7 @@ public class ChampionsTDM extends TeamDeathmatch "Diamond Weapons deal 7 damage", }; - + this.Manager.GetDamage().UseSimpleWeaponDamage = false; Manager.getCosmeticManager().setHideParticles(true); @@ -63,7 +65,7 @@ public class ChampionsTDM extends TeamDeathmatch InventoryOpenChest = true; this.DisableKillCommand = false; - + registerStatTrackers( new WinWithoutLosingTeammateStatTracker(this, "FlawlessVictory"), new KillAllOpposingStatTracker(this), @@ -120,4 +122,16 @@ public class ChampionsTDM extends TeamDeathmatch if (player.getOpenInventory().getTopInventory().getType() == InventoryType.CHEST) player.closeInventory(); } + + @EventHandler + public void validateSkills(UpdateEvent event) + { + if (event.getType() == UpdateType.SEC) + { + for (Player player : GetPlayers(true)) + { + Manager.getClassManager().Get(player).validateClassSkills(player); + } + } + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitAssassin.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitAssassin.java index d4cfea278..cb1765619 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitAssassin.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitAssassin.java @@ -49,6 +49,8 @@ public class KitAssassin extends Kit @Override public void Selected(Player player) { + Manager.Clear(player); + _class.put(player, Manager.getClassManager().Get(player)); ClientClass clientClass = _class.get(player); IPvpClass pvpClass = Manager.getClassManager().GetClass("Assassin"); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitBrute.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitBrute.java index 5a2be1d98..4462eb7a0 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitBrute.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitBrute.java @@ -48,6 +48,8 @@ public class KitBrute extends Kit @Override public void Selected(Player player) { + Manager.Clear(player); + _class.put(player, Manager.getClassManager().Get(player)); ClientClass clientClass = _class.get(player); IPvpClass pvpClass = Manager.getClassManager().GetClass("Brute"); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitKnight.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitKnight.java index e38d71a46..97bf4610d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitKnight.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitKnight.java @@ -45,6 +45,8 @@ public class KitKnight extends Kit @Override public void Selected(Player player) { + Manager.Clear(player); + AddPlayer(player); Manager.openClassShop(player); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitMage.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitMage.java index 175496916..48e5b1296 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitMage.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitMage.java @@ -45,6 +45,8 @@ public class KitMage extends Kit @Override public void Selected(Player player) { + Manager.Clear(player); + _class.put(player, Manager.getClassManager().Get(player)); ClientClass clientClass = _class.get(player); IPvpClass pvpClass = Manager.getClassManager().GetClass("Mage"); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitRanger.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitRanger.java index 0db49711a..fd3789a38 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitRanger.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/kits/KitRanger.java @@ -45,6 +45,8 @@ public class KitRanger extends Kit @Override public void Selected(Player player) { + Manager.Clear(player); + _class.put(player, Manager.getClassManager().Get(player)); ClientClass clientClass = _class.get(player); IPvpClass pvpClass = Manager.getClassManager().GetClass("Ranger"); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/dominate_data/CapturePoint.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/dominate_data/CapturePoint.java index bc394814e..ac022741b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/dominate_data/CapturePoint.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/dominate_data/CapturePoint.java @@ -131,7 +131,7 @@ public class CapturePoint { for (Player player : team.GetPlayers(true)) { - if (player.getGameMode() != GameMode.SURVIVAL) + if (Host.Manager.isSpectator(player)) continue; if (Math.abs(_loc.getX() - player.getLocation().getX()) > 2.5) @@ -301,6 +301,8 @@ public class CapturePoint RewardCapture(player, 30); } } + + UtilTextMiddle.display(null, _owner.GetColor() + _owner.GetName() + " captured " + _name, 5, 40, 5); } } //Count Down diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/dominate_data/CapturePointTDM.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/dominate_data/CapturePointTDM.java index b4fed2b8d..dc9ad7c5b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/dominate_data/CapturePointTDM.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/dominate_data/CapturePointTDM.java @@ -106,7 +106,7 @@ public class CapturePointTDM { for (Player player : team.GetPlayers(true)) { - if (player.getGameMode() != GameMode.SURVIVAL) + if (Host.Manager.isSpectator(player)) continue; if (Math.abs(_loc.getX() - player.getLocation().getX()) > 2.5) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/dominate_data/Emerald.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/dominate_data/Emerald.java index cb32af083..f19f9a80e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/dominate_data/Emerald.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/dominate_data/Emerald.java @@ -77,7 +77,7 @@ public class Emerald if (!Host.IsAlive(player)) return; - if (player.getGameMode() != GameMode.SURVIVAL) + if (Host.Manager.isSpectator(player)) return; GameTeam team = Host.GetTeam(player); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/dominate_data/Resupply.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/dominate_data/Resupply.java index b0f462da1..719272cef 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/dominate_data/Resupply.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/dominate_data/Resupply.java @@ -77,7 +77,7 @@ public class Resupply if (!Host.IsAlive(player)) return; - if (player.getGameMode() != GameMode.SURVIVAL) + if (Host.Manager.isSpectator(player)) return; GameTeam team = Host.GetTeam(player); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/deathtag/DeathTag.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/deathtag/DeathTag.java index ca5c8dd1d..8e26d351f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/deathtag/DeathTag.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/deathtag/DeathTag.java @@ -19,6 +19,7 @@ import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; +import mineplex.core.visibility.VisibilityManager; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.GameType; import nautilus.game.arcade.events.GameStateChangeEvent; @@ -248,12 +249,8 @@ public class DeathTag extends SoloGame newKit.ApplyKit(player); //Refresh - for (Player other : UtilServer.getPlayers()) - { - other.hidePlayer(player); - other.showPlayer(player); - } - + VisibilityManager.Instance.refreshPlayerToAll(player); + if (forced) { AddGems(player, 10, "Forced Chaser", false, false); @@ -291,11 +288,7 @@ public class DeathTag extends SoloGame GetKit(player).ApplyKit(player); //Refresh on Spawn - for (Player other : UtilServer.getPlayers()) - { - other.hidePlayer(player); - other.showPlayer(player); - } + VisibilityManager.Instance.refreshPlayerToAll(player); } }, 0); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventGame.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventGame.java new file mode 100644 index 000000000..b5ed70c5a --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventGame.java @@ -0,0 +1,1663 @@ +package nautilus.game.arcade.game.games.event; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Effect; +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Sound; +import org.bukkit.World; +import org.bukkit.block.BlockFace; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftLivingEntity; +import org.bukkit.entity.Ageable; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.entity.Skeleton; +import org.bukkit.entity.Slime; +import org.bukkit.entity.Villager; +import org.bukkit.entity.Wolf; +import org.bukkit.entity.Zombie; +import org.bukkit.entity.Skeleton.SkeletonType; +import org.bukkit.entity.Villager.Profession; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.entity.EntityExplodeEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerToggleFlightEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.NautHashMap; +import mineplex.core.common.util.UtilAction; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilInv; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilText; +import mineplex.core.creature.event.CreatureKillEntitiesEvent; +import mineplex.core.disguise.disguises.DisguiseBase; +import mineplex.core.disguise.disguises.DisguiseBat; +import mineplex.core.disguise.disguises.DisguiseChicken; +import mineplex.core.disguise.disguises.DisguiseEnderman; +import mineplex.core.disguise.disguises.DisguiseWither; +import mineplex.core.gadget.event.GadgetActivateEvent; +import mineplex.core.gadget.types.Gadget; +import mineplex.core.gadget.types.GadgetType; +import mineplex.core.give.Give; +import mineplex.core.mount.Mount; +import mineplex.core.mount.event.MountActivateEvent; +import mineplex.core.recharge.Recharge; +import mineplex.core.shop.item.SalesPackageBase; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import nautilus.game.arcade.game.games.event.kits.*; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; +import nautilus.game.arcade.game.SoloGame; +import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.managers.GameHostManager; + +public class EventGame extends SoloGame +{ + private GameHostManager _mps; + + private String[] _sideText = new String[] { + " "," "," "," "," "," "," "," "," "," "," "," " + ," "," "," "}; + + private boolean _doubleJump = false; + private boolean _gadgetsEnabled = true; + private NautHashMap _forcefield = new NautHashMap(); + + private ItemStack[] _kitItems = new ItemStack[6]; + + private boolean _allowAllGadgets = false; + private HashSet _gadgetWhitelist = new HashSet(); + + public EventGame(ArcadeManager manager) + { + super(manager, GameType.Event, + + new Kit[] + { + new KitPlayer(manager), + }, + + new String[] + { + "" + }); + + this.JoinInProgress = true; + + this.DamageTeamSelf = true; + this.DamagePvP = false; + this.DamageEvP = false; + this.DamagePvE = false; + + this.DeathMessages = false; + this.DeathOut = false; + + this.CanAddStats = false; + this.CanGiveLoot = false; + + this.GadgetsDisabled = false; + + this.TeleportsDisqualify = false; + + this.PrepareFreeze = false; + + this.BlockPlaceCreative = true; + this.BlockBreakCreative = true; + + this.InventoryClick = true; + this.InventoryOpenBlock = true; + this.InventoryOpenChest = true; + + //Dont timeout + this.GameTimeout = -1; + + _mps = manager.GetGameHostManager(); + + this.CreatureAllow = true; + } + + //Before GamePlayerManager puts onto Spec! + @EventHandler(priority = EventPriority.LOW) + public void specToTeam(PlayerJoinEvent event) + { + if (InProgress()) + joinTeam(event.getPlayer()); + } + + public void joinTeam(Player player) + { + //Set Team + SetPlayerTeam(player, GetTeamList().get(0), true); + + //Kit + SetKit(player, GetKits()[0], true); + GetKits()[0].ApplyKit(player); + + //Refresh + for (Player other : UtilServer.getPlayers()) + { + other.hidePlayer(player); + other.showPlayer(player); + } + + //Spawn + GetTeamList().get(0).SpawnTeleport(player); + + //GameMode + player.setGameMode(GameMode.SURVIVAL); + } + + //Help + private void commandHelp(Player player) + { + UtilPlayer.message(player, F.main("Event", "Displaying Commands;")); + + UtilPlayer.message(player, F.value("/e settings", "View Settings Help")); + + UtilPlayer.message(player, F.value("/e tp ", "Teleport to Target")); + UtilPlayer.message(player, F.value("/e tp here ", "Teleport Target to Self")); + UtilPlayer.message(player, F.value("/e tp here all", "Teleport Everyone to Self")); + + UtilPlayer.message(player, F.value("/e gadget", "Toggle Gadgets")); + UtilPlayer.message(player, F.value("/e gadget list", "Lists Gadgets (Shows Whitelist)")); + UtilPlayer.message(player, F.value("/e gadget ", "Toggles Whitelist for Gadget")); + UtilPlayer.message(player, F.value("/e gadget clear", "Clears Gadget Whitelist")); + + UtilPlayer.message(player, F.value("/e silence [Time]", "Silence Chat")); + + UtilPlayer.message(player, F.value("/e gm [Player]", "Toggle Creative Mode")); + + UtilPlayer.message(player, F.value("/e radius [Radius]", "Set Forcefield Radius")); + + UtilPlayer.message(player, F.value("/e give ", "Give Item to Self")); + UtilPlayer.message(player, F.value("/e give ", "Give Item to Player")); + + UtilPlayer.message(player, F.value("/e doublejump", "Toggles Double Jump")); + + UtilPlayer.message(player, F.value("/e scoreboard [Text]", "Sets Scoreboard Text")); + + UtilPlayer.message(player, F.value("/e mob [#Amount] n[Name] s[Size] [angry] [baby]", "")); + UtilPlayer.message(player, F.value("/e mob kill ", "Kill Mobs")); + + UtilPlayer.message(player, F.value("/e kit set", "Sets Player Kit to your Hotbar")); + UtilPlayer.message(player, F.value("/e kit apply", "Gives Kit to Players")); + UtilPlayer.message(player, F.value("/e kit clear", "Gives Kit to Players")); + + UtilPlayer.message(player, F.value("/e effect ", "")); + UtilPlayer.message(player, F.value("/e effect clear", "")); + } + + private void commandHelpSettings(Player player) + { + UtilPlayer.message(player, F.main("Event", "Displaying Settings Commands;")); + UtilPlayer.message(player, F.value("/e damage all", "Toggles All Damage")); + UtilPlayer.message(player, F.value("/e damage pvp", "Toggles PvP Damage")); + UtilPlayer.message(player, F.value("/e damage pve", "Toggles PvE Damage")); + UtilPlayer.message(player, F.value("/e damage pve", "Toggles EvP Damage")); + UtilPlayer.message(player, F.value("/e damage fall", "Toggles Fall Damage")); + UtilPlayer.message(player, F.value("/e health <-1 to 20>", "Locks Players Health")); + UtilPlayer.message(player, F.value("/e hunger <-1 to 20>", "Locks Players Hunger")); + UtilPlayer.message(player, F.value("/e item drop", "Toggles Item Drop")); + UtilPlayer.message(player, F.value("/e item pickup", "Toggles Item Pickup")); + UtilPlayer.message(player, F.value("/e blockplace", "Toggles Block Placing (On/Off)")); + UtilPlayer.message(player, F.value("/e blockplace whitelist ", "")); + UtilPlayer.message(player, F.value("/e blockplace blacklist ", "")); + UtilPlayer.message(player, F.value("/e blockbreak", "Toggles Block Breaking (On/Off)")); + UtilPlayer.message(player, F.value("/e blockbreak whitelist ", "")); + UtilPlayer.message(player, F.value("/e blockbreak blacklist ", "")); + UtilPlayer.message(player, F.value("/e time <-1 to 24000>", "Sets World Time")); + } + + //Command Handler + @EventHandler(priority = EventPriority.LOWEST) + private void commandHandler(PlayerCommandPreprocessEvent event) + { + if (!InProgress()) + return; + + if (!event.getMessage().toLowerCase().startsWith("/e ")) + return; + + event.setCancelled(true); + + if (!_mps.isAdmin(event.getPlayer(), false)) + return; + + //Trim off /e and split to args + String[] args = event.getMessage().substring(3, event.getMessage().length()).split(" "); + + if (args.length == 0 || args[0].equalsIgnoreCase("help")) + { + commandHelp(event.getPlayer()); + } + else if (args[0].equalsIgnoreCase("settings")) + { + if (args.length >= 2 && args[1].equalsIgnoreCase("list")) + listSettings(event.getPlayer()); + else + commandHelpSettings(event.getPlayer()); + } + + //XXX Commands + else if (args[0].equalsIgnoreCase("tp")) + { + commandTeleport(event.getPlayer(), args); + } + else if (args[0].equalsIgnoreCase("gadget")) + { + commandGadget(event.getPlayer(), args); + } + else if (args[0].equalsIgnoreCase("silence")) + { + commandSilence(event.getPlayer(), args); + } + else if (args[0].equalsIgnoreCase("gm")) + { + commandGamemode(event.getPlayer(), args); + } + else if (args[0].equalsIgnoreCase("radius")) + { + commandForcefieldRadius(event.getPlayer(), args); + } + else if (args[0].equalsIgnoreCase("doublejump")) + { + commandDoubleJump(event.getPlayer(), args); + } + else if (args[0].equalsIgnoreCase("scoreboard")) + { + commandScoreboard(event.getPlayer(), args); + } + else if (args[0].equalsIgnoreCase("whitelist")) + { + commandWhitelist(event.getPlayer(), args); + } + else if (args[0].equalsIgnoreCase("give")) + { + commandGive(event.getPlayer(), args); + } + else if (args[0].equalsIgnoreCase("effect")) + { + commandEffect(event.getPlayer(), args); + } + else if (args[0].equalsIgnoreCase("kit")) + { + commandKit(event.getPlayer(), args); + } + else if (args[0].equalsIgnoreCase("mob")) + { + if (args.length >= 2 && args[1].equalsIgnoreCase("kill")) + commandMobKill(event.getPlayer(), args); + else + commandMob(event.getPlayer(), args); + } + + + //XXX Settings + else if (event.getMessage().toLowerCase().equals("/e damage all")) + { + Damage = !Damage; + Announce(F.main("Event Settings", F.value("Damage All", F.tf(Damage)))); + } + else if (event.getMessage().toLowerCase().equals("/e damage pvp")) + { + DamagePvP = !DamagePvP; + Announce(F.main("Event Settings", F.value("Damage PvP", F.tf(DamagePvP)))); + } + else if (event.getMessage().toLowerCase().equals("/e damage pve")) + { + DamagePvE = !DamagePvE; + Announce(F.main("Event Settings", F.value("Damage PvE", F.tf(DamagePvE)))); + } + else if (event.getMessage().toLowerCase().equals("/e damage evp")) + { + DamageEvP = !DamageEvP; + Announce(F.main("Event Settings", F.value("Damage EvP", F.tf(DamageEvP)))); + } + else if (event.getMessage().toLowerCase().equals("/e damage fall")) + { + DamageFall = !DamageFall; + Announce(F.main("Event Settings", F.value("Damage Fall", F.tf(DamageFall)))); + } + else if (args[0].equalsIgnoreCase("health")) + { + commandHealth(event.getPlayer(), args); + } + else if (args[0].equalsIgnoreCase("hunger")) + { + commandHunger(event.getPlayer(), args); + } + else if (event.getMessage().toLowerCase().equals("/e item drop")) + { + ItemDrop = !ItemDrop; + Announce(F.main("Event Settings", F.value("Item Drop", F.tf(ItemDrop)))); + } + else if (event.getMessage().toLowerCase().equals("/e item pickup")) + { + ItemPickup = !ItemPickup; + Announce(F.main("Event Settings", F.value("Item Pickup", F.tf(ItemPickup)))); + } + else if (event.getMessage().toLowerCase().equals("/e blockplace")) + { + BlockPlace = !BlockPlace; + Announce(F.main("Event Settings", F.value("Block Place", F.tf(BlockPlace)))); + } + else if (args.length >= 4 && args[0].equalsIgnoreCase("blockplace") + && (args[1].equalsIgnoreCase("whitelist") || args[1].equalsIgnoreCase("blacklist"))) + { + commandBlockPlace(event.getPlayer(), args, args[1].equalsIgnoreCase("whitelist"), args[2]); + } + else if (event.getMessage().toLowerCase().equals("/e blockbreak")) + { + BlockBreak = !BlockBreak; + Announce(F.main("Event Settings", F.value("Block Break", F.tf(BlockBreak)))); + } + else if (args.length >= 4 && args[0].equalsIgnoreCase("blockbreak") + && (args[1].equalsIgnoreCase("whitelist") || args[1].equalsIgnoreCase("blacklist"))) + { + commandBlockBreak(event.getPlayer(), args, args[1].equalsIgnoreCase("whitelist"), args[2]); + } + else if (args[0].equalsIgnoreCase("time")) + { + commandTime(event.getPlayer(), args); + } + } + + private void listSettings(Player player) + { + UtilPlayer.message(player, F.value("Damage All", F.tf(Damage))); + UtilPlayer.message(player, F.value("Damage PvP", F.tf(DamagePvP))); + UtilPlayer.message(player, F.value("Damage PvE", F.tf(DamagePvE))); + UtilPlayer.message(player, F.value("Damage EvP", F.tf(DamageEvP))); + UtilPlayer.message(player, F.value("Damage Fall", F.tf(DamageFall))); + UtilPlayer.message(player, F.value("Health Set", HealthSet+"")); + UtilPlayer.message(player, F.value("Hunger Set", HungerSet+"")); + UtilPlayer.message(player, F.value("Item Pickup", F.tf(ItemPickup))); + UtilPlayer.message(player, F.value("Item Drop", F.tf(ItemDrop))); + UtilPlayer.message(player, F.value("Block Place", F.tf(BlockPlace))); + UtilPlayer.message(player, F.value("Block Place Whitelist", UtilText.listToString(BlockPlaceAllow, true))); + UtilPlayer.message(player, F.value("Block Place Blacklist", UtilText.listToString(BlockPlaceDeny, true))); + UtilPlayer.message(player, F.value("Block Break", F.tf(BlockPlace))); + UtilPlayer.message(player, F.value("Block Break Whitelist", UtilText.listToString(BlockBreakAllow, true))); + UtilPlayer.message(player, F.value("Block Break Blacklist", UtilText.listToString(BlockBreakDeny, true))); + UtilPlayer.message(player, F.value("Time Set", WorldTimeSet+"")); + } + + private void commandBlockPlace(Player player, String[] args, boolean whitelist, String command) + { + try + { + int blockId = Integer.parseInt(args[3]); + + if (whitelist) + { + if (command.equalsIgnoreCase("add")) + { + BlockPlaceAllow.add(blockId); + UtilPlayer.message(player, F.main("Event Settings", F.value("Block Place Whitelist", "Added " + blockId))); + } + else if (command.equalsIgnoreCase("remove")) + { + BlockPlaceAllow.remove(blockId); + UtilPlayer.message(player, F.main("Event Settings", F.value("Block Place Whitelist", "Removed " + blockId))); + } + else if (command.equalsIgnoreCase("clear")) + { + BlockPlaceAllow.clear(); + UtilPlayer.message(player, F.main("Event Settings", F.value("Block Place Whitelist", "Cleared"))); + } + else if (command.equalsIgnoreCase("list")) + { + UtilPlayer.message(player, F.main("Event Settings", F.value("Block Place Whitelist", UtilText.listToString(BlockPlaceAllow, true)))); + } + } + else + { + if (command.equalsIgnoreCase("add")) + { + BlockPlaceDeny.add(blockId); + UtilPlayer.message(player, F.main("Event Settings", F.value("Block Place Blacklist", "Added " + blockId))); + } + else if (command.equalsIgnoreCase("remove")) + { + BlockPlaceDeny.remove(blockId); + UtilPlayer.message(player, F.main("Event Settings", F.value("Block Place Blacklist", "Removed " + blockId))); + } + else if (command.equalsIgnoreCase("clear")) + { + BlockPlaceDeny.clear(); + UtilPlayer.message(player, F.main("Event Settings", F.value("Block Place Blacklist", "Cleared"))); + } + else if (command.equalsIgnoreCase("list")) + { + UtilPlayer.message(player, F.main("Event Settings", F.value("Block Place Blacklist", UtilText.listToString(BlockPlaceDeny, true)))); + } + } + + return; + } + catch (Exception e) + { + + } + + commandHelpSettings(player); + } + + private void commandBlockBreak(Player player, String[] args, boolean whitelist, String command) + { + try + { + int blockId = Integer.parseInt(args[3]); + + if (whitelist) + { + if (command.equalsIgnoreCase("add")) + { + BlockBreakAllow.add(blockId); + UtilPlayer.message(player, F.main("Event Settings", F.value("Block Break Whitelist", "Added " + blockId))); + } + else if (command.equalsIgnoreCase("remove")) + { + BlockBreakAllow.remove(blockId); + UtilPlayer.message(player, F.main("Event Settings", F.value("Block Break Whitelist", "Removed " + blockId))); + } + else if (command.equalsIgnoreCase("clear")) + { + BlockBreakAllow.clear(); + UtilPlayer.message(player, F.main("Event Settings", F.value("Block Break Whitelist", "Cleared"))); + } + else if (command.equalsIgnoreCase("list")) + { + UtilPlayer.message(player, F.main("Event Settings", F.value("Block Break Whitelist", UtilText.listToString(BlockBreakAllow, true)))); + } + } + else + { + if (command.equalsIgnoreCase("add")) + { + BlockBreakDeny.add(blockId); + UtilPlayer.message(player, F.main("Event Settings", F.value("Block Break Blacklist", "Added " + blockId))); + } + else if (command.equalsIgnoreCase("remove")) + { + BlockBreakDeny.remove(blockId); + UtilPlayer.message(player, F.main("Event Settings", F.value("Block Break Blacklist", "Removed " + blockId))); + } + else if (command.equalsIgnoreCase("clear")) + { + BlockBreakDeny.clear(); + UtilPlayer.message(player, F.main("Event Settings", F.value("Block Break Blacklist", "Cleared"))); + } + else if (command.equalsIgnoreCase("list")) + { + UtilPlayer.message(player, F.main("Event Settings", F.value("Block Break Blacklist", UtilText.listToString(BlockBreakDeny, true)))); + } + } + + return; + } + catch (Exception e) + { + + } + + commandHelpSettings(player); + } + + private void commandHealth(Player player, String[] args) + { + try + { + if (args.length >= 2) + { + int health = Integer.parseInt(args[1]); + + if (health <= 0) + health = -1; + if (health > 20) + health = 20; + + HealthSet = health; + + if (HealthSet == -1) + Announce(F.main("Event Settings", F.value("Health Set", "Disabled"))); + else + Announce(F.main("Event Settings", F.value("Health Set", HealthSet + ""))); + + return; + } + } + catch (Exception e) + { + + } + + commandHelpSettings(player); + } + + private void commandHunger(Player player, String[] args) + { + try + { + if (args.length >= 2) + { + int hunger = Integer.parseInt(args[1]); + + if (hunger <= 0) + hunger = -1; + if (hunger > 20) + hunger = 20; + + HungerSet = hunger; + + if (HungerSet == -1) + Announce(F.main("Event Settings", F.value("Hunger Set", "Disabled"))); + else + Announce(F.main("Event Settings", F.value("Hunger Set", HungerSet + ""))); + + return; + } + } + catch (Exception e) + { + + } + + commandHelpSettings(player); + } + + private void commandTime(Player player, String[] args) + { + try + { + if (args.length >= 2) + { + int time = Integer.parseInt(args[1]); + + if (time <= -1) + time = -1; + if (time > 24000) + time = 24000; + + WorldTimeSet = time; + + if (WorldTimeSet == -1) + Announce(F.main("Event Settings", F.value("Time Set", "Disabled"))); + else + Announce(F.main("Event Settings", F.value("Time Set", WorldTimeSet + ""))); + + return; + } + } + catch (Exception e) + { + + } + + commandHelpSettings(player); + } + + //Teleport Command (To, Here, All) + private void commandTeleport(Player player, String[] args) + { + if (args.length >= 3 && args[1].equalsIgnoreCase("here")) + { + if (args[2].equalsIgnoreCase("all")) + { + for (Player other : UtilServer.getPlayers()) + { + UtilPlayer.message(other, F.main("Event TP", player.getName() + " teleported everyone to self.")); + other.teleport(player); + } + + return; + } + + Player target = UtilPlayer.searchOnline(player, args[2], true); + if (target != null) + { + target.teleport(player); + UtilPlayer.message(target, F.main("Event TP", player.getName() + " teleported you to self.")); + UtilPlayer.message(player, F.main("Event TP", "Teleported " + target.getName() + " to you.")); + } + + return; + } + + if (args.length >= 2) + { + Player target = UtilPlayer.searchOnline(player, args[1], true); + if (target != null) + { + player.teleport(target); + UtilPlayer.message(player, F.main("Event TP", "Teleported to " + target.getName() + ".")); + } + + return; + } + + commandHelp(player); + } + + //Gadget Commands (Global & Individual) + private void commandGadget(Player player, String[] args) + { + if (args.length < 2) + { + _allowAllGadgets = !_allowAllGadgets; + + if (!_allowAllGadgets) + { + Manager.getCosmeticManager().getMountManager().DisableAll(); + Manager.getCosmeticManager().getGadgetManager().DisableAll(); + } + + Announce(F.main("Inventory", F.value("Allow All Gadgets", F.ed(_allowAllGadgets)))); + return; + } + + if (args.length >= 2 && args[1].equalsIgnoreCase("clear")) + { + _gadgetWhitelist.clear(); + Announce(F.main("Inventory", F.value("Gadget Whitelist", "Cleared."))); + return; + } + + if (args.length >= 2 && args[1].equalsIgnoreCase("list")) + { + ChatColor color = ChatColor.AQUA; + + //Gadgets + for (GadgetType type : GadgetType.values()) + { + String items = C.Bold + type + " Gadgets> "; + + for (Gadget gadget : Manager.getCosmeticManager().getGadgetManager().getGadgets(type)) + { + items += color + gadget.GetName().replaceAll(" ", "") + " "; + color = (color == ChatColor.AQUA ? ChatColor.DARK_AQUA : ChatColor.AQUA); + } + + UtilPlayer.message(player, items); + } + + //Mounts + String mounts = C.Bold + "Mount Gadgets> "; + for (Mount mount : Manager.getCosmeticManager().getMountManager().getMounts()) + { + mounts += color + mount.GetName().replaceAll(" ", "") + " "; + color = (color == ChatColor.AQUA ? ChatColor.DARK_AQUA : ChatColor.AQUA); + } + UtilPlayer.message(player, mounts); + + return; + } + + if (args.length >= 2) + { + //Gadgets + for (GadgetType type : GadgetType.values()) + { + for (Gadget gadget : Manager.getCosmeticManager().getGadgetManager().getGadgets(type)) + { + if (gadget.GetName().replaceAll(" ", "").equalsIgnoreCase(args[1])) + { + if (_gadgetWhitelist.remove(gadget)) + { + Announce(F.main("Inventory", F.value(gadget.GetName() + " Gadget", F.ed(false)))); + gadget.DisableForAll(); + } + else + { + Announce(F.main("Inventory", F.value(gadget.GetName() + " Gadget", F.ed(true)))); + _gadgetWhitelist.add(gadget); + } + + return; + } + } + } + + //Mounts + for (Mount mount : Manager.getCosmeticManager().getMountManager().getMounts()) + { + if (mount.GetName().replaceAll(" ", "").equalsIgnoreCase(args[1])) + { + if (_gadgetWhitelist.remove(mount)) + { + Announce(F.main("Inventory", F.value(mount.GetName() + " Gadget", F.ed(false)))); + mount.DisableForAll(); + } + else + { + Announce(F.main("Inventory", F.value(mount.GetName() + " Gadget", F.ed(true)))); + _gadgetWhitelist.add(mount); + } + + return; + } + } + + UtilPlayer.message(player, F.main("Inventory", args[1] + " is not a valid gadget.")); + + return; + } + + commandHelp(player); + } + + //Silence + private void commandSilence(Player player, String[] args) + { + try + { + //Toggle + if (args.length == 1) + { + //Disable + if (Manager.GetChat().Silenced() != 0) + { + Manager.GetChat().Silence(0, true); + } + //Enable + else + { + Manager.GetChat().Silence(-1, true); + } + } + //Timer + else + { + long time = (long) (Double.valueOf(args[1]) * 3600000); + + Manager.GetChat().Silence(time, true); + } + } + catch (Exception e) + { + UtilPlayer.message(player, F.main("Chat", "Invalid Time Parameter.")); + } + } + + //Gamemode (Self and Others) + private void commandGamemode(Player player, String[] args) + { + Player target = player; + + if (args.length >= 2) + { + Player newTarget = UtilPlayer.searchOnline(player, args[1], true); + if (newTarget != null) + target = newTarget; + else + return; + } + + if (target.getGameMode() == GameMode.CREATIVE) + target.setGameMode(GameMode.SURVIVAL); + else + target.setGameMode(GameMode.CREATIVE); + + UtilPlayer.message(player, F.main("Event GM", target.getName() + " Creative: " + F.tf(target.getGameMode() == GameMode.CREATIVE))); + } + + //Forcefield + private void commandForcefieldRadius(Player player, String[] args) + { + //Toggle + if (args.length >= 2) + { + try + { + int range = Integer.parseInt(args[1]); + + _forcefield.put(player.getName(), range); + + UtilPlayer.message(player, F.main("Forcefield", "Enabled with " + F.elem(range + "") + " radius.")); + } + catch (Exception e) + { + UtilPlayer.message(player, F.main("Forcefield", "Invalid Input.")); + } + } + else + { + _forcefield.remove(player.getName()); + UtilPlayer.message(player, F.main("Forcefield", "Disabled.")); + } + } + + //Give + private void commandGive(Player player, String[] args) + { + String[] newArgs = new String[args.length-1]; + + for (int i=0 ; i= 2) + { + //Line + int line = 0; + try + { + line = Integer.parseInt(args[1]); + } + catch (Exception e) + { + UtilPlayer.message(player, F.main("Scoreboard", "Invalid Line Number.")); + return; + } + + if (line < 1 || line > 14) + { + UtilPlayer.message(player, F.main("Scoreboard", "Invalid Line Number.")); + return; + } + + //Text + String lineText = ""; + + //Reset String + if (args.length <= 2) + for (int i=0 ; i= 2 && args[1].equalsIgnoreCase("clear")) + { + for (int i=0 ; i<_sideText.length ; i++) + { + String lineText = ""; + for (int j=0 ; j= 2) + { + if (args[1].equalsIgnoreCase("on") || args[1].equalsIgnoreCase("off")) + { + UtilServer.getServer().setWhitelist(args[1].equalsIgnoreCase("on")); + + Announce(F.main("Event Settings", F.value("Whitelist", F.tf(args[1].equalsIgnoreCase("on"))))); + return; + } + } + + //Add and Remove + if (args.length >= 3) + { + if (args[1].equalsIgnoreCase("add") || args[1].equalsIgnoreCase("remove")) + { + OfflinePlayer target = Bukkit.getOfflinePlayer(args[2]); + + if (args[1].equalsIgnoreCase("add")) + { + UtilServer.getServer().getWhitelistedPlayers().add(target); + UtilPlayer.message(player, F.main("Whitelist", "Added " + args[2] + " to the whitelist.")); + } + else + { + UtilServer.getServer().getWhitelistedPlayers().remove(target); + UtilPlayer.message(player, F.main("Whitelist", "Removed " + args[2] + " to the whitelist.")); + } + + return; + } + } + + commandHelp(player); + } + + //Mob + private void commandMob(Player caller, String[] args) + { + if (args.length == 1) + { + HashMap entMap = new HashMap(); + + int count = 0; + for (World world : UtilServer.getServer().getWorlds()) + { + for (Entity ent : world.getEntities()) + { + if (!entMap.containsKey(ent.getType())) + entMap.put(ent.getType(), 0); + + entMap.put(ent.getType(), 1 + entMap.get(ent.getType())); + count++; + } + } + + UtilPlayer.message(caller, F.main("Creature", "Listing Entities:")); + for (EntityType cur : entMap.keySet()) + { + UtilPlayer.message(caller, F.desc(UtilEnt.getName(cur), entMap.get(cur)+"")); + } + + UtilPlayer.message(caller, F.desc("Total", count+"")); + } + else + { + EntityType type = UtilEnt.searchEntity(caller, args[1], true); + + if (type == null) + return; + + UtilPlayer.message(caller, F.main("Creature", "Spawning Creature(s);")); + + //Store Args + HashSet argSet = new HashSet(); + for (int i = 2 ; i < args.length ; i++) + if (args[i].length() > 0) + argSet.add(args[i]); + + + //Search Count + int count = 1; + HashSet argHandle = new HashSet(); + for (String arg : argSet) + { + try + { + int newCount = Integer.parseInt(arg); + + if (newCount <= 0) + continue; + + //Set Count + count = newCount; + UtilPlayer.message(caller, F.desc("Amount", count+"")); + + //Flag Arg + argHandle.add(arg); + break; + } + catch (Exception e) + { + //None + } + } + for (String arg : argHandle) + argSet.remove(arg); + + //Spawn + HashSet entSet = new HashSet(); + for (int i = 0 ; i < count ; i++) + { + CreatureAllowOverride = true; + entSet.add(Manager.GetCreature().SpawnEntity(caller.getTargetBlock(null, 0).getLocation().add(0.5, 1, 0.5), type)); + CreatureAllowOverride = false; + } + + //Search Vars + for (String arg : argSet) + { + if (arg.length() == 0) + continue; + + //Baby + else if (arg.equalsIgnoreCase("baby") || arg.equalsIgnoreCase("b")) + { + for (Entity ent : entSet) + { + if (ent instanceof Ageable) + ((Ageable)ent).setBaby(); + else if (ent instanceof Zombie) + ((Zombie)ent).setBaby(true); + } + + UtilPlayer.message(caller, F.desc("Baby", "True")); + argHandle.add(arg); + } + + //Lock + else if (arg.equalsIgnoreCase("age") || arg.equalsIgnoreCase("lock")) + { + for (Entity ent : entSet) + if (ent instanceof Ageable) + { + ((Ageable)ent).setAgeLock(true); + UtilPlayer.message(caller, F.desc("Age", "False")); + } + + argHandle.add(arg); + } + + //Angry + else if (arg.equalsIgnoreCase("angry") || arg.equalsIgnoreCase("a")) + { + for (Entity ent : entSet) + if (ent instanceof Wolf) + ((Wolf)ent).setAngry(true); + + for (Entity ent : entSet) + if (ent instanceof Skeleton) + ((Skeleton)ent).setSkeletonType(SkeletonType.WITHER); + + UtilPlayer.message(caller, F.desc("Angry", "True")); + argHandle.add(arg); + } + + //Profession + else if (arg.toLowerCase().charAt(0) == 'p') + { + try + { + String prof = arg.substring(1, arg.length()); + + Profession profession = null; + for (Profession cur : Profession.values()) + if (cur.name().toLowerCase().contains(prof.toLowerCase())) + profession = cur; + + UtilPlayer.message(caller, F.desc("Profession", profession.name())); + + for (Entity ent : entSet) + if (ent instanceof Villager) + ((Villager)ent).setProfession(profession); + } + catch (Exception e) + { + UtilPlayer.message(caller, F.desc("Profession", "Invalid [" + arg + "] on " + type.name())); + } + argHandle.add(arg); + } + + //Size + else if (arg.toLowerCase().charAt(0) == 's') + { + try + { + String size = arg.substring(1, arg.length()); + + UtilPlayer.message(caller, F.desc("Size", Integer.parseInt(size)+"")); + + for (Entity ent : entSet) + if (ent instanceof Slime) + ((Slime)ent).setSize(Integer.parseInt(size)); + } + catch (Exception e) + { + UtilPlayer.message(caller, F.desc("Size", "Invalid [" + arg + "] on " + type.name())); + } + argHandle.add(arg); + } + + else if (arg.toLowerCase().charAt(0) == 'n' && arg.length() > 1) + { + try + { + String name = ""; + + for (char c : arg.substring(1, arg.length()).toCharArray()) + { + if (c != '_') + name += c; + else + name += " "; + } + + for (Entity ent : entSet) + { + if (ent instanceof CraftLivingEntity) + { + CraftLivingEntity cEnt = (CraftLivingEntity)ent; + cEnt.setCustomName(name); + cEnt.setCustomNameVisible(true); + } + } + } + catch (Exception e) + { + UtilPlayer.message(caller, F.desc("Size", "Invalid [" + arg + "] on " + type.name())); + } + argHandle.add(arg); + } + } + for (String arg : argHandle) + argSet.remove(arg); + + for (String arg : argSet) + UtilPlayer.message(caller, F.desc("Unhandled", arg)); + + //Inform + UtilPlayer.message(caller, F.main("Creature", "Spawned " + count + " " + UtilEnt.getName(type) + ".")); + } + } + + private void commandMobKill(Player caller, String[] args) + { + if (args.length < 3) + { + UtilPlayer.message(caller, F.main("Creature", "Missing Entity Type Parameter.")); + return; + } + + EntityType type = UtilEnt.searchEntity(caller, args[2], true); + + if (type == null && !args[2].equalsIgnoreCase("all")) + return; + + int count = 0; + List killList = new ArrayList(); + + for (World world : UtilServer.getServer().getWorlds()) + { + for (Entity ent : world.getEntities()) + { + if (ent.getType() == EntityType.PLAYER) + continue; + + if (type == null || ent.getType() == type) + { + killList.add(ent); + } + } + } + + CreatureKillEntitiesEvent event = new CreatureKillEntitiesEvent(killList); + UtilServer.getServer().getPluginManager().callEvent(event); + + for (Entity entity : event.GetEntities()) + { + entity.remove(); + count++; + } + + String target = "ALL"; + if (type != null) + target = UtilEnt.getName(type); + + UtilPlayer.message(caller, F.main("Creature", "Killed " + target + ". " + count + " Removed.")); + } + + private void commandKit(Player caller, String[] args) + { + if (args.length >= 2 && args[1].equalsIgnoreCase("apply")) + { + for (Player player : UtilServer.getPlayers()) + giveItems(player); + + Announce(F.main("Event Settings", F.value("Player Kit", "Applied to Players"))); + return; + } + + if (args.length >= 2 && args[1].equalsIgnoreCase("clear")) + { + _kitItems = new ItemStack[6]; + Announce(F.main("Event Settings", F.value("Player Kit", "Cleared Kit"))); + return; + } + + if (args.length >= 2 && args[1].equalsIgnoreCase("set")) + { + _kitItems = new ItemStack[6]; + + for (int i=0 ; i<6 ; i++) + { + if (caller.getInventory().getItem(i) != null) + _kitItems[i] = caller.getInventory().getItem(i).clone(); + else + _kitItems[i] = null; + } + + Announce(F.main("Event Settings", F.value("Player Kit", "Updated Items"))); + return; + } + + commandHelp(caller); + } + + private void commandEffect(Player caller, String[] args) + { + //Clear + if (args.length >= 3 && args[2].equalsIgnoreCase("clear")) + { + //Get Targets + LinkedList targets = new LinkedList(); + + if (args[1].equalsIgnoreCase("all")) + { + for (Player cur : UtilServer.getPlayers()) + targets.add(cur); + } + else + { + targets = UtilPlayer.matchOnline(caller, args[1], true); + if (targets.isEmpty()) + return; + } + + for (Player player : targets) + { + //Remove all conditions + Manager.GetCondition().EndCondition(player, null, null); + + //Remove all effects + player.removePotionEffect(PotionEffectType.ABSORPTION); + player.removePotionEffect(PotionEffectType.BLINDNESS); + player.removePotionEffect(PotionEffectType.CONFUSION); + player.removePotionEffect(PotionEffectType.DAMAGE_RESISTANCE); + player.removePotionEffect(PotionEffectType.FAST_DIGGING); + player.removePotionEffect(PotionEffectType.FIRE_RESISTANCE); + player.removePotionEffect(PotionEffectType.HARM); + player.removePotionEffect(PotionEffectType.HEAL); + player.removePotionEffect(PotionEffectType.HEALTH_BOOST); + player.removePotionEffect(PotionEffectType.HUNGER); + player.removePotionEffect(PotionEffectType.INCREASE_DAMAGE); + player.removePotionEffect(PotionEffectType.INVISIBILITY); + player.removePotionEffect(PotionEffectType.JUMP); + player.removePotionEffect(PotionEffectType.NIGHT_VISION); + player.removePotionEffect(PotionEffectType.POISON); + player.removePotionEffect(PotionEffectType.REGENERATION); + player.removePotionEffect(PotionEffectType.SATURATION); + player.removePotionEffect(PotionEffectType.SLOW); + player.removePotionEffect(PotionEffectType.SLOW_DIGGING); + player.removePotionEffect(PotionEffectType.SPEED); + player.removePotionEffect(PotionEffectType.WATER_BREATHING); + player.removePotionEffect(PotionEffectType.WEAKNESS); + player.removePotionEffect(PotionEffectType.WITHER); + } + + return; + } + + //Apply + if (args.length >= 5) + { + //Get Targets + LinkedList targets = new LinkedList(); + + if (args[1].equalsIgnoreCase("all")) + { + for (Player cur : UtilServer.getPlayers()) + targets.add(cur); + } + else + { + targets = UtilPlayer.matchOnline(caller, args[1], true); + if (targets.isEmpty()) + return; + } + + //Get Type + PotionEffectType type = PotionEffectType.getByName(args[2]); + if (type == null) + { + UtilPlayer.message(caller, F.main("Effect", "Invalid Effect Type: " + args[2])); + UtilPlayer.message(caller, F.value("Valid Types", "http://minecraft.gamepedia.com/Status_effect")); + return; + } + + //Get Multiplier + int mult = 0; + try + { + mult = Integer.parseInt(args[3]); + + if (mult <= 0) + mult = 0; + if (mult > 255) + mult = 255; + } + catch (Exception e) + { + UtilPlayer.message(caller, F.main("Effect", "Invalid Effect Level: " + args[3])); + return; + } + + //Get Duration + int dur = 0; + try + { + dur = Integer.parseInt(args[4]); + + if (dur <= 0) + dur = 0; + } + catch (Exception e) + { + UtilPlayer.message(caller, F.main("Effect", "Invalid Effect Duration: " + args[4])); + return; + } + + //Apply + PotionEffect effect = new PotionEffect(type, dur*20, mult); + for (Player cur : targets) + { + cur.addPotionEffect(effect); + } + + if (args[1].equalsIgnoreCase("all")) + Announce(F.main("Effect", F.value("Applied Effect", type.getName() + " " + (mult+1) + " for " + dur + "s"))); + else + UtilPlayer.message(caller, F.main("Effect", "Applied " + type.getName() + " " + (mult+1) + " for " + dur + "s for Targets.")); + + return; + } + + commandHelp(caller); + } + + @EventHandler + public void doubleJumpTrigger(PlayerToggleFlightEvent event) + { + if (!_doubleJump) + return; + + Player player = event.getPlayer(); + + if (player.getGameMode() == GameMode.CREATIVE) + return; + + //Chicken Cancel + DisguiseBase disguise = Manager.GetDisguise().getDisguise(player); + if (disguise != null && + ((disguise instanceof DisguiseChicken && !((DisguiseChicken)disguise).isBaby()) || disguise instanceof DisguiseBat || disguise instanceof DisguiseEnderman || disguise instanceof DisguiseWither)) + return; + + event.setCancelled(true); + player.setFlying(false); + + //Disable Flight + player.setAllowFlight(false); + + //Velocity + UtilAction.velocity(player, 1.4, 0.2, 1, true); + + //Sound + player.playEffect(player.getLocation(), Effect.BLAZE_SHOOT, 0); + } + + @EventHandler + public void doubleJumpRefresh(UpdateEvent event) + { + if (!_doubleJump) + return; + + if (event.getType() != UpdateType.TICK) + return; + + for (Player player : UtilServer.getPlayers()) + { + if (player.getGameMode() == GameMode.CREATIVE) + continue; + + if (UtilEnt.isGrounded(player) || UtilBlock.solid(player.getLocation().getBlock().getRelative(BlockFace.DOWN))) + { + player.setAllowFlight(true); + player.setFlying(false); + } + } + } + + @EventHandler + public void gadgetActivate(GadgetActivateEvent event) + { + if (!_gadgetsEnabled) + event.setCancelled(true); + } + + @EventHandler + public void mountActivate(MountActivateEvent event) + { + if (!_gadgetsEnabled) + event.setCancelled(true); + } + + @EventHandler + public void forcefieldUpdate(UpdateEvent event) + { + if (!InProgress()) + return; + + if (event.getType() != UpdateType.FASTER) + return; + + for (Player player : UtilServer.getPlayers()) + { + if (_forcefield.containsKey(player.getName())) + { + for (Player other : UtilServer.getPlayers()) + { + if (player.equals(other)) + continue; + + if (_mps.isAdmin(other, false)) + continue; + + int range = _forcefield.get(player.getName()); + + if (UtilMath.offset(other, player) > range) + continue; + + if (Recharge.Instance.use(other, "Forcefield Bump", 500, false, false)) + { + Entity bottom = other; + while (bottom.getVehicle() != null) + bottom = bottom.getVehicle(); + + UtilAction.velocity(bottom, UtilAlg.getTrajectory2d(player, bottom), 1.6, true, 0.8, 0, 10, true); + other.getWorld().playSound(other.getLocation(), Sound.CHICKEN_EGG_POP, 2f, 0.5f); + } + } + } + } + } + + @EventHandler(priority = EventPriority.LOW) + public void explosionBlocks(EntityExplodeEvent event) + { + event.blockList().clear(); + } + + // @EventHandler + // public void updateVisibility(UpdateEvent event) + // { + // if (!InProgress()) + // return; + // + // if (event.getType() != UpdateType.FAST) + // return; + // + // for (Player player : UtilServer.getPlayers()) + // { + // if (!Manager.getPreferences().Get(player).ShowPlayers) + // { + // for (Player other : UtilServer.getPlayers()) + // { + // if (player.equals(other)) + // continue; + // + // ((CraftPlayer)player).hidePlayer(other, true, false); + // } + // } + // else + // { + // for (Player other : UtilServer.getPlayers()) + // { + // if (player.equals(other)) + // continue; + // + // if ((Manager.getPreferences().Get(player).Invisibility && _mps.isAdmin(player, false)) || ) + // { + // ((CraftPlayer)other).hidePlayer(player, true, false); + // } + // else + // { + // other.showPlayer(player); + // } + // } + // } + // } + // } + + @Override + public void EndCheck() + { + + } + + @Override + @EventHandler + public void ScoreboardUpdate(UpdateEvent event) + { + if (!InProgress()) + return; + + if (event.getType() != UpdateType.FAST) + return; + + if (GetTeamList().isEmpty()) + return; + + Scoreboard.Reset(); + + Scoreboard.WriteBlank(); + + for (int i=_sideText.length-1 ; i>=0 ; i--) + { + Scoreboard.Write(_sideText[i]); + } + + Scoreboard.Draw(); + } + + //This re-enables cosmetic hotbar, because MPS disables it - temp fix until i find out whats disabling it repeatedly + @EventHandler(priority = EventPriority.MONITOR) + public void fixHotbarItemTemp(UpdateEvent event) + { + Manager.GetServerConfig().HotbarInventory = true; + } + + public void giveItems(Player player) + { + UtilInv.Clear(player); + + for (int i=0 ; i<_kitItems.length ; i++) + { + if (_kitItems[i] == null) + continue; + + player.getInventory().addItem(_kitItems[i].clone()); + } + + UtilInv.Update(player); + } + + @EventHandler + public void creatureNaturalRemove(CreatureSpawnEvent event) + { + if (event.getSpawnReason() != SpawnReason.CUSTOM) + event.setCancelled(true); + } + + @EventHandler + public void gadgetDisable(GadgetActivateEvent event) + { + if (_allowAllGadgets) + return; + + if (!_gadgetWhitelist.contains(event.getGadget())) + { + event.setCancelled(true); + event.getPlayer().playSound(event.getPlayer().getLocation(), Sound.NOTE_BASS, 0.5f, 0.5f); + //event.getPlayer().closeInventory(); + } + } + + @EventHandler + public void mountDisable(MountActivateEvent event) + { + if (_allowAllGadgets) + return; + + if (!_gadgetWhitelist.contains(event.getMount())) + { + event.setCancelled(true); + event.getPlayer().playSound(event.getPlayer().getLocation(), Sound.NOTE_BASS, 0.5f, 0.5f); + //event.getPlayer().closeInventory(); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void entityDeathEvent(EntityDeathEvent event) + { + event.getDrops().clear(); + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/kits/KitPlayer.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/kits/KitPlayer.java new file mode 100644 index 000000000..bee6a44d8 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/kits/KitPlayer.java @@ -0,0 +1,38 @@ +package nautilus.game.arcade.game.games.event.kits; + +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.game.games.event.EventGame; +import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; + +public class KitPlayer extends Kit +{ + public KitPlayer(ArcadeManager manager) + { + super(manager, "Party Animal", KitAvailability.Free, 0, + + new String[] + { + "" + }, + + new Perk[] + { + }, + EntityType.PIG, + new ItemStack(Material.PORK)); + + } + + @Override + public void GiveItems(Player player) + { + ((EventGame)Manager.GetGame()).giveItems(player); + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/halloween/Halloween.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/halloween/Halloween.java index 5d3dcab91..3858e54c8 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/halloween/Halloween.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/halloween/Halloween.java @@ -399,7 +399,7 @@ public class Halloween extends SoloGame { for (Player player : GetPlayers(false)) { - Manager.GetDonation().PurchaseUnknownSalesPackage(null, player.getName(), player.getUniqueId(), "Pumpling", false, 0, true); + Manager.GetDonation().PurchaseUnknownSalesPackage(null, player.getName(), Manager.GetClients().Get(player).getAccountId(), "Pumpling", false, 0, true); Manager.GetGame().AddGems(player, 30, "Killing the Pumpkin King", false, false); Manager.GetGame().AddGems(player, 10, "Participation", false, false); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/hideseek/HideSeek.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/hideseek/HideSeek.java index f49418b60..31c333ead 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/hideseek/HideSeek.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/hideseek/HideSeek.java @@ -73,6 +73,7 @@ import mineplex.core.packethandler.PacketInfo; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; +import mineplex.core.visibility.VisibilityManager; import mineplex.minecraft.game.core.combat.DeathMessageType; import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.ArcadeManager; @@ -177,7 +178,10 @@ public class HideSeek extends TeamGame private long _hideTime = 20000; private long _gameTime = 360000; - + + private boolean _bowGiven = false; + private long _bowGiveTime = 0; + private boolean _started = false; private HashMap _arrowHits = new HashMap(); @@ -369,40 +373,47 @@ public class HideSeek extends TeamGame } } - public void GiveItems() + public void GiveItems(boolean bowOnly) { for (Player player : _hiders.GetPlayers(true)) { - // Axe - player.getInventory().setItem(0, - ItemStackFactory.Instance.CreateStack(Material.WOOD_AXE, (byte) 0, 1, C.cGreen + "Speed Axe")); + if (bowOnly) + { + // Bow + ItemStack bow = ItemStackFactory.Instance.CreateStack(Material.BOW, (byte) 0, 1, C.cYellow + C.Bold + "Shoot Hunters" + + C.cWhite + C.Bold + " - " + C.cGreen + C.Bold + "Upgrades Axe"); + bow.addEnchantment(Enchantment.ARROW_INFINITE, 1); + player.getInventory().setItem(1, bow); + player.getInventory().setItem(28, ItemStackFactory.Instance.CreateStack(Material.ARROW)); + } + else + { + // Axe + player.getInventory().setItem(0, + ItemStackFactory.Instance.CreateStack(Material.WOOD_AXE, (byte) 0, 1, C.cGreen + "Speed Axe")); - // Bow - ItemStack bow = ItemStackFactory.Instance.CreateStack(Material.BOW, (byte) 0, 1, C.cYellow + C.Bold + "Shoot Hunters" - + C.cWhite + C.Bold + " - " + C.cGreen + C.Bold + "Upgrades Axe"); - bow.addEnchantment(Enchantment.ARROW_INFINITE, 1); - player.getInventory().setItem(1, bow); - player.getInventory().setItem(28, ItemStackFactory.Instance.CreateStack(Material.ARROW)); + // Meower + player.getInventory().setItem( + 4, + ItemStackFactory.Instance.CreateStack(Material.SUGAR, (byte) 0, 1, C.cYellow + C.Bold + "Meow" + C.cWhite + + C.Bold + " - " + C.cGreen + C.Bold + "+0.25 Gems")); - // Meower - player.getInventory().setItem( - 4, - ItemStackFactory.Instance.CreateStack(Material.SUGAR, (byte) 0, 1, C.cYellow + C.Bold + "Meow" + C.cWhite - + C.Bold + " - " + C.cGreen + C.Bold + "+0.25 Gems")); + // Firework + ItemStack firework = ItemStackFactory.Instance.CreateStack(Material.FIREWORK, (byte) 0, 5, C.cYellow + C.Bold + + "Firework" + C.cWhite + C.Bold + " - " + C.cGreen + C.Bold + "+2 Gems"); + FireworkMeta metaData = (FireworkMeta) firework.getItemMeta(); + metaData.setPower(1); + metaData.addEffect(FireworkEffect.builder().flicker(true).withColor(Color.AQUA).with(Type.BALL_LARGE).trail(true) + .build()); + firework.setItemMeta(metaData); + player.getInventory().setItem(5, firework); - // Firework - ItemStack firework = ItemStackFactory.Instance.CreateStack(Material.FIREWORK, (byte) 0, 5, C.cYellow + C.Bold - + "Firework" + C.cWhite + C.Bold + " - " + C.cGreen + C.Bold + "+2 Gems"); - FireworkMeta metaData = (FireworkMeta) firework.getItemMeta(); - metaData.setPower(1); - metaData.addEffect(FireworkEffect.builder().flicker(true).withColor(Color.AQUA).with(Type.BALL_LARGE).trail(true) - .build()); - firework.setItemMeta(metaData); - player.getInventory().setItem(5, firework); - - // Recharges - Recharge.Instance.useForce(player, "Meow", 15000); - Recharge.Instance.useForce(player, "Firework", 15000); + // Recharges + Recharge.Instance.useForce(player, "Meow", 15000); + Recharge.Instance.useForce(player, "Firework", 15000); + } + + player.playSound(player.getLocation(), Sound.HORSE_ARMOR, 1f, 1f); } } @@ -1035,12 +1046,8 @@ public class HideSeek extends TeamGame GetKits()[5].ApplyKit(player); // Refresh - for (Player other : UtilServer.getPlayers()) - { - other.hidePlayer(player); - other.showPlayer(player); - } - + VisibilityManager.Instance.refreshPlayerToAll(player); + if (forced) { AddGems(player, 10, "Forced Seeker", false, false); @@ -1131,6 +1138,8 @@ public class HideSeek extends TeamGame if (event.getType() != UpdateType.TICK) return; + + // Hide Time if (!_started) { @@ -1141,7 +1150,8 @@ public class HideSeek extends TeamGame _started = true; // Hider Items - GiveItems(); + GiveItems(false); + _bowGiveTime = System.currentTimeMillis(); // Remove Barrier for (Location loc : WorldData.GetDataLocs("BLACK")) @@ -1153,6 +1163,13 @@ public class HideSeek extends TeamGame // Seek Time else { + //Give Bow + if (!_bowGiven && UtilTime.elapsed(_bowGiveTime, 10000)) + { + GiveItems(true); + _bowGiven = true; + } + long timeLeft = _gameTime - (System.currentTimeMillis() - GetStateTime() - _hideTime); if (timeLeft <= 0) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/hideseek/forms/BlockForm.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/hideseek/forms/BlockForm.java index 3f9e7bd3d..a19aa9cd8 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/hideseek/forms/BlockForm.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/hideseek/forms/BlockForm.java @@ -84,6 +84,7 @@ public class BlockForm extends Form // Player > Chicken DisguiseChicken disguise = new DisguiseChicken(Player); disguise.setBaby(); + disguise.setInvisible(true); disguise.setSoundDisguise(new DisguiseCat(Player)); Host.Manager.GetDisguise().disguise(disguise); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/micro/Micro.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/micro/Micro.java index cd0eb796a..e35832f40 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/micro/Micro.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/micro/Micro.java @@ -9,13 +9,10 @@ import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.block.BlockPlaceEvent; -import mineplex.core.common.util.C; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilTime; -import mineplex.core.timing.TimingManager; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.minecraft.game.core.damage.CustomDamageEvent; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/milkcow/MilkCow.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/milkcow/MilkCow.java index 53e31fa0b..e01db1c83 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/milkcow/MilkCow.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/milkcow/MilkCow.java @@ -35,6 +35,7 @@ import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTime; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; +import mineplex.core.visibility.VisibilityManager; import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.ArcadeManager; @@ -293,11 +294,7 @@ public class MilkCow extends SoloGame newKit.ApplyKit(player); //Refresh - for (Player other : UtilServer.getPlayers()) - { - other.hidePlayer(player); - other.showPlayer(player); - } + VisibilityManager.Instance.refreshPlayerToAll(player); if (forced) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java index 59ff8b55e..8a05509f2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java @@ -109,7 +109,6 @@ import nautilus.game.arcade.stats.KillFastStatTracker; import nautilus.game.arcade.stats.KillReasonStatTracker; import nautilus.game.arcade.stats.KillsWithConditionStatTracker; import nautilus.game.arcade.stats.MineStrikeLastAliveKillStatTracker; - import net.minecraft.server.v1_7_R4.EntityArrow; public class MineStrike extends TeamGame @@ -260,8 +259,6 @@ public class MineStrike extends TeamGame this.InventoryClick = true; this.JoinInProgress = true; - - this.CompassSpectatorMenu = false; _scoreObj = Scoreboard.GetScoreboard().registerNewObjective("HP", "dummy"); _scoreObj.setDisplaySlot(DisplaySlot.BELOW_NAME); @@ -2137,6 +2134,8 @@ public class MineStrike extends TeamGame targetTeam = GetTeamList().get(0); SetPlayerTeam(event.getPlayer(), targetTeam, false); + + ((CraftPlayer) event.getPlayer()).getHandle().spectating = true; } @EventHandler(priority = EventPriority.HIGHEST) @@ -2665,23 +2664,6 @@ public class MineStrike extends TeamGame event.AddMod(this.GetName(), "Fire", 3, false); } - @Override - public void SetSpectator(Player player, boolean teleport) - { - Manager.Clear(player); - - player.setVelocity(new Vector(0,1,0)); - player.setGameMode(GameMode.CREATIVE); - player.setFlying(true); - player.setFlySpeed(0.1f); - ((CraftPlayer)player).getHandle().spectating = true; - ((CraftPlayer)player).getHandle().k = false; - - Manager.GetCondition().Factory().Cloak("Spectator", player, player, 7777, true, true); - - Scoreboard.SetPlayerTeam(player, "SPEC"); - } - @EventHandler public void teleportCancel(PlayerTeleportEvent event) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/ShopManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/ShopManager.java index cbcc3cf78..bb6d58f7a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/ShopManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/ShopManager.java @@ -287,7 +287,7 @@ public class ShopManager public void update() { - for (Player player : Host.GetPlayers(true)) + for (Player player : Host.GetPlayers(false)) { GameTeam team = Host.GetTeam(player); @@ -309,12 +309,12 @@ public class ShopManager } //Leave Shop - if (_inShop.contains(player) && (!nearShop || !isBuyTime()) || player.getGameMode() != GameMode.SURVIVAL) + if (_inShop.contains(player) && (!nearShop || !isBuyTime()) || Host.Manager.isSpectator(player) || player.getAllowFlight()) { leaveShop(player, true, false); } //Enter Shop - else if (!_inShop.contains(player) && (nearShop && isBuyTime()) && player.getGameMode() == GameMode.SURVIVAL) + else if (!_inShop.contains(player) && (nearShop && isBuyTime()) && !Host.Manager.isSpectator(player) && !player.getAllowFlight()) { enterShop(player); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/paintball/Paintball.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/paintball/Paintball.java index cff4bc7bd..75982a00d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/paintball/Paintball.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/paintball/Paintball.java @@ -109,7 +109,7 @@ public class Paintball extends TeamGame "Revive/heal with Water Bombs", "Last team alive wins!" }); - + this.StrictAntiHack = true; this.HungerSet = 20; @@ -142,22 +142,6 @@ public class Paintball extends TeamGame { CleanColorArmor(event.GetPlayer()); } - - @EventHandler(priority = EventPriority.HIGH) - public void RefreshPlayers(GameStateChangeEvent event) - { - if (event.GetState() != GameState.Live) - return; - - for (Player player : GetPlayers(true)) - { - for (Player other : GetPlayers(true)) - { - other.hidePlayer(player); - other.showPlayer(player); - } - } - } @EventHandler public void HealthRegen(EntityRegainHealthEvent event) @@ -318,7 +302,7 @@ public class Paintball extends TeamGame Manager.GetCondition().Factory().Cloak("Hit", player, player, 9999, false, false); //Settings - player.setGameMode(GameMode.CREATIVE); + player.setAllowFlight(true); player.setFlying(true); ((CraftPlayer)player).getHandle().spectating = true; ((CraftPlayer)player).getHandle().k = false; @@ -429,7 +413,7 @@ public class Paintball extends TeamGame } //Settings - player.setGameMode(GameMode.SURVIVAL); + player.setAllowFlight(false); player.setFlying(false); ((CraftPlayer)player).getHandle().spectating = false; ((CraftPlayer)player).getHandle().k = true; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/runner/Runner.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/runner/Runner.java index a97517672..95a7aa264 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/runner/Runner.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/runner/Runner.java @@ -189,7 +189,7 @@ public class Runner extends SoloGame implements IThrown byte data = block.getData(); MapUtil.QuickChangeBlockAt(block.getLocation(), Material.AIR); FallingBlock ent = block.getWorld().spawnFallingBlock(block.getLocation(), id, data); - Manager.GetProjectile().AddThrow(ent, null, this, -1, true, false, false, false, 1d); + Manager.GetProjectile().AddThrow(ent, null, this, -1, true, false, false, false, 0.3f); blockIterator.remove(); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/searchanddestroy/SearchAndDestroy.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/searchanddestroy/SearchAndDestroy.java index 235de0917..e4005cf25 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/searchanddestroy/SearchAndDestroy.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/searchanddestroy/SearchAndDestroy.java @@ -66,7 +66,6 @@ public class SearchAndDestroy extends TeamGame WorldTimeSet = -1; WorldBoundaryKill = false; HungerSet = 20; - RepairWeapons = false; AnnounceJoinQuit = false; DisableKillCommand = false; AllowParticles = false; @@ -200,7 +199,7 @@ public class SearchAndDestroy extends TeamGame true, "Bomb", "Bomb"); if (IsAlive(player)) { - this.SetSpectator(player, true); + Manager.addSpectator(player, true); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/sheep/SheepGame.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/sheep/SheepGame.java index 1b06456fe..769d08b71 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/sheep/SheepGame.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/sheep/SheepGame.java @@ -32,7 +32,6 @@ import org.bukkit.event.player.PlayerItemHeldEvent; import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilAlg; - import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilGear; import mineplex.core.common.util.UtilInv; @@ -260,7 +259,7 @@ public class SheepGame extends TeamGame for (Player player : GetPlayers(true)) { if (!Recharge.Instance.usable(player, "Sheep Stack")) - return; + continue; for (Entity ent : player.getWorld().getEntities()) { @@ -284,7 +283,7 @@ public class SheepGame extends TeamGame if (player.getItemInHand() != null && player.getItemInHand().getType() != Material.SADDLE) return true; - if (player.getGameMode() != GameMode.SURVIVAL) + if (Manager.isSpectator(player)) return true; if (!IsAlive(player)) @@ -373,7 +372,7 @@ public class SheepGame extends TeamGame if (player.getItemInHand() != null && player.getItemInHand().getType() != Material.SADDLE) return; - if (event.getPlayer().getGameMode() != GameMode.SURVIVAL) + if (Manager.isSpectator(event.getPlayer())) return; if (!IsAlive(event.getPlayer())) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java index b125bf374..cbab11fa3 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitGolem.java @@ -112,7 +112,7 @@ public class KitGolem extends SmashKit else disguise.setName(player.getName()); - //disguise.setCustomNameVisible(true); + disguise.setCustomNameVisible(true); Manager.GetDisguise().disguise(disguise); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java index 5e27ba01e..e1b22e1b2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/smash/kits/KitSlime.java @@ -181,7 +181,7 @@ public class KitSlime extends SmashKit if (player.equals(other)) continue; - if (other.getGameMode() != GameMode.SURVIVAL) + if (Manager.isSpectator(other)) continue; if (UtilMath.offset(player.getLocation().add(0, 3, 0), other.getLocation()) < 5) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/stacker/Stacker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/stacker/Stacker.java index 7b7565bfc..fef37436a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/stacker/Stacker.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/stacker/Stacker.java @@ -152,7 +152,7 @@ public class Stacker extends SoloGame implements IThrown UtilAction.velocity(throwee, thrower.getLocation().getDirection(), 1.8, false, 0, 0.3, 2, false); - Manager.GetProjectile().AddThrow(throwee, thrower, this, -1, true, false, true, false, 2.4d); + Manager.GetProjectile().AddThrow(throwee, thrower, this, -1, true, false, true, false, 1f); } @Override @@ -170,7 +170,7 @@ public class Stacker extends SoloGame implements IThrown //Hit Own Stack > Rethrow if (hit.equals(data.GetThrower())) { - Manager.GetProjectile().AddThrow(data.GetThrown(), data.GetThrower(), this, -1, true, false, true, false, 2.4d); + Manager.GetProjectile().AddThrow(data.GetThrown(), data.GetThrower(), this, -1, true, false, true, false, 1f); return; } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java index b7cf27665..d1c49d258 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java @@ -14,12 +14,17 @@ import org.bukkit.block.DoubleChest; import org.bukkit.block.Furnace; import org.bukkit.craftbukkit.v1_7_R4.CraftWorld; import org.bukkit.craftbukkit.v1_7_R4.entity.CraftArrow; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftLargeFireball; import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; +import org.bukkit.entity.Boat; +import org.bukkit.entity.Egg; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Fireball; import org.bukkit.entity.Firework; import org.bukkit.entity.ItemFrame; import org.bukkit.entity.Player; +import org.bukkit.entity.Snowball; import org.bukkit.entity.TNTPrimed; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -33,6 +38,7 @@ import org.bukkit.event.entity.EntityShootBowEvent; import org.bukkit.event.entity.ExplosionPrimeEvent; import org.bukkit.event.entity.ItemSpawnEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.hanging.HangingBreakEvent; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.PrepareItemCraftEvent; @@ -43,6 +49,7 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.vehicle.VehicleCreateEvent; import org.bukkit.inventory.FurnaceInventory; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; @@ -51,6 +58,7 @@ import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scoreboard.Scoreboard; import org.bukkit.scoreboard.Team; import org.bukkit.scoreboard.TeamNameTagVisibility; +import org.bukkit.util.Vector; import mineplex.core.common.util.C; import mineplex.core.common.util.F; @@ -72,6 +80,7 @@ import mineplex.core.common.util.UtilTime; import mineplex.core.common.util.UtilWorld; import mineplex.core.disguise.disguises.DisguisePlayer; import mineplex.core.itemstack.ItemBuilder; +import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.loot.*; import mineplex.core.packethandler.IPacketHandler; import mineplex.core.packethandler.PacketInfo; @@ -79,6 +88,7 @@ import mineplex.core.packethandler.PacketPlayOutWorldBorder; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; +import mineplex.core.visibility.VisibilityManager; import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.ArcadeManager; @@ -93,6 +103,7 @@ import nautilus.game.arcade.stats.KillsWithinTimeLimitStatTracker; import nautilus.game.arcade.stats.SimultaneousSkeletonStatTracker; import nautilus.game.arcade.stats.WinWithoutWearingArmorStatTracker; import net.minecraft.server.v1_7_R4.EntityArrow; +import net.minecraft.server.v1_7_R4.EntityLargeFireball; import net.minecraft.server.v1_7_R4.PacketPlayInUseEntity; import net.minecraft.server.v1_7_R4.PacketPlayOutScoreboardTeam; import net.minecraft.server.v1_7_R4.ScoreboardTeam; @@ -134,7 +145,6 @@ public class SurvivalGames extends SoloGame private double _currentBorder; private double _previousBorder; private long _borderStartedMoving; - private ArrayList _borderIgnore = new ArrayList(); // Deathmatch private boolean _deathMatchTeleported = false; @@ -160,48 +170,50 @@ public class SurvivalGames extends SoloGame { super(manager, GameType.SurvivalGames, - new Kit[] - { - new KitAxeman(manager), + new Kit[] + { + new KitAxeman(manager), - // new KitLooter(manager), + // new KitLooter(manager), - new KitKnight(manager), + new KitKnight(manager), - new KitArcher(manager), + new KitArcher(manager), - new KitBrawler(manager), + new KitBrawler(manager), - new KitAssassin(manager), + new KitAssassin(manager), - new KitBeastmaster(manager), + new KitBeastmaster(manager), - new KitBomber(manager), + new KitBomber(manager), - new KitNecromancer(manager), + new KitNecromancer(manager), - new KitHorseman(manager) - }, + new KitBarbarian(manager), - new String[] - { - "Search for chests to find loot", + new KitHorseman(manager), + }, - "Slaughter your opponents", + new String[] + { + "Search for chests to find loot", - "Stay away from the borders!", + "Slaughter your opponents", - "Last tribute alive wins!" - }); + "Stay away from the borders!", + + "Last tribute alive wins!" + }); _help = new String[] - { - C.cGreen + "Use a Compass to find and kill enemies!", + { + C.cGreen + "Use a Compass to find and kill enemies!", - C.cGreen + "You lose Speed 2 at start of game if you attack.", + C.cGreen + "You lose Speed 2 at start of game if you attack.", - C.cAqua + "Avoid enemies who have better gear than you!" - }; + C.cAqua + "Avoid enemies who have better gear than you!" + }; // Manager.GetAntiStack().SetEnabled(false); @@ -231,27 +243,9 @@ public class SurvivalGames extends SoloGame PlaySoundGameStart = false; PrepareTime = 15000; - // Blocks - BlockBreakAllow.add(Material.TNT.getId()); // TNT - BlockPlaceAllow.add(Material.TNT.getId()); - BlockBreakAllow.add(Material.WEB.getId()); // Web BlockPlaceAllow.add(Material.WEB.getId()); - BlockBreakAllow.add(Material.TRIPWIRE.getId()); // Tripwire - BlockPlaceAllow.add(Material.TRIPWIRE.getId()); - - BlockBreakAllow.add(Material.TRIPWIRE_HOOK.getId()); // Wire Hook - BlockPlaceAllow.add(Material.TRIPWIRE_HOOK.getId()); - - BlockBreakAllow.add(Material.REDSTONE_WIRE.getId()); // Redstone Dust - BlockPlaceAllow.add(Material.REDSTONE_WIRE.getId()); - - BlockBreakAllow.add(Material.WOOD_PLATE.getId()); // Wood Pressure Plate - BlockPlaceAllow.add(Material.WOOD_PLATE.getId()); - - BlockBreakAllow.add(Material.LEVER.getId()); // Lever - BlockPlaceAllow.add(Material.LEVER.getId()); BlockBreakAllow.add(Material.LEAVES.getId()); // Leaves BlockBreakAllow.add(Material.LEAVES_2.getId()); // Leaves @@ -496,7 +490,7 @@ public class SurvivalGames extends SoloGame } } - @EventHandler + // @EventHandler public void chestTickEvent(UpdateEvent event) { if (event.getType() != UpdateType.SLOW) @@ -596,6 +590,31 @@ public class SurvivalGames extends SoloGame WorldData.World.setTime(WorldTimeSet); } + @EventHandler + public void onVechilePlace(VehicleCreateEvent event) + { + if (event.getVehicle() instanceof Boat) + { + for (int x = -1; x <= 1; x++) + { + for (int y = -1; y <= 1; y++) + { + for (int z = -1; z <= 1; z++) + { + Block b = event.getVehicle().getLocation().add(x, y, z).getBlock(); + + if (b.isLiquid()) + { + return; + } + } + } + } + + event.getVehicle().remove(); + } + } + @EventHandler public void deathmatchBowShoot(EntityShootBowEvent event) { @@ -713,14 +732,9 @@ public class SurvivalGames extends SoloGame { if (_deathMatchTime == 5) { - for (Player player : GetPlayers(true)) { - for (Player other : GetPlayers(true)) - { - player.hidePlayer(other); - player.showPlayer(other); - } + VisibilityManager.Instance.refreshPlayerToAll(player); } } else if (_deathMatchTime == 0) @@ -790,9 +804,9 @@ public class SurvivalGames extends SoloGame // A complicated way to get the face the dead body should be towards. for (HashSet validBlocks : new HashSet[] - { - UtilBlock.blockAirFoliageSet, UtilBlock.blockPassSet - }) + { + UtilBlock.blockAirFoliageSet, UtilBlock.blockPassSet + }) { if (validBlocks.contains((byte) block.getRelative(proper).getTypeId())) @@ -801,9 +815,9 @@ public class SurvivalGames extends SoloGame } for (BlockFace face : new BlockFace[] - { - BlockFace.EAST, BlockFace.SOUTH, BlockFace.NORTH, BlockFace.WEST - }) + { + BlockFace.EAST, BlockFace.SOUTH, BlockFace.NORTH, BlockFace.WEST + }) { if (validBlocks.contains((byte) block.getRelative(face).getTypeId())) { @@ -842,9 +856,6 @@ public class SurvivalGames extends SoloGame for (Player alive : GetPlayers(true)) { - System.out.print("Sending " + player.getName() + " death to " + alive.getName() + ": " - + _hiddenNames.get(player).contains(alive.getName())); - if (_hiddenNames.get(player).contains(alive.getName())) { teamName.set(packet, alive.getName()); @@ -855,6 +866,8 @@ public class SurvivalGames extends SoloGame } } + _hiddenNames.remove(player); + team.setNameTagVisibility(TeamNameTagVisibility.NEVER); team.addEntry(name); @@ -882,6 +895,7 @@ public class SurvivalGames extends SoloGame getArcadeManager().GetDisguise().addFutureDisguise(disguise); Entity entity = player.getWorld().spawnEntity(player.getLocation(), EntityType.ARROW); + try { EntityArrow entityArrow = ((CraftArrow) entity).getHandle(); @@ -894,8 +908,6 @@ public class SurvivalGames extends SoloGame { ex.printStackTrace(); } - - _hiddenNames.remove(player); } @EventHandler @@ -914,6 +926,15 @@ public class SurvivalGames extends SoloGame event.SetDamageToLevel(false); } + @EventHandler + public void SnowballEggsDamage(CustomDamageEvent event) + { + if (event.GetProjectile() instanceof Snowball || event.GetProjectile() instanceof Egg) + { + event.AddMod("Projectile", "Projectile", 0.01, false); + } + } + @EventHandler public void DisallowBrewingStand(PlayerInteractEvent event) { @@ -1066,6 +1087,9 @@ public class SurvivalGames extends SoloGame event.setCancelled(true); } return; + case WOOD: + event.setCancelled(true); + return; default: break; @@ -1341,52 +1365,168 @@ public class SurvivalGames extends SoloGame distanceMovedSince *= percentageBorderMoved; double border = (_previousBorder - 0.3D) + distanceMovedSince; - ArrayList borderIgnore = new ArrayList(); + //24 @ 100+ reduced to 0 at 32- + double borderAttackDist = Math.max(8, (Math.min(100, border) - 28d) / 3d); + double borderCheckDist = borderAttackDist + 6; + for (Player player : UtilServer.getPlayers()) { - if (_borderIgnore.contains(player.getName())) - { - continue; - } - Location loc = player.getLocation(); - if (loc.getX() > _spawn.getX() + border || loc.getX() < _spawn.getX() - border || loc.getZ() > _spawn.getZ() + border - || loc.getZ() < _spawn.getZ() - border) + //Bump Players Back In + if (loc.getX() > _spawn.getX() + border || + loc.getX() < _spawn.getX() - border || + loc.getZ() > _spawn.getZ() + border || + loc.getZ() < _spawn.getZ() - border) { - if (!Manager.IsAlive(player)) + if (Recharge.Instance.use(player, "Hit by Border", 1000, false, false)) { - player.teleport(GetSpectatorLocation()); - } - else - { - UtilAction.velocity(player, UtilAlg.getTrajectory2d(loc, GetSpectatorLocation()), 1, true, 0.4, 0, 10, true); + Entity bottom = player; + while (bottom.getVehicle() != null) + bottom = bottom.getVehicle(); + + UtilAction.velocity(bottom, UtilAlg.getTrajectory2d(loc, GetSpectatorLocation()), 1.2, true, 0.4, 0, 10, true); - Manager.GetDamage().NewDamageEvent(player, null, null, DamageCause.CUSTOM, 1, false, false, false, "Border", - "Border Damage"); + if (Manager.IsAlive(player)) + { + Manager.GetDamage().NewDamageEvent(player, null, null, DamageCause.CUSTOM, 10, false, false, false, "Nether Field", + "Vaporize"); - player.getWorld().playSound(loc, Sound.NOTE_BASS, 2f, 1f); - player.getWorld().playSound(loc, Sound.NOTE_BASS, 2f, 1f); - - borderIgnore.add(player.getName()); + player.getWorld().playSound(loc, Sound.NOTE_BASS, 2f, 1f); + player.getWorld().playSound(loc, Sound.NOTE_BASS, 2f, 1f); + } } } - } - _borderIgnore = borderIgnore; + if (border < 32) + continue; + + //Attack Players who are nearby + boolean isX = true; + Location attackSource = null; + if (loc.getX() > _spawn.getX() + (border-borderCheckDist)) + { + attackSource = player.getLocation(); + attackSource.setX(_spawn.getX() + border); + } + else if (loc.getX() < _spawn.getX() - (border-borderCheckDist)) + { + attackSource = player.getLocation(); + attackSource.setX(_spawn.getX() - border); + } + else if (loc.getZ() > _spawn.getZ() + (border-borderCheckDist)) + { + attackSource = player.getLocation(); + attackSource.setZ(_spawn.getZ() + border); + isX = false; + } + else if (loc.getZ() < _spawn.getZ() - (border-borderCheckDist)) + { + attackSource = player.getLocation(); + attackSource.setZ(_spawn.getZ() - border); + isX = false; + } + + if (attackSource != null) + { + double dist = UtilMath.offset(player.getLocation(), attackSource); + + double scale = 1 - (dist / borderAttackDist); + + player.playSound(player.getLocation().add(UtilAlg.getTrajectory(player.getLocation(), attackSource).multiply(8)), + Sound.PORTAL, (float)(1 - (dist / borderCheckDist)) * 2, 2f); + + if (!Manager.IsAlive(player)) + continue; + + //Shoot more frequently when they get closer + if (dist < borderAttackDist && Math.random() < scale) + { + //Spawn Fireball + Location spawn = attackSource.clone(); + spawn.add(isX ? 0 : (Math.random()-0.5)*12, 4 + Math.random() * 2 + (Math.random() * 12 * scale), isX ? (Math.random()-0.5)*12 : 0); + + //Raytrace back + double maxBack = 8; + double back = 0; + while (spawn.getBlock().getType() == Material.AIR && back < maxBack) + { + spawn.subtract(UtilAlg.getTrajectory(spawn, player.getLocation()).multiply(0.2)); + back += 0.1; + } + + //Move out of block + spawn.add(UtilAlg.getTrajectory(spawn, player.getLocation()).multiply(Math.min(back, 1))); + + + Fireball ball = player.getWorld().spawn(spawn, Fireball.class); + + //Trajectory + Vector traj = UtilAlg.getTrajectory(spawn, player.getLocation()); + traj.add(new Vector((Math.random()-0.5)*0.2,(Math.random()-0.5)*0.2,(Math.random()-0.5)*0.2)); + + EntityLargeFireball eFireball = ((CraftLargeFireball) ball).getHandle(); + eFireball.dirX = traj.getX() * 0.1; + eFireball.dirY = traj.getY() * 0.1; + eFireball.dirZ = traj.getZ() * 0.1; + + UtilParticle.PlayParticle(ParticleType.LARGE_EXPLODE, spawn, 0, 0, 0, 0, 1); + player.getWorld().playSound(attackSource, Sound.GHAST_FIREBALL, 2f, 2f); + } + } + } + } + + @EventHandler + public void borderBlockDamage(ProjectileHitEvent event) + { + if (!IsLive()) + return; + + if (!(event.getEntity() instanceof Fireball)) + return; + + Collection blocks = UtilBlock.getInRadius(event.getEntity().getLocation(), 2.4).keySet(); + + Manager.GetExplosion().BlockExplosion(blocks, event.getEntity().getLocation(), false); + } + + public boolean isStableBlock(Block block) + { + int sides = 0; + if (UtilBlock.solid(block.getRelative(BlockFace.NORTH))) sides++; + if (UtilBlock.solid(block.getRelative(BlockFace.EAST))) sides++; + if (UtilBlock.solid(block.getRelative(BlockFace.SOUTH))) sides++; + if (UtilBlock.solid(block.getRelative(BlockFace.WEST))) sides++; + + return sides >= 3; + } + + @EventHandler + public void borderDamage(CustomDamageEvent event) + { + if (event.GetProjectile() == null) + return; + + if (!(event.GetProjectile() instanceof Fireball)) + return; + + event.AddMult("Fireball", "Nether Field", 1, true); + + event.AddKnockback("Fireball", 2); } private ArrayList buildBorders(int seconds, double border, double leaveRemaining) { - double totalNumber = Math.pow(seconds, 2D) + seconds; + double totalNumber = Math.pow(seconds, 1.9D) + (seconds * 50); ArrayList borders = new ArrayList(); for (int i = 0; i <= seconds; i++) { - borders.add(border - ((border - leaveRemaining) * (((Math.pow(i, 2D)) + i) / totalNumber))); + borders.add(border - ((border - leaveRemaining) * (((Math.pow(i, 1.9D) + (i * 50))) / totalNumber))); } return borders; @@ -1571,8 +1711,18 @@ public class SurvivalGames extends SoloGame Scoreboard.WriteBlank(); - Scoreboard.Write(C.cGreen + C.Bold + "Tributes"); - Scoreboard.Write("" + team.GetPlayers(true).size()); + Scoreboard.Write(C.cYellow + C.Bold + "Tributes"); + if (team.GetPlayers(true).size() > 7) + { + Scoreboard.Write("" + team.GetPlayers(true).size()); + } + else + { + for (Player player : team.GetPlayers(true)) + { + Scoreboard.Write(C.cWhite + player.getName()); + } + } Scoreboard.WriteBlank(); @@ -1583,13 +1733,13 @@ public class SurvivalGames extends SoloGame } else if (_deathMatchTime > 0) { - Scoreboard.Write(C.cGray + C.Bold + "Deathmatch"); + Scoreboard.Write(C.cRed + C.Bold + "Deathmatch"); Scoreboard.Write(UtilTime.convertString( Math.min(_deathMatchTime, _deathMatchTeleported ? 10 : _deathMatchTime) * 1000, 0, TimeUnit.FIT)); } else { - Scoreboard.Write(C.cGray + C.Bold + "Game End"); + Scoreboard.Write(C.cRed + C.Bold + "Game End"); Scoreboard.Write(UtilTime.convertString(Math.max(0, _gameEndTime) * 1000, 0, TimeUnit.FIT)); } @@ -1694,23 +1844,21 @@ public class SurvivalGames extends SoloGame private void setupLoot() { // Food - _baseLoot.registerLoot(new RandomItem(Material.RAW_FISH, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.RAW_BEEF, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.RAW_CHICKEN, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.POTATO_ITEM, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.CARROT_ITEM, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.RED_MUSHROOM, 15, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.BROWN_MUSHROOM, 15, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.WHEAT, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.APPLE, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.PORK, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(new ItemStack(Material.INK_SACK, 1, (short) 3), 30, 1, 2)); // Cocoa beans - _baseLoot.registerLoot(new RandomItem(Material.ROTTEN_FLESH, 40, 1, 2)); + _baseLoot.registerLoot(new RandomItem(Material.BAKED_POTATO, 30, 1, 3)); + _baseLoot.registerLoot(new RandomItem(Material.COOKED_BEEF, 30, 1, 2)); + _baseLoot.registerLoot(new RandomItem(Material.COOKED_CHICKEN, 30, 1, 2)); + _baseLoot.registerLoot(new RandomItem(Material.CARROT_ITEM, 30, 1, 3)); + _baseLoot.registerLoot(new RandomItem(Material.MUSHROOM_SOUP, 15, 1, 1)); + _baseLoot.registerLoot(new RandomItem(Material.WHEAT, 30, 1, 6)); + _baseLoot.registerLoot(new RandomItem(Material.APPLE, 30, 1, 4)); + _baseLoot.registerLoot(new RandomItem(Material.PORK, 30, 1, 4)); + _baseLoot.registerLoot(new RandomItem(Material.ROTTEN_FLESH, 40, 1, 6)); // Weapons - _baseLoot.registerLoot(new RandomItem(Material.WOOD_AXE, 40)); - _baseLoot.registerLoot(new RandomItem(Material.WOOD_SWORD, 35)); - _baseLoot.registerLoot(new RandomItem(Material.STONE_AXE, 30)); + _baseLoot.registerLoot(new RandomItem(Material.WOOD_AXE, 80)); + _baseLoot.registerLoot(new RandomItem(Material.WOOD_SWORD, 70)); + _baseLoot.registerLoot(new RandomItem(Material.STONE_AXE, 60)); + _baseLoot.registerLoot(new RandomItem(Material.STONE_SWORD, 30)); // Leather armor _baseLoot.registerLoot(new RandomItem(Material.LEATHER_BOOTS, 30)); @@ -1718,11 +1866,17 @@ public class SurvivalGames extends SoloGame _baseLoot.registerLoot(new RandomItem(Material.LEATHER_HELMET, 30)); _baseLoot.registerLoot(new RandomItem(Material.LEATHER_LEGGINGS, 30)); + // Gold armor + _baseLoot.registerLoot(new RandomItem(Material.GOLD_BOOTS, 25)); + _baseLoot.registerLoot(new RandomItem(Material.GOLD_CHESTPLATE, 25)); + _baseLoot.registerLoot(new RandomItem(Material.GOLD_HELMET, 25)); + _baseLoot.registerLoot(new RandomItem(Material.GOLD_LEGGINGS, 25)); + // Chain armor - _baseLoot.registerLoot(new RandomItem(Material.CHAINMAIL_BOOTS, 30)); - _baseLoot.registerLoot(new RandomItem(Material.CHAINMAIL_CHESTPLATE, 30)); - _baseLoot.registerLoot(new RandomItem(Material.CHAINMAIL_HELMET, 30)); - _baseLoot.registerLoot(new RandomItem(Material.CHAINMAIL_LEGGINGS, 30)); + _baseLoot.registerLoot(new RandomItem(Material.CHAINMAIL_BOOTS, 20)); + _baseLoot.registerLoot(new RandomItem(Material.CHAINMAIL_CHESTPLATE, 20)); + _baseLoot.registerLoot(new RandomItem(Material.CHAINMAIL_HELMET, 20)); + _baseLoot.registerLoot(new RandomItem(Material.CHAINMAIL_LEGGINGS, 20)); // Throwable _baseLoot.registerLoot(new RandomItem(Material.FISHING_ROD, 30)); @@ -1739,26 +1893,27 @@ public class SurvivalGames extends SoloGame _baseLoot.registerLoot(new RandomItem(Material.FLINT, 30, 1, 2)); _baseLoot.registerLoot(new RandomItem(Material.FEATHER, 30, 1, 2)); _baseLoot.registerLoot(new RandomItem(Material.GOLD_INGOT, 20)); + _baseLoot.registerLoot(new RandomItem(ItemStackFactory.Instance.CreateStack(Material.TNT, (byte)0, 1, F.item("Throwing TNT")), 15)); + _spawnLoot.registerLoot(new RandomItem(Material.MUSHROOM_SOUP, 15)); _spawnLoot.cloneLoot(_baseLoot); // Food - _spawnLoot.registerLoot(new RandomItem(Material.BAKED_POTATO, 30, 1, 2)); + _spawnLoot.registerLoot(new RandomItem(Material.BAKED_POTATO, 30, 1, 5)); _spawnLoot.registerLoot(new RandomItem(Material.CAKE, 30)); - _spawnLoot.registerLoot(new RandomItem(Material.COOKED_BEEF, 30, 1, 2)); - _spawnLoot.registerLoot(new RandomItem(Material.COOKED_CHICKEN, 30, 1, 2)); - _spawnLoot.registerLoot(new RandomItem(Material.COOKED_FISH, 30, 1, 2)); - _spawnLoot.registerLoot(new RandomItem(Material.GRILLED_PORK, 30, 1, 2)); + _spawnLoot.registerLoot(new RandomItem(Material.MUSHROOM_SOUP, 30, 1, 1)); + _spawnLoot.registerLoot(new RandomItem(Material.COOKED_BEEF, 30, 1, 3)); + _spawnLoot.registerLoot(new RandomItem(Material.COOKED_CHICKEN, 30, 1, 3)); + _spawnLoot.registerLoot(new RandomItem(Material.COOKED_FISH, 30, 1, 6)); + _spawnLoot.registerLoot(new RandomItem(Material.GRILLED_PORK, 30, 1, 3)); _spawnLoot.registerLoot(new RandomItem(Material.COOKIE, 30)); - _spawnLoot.registerLoot(new RandomItem(Material.PUMPKIN_PIE, 30, 1, 2)); - _spawnLoot.registerLoot(new RandomItem(Material.APPLE, 30, 1, 2)); + _spawnLoot.registerLoot(new RandomItem(Material.PUMPKIN_PIE, 30, 1, 3)); + _spawnLoot.registerLoot(new RandomItem(Material.APPLE, 30, 2, 6)); // Loot for chests in spawn - // Random bowl - _spawnLoot.registerLoot(new RandomItem(Material.BOWL, 30, 1, 2)); - // Weaponry and ores _spawnLoot.registerLoot(new RandomItem(Material.STONE_SWORD, 30)); + _spawnLoot.registerLoot(new RandomItem(Material.IRON_AXE, 30)); _spawnLoot.registerLoot(new RandomItem(Material.IRON_INGOT, 30, 1, 2)); _spawnLoot.registerLoot(new RandomItem(Material.DIAMOND, 30)); @@ -1770,10 +1925,10 @@ public class SurvivalGames extends SoloGame // Supply crate loot // Diamond gear - _crateLoot.registerLoot(new RandomItem(Material.DIAMOND_HELMET, 3)); - _crateLoot.registerLoot(new RandomItem(Material.DIAMOND_CHESTPLATE, 1)); - _crateLoot.registerLoot(new RandomItem(Material.DIAMOND_LEGGINGS, 2)); - _crateLoot.registerLoot(new RandomItem(Material.DIAMOND_BOOTS, 3)); + _crateLoot.registerLoot(new RandomItem(Material.DIAMOND_HELMET, 10)); + _crateLoot.registerLoot(new RandomItem(Material.DIAMOND_CHESTPLATE, 6)); + _crateLoot.registerLoot(new RandomItem(Material.DIAMOND_LEGGINGS, 8)); + _crateLoot.registerLoot(new RandomItem(Material.DIAMOND_BOOTS, 10)); // Iron gear _crateLoot.registerLoot(new RandomItem(Material.IRON_HELMET, 30)); @@ -1796,11 +1951,11 @@ public class SurvivalGames extends SoloGame _cookedFurnace.registerLoot(new RandomItem(Material.IRON_INGOT, 1, 1, 1)); // Raw furnace - _rawFurnace.registerLoot(new RandomItem(Material.RAW_BEEF, 1, 1, 2)); - _rawFurnace.registerLoot(new RandomItem(Material.RAW_CHICKEN, 1, 1, 2)); - _rawFurnace.registerLoot(new RandomItem(Material.RAW_FISH, 1, 1, 2)); - _rawFurnace.registerLoot(new RandomItem(Material.PORK, 1, 1, 2)); - _rawFurnace.registerLoot(new RandomItem(Material.POTATO_ITEM, 1, 1, 2)); + _rawFurnace.registerLoot(new RandomItem(Material.RAW_BEEF, 1, 1, 3)); + _rawFurnace.registerLoot(new RandomItem(Material.RAW_CHICKEN, 1, 1, 3)); + _rawFurnace.registerLoot(new RandomItem(Material.RAW_FISH, 1, 1, 3)); + _rawFurnace.registerLoot(new RandomItem(Material.PORK, 1, 1, 3)); + _rawFurnace.registerLoot(new RandomItem(Material.POTATO_ITEM, 1, 1, 3)); // Deathmatch Loot _deathMatchLoot.registerLoot(new RandomItem(Material.PUMPKIN_PIE, 4)); @@ -1971,7 +2126,7 @@ public class SurvivalGames extends SoloGame /*CustomExplosion explosion = new CustomExplosion(getArcadeManager().GetDamage(), event.getEntity().getLocation(), ((TNTPrimed) event.getEntity()).getYield(), "Throwing TNT"); - + explosion.setPlayer(player, true);*/ for (Player other : UtilPlayer.getNearby(event.getEntity().getLocation(), 14)) @@ -2013,6 +2168,8 @@ public class SurvivalGames extends SoloGame TNTPrimed tnt = player.getWorld() .spawn(player.getEyeLocation().add(player.getLocation().getDirection()), TNTPrimed.class); + tnt.setFuseTicks(60); + UtilAction.velocity(tnt, player.getLocation().getDirection(), 0.5, false, 0, 0.1, 10, false); _tntMap.put(tnt, player); @@ -2081,32 +2238,35 @@ public class SurvivalGames extends SoloGame if (!checkedPlayers.containsKey(target) || !checkedPlayers.get(target).containsKey(player)) { - if (target.getLocation().distance(player.getLocation()) > 16) + if (player.getLocation().distance(target.getLocation()) > (GetKit(target) instanceof KitAssassin ? 8 : 24)) { hideName = true; } - else if (!target.hasLineOfSight(player)) + else if (!player.hasLineOfSight(target)) { // no los hideName = true; } Player[] players = new Player[] - { - target, player - }; + { + target, player + }; - for (int i = 0; i <= 1; i++) + if (!(GetKit(player) instanceof KitAssassin || GetKit(target) instanceof KitAssassin)) { - Player p1 = players[i]; - Player p2 = players[1 - i]; - - if (!checkedPlayers.containsKey(p1)) + for (int i = 0; i <= 1; i++) { - checkedPlayers.put(p1, new HashMap()); - } + Player p1 = players[i]; + Player p2 = players[1 - i]; - checkedPlayers.get(p1).put(p2, hideName); + if (!checkedPlayers.containsKey(p1)) + { + checkedPlayers.put(p1, new HashMap()); + } + + checkedPlayers.get(p1).put(p2, hideName); + } } } else diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/kit/KitAssassin.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/kit/KitAssassin.java index fd23618ff..121a2ddac 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/kit/KitAssassin.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/kit/KitAssassin.java @@ -17,23 +17,23 @@ public class KitAssassin extends Kit { super(manager, "Assassin", KitAvailability.Gem, 5000, - new String[] - { - "Sneak up on opponents while they're looting chests!" - }, + new String[] + { + "Sneak up on opponents while they're looting chests!", - new Perk[] - { + "Players can only see your nametag when 8 blocks away!" + }, + + new Perk[] + { new PerkBackstab(), - }, - EntityType.ZOMBIE, - new ItemStack(Material.IRON_SWORD)); + }, EntityType.ZOMBIE, new ItemStack(Material.IRON_SWORD)); } @Override - public void GiveItems(Player player) + public void GiveItems(Player player) { - + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/kit/KitBarbarian.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/kit/KitBarbarian.java new file mode 100644 index 000000000..b62f2881a --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/kit/KitBarbarian.java @@ -0,0 +1,43 @@ +package nautilus.game.arcade.game.games.survivalgames.kit; + +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import mineplex.core.recharge.Recharge; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.kit.KitAvailability; +import nautilus.game.arcade.kit.Perk; +import nautilus.game.arcade.kit.perks.*; + +public class KitBarbarian extends Kit +{ + public KitBarbarian(ArcadeManager manager) + { + super(manager, "Barbarian", KitAvailability.Gem, 6000, + + new String[] + { + "Skilled at taking out teams!", + "Abilities disabled for first 30 seconds." + }, + + new Perk[] + { + + new PerkCleave(0.75, false), + new PerkBladeVortex() + }, + EntityType.ZOMBIE, + new ItemStack(Material.DIAMOND_SWORD)); + + } + + @Override + public void GiveItems(Player player) + { + Recharge.Instance.useForce(player, GetName(), 45000); + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/uhc/UHC.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/uhc/UHC.java index 6b388e4cf..ea663bbe2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/uhc/UHC.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/uhc/UHC.java @@ -160,9 +160,6 @@ public class UHC extends TeamGame this.GemDoubleEnabled = false; this.GemHunterEnabled = false; - // TODO design a better way to handle spectator gui for UHC - this.CompassSpectatorMenu = false; - WorldTimeSet = -1; CraftRecipes(); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wither/WitherGame.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wither/WitherGame.java index bf585a9de..b11d44b68 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wither/WitherGame.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wither/WitherGame.java @@ -528,7 +528,7 @@ public class WitherGame extends TeamGame implements IBlockRestorer Manager.GetCondition().Factory().Cloak("Hit", player, player, 9999, false, false); //Settings - player.setGameMode(GameMode.CREATIVE); + player.setAllowFlight(true); player.setFlying(true); ((CraftPlayer)player).getHandle().spectating = true; ((CraftPlayer)player).getHandle().k = false; @@ -555,7 +555,7 @@ public class WitherGame extends TeamGame implements IBlockRestorer } //Settings - player.setGameMode(GameMode.SURVIVAL); + player.setAllowFlight(false); player.setFlying(false); ((CraftPlayer)player).getHandle().spectating = false; ((CraftPlayer)player).getHandle().k = true; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/Wizards.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/Wizards.java index 551c5df98..9e3ee69af 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/Wizards.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/Wizards.java @@ -149,7 +149,6 @@ public class Wizards extends SoloGame InventoryOpenChest = true; InventoryClick = true; WorldBlockBurn = true; - RepairWeapons = false; DisableKillCommand = false; SoupEnabled = false; DamageTeamSelf = true; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/spells/SpellMagicMissile.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/spells/SpellMagicMissile.java index b3334ed38..8135e800f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/spells/SpellMagicMissile.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/spells/SpellMagicMissile.java @@ -3,6 +3,7 @@ package nautilus.game.arcade.game.games.wizards.spells; import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilPlayer; import nautilus.game.arcade.game.games.wizards.Spell; import nautilus.game.arcade.game.games.wizards.spellinterfaces.SpellClick; @@ -38,7 +39,7 @@ public class SpellMagicMissile extends Spell implements SpellClick { if (cur == player || !(cur instanceof LivingEntity) - || (cur instanceof Player && ((Player) cur).getGameMode() == GameMode.CREATIVE)) + || (cur instanceof Player && UtilPlayer.isSpectator(cur))) continue; LivingEntity entity = (LivingEntity) cur; @@ -125,7 +126,7 @@ public class SpellMagicMissile extends Spell implements SpellClick { if (cur == player || !(cur instanceof LivingEntity) - || (cur instanceof Player && ((Player) cur).getGameMode() == GameMode.CREATIVE)) + || (cur instanceof Player && UtilPlayer.isSpectator(cur))) continue; LivingEntity ent = (LivingEntity) cur; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/spells/SpellTrapRune.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/spells/SpellTrapRune.java index 92a55e9b4..6ec3eb59f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/spells/SpellTrapRune.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/spells/SpellTrapRune.java @@ -6,6 +6,7 @@ import java.util.List; import mineplex.core.common.util.C; import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilShapes; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; @@ -36,7 +37,7 @@ public class SpellTrapRune extends Spell implements SpellClick while (itel.hasNext()) { TrapRune rune = itel.next(); - if (!rune.RuneCaster.isOnline() || rune.RuneCaster.getGameMode() == GameMode.CREATIVE) + if (!rune.RuneCaster.isOnline() || UtilPlayer.isSpectator(rune.RuneCaster)) { itel.remove(); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/spells/subclasses/LaunchRune.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/spells/subclasses/LaunchRune.java index d60350ebb..bf936f7ad 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/spells/subclasses/LaunchRune.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/spells/subclasses/LaunchRune.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.UUID; import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilShapes; import mineplex.core.common.util.UtilParticle.ParticleType; import nautilus.game.arcade.game.games.wizards.Wizards; @@ -35,7 +36,7 @@ public class LaunchRune for (LivingEntity entity : _runeLocation.getWorld().getEntitiesByClass(LivingEntity.class)) { - if (!(entity instanceof Player) || ((Player) entity).getGameMode() != GameMode.CREATIVE) + if (!(entity instanceof Player) || !UtilPlayer.isSpectator(entity)) { UUID uuid = entity.getUniqueId(); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/spells/subclasses/TeleportRune.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/spells/subclasses/TeleportRune.java index 6c57cc79c..407206350 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/spells/subclasses/TeleportRune.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/wizards/spells/subclasses/TeleportRune.java @@ -2,6 +2,7 @@ package nautilus.game.arcade.game.games.wizards.spells.subclasses; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilShapes; import org.bukkit.GameMode; @@ -48,7 +49,7 @@ public class TeleportRune for (LivingEntity entity : _firstLoc.getWorld().getEntitiesByClass(LivingEntity.class)) { - if (entity instanceof Player && ((Player) entity).getGameMode() == GameMode.CREATIVE) + if (entity instanceof Player && UtilPlayer.isSpectator(entity)) { continue; } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/zombiesurvival/ZombieSurvival.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/zombiesurvival/ZombieSurvival.java index 19f97a4fb..45cf115f3 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/zombiesurvival/ZombieSurvival.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/zombiesurvival/ZombieSurvival.java @@ -24,6 +24,7 @@ import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTime; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; +import mineplex.core.visibility.VisibilityManager; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.GameType; import nautilus.game.arcade.events.GameStateChangeEvent; @@ -157,11 +158,7 @@ public class ZombieSurvival extends SoloGame newKit.ApplyKit(player); //Refresh - for (Player other : UtilServer.getPlayers()) - { - other.hidePlayer(player); - other.showPlayer(player); - } + VisibilityManager.Instance.refreshPlayerToAll(player); if (forced) { @@ -198,11 +195,7 @@ public class ZombieSurvival extends SoloGame GetKit(player).ApplyKit(player); //Refresh on Spawn - for (Player other : UtilServer.getPlayers()) - { - other.hidePlayer(player); - other.showPlayer(player); - } + VisibilityManager.Instance.refreshPlayerToAll(player); } }, 0); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gui/privateServer/page/GiveAdminPage.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gui/privateServer/page/GiveAdminPage.java index b1dd3d13b..46dda25d4 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gui/privateServer/page/GiveAdminPage.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/gui/privateServer/page/GiveAdminPage.java @@ -18,7 +18,7 @@ public class GiveAdminPage extends PlayerPage @Override public boolean showPlayer(Player player) { - return !_manager.isAdmin(player, true); + return !_manager.isAdmin(player, false); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkApple.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkApple.java index 0d2c14449..b039a7b08 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkApple.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkApple.java @@ -85,7 +85,7 @@ public class PerkApple extends Perk implements IThrown org.bukkit.entity.Item ent = player.getWorld().dropItem(player.getEyeLocation(), ItemStackFactory.Instance.CreateStack(Material.APPLE)); UtilAction.velocity(ent, player.getLocation().getDirection(), 1.2, false, 0, 0.2, 10, false); - Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, 1d); + Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, 0.5f); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkAxeThrower.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkAxeThrower.java index b9db57008..5878156a5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkAxeThrower.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkAxeThrower.java @@ -57,7 +57,7 @@ public class PerkAxeThrower extends Perk implements IThrown org.bukkit.entity.Item ent = player.getWorld().dropItem(player.getEyeLocation(), ItemStackFactory.Instance.CreateStack(player.getItemInHand().getType())); UtilAction.velocity(ent, player.getLocation().getDirection(), 1.2, false, 0, 0.2, 10, false); - Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, 2d); + Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, 0.6f); //Remove Axe player.setItemInHand(null); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBaconBlast.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBaconBlast.java index 1ff18356e..a815995cc 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBaconBlast.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBaconBlast.java @@ -65,14 +65,14 @@ public class PerkBaconBlast extends Perk implements IThrown UtilInv.Update(player); - org.bukkit.entity.Item ent = player.getWorld().dropItem(player.getEyeLocation(), ItemStackFactory.Instance.CreateStack(Material.PORK, (byte)0, 16)); + org.bukkit.entity.Item ent = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection().multiply(1.5)), ItemStackFactory.Instance.CreateStack(Material.PORK, (byte)0, 16)); UtilAction.velocity(ent, player.getLocation().getDirection(), 1, false, 0, 0.2, 10, false); Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, null, 1f, 1f, null, 1, UpdateType.SLOW, - 2d); + 0.5f); //Inform UtilPlayer.message(player, F.main("Game", "You used " + F.skill(GetName()) + ".")); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBatForm.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBatForm.java index 8ce5c0ad1..4b550b3c6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBatForm.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBatForm.java @@ -149,7 +149,7 @@ public class PerkBatForm extends SmashPerk //Proxy Boom for (Player player : Manager.GetGame().GetPlayers(true)) { - if (player.getGameMode() != GameMode.SURVIVAL) + if (Manager.isSpectator(player)) continue; if (player.equals(data.Shooter)) @@ -193,11 +193,14 @@ public class PerkBatForm extends SmashPerk { Player player = event.getPlayer(); - if (player.getGameMode() == GameMode.CREATIVE) + if (Manager.isSpectator(player)) return; if (!isSuperActive(player)) return; + + if (player.getGameMode() == GameMode.CREATIVE) + return; event.setCancelled(true); player.setFlying(false); @@ -223,7 +226,7 @@ public class PerkBatForm extends SmashPerk for (Player player : ((SmashKit)Kit).getSuperActive()) { - if (player.getGameMode() == GameMode.CREATIVE) + if (Manager.isSpectator(player)) continue; if (UtilEnt.isGrounded(player) || UtilBlock.solid(player.getLocation().getBlock().getRelative(BlockFace.DOWN))) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBladeVortex.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBladeVortex.java new file mode 100644 index 000000000..32cfe31cc --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkBladeVortex.java @@ -0,0 +1,121 @@ +package nautilus.game.arcade.kit.perks; + +import java.util.HashMap; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Sound; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.Action; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.event.player.PlayerInteractEvent; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilAction; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilGear; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilTime; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.recharge.Recharge; +import nautilus.game.arcade.kit.Perk; + +public class PerkBladeVortex extends Perk +{ + public PerkBladeVortex() + { + super("Blade Vortex", new String[] + { + C.cYellow + "Right-Click" + C.cGray + " with Sword/Axe to use " + C.cGreen + "Blade Vortex" + }); + } + + + @EventHandler + public void Shoot(PlayerInteractEvent event) + { + if (event.isCancelled()) + return; + + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) + return; + + if (UtilBlock.usable(event.getClickedBlock())) + return; + + if (!UtilGear.isWeapon(event.getPlayer().getItemInHand())) + return; + + final Player player = event.getPlayer(); + + if (!Kit.HasKit(player)) + return; + + if (!Recharge.Instance.use(player, GetName(), 16000, true, true)) + return; + + Recharge.Instance.setDisplayForce(player, GetName(), true); + + event.setCancelled(true); + + //Pull + Damage + HashMap targets = UtilEnt.getInRadius(player.getLocation(), 7); + for (LivingEntity cur : targets.keySet()) + { + if (cur.equals(player)) + continue; + + //Damage Event + Manager.GetDamage().NewDamageEvent(cur, player, null, + DamageCause.CUSTOM, 2 * targets.get(cur), false, true, false, + player.getName(), GetName()); + + //Velocity + UtilAction.velocity(cur, + UtilAlg.getTrajectory2d(cur.getLocation().toVector(), player.getLocation().toVector()), + 1.6 - 0.6*targets.get(cur), true, 0, 0.2, 1, true); + + //Inform + if (cur instanceof Player) + UtilPlayer.message((Player)cur, F.main("Game", F.name(player.getName()) +" hit you with " + F.skill(GetName()) + ".")); + } + + //Animation + for (double i=0 ; i _horseMap = new HashMap(); - + private HashMap _deathTime = new HashMap(); + public PerkHorsePet() { super("Horse Master", new String[] @@ -42,6 +44,14 @@ public class PerkHorsePet extends Perk @Override public void Apply(Player player) { + spawnHorse(player, false); + } + + public void spawnHorse(Player player, boolean baby) + { + if (!Manager.GetGame().IsAlive(player)) + return; + Manager.GetGame().CreatureAllowOverride = true; Horse horse = player.getWorld().spawn(player.getLocation(), Horse.class); Manager.GetGame().CreatureAllowOverride = false; @@ -55,14 +65,14 @@ public class PerkHorsePet extends Perk horse.setMaxDomestication(1); horse.setJumpStrength(1); horse.getInventory().setSaddle(new ItemStack(Material.SADDLE)); - horse.setBaby(); - horse.setAgeLock(true); horse.setMaxHealth(40); horse.setHealth(40); UtilEnt.Vegetate(horse); _horseMap.put(player, horse); + + horse.getWorld().playSound(horse.getLocation(), Sound.HORSE_ANGRY, 2f, 1f); } @EventHandler @@ -71,6 +81,20 @@ public class PerkHorsePet extends Perk if (event.getType() != UpdateType.SEC) return; + //Respawn + Iterator respawnIterator = _deathTime.keySet().iterator(); + while (respawnIterator.hasNext()) + { + Player player = respawnIterator.next(); + + if (UtilTime.elapsed(_deathTime.get(player), 15000)) + { + respawnIterator.remove(); + spawnHorse(player, true); + } + } + + //Update Iterator playerIterator = _horseMap.keySet().iterator(); while (playerIterator.hasNext()) { @@ -78,9 +102,10 @@ public class PerkHorsePet extends Perk Horse horse = _horseMap.get(player); //Dead - if (!horse.isValid()) + if (!horse.isValid() || horse.isDead()) { horse.getWorld().playSound(horse.getLocation(), Sound.HORSE_DEATH, 1f, 1f); + _deathTime.put(player, System.currentTimeMillis()); playerIterator.remove(); continue; } @@ -88,13 +113,19 @@ public class PerkHorsePet extends Perk //Return to Owner if (UtilMath.offset(horse, player) > 3) { + if (UtilMath.offset(horse, player) > 24) + { + horse.teleport(player); + continue; + } + float speed = Math.min(1f, (float)(UtilMath.offset(horse, player) - 5) / 8f); UtilEnt.CreatureMove(horse, player.getLocation().add(UtilAlg.getTrajectory(player, horse).multiply(2.5)), 1f + speed); } //Age - if (horse.getTicksLived() > 1200 && !horse.isAdult()) + if (horse.getTicksLived() > 900 && !horse.isAdult()) { horse.setAdult(); horse.getWorld().playSound(horse.getLocation(), Sound.HORSE_ANGRY, 2f, 1f); @@ -153,7 +184,7 @@ public class PerkHorsePet extends Perk //Damage Event Manager.GetDamage().NewDamageEvent((Player)ent, event.GetDamagerEntity(true), event.GetProjectile(), - event.GetCause(), event.GetDamage(), true, false, false, + event.GetCause(), event.GetDamage() * 0.5, true, false, false, UtilEnt.getName(event.GetDamagerEntity(true)), event.GetReason()); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkInkBlast.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkInkBlast.java index b8e775ca7..725b1ab07 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkInkBlast.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkInkBlast.java @@ -87,7 +87,7 @@ public class PerkInkBlast extends SmashPerk implements IThrown Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, null, 1f, 1f, Effect.SMOKE, 4, UpdateType.TICK, - 2d); + 0.5f); } //Inform diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronHook.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronHook.java index af1019005..d7bf2c80f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronHook.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkIronHook.java @@ -64,7 +64,7 @@ public class PerkIronHook extends Perk implements IThrown 1.8, false, 0, 0.2, 10, false); Manager.GetProjectile().AddThrow(item, player, this, -1, true, true, true, - Sound.FIRE_IGNITE, 1.4f, 0.8f, ParticleType.CRIT, null, 0, UpdateType.TICK, 2d); + Sound.FIRE_IGNITE, 1.4f, 0.8f, ParticleType.CRIT, null, 0, UpdateType.TICK, 1f); //Inform UtilPlayer.message(player, F.main("Skill", "You used " + F.skill(GetName()) + ".")); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkLeapTackleHG.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkLeapTackleHG.java index 47ab91ff6..9d5f1150a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkLeapTackleHG.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkLeapTackleHG.java @@ -81,7 +81,7 @@ public class PerkLeapTackleHG extends Perk for (Player player : Manager.GetGame().GetPlayers(true)) if (_live.containsKey(player)) for (Player other : Manager.GetGame().GetPlayers(true)) - if (other.getGameMode() == GameMode.SURVIVAL) + if (!Manager.isSpectator(other)) if (!other.equals(player)) if (UtilMath.offset(player, other) < 2) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkPigBaconBounce.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkPigBaconBounce.java index ba0278d67..5ba2be119 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkPigBaconBounce.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkPigBaconBounce.java @@ -89,7 +89,7 @@ public class PerkPigBaconBounce extends SmashPerk implements IThrown //Launch Item ent = player.getWorld().dropItem(player.getEyeLocation(), ItemStackFactory.Instance.CreateStack(Material.PORK)); UtilAction.velocity(ent, player.getLocation().getDirection(), 1.2, false, 0, 0.2, 10, false); - Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, 1d); + Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, 1f); ent.setPickupDelay(9999); //Sound diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkRevealer.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkRevealer.java index 04cd10a79..022e13315 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkRevealer.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkRevealer.java @@ -99,7 +99,7 @@ public class PerkRevealer extends Perk implements IThrown Item ent = player.getWorld().dropItem(player.getEyeLocation(), ItemStackFactory.Instance.CreateStack(Material.DIAMOND)); UtilAction.velocity(ent, player.getLocation().getDirection(), 1.2, false, 0, 0.2, 10, false); - Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, 1d); + Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, 0.5f); } @EventHandler diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSeismicSlamHG.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSeismicSlamHG.java index a0feac759..a0b41be6b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSeismicSlamHG.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSeismicSlamHG.java @@ -68,15 +68,12 @@ public class PerkSeismicSlamHG extends Perk if (cur.equals(player)) continue; - if (!UtilEnt.isGrounded(player)) - continue; - cur.playEffect(EntityEffect.HURT); //Velocity UtilAction.velocity(cur, UtilAlg.getTrajectory2d(player.getLocation().toVector(), cur.getLocation().toVector()), - 1.8 * targets.get(cur), true, 0, 0.4 + 1.0 * targets.get(cur), 1.6, true); + 2.2 * targets.get(cur), true, 0, 0.3 + 0.9 * targets.get(cur), 1.2, true); //Condition Manager.GetCondition().Factory().Falling(GetName(), cur, player, 10, false, true); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSkeletons.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSkeletons.java index 6967706bd..9623aed7d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSkeletons.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSkeletons.java @@ -181,9 +181,9 @@ public class PerkSkeletons extends Perk if (UtilMath.offset(skel, player) > range) { - float speed = 1f; + float speed = 1.25f; if (player.isSprinting()) - speed = 1.4f; + speed = 1.75f; //Move Location target = skel.getLocation().add(UtilAlg.getTrajectory(skel, player).multiply(3)); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSlimeRocket.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSlimeRocket.java index 9027ed735..376276d17 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSlimeRocket.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSlimeRocket.java @@ -194,7 +194,7 @@ public class PerkSlimeRocket extends SmashPerk implements IThrown UtilAction.velocity(slime, player.getLocation().getDirection(), 1 + charge/2d, false, 0, 0.2, 10, true); Manager.GetProjectile().AddThrow(slime, player, this, -1, true, true, true, - null, 0, 0, null, 0, UpdateType.FASTEST, 2d); + null, 0, 0, null, 0, UpdateType.FASTEST, 1f); } @EventHandler diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSlimeSlam.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSlimeSlam.java index 268c79b92..467ce8d7c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSlimeSlam.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSlimeSlam.java @@ -85,7 +85,7 @@ public class PerkSlimeSlam extends SmashPerk for (Player player : Manager.GetGame().GetPlayers(true)) if (_live.containsKey(player)) for (Player other : Manager.GetGame().GetPlayers(true)) - if (other.getGameMode() == GameMode.SURVIVAL) + if (!Manager.isSpectator(other)) if (!other.equals(player)) if (UtilMath.offset(player, other) < 2) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSmokebomb.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSmokebomb.java index 9ccd89189..7845b2ae7 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSmokebomb.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSmokebomb.java @@ -103,7 +103,7 @@ public class PerkSmokebomb extends Perk continue; if (other instanceof Player) - if (((Player)other).getGameMode() != GameMode.SURVIVAL) + if (Manager.isSpectator((Player)other)) continue; LivingEntity living = (LivingEntity) other; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSpiderLeap.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSpiderLeap.java index af7879443..5106fa728 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSpiderLeap.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkSpiderLeap.java @@ -44,7 +44,7 @@ public class PerkSpiderLeap extends Perk for (Player player : UtilServer.getPlayers()) { - if (player.getGameMode() == GameMode.CREATIVE) + if (Manager.isSpectator(player)) continue; if (!Kit.HasKit(player)) @@ -95,6 +95,9 @@ public class PerkSpiderLeap extends Perk if (!Kit.HasKit(player)) return; + if (Manager.isSpectator(player)) + return; + if (player.getGameMode() == GameMode.CREATIVE) return; @@ -121,7 +124,7 @@ public class PerkSpiderLeap extends Perk for (Player player : UtilServer.getPlayers()) { - if (player.getGameMode() == GameMode.CREATIVE) + if (Manager.isSpectator(player)) continue; if (!Kit.HasKit(player)) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkTNTArrow.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkTNTArrow.java index 12b9d2461..f53110ffa 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkTNTArrow.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkTNTArrow.java @@ -2,29 +2,43 @@ package nautilus.game.arcade.kit.perks; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.craftbukkit.v1_7_R4.entity.CraftTNTPrimed; import org.bukkit.entity.Arrow; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; import org.bukkit.entity.TNTPrimed; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.block.Action; import org.bukkit.event.entity.EntityShootBowEvent; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.player.PlayerInteractEvent; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilAction; +import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilInv; +import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilServer; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.kit.Perk; public class PerkTNTArrow extends Perk { private HashSet _active = new HashSet(); - private HashMap _tntMap = new HashMap(); + private HashSet _arrows = new HashSet(); public PerkTNTArrow() { @@ -35,7 +49,7 @@ public class PerkTNTArrow extends Perk } @EventHandler - public void Fire(PlayerInteractEvent event) + public void activate(PlayerInteractEvent event) { if (!Manager.GetGame().IsLive()) return; @@ -80,7 +94,7 @@ public class PerkTNTArrow extends Perk } @EventHandler - public void ShootBow(EntityShootBowEvent event) + public void shootBow(EntityShootBowEvent event) { if (!(event.getEntity() instanceof Player)) return; @@ -96,10 +110,134 @@ public class PerkTNTArrow extends Perk //Inform UtilPlayer.message(player, F.main("Game", "You fired " + F.skill(GetName()) + ".")); - //TNT - TNTPrimed tnt = player.getWorld().spawn(player.getLocation(), TNTPrimed.class); - ((CraftTNTPrimed)tnt).getHandle().spectating = true; - event.getProjectile().setPassenger(tnt); - _tntMap.put(tnt, player); + _arrows.add((Arrow)event.getProjectile()); + } + + @EventHandler(priority = EventPriority.HIGH) + public void hitEntityTrigger(CustomDamageEvent event) + { + if (event.IsCancelled()) + return; + + if (event.GetCause() != DamageCause.PROJECTILE) + return; + + Projectile projectile = event.GetProjectile(); + if (projectile == null) + return; + + if (!_arrows.remove(event.GetProjectile())) + return; + + event.SetCancelled(GetName()); + + Location loc = event.GetDamageeEntity().getLocation().subtract(event.GetProjectile().getVelocity().normalize().multiply(0.1)); + + trigger((Arrow)event.GetProjectile(), loc); + } + + @EventHandler + public void hitBlockTrigger(ProjectileHitEvent event) + { + Projectile proj = event.getEntity(); + + if (!_arrows.contains(proj)) + return; + + if (proj.getShooter() == null) + return; + + if (!(proj.getShooter() instanceof Player)) + return; + + final Arrow arrow = (Arrow)proj; + + UtilServer.getServer().getScheduler().scheduleSyncDelayedTask(Manager.getPlugin(), new Runnable() + { + public void run() + { + try + { + //If it hasnt already triggered (via damage) + if (_arrows.remove(arrow)) + trigger(arrow, arrow.getLocation()); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + }, 0); + + //Remove + proj.remove(); + } + + @EventHandler + public void cleanTrigger(UpdateEvent event) + { + if (event.getType() != UpdateType.SEC) + return; + + for (Iterator arrowIterator = _arrows.iterator(); arrowIterator.hasNext();) + { + Arrow arrow = arrowIterator.next(); + + if (arrow.isDead() || !arrow.isValid() || arrow.isOnGround() || arrow.getTicksLived() > 60) + { + arrowIterator.remove(); + trigger(arrow, arrow.getLocation()); + } + } + } + + public void trigger(Arrow arrow, Location loc) + { + if (arrow == null) + return; + + if (arrow.getShooter() == null || !(arrow.getShooter() instanceof Player)) + { + arrow.remove(); + return; + } + + Player player = (Player)arrow.getShooter(); + + //Velocity Players + HashMap hitMap = UtilPlayer.getInRadius(loc, 7); + for (Player cur : hitMap.keySet()) + { + double range = hitMap.get(cur); + + //Condition + Manager.GetCondition().Factory().Falling(GetName(), cur, player, 6, false, true); + + //Damage Event + Manager.GetDamage().NewDamageEvent(cur, player, null, + DamageCause.CUSTOM, 8 * range, false, true, false, + player.getName(), GetName()); + + //Velocity + UtilAction.velocity(cur, UtilAlg.getTrajectory2d(loc, cur.getLocation().add(0, 1, 0)), + 0.4 + 0.8 * range, false, 0, 0.2 + 0.5 * range, 1.2, true); + + //Inform + if (cur instanceof Player) + UtilPlayer.message((Player)cur, F.main("Game", F.name(player.getName()) +" hit you with " + F.skill(GetName()) + ".")); + } + + UtilParticle.PlayParticle(ParticleType.HUGE_EXPLOSION, loc, 0, 0, 0, 0, 1); + loc.getWorld().playSound(loc, Sound.EXPLODE, 2f, 0.75f); + } + + @EventHandler + public void particle(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; + + for (Entity ent : _arrows) + UtilParticle.PlayParticle(ParticleType.LAVA, ent.getLocation(), 0, 0, 0, 0, 1); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkTakedown.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkTakedown.java index 743ee3375..4d181426d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkTakedown.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkTakedown.java @@ -80,7 +80,7 @@ public class PerkTakedown extends Perk for (Player player : Manager.GetGame().GetPlayers(true)) if (_live.containsKey(player)) for (Player other : Manager.GetGame().GetPlayers(true)) - if (other.getGameMode() == GameMode.SURVIVAL) + if (!Manager.isSpectator(other)) if (!other.equals(player)) if (UtilMath.offset(player, other) < 2) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkThrower.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkThrower.java index e1e3e34cd..f46f3433e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkThrower.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkThrower.java @@ -69,7 +69,7 @@ public class PerkThrower extends Perk implements IThrown //Throw UtilAction.velocity(throwee, thrower.getLocation().getDirection(), 1.4, false, 0, 0.3, 0.8, true); - Manager.GetProjectile().AddThrow(throwee, thrower, this, -1, true, false, true, false, 2d); + Manager.GetProjectile().AddThrow(throwee, thrower, this, -1, true, false, true, false, 1f); //Audio thrower.getWorld().playSound(thrower.getLocation(), Sound.SHEEP_IDLE, 2f, 3f); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWeb.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWeb.java index a4de878e9..e61587621 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWeb.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWeb.java @@ -97,7 +97,7 @@ public class PerkWeb extends Perk implements IThrown org.bukkit.entity.Item ent = player.getWorld().dropItem(player.getEyeLocation(), ItemStackFactory.Instance.CreateStack(Material.WEB)); UtilAction.velocity(ent, player.getLocation().getDirection(), 0.8, false, 0, 0.2, 10, false); - Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, 1d); + Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, 0.5f); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWebShot.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWebShot.java index e22705001..699067767 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWebShot.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWebShot.java @@ -76,7 +76,7 @@ public class PerkWebShot extends SmashPerk implements IThrown random.multiply(0.2); UtilAction.velocity(ent, player.getLocation().getDirection().multiply(-1).add(random), 1 + Math.random() * 0.4, false, 0, 0.2, 10, false); - Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, 2d); + Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, 0.5f); } //Inform diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWitherWeb.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWitherWeb.java index 08259622f..161e77251 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWitherWeb.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWitherWeb.java @@ -72,7 +72,7 @@ public class PerkWitherWeb extends Perk implements IThrown random.multiply(0.25); UtilAction.velocity(ent, player.getLocation().getDirection().add(random), 1 + Math.random() * 0.4, false, 0, 0.2, 10, false); - Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, 2d); + Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, false, 0.5f); } //Inform diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWolf.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWolf.java index 2f970d77a..8877ef3a5 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWolf.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWolf.java @@ -125,7 +125,7 @@ public class PerkWolf extends SmashPerk //Hit Player for (Player other : Manager.GetGame().GetPlayers(true)) - if (other.getGameMode() == GameMode.SURVIVAL) + if (!Manager.isSpectator(other)) if (UtilEnt.hitBox(wolf.getLocation(), other, 2, null)) { if (other.equals(TackleGetOwner(wolf))) @@ -285,7 +285,7 @@ public class PerkWolf extends SmashPerk for (Player other : Manager.GetGame().GetPlayers(true)) if (!player.equals(other)) - if (other.getGameMode() == GameMode.SURVIVAL) + if (!Manager.isSpectator(other)) if (UtilEnt.hitBox(player.getLocation().add(0, 1, 0), other, 2, null)) { StrikeHit(player, other); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWolfPack.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWolfPack.java index 8cdd47eab..384ba20bb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWolfPack.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWolfPack.java @@ -97,7 +97,7 @@ public class PerkWolfPack extends Perk if (!Kit.HasKit(player)) return; - if (player.getGameMode() == GameMode.CREATIVE) + if (Manager.isSpectator(player)) return; event.setCancelled(true); @@ -149,7 +149,7 @@ public class PerkWolfPack extends Perk for (Player player : UtilServer.getPlayers()) { - if (player.getGameMode() == GameMode.CREATIVE) + if (Manager.isSpectator(player)) continue; if (!Kit.HasKit(player)) @@ -396,7 +396,7 @@ public class PerkWolfPack extends Perk Wolf wolf = wolfIterator.next(); for (Player other : Manager.GetGame().GetPlayers(true)) - if (other.getGameMode() == GameMode.SURVIVAL) + if (Manager.isSpectator(other)) if (UtilEnt.hitBox(wolf.getLocation(), other, 2, null)) { if (other.equals(GetOwner(wolf))) @@ -518,7 +518,7 @@ public class PerkWolfPack extends Perk for (Player other : Manager.GetGame().GetPlayers(true)) if (!player.equals(other)) - if (other.getGameMode() == GameMode.SURVIVAL) + if (!Manager.isSpectator(other)) if (UtilEnt.hitBox(player.getLocation(), other, 2, null)) { TackleHit(player, other); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWolfPet.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWolfPet.java index 68d1c8b4e..bf7c2ee57 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWolfPet.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWolfPet.java @@ -102,7 +102,7 @@ public class PerkWolfPet extends Perk wolf.setCollarColor(DyeColor.GREEN); wolf.playEffect(EntityEffect.WOLF_HEARTS); wolf.setAngry(true); - wolf.setMaxHealth(18); + wolf.setMaxHealth(14); wolf.setHealth(wolf.getMaxHealth()); if (_baby) @@ -111,7 +111,6 @@ public class PerkWolfPet extends Perk if (_name) { wolf.setCustomName(cur.getName() + "'s Wolf"); - wolf.setCustomNameVisible(true); } @@ -245,7 +244,7 @@ public class PerkWolfPet extends Perk Wolf wolf = wolfIterator.next(); for (Player other : Manager.GetGame().GetPlayers(true)) - if (other.getGameMode() == GameMode.SURVIVAL) + if (!Manager.isSpectator(other)) if (UtilEnt.hitBox(wolf.getLocation(), other, 2, null)) { if (other.equals(wolf.getOwner())) @@ -351,7 +350,7 @@ public class PerkWolfPet extends Perk if (!IsMinion(event.GetDamagerEntity(true))) return; - double damage = 4; + double damage = 3; event.AddMod("Wolf Minion", "Negate", -event.GetDamageInitial(), false); event.AddMod("Wolf Minion", "Damage", damage, false); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolBomb.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolBomb.java index 4b0eaf99f..0c97eb42b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolBomb.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkWoolBomb.java @@ -108,7 +108,7 @@ public class PerkWoolBomb extends Perk implements IThrown Manager.GetProjectile().AddThrow(ent, player, this, -1, true, true, true, null, 1f, 1f, null, 1, UpdateType.SLOW, - 2d); + 0.5f); _thrown.put(player, ent); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkZombieBile.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkZombieBile.java index 74c5af7aa..47835d469 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkZombieBile.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/PerkZombieBile.java @@ -100,7 +100,7 @@ public class PerkZombieBile extends SmashPerk implements IThrown org.bukkit.entity.Item ent = player.getWorld().dropItem(player.getEyeLocation().add(player.getLocation().getDirection()).subtract(0, 0.5, 0), ItemStackFactory.Instance.CreateStack(Material.ROTTEN_FLESH)); UtilAction.velocity(ent, player.getLocation().getDirection().add(rand), 0.8, false, 0, 0.2, 10, false); - Manager.GetProjectile().AddThrow(ent, player, this, System.currentTimeMillis() + 2000, true, true, true, false, 1.5d); + Manager.GetProjectile().AddThrow(ent, player, this, System.currentTimeMillis() + 2000, true, true, true, false, 0.5f); } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/HomingSheepData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/HomingSheepData.java index 003552af2..fb17b9a25 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/HomingSheepData.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/perks/data/HomingSheepData.java @@ -2,6 +2,7 @@ package nautilus.game.arcade.kit.perks.data; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilPlayer; import org.bukkit.DyeColor; import org.bukkit.GameMode; @@ -26,7 +27,7 @@ public class HomingSheepData public boolean update() { - if (!Sheep.isValid() || !Target.isValid() || Target.getGameMode() != GameMode.SURVIVAL) + if (!Sheep.isValid() || !Target.isValid() || UtilPlayer.isSpectator(Target)) return true; if (Sheep.getTicksLived() > 300) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameChatManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameChatManager.java index 559a0f890..0f8f37712 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameChatManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameChatManager.java @@ -7,6 +7,7 @@ import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.party.Party; import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.game.Game.GameState; @@ -45,7 +46,8 @@ public class GameChatManager implements Listener return; Player sender = event.getPlayer(); - + String senderName = sender.getName(); + //Dead Prefix String dead = ""; if (Manager.GetGame() != null) @@ -68,11 +70,17 @@ public class GameChatManager implements Listener //Rank Prefix & MPS Host Prefix if (Manager.GetGameHostManager().isHost(event.getPlayer())) { - rankStr = C.cDGreen + C.Bold + "MPS Host "; + if (Manager.GetGameHostManager().isEventServer()) + rankStr = C.cDGreen + C.Bold + "Event Host "; + else + rankStr = C.cDGreen + C.Bold + "MPS Host "; } else if (Manager.GetGameHostManager().isAdmin(event.getPlayer(), false)) { - rankStr = C.cDGreen + C.Bold + "MPS Admin "; + if (Manager.GetGame() != null && Manager.GetGame().GetType() == GameType.Event) + rankStr = C.cDGreen + C.Bold + "Event Admin "; + else + rankStr = C.cDGreen + C.Bold + "MPS Admin "; } else { @@ -93,7 +101,7 @@ public class GameChatManager implements Listener event.getRecipients().clear(); event.setMessage(event.getMessage().substring(1, event.getMessage().length())); - event.setFormat(levelStr + C.cDPurple + C.Bold + "Party " + C.cWhite + C.Bold + "%1$s " + C.cPurple + "%2$s"); + event.setFormat(levelStr + C.cDPurple + C.Bold + "Party " + C.cWhite + C.Bold + senderName + " " + C.cPurple + "%2$s"); event.getRecipients().addAll(party.GetPlayersOnline()); @@ -102,7 +110,7 @@ public class GameChatManager implements Listener } //Base Format - event.setFormat(dead + levelStr + rankStr + Manager.GetColor(sender) + "%1$s " + ChatColor.WHITE + "%2$s"); + event.setFormat(dead + levelStr + rankStr + Manager.GetColor(sender) + senderName + " " + ChatColor.WHITE + "%2$s"); //Public/Private (Not If Player Dead) if (Manager.GetGame() != null && Manager.GetGame().GetState() == GameState.Live) @@ -118,13 +126,13 @@ public class GameChatManager implements Listener if (event.getMessage().charAt(0) == '@') { event.setMessage(event.getMessage().substring(1, event.getMessage().length())); - event.setFormat(C.cWhite + C.Bold + "Team" + " " + dead + levelStr + rankStr + team.GetColor() + "%1$s " + C.cWhite + "%2$s"); + event.setFormat(C.cWhite + C.Bold + "Team" + " " + dead + levelStr + rankStr + team.GetColor() + senderName + " " + C.cWhite + "%2$s"); } //All Chat else { globalMessage = true; - event.setFormat(dead + levelStr + rankStr + team.GetColor() + "%1$s " + C.cWhite + "%2$s"); + event.setFormat(dead + levelStr + rankStr + team.GetColor() + senderName + " " + C.cWhite + "%2$s"); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameCreationManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameCreationManager.java index 010fedef3..2337f1f77 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameCreationManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameCreationManager.java @@ -163,7 +163,7 @@ public class GameCreationManager implements Listener // Manager.GetAntiStack().SetEnabled(true); Manager.getCosmeticManager().setHideParticles(false); Manager.GetDamage().GetCombatManager().setUseWeaponName(AttackReason.CustomWeaponName); - + HashMap pastTeams = null; //Chosen Game diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java index 07d83dd85..7a7c00480 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameFlagManager.java @@ -11,7 +11,9 @@ import mineplex.core.common.util.UtilInv; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilTextMiddle; import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.recharge.Recharge; import mineplex.core.teleport.event.MineplexTeleportEvent; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; @@ -90,6 +92,20 @@ public class GameFlagManager implements Listener return; } + + //Damagee Spec + if (damagee != null && Manager.isSpectator(damagee)) + { + event.SetCancelled("Damagee Spectator"); + return; + } + + //Damager Spec + if (damager != null && Manager.isSpectator(damager)) + { + event.SetCancelled("Damager Spectator"); + return; + } if (!game.Damage) { @@ -115,6 +131,12 @@ public class GameFlagManager implements Listener return; } + if (event.GetCause() == DamageCause.FALL && !game.DamageFall) + { + event.SetCancelled("Fall Damage Disabled"); + return; + } + //Entity vs Entity if (damagee != null && damager != null) { @@ -210,6 +232,7 @@ public class GameFlagManager implements Listener Game game = Manager.GetGame(); if (game == null || !game.IsAlive(player) || game.GetState() != GameState.Live) { + //Only allow ops in creative if (!player.isOp() || player.getGameMode() != GameMode.CREATIVE) { event.setCancelled(true); @@ -309,6 +332,7 @@ public class GameFlagManager implements Listener Game game = Manager.GetGame(); if (game == null) { + //Only allow ops in creative if (!player.isOp() || player.getGameMode() != GameMode.CREATIVE) event.setCancelled(true); } @@ -316,9 +340,15 @@ public class GameFlagManager implements Listener { if (!game.IsAlive(player)) { + //Only allow ops in creative if (!player.isOp() || player.getGameMode() != GameMode.CREATIVE) event.setCancelled(true); } + // Event Server Allowance + else if (game.BlockPlaceCreative && player.getGameMode() == GameMode.CREATIVE) + { + return; + } else { if (game.BlockPlace) @@ -347,6 +377,7 @@ public class GameFlagManager implements Listener Game game = Manager.GetGame(); if (game == null) { + //Only allow ops in creative if (!player.isOp() || player.getGameMode() != GameMode.CREATIVE) event.setCancelled(true); } @@ -356,6 +387,11 @@ public class GameFlagManager implements Listener { event.setCancelled(true); } + // Event Server Allowance + else if (game.BlockBreakCreative && player.getGameMode() == GameMode.CREATIVE) + { + return; + } else { if (game.BlockBreak) @@ -644,7 +680,7 @@ public class GameFlagManager implements Listener } else { - game.SetSpectator(player, true); + Manager.addSpectator(player, true); } Manager.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(Manager.getPlugin(), new Runnable() @@ -667,7 +703,7 @@ public class GameFlagManager implements Listener UtilInv.Clear(player); Manager.GetCondition().Factory().Blind("Ghost", player, player, 1.5, 0, false, false, false); Manager.GetCondition().Factory().Cloak("Ghost", player, player, time, false, false); - player.setGameMode(GameMode.CREATIVE); + player.setAllowFlight(true); player.setFlying(true); ((CraftPlayer)player).getHandle().spectating = true; ((CraftPlayer)player).getHandle().k = false; @@ -678,6 +714,7 @@ public class GameFlagManager implements Listener UtilAction.velocity(player, new Vector(0,0,0), 1, true, 0.4, 0, 1, true); UtilPlayer.message(player, C.cWhite + C.Bold + "You will respawn in " + time + " seconds..."); + UtilTextMiddle.display(null, "Respawning in " + time + " seconds...", 5, 40, 5, player); Manager.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(Manager.getPlugin(), new Runnable() { @@ -690,9 +727,9 @@ public class GameFlagManager implements Listener } else { - game.SetSpectator(player, true); + Manager.addSpectator(player, true); } - + player.setFireTicks(0); player.setVelocity(new Vector(0,0,0)); } @@ -823,7 +860,7 @@ public class GameFlagManager implements Listener Manager.GetDamage().NewDamageEvent(player, null, null, DamageCause.VOID, 4, false, false, false, - "Void", "Void Damage"); + "Border", "Border Damage"); player.getWorld().playSound(player.getLocation(), Sound.NOTE_BASS, 2f, 1f); player.getWorld().playSound(player.getLocation(), Sound.NOTE_BASS, 2f, 1f); @@ -832,7 +869,7 @@ public class GameFlagManager implements Listener { Manager.GetDamage().NewDamageEvent(player, null, null, DamageCause.VOID, 9001, false, false, false, - "Void", "Void Damage"); + "Border", "Border Damage"); } } } @@ -874,6 +911,9 @@ public class GameFlagManager implements Listener if (!game.IsLive()) return; + + if (!game.TeleportsDisqualify) + return; //Remove Kit game.RemoveTeamPreference(event.getPlayer()); @@ -890,7 +930,7 @@ public class GameFlagManager implements Listener team.RemovePlayer(event.getPlayer()); } - game.SetSpectator(event.getPlayer(), false); + Manager.addSpectator(event.getPlayer(), false); } @EventHandler @@ -1036,7 +1076,7 @@ public class GameFlagManager implements Listener if (!Manager.GetGame().IsLive()) return; - if (event.getType() != UpdateType.SLOWER) + if (event.getType() != UpdateType.SEC) return; if (Manager.GetGame().GetType() == GameType.MineStrike) @@ -1047,9 +1087,12 @@ public class GameFlagManager implements Listener if (Manager.IsAlive(player)) continue; - UtilPlayer.message(player, " "); - UtilPlayer.message(player, C.cWhite + C.Bold + "You are out of the game, but " + C.cGold + C.Bold + "DON'T QUIT" + C.cWhite + C.Bold + "!"); - UtilPlayer.message(player, C.cWhite + C.Bold + "The next game will be starting soon..."); + if (Recharge.Instance.use(player, "Dont Quit Message", 30000, false, false)) + { + UtilPlayer.message(player, " "); + UtilPlayer.message(player, C.cWhite + C.Bold + "You are out of the game, but " + C.cGold + C.Bold + "DON'T QUIT" + C.cWhite + C.Bold + "!"); + UtilPlayer.message(player, C.cWhite + C.Bold + "The next game will be starting soon..."); + } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameGemManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameGemManager.java index 27ded40e6..46c4b86b6 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameGemManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameGemManager.java @@ -30,7 +30,7 @@ public class GameGemManager implements Listener { ArcadeManager Manager; - boolean DoubleGem = false; + boolean DoubleGem = true; public GameGemManager(ArcadeManager manager) { @@ -174,7 +174,7 @@ public class GameGemManager implements Listener } } - if (DoubleGem && game.GemDoubleEnabled) + if (DoubleGem && game.GemDoubleEnabled && UtilPlayer.is1_8(player)) total += earned; Manager.GetDonation().RewardGems(null, "Earned " + game.GetName(), player.getName(), player.getUniqueId(), total); @@ -245,7 +245,7 @@ public class GameGemManager implements Listener } //Double Gem - if (DoubleGem && game.GemDoubleEnabled) + if (DoubleGem && game.GemDoubleEnabled && UtilPlayer.is1_8(player)) { UtilPlayer.message(player, F.elem(C.cGreen + "+" + (earnedGems) + " Gems") + " for " + F.elem(C.cDGreen + "Double Gem Weekend")); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameHostManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameHostManager.java index 279a0145f..a7ad88e59 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameHostManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameHostManager.java @@ -1,6 +1,7 @@ package nautilus.game.arcade.managers; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import mineplex.core.common.Rank; @@ -20,6 +21,7 @@ import nautilus.game.arcade.gui.privateServer.PrivateServerShop; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Player; @@ -31,6 +33,7 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.plugin.Plugin; public class GameHostManager implements Listener { @@ -55,6 +58,10 @@ public class GameHostManager implements Listener private PrivateServerShop _shop; + private boolean _isEventServer = false; + + private HashMap _permissionMap = new HashMap(); + public GameHostManager(ArcadeManager manager) { Manager = manager; @@ -109,6 +116,12 @@ public class GameHostManager implements Listener if (Manager.GetHost() == null || Manager.GetHost().length() == 0) return; + // Set as event server + if (Manager.GetGame() != null && Manager.GetGame().GetType() == GameType.Event) + { + setEventServer(true); + } + // Admins update for (Player player : UtilServer.getPlayers()) { @@ -118,7 +131,7 @@ public class GameHostManager implements Listener giveAdminItem(player); } - if (player.equals(_host)) + if (player.equals(_host) || (isAdmin(player, false) && isEventServer())) _lastOnline = System.currentTimeMillis(); } } @@ -134,11 +147,17 @@ public class GameHostManager implements Listener _host = event.getPlayer(); _hostRank = Manager.GetClients().Get(_host).GetRank(); System.out.println("Game Host Joined."); + + if (isEventServer()) + worldeditPermissionSet(event.getPlayer(), true); } else if (isAdmin(event.getPlayer(), false)) { System.out.println("Admin Joined."); _onlineAdmins.add(event.getPlayer()); + + if (isEventServer()) + worldeditPermissionSet(event.getPlayer(), true); } } @@ -152,10 +171,31 @@ public class GameHostManager implements Listener { System.out.println("Game Host Quit."); _host = null; + + if (isEventServer()) + worldeditPermissionSet(event.getPlayer(), false); } else if (isAdmin(event.getPlayer(), false)) { _onlineAdmins.remove(event.getPlayer()); + + if (isEventServer()) + worldeditPermissionSet(event.getPlayer(), false); + } + } + + public void worldeditPermissionSet(Player player, boolean hasPermission) + { + if (!_permissionMap.containsKey(player) || _permissionMap.get(player) != hasPermission) + { + for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) + { + player.addAttachment(plugin, "worldedit.*", hasPermission); + } + + _permissionMap.put(player, hasPermission); + + UtilPlayer.message(player, "World Edit Permissions: " + F.tf(hasPermission)); } } @@ -208,21 +248,21 @@ public class GameHostManager implements Listener if (Manager.GetGame() == null) return; - if (UtilGear.isMat(player.getInventory().getItem(7), Material.SPECKLED_MELON)) + if (UtilGear.isMat(player.getInventory().getItem(8), Material.SPECKLED_MELON)) return; if (player.getOpenInventory().getType() != InventoryType.CRAFTING && player.getOpenInventory().getType() != InventoryType.CREATIVE) return; - player.getInventory().setItem(7, ItemStackFactory.Instance.CreateStack(Material.SPECKLED_MELON, (byte)0, 1, C.cGreen + C.Bold + "/menu")); + player.getInventory().setItem(8, ItemStackFactory.Instance.CreateStack(Material.SPECKLED_MELON, (byte)0, 1, C.cGreen + C.Bold + "/menu")); } private void removeAdminItem(Player player) { - if (player.getInventory().getItem(7).getType() == Material.SPECKLED_MELON) + if (player.getInventory().getItem(8) != null && player.getInventory().getItem(8).getType() == Material.SPECKLED_MELON) { - player.getInventory().setItem(7, null); + player.getInventory().setItem(8, null); } } @@ -398,7 +438,22 @@ public class GameHostManager implements Listener { _blacklist.add(player.getName()); - Manager.GetPortal().sendToHub(player, "You were kicked from this Mineplex Private Server."); + Manager.GetPortal().sendToHub(player, "You were removed from this Mineplex Private Server."); + } + + @EventHandler + public void kickBlacklist(UpdateEvent event) + { + if (event.getType() != UpdateType.SEC) + return; + + for (Player player : UtilServer.getPlayers()) + { + if (_blacklist.contains(player.getName())) + { + Manager.GetPortal().sendToHub(player, "You were removed from this Mineplex Private Server."); + } + } } public void giveAdmin(Player player) @@ -406,6 +461,9 @@ public class GameHostManager implements Listener _adminList.add(player.getName()); _onlineAdmins.add(player); UtilPlayer.message(player, F.main("Server", "You were given admin privileges.")); + + if (isEventServer()) + worldeditPermissionSet(player, true); } public void removeAdmin(String playerName) @@ -421,6 +479,11 @@ public class GameHostManager implements Listener player.closeInventory(); } UtilPlayer.message(player, F.main("Server", "Your admin privileges were removed.")); + + player.setGameMode(GameMode.SURVIVAL); + + if (isEventServer()) + worldeditPermissionSet(player, false); } } @@ -477,6 +540,72 @@ public class GameHostManager implements Listener event.setCancelled(true); } + + @EventHandler + public void setEventGame(PlayerCommandPreprocessEvent event) + { + if (!isEventServer() || Manager.GetGame() == null) + return; + + if (!isAdmin(event.getPlayer(), false)) + return; + + if (!event.getMessage().toLowerCase().startsWith("/e set ") && !event.getMessage().toLowerCase().equals("/e set")) + return; + + String[] args = event.getMessage().split(" "); + + //Parse Game + if (args.length >= 3) + { + ArrayList matches = new ArrayList(); + for (GameType type : GameType.values()) + { + if (type.toString().toLowerCase().equals(args[2])) + { + matches.clear(); + matches.add(type); + break; + } + + if (type.toString().toLowerCase().contains(args[2])) + { + matches.add(type); + } + } + + if (matches.size() == 0) + { + event.getPlayer().sendMessage("No results for: " + args[2]); + return; + } + + if (matches.size() > 1) + { + event.getPlayer().sendMessage("Matched multiple games;"); + for (GameType cur : matches) + event.getPlayer().sendMessage(cur.toString()); + return; + } + + GameType type = matches.get(0); + Manager.GetGame().setGame(type, event.getPlayer(), true); + } + else + { + Manager.GetGame().setGame(GameType.Event, event.getPlayer(), true); + } + + + //Map Pref + if (args.length >= 4) + { + Manager.GetGameCreationManager().MapPref = args[3]; + UtilPlayer.message(event.getPlayer(), C.cAqua + C.Bold + "Map Preference: " + ChatColor.RESET + args[2]); + } + + event.setCancelled(true); + } @EventHandler public void playerJoin(PlayerJoinEvent event) @@ -494,4 +623,14 @@ public class GameHostManager implements Listener UtilPlayer.message(event.getPlayer(), ChatColor.BOLD + "Welcome to Mineplex Private Servers!"); UtilPlayer.message(event.getPlayer(), C.Bold + "Friends can connect with " + C.cGreen + C.Bold + "/server " + serverName); } + + public boolean isEventServer() + { + return _isEventServer; + } + + public void setEventServer(boolean var) + { + _isEventServer = var; + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameLobbyManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameLobbyManager.java index 2a9a7df08..fe3a858b4 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameLobbyManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameLobbyManager.java @@ -1248,7 +1248,7 @@ public class GameLobbyManager implements Listener, IPacketHandler if (Manager.GetGame() == null) return; - if (Manager.GetGame().GetState() != GameState.Recruit) + if (Manager.GetGame().GetState() != GameState.Recruit && Manager.GetGame().GadgetsDisabled) return; for (Player player : UtilServer.getPlayers()) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameLootManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameLootManager.java index 559d9ef62..08fc48275 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameLootManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameLootManager.java @@ -59,7 +59,7 @@ public class GameLootManager implements Listener //Chest _rewardManager.addReward(new InventoryReward(Manager.getInventoryManager(), "Old Chest", "Old Chest", 1, 1, - new ItemStack(Material.CHEST), RewardRarity.UNCOMMON, 1000)); + new ItemStack(Material.CHEST), RewardRarity.COMMON, 2)); _rewardManager.addReward(new InventoryReward(Manager.getInventoryManager(), "Ancient Chest", "Ancient Chest", 1, 1, new ItemStack(Material.CHEST), RewardRarity.UNCOMMON, 40)); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java index 36c52de62..03dbcb835 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java @@ -208,7 +208,7 @@ public class GameManager implements Listener } else if (game.GetState() == GameState.Live) { - if (UtilTime.elapsed(game.GetStateTime(), game.GameTimeout) && Manager.IsGameTimeout()) + if (game.GameTimeout != -1 && UtilTime.elapsed(game.GetStateTime(), game.GameTimeout) && Manager.IsGameTimeout()) { game.HandleTimeout(); } @@ -236,7 +236,7 @@ public class GameManager implements Listener } //Disabling Cosmetics - if (game.GetCountdown() <= 5 && game.GetCountdown() >= 0) + if (game.GetCountdown() <= 5 && game.GetCountdown() >= 0 && game.GadgetsDisabled) { if (Manager.getCosmeticManager().isShowingInterface()) { @@ -547,9 +547,6 @@ public class GameManager implements Listener game.SetPlayerTeam(player, team, true); - //Game Mode - player.setGameMode(GameMode.SURVIVAL); - return true; } @@ -612,7 +609,7 @@ public class GameManager implements Listener if (Manager.GetGame().IsAlive(player)) continue; - Manager.GetGame().SetSpectator(player, true); + Manager.addSpectator(player, true); } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GamePlayerManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GamePlayerManager.java index 927162e9a..d2a8b950c 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GamePlayerManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GamePlayerManager.java @@ -34,6 +34,7 @@ import mineplex.core.shop.page.ConfirmationPage; import mineplex.minecraft.game.core.combat.event.CombatDeathEvent; import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.GameType; import nautilus.game.arcade.events.PlayerStateChangeEvent; import nautilus.game.arcade.game.Game; import nautilus.game.arcade.game.Game.GameState; @@ -119,7 +120,7 @@ public class GamePlayerManager implements Listener else { Manager.Clear(player); - Manager.GetGame().SetSpectator(player, true); + Manager.addSpectator(player, true); UtilPlayer.message(player, F.main("Game", Manager.GetGame().GetName() + " is in progress, please wait for next game!")); } @@ -143,7 +144,7 @@ public class GamePlayerManager implements Listener } else { - Manager.GetGame().SetSpectator(player, true); + Manager.addSpectator(player, true); event.setRespawnLocation(Manager.GetGame().GetSpectatorLocation()); } @@ -158,7 +159,7 @@ public class GamePlayerManager implements Listener @EventHandler public void DisallowCreativeClick(InventoryClickEvent event) { - if (Manager.GetGame() == null || !Manager.GetGame().InProgress()) + if (Manager.GetGame() == null || !Manager.GetGame().InProgress() || Manager.GetGameHostManager().isEventServer()) return; if ((event.getInventory().getType() == InventoryType.CREATIVE || event.getInventory().getType() == InventoryType.PLAYER) && !event.getWhoClicked().isOp()) @@ -265,15 +266,12 @@ public class GamePlayerManager implements Listener Player player = event.getPlayer(); //Observer - if (Manager.IsObserver(player)) + if (Manager.IsObserver(player) || Manager.isSpectator(player)) { UtilPlayer.message(player, F.main("Game", "Spectators cannot partake in games.")); return; } - if (player.getGameMode() != GameMode.SURVIVAL) - return; - Kit kit = Manager.GetLobby().GetClickedKit(event.getRightClicked()); if (kit == null) @@ -297,15 +295,12 @@ public class GamePlayerManager implements Listener if (player == null) return; //Observer - if (Manager.IsObserver(player)) + if (Manager.IsObserver(player) || Manager.isSpectator(player)) { UtilPlayer.message(player, F.main("Game", "Spectators cannot partake in games.")); return; } - if (player.getGameMode() != GameMode.SURVIVAL) - return; - LivingEntity target = event.GetDamageeEntity(); Kit kit = Manager.GetLobby().GetClickedKit(target); @@ -396,7 +391,7 @@ public class GamePlayerManager implements Listener event.setCancelled(true); - if (game.IsAlive(player) || player.getGameMode() != GameMode.CREATIVE) + if (game.IsAlive(player) || !Manager.isSpectator(player)) { UtilPlayer.message(player, F.main("Game", "Only Spectators can use this command.")); return; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HalloweenManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HalloweenManager.java deleted file mode 100644 index 0bdb338d8..000000000 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HalloweenManager.java +++ /dev/null @@ -1,245 +0,0 @@ -package nautilus.game.arcade.managers; - -import java.util.HashSet; -import java.util.Iterator; - -import mineplex.core.common.util.UtilBlock; -import mineplex.core.common.util.UtilMath; -import mineplex.core.common.util.UtilParticle; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilParticle.ParticleType; -import mineplex.core.common.util.UtilTime; -import mineplex.core.common.util.UtilWorld; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import nautilus.game.arcade.ArcadeManager; -import nautilus.game.arcade.events.GameStateChangeEvent; -import nautilus.game.arcade.game.Game; -import nautilus.game.arcade.game.Game.GameState; - -import org.bukkit.Effect; -import org.bukkit.Material; -import org.bukkit.Sound; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.entity.Item; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockDamageEvent; -import org.bukkit.event.player.PlayerPickupItemEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.util.Vector; - -public class HalloweenManager implements Listener -{ - ArcadeManager Manager; - - public HashSet _active = new HashSet(); - - private HashSet _coins = new HashSet(); - - public long _lastSpawn = System.currentTimeMillis(); - - public HalloweenManager(ArcadeManager manager) - { - Manager = manager; - - Manager.getPluginManager().registerEvents(this, Manager.getPlugin()); - } - - @EventHandler - public void reset(GameStateChangeEvent event) - { - _active.clear(); - - _lastSpawn = System.currentTimeMillis(); - } - - @EventHandler - public void pumpkinEffect(UpdateEvent event) - { - if (event.getType() == UpdateType.TICK) - return; - - Iterator pumpkinIterator = _active.iterator(); - - while (pumpkinIterator.hasNext()) - { - Block pumpkin = pumpkinIterator.next(); - - if (pumpkin.getType() != Material.PUMPKIN && pumpkin.getType() != Material.JACK_O_LANTERN) - { - pumpkinBreak(pumpkin); - pumpkinIterator.remove(); - continue; - } - - UtilParticle.PlayParticle(ParticleType.FLAME, pumpkin.getLocation().add(0.5, 0.5, 0.5), 0, 0, 0, 0.06f, 4); - if (Math.random() > 0.90) - { - if (pumpkin.getType() == Material.PUMPKIN) - { - pumpkin.setType(Material.JACK_O_LANTERN); - } - else - { - pumpkin.setType(Material.PUMPKIN); - } - } - } - } - - @EventHandler - public void spawnPumpkinUpdate(UpdateEvent event) - { - if (event.getType() != UpdateType.SEC) - return; - - if (Manager.GetGame() == null) - return; - - Game game = Manager.GetGame(); - - int requirement = (int)((double)Manager.GetPlayerFull() * 0.75d); - if (UtilServer.getPlayers().length < requirement) - return; - - if (game.GetState() != GameState.Live) - return; - - if (!UtilTime.elapsed(_lastSpawn, 120000)) - return; - - if (Math.random() > 0.01) - return; - - int toDrop = Math.max(1, game.GetPlayers(false).size()/6); - for (int i=0 ; i< toDrop ; i++) - { - double interval = 1 / (double)(toDrop); - - if (Math.random() >= (i * interval)) // Diminishing per growth - { - spawnPumpkin(getPumpkinBlock(game)); - } - } - - _lastSpawn = System.currentTimeMillis(); - } - - private void spawnPumpkin(Block block) - { - if (block == null) - { - System.out.println("Pumpkin: Could Not Find Suitable Block"); - return; - } - - block.setType(Material.PUMPKIN); - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, Material.PUMPKIN); - _active.add(block); - - System.out.println("Spawned Pumpkin: " + UtilWorld.locToStrClean(block.getLocation())); - } - - private Block getPumpkinBlock(Game game) - { - Block block = null; - int attempts = 2000; - while (attempts > 0) - { - attempts--; - - int x = game.WorldData.MinX + UtilMath.r(Math.abs(game.WorldData.MaxX - game.WorldData.MinX)); - int z = game.WorldData.MinZ + UtilMath.r(Math.abs(game.WorldData.MaxZ - game.WorldData.MinZ)); - - block = UtilBlock.getHighest(game.WorldData.World, x, z, null); - - if (block.getLocation().getY() <= 2 || block.getLocation().getY() < game.WorldData.MinY || block.getLocation().getY() > game.WorldData.MaxY) - continue; - - if (block.getRelative(BlockFace.DOWN).isLiquid()) - continue; - - if (!UtilBlock.airFoliage(block) || !UtilBlock.airFoliage(block.getRelative(BlockFace.UP))) - continue; - - if (!UtilBlock.solid(block.getRelative(BlockFace.DOWN))) - continue; - - return block; - } - - return null; - } - - @EventHandler - public void pumpkinDamage(BlockDamageEvent event) - { - if (_active.contains(event.getBlock())) - { - Manager.GetGame().AddStat(event.getPlayer(), "Pumpkins Smashed", 1, false, true); - pumpkinBreak(event.getBlock()); - } - } - - private void pumpkinBreak(Block block) - { - block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, Material.PUMPKIN); - block.setType(Material.AIR); - - //Coins - for (int i=0 ; i < 4 + Math.random()*16 ; i++) - { - Item coin = block.getWorld().dropItem(block.getLocation().add(0.5, 1, 0.5), new ItemStack(Material.getMaterial(175))); - - Vector vel = new Vector( - (Math.random() - 0.5) * 0.5, - 0.1 + Math.random() * 0.3, - (Math.random() - 0.5) * 0.5); - - coin.setVelocity(vel); - - coin.setPickupDelay(20); - - _coins.add(coin); - } - - //Effect - block.getWorld().playSound(block.getLocation(), Sound.ZOMBIE_REMEDY, 1f, 1f); - } - - @EventHandler - public void coinPickup(PlayerPickupItemEvent event) - { - if (_coins.contains(event.getItem())) - { - event.setCancelled(true); - event.getItem().remove(); - - Manager.GetDonation().RewardCoins(null, "Halloween Pumpkin", event.getPlayer().getName(), event.getPlayer().getUniqueId(), 4 * event.getItem().getItemStack().getAmount()); - - event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.ORB_PICKUP, 1f, 2f); - } - } - - @EventHandler - public void coinClean(UpdateEvent event) - { - if (event.getType() != UpdateType.FAST) - return; - - Iterator coinIterator = _coins.iterator(); - - while (coinIterator.hasNext()) - { - Item coin = coinIterator.next(); - - if (!coin.isValid() || coin.getTicksLived() > 1200) - { - coin.remove(); - coinIterator.remove(); - } - } - } -} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java new file mode 100644 index 000000000..f2bba323b --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/HolidayManager.java @@ -0,0 +1,391 @@ +package nautilus.game.arcade.managers; + +import java.util.HashSet; +import java.util.Iterator; + +import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilEvent; +import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilTime; +import mineplex.core.common.util.UtilWorld; +import mineplex.core.itemstack.ItemStackFactory; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.Game; +import nautilus.game.arcade.game.Game.GameState; +import net.minecraft.server.v1_7_R4.PacketPlayOutBlockAction; +import net.minecraft.server.v1_7_R4.TileEntity; +import net.minecraft.server.v1_7_R4.TileEntityEnderChest; + +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.craftbukkit.v1_7_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_7_R4.util.CraftMagicNumbers; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockDamageEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerPickupItemEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +public class HolidayManager implements Listener +{ + public enum HolidayType + { + Christmas(Material.CHEST, "Present", Sound.LEVEL_UP), + Halloween(Material.PUMPKIN, "Pumpkin", Sound.ZOMBIE_REMEDY), + Easter(Material.CHEST, "Egg Basket", Sound.CAT_MEOW); + + private Material _blockType; + private String _blockName; + private Sound _blockBreakSound; + + HolidayType(Material blockType, String blockName, Sound blockBreakSound) + { + _blockType = blockType; + _blockName = blockName; + _blockBreakSound = blockBreakSound; + } + + public String getBlockName() + { + return _blockName; + } + + public Sound getBlockSound() + { + return _blockBreakSound; + } + + public Material getBlockType() + { + return _blockType; + } + } + + private HolidayType type = HolidayType.Easter; + + ArcadeManager Manager; + + public HashSet _active = new HashSet(); + + private HashSet _eggs = new HashSet(); + + private HashSet _coins = new HashSet(); + + public long _lastSpawn = System.currentTimeMillis(); + + public HolidayManager(ArcadeManager manager) + { + Manager = manager; + + Manager.getPluginManager().registerEvents(this, Manager.getPlugin()); + } + + @EventHandler + public void reset(GameStateChangeEvent event) + { + _active.clear(); + + _lastSpawn = System.currentTimeMillis(); + } + + @EventHandler + public void blockEffect(UpdateEvent event) + { + if (event.getType() == UpdateType.TICK) + return; + + Iterator blockIterator = _active.iterator(); + + while (blockIterator.hasNext()) + { + Block block = blockIterator.next(); + + //Break + if (block.getType() != Material.PUMPKIN && + block.getType() != Material.JACK_O_LANTERN && + block.getType() != Material.CHEST) + { + specialBlockBreak(block); + blockIterator.remove(); + continue; + } + + if (type == HolidayType.Halloween) + { + UtilParticle.PlayParticle(ParticleType.FLAME, block.getLocation().add(0.5, 0.5, 0.5), 0, 0, 0, 0.06f, 4); + if (Math.random() > 0.90) + { + if (block.getType() == Material.PUMPKIN) + { + block.setType(Material.JACK_O_LANTERN); + } + else + { + block.setType(Material.PUMPKIN); + } + } + } + else if (type == HolidayType.Easter) + { + UtilParticle.PlayParticle(ParticleType.HAPPY_VILLAGER, block.getLocation().add(0.5, 0.2, 0.5), 0.3f, 0.2f, 0.3f, 0, 1); + + if (Math.random() > 0.90) + { + Item egg = block.getWorld().dropItem(block.getLocation().add(0.5, 0.8, 0.5), + ItemStackFactory.Instance.CreateStack(Material.EGG, (byte)0, 1, System.currentTimeMillis() + "Egg")); + egg.setVelocity(new Vector((Math.random()-0.5)*0.3, Math.random()-0.4, (Math.random()-0.5)*0.3)); + + _eggs.add(egg); + + block.getWorld().playSound(block.getLocation(), Sound.CHICKEN_EGG_POP, 0.25f + (float)Math.random() * 0.75f, 0.75f + (float)Math.random() * 0.5f); + } + + if (Math.random() > 0.95) + { + sendChestPackets(block); + } + } + } + } + + @EventHandler + public void spawnSpecialBlockUpdate(UpdateEvent event) + { + if (event.getType() != UpdateType.SEC) + return; + + if (Manager.GetGame() == null) + return; + + Game game = Manager.GetGame(); + + int requirement = (int)((double)Manager.GetPlayerFull() * 0.5d); + if (UtilServer.getPlayers().length < requirement) + return; + + if (game.GetState() != GameState.Live) + return; + + if (!UtilTime.elapsed(_lastSpawn, 90000)) + return; + + if (Math.random() > 0.01) + return; + + int toDrop = Math.max(1, game.GetPlayers(false).size()/6); + for (int i=0 ; i< toDrop ; i++) + { + double interval = 1 / (double)(toDrop); + + if (Math.random() >= (i * interval)) // Diminishing per growth + { + spawnSpecialBlock(findSpecialBlockLocation(game)); + } + } + + _lastSpawn = System.currentTimeMillis(); + } + + private void spawnSpecialBlock(Block block) + { + if (block == null) + { + System.out.println("Holiday Block: Could Not Find Suitable Block"); + return; + } + + block.setType(type.getBlockType()); + block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, type.getBlockType()); + + if (type.getBlockType() == Material.CHEST) + { + sendChestPackets(block); + } + + _active.add(block); + + System.out.println("Spawned Holiday Block: " + UtilWorld.locToStrClean(block.getLocation())); + } + + private void sendChestPackets(Block block) + { + PacketPlayOutBlockAction packet = new PacketPlayOutBlockAction(block.getX(), block.getY(), block.getZ(), + CraftMagicNumbers.getBlock(block), 1, 1); + + for (Player other : UtilServer.getPlayers()) + ((CraftPlayer) other).getHandle().playerConnection.sendPacket(packet); + } + + private Block findSpecialBlockLocation(Game game) + { + Block block = null; + int attempts = 2000; + while (attempts > 0) + { + attempts--; + + int x = game.WorldData.MinX + UtilMath.r(Math.abs(game.WorldData.MaxX - game.WorldData.MinX)); + int z = game.WorldData.MinZ + UtilMath.r(Math.abs(game.WorldData.MaxZ - game.WorldData.MinZ)); + + block = UtilBlock.getHighest(game.WorldData.World, x, z, null); + + if (block.getLocation().getY() <= 2 || block.getLocation().getY() < game.WorldData.MinY || block.getLocation().getY() > game.WorldData.MaxY) + continue; + + if (block.getRelative(BlockFace.DOWN).isLiquid()) + continue; + + if (!UtilBlock.airFoliage(block) || !UtilBlock.airFoliage(block.getRelative(BlockFace.UP))) + continue; + + if (!UtilBlock.solid(block.getRelative(BlockFace.DOWN))) + continue; + + boolean nextToChest = false; + for (Block other : UtilBlock.getSurrounding(block, false)) + { + if (other.getType() == Material.CHEST) + nextToChest = true; + } + if (nextToChest) + continue; + + return block; + } + + return null; + } + + @EventHandler + public void specialBlockInteract(PlayerInteractEvent event) + { + if (UtilPlayer.isSpectator(event.getPlayer())) + return; + + if (!UtilEvent.isAction(event, ActionType.R_BLOCK)) + return; + + if (event.getClickedBlock() == null) + return; + + if (event.getClickedBlock().getType() != Material.CHEST) + return; + + if (!_active.contains(event.getClickedBlock())) + return; + + event.setCancelled(true); + + specialBlockBreak(event.getClickedBlock()); + } + + @EventHandler + public void specialBlockDamage(BlockDamageEvent event) + { + if (UtilPlayer.isSpectator(event.getPlayer())) + return; + + if (!_active.contains(event.getBlock())) + return; + + specialBlockBreak(event.getBlock()); + } + + private void specialBlockBreak(Block block) + { + block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, type.getBlockType()); + block.setType(Material.AIR); + + //Coins + for (int i=0 ; i < 4 + Math.random()*16 ; i++) + { + Item coin = block.getWorld().dropItem(block.getLocation().add(0.5, 1, 0.5), + ItemStackFactory.Instance.CreateStack(175, (byte)0, 1, UtilMath.r(999999) + "Coin")); + + Vector vel = new Vector( + (Math.random() - 0.5) * 0.5, + 0.1 + Math.random() * 0.3, + (Math.random() - 0.5) * 0.5); + + coin.setVelocity(vel); + + coin.setPickupDelay(20); + + _coins.add(coin); + } + + //Effect + block.getWorld().playSound(block.getLocation(), type.getBlockSound(), 1f, 1f); + } + + @EventHandler + public void coinPickup(PlayerPickupItemEvent event) + { + if (UtilPlayer.isSpectator(event.getPlayer())) + return; + + if (_coins.contains(event.getItem())) + { + event.setCancelled(true); + event.getItem().remove(); + + Manager.GetDonation().RewardCoins(null, type + " Coins", event.getPlayer().getName(), Manager.GetClients().Get(event.getPlayer()).getAccountId(), 4 * event.getItem().getItemStack().getAmount()); + + event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.ORB_PICKUP, 1f, 2f); + } + + else if (_eggs.contains(event.getItem())) + { + event.setCancelled(true); + } + } + + @EventHandler + public void itemClean(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + return; + + Iterator coinIterator = _coins.iterator(); + + while (coinIterator.hasNext()) + { + Item coin = coinIterator.next(); + + if (!coin.isValid() || coin.getTicksLived() > 1200) + { + coin.remove(); + coinIterator.remove(); + } + } + + Iterator eggIterator = _eggs.iterator(); + + while (eggIterator.hasNext()) + { + Item egg = eggIterator.next(); + + if (!egg.isValid() || egg.getTicksLived() > 40) + { + egg.remove(); + eggIterator.remove(); + } + } + } +}