- noop
version.properties
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/TwitchIntegrationFix.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/TwitchIntegrationFix.java
new file mode 100644
index 00000000..ce8bb842
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/TwitchIntegrationFix.java
@@ -0,0 +1,128 @@
+package mineplex.core;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import net.minecraft.server.v1_8_R3.EntityPlayer;
+import net.minecraft.server.v1_8_R3.PacketPlayInArmAnimation;
+import net.minecraft.server.v1_8_R3.PacketPlayInBlockDig;
+import net.minecraft.server.v1_8_R3.PacketPlayInBlockPlace;
+import net.minecraft.server.v1_8_R3.PacketPlayInEntityAction;
+import net.minecraft.server.v1_8_R3.PacketPlayInFlying;
+import net.minecraft.server.v1_8_R3.PacketPlayInHeldItemSlot;
+import net.minecraft.server.v1_8_R3.PacketPlayInRightClick;
+import net.minecraft.server.v1_8_R3.PacketPlayInUseEntity;
+import net.minecraft.server.v1_8_R3.PacketPlayOutCloseWindow;
+import net.minecraft.server.v1_8_R3.PacketPlayOutOpenWindow;
+
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.player.PlayerQuitEvent;
+
+import mineplex.core.packethandler.IPacketHandler;
+import mineplex.core.packethandler.PacketHandler;
+import mineplex.core.packethandler.PacketInfo;
+
+/**
+ * Why do we need this you ask?
+ *
+ * In 1.8.x, Mojang added Twitch integration, and in standard Mojang fashion completely broke inventory handling.
+ *
+ * Specifically, you are able to close an inventory and not actually trigger an InventoryCloseEvent. This kinda breaks
+ * literally anything relying on that event.
+ *
+ * So we just add lots of strict checks to make sure they can't do much without closing the inventory
+ */
+@ReflectivelyCreateMiniPlugin
+public class TwitchIntegrationFix extends MiniPlugin implements IPacketHandler
+{
+ private final Map _inventoryOpenedAt = new HashMap<>();
+ private final Map _inventoryOpenedAtTime = new HashMap<>();
+
+ private TwitchIntegrationFix()
+ {
+ super("Twitch Integration Fix");
+
+ require(PacketHandler.class).addPacketHandler(this, true,
+ PacketPlayOutOpenWindow.class,
+ PacketPlayOutCloseWindow.class,
+ PacketPlayInRightClick.class,
+ PacketPlayInBlockPlace.class,
+ PacketPlayInArmAnimation.class,
+ PacketPlayInBlockDig.class,
+ PacketPlayInHeldItemSlot.class,
+ PacketPlayInUseEntity.class,
+ PacketPlayInFlying.PacketPlayInPosition.class,
+ PacketPlayInFlying.PacketPlayInPositionLook.class
+ );
+ }
+
+ @EventHandler
+ public void onQuit(PlayerQuitEvent event)
+ {
+ _inventoryOpenedAt.remove(event.getPlayer().getUniqueId());
+ _inventoryOpenedAtTime.remove(event.getPlayer().getUniqueId());
+ }
+
+ @Override
+ public void handle(PacketInfo packetInfo)
+ {
+ EntityPlayer entityPlayer = ((CraftPlayer) packetInfo.getPlayer()).getHandle();
+ //TODO: No idea what this is tbh, im just commenting out if someone can figure this out
+ /*
+ if (packetInfo.getPacket() instanceof PacketPlayOutOpenWindow)
+ {
+ _inventoryOpenedAt.put(packetInfo.getPlayer().getUniqueId(), packetInfo.getPlayer().getLocation());
+ _inventoryOpenedAtTime.put(packetInfo.getPlayer().getUniqueId(), entityPlayer.playerConnection.networkManager.packetCount);
+ }
+ else if (packetInfo.getPacket() instanceof PacketPlayOutCloseWindow)
+ {
+ _inventoryOpenedAt.remove(packetInfo.getPlayer().getUniqueId());
+ _inventoryOpenedAtTime.remove(packetInfo.getPlayer().getUniqueId());
+ }
+ else if (packetInfo.getPacket() instanceof PacketPlayInRightClick ||
+ packetInfo.getPacket() instanceof PacketPlayInBlockPlace ||
+ packetInfo.getPacket() instanceof PacketPlayInArmAnimation ||
+ packetInfo.getPacket() instanceof PacketPlayInBlockDig ||
+ packetInfo.getPacket() instanceof PacketPlayInHeldItemSlot ||
+ packetInfo.getPacket() instanceof PacketPlayInUseEntity
+ )
+ {
+ // Impossible to do while inventory is open
+ if (entityPlayer.activeContainer != entityPlayer.defaultContainer && _inventoryOpenedAtTime.containsKey(packetInfo.getPlayer().getUniqueId()))
+ {
+ long openedTime = _inventoryOpenedAtTime.get(packetInfo.getPlayer().getUniqueId());
+ if (entityPlayer.playerConnection.networkManager.packetCount - openedTime > 5)
+ {
+ System.out.println("Impossible packet: " + packetInfo.getPacket().getClass());
+ packetInfo.getPlayer().closeInventory();
+ }
+ }
+ }
+ else*/ if (packetInfo.getPacket() instanceof PacketPlayInFlying)
+ {
+ if (entityPlayer.activeContainer != entityPlayer.defaultContainer)
+ {
+ if (_inventoryOpenedAt.containsKey(packetInfo.getPlayer().getUniqueId()))
+ {
+ Location openedAt = _inventoryOpenedAt.get(packetInfo.getPlayer().getUniqueId());
+ if (!packetInfo.getPlayer().getWorld().equals(openedAt.getWorld()))
+ {
+ packetInfo.getPlayer().closeInventory();
+ }
+ else
+ {
+ double distance = packetInfo.getPlayer().getLocation().distanceSquared(openedAt);
+ // You get a 9 block radius before you're considered too far away
+ if (distance > 9 * 9)
+ {
+ packetInfo.getPlayer().closeInventory();
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java
index ff89aeb3..0bc28800 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java
@@ -1,30 +1,24 @@
package mineplex.core.account;
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.collect.Sets;
-import com.google.gson.Gson;
-import mineplex.cache.player.PlayerCache;
-import mineplex.cache.player.PlayerInfo;
-import mineplex.core.MiniPlugin;
-import mineplex.core.account.command.RanksCommand;
-import mineplex.core.account.event.ClientUnloadEvent;
-import mineplex.core.account.event.ClientWebResponseEvent;
-import mineplex.core.account.event.OnlinePrimaryGroupUpdateEvent;
-import mineplex.core.account.permissions.Permission;
-import mineplex.core.account.permissions.PermissionGroup;
-import mineplex.core.account.permissions.PermissionGroupHelper;
-import mineplex.core.account.redis.*;
-import mineplex.core.account.repository.AccountRepository;
-import mineplex.core.account.repository.token.ClientToken;
-import mineplex.core.common.Pair;
-import mineplex.core.common.timing.TimingManager;
-import mineplex.core.common.util.*;
-import mineplex.core.updater.UpdateType;
-import mineplex.core.updater.event.UpdateEvent;
-import mineplex.core.utils.UtilGameProfile;
-import mineplex.core.utils.UtilScheduler;
-import mineplex.serverdata.commands.ServerCommandManager;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.regex.Pattern;
+
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@@ -36,17 +30,43 @@ import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin;
-import java.sql.SQLException;
-import java.util.*;
-import java.util.Map.Entry;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.BiConsumer;
-import java.util.function.Consumer;
-import java.util.regex.Pattern;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.collect.Sets;
+import com.google.gson.Gson;
+
+import mineplex.cache.player.PlayerCache;
+import mineplex.cache.player.PlayerInfo;
+import mineplex.core.MiniPlugin;
+import mineplex.core.account.command.RanksCommand;
+import mineplex.core.account.event.ClientUnloadEvent;
+import mineplex.core.account.event.ClientWebResponseEvent;
+import mineplex.core.account.event.OnlinePrimaryGroupUpdateEvent;
+import mineplex.core.account.permissions.Permission;
+import mineplex.core.account.permissions.PermissionGroup;
+import mineplex.core.account.permissions.PermissionGroupHelper;
+import mineplex.core.account.redis.AddPermissionGroup;
+import mineplex.core.account.redis.AddPermissionGroupHandler;
+import mineplex.core.account.redis.ClearGroups;
+import mineplex.core.account.redis.ClearGroupsHandler;
+import mineplex.core.account.redis.PrimaryGroupUpdate;
+import mineplex.core.account.redis.PrimaryGroupUpdateHandler;
+import mineplex.core.account.redis.RemovePermissionGroup;
+import mineplex.core.account.redis.RemovePermissionGroupHandler;
+import mineplex.core.account.repository.AccountRepository;
+import mineplex.core.account.repository.token.ClientToken;
+import mineplex.core.common.Pair;
+import mineplex.core.common.timing.TimingManager;
+import mineplex.core.common.util.Callback;
+import mineplex.core.common.util.UUIDFetcher;
+import mineplex.core.common.util.UtilPlayer;
+import mineplex.core.common.util.UtilServer;
+import mineplex.core.common.util.UtilTasks;
+import mineplex.core.updater.UpdateType;
+import mineplex.core.updater.event.UpdateEvent;
+import mineplex.core.utils.UtilGameProfile;
+import mineplex.core.utils.UtilScheduler;
+import mineplex.serverdata.commands.ServerCommandManager;
public class CoreClientManager extends MiniPlugin
{
@@ -307,9 +327,9 @@ public class CoreClientManager extends MiniPlugin
client.setAccountId(result.getLeft());
if (result.getRight().getLeft() == null)
{
- //PermissionGroup newGroup = PermissionGroupHelper.getGroupFromLegacy(token.Rank);
- client.setPrimaryGroup(PermissionGroup.PLAYER);
- _repository.setPrimaryGroup(client.getAccountId(), PermissionGroup.PLAYER, null);
+ PermissionGroup newGroup = PermissionGroupHelper.getGroupFromLegacy(token.Rank);
+ client.setPrimaryGroup(newGroup);
+ _repository.setPrimaryGroup(client.getAccountId(), newGroup, null);
}
else
{
@@ -387,9 +407,9 @@ public class CoreClientManager extends MiniPlugin
client.setAccountId(result.getLeft());
if (result.getRight().getLeft() == null)
{
- //PermissionGroup newGroup = PermissionGroupHelper.getGroupFromLegacy(token.Rank);
- client.setPrimaryGroup(PermissionGroup.PLAYER);
- _repository.setPrimaryGroup(client.getAccountId(), PermissionGroup.PLAYER, null);
+ PermissionGroup newGroup = PermissionGroupHelper.getGroupFromLegacy(token.Rank);
+ client.setPrimaryGroup(newGroup);
+ _repository.setPrimaryGroup(client.getAccountId(), newGroup, null);
}
else
{
@@ -465,12 +485,11 @@ public class CoreClientManager extends MiniPlugin
Pair>> result = _repository.login(_loginProcessors, uuid, client.getName());
client.setAccountId(result.getLeft());
-
if (result.getRight().getLeft() == null)
{
- //PermissionGroup newGroup = PermissionGroupHelper.getGroupFromLegacy(token.Rank);
- client.setPrimaryGroup(PermissionGroup.PLAYER);
- _repository.setPrimaryGroup(client.getAccountId(), PermissionGroup.PLAYER, null);
+ PermissionGroup newGroup = PermissionGroupHelper.getGroupFromLegacy(token.Rank);
+ client.setPrimaryGroup(newGroup);
+ _repository.setPrimaryGroup(client.getAccountId(), newGroup, null);
}
else
{
@@ -567,12 +586,10 @@ public class CoreClientManager extends MiniPlugin
if (client.getRawPrimaryGroup() == null)
{
- /*
String mssqlRank = token.Rank;
PermissionGroup newGroup = PermissionGroupHelper.getGroupFromLegacy(mssqlRank);
- */
- client.setPrimaryGroup(PermissionGroup.PLAYER);
- _repository.setPrimaryGroup(client.getAccountId(), PermissionGroup.PLAYER, null);
+ client.setPrimaryGroup(newGroup);
+ _repository.setPrimaryGroup(client.getAccountId(), newGroup, null);
}
TimingManager.start(client.getName() + " Event.");
@@ -586,7 +603,6 @@ public class CoreClientManager extends MiniPlugin
{
PlayerCache.getInstance().updateAccountId(uuid, client.getAccountId());
}
- System.out.println(client.getPrimaryGroup().toString());
return !CLIENT_LOGIN_LOCKS.containsKey(client.getName());
}
@@ -873,7 +889,6 @@ public class CoreClientManager extends MiniPlugin
public void addStoredProcedureLoginProcessor(ILoginProcessor processor)
{
- System.out.println("Query of processor " + processor.getName() + " " + processor.getQuery(1, "1", "1") + "\n");
_loginProcessors.add(processor);
}
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/account/repository/AccountRepository.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/account/repository/AccountRepository.java
index 6d47f65d..c414ef34 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/account/repository/AccountRepository.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/account/repository/AccountRepository.java
@@ -1,6 +1,26 @@
package mineplex.core.account.repository;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+import org.apache.commons.dbcp2.BasicDataSource;
+
import com.google.gson.reflect.TypeToken;
+
import mineplex.cache.player.PlayerCache;
import mineplex.core.account.ILoginProcessor;
import mineplex.core.account.event.GroupAddEvent;
@@ -15,15 +35,6 @@ import mineplex.core.database.MinecraftRepository;
import mineplex.serverdata.database.DBPool;
import mineplex.serverdata.database.column.ColumnInt;
import mineplex.serverdata.database.column.ColumnVarChar;
-import org.apache.commons.dbcp2.BasicDataSource;
-
-import java.sql.*;
-import java.util.*;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.BiConsumer;
-import java.util.function.Consumer;
-import java.util.stream.Collectors;
public class AccountRepository extends MinecraftRepository
{
@@ -119,7 +130,6 @@ public class AccountRepository extends MinecraftRepository
// We can use a parallel stream because they will be in the correct order when we collect
loginString += loginProcessors.parallelStream().map(processor -> processor.getQuery(finalId, uuidString, name)).collect(Collectors.joining());
-
statement.execute(loginString);
System.out.println("EXECUTE COMPLETE - " + accountId);
@@ -165,6 +175,7 @@ public class AccountRepository extends MinecraftRepository
token.Name = name;
token.Uuid = uuid.toString();
token.IpAddress = ipAddress;
+
return handleSyncMSSQLCallStream("PlayerAccount/Login", token);
}
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/bonuses/BonusRepository.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/bonuses/BonusRepository.java
index f60f67ab..e3debbc1 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/bonuses/BonusRepository.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/bonuses/BonusRepository.java
@@ -1,5 +1,24 @@
package mineplex.core.bonuses;
+import java.sql.CallableStatement;
+import java.sql.Connection;
+import java.sql.Date;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.sql.Types;
+
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
+import org.bukkit.plugin.Plugin;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.jooq.DSLContext;
+import org.jooq.Record2;
+import org.jooq.SQLDialect;
+import org.jooq.TableField;
+import org.jooq.impl.DSL;
+
import mineplex.core.common.Pair;
import mineplex.core.common.util.Callback;
import mineplex.core.common.util.UtilServer;
@@ -10,17 +29,6 @@ import mineplex.database.tables.records.BonusRecord;
import mineplex.serverdata.database.DBPool;
import mineplex.serverdata.database.RepositoryBase;
import mineplex.serverdata.database.ResultSetCallable;
-import org.bukkit.Bukkit;
-import org.bukkit.entity.Player;
-import org.bukkit.plugin.Plugin;
-import org.bukkit.plugin.java.JavaPlugin;
-import org.jooq.DSLContext;
-import org.jooq.Record2;
-import org.jooq.SQLDialect;
-import org.jooq.TableField;
-import org.jooq.impl.DSL;
-
-import java.sql.*;
public class BonusRepository extends RepositoryBase
{
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/boosters/BoosterManager.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/boosters/BoosterManager.java
index fb385605..1601f7d5 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/boosters/BoosterManager.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/boosters/BoosterManager.java
@@ -119,7 +119,7 @@ public class BoosterManager extends MiniPlugin
_giveInterfaceItem = canActivateBoosters();
new BoosterUpdateRepository(plugin);
-
+
generatePermissions();
}
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/boosters/BoosterRepository.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/boosters/BoosterRepository.java
index c8e47374..2f42602e 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/boosters/BoosterRepository.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/boosters/BoosterRepository.java
@@ -1,11 +1,14 @@
package mineplex.core.boosters;
import com.google.common.reflect.TypeToken;
+import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
+import com.mojang.authlib.properties.PropertyMap;
import mineplex.core.common.api.ApiEndpoint;
import mineplex.core.common.api.ApiFieldNamingStrategy;
import mineplex.core.common.api.ApiHost;
+import mineplex.core.common.api.ApiResponse;
import java.util.Arrays;
import java.util.List;
@@ -22,6 +25,7 @@ public class BoosterRepository extends ApiEndpoint
public BoosterRepository()
{
super(ApiHost.getAmplifierService(), "/booster", new GsonBuilder().setFieldNamingStrategy(new ApiFieldNamingStrategy())
+// .registerTypeAdapter(PropertyMap.class, new PropertyMap.Serializer())
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX").create());
}
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/chat/Chat.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/chat/Chat.java
index 5f36eadc..6c6d1fd7 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/chat/Chat.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/chat/Chat.java
@@ -1,23 +1,31 @@
package mineplex.core.chat;
-import mineplex.core.MiniPlugin;
-import mineplex.core.ReflectivelyCreateMiniPlugin;
-import mineplex.core.account.CoreClient;
-import mineplex.core.account.CoreClientManager;
-import mineplex.core.account.permissions.Permission;
-import mineplex.core.account.permissions.PermissionGroup;
-import mineplex.core.chat.command.*;
-import mineplex.core.chat.event.FormatPlayerChatEvent;
-import mineplex.core.chat.format.ChatFormatComponent;
-import mineplex.core.common.util.*;
-import mineplex.core.incognito.IncognitoManager;
-import mineplex.core.preferences.Preference;
-import mineplex.core.preferences.PreferencesManager;
-import mineplex.core.preferences.UserPreferences;
-import mineplex.core.recharge.Recharge;
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.TextComponent;
+
import org.bukkit.ChatColor;
+import org.bukkit.block.Sign;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@@ -30,17 +38,29 @@ import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
-import javax.net.ssl.*;
-import java.io.BufferedReader;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.nio.charset.Charset;
-import java.security.cert.X509Certificate;
-import java.util.*;
-import java.util.Map.Entry;
-import java.util.stream.Collectors;
+import mineplex.core.MiniPlugin;
+import mineplex.core.ReflectivelyCreateMiniPlugin;
+import mineplex.core.account.CoreClient;
+import mineplex.core.account.CoreClientManager;
+import mineplex.core.account.permissions.Permission;
+import mineplex.core.account.permissions.PermissionGroup;
+import mineplex.core.chat.command.BroadcastCommand;
+import mineplex.core.chat.command.ChatSlowCommand;
+import mineplex.core.chat.command.HelpCommand;
+import mineplex.core.chat.command.ListEmotesCommand;
+import mineplex.core.chat.command.SilenceCommand;
+import mineplex.core.chat.event.FormatPlayerChatEvent;
+import mineplex.core.chat.format.ChatFormatComponent;
+import mineplex.core.common.util.C;
+import mineplex.core.common.util.F;
+import mineplex.core.common.util.UtilServer;
+import mineplex.core.common.util.UtilText;
+import mineplex.core.common.util.UtilTime;
+import mineplex.core.incognito.IncognitoManager;
+import mineplex.core.preferences.Preference;
+import mineplex.core.preferences.PreferencesManager;
+import mineplex.core.preferences.UserPreferences;
+import mineplex.core.recharge.Recharge;
@ReflectivelyCreateMiniPlugin
public class Chat extends MiniPlugin
@@ -864,7 +884,7 @@ public class Chat extends MiniPlugin
String message = event.getMessage();
message = decapsifyIfNecessary(event.getPlayer(), message);
- //message = filterMessage(event.getPlayer(), true, message);
+ message = filterMessage(event.getPlayer(), true, message);
event.setMessage(message);
}
@@ -884,7 +904,6 @@ public class Chat extends MiniPlugin
event.setCancelled(true);
return;
}
- /*
runAsync(() ->
{
@@ -900,8 +919,6 @@ public class Chat extends MiniPlugin
sign.update();
});
});
-
- */
}
@EventHandler
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/command/CommandCenter.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/command/CommandCenter.java
index 5c4f1a92..7560f423 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/command/CommandCenter.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/command/CommandCenter.java
@@ -1,20 +1,22 @@
package mineplex.core.command;
-import com.google.common.collect.Lists;
-import mineplex.core.Managers;
-import mineplex.core.account.CoreClient;
-import mineplex.core.account.CoreClientManager;
-import mineplex.core.account.permissions.Permission;
-import mineplex.core.account.permissions.PermissionGroup;
-import mineplex.core.common.util.*;
-import mineplex.core.packethandler.IPacketHandler;
-import mineplex.core.packethandler.PacketHandler;
-import mineplex.core.packethandler.PacketInfo;
-import mineplex.core.recharge.Recharge;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+
import net.minecraft.server.v1_8_R3.EntityPlayer;
import net.minecraft.server.v1_8_R3.PacketPlayInTabComplete;
+//import net.minecraft.server.v1_8_R3.PacketPlayOutDeclareCommands;
import net.minecraft.server.v1_8_R3.PacketPlayOutTabComplete;
import net.minecraft.server.v1_8_R3.PlayerConnection;
+
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@@ -23,9 +25,24 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;
-import java.lang.reflect.Field;
-import java.util.*;
-import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+import com.google.common.collect.Lists;
+//import com.mineplex.ProtocolVersion;
+
+import mineplex.core.Managers;
+import mineplex.core.account.CoreClient;
+import mineplex.core.account.CoreClientManager;
+import mineplex.core.account.permissions.Permission;
+import mineplex.core.account.permissions.PermissionGroup;
+import mineplex.core.common.util.C;
+import mineplex.core.common.util.F;
+import mineplex.core.common.util.NautHashMap;
+import mineplex.core.common.util.UtilPlayer;
+import mineplex.core.common.util.UtilPlayerBase;
+import mineplex.core.common.util.UtilServer;
+import mineplex.core.packethandler.IPacketHandler;
+import mineplex.core.packethandler.PacketHandler;
+import mineplex.core.packethandler.PacketInfo;
+import mineplex.core.recharge.Recharge;
public class CommandCenter implements Listener, IPacketHandler
{
@@ -200,9 +217,8 @@ public class CommandCenter implements Listener, IPacketHandler
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event)
{
- int protocol = UtilPlayer.getProtocol(event.getPlayer());
/*
- TODO: Protocol Support
+ int protocol = UtilPlayer.getProtocol(event.getPlayer());
if (protocol >= ProtocolVersion.v1_13)
{
List commands = getCommands(event.getPlayer());
@@ -217,14 +233,12 @@ public class CommandCenter implements Listener, IPacketHandler
if (packetInfo.getPacket() instanceof PacketPlayInTabComplete)
{
EntityPlayer nmsPlayer = ((CraftPlayer) packetInfo.getPlayer()).getHandle();
+ //TODO: Multi-protocol support
/*
-
- TODO: ProtocolSupport
if (nmsPlayer.getProtocol() >= ProtocolVersion.v1_13)
{
return;
}
-
*/
PacketPlayInTabComplete packet = (PacketPlayInTabComplete) packetInfo.getPacket();
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/cosmetic/CosmeticManager.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/cosmetic/CosmeticManager.java
index ab334915..8b3e25b2 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/cosmetic/CosmeticManager.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/cosmetic/CosmeticManager.java
@@ -186,8 +186,8 @@ public class CosmeticManager extends MiniPlugin
public void setInterfaceSlot(int i)
{
- System.out.println(_gadgetManager.toString());
_interfaceSlot = i;
+
_gadgetManager.setActiveItemSlot(i-1);
}
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java
index 3280e24d..c4dda8e7 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java
@@ -1,21 +1,45 @@
package mineplex.core.disguise;
-import com.mineplex.spigot.ChunkAddEntityEvent;
-import mineplex.core.MiniPlugin;
-import mineplex.core.PlayerSelector;
-import mineplex.core.ReflectivelyCreateMiniPlugin;
-import mineplex.core.common.util.*;
-import mineplex.core.disguise.disguises.*;
-import mineplex.core.packethandler.IPacketHandler;
-import mineplex.core.packethandler.PacketHandler;
-import mineplex.core.packethandler.PacketInfo;
-import mineplex.core.packethandler.PacketVerifier;
-import mineplex.core.updater.UpdateType;
-import mineplex.core.updater.event.UpdateEvent;
-import net.minecraft.server.v1_8_R3.*;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.function.Predicate;
+
+import net.minecraft.server.v1_8_R3.BlockBed;
+import net.minecraft.server.v1_8_R3.BlockPosition;
+import net.minecraft.server.v1_8_R3.Blocks;
+import net.minecraft.server.v1_8_R3.Chunk;
+import net.minecraft.server.v1_8_R3.EntityPlayer;
+import net.minecraft.server.v1_8_R3.EntityTrackerEntry;
+import net.minecraft.server.v1_8_R3.EnumDirection;
+import net.minecraft.server.v1_8_R3.MinecraftServer;
+import net.minecraft.server.v1_8_R3.Packet;
+import net.minecraft.server.v1_8_R3.PacketPlayOutBed;
+import net.minecraft.server.v1_8_R3.PacketPlayOutEntity;
import net.minecraft.server.v1_8_R3.PacketPlayOutEntity.PacketPlayOutEntityLook;
import net.minecraft.server.v1_8_R3.PacketPlayOutEntity.PacketPlayOutRelEntityMove;
import net.minecraft.server.v1_8_R3.PacketPlayOutEntity.PacketPlayOutRelEntityMoveLook;
+import net.minecraft.server.v1_8_R3.PacketPlayOutEntityEquipment;
+import net.minecraft.server.v1_8_R3.PacketPlayOutEntityMetadata;
+import net.minecraft.server.v1_8_R3.PacketPlayOutEntityTeleport;
+import net.minecraft.server.v1_8_R3.PacketPlayOutEntityVelocity;
+import net.minecraft.server.v1_8_R3.PacketPlayOutMapChunk;
+import net.minecraft.server.v1_8_R3.PacketPlayOutNamedEntitySpawn;
+import net.minecraft.server.v1_8_R3.PacketPlayOutPlayerInfo;
+import net.minecraft.server.v1_8_R3.PacketPlayOutSpawnEntity;
+import net.minecraft.server.v1_8_R3.PacketPlayOutSpawnEntityLiving;
+import net.minecraft.server.v1_8_R3.PacketPlayOutUpdateAttributes;
+//import net.minecraft.server.v1_8_R3.PacketPlayOutVehicleMove;
+import net.minecraft.server.v1_8_R3.WorldServer;
+import net.minecraft.server.v1_8_R3.WorldSettings;
+
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.block.BlockFace;
@@ -34,8 +58,29 @@ import org.bukkit.scoreboard.NameTagVisibility;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.Team;
-import java.util.*;
-import java.util.function.Predicate;
+import com.mineplex.spigot.ChunkAddEntityEvent;
+
+import mineplex.core.MiniPlugin;
+import mineplex.core.PlayerSelector;
+import mineplex.core.ReflectivelyCreateMiniPlugin;
+import mineplex.core.common.util.C;
+import mineplex.core.common.util.UtilEnt;
+import mineplex.core.common.util.UtilLambda;
+import mineplex.core.common.util.UtilPlayer;
+import mineplex.core.common.util.UtilServer;
+import mineplex.core.common.util.UtilTasks;
+import mineplex.core.disguise.disguises.DisguiseBase;
+import mineplex.core.disguise.disguises.DisguiseBlock;
+import mineplex.core.disguise.disguises.DisguiseInsentient;
+import mineplex.core.disguise.disguises.DisguiseLiving;
+import mineplex.core.disguise.disguises.DisguisePlayer;
+import mineplex.core.disguise.disguises.DisguiseSquid;
+import mineplex.core.packethandler.IPacketHandler;
+import mineplex.core.packethandler.PacketHandler;
+import mineplex.core.packethandler.PacketInfo;
+import mineplex.core.packethandler.PacketVerifier;
+import mineplex.core.updater.UpdateType;
+import mineplex.core.updater.event.UpdateEvent;
/*
* notes: rabbit jump has been removed (PacketPlayOutEntityStatus) because it didn't work for 1.9+ anyways
@@ -352,6 +397,7 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
final Packet packet = packetInfo.getPacket();
final Player owner = packetInfo.getPlayer();
final PacketVerifier packetVerifier = packetInfo.getVerifier();
+ //final int protocol = ((CraftPlayer) owner).getHandle().getProtocol();
final int protocol = ((CraftPlayer) owner).getHandle().playerConnection.networkManager.getVersion();
if (packet instanceof PacketPlayOutPlayerInfo)
@@ -653,6 +699,7 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
if (disguise.getEntity() == nmsPlayer)
continue;
+ //int protocol = nmsPlayer.getProtocol();
int protocol = nmsPlayer.playerConnection.networkManager.getVersion();
UtilPlayer.sendPacket(player, disguise.modifyMetaPacket(protocol, disguise.getMetadataPacket()));
}
@@ -777,9 +824,14 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
List packets = new ArrayList<>();
EntityPlayer nmsPlayer = ((CraftPlayer) player).getHandle();
+ //int protocol = nmsPlayer.getProtocol();
int protocol = nmsPlayer.playerConnection.networkManager.getVersion();
-
PacketPlayOutMapChunk chunk = new PacketPlayOutMapChunk(_bedChunk, true, '\uffff');
+ //TODO: Multi-protocol support
+ /*
+ PacketPlayOutMapChunk chunk = new PacketPlayOutMapChunk(protocol, _bedChunk, true, '\uffff');
+
+ */
chunk.a = BED_POS_NORTH[0] >> 4;
chunk.b = BED_POS_NORTH[2] >> 4;
@@ -830,6 +882,8 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
double d2 = posZ + (targetZ - posZ) / (double) partitions;
+ //TODO: Protocol support
+ //PacketPlayOutMapChunk chunk = new PacketPlayOutMapChunk(protocol, _bedChunk, true, '\uffff');
PacketPlayOutMapChunk chunk = new PacketPlayOutMapChunk(_bedChunk, true, '\uffff');
chunk.a = (int) Math.floor(d0) >> 4;
chunk.b = (int) Math.floor(d2) >> 4;
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseBase.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseBase.java
index 51bc2422..fd9caa88 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseBase.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseBase.java
@@ -1,13 +1,5 @@
package mineplex.core.disguise.disguises;
-import mineplex.core.common.DummyEntity;
-import mineplex.core.common.util.UtilPlayer;
-import net.minecraft.server.v1_8_R3.*;
-import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity;
-import org.bukkit.entity.EntityType;
-import org.bukkit.entity.Player;
-import org.bukkit.event.entity.CreatureSpawnEvent;
-
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collections;
@@ -15,6 +7,16 @@ import java.util.List;
import java.util.function.Predicate;
import java.util.function.Supplier;
+import net.minecraft.server.v1_8_R3.*;
+
+import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.Player;
+import org.bukkit.event.entity.CreatureSpawnEvent;
+
+import mineplex.core.common.DummyEntity;
+import mineplex.core.common.util.UtilPlayer;
+
public abstract class DisguiseBase
{
private WeakReference _entity = new WeakReference<>(null);
@@ -87,6 +89,7 @@ public abstract class DisguiseBase
for (EntityPlayer player : tracker.get(getEntity().getId()).trackedPlayers)
{
+ //int protocol = player.getProtocol();
int protocol = player.playerConnection.networkManager.getVersion();
if (!protocolPredicate.test(protocol))
continue;
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseCreature.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseCreature.java
index 988f0def..03f22084 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseCreature.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseCreature.java
@@ -1,8 +1,15 @@
package mineplex.core.disguise.disguises;
-import net.minecraft.server.v1_8_R3.MathHelper;
-import net.minecraft.server.v1_8_R3.Packet;
-import net.minecraft.server.v1_8_R3.PacketPlayOutSpawnEntityLiving;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+//import com.mineplex.MetadataRewriter;
+//import com.mineplex.ProtocolVersion;
+
+import net.minecraft.server.v1_8_R3.*;
+import net.minecraft.server.v1_8_R3.DataWatcher.WatchableObject;
+
import org.bukkit.entity.EntityType;
public abstract class DisguiseCreature extends DisguiseInsentient
@@ -78,8 +85,8 @@ public abstract class DisguiseCreature extends DisguiseInsentient
@Override
public Packet modifySpawnPacket(int protocol, Packet packet)
{
+ //TODO: Multi-protocol support
/*
- TODO: Protocol Support/Prob Never since i dont have their MetadataWriter
if (protocol >= ProtocolVersion.v1_10_PRE)
{
PacketPlayOutSpawnEntityLiving newSpawn = (PacketPlayOutSpawnEntityLiving) getSpawnPacket();
@@ -126,8 +133,7 @@ public abstract class DisguiseCreature extends DisguiseInsentient
newSpawn.m = meta;
return newSpawn;
}
-
- */
+ */
return packet;
}
@@ -142,9 +148,8 @@ public abstract class DisguiseCreature extends DisguiseInsentient
@Override
public Packet modifyMetaPacket(int protocol, Packet packet)
{
+ //TODO: Multi-protocol support
/*
-
- TODO: Again Protocol Support/Prob never since i dont have their metadatawriter
if (protocol >= ProtocolVersion.v1_10_PRE)
{
PacketPlayOutEntityMetadata newMeta = new PacketPlayOutEntityMetadata();
@@ -168,7 +173,7 @@ public abstract class DisguiseCreature extends DisguiseInsentient
return newMeta;
}
- */
+ */
return packet;
}
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseEnderman.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseEnderman.java
index a9257efe..92c36730 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseEnderman.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseEnderman.java
@@ -1,11 +1,19 @@
package mineplex.core.disguise.disguises;
-import com.google.common.base.Optional;
-import net.minecraft.server.v1_8_R3.*;
-import org.bukkit.entity.EntityType;
-
import java.util.Arrays;
+import net.minecraft.server.v1_8_R3.Block;
+import net.minecraft.server.v1_8_R3.Blocks;
+import net.minecraft.server.v1_8_R3.EntityEnderman;
+import net.minecraft.server.v1_8_R3.EntityLiving;
+import net.minecraft.server.v1_8_R3.IBlockData;
+import net.minecraft.server.v1_8_R3.MobEffect;
+import net.minecraft.server.v1_8_R3.MobEffectList;
+import net.minecraft.server.v1_8_R3.PotionBrewer;
+
+import com.google.common.base.Optional;
+import org.bukkit.entity.EntityType;
+
public class DisguiseEnderman extends DisguiseMonster
{
public DisguiseEnderman(org.bukkit.entity.Entity entity)
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseMutable.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseMutable.java
index 7315be01..35f46b41 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseMutable.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseMutable.java
@@ -1,7 +1,12 @@
package mineplex.core.disguise.disguises;
+import java.util.function.Predicate;
+
+//import com.mineplex.ProtocolVersion;
+
import net.minecraft.server.v1_8_R3.Packet;
import net.minecraft.server.v1_8_R3.PacketPlayOutEntityDestroy;
+
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
@@ -19,13 +24,14 @@ public abstract class DisguiseMutable extends DisguiseCreature
{
// if (!_spawnedIn)
// return;
+ //TODO: Multi-protocol support
+ //Basically sends to players that are > 1.11 but impossible
/*
Predicate pred = v -> v >= ProtocolVersion.v1_11;
sendToWatchers(pred, this::getDestroyPacket);
sendToWatchers(pred, this::getSpawnPacket);
sendToWatchers(pred, this::getMetadataPacket);
-
- */
+ */
}
private Packet getDestroyPacket()
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseTameableAnimal.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseTameableAnimal.java
index fedac5f6..7722ed11 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseTameableAnimal.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseTameableAnimal.java
@@ -1,7 +1,8 @@
package mineplex.core.disguise.disguises;
-import com.google.common.base.Optional;
import net.minecraft.server.v1_8_R3.EntityTameableAnimal;
+
+import com.google.common.base.Optional;
import org.bukkit.entity.EntityType;
public abstract class DisguiseTameableAnimal extends DisguiseAnimal
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/donation/repository/DonationRepository.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/donation/repository/DonationRepository.java
index a894f3e4..834d6cb1 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/donation/repository/DonationRepository.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/donation/repository/DonationRepository.java
@@ -1,5 +1,9 @@
package mineplex.core.donation.repository;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Consumer;
+
import mineplex.core.common.currency.Currency;
import mineplex.core.common.currency.GlobalCurrency;
import mineplex.core.common.util.UtilTasks;
@@ -10,10 +14,6 @@ import mineplex.core.donation.repository.token.UnknownPurchaseToken;
import mineplex.core.server.util.TransactionResponse;
import mineplex.serverdata.database.DBPool;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.function.Consumer;
-
public class DonationRepository extends MinecraftRepository
{
private static Map WEB_ADDRESSES = new HashMap<>();
@@ -67,7 +67,6 @@ public class DonationRepository extends MinecraftRepository
token.AccountName = playerName;
token.SalesPackageName = packageName;
token.CoinPurchase = currencyType == GlobalCurrency.TREASURE_SHARD;
- System.out.println(token.CoinPurchase);
token.Cost = cost;
token.Premium = false;
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java
index 657c5299..4ee684cd 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java
@@ -1,5 +1,36 @@
package mineplex.core.gadget;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.bukkit.GameMode;
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.Sound;
+import org.bukkit.block.Block;
+import org.bukkit.entity.ArmorStand;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.entity.PlayerDeathEvent;
+import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerMoveEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+import org.bukkit.event.player.PlayerToggleFlightEvent;
+import org.bukkit.event.player.PlayerToggleSneakEvent;
+import org.bukkit.inventory.AnvilInventory;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.ItemStack;
+
import mineplex.core.MiniPlugin;
import mineplex.core.ReflectivelyCreateMiniPlugin;
import mineplex.core.account.CoreClientManager;
@@ -9,17 +40,89 @@ import mineplex.core.achievement.AchievementManager;
import mineplex.core.arcadeevents.CoreGameStartEvent;
import mineplex.core.arcadeevents.CoreGameStopEvent;
import mineplex.core.blockrestore.BlockRestore;
-import mineplex.core.common.util.*;
+import mineplex.core.common.skin.SkinData;
+import mineplex.core.common.util.F;
+import mineplex.core.common.util.UtilEnt;
+import mineplex.core.common.util.UtilPlayer;
+import mineplex.core.common.util.UtilServer;
+import mineplex.core.common.util.UtilTime;
+import mineplex.core.cosmetic.ui.page.GadgetPage;
+import mineplex.core.cosmetic.ui.page.gamemodifiers.GameCosmeticCategoryPage;
+import mineplex.core.cosmetic.ui.page.gamemodifiers.moba.HeroSkinCategoryPage;
import mineplex.core.disguise.DisguiseManager;
import mineplex.core.donation.DonationManager;
-import mineplex.core.gadget.commands.*;
-import mineplex.core.gadget.event.*;
+import mineplex.core.gadget.commands.AmmoCommand;
+import mineplex.core.gadget.commands.LockCosmeticsCommand;
+import mineplex.core.gadget.commands.TestTauntCommand;
+import mineplex.core.gadget.commands.UnlockCosmeticCommand;
+import mineplex.core.gadget.commands.UnlockCosmeticsCommand;
+import mineplex.core.gadget.event.GadgetBlockEvent;
+import mineplex.core.gadget.event.GadgetChangeEvent;
import mineplex.core.gadget.event.GadgetChangeEvent.GadgetState;
-import mineplex.core.gadget.gadgets.arrowtrail.*;
+import mineplex.core.gadget.event.GadgetCollideEntityEvent;
+import mineplex.core.gadget.event.GadgetEnableEvent;
+import mineplex.core.gadget.event.GadgetSelectLocationEvent;
+import mineplex.core.gadget.event.PlayerToggleSwimEvent;
+import mineplex.core.gadget.event.TauntCommandEvent;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailBalance;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailBlood;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailCandyCane;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailConfetti;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailCupid;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailEmerald;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailEnchant;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailFreedom;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailFrostLord;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailHalloween;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailLegend;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailMusic;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailPresent;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailRainbow;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailRedWhite;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailShadow;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailSpring;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailStorm;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailTitan;
import mineplex.core.gadget.gadgets.balloons.BalloonType;
import mineplex.core.gadget.gadgets.chat.LevelPrefixType;
-import mineplex.core.gadget.gadgets.death.*;
-import mineplex.core.gadget.gadgets.doublejump.*;
+import mineplex.core.gadget.gadgets.death.DeathBalance;
+import mineplex.core.gadget.gadgets.death.DeathBlood;
+import mineplex.core.gadget.gadgets.death.DeathCandyCane;
+import mineplex.core.gadget.gadgets.death.DeathCupidsBrokenHeart;
+import mineplex.core.gadget.gadgets.death.DeathEmerald;
+import mineplex.core.gadget.gadgets.death.DeathEnchant;
+import mineplex.core.gadget.gadgets.death.DeathFreedom;
+import mineplex.core.gadget.gadgets.death.DeathFrostLord;
+import mineplex.core.gadget.gadgets.death.DeathHalloween;
+import mineplex.core.gadget.gadgets.death.DeathLegend;
+import mineplex.core.gadget.gadgets.death.DeathMapleLeaf;
+import mineplex.core.gadget.gadgets.death.DeathMusic;
+import mineplex.core.gadget.gadgets.death.DeathPinataBurst;
+import mineplex.core.gadget.gadgets.death.DeathPresentDanger;
+import mineplex.core.gadget.gadgets.death.DeathRainbow;
+import mineplex.core.gadget.gadgets.death.DeathShadow;
+import mineplex.core.gadget.gadgets.death.DeathSpring;
+import mineplex.core.gadget.gadgets.death.DeathStorm;
+import mineplex.core.gadget.gadgets.death.DeathTitan;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpBalance;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpBlood;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpCandyCane;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpCupidsWings;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpEmerald;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpEnchant;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpFirecracker;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpFreedom;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpFrostLord;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpHalloween;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpLegend;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpMaple;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpMusic;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpPresent;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpRainbow;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpShadow;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpSpring;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpStorm;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpTitan;
import mineplex.core.gadget.gadgets.flag.FlagType;
import mineplex.core.gadget.gadgets.gamemodifiers.GameCosmeticCategory;
import mineplex.core.gadget.gadgets.gamemodifiers.GameCosmeticManager;
@@ -28,14 +131,107 @@ import mineplex.core.gadget.gadgets.gamemodifiers.minestrike.GameModifierMineStr
import mineplex.core.gadget.gadgets.gamemodifiers.minestrike.MineStrikeSkin;
import mineplex.core.gadget.gadgets.gamemodifiers.moba.shopmorph.ShopMorphGadget;
import mineplex.core.gadget.gadgets.gamemodifiers.moba.shopmorph.ShopMorphType;
+import mineplex.core.gadget.gadgets.gamemodifiers.moba.skins.HeroSkinGadget;
import mineplex.core.gadget.gadgets.hat.HatItem;
import mineplex.core.gadget.gadgets.hat.HatType;
-import mineplex.core.gadget.gadgets.item.*;
-import mineplex.core.gadget.gadgets.kitselector.*;
-import mineplex.core.gadget.gadgets.morph.*;
+import mineplex.core.gadget.gadgets.item.ItemBallCatch;
+import mineplex.core.gadget.gadgets.item.ItemBatGun;
+import mineplex.core.gadget.gadgets.item.ItemBow;
+import mineplex.core.gadget.gadgets.item.ItemCandy;
+import mineplex.core.gadget.gadgets.item.ItemClacker;
+import mineplex.core.gadget.gadgets.item.ItemCoal;
+import mineplex.core.gadget.gadgets.item.ItemCoinBomb;
+import mineplex.core.gadget.gadgets.item.ItemConnect4;
+import mineplex.core.gadget.gadgets.item.ItemGrapplingHook;
+import mineplex.core.gadget.gadgets.item.ItemDuelingSword;
+import mineplex.core.gadget.gadgets.item.ItemEtherealPearl;
+import mineplex.core.gadget.gadgets.item.ItemFirework;
+import mineplex.core.gadget.gadgets.item.ItemFleshHook;
+import mineplex.core.gadget.gadgets.item.ItemFlowerGift;
+import mineplex.core.gadget.gadgets.item.ItemFreezeCannon;
+import mineplex.core.gadget.gadgets.item.ItemLovePotion;
+import mineplex.core.gadget.gadgets.item.ItemMaryPoppins;
+import mineplex.core.gadget.gadgets.item.ItemMelonLauncher;
+import mineplex.core.gadget.gadgets.item.ItemMobBomb;
+import mineplex.core.gadget.gadgets.item.ItemOAndX;
+import mineplex.core.gadget.gadgets.item.ItemPaintballGun;
+import mineplex.core.gadget.gadgets.item.ItemPaintbrush;
+import mineplex.core.gadget.gadgets.item.ItemPartyPopper;
+import mineplex.core.gadget.gadgets.item.ItemSnowball;
+import mineplex.core.gadget.gadgets.item.ItemSortal;
+import mineplex.core.gadget.gadgets.item.ItemTNT;
+import mineplex.core.gadget.gadgets.item.ItemTrampoline;
+import mineplex.core.gadget.gadgets.kitselector.HalloweenKitSelector;
+import mineplex.core.gadget.gadgets.kitselector.HaloKitSelector;
+import mineplex.core.gadget.gadgets.kitselector.RainCloudKitSelector;
+import mineplex.core.gadget.gadgets.kitselector.RainbowDanceKitSelector;
+import mineplex.core.gadget.gadgets.kitselector.ShimmeringRingKitSelector;
+import mineplex.core.gadget.gadgets.kitselector.SingleParticleKitSelector;
+import mineplex.core.gadget.gadgets.kitselector.WaterWingsKitSelector;
+import mineplex.core.gadget.gadgets.morph.MorphAwkwardRabbit;
+import mineplex.core.gadget.gadgets.morph.MorphBat;
+import mineplex.core.gadget.gadgets.morph.MorphBlaze;
+import mineplex.core.gadget.gadgets.morph.MorphBlock;
+import mineplex.core.gadget.gadgets.morph.MorphBobRoss;
+import mineplex.core.gadget.gadgets.morph.MorphBunny;
+import mineplex.core.gadget.gadgets.morph.MorphChicken;
+import mineplex.core.gadget.gadgets.morph.MorphChristmasKing;
+import mineplex.core.gadget.gadgets.morph.MorphCow;
+import mineplex.core.gadget.gadgets.morph.MorphCreeper;
+import mineplex.core.gadget.gadgets.morph.MorphDinnerbone;
+import mineplex.core.gadget.gadgets.morph.MorphEnderman;
+import mineplex.core.gadget.gadgets.morph.MorphFreedomFighter;
+import mineplex.core.gadget.gadgets.morph.MorphFrostGolem;
+import mineplex.core.gadget.gadgets.morph.MorphGhast;
+import mineplex.core.gadget.gadgets.morph.MorphGoldPot;
+import mineplex.core.gadget.gadgets.morph.MorphGrimReaper;
+import mineplex.core.gadget.gadgets.morph.MorphLoveDoctor;
+import mineplex.core.gadget.gadgets.morph.MorphMelonHead;
+import mineplex.core.gadget.gadgets.morph.MorphMetalMan;
+import mineplex.core.gadget.gadgets.morph.MorphOcelot;
+import mineplex.core.gadget.gadgets.morph.MorphPig;
+import mineplex.core.gadget.gadgets.morph.MorphPumpkinKing;
+import mineplex.core.gadget.gadgets.morph.MorphSanta;
+import mineplex.core.gadget.gadgets.morph.MorphSkeleton;
+import mineplex.core.gadget.gadgets.morph.MorphSlime;
+import mineplex.core.gadget.gadgets.morph.MorphSnowman;
+import mineplex.core.gadget.gadgets.morph.MorphSquid;
+import mineplex.core.gadget.gadgets.morph.MorphTitan;
+import mineplex.core.gadget.gadgets.morph.MorphTurkey;
+import mineplex.core.gadget.gadgets.morph.MorphUncleSam;
+import mineplex.core.gadget.gadgets.morph.MorphVillager;
+import mineplex.core.gadget.gadgets.morph.MorphWitch;
+import mineplex.core.gadget.gadgets.morph.MorphWither;
+import mineplex.core.gadget.gadgets.morph.MorphWolf;
import mineplex.core.gadget.gadgets.morph.managers.SoulManager;
-import mineplex.core.gadget.gadgets.morph.moba.*;
-import mineplex.core.gadget.gadgets.mount.types.*;
+import mineplex.core.gadget.gadgets.morph.moba.MorphAnath;
+import mineplex.core.gadget.gadgets.morph.moba.MorphBardolf;
+import mineplex.core.gadget.gadgets.morph.moba.MorphBiff;
+import mineplex.core.gadget.gadgets.morph.moba.MorphDana;
+import mineplex.core.gadget.gadgets.morph.moba.MorphDevon;
+import mineplex.core.gadget.gadgets.morph.moba.MorphHattori;
+import mineplex.core.gadget.gadgets.morph.moba.MorphIvy;
+import mineplex.core.gadget.gadgets.morph.moba.MorphLarissa;
+import mineplex.core.gadget.gadgets.morph.moba.MorphRowena;
+import mineplex.core.gadget.gadgets.mount.types.MountBabyReindeer;
+import mineplex.core.gadget.gadgets.mount.types.MountCake;
+import mineplex.core.gadget.gadgets.mount.types.MountCart;
+import mineplex.core.gadget.gadgets.mount.types.MountChicken;
+import mineplex.core.gadget.gadgets.mount.types.MountDragon;
+import mineplex.core.gadget.gadgets.mount.types.MountFreedomHorse;
+import mineplex.core.gadget.gadgets.mount.types.MountFrost;
+import mineplex.core.gadget.gadgets.mount.types.MountLoveTrain;
+import mineplex.core.gadget.gadgets.mount.types.MountMule;
+import mineplex.core.gadget.gadgets.mount.types.MountNightmareSteed;
+import mineplex.core.gadget.gadgets.mount.types.MountPumpkin;
+import mineplex.core.gadget.gadgets.mount.types.MountSledge;
+import mineplex.core.gadget.gadgets.mount.types.MountSlime;
+import mineplex.core.gadget.gadgets.mount.types.MountSpider;
+import mineplex.core.gadget.gadgets.mount.types.MountStPatricksHorse;
+import mineplex.core.gadget.gadgets.mount.types.MountTitan;
+import mineplex.core.gadget.gadgets.mount.types.MountUndead;
+import mineplex.core.gadget.gadgets.mount.types.MountValentinesSheep;
+import mineplex.core.gadget.gadgets.mount.types.MountZombie;
import mineplex.core.gadget.gadgets.outfit.OutfitTeam;
import mineplex.core.gadget.gadgets.outfit.freezesuit.OutfitFreezeSuitBoots;
import mineplex.core.gadget.gadgets.outfit.freezesuit.OutfitFreezeSuitChestplate;
@@ -61,21 +257,125 @@ import mineplex.core.gadget.gadgets.outfit.windup.OutfitWindupBoots;
import mineplex.core.gadget.gadgets.outfit.windup.OutfitWindupChestplate;
import mineplex.core.gadget.gadgets.outfit.windup.OutfitWindupHelmet;
import mineplex.core.gadget.gadgets.outfit.windup.OutfitWindupLeggings;
-import mineplex.core.gadget.gadgets.particle.*;
-import mineplex.core.gadget.gadgets.particle.christmas.*;
-import mineplex.core.gadget.gadgets.particle.freedom.*;
+import mineplex.core.gadget.gadgets.particle.ParticleBlood;
+import mineplex.core.gadget.gadgets.particle.ParticleCandyCane;
+import mineplex.core.gadget.gadgets.particle.ParticleCoalFumes;
+import mineplex.core.gadget.gadgets.particle.ParticleDeepSeaSwirl;
+import mineplex.core.gadget.gadgets.particle.ParticleFiveYear;
+import mineplex.core.gadget.gadgets.particle.ParticleInfused;
+import mineplex.core.gadget.gadgets.particle.ParticleEmerald;
+import mineplex.core.gadget.gadgets.particle.ParticleEnchant;
+import mineplex.core.gadget.gadgets.particle.ParticleWitchsCure;
+import mineplex.core.gadget.gadgets.particle.ParticleFairy;
+import mineplex.core.gadget.gadgets.particle.ParticleFireRings;
+import mineplex.core.gadget.gadgets.particle.ParticleFoot;
+import mineplex.core.gadget.gadgets.particle.ParticleFrostLord;
+import mineplex.core.gadget.gadgets.particle.ParticleHalloween;
+import mineplex.core.gadget.gadgets.particle.ParticleHeart;
+import mineplex.core.gadget.gadgets.particle.ParticleMacawWings;
+import mineplex.core.gadget.gadgets.particle.ParticleChickenWings;
+import mineplex.core.gadget.gadgets.particle.ParticleEnderDragonWings;
+import mineplex.core.gadget.gadgets.particle.ParticleFoxTail;
+import mineplex.core.gadget.gadgets.particle.ParticleJetPack;
+import mineplex.core.gadget.gadgets.particle.ParticleCape;
+import mineplex.core.gadget.gadgets.particle.ParticleLegendaryHero;
+import mineplex.core.gadget.gadgets.particle.ParticleWolfTail;
+import mineplex.core.gadget.gadgets.particle.ParticleLegend;
+import mineplex.core.gadget.gadgets.particle.ParticleMusic;
+import mineplex.core.gadget.gadgets.particle.ParticlePartyTime;
+import mineplex.core.gadget.gadgets.particle.ParticleRain;
+import mineplex.core.gadget.gadgets.particle.ParticleRainbow;
+import mineplex.core.gadget.gadgets.particle.ParticleRainbowTrail;
+import mineplex.core.gadget.gadgets.particle.ParticleTitan;
+import mineplex.core.gadget.gadgets.particle.ParticleWingsAngel;
+import mineplex.core.gadget.gadgets.particle.ParticleWingsBee;
+import mineplex.core.gadget.gadgets.particle.ParticleWingsDemons;
+import mineplex.core.gadget.gadgets.particle.ParticleWingsInfernal;
+import mineplex.core.gadget.gadgets.particle.ParticleWingsLove;
+import mineplex.core.gadget.gadgets.particle.ParticleWingsPixie;
+import mineplex.core.gadget.gadgets.particle.ParticleYinYang;
+import mineplex.core.gadget.gadgets.particle.christmas.ParticleBlizzard;
+import mineplex.core.gadget.gadgets.particle.christmas.ParticleChristmasTree;
+import mineplex.core.gadget.gadgets.particle.christmas.ParticleFidgetSpinner;
+import mineplex.core.gadget.gadgets.particle.christmas.ParticlePumpkinShield;
+import mineplex.core.gadget.gadgets.particle.christmas.ParticleWingsChristmas;
+import mineplex.core.gadget.gadgets.particle.freedom.ParticleAuraNiceness;
+import mineplex.core.gadget.gadgets.particle.freedom.ParticleCanadian;
+import mineplex.core.gadget.gadgets.particle.freedom.ParticleFreedom;
+import mineplex.core.gadget.gadgets.particle.freedom.ParticleFreedomFireworks;
+import mineplex.core.gadget.gadgets.particle.freedom.ParticleStarSpangled;
import mineplex.core.gadget.gadgets.particle.king.CastleManager;
import mineplex.core.gadget.gadgets.particle.king.ParticleKing;
import mineplex.core.gadget.gadgets.particle.spring.ParticleSpringHalo;
-import mineplex.core.gadget.gadgets.taunts.*;
+import mineplex.core.gadget.gadgets.taunts.BlowAKissTaunt;
+import mineplex.core.gadget.gadgets.taunts.ChickenTaunt;
+import mineplex.core.gadget.gadgets.taunts.EasyModeTaunt;
+import mineplex.core.gadget.gadgets.taunts.EmojiTaunt;
+import mineplex.core.gadget.gadgets.taunts.EternalTaunt;
+import mineplex.core.gadget.gadgets.taunts.FrostBreathTaunt;
+import mineplex.core.gadget.gadgets.taunts.InfernalTaunt;
+import mineplex.core.gadget.gadgets.taunts.RainbowTaunt;
import mineplex.core.gadget.gadgets.weaponname.WeaponNameType;
-import mineplex.core.gadget.gadgets.wineffect.rankrooms.rankwineffects.*;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectBabyChicken;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectEarthquake;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectFlames;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectHalloween;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectLavaTrap;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectLightningStrike;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectLogo;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectLoveIsABattlefield;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectMrPunchMan;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectPartyAnimal;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectPodium;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectRiseOfTheElderGuardian;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectSnowTrails;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectTornado;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectWinterWarfare;
+import mineplex.core.gadget.gadgets.wineffect.rankrooms.rankwineffects.WinEffectRankEternal;
+import mineplex.core.gadget.gadgets.wineffect.rankrooms.rankwineffects.WinEffectRankHero;
+import mineplex.core.gadget.gadgets.wineffect.rankrooms.rankwineffects.WinEffectRankLegend;
+import mineplex.core.gadget.gadgets.wineffect.rankrooms.rankwineffects.WinEffectRankTitan;
+import mineplex.core.gadget.gadgets.wineffect.rankrooms.rankwineffects.WinEffectRankUltra;
import mineplex.core.gadget.mission.GadgetUseTracker;
import mineplex.core.gadget.persistence.UserGadgetPersistence;
-import mineplex.core.gadget.set.*;
-import mineplex.core.gadget.set.suits.*;
-import mineplex.core.gadget.types.*;
+import mineplex.core.gadget.set.SetBalance;
+import mineplex.core.gadget.set.SetCanadian;
+import mineplex.core.gadget.set.SetCandyCane;
+import mineplex.core.gadget.set.SetCupidsLove;
+import mineplex.core.gadget.set.SetEmerald;
+import mineplex.core.gadget.set.SetFreedom;
+import mineplex.core.gadget.set.SetFrostLord;
+import mineplex.core.gadget.set.SetHalloween;
+import mineplex.core.gadget.set.SetHowlingWinds;
+import mineplex.core.gadget.set.SetLegend;
+import mineplex.core.gadget.set.SetMusic;
+import mineplex.core.gadget.set.SetParty;
+import mineplex.core.gadget.set.SetRainbow;
+import mineplex.core.gadget.set.SetShadow;
+import mineplex.core.gadget.set.SetSpring;
+import mineplex.core.gadget.set.SetTitan;
+import mineplex.core.gadget.set.SetVampire;
+import mineplex.core.gadget.set.SetWisdom;
+import mineplex.core.gadget.set.suits.SetFreezeSuit;
+import mineplex.core.gadget.set.suits.SetRaveSuit;
+import mineplex.core.gadget.set.suits.SetReindeerSuit;
+import mineplex.core.gadget.set.suits.SetSpaceSuit;
+import mineplex.core.gadget.set.suits.SetStPatricksSuit;
+import mineplex.core.gadget.set.suits.SetWindup;
+import mineplex.core.gadget.types.BalloonGadget;
+import mineplex.core.gadget.types.DoubleJumpEffectGadget;
+import mineplex.core.gadget.types.FlagGadget;
+import mineplex.core.gadget.types.Gadget;
+import mineplex.core.gadget.types.GadgetSet;
+import mineplex.core.gadget.types.GadgetType;
+import mineplex.core.gadget.types.HatGadget;
+import mineplex.core.gadget.types.ItemGadget;
+import mineplex.core.gadget.types.LevelPrefixGadget;
+import mineplex.core.gadget.types.MusicGadget;
+import mineplex.core.gadget.types.OutfitGadget;
import mineplex.core.gadget.types.OutfitGadget.ArmorSlot;
+import mineplex.core.gadget.types.TauntGadget;
+import mineplex.core.gadget.types.WeaponNameGadget;
import mineplex.core.gadget.util.CostConstants;
import mineplex.core.game.GameDisplay;
import mineplex.core.hologram.HologramManager;
@@ -91,24 +391,6 @@ import mineplex.core.preferences.PreferencesManager;
import mineplex.core.projectile.ProjectileManager;
import mineplex.core.recharge.Recharge;
import mineplex.core.stats.event.PlayerStatsLoadedEvent;
-import org.bukkit.GameMode;
-import org.bukkit.Location;
-import org.bukkit.Material;
-import org.bukkit.Sound;
-import org.bukkit.block.Block;
-import org.bukkit.entity.ArmorStand;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.EventPriority;
-import org.bukkit.event.entity.PlayerDeathEvent;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.bukkit.event.player.*;
-import org.bukkit.inventory.AnvilInventory;
-import org.bukkit.inventory.Inventory;
-import org.bukkit.inventory.ItemStack;
-
-import java.util.*;
@ReflectivelyCreateMiniPlugin
public class GadgetManager extends MiniPlugin
@@ -536,7 +818,6 @@ public class GadgetManager extends MiniPlugin
}
//Win Effects
- /*
addGadget(new WinEffectPodium(this));
addGadget(new WinEffectLogo(this));
addGadget(new WinEffectMrPunchMan(this));
@@ -552,7 +833,6 @@ public class GadgetManager extends MiniPlugin
addGadget(new WinEffectTornado(this));
addGadget(new WinEffectEarthquake(this));
addGadget(new WinEffectPartyAnimal(this));
- */
// Rank based win effects
addGadget(new WinEffectRankUltra(this));
@@ -705,7 +985,6 @@ public class GadgetManager extends MiniPlugin
@Override
public void addCategories()
{
- /*
new GameCosmeticCategory(this, "Hero Skins", SkinData.HATTORI.getSkull(), true)
{
@Override
@@ -720,7 +999,6 @@ public class GadgetManager extends MiniPlugin
return new HeroSkinCategoryPage(parent.getPlugin(), parent.getShop(), parent.getClientManager(), parent.getDonationManager(), getCategoryName(), parent.getClient().GetPlayer(), parent);
}
};
- */
new GameCosmeticCategory(this, "Shop Morph", new ItemStack(Material.GOLD_INGOT), false)
{
@Override
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/imagemap/CustomItemFrames.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/imagemap/CustomItemFrames.java
index 688f6e86..a4dc3fb2 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/imagemap/CustomItemFrames.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/imagemap/CustomItemFrames.java
@@ -1,19 +1,32 @@
package mineplex.core.imagemap;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import net.minecraft.server.v1_8_R3.DataWatcher;
+import net.minecraft.server.v1_8_R3.EntityItemFrame;
+import net.minecraft.server.v1_8_R3.ItemStack;
+import net.minecraft.server.v1_8_R3.MinecraftServer;
+import net.minecraft.server.v1_8_R3.Packet;
+import net.minecraft.server.v1_8_R3.PacketPlayInUseEntity;
+import net.minecraft.server.v1_8_R3.PacketPlayOutEntityMetadata;
+
import com.google.common.base.Optional;
+import org.bukkit.craftbukkit.v1_8_R3.entity.CraftItemFrame;
+import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack;
+import org.bukkit.entity.ItemFrame;
+import org.bukkit.entity.Player;
+
import mineplex.core.MiniPlugin;
import mineplex.core.ReflectivelyCreateMiniPlugin;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.packethandler.IPacketHandler;
import mineplex.core.packethandler.PacketHandler;
import mineplex.core.packethandler.PacketInfo;
-import net.minecraft.server.v1_8_R3.*;
-import org.bukkit.craftbukkit.v1_8_R3.entity.CraftItemFrame;
-import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack;
-import org.bukkit.entity.ItemFrame;
-import org.bukkit.entity.Player;
-
-import java.util.*;
@ReflectivelyCreateMiniPlugin
public class CustomItemFrames extends MiniPlugin implements IPacketHandler
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/monitor/VersionsCommand.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/monitor/VersionsCommand.java
index 50ceec64..eef2a9b4 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/monitor/VersionsCommand.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/monitor/VersionsCommand.java
@@ -1,11 +1,23 @@
package mineplex.core.monitor;
-import mineplex.core.command.CommandBase;
-import mineplex.core.common.util.F;
-import mineplex.core.common.util.UtilPlayer;
+import java.lang.reflect.Field;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.bukkit.Bukkit;
+import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.entity.Player;
-import java.util.Map;
+//import com.mineplex.ProtocolVersion;
+
+import mineplex.core.command.CommandBase;
+import mineplex.core.common.util.C;
+import mineplex.core.common.util.F;
+import mineplex.core.common.util.UtilPlayer;
+import mineplex.core.common.util.UtilServer;
/**
* Statistics on versions
@@ -20,13 +32,13 @@ public class VersionsCommand extends CommandBase
super(plugin, LagMeter.Perm.VERSIONS_COMMAND, "versions", "getver");
}
- /*
- TODO: Protocol Support he
private void ensureVersions()
{
if (PRETTY_VERSIONS == null)
{
PRETTY_VERSIONS = new HashMap<>();
+ //TODO: Multi-protocol support
+ /*
for (Field field : ProtocolVersion.class.getFields())
{
try
@@ -38,24 +50,22 @@ public class VersionsCommand extends CommandBase
PRETTY_VERSIONS.put(protocol, version);
} catch (ReflectiveOperationException ex) { }
}
+ */
}
}
- */
-
@Override
public void Execute(Player caller, String[] args)
{
- /*
- TODO: Protocol Support
- //ensureVersions();
+ ensureVersions();
if (args.length == 0)
{
Map versions = new HashMap<>();
for (Player player : Bukkit.getOnlinePlayers())
{
- int version = ((CraftPlayer) player).getHandle().getProtocol();
+ //int version = ((CraftPlayer) player).getHandle().getProtocol();
+ int version = ((CraftPlayer) player).getHandle().playerConnection.networkManager.getVersion();
int players = versions.getOrDefault(version, 0);
versions.put(version, players + 1);
}
@@ -70,8 +80,9 @@ public class VersionsCommand extends CommandBase
for (Map.Entry entry : sorted)
{
int protocol = entry.getKey();
- String pretty = PRETTY_VERSIONS.computeIfAbsent(protocol, x -> Integer.toString(protocol));
-
+ //String pretty = PRETTY_VERSIONS.computeIfAbsent(protocol, x -> Integer.toString(protocol));
+ //HARDCODED
+ String pretty = "v1.8.9";
UtilPlayer.message(caller,
F.main("Version", C.cYellow + pretty + C.cGray + ": " + C.cGreen
+ entry.getValue() + C.cGray + " players"));
@@ -83,7 +94,8 @@ public class VersionsCommand extends CommandBase
if (!players.isEmpty())
{
Player player = players.get(0);
- int protocol = ((CraftPlayer) player).getHandle().getProtocol();
+ //int protocol = ((CraftPlayer) player).getHandle().getProtocol();
+ int protocol = ((CraftPlayer) player).getHandle().playerConnection.networkManager.getVersion();
String pretty = PRETTY_VERSIONS.computeIfAbsent(protocol, x -> Integer.toString(protocol));
UtilPlayer.message(caller,
@@ -95,7 +107,5 @@ public class VersionsCommand extends CommandBase
{
UtilPlayer.message(caller, F.main("Version", "Invalid argument list."));
}
- */
- UtilPlayer.message(caller, F.main("Version", "Nigga im lazy af. TODO: Protocol Support"));
}
}
\ No newline at end of file
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/npc/NpcManager.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/npc/NpcManager.java
index 5b754d67..5cd6a190 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/npc/NpcManager.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/npc/NpcManager.java
@@ -1,5 +1,56 @@
package mineplex.core.npc;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+import java.util.Set;
+import java.util.UUID;
+
+import net.minecraft.server.v1_8_R3.EntityInsentient;
+
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.DyeColor;
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.Sound;
+import org.bukkit.World;
+import org.bukkit.configuration.InvalidConfigurationException;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.craftbukkit.v1_8_R3.entity.CraftCreature;
+import org.bukkit.craftbukkit.v1_8_R3.entity.CraftLivingEntity;
+import org.bukkit.entity.Ageable;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.entity.Player;
+import org.bukkit.entity.Sheep;
+import org.bukkit.entity.Skeleton;
+import org.bukkit.entity.Slime;
+import org.bukkit.entity.Villager;
+import org.bukkit.entity.Zombie;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.entity.EntityCombustEvent;
+import org.bukkit.event.entity.EntityDamageByEntityEvent;
+import org.bukkit.event.entity.EntityDamageEvent;
+import org.bukkit.event.entity.EntityDeathEvent;
+import org.bukkit.event.entity.EntityTargetEvent;
+import org.bukkit.event.player.PlayerInteractEntityEvent;
+import org.bukkit.event.world.ChunkLoadEvent;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.bukkit.util.Vector;
+import org.jooq.Result;
+import org.jooq.impl.DSL;
+
import mineplex.core.MiniPlugin;
import mineplex.core.account.permissions.Permission;
import mineplex.core.account.permissions.PermissionGroup;
@@ -18,27 +69,6 @@ import mineplex.core.updater.event.UpdateEvent;
import mineplex.database.Tables;
import mineplex.database.tables.records.NpcsRecord;
import mineplex.serverdata.database.DBPool;
-import net.minecraft.server.v1_8_R3.EntityInsentient;
-import org.bukkit.*;
-import org.bukkit.configuration.InvalidConfigurationException;
-import org.bukkit.configuration.file.YamlConfiguration;
-import org.bukkit.craftbukkit.v1_8_R3.entity.CraftCreature;
-import org.bukkit.craftbukkit.v1_8_R3.entity.CraftLivingEntity;
-import org.bukkit.entity.*;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.EventPriority;
-import org.bukkit.event.entity.*;
-import org.bukkit.event.player.PlayerInteractEntityEvent;
-import org.bukkit.event.world.ChunkLoadEvent;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.plugin.java.JavaPlugin;
-import org.bukkit.util.Vector;
-import org.jooq.Result;
-import org.jooq.impl.DSL;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.*;
public class NpcManager extends MiniPlugin
{
@@ -101,7 +131,6 @@ public class NpcManager extends MiniPlugin
require(DisguiseManager.class);
- /*
try
{
loadNpcs();
@@ -111,8 +140,6 @@ public class NpcManager extends MiniPlugin
e.printStackTrace();
}
- */
-
generatePermissions();
}
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/punish/Punish.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/punish/Punish.java
index 9e866695..1e03e070 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/punish/Punish.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/punish/Punish.java
@@ -1,27 +1,10 @@
package mineplex.core.punish;
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import mineplex.core.MiniPlugin;
-import mineplex.core.account.CoreClient;
-import mineplex.core.account.CoreClientManager;
-import mineplex.core.account.event.ClientWebResponseEvent;
-import mineplex.core.account.permissions.Permission;
-import mineplex.core.account.permissions.PermissionGroup;
-import mineplex.core.common.Constants;
-import mineplex.core.common.util.*;
-import mineplex.core.common.util.UtilTime.TimeUnit;
-import mineplex.core.punish.Command.HistoryCommand;
-import mineplex.core.punish.Command.PunishCommand;
-import mineplex.core.punish.Command.RulesCommand;
-import mineplex.core.punish.Tokens.PunishClientToken;
-import mineplex.core.punish.Tokens.PunishmentToken;
-import mineplex.core.punish.clans.ClansBanManager;
-import mineplex.core.updater.UpdateType;
-import mineplex.core.updater.event.UpdateEvent;
-import mineplex.serverdata.commands.AddPunishCommand;
-import mineplex.serverdata.commands.RemovePunishCommand;
-import mineplex.serverdata.commands.ServerCommandManager;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.logging.Level;
+
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Sound;
@@ -35,10 +18,34 @@ import org.bukkit.event.player.AsyncPlayerPreLoginEvent.Result;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.function.Consumer;
-import java.util.logging.Level;
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+
+import mineplex.core.MiniPlugin;
+import mineplex.core.account.CoreClient;
+import mineplex.core.account.CoreClientManager;
+import mineplex.core.account.event.ClientWebResponseEvent;
+import mineplex.core.account.permissions.Permission;
+import mineplex.core.account.permissions.PermissionGroup;
+import mineplex.core.common.Constants;
+import mineplex.core.common.util.C;
+import mineplex.core.common.util.Callback;
+import mineplex.core.common.util.F;
+import mineplex.core.common.util.UtilPlayer;
+import mineplex.core.common.util.UtilServer;
+import mineplex.core.common.util.UtilTime;
+import mineplex.core.common.util.UtilTime.TimeUnit;
+import mineplex.core.punish.Command.HistoryCommand;
+import mineplex.core.punish.Command.PunishCommand;
+import mineplex.core.punish.Command.RulesCommand;
+import mineplex.core.punish.Tokens.PunishClientToken;
+import mineplex.core.punish.Tokens.PunishmentToken;
+import mineplex.core.punish.clans.ClansBanManager;
+import mineplex.core.updater.UpdateType;
+import mineplex.core.updater.event.UpdateEvent;
+import mineplex.serverdata.commands.AddPunishCommand;
+import mineplex.serverdata.commands.RemovePunishCommand;
+import mineplex.serverdata.commands.ServerCommandManager;
public class Punish extends MiniPlugin
{
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/sound/SoundNotifier.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/sound/SoundNotifier.java
index 2032a153..c18db109 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/sound/SoundNotifier.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/sound/SoundNotifier.java
@@ -1,6 +1,16 @@
package mineplex.core.sound;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
import com.google.common.collect.Sets;
+//TODO: Sound?
+//import com.mineplex.spigot.MissingSoundEvent;
+
+import org.bukkit.event.EventHandler;
+import org.bukkit.scheduler.BukkitRunnable;
+
import mineplex.core.MiniPlugin;
import mineplex.core.ReflectivelyCreateMiniPlugin;
import mineplex.core.common.util.UtilServer;
@@ -10,11 +20,6 @@ import mineplex.core.slack.SlackTeam;
import mineplex.serverdata.Region;
import mineplex.serverdata.redis.atomic.RedisStringRepository;
import mineplex.serverdata.servers.ServerManager;
-import org.bukkit.scheduler.BukkitRunnable;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
/**
* Notifies #pc-sound-logging when we detect a bad sound mapping
@@ -73,9 +78,8 @@ public class SoundNotifier extends MiniPlugin
}
+ //TODO: Sound?
/*
-
- TODO: Never hahaha
@EventHandler
public void onMissingSound(MissingSoundEvent event)
{
@@ -85,7 +89,7 @@ public class SoundNotifier extends MiniPlugin
{
_messages.add(message);
}
- }]
+ }
*/
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/treasure/types/NormalTreasure.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/treasure/types/NormalTreasure.java
index 7c349e89..17d065a7 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/treasure/types/NormalTreasure.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/treasure/types/NormalTreasure.java
@@ -1,16 +1,56 @@
package mineplex.core.treasure.types;
-import mineplex.core.gadget.gadgets.arrowtrail.*;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailBalance;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailBlood;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailConfetti;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailEmerald;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailEnchant;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailMusic;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailShadow;
+import mineplex.core.gadget.gadgets.arrowtrail.ArrowTrailStorm;
import mineplex.core.gadget.gadgets.balloons.BalloonType;
-import mineplex.core.gadget.gadgets.death.*;
-import mineplex.core.gadget.gadgets.doublejump.*;
-import mineplex.core.gadget.gadgets.item.*;
+import mineplex.core.gadget.gadgets.death.DeathBalance;
+import mineplex.core.gadget.gadgets.death.DeathBlood;
+import mineplex.core.gadget.gadgets.death.DeathEmerald;
+import mineplex.core.gadget.gadgets.death.DeathEnchant;
+import mineplex.core.gadget.gadgets.death.DeathMusic;
+import mineplex.core.gadget.gadgets.death.DeathPinataBurst;
+import mineplex.core.gadget.gadgets.death.DeathShadow;
+import mineplex.core.gadget.gadgets.death.DeathStorm;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpBalance;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpBlood;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpEmerald;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpEnchant;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpFirecracker;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpMusic;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpShadow;
+import mineplex.core.gadget.gadgets.doublejump.DoubleJumpStorm;
+import mineplex.core.gadget.gadgets.item.ItemBatGun;
+import mineplex.core.gadget.gadgets.item.ItemEtherealPearl;
+import mineplex.core.gadget.gadgets.item.ItemFirework;
+import mineplex.core.gadget.gadgets.item.ItemFleshHook;
+import mineplex.core.gadget.gadgets.item.ItemMelonLauncher;
+import mineplex.core.gadget.gadgets.item.ItemPaintballGun;
+import mineplex.core.gadget.gadgets.item.ItemTNT;
+import mineplex.core.gadget.gadgets.item.ItemTrampoline;
import mineplex.core.gadget.gadgets.kitselector.HaloKitSelector;
import mineplex.core.gadget.gadgets.kitselector.RainbowDanceKitSelector;
import mineplex.core.gadget.gadgets.kitselector.ShimmeringRingKitSelector;
import mineplex.core.gadget.gadgets.kitselector.SingleParticleKitSelector;
-import mineplex.core.gadget.gadgets.morph.*;
-import mineplex.core.gadget.gadgets.mount.types.*;
+import mineplex.core.gadget.gadgets.morph.MorphBat;
+import mineplex.core.gadget.gadgets.morph.MorphBlock;
+import mineplex.core.gadget.gadgets.morph.MorphChicken;
+import mineplex.core.gadget.gadgets.morph.MorphCow;
+import mineplex.core.gadget.gadgets.morph.MorphEnderman;
+import mineplex.core.gadget.gadgets.morph.MorphSkeleton;
+import mineplex.core.gadget.gadgets.morph.MorphSlime;
+import mineplex.core.gadget.gadgets.morph.MorphVillager;
+import mineplex.core.gadget.gadgets.morph.MorphWolf;
+import mineplex.core.gadget.gadgets.mount.types.MountCart;
+import mineplex.core.gadget.gadgets.mount.types.MountFrost;
+import mineplex.core.gadget.gadgets.mount.types.MountMule;
+import mineplex.core.gadget.gadgets.mount.types.MountSlime;
+import mineplex.core.gadget.gadgets.mount.types.MountUndead;
import mineplex.core.gadget.gadgets.outfit.ravesuit.OutfitRaveSuitBoots;
import mineplex.core.gadget.gadgets.outfit.ravesuit.OutfitRaveSuitChestplate;
import mineplex.core.gadget.gadgets.outfit.ravesuit.OutfitRaveSuitHelmet;
@@ -19,9 +59,39 @@ import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuitBoots;
import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuitChestplate;
import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuitHelmet;
import mineplex.core.gadget.gadgets.outfit.spacesuit.OutfitSpaceSuitLeggings;
-import mineplex.core.gadget.gadgets.particle.*;
+import mineplex.core.gadget.gadgets.particle.ParticleBlood;
+import mineplex.core.gadget.gadgets.particle.ParticleCape;
+import mineplex.core.gadget.gadgets.particle.ParticleChickenWings;
+import mineplex.core.gadget.gadgets.particle.ParticleDeepSeaSwirl;
+import mineplex.core.gadget.gadgets.particle.ParticleEmerald;
+import mineplex.core.gadget.gadgets.particle.ParticleEnchant;
+import mineplex.core.gadget.gadgets.particle.ParticleFairy;
+import mineplex.core.gadget.gadgets.particle.ParticleFireRings;
+import mineplex.core.gadget.gadgets.particle.ParticleFoot;
+import mineplex.core.gadget.gadgets.particle.ParticleFoxTail;
+import mineplex.core.gadget.gadgets.particle.ParticleHeart;
+import mineplex.core.gadget.gadgets.particle.ParticleInfused;
+import mineplex.core.gadget.gadgets.particle.ParticleJetPack;
+import mineplex.core.gadget.gadgets.particle.ParticleLegendaryHero;
+import mineplex.core.gadget.gadgets.particle.ParticleMusic;
+import mineplex.core.gadget.gadgets.particle.ParticlePartyTime;
+import mineplex.core.gadget.gadgets.particle.ParticleRain;
+import mineplex.core.gadget.gadgets.particle.ParticleRainbowTrail;
+import mineplex.core.gadget.gadgets.particle.ParticleWingsAngel;
+import mineplex.core.gadget.gadgets.particle.ParticleWingsDemons;
+import mineplex.core.gadget.gadgets.particle.ParticleWingsInfernal;
+import mineplex.core.gadget.gadgets.particle.ParticleWingsPixie;
+import mineplex.core.gadget.gadgets.particle.ParticleWolfTail;
+import mineplex.core.gadget.gadgets.particle.ParticleYinYang;
import mineplex.core.gadget.gadgets.taunts.EmojiTaunt;
import mineplex.core.gadget.gadgets.weaponname.WeaponNameType;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectBabyChicken;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectEarthquake;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectLavaTrap;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectLightningStrike;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectMrPunchMan;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectPartyAnimal;
+import mineplex.core.gadget.gadgets.wineffect.WinEffectRiseOfTheElderGuardian;
import mineplex.core.gadget.util.CostConstants;
import mineplex.core.pet.PetType;
import mineplex.core.treasure.reward.RewardRarity;
@@ -236,7 +306,6 @@ public class NormalTreasure extends Treasure
addGadgetReward(getGadget(ParticleInfused.class), rarity, 10);
// Win Effects
- /*
addGadgetReward(getGadget(WinEffectBabyChicken.class), rarity, 10);
addGadgetReward(getGadget(WinEffectLavaTrap.class), rarity, 20);
addGadgetReward(getGadget(WinEffectLightningStrike.class), rarity, 20);
@@ -245,8 +314,6 @@ public class NormalTreasure extends Treasure
addGadgetReward(getGadget(WinEffectEarthquake.class), rarity, 10);
addGadgetReward(getGadget(WinEffectPartyAnimal.class), rarity, 10);
- */
-
// Titles
addTitleReward("ayyye", rarity, 25);
addTitleReward("ameno", rarity, 15);
diff --git a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/twofactor/TwoFactorAuth.java b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/twofactor/TwoFactorAuth.java
index d9acac60..14fb22ae 100644
--- a/Plugins[Modified]/Mineplex.Core/src/mineplex/core/twofactor/TwoFactorAuth.java
+++ b/Plugins[Modified]/Mineplex.Core/src/mineplex/core/twofactor/TwoFactorAuth.java
@@ -1,18 +1,11 @@
package mineplex.core.twofactor;
-import com.warrenstrange.googleauth.GoogleAuthenticator;
-import com.warrenstrange.googleauth.GoogleAuthenticatorConfig;
-import mineplex.core.Managers;
-import mineplex.core.MiniClientPlugin;
-import mineplex.core.ReflectivelyCreateMiniPlugin;
-import mineplex.core.account.CoreClientManager;
-import mineplex.core.account.permissions.Permission;
-import mineplex.core.account.permissions.PermissionGroup;
-import mineplex.core.command.CommandBase;
-import mineplex.core.common.util.*;
-import mineplex.core.recharge.Recharge;
-import mineplex.serverdata.commands.TwoFactorResetCommand;
-import mineplex.serverdata.database.DBPool;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
@@ -22,12 +15,38 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.event.inventory.InventoryEvent;
-import org.bukkit.event.player.*;
+import org.bukkit.event.player.AsyncPlayerChatEvent;
+import org.bukkit.event.player.PlayerCommandPreprocessEvent;
+import org.bukkit.event.player.PlayerDropItemEvent;
+import org.bukkit.event.player.PlayerEvent;
+import org.bukkit.event.player.PlayerInteractEntityEvent;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.event.player.PlayerItemHeldEvent;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerMoveEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.map.MapRenderer;
import org.bukkit.map.MapView;
-import java.util.*;
+import com.warrenstrange.googleauth.GoogleAuthenticator;
+import com.warrenstrange.googleauth.GoogleAuthenticatorConfig;
+
+import mineplex.core.Managers;
+import mineplex.core.MiniClientPlugin;
+import mineplex.core.ReflectivelyCreateMiniPlugin;
+import mineplex.core.account.CoreClientManager;
+import mineplex.core.account.permissions.Permission;
+import mineplex.core.account.permissions.PermissionGroup;
+import mineplex.core.command.CommandBase;
+import mineplex.core.common.util.BukkitFuture;
+import mineplex.core.common.util.C;
+import mineplex.core.common.util.F;
+import mineplex.core.common.util.UtilPlayerBase;
+import mineplex.core.common.util.UtilServer;
+import mineplex.core.recharge.Recharge;
+import mineplex.serverdata.commands.TwoFactorResetCommand;
+import mineplex.serverdata.database.DBPool;
@ReflectivelyCreateMiniPlugin
public class TwoFactorAuth extends MiniClientPlugin
@@ -194,7 +213,6 @@ public class TwoFactorAuth extends MiniClientPlugin
@EventHandler
public void onJoin(PlayerJoinEvent event)
{
- /*
Player player = event.getPlayer();
TwoFactorData data = Get(player);
@@ -218,8 +236,7 @@ public class TwoFactorAuth extends MiniClientPlugin
{
runSync(() -> setup2FA(event.getPlayer()));
}
-
- */
+ }
}
@EventHandler
diff --git a/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/pom.xml b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/pom.xml
new file mode 100644
index 00000000..2eadc0ad
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/pom.xml
@@ -0,0 +1,46 @@
+
+
+ 4.0.0
+
+
+ com.mineplex
+ mineplex-app
+ dev-SNAPSHOT
+ ../app.xml
+
+
+ DDoSProtectionSwitcher
+ mineplex-ddosprotectionswitcher
+
+
+
+ com.google.code.gson
+ gson
+
+
+ javax.mail
+ mail
+
+
+ org.apache.httpcomponents
+ httpclient
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+
+ mineplex.ddos.DDoSProtectionSwitcher
+
+
+
+
+
+
+
diff --git a/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/DDoSProtectionSwitcher.java b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/DDoSProtectionSwitcher.java
new file mode 100644
index 00000000..9bcaaf2d
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/DDoSProtectionSwitcher.java
@@ -0,0 +1,325 @@
+package mineplex.ddos;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.PasswordAuthentication;
+import javax.mail.Session;
+import javax.mail.Transport;
+import javax.mail.internet.AddressException;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMessage.RecipientType;
+
+import mineplex.ddos.api.ApiDeleteCall;
+import mineplex.ddos.api.ApiGetCall;
+import mineplex.ddos.api.ApiPostCall;
+import mineplex.ddos.api.ApiPutCall;
+import mineplex.ddos.api.token.DnsRecord;
+import mineplex.ddos.api.token.DomainRecords;
+
+public class DDoSProtectionSwitcher
+{
+ private static DnsMadeEasyRepository _repository = null;
+ private static HashSet _processes = new HashSet();
+
+ public static void main(String args[])
+ {
+ try
+ {
+ Class.forName("com.mysql.jdbc.Driver");
+ }
+ catch (ClassNotFoundException e1)
+ {
+ e1.printStackTrace();
+ }
+
+ _repository = new DnsMadeEasyRepository();
+ DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
+
+ //while (true)
+ //{
+ //if (_repository.switchToDDOSProt())
+ //{
+
+ System.out.println("Starting DDoS Protection Switch at " + dateFormat.format(new Date()));
+
+ 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();
+ List recordsToModify = new ArrayList();
+
+ // Switch on ddos protection
+ for (DnsRecord record : records.data)
+ {
+ if (record.type.equalsIgnoreCase("A"))
+ {
+ if (record.name.equalsIgnoreCase("neustar"))
+ {
+ record.name = "us";
+ recordsToModify.add(record);
+ }
+ else if (record.name.equalsIgnoreCase("us"))
+ {
+ record.name = "us2";
+ recordsToModify.add(record);
+ }
+ else if (record.name.equalsIgnoreCase("eu"))
+ {
+ record.name = "eu2";
+ recordsToModify.add(record);
+ }
+ }
+ }
+
+ if (recordsToAdd.size() > 0)
+ {
+ new ApiPostCall("https://api.dnsmadeeasy.com/V2.0/dns/managed/", 962728, "/records/", "createMulti")
+ .Execute(records);
+ System.out.println("Created " + recordsToAdd.size() + " records.");
+ }
+
+ if (recordsToModify.size() > 0)
+ {
+ new ApiPutCall("https://api.dnsmadeeasy.com/V2.0/dns/managed/", 962728, "/records/", "updateMulti")
+ .Execute(recordsToModify);
+ System.out.println("Modified " + recordsToModify.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();
+ System.out.println("Deleted " + recordsToDelete.size() + " records.");
+ }
+/*
+ // Switching US Bungees
+ switchServer("10.35.74.130", "108.178.20.166", "108.163.222.202", "108.178.20.165", "108.163.222.201");
+ switchServer("10.35.74.132", "108.163.217.110", "108.178.44.50", "108.163.217.109", "108.178.44.49");
+ switchServer("10.35.74.142", "108.178.16.90", "108.178.16.90", "108.178.16.89", "108.178.16.89");
+ switchServer("10.35.74.135", "108.163.254.134", "108.178.16.106", "108.163.254.133", "108.178.16.105");
+ switchServer("10.35.74.137", "108.163.216.250", "108.178.34.162", "108.163.216.249", "108.178.34.161");
+ switchServer("10.35.74.147", "108.163.216.106", "184.154.39.126", "108.163.216.105", "184.154.39.125");
+ switchServer("10.35.74.143", "184.154.215.170", "108.178.17.6", "184.154.215.169", "108.178.17.5");
+ switchServer("10.35.74.145", "96.127.174.206", "108.178.7.118", "96.127.174.205", "108.178.7.117");
+ switchServer("10.35.74.144", "184.154.127.10", "184.154.39.154", "184.154.127.9", "184.154.39.153");
+ switchServer("10.35.74.146", "96.127.174.146", "108.178.16.26", "96.127.174.145", "108.178.16.25");
+ switchServer("10.35.74.149", "108.178.7.206", "107.6.158.198", "108.178.7.205", "107.6.158.197");
+ switchServer("10.35.74.136", "184.154.39.146", "184.154.13.218", "184.154.39.145", "184.154.13.217");
+ switchServer("10.35.74.139", "108.163.217.250", "108.178.44.134", "108.163.217.249", "108.178.44.133");
+ switchServer("10.35.74.140", "69.175.15.242", "108.163.216.38", "69.175.15.241", "108.163.216.37");
+ switchServer("10.35.74.141", "107.6.129.126", "96.127.182.218", "107.6.129.125", "96.127.182.217");
+ switchServer("10.35.74.134", "108.163.222.174", "108.163.216.82", "108.163.222.173", "108.163.216.81");
+ switchServer("10.32.214.248", "108.178.34.118", "107.6.129.170", "108.178.34.117", "107.6.129.169");
+ switchServer("10.32.214.250", "69.175.4.38", "107.6.129.250", "69.175.4.37", "107.6.129.249");
+ switchServer("10.32.214.249", "107.6.158.78", "184.154.13.38", "107.6.158.77", "184.154.13.37");
+ switchServer("10.32.214.247", "184.154.13.118", "108.163.242.98", "184.154.13.117", "108.163.242.97");
+*/
+ /*
+ // Switching EU Bungees
+ switchServer("10.82.2.202", "107.6.176.194", "107.6.176.34", "107.6.176.193", "107.6.176.33");
+ switchServer("10.82.2.204", "107.6.176.122", "107.6.176.50", "107.6.176.121", "107.6.176.49");
+ switchServer("10.82.2.206", "107.6.176.166", "107.6.176.126", "107.6.176.165", "107.6.176.125");
+ switchServer("10.83.27.77", "107.6.176.14", "107.6.176.98", "107.6.176.13", "107.6.176.97");
+ switchServer("10.82.2.225", "107.6.176.114", "107.6.176.58", "107.6.176.113", "107.6.176.57");
+ switchServer("10.82.2.227", "107.6.176.26", "107.6.176.46", "107.6.176.25", "107.6.176.45");
+ switchServer("10.82.2.228", "107.6.176.110", "107.6.176.70", "107.6.176.109", "107.6.176.69");
+ switchServer("10.82.2.226", "107.6.176.138", "107.6.176.234", "107.6.176.137", "107.6.176.233");
+ */
+ //sendMail();
+ //}
+
+ int processWaits = 0;
+
+ while (_processes.size() > 0)
+ {
+ for (Iterator iterator = _processes.iterator(); iterator.hasNext();)
+ {
+ ProcessRunner pr = iterator.next();
+
+ try
+ {
+ pr.join(100);
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace();
+ }
+
+ if (pr.isDone())
+ iterator.remove();
+ }
+
+ if (_processes.size() > 0)
+ {
+ try
+ {
+ Thread.sleep(6000);
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ if (processWaits >= 60)
+ {
+ System.out.println("Killing stale processes.");
+
+ for (Iterator iterator = _processes.iterator(); iterator.hasNext();)
+ {
+ iterator.next().abort();
+ iterator.remove();
+ }
+ }
+
+ processWaits++;
+ }
+
+ processWaits = 0;
+
+ try
+ {
+ Thread.sleep(60000);
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace();
+ }
+ //}
+ /*
+ * // Switch off ddos protection for (DnsRecord record : records.data) {
+ * if (record.type.equalsIgnoreCase("CNAME")) { if
+ * (record.name.equalsIgnoreCase("eu")) recordsToDelete.add(record); }
+ * else if (record.type.equalsIgnoreCase("A")) { if
+ * (record.name.equalsIgnoreCase("us")) { record.name = "neustar";
+ * recordsToModify.add(record); } else if
+ * (record.name.equalsIgnoreCase("us2")) { record.name = "us";
+ * recordsToModify.add(record); } else if
+ * (record.name.equalsIgnoreCase("eu2")) { record.name = "eu";
+ * recordsToModify.add(record); } } }
+ *
+ *
+ *
+ * recordsToAdd.add(new CNameRecord("eu", "us", 300));
+ */
+ }
+
+ private static void sendMail()
+ {
+ Message message = new MimeMessage(getSession());
+
+ try
+ {
+ message.addRecipient(RecipientType.TO, new InternetAddress("ultrasupport@neustar.biz"));
+ message.addFrom(new InternetAddress[] { new InternetAddress("it@mineplex.com") });
+
+ message.setSubject("Start Mitigation Incident");
+ message.setText("We need to start mitigation.\n\n"
+ + "Jonathan Williams\n"
+ + "Director of Gaming Software Development\n"
+ + "Mineplex, LLC\n"
+ + "PH: 805.231.0407\n"
+ + "http://www.mineplex.com");
+
+
+ Transport.send(message);
+
+ System.out.println("Sent Neustar Mitigation Email at " + new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(new Date()));
+ }
+ catch (AddressException e)
+ {
+ e.printStackTrace();
+ }
+ catch (MessagingException e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ private static Session getSession()
+ {
+ Authenticator authenticator = new Authenticator();
+
+ Properties properties = new Properties();
+ properties.setProperty("mail.smtp.submitter", authenticator.getPasswordAuthentication().getUserName());
+
+ properties.setProperty("mail.smtp.host", "smtp.fatcow.com");
+ properties.setProperty("mail.smtp.socketFactory.port", "465");
+ properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
+ properties.setProperty("mail.smtp.auth", "true");
+ properties.setProperty("mail.smtp.port", "465");
+
+ return Session.getInstance(properties, authenticator);
+ }
+
+ private static void switchServer(final String privateIp, String currentIp, String newIp, String currentGateway,
+ String newGateway)
+ {
+ String cmd = "/usr/bin/ssh";
+ String args = "-to StrictHostKeyChecking=no -o ServerAliveInterval=10 mineplex@" + privateIp + " -p 5191";
+ String remoteCmd = "\"sh /home/mineplex/config/switchBungeeIpRemote.sh";
+ String remoteCmdEnd = "\"";
+
+ ProcessRunner pr = new ProcessRunner(new String[] { cmd, args, remoteCmd, currentIp, newIp,
+ currentGateway, newGateway, remoteCmdEnd });
+ pr.start(new GenericRunnable()
+ {
+ public void run(Boolean error)
+ {
+ if (error)
+ System.out.println("[" + privateIp + "] Errored!");
+ else
+ System.out.println("[" + privateIp + "] Switched!");
+ }
+ });
+
+ try
+ {
+ pr.join(500);
+ }
+ catch (InterruptedException e1)
+ {
+ e1.printStackTrace();
+ }
+
+ if (!pr.isDone())
+ _processes.add(pr);
+ }
+
+ private static class Authenticator extends javax.mail.Authenticator
+ {
+ private PasswordAuthentication authentication;
+
+ public Authenticator()
+ {
+ String username = "it@mineplex.com";
+ String password = "BearT4bl312ust";
+ authentication = new PasswordAuthentication(username, password);
+ }
+
+ protected PasswordAuthentication getPasswordAuthentication()
+ {
+ return authentication;
+ }
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/DnsMadeEasyRepository.java b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/DnsMadeEasyRepository.java
new file mode 100644
index 00000000..aebe2bde
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/DnsMadeEasyRepository.java
@@ -0,0 +1,128 @@
+package mineplex.ddos;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.text.SimpleDateFormat;
+
+public class DnsMadeEasyRepository
+{
+ // Yip Yip actual IP because if null route happens we can't resolve the HOSTNAME DERP FACE DEFEK7!!! -defek7
+ private String _connectionString = "jdbc:mysql://10.35.74.133: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 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 SELECT_SERVERS = "SELECT updated, lastOnline, us, now() FROM bungeeOnlineStatus;";
+
+ 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 boolean switchToDDOSProt()
+ {
+ Connection connection = null;
+ PreparedStatement preparedStatement = null;
+ ResultSet resultSet = null;
+
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ int countOffline = 0;
+
+ try
+ {
+ connection = DriverManager.getConnection(_connectionString, _userName, _password);
+
+ preparedStatement = connection.prepareStatement(SELECT_SERVERS);
+
+ resultSet = preparedStatement.executeQuery();
+
+ while (resultSet.next())
+ {
+ long current = dateFormat.parse(resultSet.getString(4)).getTime();
+ long updated = dateFormat.parse(resultSet.getString(1)).getTime();
+ long lastOnline = dateFormat.parse(resultSet.getString(2)).getTime();
+
+ if (current - updated < 70000 && current - lastOnline > 660000)
+ countOffline++;
+ }
+ }
+ 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();
+ }
+ }
+ }
+
+ //if (countOffline > 5)
+ System.out.println(countOffline + " offline bungees.");
+
+ return true;
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/GenericRunnable.java b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/GenericRunnable.java
new file mode 100644
index 00000000..dd6cc1a7
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/GenericRunnable.java
@@ -0,0 +1,6 @@
+package mineplex.ddos;
+
+public interface GenericRunnable
+{
+ void run(T t);
+}
diff --git a/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/ProcessRunner.java b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/ProcessRunner.java
new file mode 100644
index 00000000..744cab76
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/ProcessRunner.java
@@ -0,0 +1,81 @@
+package mineplex.ddos;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+
+public class ProcessRunner extends Thread
+{
+ private ProcessBuilder _processBuilder;
+ private Process _process;
+ private GenericRunnable _runnable;
+
+ boolean _done = false;
+ Boolean _error = false;
+
+ ProcessRunner(String[] args)
+ {
+ super("ProcessRunner " + args);
+ _processBuilder = new ProcessBuilder(args);
+ }
+
+ public void run()
+ {
+ try
+ {
+ _process = _processBuilder.start();
+ _process.waitFor();
+
+ BufferedReader reader=new BufferedReader(new InputStreamReader(_process.getInputStream()));
+ String line = reader.readLine();
+
+ while(line != null)
+ {
+ if (line.equals("255"))
+ _error = true;
+
+ line=reader.readLine();
+ }
+ }
+ catch (Exception e)
+ {
+ System.out.println(e.getMessage());
+ }
+ finally
+ {
+ _done = true;
+
+ if (_runnable != null)
+ _runnable.run(_error);
+ }
+ }
+
+ public void start(GenericRunnable runnable)
+ {
+ super.start();
+
+ _runnable = runnable;
+ }
+
+ public int exitValue() throws IllegalStateException
+ {
+ if (_process != null)
+ {
+ return _process.exitValue();
+ }
+
+ throw new IllegalStateException("Process not started yet");
+ }
+
+ public boolean isDone()
+ {
+ return _done;
+ }
+
+ public void abort()
+ {
+ if (!isDone())
+ {
+ _process.destroy();
+ }
+ }
+ }
diff --git a/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/ApiDeleteCall.java b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/ApiDeleteCall.java
new file mode 100644
index 00000000..5e91aab8
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/ApiDeleteCall.java
@@ -0,0 +1,19 @@
+package mineplex.ddos.api;
+
+import org.apache.http.client.methods.HttpDelete;
+
+public class ApiDeleteCall extends DnsMadeEasyApiCallBase
+{
+ public ApiDeleteCall(String apiUrl, int domainId, String category)
+ {
+ super(apiUrl, domainId, category);
+ }
+
+ public void Execute()
+ {
+ HttpDelete request = new HttpDelete(ApiUrl + DomainId + Category);
+ System.out.println(request.getURI().toString());
+
+ System.out.println(execute(request));
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/ApiGetCall.java b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/ApiGetCall.java
new file mode 100644
index 00000000..cc5e19b2
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/ApiGetCall.java
@@ -0,0 +1,35 @@
+package mineplex.ddos.api;
+
+import java.lang.reflect.Type;
+
+import org.apache.http.client.methods.HttpGet;
+
+import com.google.gson.Gson;
+
+public class ApiGetCall extends DnsMadeEasyApiCallBase
+{
+ private String _action;
+
+ public ApiGetCall(String apiUrl, int domainId, String category, String action)
+ {
+ super(apiUrl, domainId, category);
+
+ _action = action;
+ }
+
+ public void Execute()
+ {
+ HttpGet request = new HttpGet(ApiUrl + DomainId + Category + _action);
+
+ System.out.println(execute(request));
+ }
+
+ public T Execute(Type returnType)
+ {
+ HttpGet request = new HttpGet(ApiUrl + DomainId + Category + _action);
+
+ String response = execute(request);
+ System.out.println(response);
+ return new Gson().fromJson(response, returnType);
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/ApiPostCall.java b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/ApiPostCall.java
new file mode 100644
index 00000000..ec1c119d
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/ApiPostCall.java
@@ -0,0 +1,79 @@
+package mineplex.ddos.api;
+
+import java.lang.reflect.Type;
+
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.protocol.HTTP;
+
+import com.google.gson.Gson;
+
+public class ApiPostCall extends DnsMadeEasyApiCallBase
+{
+ private String _action;
+
+ public ApiPostCall(String apiUrl, int domainId, String category, String action)
+ {
+ super(apiUrl, domainId, category);
+
+ _action = action;
+ }
+
+ public void Execute(Object argument)
+ {
+ Gson gson = new Gson();
+ HttpPost request = new HttpPost(ApiUrl + DomainId + Category + _action);
+
+ System.out.println(request.getURI().toString());
+
+ try
+ {
+ StringEntity params = new StringEntity(gson.toJson(argument));
+ params.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
+ request.setEntity(params);
+ }
+ catch (Exception exception)
+ {
+ System.out.println("Error executing ApiPostCall(Object): \n" + exception.getMessage());
+
+ for (StackTraceElement trace : exception.getStackTrace())
+ {
+ System.out.println(trace);
+ }
+ }
+
+ System.out.println(execute(request));
+ }
+
+ public T Execute(Class returnClass)
+ {
+ return Execute(returnClass, (Object)null);
+ }
+
+ public T Execute(Type returnType, Object argument)
+ {
+ Gson gson = new Gson();
+ HttpPost request = new HttpPost(ApiUrl + DomainId + Category + _action);
+ System.out.println(request.getURI().toString());
+ try
+ {
+ StringEntity params = new StringEntity(gson.toJson(argument));
+ params.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
+ request.setEntity(params);
+ }
+ catch (Exception exception)
+ {
+ System.out.println("Error executing ApiPostCall(Type, Object): \n" + exception.getMessage());
+
+ for (StackTraceElement trace : exception.getStackTrace())
+ {
+ System.out.println(trace);
+ }
+ }
+
+ String response = execute(request);
+ System.out.println(response);
+ return new Gson().fromJson(response, returnType);
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/ApiPutCall.java b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/ApiPutCall.java
new file mode 100644
index 00000000..e5cf95b5
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/ApiPutCall.java
@@ -0,0 +1,80 @@
+package mineplex.ddos.api;
+
+import java.lang.reflect.Type;
+
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.protocol.HTTP;
+
+import com.google.gson.Gson;
+
+public class ApiPutCall extends DnsMadeEasyApiCallBase
+{
+ private String _action;
+
+ public ApiPutCall(String apiUrl, int domainId, String category, String action)
+ {
+ super(apiUrl, domainId, category);
+
+ _action = action;
+ }
+
+ public void Execute(Object argument)
+ {
+ Gson gson = new Gson();
+ HttpPut request = new HttpPut(ApiUrl + DomainId + Category + _action);
+
+ System.out.println(request.getURI().toString());
+
+ try
+ {
+ StringEntity params = new StringEntity(gson.toJson(argument));
+ params.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
+ request.setEntity(params);
+ }
+ catch (Exception exception)
+ {
+ System.out.println("Error executing ApiPutCall(Object): \n" + exception.getMessage());
+
+ for (StackTraceElement trace : exception.getStackTrace())
+ {
+ System.out.println(trace);
+ }
+ }
+
+ System.out.println(execute(request));
+ }
+
+ public T Execute(Class returnClass)
+ {
+ return Execute(returnClass, (Object)null);
+ }
+
+ public T Execute(Type returnType, Object argument)
+ {
+ Gson gson = new Gson();
+ HttpPut request = new HttpPut(ApiUrl + DomainId + Category + _action);
+ System.out.println(request.getURI().toString());
+ try
+ {
+ StringEntity params = new StringEntity(gson.toJson(argument));
+ params.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
+ request.setEntity(params);
+ }
+ catch (Exception exception)
+ {
+ System.out.println("Error executing ApiPutCall(Type, Object): \n" + exception.getMessage());
+
+ for (StackTraceElement trace : exception.getStackTrace())
+ {
+ System.out.println(trace);
+ }
+ }
+
+ String response = execute(request);
+ System.out.println(response);
+ return new Gson().fromJson(response, returnType);
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/DnsMadeEasyApiCallBase.java b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/DnsMadeEasyApiCallBase.java
new file mode 100644
index 00000000..f21f48f2
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/DnsMadeEasyApiCallBase.java
@@ -0,0 +1,140 @@
+package mineplex.ddos.api;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Locale;
+import java.util.TimeZone;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+
+import org.apache.commons.codec.binary.Hex;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+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;
+
+public abstract class DnsMadeEasyApiCallBase
+{
+ protected String ApiUrl = "http://api.dnsmadeeasy.com/V2.0/dns/managed/";
+ protected int DomainId = 962728;
+ protected String Category = "/records/";
+
+ public DnsMadeEasyApiCallBase(String apiUrl, int domainId, String category)
+ {
+ ApiUrl = apiUrl;
+ DomainId = domainId;
+ Category = category;
+ }
+
+ protected String execute(HttpRequestBase request)
+ {
+ SchemeRegistry schemeRegistry = new SchemeRegistry();
+ schemeRegistry.register(new Scheme("https", 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
+ {
+ String timeStamp = getServerTime();
+ SecretKeySpec keySpec = new SecretKeySpec("8c9af8cc-d306-4df3-8de8-944deafa8239".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-requestDate", timeStamp + "");
+ request.addHeader("x-dnsme-hmac", Hex.encodeHexString(hashBytes));
+ 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("DnsMadeEasyApiCall 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 getServerTime()
+ {
+ Calendar calendar = Calendar.getInstance();
+ SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
+ dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
+ return dateFormat.format(calendar.getTime());
+ }
+
+ 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[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/token/ARecord.java b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/token/ARecord.java
new file mode 100644
index 00000000..afa7f5a5
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/token/ARecord.java
@@ -0,0 +1,14 @@
+package mineplex.ddos.api.token;
+
+public class ARecord extends DnsRecord
+{
+ public ARecord(String recordName, String ip, int recordTtl)
+ {
+ name = recordName;
+ value = ip;
+ ttl = recordTtl;
+
+ type = "A";
+ gtdLocation = "DEFAULT";
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/token/CNameRecord.java b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/token/CNameRecord.java
new file mode 100644
index 00000000..0f982928
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/token/CNameRecord.java
@@ -0,0 +1,14 @@
+package mineplex.ddos.api.token;
+
+public class CNameRecord extends DnsRecord
+{
+ public CNameRecord(String recordName, String ip, int recordTtl)
+ {
+ name = recordName;
+ value = ip;
+ ttl = recordTtl;
+
+ type = "CNAME";
+ gtdLocation = "DEFAULT";
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/token/DnsRecord.java b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/token/DnsRecord.java
new file mode 100644
index 00000000..94f32ae5
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/token/DnsRecord.java
@@ -0,0 +1,11 @@
+package mineplex.ddos.api.token;
+
+public class DnsRecord
+{
+ public int id;
+ public String name;
+ public String type;
+ public String value;
+ public String gtdLocation;
+ public int ttl;
+}
diff --git a/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/token/DomainRecords.java b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/token/DomainRecords.java
new file mode 100644
index 00000000..fffc657d
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.DDoSProtectionSwitcher/src/mineplex/ddos/api/token/DomainRecords.java
@@ -0,0 +1,11 @@
+package mineplex.ddos.api.token;
+
+import java.util.List;
+
+public class DomainRecords
+{
+ public List data;
+ public int page;
+ public int totalPage;
+ public int totalRecords;
+}
diff --git a/Plugins[Modified]/Mineplex.Database/src/jOOQConfig.xml b/Plugins[Modified]/Mineplex.Database/src/jOOQConfig.xml
index c3c6b785..42a0f94f 100644
--- a/Plugins[Modified]/Mineplex.Database/src/jOOQConfig.xml
+++ b/Plugins[Modified]/Mineplex.Database/src/jOOQConfig.xml
@@ -3,9 +3,9 @@
com.mysql.jdbc.Driver
- jdbc:mysql://127.0.0.1:3306
- root
- root
+ jdbc:mysql://10.35.74.133:3306
+ MonetaryPulitzer
+ MaprebruvUsw6Fre
diff --git a/Plugins[Modified]/Mineplex.EnjinTranslator/plugin.yml b/Plugins[Modified]/Mineplex.EnjinTranslator/plugin.yml
new file mode 100644
index 00000000..ef3eac20
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.EnjinTranslator/plugin.yml
@@ -0,0 +1,12 @@
+name: EnjinTranslator
+main: mineplex.enjinTranslator.EnjinTranslator
+version: 0.1
+commands:
+ enjin_mineplex:
+ description: Translates enjin commands to mineplex.
+ usage: Don't use it, you get kicked.
+ aliases:
+ pull:
+ description: Translates enjin commands to mineplex.
+ usage: Don't use it, you get kicked.
+ aliases:
\ No newline at end of file
diff --git a/Plugins[Modified]/Mineplex.EnjinTranslator/pom.xml b/Plugins[Modified]/Mineplex.EnjinTranslator/pom.xml
new file mode 100644
index 00000000..bb8ce596
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.EnjinTranslator/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+
+
+ com.mineplex
+ mineplex-plugin
+ dev-SNAPSHOT
+ ../plugin.xml
+
+
+ EnjinTranslator
+ mineplex-enjintranslator
+
+
+
+ ${project.groupId}
+ mineplex-core
+ ${project.version}
+
+
+
diff --git a/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/Enjin.java b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/Enjin.java
new file mode 100644
index 00000000..bbd8864e
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/Enjin.java
@@ -0,0 +1,365 @@
+package mineplex.enjinTranslator;
+
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.UUID;
+
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+import mineplex.core.MiniPlugin;
+import mineplex.core.account.CoreClient;
+import mineplex.core.account.CoreClientManager;
+import mineplex.core.account.permissions.PermissionGroup;
+import mineplex.core.account.permissions.PermissionGroupHelper;
+import mineplex.core.common.currency.GlobalCurrency;
+import mineplex.core.common.util.Callback;
+import mineplex.core.donation.DonationManager;
+import mineplex.core.inventory.InventoryManager;
+import mineplex.core.powerplayclub.PowerPlayClubRepository;
+import mineplex.core.punish.Category;
+import mineplex.core.punish.Punish;
+import mineplex.core.server.util.TransactionResponse;
+import mineplex.core.website.WebsiteLinkManager;
+import mineplex.enjinTranslator.purchase.PurchaseManager;
+
+public class Enjin extends MiniPlugin implements CommandExecutor
+{
+ private CoreClientManager _clientManager;
+ private DonationManager _donationManager;
+ private InventoryManager _inventoryManager;
+ private PurchaseManager _purchaseManager;
+ private PowerPlayClubRepository _powerPlayClubRepository;
+ private Punish _punish;
+
+ private static Object _commandLock = new Object();
+
+ public long _lastPoll = System.currentTimeMillis() - 120000;
+
+ private SimpleDateFormat _dateFormat = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss");
+
+ public Enjin(EnjinTranslator plugin, CoreClientManager clientManager, DonationManager donationManager, InventoryManager inventoryManager)
+ {
+ super("Enjin", plugin);
+
+ _clientManager = clientManager;
+ _donationManager = donationManager;
+ _inventoryManager = inventoryManager;
+ _punish = new Punish(plugin, clientManager);
+
+ _purchaseManager = new PurchaseManager(plugin);
+ _powerPlayClubRepository = new PowerPlayClubRepository(plugin, clientManager, donationManager);
+ require(WebsiteLinkManager.class);
+
+ plugin.getCommand("enjin_mineplex").setExecutor(this);
+ plugin.getCommand("pull").setExecutor(this);
+ }
+
+ @Override
+ public boolean onCommand(final CommandSender sender, final Command command, final String label, final String[] args)
+ {
+ synchronized (_commandLock)
+ {
+ try
+ {
+ if (sender instanceof Player)
+ ((Player) sender).kickPlayer("Like bananas? I don't. Here take these and go have fun.");
+
+ if (label.equalsIgnoreCase("enjin_mineplex"))
+ {
+ final UUID uuid;
+ try
+ {
+ uuid = UUID.fromString(args[1]);
+ }
+ catch (IllegalArgumentException e)
+ {
+ System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + args[1] + "; invalid UUID.");
+ return true;
+ }
+
+ _clientManager.loadClientByUUID(uuid, client ->
+ {
+ if (client == null)
+ {
+ System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + uuid + ", isn't in our database.");
+ }
+ else
+ {
+ final String name = client.getName();
+
+ if (args[0].equalsIgnoreCase("chargeback"))
+ {
+ _punish.AddPunishment(name, Category.Other, "Chargeback", "Strutt20", 1, true, -1, true);
+ System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " was banned for charging back!");
+ return;
+ }
+
+ if (!checkForClansPurchase(args, name, client))
+ {
+ if (!checkForBoosterPurchase(args, name, uuid, client))
+ {
+ if (!checkForCoinPurchase(args, name, uuid, client))
+ {
+ if (!checkForRankPurchase(args, name, uuid, client))
+ {
+ if (!checkForPurchase(args, name, client))
+ {
+ if (!checkForPowerPlayClub(args, name, uuid, client))
+ {
+ StringBuilder sb = new StringBuilder();
+
+ for (String arg : args)
+ {
+ sb.append(arg + " ");
+ }
+
+ System.out.println("Received Command : " + sb.toString());
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ });
+ }
+ }
+ catch (Exception exception)
+ {
+ exception.printStackTrace();
+ }
+
+ try
+ {
+ Thread.sleep(20);
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ return true;
+ }
+
+ protected boolean checkForRankPurchase(String[] args, final String name, final UUID playerUUID, final CoreClient client)
+ {
+ if (args.length != 3 || !args[0].equalsIgnoreCase("rank"))
+ {
+ return false;
+ }
+
+ PermissionGroup c = PermissionGroup.getGroup(args[2]).orElse(PermissionGroupHelper.getGroupFromLegacy(args[2]));
+ if (c == null)
+ {
+ return false;
+ }
+ final PermissionGroup rank = PermissionGroup.valueOf(args[2]);
+
+ _clientManager.loadClientByName(name, loadedClient ->
+ {
+ if (rank == PermissionGroup.PLAYER || loadedClient.getPrimaryGroup() == PermissionGroup.PLAYER || !loadedClient.getPrimaryGroup().inheritsFrom(rank))
+ {
+ _clientManager.setPrimaryGroup(client.getAccountId(), rank, () -> _purchaseManager.addAccountPurchaseToQueue(client.getAccountId(), rank.name() + "Permanent", 1, true));
+
+ System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + rank.name() + " " + "permanently.");
+ }
+ else
+ {
+ System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " DENIED INFERIOR " + rank.name() + " " + "permanently.");
+ _purchaseManager.addAccountPurchaseToQueue(client.getAccountId(), rank.name() + " Permanent", 1, false);
+ }
+ });
+
+ return true;
+ }
+
+ protected boolean checkForPurchase(String[] args, final String name, final CoreClient client)
+ {
+ if (args.length < 3 || !args[0].equalsIgnoreCase("purchase"))
+ return false;
+
+ final int amount = Integer.parseInt(args[2]);
+ String tempName = args[4];
+
+ for (int i = 5; i < args.length; i++)
+ {
+ tempName += " " + args[i];
+ }
+
+ final String packageName = tempName;
+
+ _donationManager.purchaseUnknownSalesPackage(client, amount == 1 ? packageName : packageName + " " + amount, GlobalCurrency.GEM, 0, false, data ->
+ {
+ if (data == TransactionResponse.Success)
+ {
+ _inventoryManager.addItemToInventoryForOffline(new Callback()
+ {
+ public void run(Boolean success)
+ {
+ if (success)
+ {
+ _purchaseManager.addAccountPurchaseToQueue(client.getAccountId(), packageName, amount, true);
+ System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + amount + " " + packageName + ".");
+ }
+ else
+ {
+ System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + packageName + ". Queuing for run later.");
+ _purchaseManager.addAccountPurchaseToQueue(client.getAccountId(), packageName, amount, false);
+ }
+ }
+ }, client.getAccountId(), packageName, amount);
+ }
+ else
+ {
+ System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + amount + ". Queuing for run later.");
+ _purchaseManager.addAccountPurchaseToQueue(client.getAccountId(), packageName, amount, false);
+ }
+ });
+
+ return true;
+ }
+
+ protected boolean checkForCoinPurchase(String[] args, final String name, final UUID playerUUID, final CoreClient client)
+ {
+ if (args.length != 3 || !args[0].equalsIgnoreCase("coin"))
+ return false;
+
+ final int amount = Integer.parseInt(args[2]);
+
+ _donationManager.rewardCurrency(GlobalCurrency.TREASURE_SHARD, client, "purchase", amount, response ->
+ {
+ if (response)
+ System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + amount + " coins.");
+ else
+ System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + amount + " coins. Queuing for run later.");
+
+ _purchaseManager.addAccountPurchaseToQueue(client.getAccountId(), "Coins", amount, response);
+ });
+
+ return true;
+ }
+
+ protected boolean checkForBoosterPurchase(String[] args, final String name, final UUID playerUUID, final CoreClient client)
+ {
+ if (args.length != 3 || !args[0].equalsIgnoreCase("booster"))
+ return false;
+
+ final int amount = Integer.parseInt(args[2]);
+
+ _inventoryManager.addItemToInventoryForOffline(new Callback()
+ {
+ public void run(Boolean response)
+ {
+ if (response)
+ System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + amount + " gem boosters.");
+ else
+ System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + amount + " gem boosters. Queuing for run later.");
+
+ _purchaseManager.addAccountPurchaseToQueue(client.getAccountId(), "Gem Boosters", amount, response);
+ }
+ }, client.getAccountId(), "Game Booster", amount);
+
+ return true;
+ }
+
+ protected boolean checkForPowerPlayClub(String[] args, final String name, final UUID playerUUID, final CoreClient client)
+ {
+ if (args.length < 5 || !args[0].equalsIgnoreCase("powerplayclub"))
+ return false;
+
+ if (args[2].equalsIgnoreCase("add"))
+ {
+ boolean bc = args.length > 5 && args[5].equalsIgnoreCase("bc");
+ String[] splitDate = args[3].split("/");
+ LocalDate date;
+ if (bc)
+ {
+ date = LocalDate.of(2000 + Integer.parseInt(splitDate[2]), Integer.parseInt(splitDate[1]), Integer.parseInt(splitDate[0]));
+ }
+ else
+ {
+ date = LocalDate.of(Integer.parseInt(splitDate[2]), Integer.parseInt(splitDate[0]), Integer.parseInt(splitDate[1]));
+ }
+
+ String duration = args[4];
+
+ _powerPlayClubRepository.addSubscription(client.getAccountId(), date, duration);
+
+ }
+ else if (args[2].equalsIgnoreCase("cancel"))
+ {
+ // TODO: cancel it in our logs? I don't think this is necessary.
+ }
+
+ return false;
+ }
+
+ protected boolean checkForClansPurchase(String[] args, final String name, final CoreClient client)
+ {
+ if (args.length >= 3 && args[0].equalsIgnoreCase("clansBanner"))
+ {
+ String purchase = "Clan Banner Usage";
+ if (args[2].equalsIgnoreCase("true"))
+ {
+ purchase = "Clan Banner Editor";
+ }
+ final String packageName = purchase;
+
+ _donationManager.purchaseUnknownSalesPackage(client, packageName, GlobalCurrency.GEM, 0, false, data ->
+ {
+ if (data == TransactionResponse.Success)
+ {
+ _inventoryManager.addItemToInventoryForOffline(new Callback()
+ {
+ public void run(Boolean success)
+ {
+ if (success)
+ {
+ _purchaseManager.addAccountPurchaseToQueue(client.getAccountId(), packageName, 1, true);
+ System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received their " + packageName + " access.");
+ }
+ else
+ {
+ System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + packageName + ". Queuing for run later.");
+ _purchaseManager.addAccountPurchaseToQueue(client.getAccountId(), packageName, 1, false);
+ }
+ }
+ }, client.getAccountId(), packageName, 1);
+ }
+ else
+ {
+ System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " 1" + ". Queuing for run later.");
+ _purchaseManager.addAccountPurchaseToQueue(client.getAccountId(), packageName, 1, false);
+ }
+ });
+ //enjin_mineplex clansBanner AlexTheCoder true
+ return true;
+ }
+ if (args.length >= 4 && args[0].equalsIgnoreCase("clansAmplifier"))
+ {
+ //enjin_mineplex clansAmplifier AlexTheCoder 20 1
+ final String item = "Rune Amplifier " + args[2];
+ final int amount = Integer.parseInt(args[3]);
+
+ _inventoryManager.addItemToInventoryForOffline(new Callback()
+ {
+ public void run(Boolean response)
+ {
+ if (response)
+ System.out.println("[" + _dateFormat.format(new Date()) + "] " + name + " received " + amount + " rune amplifiers.");
+ else
+ System.out.println("[" + _dateFormat.format(new Date()) + "] ERROR processing " + name + " " + amount + " rune amplifiers. Queuing for run later.");
+
+ _purchaseManager.addAccountPurchaseToQueue(client.getAccountId(), item, amount, response);
+ }
+ }, client.getAccountId(), item, amount);
+ }
+
+ return false;
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/EnjinItem.java b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/EnjinItem.java
new file mode 100644
index 00000000..4628e18b
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/EnjinItem.java
@@ -0,0 +1,23 @@
+package mineplex.enjinTranslator;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+public class EnjinItem
+{
+ public String item_name;
+ public double item_price;
+ public int item_id;
+ public Map variables = new HashMap();
+
+ public void logInfoToConsole()
+ {
+ System.out.println("item_id : " + item_id + ", item_name : " + item_name + ", item_price : " + item_price);
+
+ for (Entry variable : variables.entrySet())
+ {
+ System.out.println("key : " + variable.getKey() + ", value : " + variable.getValue());
+ }
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/EnjinPurchase.java b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/EnjinPurchase.java
new file mode 100644
index 00000000..a7ccf1f2
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/EnjinPurchase.java
@@ -0,0 +1,27 @@
+package mineplex.enjinTranslator;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+public class EnjinPurchase
+{
+ private static SimpleDateFormat _dateFormat = new SimpleDateFormat();
+
+ public EnjinUser user;
+ public long purchase_date;
+ public String currency;
+ public String character;
+ public List items;
+
+ public void logInfoToConsole()
+ {
+ user.logInfoToConsole();
+ System.out.println(" MC Character : " + character + ", purchase_date : " + _dateFormat.format(new Date(purchase_date)) + ", currency : " + currency);
+
+ for (EnjinItem item : items)
+ {
+ item.logInfoToConsole();
+ }
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/EnjinTranslator.java b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/EnjinTranslator.java
new file mode 100644
index 00000000..420388c7
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/EnjinTranslator.java
@@ -0,0 +1,42 @@
+package mineplex.enjinTranslator;
+
+import mineplex.core.common.Constants;
+import mineplex.core.account.CoreClientManager;
+import mineplex.core.command.CommandCenter;
+import mineplex.core.donation.DonationManager;
+import mineplex.core.inventory.InventoryManager;
+import mineplex.core.updater.Updater;
+import org.bukkit.plugin.java.JavaPlugin;
+
+import static mineplex.core.Managers.require;
+
+public class EnjinTranslator extends JavaPlugin
+{
+ @Override
+ public void onEnable()
+ {
+ getConfig().addDefault(Constants.WEB_CONFIG_KEY, Constants.WEB_ADDRESS);
+ getConfig().set(Constants.WEB_CONFIG_KEY, getConfig().getString(Constants.WEB_CONFIG_KEY));
+ saveConfig();
+
+ //Static Modules
+ CommandCenter.Initialize(this);
+
+ //Core Modules
+ CoreClientManager clientManager = new CoreClientManager(this);
+ CommandCenter.Instance.setClientManager(clientManager);
+
+ DonationManager donationManager = require(DonationManager.class);
+
+ //Main Modules
+ new Enjin(this, clientManager, donationManager, new InventoryManager(this, clientManager));
+
+ require(Updater.class);
+ }
+
+ public String GetWebServerAddress()
+ {
+
+ return getConfig().getString(Constants.WEB_CONFIG_KEY);
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/EnjinUser.java b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/EnjinUser.java
new file mode 100644
index 00000000..5fd4ac3d
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/EnjinUser.java
@@ -0,0 +1,12 @@
+package mineplex.enjinTranslator;
+
+public class EnjinUser
+{
+ public int user_id;
+ public String username;
+
+ public void logInfoToConsole()
+ {
+ System.out.println("user_id : " + user_id + ", username : " + username);
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/QueuedCommand.java b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/QueuedCommand.java
new file mode 100644
index 00000000..c27e7275
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/QueuedCommand.java
@@ -0,0 +1,20 @@
+package mineplex.enjinTranslator;
+
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+
+public class QueuedCommand
+{
+ public CommandSender Sender;
+ public Command Command;
+ public String Label;
+ public String[] Args;
+
+ public QueuedCommand(CommandSender sender, Command command, String label, String...args)
+ {
+ Sender = sender;
+ Command = command;
+ Label = label;
+ Args = args;
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/TempRepository.java b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/TempRepository.java
new file mode 100644
index 00000000..91ddd00c
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/TempRepository.java
@@ -0,0 +1,24 @@
+package mineplex.enjinTranslator;
+
+import mineplex.core.database.MinecraftRepository;
+import org.bukkit.plugin.java.JavaPlugin;
+
+import mineplex.serverdata.database.DBPool;
+import mineplex.serverdata.database.RepositoryBase;
+import mineplex.serverdata.database.column.ColumnInt;
+import mineplex.serverdata.database.column.ColumnVarChar;
+
+public class TempRepository extends RepositoryBase
+{
+ private static String INSERT_CLIENT_INVENTORY = "INSERT INTO accountInventory (accountId, itemId, count) SELECT accounts.id, 5, ? FROM accounts WHERE accounts.name = ? ON DUPLICATE KEY UPDATE count=count + VALUES(count);";
+
+ public TempRepository(JavaPlugin plugin)
+ {
+ super(DBPool.getAccount());
+ }
+
+ public void addGemBooster(String name, int amount)
+ {
+ executeUpdate(INSERT_CLIENT_INVENTORY, new ColumnInt("count", amount), new ColumnVarChar("name", 100, name));
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/purchase/PurchaseManager.java b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/purchase/PurchaseManager.java
new file mode 100644
index 00000000..8f52c28a
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/purchase/PurchaseManager.java
@@ -0,0 +1,75 @@
+package mineplex.enjinTranslator.purchase;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.List;
+
+import org.bukkit.Bukkit;
+import org.bukkit.plugin.java.JavaPlugin;
+
+import mineplex.core.MiniPlugin;
+import mineplex.core.common.util.NautHashMap;
+import mineplex.serverdata.database.ResultSetCallable;
+import mineplex.enjinTranslator.purchase.data.PurchaseRepository;
+import mineplex.enjinTranslator.purchase.data.Package;
+
+public class PurchaseManager extends MiniPlugin
+{
+ private static Object _purchaseLock = new Object();
+
+ private PurchaseRepository _repository;
+ private NautHashMap _purchases = new NautHashMap();
+
+ public PurchaseManager(JavaPlugin plugin)
+ {
+ super("Purchase Manager", plugin);
+
+ _repository = new PurchaseRepository(plugin);
+
+ Bukkit.getServer().getScheduler().runTaskLaterAsynchronously(getPlugin(), new Runnable()
+ {
+ public void run()
+ {
+ updatePackages();
+ }
+ }, 20L);
+ }
+
+ private void updatePackages()
+ {
+ List packages = _repository.retrievePackages();
+
+ synchronized (_purchaseLock)
+ {
+ for (mineplex.enjinTranslator.purchase.data.Package purchasePackage : packages)
+ {
+ _purchases.put(purchasePackage.getName(), purchasePackage);
+ }
+ }
+ }
+
+ public void addAccountPurchaseToQueue(int accountId, final String packageName, int count, boolean success)
+ {
+ synchronized (_purchaseLock)
+ {
+ if (!_purchases.containsKey(packageName))
+ {
+ _repository.addPackage(packageName, new ResultSetCallable()
+ {
+ public void processResultSet(ResultSet resultSet) throws SQLException
+ {
+ while (resultSet.next())
+ {
+ int packageId = resultSet.getInt(1);
+
+ _purchases.put(packageName, new Package(packageId, packageName));
+ System.out.println("Added new package : " + packageName);
+ }
+ }
+ });
+ }
+
+ _repository.addAccountPurchase(accountId, _purchases.get(packageName).getId(), count, success);
+ }
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/purchase/data/Package.java b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/purchase/data/Package.java
new file mode 100644
index 00000000..9796b8a5
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/purchase/data/Package.java
@@ -0,0 +1,23 @@
+package mineplex.enjinTranslator.purchase.data;
+
+public class Package
+{
+ private int _id;
+ private String _name;
+
+ public Package(int id, String name)
+ {
+ _id = id;
+ _name = name;
+ }
+
+ public int getId()
+ {
+ return _id;
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/purchase/data/PurchaseRepository.java b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/purchase/data/PurchaseRepository.java
new file mode 100644
index 00000000..ba90e480
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.EnjinTranslator/src/mineplex/enjinTranslator/purchase/data/PurchaseRepository.java
@@ -0,0 +1,57 @@
+package mineplex.enjinTranslator.purchase.data;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import mineplex.core.database.MinecraftRepository;
+import org.bukkit.plugin.java.JavaPlugin;
+
+import mineplex.serverdata.database.DBPool;
+import mineplex.serverdata.database.RepositoryBase;
+import mineplex.serverdata.database.ResultSetCallable;
+import mineplex.serverdata.database.column.ColumnBoolean;
+import mineplex.serverdata.database.column.ColumnInt;
+import mineplex.serverdata.database.column.ColumnVarChar;
+
+public class PurchaseRepository extends RepositoryBase
+{
+ private static String INSERT_ACCOUNT_PURCHASE = "INSERT INTO accountPurchases (accountId, packageId, amount, date, success) VALUES (?, ?, ?, now(), ?);";
+
+ private static String INSERT_PACKAGE = "INSERT INTO packages (packageName) VALUES (?);";
+ private static String RETRIEVE_PACKAGES = "SELECT id, packageName FROM packages;";
+
+ public PurchaseRepository(JavaPlugin plugin)
+ {
+ super(DBPool.getAccount());
+ }
+
+ public void addPackage(String name, ResultSetCallable callable)
+ {
+ executeInsert(INSERT_PACKAGE, callable, new ColumnVarChar("packageName", 100, name));
+ }
+
+ public List retrievePackages()
+ {
+ final List packages = new ArrayList();
+
+ executeQuery(RETRIEVE_PACKAGES, new ResultSetCallable()
+ {
+ public void processResultSet(ResultSet resultSet) throws SQLException
+ {
+ while (resultSet.next())
+ {
+ packages.add(new Package(resultSet.getInt(1), resultSet.getString(2)));
+ }
+ }
+ });
+
+ return packages;
+ }
+
+ public boolean addAccountPurchase(int accountId, int packageId, int count, boolean success)
+ {
+ return executeInsert(INSERT_ACCOUNT_PURCHASE, null, new ColumnInt("accountId", accountId), new ColumnInt("packageId", packageId), new ColumnInt("count", count), new ColumnBoolean("success", success)) > 0;
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.Game.Clans.Compensation/plugin.yml b/Plugins[Modified]/Mineplex.Game.Clans.Compensation/plugin.yml
new file mode 100644
index 00000000..1ee7068c
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans.Compensation/plugin.yml
@@ -0,0 +1,4 @@
+name: Compensation
+main: mineplex.game.clans.compensation.ClansCompensation
+version: 1.0
+depend: [Clans]
\ No newline at end of file
diff --git a/Plugins[Modified]/Mineplex.Game.Clans.Compensation/pom.xml b/Plugins[Modified]/Mineplex.Game.Clans.Compensation/pom.xml
new file mode 100644
index 00000000..008bc998
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans.Compensation/pom.xml
@@ -0,0 +1,24 @@
+
+
+ 4.0.0
+
+
+ com.mineplex
+ mineplex-plugin
+ dev-SNAPSHOT
+ ../plugin.xml
+
+
+ ClansCompensation
+ mineplex-game-clans-compensation
+
+
+
+ ${project.groupId}
+ mineplex-game-clans
+ ${project.version}
+ provided
+
+
+
diff --git a/Plugins[Modified]/Mineplex.Game.Clans.Compensation/src/mineplex/game/clans/compensation/ClansCompensation.java b/Plugins[Modified]/Mineplex.Game.Clans.Compensation/src/mineplex/game/clans/compensation/ClansCompensation.java
new file mode 100644
index 00000000..2a180e79
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans.Compensation/src/mineplex/game/clans/compensation/ClansCompensation.java
@@ -0,0 +1,785 @@
+package mineplex.game.clans.compensation;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import java.util.UUID;
+
+import org.apache.commons.io.FileUtils;
+import org.bukkit.Bukkit;
+import org.bukkit.Color;
+import org.bukkit.FireworkEffect;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.block.Chest;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.plugin.java.JavaPlugin;
+
+import mineplex.core.account.permissions.Permission;
+import mineplex.core.account.permissions.PermissionGroup;
+import mineplex.core.common.util.C;
+import mineplex.core.common.util.Callback;
+import mineplex.core.common.util.F;
+import mineplex.core.common.util.UtilFirework;
+import mineplex.core.common.util.UtilPlayer;
+import mineplex.core.itemstack.ItemBuilder;
+import mineplex.core.itemstack.ItemStackFactory;
+import mineplex.game.clans.clans.ClanInfo;
+import mineplex.game.clans.clans.ClansManager;
+import mineplex.game.clans.clans.amplifiers.AmplifierManager.AmplifierType;
+import mineplex.game.clans.core.repository.ClanTerritory;
+import mineplex.game.clans.items.ItemType;
+import mineplex.game.clans.items.RareItemFactory;
+import mineplex.game.clans.items.attributes.armor.ConqueringArmorAttribute;
+import mineplex.game.clans.items.attributes.armor.PaddedAttribute;
+import mineplex.game.clans.items.attributes.armor.ReinforcedAttribute;
+import mineplex.game.clans.items.attributes.armor.SlantedAttribute;
+import mineplex.game.clans.items.attributes.bow.HeavyArrowsAttribute;
+import mineplex.game.clans.items.attributes.bow.HuntingAttribute;
+import mineplex.game.clans.items.attributes.bow.InverseAttribute;
+import mineplex.game.clans.items.attributes.bow.LeechingAttribute;
+import mineplex.game.clans.items.attributes.bow.RecursiveAttribute;
+import mineplex.game.clans.items.attributes.bow.ScorchingAttribute;
+import mineplex.game.clans.items.attributes.bow.SlayingAttribute;
+import mineplex.game.clans.items.attributes.weapon.ConqueringAttribute;
+import mineplex.game.clans.items.attributes.weapon.FlamingAttribute;
+import mineplex.game.clans.items.attributes.weapon.FrostedAttribute;
+import mineplex.game.clans.items.attributes.weapon.HasteAttribute;
+import mineplex.game.clans.items.attributes.weapon.JaggedAttribute;
+import mineplex.game.clans.items.attributes.weapon.SharpAttribute;
+import mineplex.game.clans.items.economy.GoldToken;
+import mineplex.game.clans.items.legendaries.AlligatorsTooth;
+import mineplex.game.clans.items.legendaries.GiantsBroadsword;
+import mineplex.game.clans.items.legendaries.HyperAxe;
+import mineplex.game.clans.items.legendaries.MagneticMaul;
+import mineplex.game.clans.items.legendaries.MeridianScepter;
+import mineplex.game.clans.items.legendaries.WindBlade;
+
+public class ClansCompensation extends JavaPlugin implements Listener
+{
+ public enum Perm implements Permission
+ {
+ COMPENSATION_COMMAND,
+ }
+
+ private final List _compensating = new ArrayList<>();
+ private boolean _debug;
+
+ @Override
+ public void onEnable()
+ {
+ System.out.println("[INFO] Enabling ClansCompensation");
+ Bukkit.getPluginManager().registerEvents(this, this);
+ PermissionGroup.PLAYER.setPermission(Perm.COMPENSATION_COMMAND, true, true);
+ ClansManager.getInstance().addCommand(new CompensationCommand(ClansManager.getInstance(), this));
+ loadUUIDs(uuids ->
+ {
+ _compensating.clear();
+ _compensating.addAll(uuids);
+ });
+ try
+ {
+ _debug = new File(new File(".").getCanonicalPath() + File.separator + "DebugCompensation.dat").exists();
+ }
+ catch (IOException e)
+ {
+ _debug = false;
+ }
+ }
+
+ @Override
+ public void onDisable()
+ {
+ System.out.println("[INFO] Disabling ClansCompensation");
+ saveUUIDs(false);
+ }
+
+ @EventHandler
+ public void onJoin(PlayerJoinEvent event)
+ {
+ if (canClaim(event.getPlayer().getUniqueId()))
+ {
+ UtilPlayer.message(event.getPlayer(), F.main("Compensation", "You have a compensation package ready to open! Run /compensation to get started!"));
+ }
+ }
+
+ public boolean canClaim(UUID uuid)
+ {
+ if (_debug)
+ {
+ return true;
+ }
+ return _compensating.contains(uuid);
+ }
+
+ public void claim(Player player)
+ {
+ if (_debug || _compensating.remove(player.getUniqueId()))
+ {
+ Block[] possible = new Block[]
+ {
+ player.getLocation().getBlock().getRelative(1, 0, 0),
+ player.getLocation().getBlock().getRelative(-1, 0, 0),
+ player.getLocation().getBlock().getRelative(0, 0, 1),
+ player.getLocation().getBlock().getRelative(0, 0, -1)
+ };
+
+ Block spawn = null;
+ Block spawn2 = null;
+ for (Block block : possible)
+ {
+ if (spawn != null && spawn2 != null)
+ {
+ break;
+ }
+ ClanTerritory claim = ClansManager.getInstance().getClanUtility().getClaim(block.getLocation());
+ if (claim != null)
+ {
+ if (ClansManager.getInstance().getClan(player) == null)
+ {
+ continue;
+ }
+ ClanInfo clan = ClansManager.getInstance().getClan(player);
+ if (!clan.getName().equals(claim.Owner))
+ {
+ continue;
+ }
+ }
+ ClansManager.getInstance().getBlockRestore().restore(block);
+ if (block.getType() != Material.AIR)
+ {
+ continue;
+ }
+ boolean overlap = false;
+ for (int x = -1; x <= 1; x++)
+ {
+ for (int z = -1; z <= 1; z++)
+ {
+ Block check = block.getRelative(x, 0, z);
+ if (check.getType() == Material.CHEST)
+ {
+ overlap = true;
+ }
+ }
+ }
+ if (overlap)
+ {
+ continue;
+ }
+
+ if (spawn == null)
+ {
+ spawn = block;
+ continue;
+ }
+ if (spawn2 == null)
+ {
+ spawn2 = block;
+ continue;
+ }
+ }
+
+ if (spawn == null || spawn2 == null)
+ {
+ UtilPlayer.message(player, F.main("Compensation", "Try that again in a different spot!"));
+ if (!_debug)
+ {
+ _compensating.add(player.getUniqueId());
+ }
+ return;
+ }
+ else
+ {
+ spawn.setType(Material.CHEST);
+ spawn2.setType(Material.CHEST);
+ Chest one = (Chest)spawn.getState();
+ Chest two = (Chest)spawn2.getState();
+ FireworkEffect effect = FireworkEffect.builder().with(FireworkEffect.Type.BALL).withColor(Color.MAROON).withFade(Color.NAVY).withFlicker().build();
+ UtilFirework.playFirework(spawn.getLocation().add(0.5, 0.5, 0.5), effect);
+ UtilFirework.playFirework(spawn2.getLocation().add(0.5, 0.5, 0.5), effect);
+
+ List items = new ArrayList<>();
+ {
+ UtilPlayer.message(player, F.main("Compensation", "You received two " + F.name(AmplifierType.SIXTY.getDisplayName() + "s") + "!"));
+ ClansManager.getInstance().getInventoryManager().addItemToInventory(player, AmplifierType.SIXTY.getFullItemName(), 2);
+ for (int i = 0; i < 10; i++)
+ {
+ items.add(new GoldToken(50000).toItemStack());
+ }
+ items.add(ItemStackFactory.Instance.CreateStack(Material.BEACON, (byte) 0, 1, C.cGold + "Supply Drop"));
+ items.add(new ItemStack(Material.DIAMOND_HELMET, 5));
+ items.add(new ItemStack(Material.DIAMOND_CHESTPLATE, 5));
+ items.add(new ItemStack(Material.DIAMOND_LEGGINGS, 5));
+ items.add(new ItemStack(Material.DIAMOND_BOOTS, 5));
+ items.add(new ItemStack(Material.IRON_HELMET, 5));
+ items.add(new ItemStack(Material.IRON_CHESTPLATE, 5));
+ items.add(new ItemStack(Material.IRON_LEGGINGS, 5));
+ items.add(new ItemStack(Material.IRON_BOOTS, 5));
+ items.add(new ItemStack(Material.GOLD_HELMET, 5));
+ items.add(new ItemStack(Material.GOLD_CHESTPLATE, 5));
+ items.add(new ItemStack(Material.GOLD_LEGGINGS, 5));
+ items.add(new ItemStack(Material.GOLD_BOOTS, 5));
+ items.add(new ItemStack(Material.CHAINMAIL_HELMET, 5));
+ items.add(new ItemStack(Material.CHAINMAIL_CHESTPLATE, 5));
+ items.add(new ItemStack(Material.CHAINMAIL_LEGGINGS, 5));
+ items.add(new ItemStack(Material.CHAINMAIL_BOOTS, 5));
+ items.add(new ItemStack(Material.LEATHER_HELMET, 5));
+ items.add(new ItemStack(Material.LEATHER_CHESTPLATE, 5));
+ items.add(new ItemStack(Material.LEATHER_LEGGINGS, 5));
+ items.add(new ItemStack(Material.LEATHER_BOOTS, 5));
+ items.add(new ItemStack(Material.DIAMOND_SWORD, 5));
+ items.add(new ItemStack(Material.DIAMOND_AXE, 5));
+ items.add(new ItemStack(Material.GOLD_SWORD, 5));
+ items.add(new ItemStack(Material.GOLD_AXE, 5));
+ items.add(new ItemStack(Material.IRON_SWORD, 5));
+ items.add(new ItemStack(Material.IRON_AXE, 5));
+ items.add(new ItemStack(Material.BOW, 5));
+ items.add(new ItemBuilder(Material.ENCHANTMENT_TABLE).setTitle(C.cGreenB + "Class Shop").build());
+ items.add(new ItemStack(Material.ANVIL, 3));
+ Random rand = new Random();
+ for (int i = 0; i < 3; i++)
+ {
+ int picked = rand.nextInt(24 * 3);
+ RareItemFactory factory;
+ switch (picked)
+ {
+ case 0:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(WindBlade.class);
+ factory.setSuffix(HasteAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 1:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.DIAMOND_AXE);
+ factory.setSuperPrefix(FrostedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 2:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.IRON_SWORD);
+ factory.setSuperPrefix(FlamingAttribute.class);
+ factory.setPrefix(JaggedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 3:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(AlligatorsTooth.class);
+ items.add(factory.fabricate());
+ break;
+ case 4:
+ factory = new RareItemFactory(ItemType.BOW);
+ factory.setType(Material.BOW);
+ factory.setSuperPrefix(LeechingAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 5:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.DIAMOND_AXE);
+ factory.setPrefix(JaggedAttribute.class);
+ factory.setSuffix(ConqueringAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 6:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(GiantsBroadsword.class);
+ items.add(factory.fabricate());
+ break;
+ case 7:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.DIAMOND_SWORD);
+ factory.setSuffix(HasteAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 8:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.DIAMOND_SWORD);
+ factory.setSuperPrefix(FlamingAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 9:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(MagneticMaul.class);
+ factory.setSuffix(HasteAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 10:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.GOLD_SWORD);
+ factory.setPrefix(JaggedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 11:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.DIAMOND_AXE);
+ factory.setSuperPrefix(FlamingAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 12:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(MeridianScepter.class);
+ items.add(factory.fabricate());
+ break;
+ case 13:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.DIAMOND_SWORD);
+ factory.setPrefix(JaggedAttribute.class);
+ factory.setSuffix(ConqueringAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 14:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.IRON_SWORD);
+ factory.setSuperPrefix(FlamingAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 15:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(AlligatorsTooth.class);
+ items.add(factory.fabricate());
+ break;
+ case 16:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.DIAMOND_SWORD);
+ factory.setSuperPrefix(FrostedAttribute.class);
+ factory.setPrefix(JaggedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 17:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.GOLD_AXE);
+ factory.setSuperPrefix(FlamingAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 18:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(WindBlade.class);
+ factory.setSuffix(ConqueringAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 19:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.IRON_SWORD);
+ factory.setSuperPrefix(FrostedAttribute.class);
+ factory.setSuffix(HasteAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 20:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.DIAMOND_AXE);
+ factory.setSuperPrefix(FrostedAttribute.class);
+ factory.setPrefix(JaggedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 21:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(GiantsBroadsword.class);
+ factory.setSuffix(HasteAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 22:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.DIAMOND_SWORD);
+ factory.setSuffix(ConqueringAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 23:
+ factory = new RareItemFactory(ItemType.BOW);
+ factory.setType(Material.BOW);
+ factory.setPrefix(RecursiveAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 24:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(HyperAxe.class);
+ factory.setSuperPrefix(FlamingAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 25:
+ factory = new RareItemFactory(ItemType.BOW);
+ factory.setType(Material.BOW);
+ factory.setPrefix(HeavyArrowsAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 26:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.GOLD_SWORD);
+ factory.setPrefix(JaggedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 27:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(MeridianScepter.class);
+ items.add(factory.fabricate());
+ break;
+ case 28:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.GOLD_SWORD);
+ factory.setPrefix(JaggedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 29:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.DIAMOND_AXE);
+ factory.setSuffix(HasteAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 30:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(WindBlade.class);
+ items.add(factory.fabricate());
+ break;
+ case 31:
+ factory = new RareItemFactory(ItemType.BOW);
+ factory.setType(Material.BOW);
+ factory.setSuperPrefix(ScorchingAttribute.class);
+ factory.setSuffix(SlayingAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 32:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.DIAMOND_SWORD);
+ factory.setSuperPrefix(FlamingAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 33:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(HyperAxe.class);
+ items.add(factory.fabricate());
+ break;
+ case 34:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.IRON_SWORD);
+ factory.setSuperPrefix(FlamingAttribute.class);
+ factory.setPrefix(JaggedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 35:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.DIAMOND_AXE);
+ factory.setSuperPrefix(FrostedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 36:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(GiantsBroadsword.class);
+ items.add(factory.fabricate());
+ break;
+ case 37:
+ factory = new RareItemFactory(ItemType.BOW);
+ factory.setType(Material.BOW);
+ factory.setPrefix(InverseAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 38:
+ factory = new RareItemFactory(ItemType.ARMOR);
+ factory.setType(Material.DIAMOND_CHESTPLATE);
+ factory.setPrefix(ReinforcedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 39:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(WindBlade.class);
+ items.add(factory.fabricate());
+ break;
+ case 40:
+ factory = new RareItemFactory(ItemType.ARMOR);
+ factory.setType(Material.LEATHER_BOOTS);
+ factory.setPrefix(SlantedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 41:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.IRON_SWORD);
+ factory.setSuperPrefix(FrostedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 42:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(GiantsBroadsword.class);
+ items.add(factory.fabricate());
+ break;
+ case 43:
+ factory = new RareItemFactory(ItemType.ARMOR);
+ factory.setType(Material.IRON_LEGGINGS);
+ factory.setPrefix(PaddedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 44:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.GOLD_SWORD);
+ factory.setPrefix(SharpAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 45:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(MeridianScepter.class);
+ items.add(factory.fabricate());
+ break;
+ case 46:
+ factory = new RareItemFactory(ItemType.ARMOR);
+ factory.setType(Material.CHAINMAIL_CHESTPLATE);
+ factory.setPrefix(SlantedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 47:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.IRON_SWORD);
+ factory.setSuffix(ConqueringAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 48:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(MagneticMaul.class);
+ factory.setPrefix(SharpAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 49:
+ factory = new RareItemFactory(ItemType.ARMOR);
+ factory.setType(Material.IRON_HELMET);
+ factory.setSuffix(ConqueringArmorAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 50:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.DIAMOND_SWORD);
+ factory.setSuffix(HasteAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 51:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(AlligatorsTooth.class);
+ factory.setSuperPrefix(FrostedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 52:
+ factory = new RareItemFactory(ItemType.ARMOR);
+ factory.setType(Material.LEATHER_BOOTS);
+ factory.setPrefix(ReinforcedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 53:
+ factory = new RareItemFactory(ItemType.ARMOR);
+ factory.setType(Material.IRON_LEGGINGS);
+ factory.setPrefix(SlantedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 54:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(HyperAxe.class);
+ items.add(factory.fabricate());
+ break;
+ case 55:
+ factory = new RareItemFactory(ItemType.BOW);
+ factory.setType(Material.BOW);
+ factory.setPrefix(RecursiveAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 56:
+ factory = new RareItemFactory(ItemType.ARMOR);
+ factory.setType(Material.CHAINMAIL_BOOTS);
+ factory.setPrefix(PaddedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 57:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(GiantsBroadsword.class);
+ factory.setSuffix(ConqueringAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 58:
+ factory = new RareItemFactory(ItemType.ARMOR);
+ factory.setType(Material.IRON_HELMET);
+ factory.setPrefix(SlantedAttribute.class);
+ factory.setSuffix(ConqueringArmorAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 59:
+ factory = new RareItemFactory(ItemType.BOW);
+ factory.setType(Material.BOW);
+ factory.setPrefix(InverseAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 60:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(WindBlade.class);
+ factory.setPrefix(JaggedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 61:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.DIAMOND_AXE);
+ factory.setSuperPrefix(FrostedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 62:
+ factory = new RareItemFactory(ItemType.ARMOR);
+ factory.setType(Material.LEATHER_BOOTS);
+ factory.setPrefix(PaddedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 63:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(AlligatorsTooth.class);
+ items.add(factory.fabricate());
+ break;
+ case 64:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.GOLD_AXE);
+ factory.setPrefix(JaggedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 65:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.DIAMOND_SWORD);
+ factory.setSuperPrefix(FlamingAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 66:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(MeridianScepter.class);
+ factory.setSuperPrefix(FlamingAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 67:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.IRON_AXE);
+ factory.setSuperPrefix(FrostedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 68:
+ factory = new RareItemFactory(ItemType.BOW);
+ factory.setType(Material.BOW);
+ factory.setPrefix(HuntingAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 69:
+ factory = new RareItemFactory(ItemType.LEGENDARY);
+ factory.setLegendary(HyperAxe.class);
+ factory.setPrefix(JaggedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 70:
+ factory = new RareItemFactory(ItemType.ARMOR);
+ factory.setType(Material.DIAMOND_CHESTPLATE);
+ factory.setPrefix(ReinforcedAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ case 71:
+ factory = new RareItemFactory(ItemType.WEAPON);
+ factory.setType(Material.IRON_AXE);
+ factory.setSuperPrefix(FlamingAttribute.class);
+ items.add(factory.fabricate());
+ break;
+ }
+ }
+ for (int slot = 0; slot < one.getBlockInventory().getSize(); slot++)
+ {
+ if (items.isEmpty())
+ {
+ break;
+ }
+ one.getBlockInventory().setItem(slot, items.remove(0));
+ }
+ for (int slot = 0; slot < two.getBlockInventory().getSize(); slot++)
+ {
+ if (items.isEmpty())
+ {
+ break;
+ }
+ two.getBlockInventory().setItem(slot, items.remove(0));
+ }
+ }
+ }
+ }
+ }
+
+ private void loadUUIDs(Callback> uuidCallback)
+ {
+ ClansManager.getInstance().runAsync(() ->
+ {
+ List ret = new ArrayList<>();
+ try
+ {
+ FileInputStream fstream = new FileInputStream(new File(".").getCanonicalPath() + File.separator + "compensating.dat");
+ DataInputStream in = new DataInputStream(fstream);
+ BufferedReader br = new BufferedReader(new InputStreamReader(in));
+ String line = null;
+ while ((line = br.readLine()) != null)
+ {
+ UUID uuid = UUID.fromString(line);
+ ret.add(uuid);
+ }
+ br.close();
+ in.close();
+ fstream.close();
+
+ uuidCallback.run(ret);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ uuidCallback.run(ret);
+ }
+ });
+ }
+
+ private void saveUUIDs(boolean async)
+ {
+ Runnable r = () ->
+ {
+ try
+ {
+ File storage = new File(new File(".").getCanonicalPath() + File.separator + "compensating.dat");
+ if (storage.exists())
+ {
+ FileUtils.deleteQuietly(storage);
+ }
+
+ if (!_compensating.isEmpty())
+ {
+ storage.createNewFile();
+
+ FileWriter fstream = new FileWriter(storage);
+ BufferedWriter out = new BufferedWriter(fstream);
+
+ out.write(_compensating.get(0).toString());
+
+ for (int i = 1; i < _compensating.size(); i++)
+ {
+ UUID comp = _compensating.get(i);
+ out.write("\n");
+ out.write(comp.toString());
+ }
+ out.close();
+ fstream.close();
+ }
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+ };
+
+ if (async)
+ {
+ ClansManager.getInstance().runAsync(r);
+ }
+ else
+ {
+ r.run();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Plugins[Modified]/Mineplex.Game.Clans.Compensation/src/mineplex/game/clans/compensation/CompensationCommand.java b/Plugins[Modified]/Mineplex.Game.Clans.Compensation/src/mineplex/game/clans/compensation/CompensationCommand.java
new file mode 100644
index 00000000..831f24af
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans.Compensation/src/mineplex/game/clans/compensation/CompensationCommand.java
@@ -0,0 +1,64 @@
+package mineplex.game.clans.compensation;
+
+import java.util.Random;
+
+import net.md_5.bungee.api.ChatColor;
+import net.md_5.bungee.api.chat.ClickEvent;
+import net.md_5.bungee.api.chat.ComponentBuilder;
+import net.md_5.bungee.api.chat.HoverEvent;
+import net.md_5.bungee.api.chat.TextComponent;
+
+import org.bukkit.entity.Player;
+
+import mineplex.core.command.CommandBase;
+import mineplex.core.common.util.C;
+import mineplex.core.common.util.F;
+import mineplex.core.common.util.UtilPlayer;
+import mineplex.game.clans.clans.ClansManager;
+
+public class CompensationCommand extends CommandBase
+{
+ private final ClansCompensation _main;
+ private final String _secretKey;
+
+ public CompensationCommand(ClansManager plugin, ClansCompensation main)
+ {
+ super(plugin, ClansCompensation.Perm.COMPENSATION_COMMAND, "compensation");
+
+ _main = main;
+ char[] characters = "abcdefghijklmnopqrstuvwxyz".toCharArray();
+ StringBuilder keyBuilder = new StringBuilder();
+ Random rand = new Random();
+ while (keyBuilder.length() < 10)
+ {
+ keyBuilder.append(characters[rand.nextInt(characters.length)]);
+ }
+ _secretKey = keyBuilder.toString();
+ }
+
+ @Override
+ public void Execute(Player caller, String[] args)
+ {
+ if (_main.canClaim(caller.getUniqueId()))
+ {
+ if (args.length >= 1 && args[0].equals(_secretKey))
+ {
+ _main.claim(caller);
+ }
+ else
+ {
+ TextComponent message = new TextComponent("Confirm");
+ message.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/compensation " + _secretKey));
+ message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("Redeem your items").create()));
+ message.setColor(ChatColor.GREEN);
+ message.setBold(true);
+ caller.sendMessage(C.cRedB + "WARNING: " + C.cGray + "You are about to claim several free items. Other players may attempt to steal these items from you, so it is highly recommended that you only run this command inside of your own base. Are you sure you wish to claim your items at this time?");
+ caller.spigot().sendMessage(message);
+ }
+ }
+ else
+ {
+ UtilPlayer.message(caller, F.main("Compensation", "You do not have a compensation package!"));
+ }
+ }
+}
\ No newline at end of file
diff --git a/Plugins[Modified]/Mineplex.Game.Clans.Core/pom.xml b/Plugins[Modified]/Mineplex.Game.Clans.Core/pom.xml
new file mode 100644
index 00000000..8a51dd13
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans.Core/pom.xml
@@ -0,0 +1,21 @@
+
+
+ 4.0.0
+
+
+ com.mineplex
+ mineplex-parent
+ dev-SNAPSHOT
+
+
+ mineplex-game-clans-core
+
+
+
+ ${project.groupId}
+ mineplex-core
+ ${project.version}
+
+
+
diff --git a/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/ClaimLocation.java b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/ClaimLocation.java
new file mode 100644
index 00000000..ec3fb85e
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/ClaimLocation.java
@@ -0,0 +1,65 @@
+package mineplex.game.clans.core;
+
+import java.util.Objects;
+
+import org.bukkit.Bukkit;
+import org.bukkit.Chunk;
+
+public class ClaimLocation
+{
+ public final String _worldName;
+ public final int _chunkX;
+ public final int _chunkZ;
+
+ private ClaimLocation(String worldName, int chunkX, int chunkZ)
+ {
+ _worldName = worldName;
+ _chunkX = chunkX;
+ _chunkZ = chunkZ;
+ }
+
+ public static ClaimLocation of(String worldName, int chunkX, int chunkZ)
+ {
+ return new ClaimLocation(worldName, chunkX, chunkZ);
+ }
+
+ public static ClaimLocation of(Chunk chunk)
+ {
+ return new ClaimLocation(chunk.getWorld().getName(), chunk.getX(), chunk.getZ());
+ }
+
+ public static ClaimLocation fromStoredString(String storedFormat) // TODO: change stored format for next season
+ {
+ // Current format: world,x,z
+ String[] split = storedFormat.split(",");
+ return new ClaimLocation(split[0], Integer.parseInt(split[1]), Integer.parseInt(split[2]));
+ }
+
+ public String toStoredString() // TODO: change stored format for next season
+ {
+ return _worldName + "," + _chunkX + "," + _chunkZ;
+ }
+
+ public Chunk toChunk()
+ {
+ return Bukkit.getWorld(_worldName).getChunkAt(_chunkX, _chunkZ);
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return Objects.hash(_worldName, _chunkX, _chunkZ);
+ }
+
+ @Override
+ public boolean equals(Object other)
+ {
+ if (!(other instanceof ClaimLocation))
+ {
+ return false;
+ }
+
+ ClaimLocation that = (ClaimLocation) other;
+ return Objects.equals(_worldName, that._worldName) && Objects.equals(_chunkX, that._chunkX) && Objects.equals(_chunkZ, that._chunkZ);
+ }
+}
\ No newline at end of file
diff --git a/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/ClanDeleteCommand.java b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/ClanDeleteCommand.java
new file mode 100644
index 00000000..ed982367
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/ClanDeleteCommand.java
@@ -0,0 +1,29 @@
+package mineplex.game.clans.core;
+
+import mineplex.game.clans.core.repository.tokens.SimpleClanToken;
+import mineplex.serverdata.commands.ServerCommand;
+
+
+public class ClanDeleteCommand extends ServerCommand
+{
+ private String _clanName;
+ public String getClanName() { return _clanName; }
+
+ public ClanDeleteCommand(String serverName, String clanName)
+ {
+ super(serverName);
+
+ _clanName = clanName;
+ }
+
+ public ClanDeleteCommand(SimpleClanToken clan)
+ {
+ this(clan.getHomeServer(), clan.getClanName());
+ }
+
+ @Override
+ public void run()
+ {
+ // Utilitizes a callback functionality to seperate dependencies
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/ClanLoadCommand.java b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/ClanLoadCommand.java
new file mode 100644
index 00000000..b0d28e6b
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/ClanLoadCommand.java
@@ -0,0 +1,23 @@
+package mineplex.game.clans.core;
+
+import mineplex.serverdata.commands.ServerCommand;
+
+
+public class ClanLoadCommand extends ServerCommand
+{
+ private String _clanName;
+ public String getClanName() { return _clanName; }
+
+ public ClanLoadCommand(String serverName, String clanName)
+ {
+ super(serverName);
+
+ _clanName = clanName;
+ }
+
+ @Override
+ public void run()
+ {
+ // Utilitizes a callback functionality to seperate dependencies
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/ClanRepository.java b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/ClanRepository.java
new file mode 100644
index 00000000..b57b279c
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/ClanRepository.java
@@ -0,0 +1,582 @@
+package mineplex.game.clans.core.repository;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Timestamp;
+import java.util.Collection;
+import java.util.UUID;
+
+import org.bukkit.Bukkit;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.jooq.DSLContext;
+
+import mineplex.core.common.util.Callback;
+import mineplex.core.common.util.NautHashMap;
+import mineplex.database.tables.records.ClansRecord;
+import mineplex.game.clans.core.ClaimLocation;
+import mineplex.game.clans.core.repository.tokens.ClanAllianceToken;
+import mineplex.game.clans.core.repository.tokens.ClanMemberToken;
+import mineplex.game.clans.core.repository.tokens.ClanTerritoryToken;
+import mineplex.game.clans.core.repository.tokens.ClanToken;
+import mineplex.game.clans.core.repository.tokens.ClanWarToken;
+import mineplex.game.clans.core.repository.tokens.SimpleClanToken;
+import mineplex.game.clans.core.war.ClanWarData;
+import mineplex.serverdata.database.DBPool;
+import mineplex.serverdata.database.RepositoryBase;
+import mineplex.serverdata.database.ResultSetCallable;
+import mineplex.serverdata.database.column.Column;
+import mineplex.serverdata.database.column.ColumnBoolean;
+import mineplex.serverdata.database.column.ColumnInt;
+import mineplex.serverdata.database.column.ColumnTimestamp;
+import mineplex.serverdata.database.column.ColumnVarChar;
+
+import static mineplex.database.Tables.accountClan;
+import static mineplex.database.Tables.accounts;
+import static mineplex.database.Tables.clans;
+import static org.jooq.impl.DSL.select;
+
+public class ClanRepository extends RepositoryBase
+{
+ private static String CREATE_CLAN_TABLE = "CREATE TABLE IF NOT EXISTS clans (id INT NOT NULL AUTO_INCREMENT, serverId INT NOT NULL, name VARCHAR(100), description VARCHAR(140), home VARCHAR(140), admin BIT(1), dateCreated DATETIME, lastOnline DATETIME, energy INT, PRIMARY KEY (id), INDEX clanName (name));";
+ private static String CREATE_ACCOUNT_CLAN_TABLE = "CREATE TABLE IF NOT EXISTS accountClan (id INT NOT NULL AUTO_INCREMENT, accountId INT, clanId INT, clanRole VARCHAR(140), PRIMARY KEY (id), FOREIGN KEY (accountId) REFERENCES accounts(id), FOREIGN KEY (clanId) REFERENCES clans(id), INDEX clanIdIndex (clanId));";
+ private static String CREATE_CLAN_TERRITORY_TABLE = "CREATE TABLE IF NOT EXISTS clanTerritory (id INT NOT NULL AUTO_INCREMENT, clanId INT, chunk VARCHAR(100), safe BIT(1), PRIMARY KEY (id), FOREIGN KEY (clanId) REFERENCES clans(id));";
+ private static String CREATE_CLAN_ALLIANCE_TABLE = "CREATE TABLE IF NOT EXISTS clanAlliances (id INT NOT NULL AUTO_INCREMENT, clanId INT, otherClanId INT, trusted BIT(1), PRIMARY KEY (id), FOREIGN KEY (otherClanId) REFERENCES clans(id), FOREIGN KEY (clanId) REFERENCES clans(id), INDEX clanIdIndex (clanId));";
+
+ private static String RETRIEVE_CLAN_INFO = "SELECT c.id, c.name, c.description, c.home, c.admin, c.energy, c.kills, c.murder, c.deaths, c.warWins, c.warLosses, c.generator, c.generatorStock, c.dateCreated, c.lastOnline, c.eloRating FROM clans AS c WHERE lower(c.name) = ?;";
+ private static String RETRIEVE_PLAYER_CLAN_INFO = "SELECT clans.name, accountClan.clanRole, clanServer.serverName, clans.id FROM accountClan INNER JOIN clans ON clans.id = accountClan.clanId INNER JOIN clanServer ON clans.serverId = clanServer.id WHERE accountClan.accountId = ?;";
+ private static String RETRIEVE_START_CLAN_INFO = "SELECT c.id, c.name, c.description, c.home, c.admin, c.energy, c.kills, c.murder, c.deaths, c.warWins, c.warLosses, c.generator, c.generatorStock, c.dateCreated, c.lastOnline, c.eloRating, ct.chunk, ct.safe FROM clans AS c LEFT JOIN clanTerritory AS ct ON ct.clanId = c.id WHERE c.serverId = ? OR c.admin = 1;";
+ private static String RETRIEVE_CLAN_MEMBER_INFO = "SELECT c.name, a.name, a.uuid, clanRole FROM accountClan AS ac INNER JOIN accounts AS a ON a.id = ac.accountId INNER JOIN clans AS c on c.id = ac.clanId WHERE c.serverId = ?;";
+ private static String RETRIEVE_CLAN_MEMBERS = "SELECT c.name, a.name, a.uuid, clanRole FROM accountClan AS ac INNER JOIN accounts AS a ON a.id = ac.accountId INNER JOIN clans AS c on c.id = ac.clanId WHERE lower(c.name) = ?;";
+ private static String RETRIEVE_CLAN_ALLIANCE_INFO = "SELECT c.name, cOther.name, ca.trusted FROM clanAlliances AS ca INNER JOIN clans AS c ON c.id = ca.clanId INNER JOIN clans as cOther ON cOther.id = ca.otherClanId WHERE c.serverId = ?;";
+// private static String RETRIEVE_CLAN_ENEMY_INFO = "SELECT c.name, cOther.name, clanScore, otherClanScore, clanKills, otherClanKills, timeFormed FROM clanEnemies AS ce INNER JOIN clans AS c ON c.id = ce.clanId INNER JOIN clans as cOther ON cOther.id = ce.otherClanId WHERE c.serverId = ?;";
+ private static String RETRIEVE_CLAN_WAR_INFO = "SELECT c.name, cOther.name, cw.score, cw.created, cw.ended, cw.lastUpdated FROM clanWar AS cw INNER JOIN clans AS c on c.id = cw.initiatorId INNER JOIN clans as cOther ON cOther.id = cw.clanId WHERE c.serverId = ? AND completed = FALSE";
+ private static String RETRIEVE_CLAN_WAR_FROM_CLAN_IDS = "SELECT c.name, cOther.name, cw.score, cw.created, cw.ended, cw.lastUpdated FROM clanWar AS cw INNER JOIN clans AS c on c.id = cw.initiatorId INNER JOIN clans as cOther ON cOther.id = cw.clanId WHERE cw.initiatorId = ? AND cw.clanId = ? AND completed = FALSE";
+
+ private static String DELETE_CLAN_MEMBER = "DELETE aC FROM accountClan AS aC INNER JOIN accounts ON accounts.id = aC.accountId WHERE aC.clanId = ? AND accounts.name = ?;";
+ private static String DELETE_CLAN_MEMBERS = "DELETE FROM accountClan WHERE clanId = ?;";
+ private static String DELETE_CLAN_TERRITORY = "DELETE FROM clanTerritory WHERE clanId = ? AND chunk = ?;";
+ private static String DELETE_CLAN_ALL_TERRITORY = "DELETE FROM clanTerritory WHERE clanId = ?;"; //
+ private static String DELETE_CLAN_TERRITORIES = "DELETE FROM clanTerritory WHERE clanId = ?;"; //
+ private static String DELETE_CLAN_ALLIANCE = "DELETE FROM clanAlliances WHERE clanId = ? AND otherClanId = ?;";
+ private static String DELETE_CLAN_ALLIANCES = "DELETE FROM clanAlliances WHERE clanId = ? OR otherClanId = ?;";
+// private static String DELETE_CLAN_ENEMIES = "DELETE FROM clanEnemies WHERE clanId = ? OR otherClanId = ?;";
+ private static String DELETE_CLAN = "DELETE FROM clans WHERE id = ?;";
+ private static String DELETE_ALL_WAR = "DELETE FROM clanWar WHERE initiatorId = ? OR clanId = ?";
+
+ private static String ADD_CLAN = "INSERT INTO clans (serverId, name, description, home, admin, dateCreated, energy, lastOnline) VALUES (?, ?, ?, ?, ?, now(), ?, now());";
+ private static String ADD_CLAN_MEMBER = "INSERT INTO accountClan (accountId, clanId, clanRole) SELECT accounts.id, ?, ? FROM accounts WHERE accounts.name = ?;";
+ private static String ADD_CLAN_ALLIANCE = "INSERT INTO clanAlliances (clanId, otherClanId, trusted) VALUES (?, ?, ?);";
+ private static String ADD_CLAN_WAR = "INSERT INTO clanWar (initiatorId, clanId, score, created, lastUpdated) VALUES (?, ?, ?, ?, ?)";
+ private static String ADD_CLAN_TERRITORY = "INSERT INTO clanTerritory (clanId, chunk, safe) VALUES (?, ?, ?);";
+
+ //Not Sure if UPDATE_CLAN should set eloRating, but I would think it would need to
+ private static String UPDATE_CLAN = "UPDATE clans SET name = ?, description = ?, home = ?, admin = ?, energy = ?, kills = ?, murder = ?, deaths = ?, warWins = ?, warLosses = ?, lastOnline = ? WHERE id = ?;";
+ private static String UPDATE_CLAN_MEMBER = "UPDATE accountClan AS AC INNER JOIN accounts ON accounts.id = AC.accountId SET AC.clanRole = ? WHERE AC.clanId = ? AND accounts.name = ?;";
+ private static String UPDATE_CLAN_ALLIANCE = "UPDATE clanAlliances SET trusted = ? WHERE clanId = ? AND otherClanId = ?;";
+ private static String UPDATE_CLAN_TERRITORY = "UPDATE clanTerritory SET safe = ? WHERE chunk = ?;"; //
+ private static String UPDATE_CLAN_WAR = "UPDATE clanWar SET score = ?, lastUpdated = ? WHERE initiatorId = ? AND clanId = ?";
+ private static String UPDATE_CLAN_SERVER_ID = "UPDATE clans SET serverId = ?, home = '', generator = '' WHERE id = ?;";
+ private static String UPDATE_CLAN_GENERATOR = "UPDATE clans SET generator = ?, generatorStock = ? WHERE id = ?;";
+
+ private static String GET_CLAN_SERVER = "SELECT id FROM clanServer WHERE clanServer.serverName = ?";
+ private static String ADD_CLAN_SERVER = "INSERT INTO clanServer (serverName) VALUES (?);";
+
+ private String _serverName;
+ private int _serverId;
+
+ public ClanRepository(JavaPlugin plugin, String serverName, boolean isClansServer)
+ {
+ super(DBPool.getAccount());
+
+ _serverName = serverName;
+ _serverId = -1;
+
+ if (isClansServer)
+ {
+ loadServerId();
+ }
+ }
+
+ public ClanRepository(JavaPlugin plugin, String serverName)
+ {
+ this(plugin, serverName, false);
+ }
+
+ private void loadServerId()
+ {
+ ResultSetCallable callable = new ResultSetCallable()
+ {
+ @Override
+ public void processResultSet(ResultSet resultSet) throws SQLException
+ {
+ while (resultSet.next())
+ {
+ _serverId = resultSet.getInt(1);
+ }
+ }
+ };
+
+ executeQuery(GET_CLAN_SERVER, callable, new ColumnVarChar("serverName", 100, _serverName));
+
+ if (_serverId == -1)
+ {
+ // Need to insert server into database
+ executeInsert(ADD_CLAN_SERVER, callable, new ColumnVarChar("serverName", 100, _serverName));
+
+ if (_serverId == -1)
+ {
+ System.out.println("Error loading serverId from database. Shutting down server!");
+ Bukkit.shutdown();
+ return;
+ }
+ }
+
+ System.out.println("Loaded Server ID: " + _serverId);
+ }
+
+ @Override
+ protected void initialize()
+ {
+ executeUpdate(CREATE_CLAN_TABLE);
+ executeUpdate(CREATE_ACCOUNT_CLAN_TABLE);
+ executeUpdate(CREATE_CLAN_TERRITORY_TABLE);
+ executeUpdate(CREATE_CLAN_ALLIANCE_TABLE);
+ }
+
+ /**
+ * Updates a clan's home server while removing all
+ * alliances, enemies, teritory claims and homes set on
+ * originating server.
+ * @param clanId - the id of the clan to move
+ */
+ public void moveClanServer(final int clanId, String serverName, final Callback callback)
+ {
+ executeQuery(GET_CLAN_SERVER, new ResultSetCallable()
+ {
+ @Override
+ public void processResultSet(ResultSet resultSet) throws SQLException
+ {
+ boolean success = resultSet.next();
+
+ if (success)
+ {
+ int serverId = resultSet.getInt(1);
+ ColumnInt clanIdCol = new ColumnInt("clanId", clanId);
+ ColumnInt serverIdCol = new ColumnInt("serverId", serverId);
+
+ executeUpdate(DELETE_CLAN_ALLIANCES, clanIdCol, clanIdCol);
+ deleteAllWar(clanId);
+ executeUpdate(DELETE_CLAN_TERRITORIES, clanIdCol);
+ executeUpdate(UPDATE_CLAN_SERVER_ID, serverIdCol, clanIdCol);
+ }
+
+ callback.run(success);
+ }
+ }, new ColumnVarChar("serverName", 100, serverName));
+
+ }
+
+ public ClanToken retrieveClan(String clanName)
+ {
+ final ClanToken clan = new ClanToken();
+
+ executeQuery(RETRIEVE_CLAN_INFO, new ResultSetCallable()
+ {
+ @Override
+ public void processResultSet(ResultSet resultSet) throws SQLException
+ {
+ if (resultSet.next())
+ {
+ clan.Id = resultSet.getInt(1);
+ clan.Name = resultSet.getString(2);
+ clan.Description = resultSet.getString(3);
+ clan.Home = resultSet.getString(4);
+ clan.Admin = resultSet.getBoolean(5);
+ clan.Energy = resultSet.getInt(6);
+ clan.Kills = resultSet.getInt(7);
+ clan.Murder = resultSet.getInt(8);
+ clan.Deaths = resultSet.getInt(9);
+ clan.WarWins = resultSet.getInt(10);
+ clan.WarLosses = resultSet.getInt(11);
+ clan.GeneratorBuyer = resultSet.getString(12);
+ clan.GeneratorStock = resultSet.getInt(13);
+ clan.DateCreated = resultSet.getTimestamp(14);
+ clan.LastOnline = resultSet.getTimestamp(15);
+
+ clan.EloRating = resultSet.getInt(16);
+ }
+ }
+ }, new ColumnVarChar("name", 100, clanName.toLowerCase()));
+
+ executeQuery(RETRIEVE_CLAN_MEMBERS, new ResultSetCallable()
+ {
+ @Override
+ public void processResultSet(ResultSet resultSet) throws SQLException
+ {
+ while (resultSet.next())
+ {
+ String clanName = resultSet.getString(1);
+
+ ClanMemberToken memberToken = new ClanMemberToken();
+ memberToken.Name = resultSet.getString(2);
+ memberToken.PlayerUUID = UUID.fromString(resultSet.getString(3));
+ memberToken.ClanRole = resultSet.getString(4);
+
+ clan.Members.add(memberToken);
+ }
+ }
+
+ }, new ColumnVarChar("name", 100, clanName.toLowerCase()));
+
+ return clan;
+ }
+
+ public void clanExists(String clanName, final Callback callback)
+ {
+ executeQuery(RETRIEVE_CLAN_INFO, new ResultSetCallable()
+ {
+ @Override
+ public void processResultSet(ResultSet resultSet) throws SQLException
+ {
+ boolean clanExists = resultSet.next();
+ callback.run(clanExists);
+ }
+ }, new ColumnVarChar("name", 100, clanName.toLowerCase()));
+ }
+
+ public void retrievePlayersClan(int accountId, final Callback callback)
+ {
+ executeQuery(RETRIEVE_PLAYER_CLAN_INFO, new ResultSetCallable()
+ {
+ @Override
+ public void processResultSet(ResultSet resultSet) throws SQLException
+ {
+ SimpleClanToken clanToken = null;
+ if (resultSet.next())
+ {
+ String clanName = resultSet.getString(1);
+ String clanRole = resultSet.getString(2);
+ String homeServer = resultSet.getString(3);
+ int clanId = resultSet.getInt(4);
+ clanToken = new SimpleClanToken(clanName, clanRole, homeServer, clanId);
+ }
+
+ callback.run(clanToken);
+ }
+ }, new ColumnInt("accountId", accountId));
+ }
+
+ public Collection retrieveClans()
+ {
+ System.out.println("Beginning to load clans from database...");
+ final NautHashMap clans = new NautHashMap();
+
+ executeQuery(RETRIEVE_START_CLAN_INFO, new ResultSetCallable()
+ {
+ @Override
+ public void processResultSet(ResultSet resultSet) throws SQLException
+ {
+ while (resultSet.next())
+ {
+ ClanToken token = new ClanToken();
+ token.Id = resultSet.getInt(1);
+ token.Name = resultSet.getString(2);
+ token.Description = resultSet.getString(3);
+ token.Home = resultSet.getString(4);
+ token.Admin = resultSet.getBoolean(5);
+ token.Energy = resultSet.getInt(6);
+ token.Kills = resultSet.getInt(7);
+ token.Murder = resultSet.getInt(8);
+ token.Deaths = resultSet.getInt(9);
+ token.WarWins = resultSet.getInt(10);
+ token.WarLosses = resultSet.getInt(11);
+
+ token.GeneratorBuyer = resultSet.getString(12);
+ token.GeneratorStock = resultSet.getInt(13);
+ token.DateCreated = resultSet.getTimestamp(14);
+ token.LastOnline = resultSet.getTimestamp(15);
+
+ token.EloRating = resultSet.getInt(16);
+
+ ClanTerritoryToken territoryToken = new ClanTerritoryToken();
+ territoryToken.ClanName = token.Name;
+ territoryToken.Chunk = resultSet.getString(17);
+ territoryToken.Safe = resultSet.getBoolean(18);
+
+ if (!clans.containsKey(token.Name))
+ {
+ clans.put(token.Name, token);
+ }
+
+ if (territoryToken.Chunk != null)
+ clans.get(token.Name).Territories.add(territoryToken);
+ }
+ }
+
+ }, new ColumnInt("serverId", _serverId));
+
+ System.out.println("1");
+
+ executeQuery(RETRIEVE_CLAN_MEMBER_INFO, new ResultSetCallable()
+ {
+ @Override
+ public void processResultSet(ResultSet resultSet) throws SQLException
+ {
+ while (resultSet.next())
+ {
+ String clanName = resultSet.getString(1);
+
+ if (clans.containsKey(clanName))
+ {
+ ClanMemberToken memberToken = new ClanMemberToken();
+ memberToken.Name = resultSet.getString(2);
+ memberToken.PlayerUUID = UUID.fromString(resultSet.getString(3));
+ memberToken.ClanRole = resultSet.getString(4);
+
+ clans.get(clanName).Members.add(memberToken);
+ }
+ }
+ }
+
+ }, new ColumnInt("serverId", _serverId));
+
+ System.out.println("2");
+
+ executeQuery(RETRIEVE_CLAN_ALLIANCE_INFO, new ResultSetCallable()
+ {
+ @Override
+ public void processResultSet(ResultSet resultSet) throws SQLException
+ {
+ while (resultSet.next())
+ {
+ String clanName = resultSet.getString(1);
+
+ if (clans.containsKey(clanName))
+ {
+ ClanAllianceToken allianceToken = new ClanAllianceToken();
+ allianceToken.ClanName = resultSet.getString(2);
+ allianceToken.Trusted = resultSet.getBoolean(3);
+
+ clans.get(clanName).Alliances.add(allianceToken);
+ }
+ }
+ }
+
+ }, new ColumnInt("serverId", _serverId));
+
+ System.out.println("3");
+
+ executeQuery(RETRIEVE_CLAN_WAR_INFO, new ResultSetCallable()
+ {
+ @Override
+ public void processResultSet(ResultSet resultSet) throws SQLException
+ {
+ while (resultSet.next())
+ {
+ ClanWarToken warToken = new ClanWarToken();
+ String clanA = resultSet.getString(1);
+ String clanB = resultSet.getString(2);
+ int score = resultSet.getInt(3);
+ Timestamp created = resultSet.getTimestamp(4);
+// warToken.Ended = resultSet.getTimestamp(5);
+ Timestamp updated = resultSet.getTimestamp(6);
+ ClanWarData warData = new ClanWarData(clanA, clanB, score, created, updated, 0);
+ warToken.WarData = warData;
+
+ if (clans.containsKey(warToken.WarData.getClanA()) && clans.containsKey(warToken.WarData.getClanB()))
+ {
+ System.out.println("Loaded War Token: " + warToken.WarData.getClanA());
+ clans.get(warToken.WarData.getClanA()).WarsOut.add(warToken);
+ clans.get(warToken.WarData.getClanB()).WarsIn.add(warToken);
+ }
+ }
+ }
+ }, new ColumnInt("serverId", _serverId));
+
+ System.out.println("Finished loading clans from database...");
+ return clans.values();
+ }
+
+ public boolean deleteClan(int clanId)
+ {
+ return jooq().delete(clans).where(clans.id.equal(clanId)).execute() == 1;
+ }
+
+ public int addClan(ClanToken token)
+ {
+ ClansRecord record = jooq().newRecord(clans);
+ record.setServerId(_serverId);
+ record.setName(token.Name);
+ record.setDescription(token.Description);
+ record.setHome(token.Home);
+ record.setAdmin(token.Admin);
+ record.setEnergy(token.Energy);
+
+ if (record.store() == 1)
+ {
+ return record.getId();
+ }
+ else
+ {
+ return -1;
+ }
+ }
+
+ @Deprecated
+ public boolean addMember(int clanId, String playerName, String role)
+ {
+ DSLContext create = jooq();
+ int out = create.insertInto(accountClan)
+ .set(accountClan.accountId, select(accounts.id).from(accounts).where(accounts.name.eq(playerName)))
+ .set(accountClan.clanId, clanId)
+ .set(accountClan.clanRole, role).execute();
+
+ return out == 1;
+ }
+
+ public boolean addMember(int clanId, UUID playerUUID, String role)
+ {
+ int out = jooq().insertInto(accountClan)
+ .set(accountClan.accountId, select(accounts.id).from(accounts).where(accounts.uuid.eq(playerUUID.toString())))
+ .set(accountClan.clanId, clanId)
+ .set(accountClan.clanRole, role).execute();
+
+ return out == 1;
+ }
+
+ public boolean removeMember(int clanId, String playerName)
+ {
+ return executeUpdate(DELETE_CLAN_MEMBER, new ColumnInt("clanid", clanId), new ColumnVarChar("name", 100, playerName)) == 1;
+ }
+
+ public void updateMember(int clanId, String playerName, String role)
+ {
+ executeUpdate(UPDATE_CLAN_MEMBER, new ColumnVarChar("clanRole", 100, role) , new ColumnInt("clanid", clanId), new ColumnVarChar("name", 100, playerName));
+ }
+
+ public void addClanRelationship(int clanId, int otherClanId, boolean trusted)
+ {
+ executeUpdate(ADD_CLAN_ALLIANCE, new ColumnInt("clanid", clanId), new ColumnInt("otherClanId", otherClanId), new ColumnBoolean("trusted", trusted));
+ }
+
+ public void updateClanRelationship(int clanId, int otherClanId, boolean trusted)
+ {
+ executeUpdate(UPDATE_CLAN_ALLIANCE, new ColumnBoolean("trusted", trusted), new ColumnInt("clanid", clanId), new ColumnInt("otherClanId", otherClanId));
+ }
+
+ public void removeClanRelationship(int clanId, int otherClanId)
+ {
+ executeUpdate(DELETE_CLAN_ALLIANCE, new ColumnInt("clanid", clanId), new ColumnInt("otherClanId", otherClanId));
+ }
+
+ public boolean addTerritoryClaim(int clanId, ClaimLocation chunk, boolean safe)
+ {
+ return executeUpdate(ADD_CLAN_TERRITORY, new ColumnInt("clanId", clanId), new ColumnVarChar("chunk", 100, chunk.toStoredString()), new ColumnBoolean("safe", safe)) == 1;
+ }
+
+ public boolean addTerritoryClaims(int clanId, boolean safe, ClaimLocation... chunks)
+ {
+ int affectedRows = 0;
+ int size = chunks.length;
+ String query = "INSERT INTO clanTerritory (clanId, chunk, safe) VALUES";
+ for (int i = 0; i < size; i++)
+ {
+ query += " (?, ?, ?)";
+
+ if (i < (size - 1))
+ query += ",";
+ }
+ query += ";";
+
+ try (Connection connection = getConnection();
+ PreparedStatement preparedStatement = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS))
+ {
+ Column> clanIdCol = new ColumnInt("clanId", clanId);
+ Column> safeCol = new ColumnBoolean("safe", safe);
+
+ int i = 0;
+ for (ClaimLocation claim : chunks)
+ {
+ String chunk = claim.toStoredString();
+ Column> chunkCol = new ColumnVarChar("chunk", 100, chunk);
+ clanIdCol.setValue(preparedStatement, i + 1);
+ chunkCol.setValue(preparedStatement, i + 2);
+ safeCol.setValue(preparedStatement, i + 3);
+ i += 3;
+ }
+
+ affectedRows = preparedStatement.executeUpdate();
+ }
+ catch (Exception exception)
+ {
+ exception.printStackTrace();
+ }
+
+ return affectedRows == size;
+ }
+
+ public void addWar(int initiatorId, int clanId, int score, Timestamp currentTime)
+ {
+ executeUpdate(ADD_CLAN_WAR, new ColumnInt("initiatorId", initiatorId), new ColumnInt("clanId", clanId), new ColumnInt("score", score),
+ new ColumnTimestamp("created", currentTime), new ColumnTimestamp("lastUpdated", currentTime));
+ }
+
+ public boolean updateWar(int initiatorId, int clanId, int score, Timestamp lastUpdated)
+ {
+ return 1 == executeUpdate(UPDATE_CLAN_WAR, new ColumnInt("score", score),
+ new ColumnTimestamp("lastUpdated", lastUpdated), new ColumnInt("initiatorId", initiatorId), new ColumnInt("clanId", clanId));
+ }
+
+ public void deleteAllWar(int clanId)
+ {
+ executeUpdate(DELETE_ALL_WAR, new ColumnInt("initiatorId", clanId), new ColumnInt("clanId", clanId));
+ }
+
+// public void addEnemy(int clanId, int otherClanId)
+// {
+// executeUpdate(ADD_CLAN_ENEMY, new ColumnInt("clanId", clanId), new ColumnInt("otherClanId", otherClanId));
+// }
+
+ public void removeTerritoryClaim(int clanId, ClaimLocation chunk)
+ {
+ executeUpdate(DELETE_CLAN_TERRITORY, new ColumnInt("clanId", clanId), new ColumnVarChar("chunk", 100, chunk.toStoredString()));
+ }
+
+ public void removeTerritoryClaims(int clanId)
+ {
+ executeUpdate(DELETE_CLAN_ALL_TERRITORY, new ColumnInt("clanId", clanId));
+ }
+
+ public void updateClan(int clanId, String name, String desc, String home, boolean admin, int energy, int kills, int murder, int deaths, int warWins, int warLosses, Timestamp lastOnline)
+ {
+ executeUpdate(UPDATE_CLAN, new ColumnVarChar("name", 100, name), new ColumnVarChar("desc", 100, desc), new ColumnVarChar("home", 100, home), new ColumnBoolean("admin", admin),
+ new ColumnInt("energy", energy), new ColumnInt("kills", kills), new ColumnInt("murder", murder), new ColumnInt("deaths", deaths),
+ new ColumnInt("warWins", warWins), new ColumnInt("warLosses", warLosses), new ColumnTimestamp("lastOnline", lastOnline), new ColumnInt("clanId", clanId));
+ }
+
+// public void updateEnemy(int clanId, int otherClanId, int clanScore, int otherClanScore, int clanKills, int otherClanKills)
+// {
+// executeUpdate(UPDATE_CLAN_ENEMY, new ColumnInt("clanId", clanId), new ColumnInt("otherClanId", otherClanId),
+// new ColumnInt("clanScore", clanScore), new ColumnInt("otherClanScore", otherClanScore), new ColumnInt("clanKills", clanKills),
+// new ColumnInt("otherClanKills", otherClanKills), new ColumnInt("clanId", clanId), new ColumnInt("otherClanId", otherClanId));
+// }
+
+ public int getServerId()
+ {
+ return _serverId;
+ }
+
+ public boolean updateClanGenerator(int clanId, String generator, int generatorStock)
+ {
+ return executeUpdate(UPDATE_CLAN_GENERATOR, new ColumnVarChar("generator", 140, generator), new ColumnInt("generatorStock", generatorStock), new ColumnInt("clanId", clanId))
+ > 0;
+ }
+
+ public void updateTerritoryClaim(ClaimLocation chunk, boolean safe)
+ {
+ executeUpdate(UPDATE_CLAN_TERRITORY, new ColumnBoolean("safe", safe), new ColumnVarChar("chunk", 100, chunk.toStoredString()));
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/ClanTerritory.java b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/ClanTerritory.java
new file mode 100644
index 00000000..3ad0dcd5
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/ClanTerritory.java
@@ -0,0 +1,29 @@
+package mineplex.game.clans.core.repository;
+
+import org.bukkit.Location;
+
+import mineplex.game.clans.core.ClaimLocation;
+
+public class ClanTerritory
+{
+ public ClanTerritory(ClaimLocation loc, String owner, boolean safe)
+ {
+ ClaimLocation = loc;
+ Owner = owner;
+ Safe = safe;
+ }
+
+ public boolean Safe;
+ public String Owner = "";
+ public ClaimLocation ClaimLocation;
+
+ public boolean isSafe(Location location)
+ {
+ if (Owner.equals("Spawn"))
+ {
+ return location.getY() > 190;
+ }
+
+ return Safe;
+ }
+}
\ No newline at end of file
diff --git a/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/ClanAllianceToken.java b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/ClanAllianceToken.java
new file mode 100644
index 00000000..c749feec
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/ClanAllianceToken.java
@@ -0,0 +1,7 @@
+package mineplex.game.clans.core.repository.tokens;
+
+public class ClanAllianceToken
+{
+ public String ClanName;
+ public boolean Trusted;
+}
diff --git a/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/ClanEnemyToken.java b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/ClanEnemyToken.java
new file mode 100644
index 00000000..8fb9e1ed
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/ClanEnemyToken.java
@@ -0,0 +1,12 @@
+package mineplex.game.clans.core.repository.tokens;
+
+import java.sql.Timestamp;
+
+public class ClanEnemyToken
+{
+ public boolean Initiator;
+ public String EnemyName;
+ public int Score;
+ public int Kills;
+ public Timestamp TimeFormed;
+}
diff --git a/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/ClanMemberToken.java b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/ClanMemberToken.java
new file mode 100644
index 00000000..9fab8c68
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/ClanMemberToken.java
@@ -0,0 +1,10 @@
+package mineplex.game.clans.core.repository.tokens;
+
+import java.util.UUID;
+
+public class ClanMemberToken
+{
+ public String Name;
+ public UUID PlayerUUID;
+ public String ClanRole;
+}
diff --git a/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/ClanTerritoryToken.java b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/ClanTerritoryToken.java
new file mode 100644
index 00000000..d7c6cbfd
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/ClanTerritoryToken.java
@@ -0,0 +1,10 @@
+package mineplex.game.clans.core.repository.tokens;
+
+public class ClanTerritoryToken
+{
+ public String ClanName;
+ public int ClanId;
+ public String ServerName;
+ public String Chunk;
+ public boolean Safe;
+}
diff --git a/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/ClanToken.java b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/ClanToken.java
new file mode 100644
index 00000000..64fc1722
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/ClanToken.java
@@ -0,0 +1,31 @@
+package mineplex.game.clans.core.repository.tokens;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ClanToken
+{
+ public int Id;
+ public String Name;
+ public String Description;
+ public String Home;
+ public boolean Admin;
+ public int Energy;
+ public int Kills;
+ public int Murder;
+ public int Deaths;
+ public int WarWins;
+ public int WarLosses;
+ public int EloRating;
+ public String GeneratorBuyer;
+ public int GeneratorStock;
+ public Timestamp DateCreated;
+ public Timestamp LastOnline;
+
+ public List Members = new ArrayList();
+ public List Territories = new ArrayList();
+ public List Alliances = new ArrayList();
+ public List WarsIn = new ArrayList();
+ public List WarsOut = new ArrayList();
+}
diff --git a/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/ClanWarToken.java b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/ClanWarToken.java
new file mode 100644
index 00000000..ad917de7
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/ClanWarToken.java
@@ -0,0 +1,8 @@
+package mineplex.game.clans.core.repository.tokens;
+
+import mineplex.game.clans.core.war.ClanWarData;
+
+public class ClanWarToken
+{
+ public ClanWarData WarData;
+}
diff --git a/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/SimpleClanToken.java b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/SimpleClanToken.java
new file mode 100644
index 00000000..e7fd13ca
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/repository/tokens/SimpleClanToken.java
@@ -0,0 +1,27 @@
+package mineplex.game.clans.core.repository.tokens;
+
+public class SimpleClanToken
+{
+
+ private String _clanName = "";
+ public String getClanName() { return _clanName; }
+
+ private String _clanRole;
+ public String getClanRole() { return _clanRole; }
+
+ private String _homeServer;
+ public String getHomeServer() { return _homeServer; }
+
+ private int _clanId;
+ public int getClanId() { return _clanId; }
+
+ public SimpleClanToken(String clanName, String clanRole, String homeServer, int clanId)
+ {
+ _clanName = clanName;
+ _clanRole = clanRole;
+ _homeServer = homeServer;
+ _clanId = clanId;
+ }
+
+ public SimpleClanToken() { }
+}
diff --git a/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/war/ClanWarData.java b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/war/ClanWarData.java
new file mode 100644
index 00000000..d286b697
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans.Core/src/mineplex/game/clans/core/war/ClanWarData.java
@@ -0,0 +1,122 @@
+package mineplex.game.clans.core.war;
+
+import java.sql.Timestamp;
+
+public class ClanWarData
+{
+ private String _clanA;
+ private String _clanB;
+ private volatile int _clanAPoints;
+ private Timestamp _timeFormed;
+ private Timestamp _lastUpdated;
+ private long _cooldown;
+
+ public ClanWarData(String clanA, String clanB, int clanAPoints, Timestamp timeFormed, Timestamp lastUpdated, long cooldown)
+ {
+ _clanA = clanA;
+ _clanB = clanB;
+ _clanAPoints = clanAPoints;
+ _timeFormed = timeFormed;
+ _lastUpdated = lastUpdated;
+ _cooldown = cooldown;
+ }
+
+ public String getClanA()
+ {
+ return _clanA;
+ }
+
+ public String getClanB()
+ {
+ return _clanB;
+ }
+
+ public int getClanAPoints()
+ {
+ return _clanAPoints;
+ }
+
+ public int getClanBPoints()
+ {
+ return -_clanAPoints;
+ }
+
+ public int getPoints(String clan)
+ {
+ if (_clanA.equals(clan))
+ return getClanAPoints();
+ else if (_clanB.equals(clan))
+ return getClanBPoints();
+
+ throw new RuntimeException("ClanWarData::getPoints Invalid Clan for War. ClanA: " + _clanA + ", ClanB: " + _clanB + ", Lookup Clan: " + clan);
+ }
+
+ public int getPoints()
+ {
+ return _clanAPoints;
+ }
+
+ public Timestamp getTimeFormed()
+ {
+ return _timeFormed;
+ }
+
+ public Timestamp getLastUpdated()
+ {
+ return _lastUpdated;
+ }
+
+ public void setLastUpdated(Timestamp lastUpdated)
+ {
+ _lastUpdated = lastUpdated;
+ }
+
+ public long getCooldown()
+ {
+ return _cooldown;
+ }
+
+ public void setCooldown(long cooldown)
+ {
+ _cooldown = System.currentTimeMillis() + cooldown;
+ }
+
+ public boolean isOnCooldown()
+ {
+ return _cooldown >= System.currentTimeMillis();
+ }
+
+ public void resetPoints()
+ {
+ update();
+
+ _clanAPoints = 0;
+ }
+
+ public void increment(String clan)
+ {
+ update();
+
+ if (_clanA.equals(clan))
+ _clanAPoints++;
+ else if (_clanB.equals(clan))
+ _clanAPoints--;
+ else throw new RuntimeException("ClanWarData::increment Invalid Clan for War. ClanA: " + _clanA + ", ClanB: " + _clanB + ", Lookup Clan: " + clan);
+ }
+
+ public void set(String clan, int points)
+ {
+ update();
+
+ if (_clanA.equals(clan))
+ _clanAPoints++;
+ else if (_clanB.equals(clan))
+ _clanAPoints--;
+ else throw new RuntimeException("ClanWarData::increment Invalid Clan for War. ClanA: " + _clanA + ", ClanB: " + _clanB + ", Lookup Clan: " + clan);
+ }
+
+ private void update()
+ {
+ setLastUpdated(new Timestamp(System.currentTimeMillis()));
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.Game.Clans/plugin.yml b/Plugins[Modified]/Mineplex.Game.Clans/plugin.yml
new file mode 100644
index 00000000..0d9f0bb9
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans/plugin.yml
@@ -0,0 +1,4 @@
+name: Clans
+main: mineplex.game.clans.Clans
+version: 1.0
+loadbefore: [MineplexAnticheat]
\ No newline at end of file
diff --git a/Plugins[Modified]/Mineplex.Game.Clans/pom.xml b/Plugins[Modified]/Mineplex.Game.Clans/pom.xml
new file mode 100644
index 00000000..02d16f54
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans/pom.xml
@@ -0,0 +1,33 @@
+
+
+ 4.0.0
+
+
+ com.mineplex
+ mineplex-plugin
+ dev-SNAPSHOT
+ ../plugin.xml
+
+
+ Clans
+ mineplex-game-clans
+
+
+
+ ${project.groupId}
+ mineplex-game-clans-core
+ ${project.version}
+
+
+ ${project.groupId}
+ mineplex-minecraft-game-classcombat
+ ${project.version}
+
+
+ ${project.groupId}
+ mineplex-clansqueue-common
+ ${project.version}
+
+
+
diff --git a/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java
new file mode 100644
index 00000000..b405b494
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java
@@ -0,0 +1,245 @@
+package mineplex.game.clans;
+
+import static mineplex.core.Managers.require;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.bukkit.Bukkit;
+import org.bukkit.Material;
+import org.bukkit.World;
+import org.bukkit.craftbukkit.v1_8_R3.CraftWorld;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.spigotmc.SpigotConfig;
+
+import mineplex.core.CustomTagFix;
+import mineplex.core.FoodDupeFix;
+import mineplex.core.account.CoreClientManager;
+import mineplex.core.achievement.AchievementManager;
+//import mineplex.core.antihack.AntiHack;
+//import mineplex.core.antihack.guardians.GuardianManager;
+import mineplex.core.aprilfools.AprilFoolsManager;
+import mineplex.core.blockrestore.BlockRestore;
+import mineplex.core.chat.Chat;
+import mineplex.core.chatsnap.SnapshotManager;
+import mineplex.core.chatsnap.SnapshotPlugin;
+import mineplex.core.chatsnap.SnapshotRepository;
+import mineplex.core.command.CommandCenter;
+import mineplex.core.common.Constants;
+import mineplex.core.common.MinecraftVersion;
+import mineplex.core.common.Pair;
+import mineplex.core.common.events.ServerShutdownEvent;
+import mineplex.core.creature.Creature;
+import mineplex.core.delayedtask.DelayedTask;
+import mineplex.core.disguise.DisguiseManager;
+import mineplex.core.donation.DonationManager;
+import mineplex.core.elo.EloManager;
+import mineplex.core.explosion.Explosion;
+import mineplex.core.fallingblock.FallingBlocks;
+import mineplex.core.friend.FriendManager;
+import mineplex.core.give.Give;
+import mineplex.core.hologram.HologramManager;
+import mineplex.core.ignore.IgnoreManager;
+import mineplex.core.incognito.IncognitoManager;
+import mineplex.core.inventory.InventoryManager;
+import mineplex.core.itemstack.ItemStackFactory;
+import mineplex.core.memory.MemoryFix;
+import mineplex.core.message.MessageManager;
+import mineplex.core.monitor.LagMeter;
+import mineplex.core.packethandler.PacketHandler;
+import mineplex.core.portal.GenericServer;
+import mineplex.core.portal.Portal;
+import mineplex.core.preferences.PreferencesManager;
+import mineplex.core.punish.Punish;
+import mineplex.core.rankGiveaway.eternal.EternalGiveawayManager;
+import mineplex.core.recharge.Recharge;
+import mineplex.core.report.ReportManager;
+import mineplex.core.report.ReportPlugin;
+import mineplex.core.resourcepack.ResourcePackManager;
+import mineplex.core.serverConfig.ServerConfiguration;
+import mineplex.core.stats.StatsManager;
+import mineplex.core.status.ServerStatusManager;
+import mineplex.core.teleport.Teleport;
+import mineplex.core.twofactor.TwoFactorAuth;
+import mineplex.core.updater.FileUpdater;
+import mineplex.core.updater.Updater;
+import mineplex.core.visibility.VisibilityManager;
+import mineplex.game.clans.clans.ClansManager;
+import mineplex.game.clans.clans.freeze.ClansFreezeManager;
+import mineplex.game.clans.items.GearManager;
+import mineplex.game.clans.shop.building.BuildingShop;
+import mineplex.game.clans.shop.farming.FarmingShop;
+import mineplex.game.clans.shop.mining.MiningShop;
+import mineplex.game.clans.shop.pvp.PvpShop;
+import mineplex.game.clans.spawn.travel.TravelShop;
+import mineplex.game.clans.world.WorldManager;
+import net.minecraft.server.v1_8_R3.MinecraftServer;
+
+public class Clans extends JavaPlugin
+{
+
+ private static final String MAP = "Season 5.5";
+ public static boolean HARDCORE = false;
+
+ // Modules
+ private CoreClientManager _clientManager;
+ private DonationManager _donationManager;
+ private ClansManager _clansManager;
+
+ @Override
+ public void onEnable()
+ {
+ try
+ {
+ HARDCORE = new File(new File(".").getCanonicalPath() + File.separator + "Hardcore.dat").exists();
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+ Bukkit.setSpawnRadius(0);
+
+ // Configs
+ getConfig().addDefault(Constants.WEB_CONFIG_KEY, Constants.WEB_ADDRESS);
+ getConfig().set(Constants.WEB_CONFIG_KEY, getConfig().getString(Constants.WEB_CONFIG_KEY));
+ saveConfig();
+
+ // Logger.initialize(this);
+
+ // Static Modules
+ CommandCenter.Initialize(this);
+ _clientManager = new CoreClientManager(this);
+ CommandCenter.Instance.setClientManager(_clientManager);
+
+ ItemStackFactory.Initialize(this, false);
+
+ DelayedTask.Initialize(this);
+
+ Recharge.Initialize(this);
+ require(VisibilityManager.class);
+ // new ProfileCacheManager(this);
+
+ _donationManager = require(DonationManager.class);
+
+ new FallingBlocks(this);
+
+ new ServerConfiguration(this, _clientManager);
+
+ PacketHandler packetHandler = require(PacketHandler.class);
+ IncognitoManager incognito = new IncognitoManager(this, _clientManager, packetHandler);
+ PreferencesManager preferenceManager = new PreferencesManager(this, incognito, _clientManager);
+
+ incognito.setPreferencesManager(preferenceManager);
+
+ ServerStatusManager serverStatusManager = new ServerStatusManager(this, _clientManager, new LagMeter(this, _clientManager));
+
+ // TODO: Add spawn locations to a configuration file of some sort?
+ Give.Initialize(this);
+
+ Teleport teleport = new Teleport(this, _clientManager);
+ Portal portal = new Portal();
+ new FileUpdater(GenericServer.CLANS_HUB);
+
+ ClansFreezeManager clansFreeze = new ClansFreezeManager(this, _clientManager);
+
+ Punish punish = new Punish(this, _clientManager, true);
+
+ DisguiseManager disguiseManager = require(DisguiseManager.class);
+ Creature creature = new Creature(this);
+
+ //AntiHack antiHack = require(AntiHack.class);
+ GuardianManager guardianManager = require(GuardianManager.class);
+
+ //Bukkit.getScheduler().runTask(this, antiHack::enableAnticheat);
+
+ new EternalGiveawayManager(this, _clientManager, serverStatusManager);
+
+ BlockRestore blockRestore = require(BlockRestore.class);
+
+ IgnoreManager ignoreManager = new IgnoreManager(this, _clientManager, preferenceManager, portal);
+
+ StatsManager statsManager = new StatsManager(this, _clientManager);
+ EloManager eloManager = new EloManager(this, _clientManager);
+ AchievementManager achievementManager = new AchievementManager(statsManager, _clientManager, _donationManager, incognito, eloManager);
+ Chat chat = require(Chat.class);
+ new MessageManager(this, incognito, _clientManager, preferenceManager, ignoreManager, punish, require(FriendManager.class), chat);
+
+ new MemoryFix(this);
+ new FoodDupeFix(this);
+ new Explosion(this, blockRestore);
+ InventoryManager inventory = new InventoryManager(this, _clientManager);
+ ResourcePackManager resourcePackManager = new ResourcePackManager(this, portal);
+ resourcePackManager.setResourcePack(new Pair[]
+ {
+ //Pair.create(MinecraftVersion.Version1_8, "http://file.mineplex.com/ResClans.zip"),
+ //Pair.create(MinecraftVersion.Version1_9, "http://file.mineplex.com/ResClans19.zip")
+ Pair.create(MinecraftVersion.Version1_8, "http://198.20.72.74/ResClans.zip"),
+ Pair.create(MinecraftVersion.Version1_9, "http://198.20.72.74/ResClans19.zip")
+ }, true);
+
+ SnapshotManager snapshotManager = new SnapshotManager(this, new SnapshotRepository(serverStatusManager.getCurrentServerName(), getLogger()));
+ new SnapshotPlugin(this, snapshotManager, _clientManager);
+ new ReportPlugin(this, new ReportManager(this, snapshotManager, _clientManager, incognito, punish, serverStatusManager.getRegion(), serverStatusManager.getCurrentServerName(), 1));
+
+ // Enable custom-gear related managers
+ new CustomTagFix(this, packetHandler);
+ GearManager customGear = new GearManager(this, packetHandler, _clientManager, _donationManager);
+
+ HologramManager hologram = require(HologramManager.class);
+ _clansManager = new ClansManager(this, serverStatusManager.getCurrentServerName(), incognito, packetHandler, punish, _clientManager, _donationManager, preferenceManager, blockRestore, statsManager, teleport, chat, customGear, hologram, inventory);
+ new Recipes(this);
+ new Farming(this);
+ new BuildingShop(_clansManager, _clientManager, _donationManager);
+ new PvpShop(_clansManager, _clientManager, _donationManager);
+ new FarmingShop(_clansManager, _clientManager, _donationManager);
+ new TravelShop(_clansManager, _clientManager, _donationManager);
+ new MiningShop(_clansManager, _clientManager, _donationManager);
+ new WorldManager(this);
+
+ require(TwoFactorAuth.class);
+
+ AprilFoolsManager.getInstance();
+
+ // Disable spigot item merging
+ for (World world : getServer().getWorlds())
+ {
+ // Disable item merging
+ ((CraftWorld) world).getHandle().spigotConfig.itemMerge = 0;
+ }
+
+ //Updates
+ require(Updater.class);
+
+ MinecraftServer.getServer().getPropertyManager().setProperty("debug", false);
+ SpigotConfig.debug = false;
+ }
+
+ public static String prettifyName(Material material)
+ {
+ String name = "";
+ String[] words = material.toString().split("_");
+
+ for (String word : words)
+ {
+ word = word.toLowerCase();
+ name += word.substring(0, 1).toUpperCase() + word.substring(1) + " ";
+ }
+
+ return name;
+ }
+
+ @Override
+ public void onDisable()
+ {
+ // Need to notify WorldEventManager of server shutdown, this seemed like
+ // the only decent way to do it
+ _clansManager.onDisable();
+
+ getServer().getPluginManager().callEvent(new ServerShutdownEvent(this));
+ }
+
+ public static String getMap()
+ {
+ return MAP;
+ }
+}
\ No newline at end of file
diff --git a/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/Farming.java b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/Farming.java
new file mode 100644
index 00000000..64035a9c
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/Farming.java
@@ -0,0 +1,38 @@
+package mineplex.game.clans;
+
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.block.BlockBreakEvent;
+import org.bukkit.plugin.java.JavaPlugin;
+
+import mineplex.core.MiniPlugin;
+import mineplex.core.common.util.UtilItem;
+import mineplex.core.itemstack.ItemStackFactory;
+
+public class Farming extends MiniPlugin
+{
+ public Farming(JavaPlugin plugin)
+ {
+ super("Farming", plugin);
+ }
+
+ @EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void BlockBreak(BlockBreakEvent event)
+ {
+ if (event.getBlock().getType() != Material.LEAVES)
+ return;
+
+ if (UtilItem.matchesMaterial(event.getPlayer().getItemInHand(), Material.SHEARS))
+ return;
+
+ Location dropLocation = event.getBlock().getLocation().add(0.5, 0.5, 0.5);
+
+ if (Math.random() > 0.9)
+ event.getBlock().getWorld().dropItemNaturally(dropLocation, ItemStackFactory.Instance.CreateStack(Material.APPLE));
+
+ if (Math.random() > 0.999)
+ event.getBlock().getWorld().dropItemNaturally(dropLocation, ItemStackFactory.Instance.CreateStack(Material.GOLDEN_APPLE));
+ }
+}
\ No newline at end of file
diff --git a/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/Recipes.java b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/Recipes.java
new file mode 100644
index 00000000..8615db3d
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/Recipes.java
@@ -0,0 +1,274 @@
+package mineplex.game.clans;
+
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.inventory.PrepareItemCraftEvent;
+import org.bukkit.inventory.CraftingInventory;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.ShapedRecipe;
+import org.bukkit.material.SmoothBrick;
+import org.bukkit.plugin.java.JavaPlugin;
+
+import mineplex.core.MiniPlugin;
+import mineplex.core.common.util.C;
+import mineplex.core.common.util.F;
+import mineplex.core.common.util.UtilGear;
+import mineplex.core.common.util.UtilServer;
+import mineplex.core.itemstack.ItemStackFactory;
+
+public class Recipes extends MiniPlugin
+{
+ public Recipes(JavaPlugin plugin)
+ {
+ super("Recipes", plugin);
+
+ ItemStack boosterAxe = ItemStackFactory.Instance.CreateStack(Material.GOLD_AXE, (byte) 0, 1, "Booster Axe", false);
+ ShapedRecipe goldAxe = new ShapedRecipe(boosterAxe);
+ goldAxe.shape("#MM","#SM","#S#");
+ goldAxe.setIngredient('M', Material.GOLD_BLOCK);
+ goldAxe.setIngredient('S', Material.STICK);
+ UtilServer.getServer().addRecipe(goldAxe);
+
+ ItemStack powerAxe = ItemStackFactory.Instance.CreateStack(Material.DIAMOND_AXE, (byte) 0, 1, "Power Axe", false);
+ ShapedRecipe diamondAxe = new ShapedRecipe(powerAxe);
+ diamondAxe.shape("#MM","#SM","#S#");
+ diamondAxe.setIngredient('M', Material.DIAMOND_BLOCK);
+ diamondAxe.setIngredient('S', Material.STICK);
+ UtilServer.getServer().addRecipe(diamondAxe);
+
+
+ ShapedRecipe bricks = new ShapedRecipe(new ItemStack(Material.SMOOTH_BRICK, 1));
+ bricks.shape("XX", "XX");
+ bricks.setIngredient('X', new SmoothBrick(Material.COBBLESTONE));
+ UtilServer.getServer().addRecipe(bricks);
+
+
+ ItemStack boosterSword = ItemStackFactory.Instance.CreateStack(Material.GOLD_SWORD, (byte) 0, 1, "Booster Sword", false);
+ ShapedRecipe goldSword = new ShapedRecipe(boosterSword);
+ goldSword.shape("M","M","S");
+ goldSword.setIngredient('M', Material.GOLD_BLOCK);
+ goldSword.setIngredient('S', Material.STICK);
+ UtilServer.getServer().addRecipe(goldSword);
+
+ ItemStack powerSword = ItemStackFactory.Instance.CreateStack(Material.DIAMOND_SWORD, (byte) 0, 1, "Power Sword", false);
+ ShapedRecipe diamondSword = new ShapedRecipe(powerSword);
+ diamondSword.shape("M","M","S");
+ diamondSword.setIngredient('M', Material.DIAMOND_BLOCK);
+ diamondSword.setIngredient('S', Material.STICK);
+ UtilServer.getServer().addRecipe(diamondSword);
+
+ //Iron Door
+ ShapedRecipe ironDoor = new ShapedRecipe(new ItemStack(Material.IRON_DOOR, 1));
+ ironDoor.shape("I","I");
+ ironDoor.setIngredient('I', Material.IRON_INGOT);
+ UtilServer.getServer().addRecipe(ironDoor);
+
+ //Chain Helm
+ ShapedRecipe chainHelm = new ShapedRecipe(new ItemStack(Material.CHAINMAIL_HELMET, 1));
+
+ chainHelm.shape("SIS","I#I");
+
+ chainHelm.setIngredient('I', Material.IRON_INGOT);
+ chainHelm.setIngredient('S', Material.GOLD_INGOT);
+
+ UtilServer.getServer().addRecipe(chainHelm);
+
+ //Chain Chest
+ ShapedRecipe chainChest = new ShapedRecipe(new ItemStack(Material.CHAINMAIL_CHESTPLATE, 1));
+
+ chainChest.shape("I#I","SIS","ISI");
+
+ chainChest.setIngredient('I', Material.IRON_INGOT);
+ chainChest.setIngredient('S', Material.GOLD_INGOT);
+
+ UtilServer.getServer().addRecipe(chainChest);
+
+ //Chain Legs
+ ShapedRecipe chainLegs = new ShapedRecipe(new ItemStack(Material.CHAINMAIL_LEGGINGS, 1));
+
+ chainLegs.shape("ISI","S#S","I#I");
+
+ chainLegs.setIngredient('I', Material.IRON_INGOT);
+ chainLegs.setIngredient('S', Material.GOLD_INGOT);
+
+ UtilServer.getServer().addRecipe(chainLegs);
+
+ //Chain Boots
+ ShapedRecipe chainBoots = new ShapedRecipe(new ItemStack(Material.CHAINMAIL_BOOTS, 1));
+
+ chainBoots.shape("S#S","I#I");
+
+ chainBoots.setIngredient('I', Material.IRON_INGOT);
+ chainBoots.setIngredient('S', Material.GOLD_INGOT);
+
+ UtilServer.getServer().addRecipe(chainBoots);
+
+ //Chain Helm
+ ShapedRecipe chainHelm2 = new ShapedRecipe(new ItemStack(Material.CHAINMAIL_HELMET, 1));
+
+ chainHelm2.shape("SIS","I#I");
+
+ chainHelm2.setIngredient('I', Material.GOLD_INGOT);
+ chainHelm2.setIngredient('S', Material.IRON_INGOT);
+
+ UtilServer.getServer().addRecipe(chainHelm2);
+
+ //Chain Chest
+ ShapedRecipe chainChest2 = new ShapedRecipe(new ItemStack(Material.CHAINMAIL_CHESTPLATE, 1));
+
+ chainChest2.shape("I#I","SIS","ISI");
+
+ chainChest2.setIngredient('I', Material.GOLD_INGOT);
+ chainChest2.setIngredient('S', Material.IRON_INGOT);
+
+ UtilServer.getServer().addRecipe(chainChest2);
+
+ //Chain Legs
+ ShapedRecipe chainLegs2 = new ShapedRecipe(new ItemStack(Material.CHAINMAIL_LEGGINGS, 1));
+
+ chainLegs2.shape("ISI","S#S","I#I");
+
+ chainLegs2.setIngredient('I', Material.GOLD_INGOT);
+ chainLegs2.setIngredient('S', Material.IRON_INGOT);
+
+ UtilServer.getServer().addRecipe(chainLegs2);
+
+ //Chain Boots
+ ShapedRecipe chainBoots2 = new ShapedRecipe(new ItemStack(Material.CHAINMAIL_BOOTS, 1));
+
+ chainBoots2.shape("S#S","I#I");
+
+ chainBoots2.setIngredient('I', Material.GOLD_INGOT);
+ chainBoots2.setIngredient('S', Material.IRON_INGOT);
+
+ UtilServer.getServer().addRecipe(chainBoots2);
+
+ ShapedRecipe stonebrick = new ShapedRecipe(new ItemStack(Material.SMOOTH_BRICK, 1));
+ stonebrick.shape("SS#", "SS#");
+ stonebrick.setIngredient('S', Material.STONE);
+ UtilServer.getServer().addRecipe(stonebrick);
+
+ stonebrick = new ShapedRecipe(new ItemStack(Material.SMOOTH_BRICK, 1));
+ stonebrick.shape("#SS", "#SS");
+ stonebrick.setIngredient('S', Material.STONE);
+ UtilServer.getServer().addRecipe(stonebrick);
+
+ stonebrick = new ShapedRecipe(new ItemStack(Material.SMOOTH_BRICK, 1));
+ stonebrick.shape("###", "SS#", "SS#");
+ stonebrick.setIngredient('S', Material.STONE);
+ UtilServer.getServer().addRecipe(stonebrick);
+
+ stonebrick = new ShapedRecipe(new ItemStack(Material.SMOOTH_BRICK, 1));
+ stonebrick.shape("###", "#SS", "#SS");
+ stonebrick.setIngredient('S', Material.STONE);
+ UtilServer.getServer().addRecipe(stonebrick);
+
+
+ }
+
+ @EventHandler(priority = EventPriority.LOW)
+ public void addLore(PrepareItemCraftEvent event)
+ {
+ if (event.getView().getPlayer() instanceof Player)
+ {
+ Player player = ((Player) event.getView().getPlayer());
+ CraftingInventory inv = (CraftingInventory)event.getInventory();
+
+ ItemStack itemStack = inv.getResult();
+
+ if (UtilGear.isWeapon(itemStack))
+ {
+ ItemStackFactory.Instance.addOwnerLore(itemStack, player.getName() + " Crafting");
+ inv.setResult(itemStack);
+ }
+ }
+ }
+
+ @EventHandler(priority = EventPriority.HIGH)
+ public void ReplaceDoor(PrepareItemCraftEvent event)
+ {
+ if (event.getRecipe().getResult() == null)
+ return;
+
+ Material type = event.getRecipe().getResult().getType();
+
+ if (type != Material.WOOD_DOOR && type != Material.WOODEN_DOOR)
+ return;
+
+ if (!(event.getInventory() instanceof CraftingInventory))
+ return;
+
+ CraftingInventory inv = (CraftingInventory)event.getInventory();
+
+ //Feedback
+ ItemStack result = ItemStackFactory.Instance.CreateStack(Material.IRON_DOOR);
+ inv.setResult(result);
+ }
+
+ @EventHandler(priority = EventPriority.HIGH)
+ public void DenySword(PrepareItemCraftEvent event)
+ {
+ if (event.getRecipe().getResult() == null)
+ return;
+
+ Material type = event.getRecipe().getResult().getType();
+
+ if (type != Material.DIAMOND_SWORD && type != Material.GOLD_SWORD &&
+ type != Material.DIAMOND_AXE && type != Material.GOLD_AXE)
+ return;
+
+ if (!(event.getInventory() instanceof CraftingInventory))
+ return;
+
+ CraftingInventory inv = (CraftingInventory)event.getInventory();
+
+ for (ItemStack cur : inv.getMatrix())
+ if (cur != null)
+ if (cur.getType() == Material.GOLD_BLOCK || cur.getType() == Material.DIAMOND_BLOCK)
+ return;
+
+ String name = ItemStackFactory.Instance.GetName(event.getRecipe().getResult(), true);
+ String matName = "Gold";
+ if (type == Material.DIAMOND_AXE || type == Material.DIAMOND_SWORD)
+ matName = "Diamond";
+
+ //Feedback
+ ItemStack result = ItemStackFactory.Instance.CreateStack(36, (byte)0, 1, "§r" + C.cGray + "Recipe changed for " + F.item(name) + ".",
+ new String[] {C.cGray + "Use " + F.item(matName + " Blocks") + " instead of " + F.item(matName + " Ingots") + "."});
+
+ inv.setResult(result);
+ }
+
+ @EventHandler(priority = EventPriority.HIGH)
+ public void DenyGeneral(PrepareItemCraftEvent event)
+ {
+ if (event.getRecipe().getResult() == null)
+ return;
+
+ Material type = event.getRecipe().getResult().getType();
+
+ if (
+ type != Material.GOLDEN_APPLE &&
+ type != Material.GOLDEN_CARROT &&
+ type != Material.ENDER_CHEST &&
+ type != Material.ENCHANTMENT_TABLE &&
+ type != Material.BREWING_STAND &&
+ type != Material.TNT)
+ return;
+
+ if (!(event.getInventory() instanceof CraftingInventory))
+ return;
+
+ CraftingInventory inv = (CraftingInventory)event.getInventory();
+
+ String name = ItemStackFactory.Instance.GetName(event.getRecipe().getResult(), true);
+
+ //Feedback
+ ItemStack result = ItemStackFactory.Instance.CreateStack(36, (byte)0, 1,
+ "§r" + C.cGray + "Crafting of " + F.item(name) + " is disabled.", new String[] {});
+
+ inv.setResult(result);
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/BedStatus.java b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/BedStatus.java
new file mode 100644
index 00000000..08f3c89b
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/BedStatus.java
@@ -0,0 +1,9 @@
+package mineplex.game.clans.clans;
+
+public enum BedStatus
+{
+ EXISTS_AND_UNOBSTRUCTED,
+ EXISTS_AND_OBSTRUCTED,
+ DESTROYED,
+ DOESNT_EXIST;
+}
diff --git a/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ChunkData.java b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ChunkData.java
new file mode 100644
index 00000000..9eccb517
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ChunkData.java
@@ -0,0 +1,28 @@
+package mineplex.game.clans.clans;
+
+import org.bukkit.ChatColor;
+import org.bukkit.Color;
+
+public class ChunkData
+{
+
+ private int _x;
+ public int getX() { return _x; }
+
+ private int _z;
+ public int getZ() { return _z; }
+
+ private ChatColor _color;
+ public ChatColor getColor() { return _color; }
+
+ private String _clanName;
+ public String getClanName() { return _clanName; }
+
+ public ChunkData(int x, int z, ChatColor color, String clanName)
+ {
+ _x = x;
+ _z = z;
+ _color = color;
+ _clanName = clanName;
+ }
+}
\ No newline at end of file
diff --git a/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanEnergyManager.java b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanEnergyManager.java
new file mode 100644
index 00000000..f61253bc
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanEnergyManager.java
@@ -0,0 +1,84 @@
+package mineplex.game.clans.clans;
+
+import com.mineplex.clansqueue.common.ClansQueueMessenger;
+import com.mineplex.clansqueue.common.messages.QueuePauseUpdateMessage;
+
+import mineplex.core.MiniPlugin;
+import mineplex.core.common.util.F;
+import mineplex.core.common.util.UtilServer;
+import mineplex.game.clans.core.ClaimLocation;
+import mineplex.game.clans.shop.energy.EnergyShop;
+
+public class ClanEnergyManager extends MiniPlugin implements Runnable
+{
+
+ private final ClansManager _clansManager;
+ private volatile boolean _paused;
+ private int tickCount;
+
+ public ClanEnergyManager(ClansManager clansManager)
+ {
+ super("Clan Energy");
+
+ _clansManager = clansManager;
+
+ new EnergyShop(this, clansManager.getClientManager(), clansManager.getDonationManager());
+
+ // Wait 5 seconds and then tick every 60 seconds
+ _plugin.getServer().getScheduler().runTaskTimer(_plugin, this, 20 * 5, 20 * 60);
+ ClansQueueMessenger.getMessenger(UtilServer.getServerName()).registerListener(QueuePauseUpdateMessage.class, (pause, origin) ->
+ {
+ if (pause.ServerName.equals(UtilServer.getServerName()))
+ {
+ _paused = pause.Paused;
+ }
+ });
+ }
+
+ @Override
+ public void run()
+ {
+ if (_paused)
+ {
+ return;
+ }
+
+ tickCount++;
+
+ for (final ClanInfo clanInfo : _clansManager.getClanMap().values())
+ {
+ if (clanInfo.isAdmin())
+ continue;
+
+ int energyPerMinute = clanInfo.getEnergyCostPerMinute();
+ int currentEnergy = clanInfo.getEnergy();
+
+ if (currentEnergy < energyPerMinute)
+ {
+ for (ClaimLocation chunk : clanInfo.getClaimSet())
+ {
+ _clansManager.getClanDataAccess().unclaimSilent(chunk, true);
+ }
+ _clansManager.messageClan(clanInfo, F.main("Clans", "Your clan has ran out of energy. Land claims have been removed"));
+ }
+ else
+ {
+ clanInfo.adjustEnergy(-energyPerMinute);
+ if (tickCount % 5 == 0 && energyPerMinute > 0)
+ {
+ runAsync(() -> _clansManager.getClanDataAccess().updateEnergy(clanInfo));
+ }
+ }
+ }
+ }
+
+ public ClansManager getClansManager()
+ {
+ return _clansManager;
+ }
+
+ public int convertEnergyToGold(int energy)
+ {
+ return (energy / 8) + (energy % 8 == 0 ? 0 : 1);
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanEnergyTracker.java b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanEnergyTracker.java
new file mode 100644
index 00000000..3541d812
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanEnergyTracker.java
@@ -0,0 +1,69 @@
+package mineplex.game.clans.clans;
+
+import java.util.EnumMap;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.lang3.tuple.Triple;
+import org.bukkit.event.EventHandler;
+import org.bukkit.plugin.java.JavaPlugin;
+
+import mineplex.core.MiniPlugin;
+import mineplex.core.common.util.C;
+import mineplex.core.updater.UpdateType;
+import mineplex.core.updater.event.UpdateEvent;
+import mineplex.game.clans.clans.ClanTips.TipType;
+
+public class ClanEnergyTracker extends MiniPlugin
+{
+ private ClansManager _clans;
+ private EnumMap> _updateMap;
+
+ public ClanEnergyTracker(JavaPlugin plugin, ClansManager clans)
+ {
+ super("Clan Energy Tracker", plugin);
+ _clans = clans;
+
+ _updateMap = new EnumMap<>(UpdateType.class);
+ _updateMap.put(UpdateType.MIN_05, Triple.of(0L, TimeUnit.HOURS.toMillis(1), new String[] { C.cRed + "Urgent", "Clan Energy is almost depleted" }));
+ _updateMap.put(UpdateType.MIN_10, Triple.of(TimeUnit.HOURS.toMillis(1), TimeUnit.HOURS.toMillis(4), new String[] { C.cGold + "Warning", "Clan Energy is low" }));
+ _updateMap.put(UpdateType.MIN_30, Triple.of(TimeUnit.HOURS.toMillis(4), TimeUnit.DAYS.toMillis(1), new String[] { C.cGold + "Notice", "Clan Energy is running low" }));
+ }
+
+ @EventHandler
+ public void onUpdate(UpdateEvent event)
+ {
+ if (_updateMap.containsKey(event.getType()))
+ {
+ for (ClanInfo clan : _clans.getClanMap().values())
+ {
+ display(clan, event.getType());
+ }
+ }
+ }
+
+ private void display(ClanInfo clan, UpdateType type)
+ {
+ // No point in doing anything if nobody is online!
+ if (!clan.isOnlineNow())
+ {
+ return;
+ }
+
+ // Avoid divide by 0
+ if (clan.getEnergyCostPerMinute() <= 0)
+ {
+ return;
+ }
+
+ // Energy Remaining in milliseconds
+ long energyRemaining = (clan.getEnergy() / clan.getEnergyCostPerMinute()) * 60000L;
+
+ Triple energyBounds = _updateMap.get(type);
+
+ if (energyBounds != null && energyRemaining > energyBounds.getLeft() && energyRemaining < energyBounds.getMiddle())
+ {
+ _clans.middleTextClan(clan, energyBounds.getRight()[0], energyBounds.getRight()[1], 20, 200, 80);
+ _clans.sendTipToClan(clan, TipType.ENERGY);
+ }
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanInfo.java b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanInfo.java
new file mode 100644
index 00000000..1cbd22ec
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanInfo.java
@@ -0,0 +1,830 @@
+package mineplex.game.clans.clans;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+import net.minecraft.server.v1_8_R3.Material;
+
+import org.bukkit.Location;
+import org.bukkit.Sound;
+import org.bukkit.entity.Player;
+
+import mineplex.core.common.util.C;
+import mineplex.core.common.util.F;
+import mineplex.core.common.util.NautHashMap;
+import mineplex.core.common.util.UtilAlg;
+import mineplex.core.common.util.UtilBlock;
+import mineplex.core.common.util.UtilPlayer;
+import mineplex.core.common.util.UtilTextMiddle;
+import mineplex.core.common.util.UtilTime;
+import mineplex.core.common.util.UtilTime.TimeUnit;
+import mineplex.core.common.util.UtilWorld;
+import mineplex.game.clans.clans.ClansUtility.ClanRelation;
+import mineplex.game.clans.clans.tntgenerator.TntGenerator;
+import mineplex.game.clans.core.ClaimLocation;
+import mineplex.game.clans.core.repository.tokens.ClanAllianceToken;
+import mineplex.game.clans.core.repository.tokens.ClanMemberToken;
+import mineplex.game.clans.core.repository.tokens.ClanTerritoryToken;
+import mineplex.game.clans.core.repository.tokens.ClanToken;
+import mineplex.game.clans.core.repository.tokens.ClanWarToken;
+import mineplex.game.clans.core.war.ClanWarData;
+
+public class ClanInfo
+{
+ private int _id = -1;
+ private String _name = "";
+ private String _desc = "";
+ private Location _home = null;
+ private int _energy = 4320;
+
+ // Stats
+ private int _kills;
+ private int _murder;
+ private int _deaths;
+ private int _warWins;
+ private int _warLosses;
+ private int _eloRating;
+
+ private boolean _admin = false;
+
+ private Timestamp _dateCreated;
+ private Timestamp _lastOnline = null;
+
+ private TntGenerator _generator;
+
+ // Loaded from Client
+ private NautHashMap _memberMap = new NautHashMap();
+ private NautHashMap _allyMap = new NautHashMap();
+ private Set _claimSet = new HashSet<>();
+
+ // Wars Initiated By Others
+ private HashMap _warIn = new HashMap();
+ // Wars Initiated By Self
+ private HashMap _warOut = new HashMap();
+
+ // Temporary
+ private NautHashMap _recentlyLeft = new NautHashMap<>();
+ private NautHashMap _inviteeMap = new NautHashMap();
+ private NautHashMap _inviterMap = new NautHashMap();
+ private List _onlinePlayers = new ArrayList();
+
+ private NautHashMap _requestMap = new NautHashMap();
+
+ public ClansManager Clans;
+
+ private BedStatus _bedStatus = null;
+
+
+ public ClanInfo(ClansManager clans, ClanToken token)
+ {
+ Clans = clans;
+
+ _id = token.Id;
+ _name = token.Name;
+ _desc = token.Description;
+ _eloRating = token.EloRating;
+
+ try
+ {
+ _home = UtilWorld.strToLoc(token.Home);
+ }
+ catch (Exception e)
+ {
+
+ }
+
+ if (_home != null)
+ {
+ if (UtilBlock.isValidBed(_home))
+ {
+ if (_home.clone().add(0, 1,0).getBlock().getType().equals(Material.AIR))
+ {
+ _bedStatus = BedStatus.EXISTS_AND_UNOBSTRUCTED;
+ }
+ else
+ {
+ _bedStatus = BedStatus.EXISTS_AND_OBSTRUCTED;
+ }
+ }
+ else
+ {
+ _bedStatus = BedStatus.DESTROYED;
+ }
+ }
+ else
+ {
+ _bedStatus = BedStatus.DOESNT_EXIST;
+ }
+
+ _energy = token.Energy;
+ _admin = token.Admin;
+
+ _dateCreated = (token.DateCreated != null) ? token.DateCreated : new Timestamp(System.currentTimeMillis());
+ _lastOnline = (token.LastOnline != null) ? token.LastOnline : new Timestamp(System.currentTimeMillis());
+
+ for (ClanMemberToken memberToken : token.Members)
+ {
+ ClanRole role = ClanRole.valueOf(memberToken.ClanRole);
+ _memberMap.put(memberToken.PlayerUUID, new ClansPlayer(memberToken.Name, memberToken.PlayerUUID, role));
+ }
+
+ for (ClanTerritoryToken territoryToken : token.Territories)
+ {
+ _claimSet.add(ClaimLocation.fromStoredString(territoryToken.Chunk));
+ }
+
+ for (ClanAllianceToken allianceToken : token.Alliances)
+ {
+ _allyMap.put(allianceToken.ClanName, allianceToken.Trusted);
+ }
+
+ for (ClanWarToken warToken : token.WarsIn)
+ {
+ ClanWarData warData = warToken.WarData;
+ _warIn.put(warData.getClanA(), warData);
+ }
+
+ for (ClanWarToken warToken : token.WarsOut)
+ {
+ ClanWarData warData = warToken.WarData;
+ _warOut.put(warData.getClanB(), warData);
+ }
+
+ try
+ {
+ if (token.GeneratorBuyer != null && token.GeneratorBuyer.length() > 0)
+ {
+ if (token.GeneratorBuyer.contains(","))
+ {
+ // Convert to new generator format;
+
+ for (ClanMemberToken memberToken : token.Members)
+ {
+ ClanRole role = ClanRole.valueOf(memberToken.ClanRole);
+
+ if (role.equals(ClanRole.LEADER))
+ {
+ token.GeneratorBuyer = memberToken.PlayerUUID.toString();
+ break;
+ }
+ }
+
+ System.out.println("Clans> Converted " + _name + "'s generator to the new format.");
+ }
+
+ _generator = new TntGenerator(token.GeneratorBuyer);
+ _generator.setStock(token.GeneratorStock);
+
+ Clans.getClanDataAccess().updateGenerator(this, null);
+ }
+ }
+ catch (Exception e)
+ {
+
+ }
+ }
+
+ public int getClaims()
+ {
+ return getClaimSet().size();
+ }
+
+ public int getClaimsMax()
+ {
+ if (ssAdmin())
+ return 1000;
+
+ return Math.min(8, 2 + getMembers().size());
+ }
+
+ public int getAllies()
+ {
+ return getAllyMap().size();
+ }
+
+ public int getAlliesMax()
+ {
+ return getAlliesMaxWithMemberCountOf(_memberMap.size());
+ }
+
+ public int getAlliesMaxWithMemberCountOf(int memberCount)
+ {
+ if (ssAdmin())
+ {
+ return 1000;
+ }
+
+ return Math.max(2, 6 - memberCount);
+ }
+
+ public BedStatus getBedStatus()
+ {
+ return _bedStatus;
+ }
+
+ public void setBedStatus(BedStatus bedStatus)
+ {
+ _bedStatus = bedStatus;
+ }
+
+ public boolean isRequested(String clan)
+ {
+ if (!getRequestMap().containsKey(clan))
+ return false;
+
+ if (System.currentTimeMillis() > getRequestMap().get(clan) + (Clans.getInviteExpire() * 60000))
+ return false;
+
+ return true;
+ }
+
+ public boolean isInvited(String player)
+ {
+ if (!getInviteeMap().containsKey(player))
+ return false;
+
+ if (System.currentTimeMillis() > getInviteeMap().get(player) + (Clans.getInviteExpire() * 60000))
+ return false;
+
+ return true;
+ }
+
+ public boolean isMember(Player player)
+ {
+ return getMembers().containsKey(player.getUniqueId());
+ }
+
+ public boolean isMember(UUID uuid)
+ {
+ return getMembers().containsKey(uuid);
+ }
+
+ public boolean isAlly(String other)
+ {
+ return getAllyMap().containsKey(other);
+ }
+
+ public boolean isAlly(ClanInfo other)
+ {
+ if (other == null)
+ {
+ return false;
+ }
+
+ return isAlly(other.getName());
+ }
+
+ public boolean isSelf(String other)
+ {
+ return getName().equals(other);
+ }
+
+ public boolean isNeutral(String other)
+ {
+ return (!isAlly(other) && !isSelf(other));
+ }
+
+ public long getTimer()
+ {
+ int penalty = 0;
+ return System.currentTimeMillis() + (penalty * 1000);
+ }
+
+ public boolean getTrust(String clan)
+ {
+ if (!getAllyMap().containsKey(clan))
+ return false;
+
+ return getAllyMap().get(clan);
+ }
+
+ public LinkedList mDetails(Player caller)
+ {
+ LinkedList stringList = new LinkedList();
+
+ stringList.add(F.main("Clans", Clans.getClanUtility().mRel(Clans.getClanUtility().relPC(caller, this), getName() + " Information;", true)));
+ // stringList.add(F.value("Desc", _desc));
+
+ // Age
+ stringList.add(F.value("Age",
+ UtilTime.convertString(System.currentTimeMillis() - _dateCreated.getTime(), 1, TimeUnit.FIT)));
+
+ // Home
+ if (Clans.getClanUtility().relPC(caller, this) == ClanRelation.SELF)
+ stringList.add(F.value("Home", UtilWorld.locToStrClean(getHome())));
+
+ // Land
+ stringList.add(F.value("Territory", getClaims() + "/" + getClaimsMax()));
+
+ // Member count
+ stringList.add(F.value("Members", getSize() + "/" + getMaxSize()));
+
+ // Energy
+ int energy = getEnergy();
+ int costPerHour = getEnergyCostPerMinute() * 60;
+ stringList.add(" ");
+ stringList.add(F.value("Clan Energy", "" + energy));
+// stringList.add(F.value("Max Energy", "" + getEnergyMax()));
+ stringList.add(F.value("Energy Drain/Hour", "" + costPerHour));
+ if (costPerHour > 0)
+ stringList.add(F.value("Hours Left", "" + energy / costPerHour));
+ stringList.add(" ");
+
+ // Ally String
+ String allySorted = "";
+ HashSet allyUnsorted = new HashSet();
+
+ for (String allyName : getAllyMap().keySet())
+ allyUnsorted.add(allyName);
+
+ for (String cur : UtilAlg.sortKey(allyUnsorted))
+ allySorted += Clans.getClanUtility().mRel(Clans.getClanUtility().relPC(caller, Clans.getClanMap().get(cur)), cur, false)
+ + ", ";
+
+ stringList.add(F.value("Allies", allySorted));
+
+ // Members
+ String members = "";
+ for (ClansPlayer cur : UtilAlg.sortSet(getMembers().values(), new ClansPlayerComparator()))
+ {
+ String name = C.listValueOff + cur.getPlayerName();
+ if (cur.isOnline())
+ name = C.listValueOn + cur.getPlayerName();
+
+ if (cur.getRole() == ClanRole.LEADER)
+ members += C.listValue + "L." + name + C.mBody + ", ";
+
+ if (cur.getRole() == ClanRole.ADMIN)
+ members += C.listValue + "A." + name + C.mBody + ", ";
+
+ if (cur.getRole() == ClanRole.MEMBER)
+ members += C.listValue + "M." + name + C.mBody + ", ";
+
+ if (cur.getRole() == ClanRole.RECRUIT)
+ members += C.listValue + "R." + name + C.mBody + ", ";
+ }
+ stringList.add(F.value("Members", members));
+
+ return stringList;
+ }
+
+ public LinkedList mTerritory()
+ {
+ LinkedList stringList = new LinkedList();
+
+ stringList.add(F.main("Clans", getName() + " Territory;"));
+
+ getClaimSet().stream().map(ClaimLocation::toStoredString).forEach(stringList::add);
+
+ return stringList;
+ }
+
+ public void inform(String message, String ignore)
+ {
+ for (UUID cur : getMembers().keySet())
+ {
+ Player player = UtilPlayer.searchExact(cur);
+
+ if (player == null)
+ continue;
+
+ if (player.getName().equals(ignore))
+ continue;
+
+ UtilPlayer.message(player, F.main("Clans", message));
+ player.playSound(player.getLocation(), Sound.NOTE_PLING, 1f, 2f);
+ }
+ }
+
+ public void inform(String top, String bottom, String ignore)
+ {
+ for (UUID cur : getMembers().keySet())
+ {
+ Player player = UtilPlayer.searchExact(cur);
+
+ if (player == null)
+ continue;
+
+ if (player.getName().equals(ignore))
+ continue;
+
+ UtilTextMiddle.display(top, bottom, 20, 100, 20, player);
+ }
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public String getDesc()
+ {
+ return _desc;
+ }
+
+ public void setDesc(String desc)
+ {
+ _desc = desc;
+ }
+
+ public NautHashMap getMembers()
+ {
+ return _memberMap;
+ }
+
+ public Set getClaimSet()
+ {
+ return _claimSet;
+ }
+
+ public Location getHome()
+ {
+ return _home != null ? _home.clone() : null;
+ }
+
+ public void setHome(Location loc)
+ {
+ _home = loc;
+ }
+
+ public boolean ssAdmin()
+ {
+ return _admin;
+ }
+
+ public void setAdmin(boolean admin)
+ {
+ _admin = admin;
+ }
+
+ public NautHashMap getInviterMap()
+ {
+ return _inviterMap;
+ }
+
+ public NautHashMap getInviteeMap()
+ {
+ return _inviteeMap;
+ }
+
+ public NautHashMap getAllyMap()
+ {
+ return _allyMap;
+ }
+
+ public NautHashMap getRequestMap()
+ {
+ return _requestMap;
+ }
+
+ public Timestamp getDateCreated()
+ {
+ return _dateCreated;
+ }
+
+ public Timestamp getLastOnline()
+ {
+ return _lastOnline;
+ }
+
+ public void setLastOnline(Timestamp lastOnline)
+ {
+ _lastOnline = lastOnline;
+ }
+
+ public boolean isOnlineNow()
+ {
+ return _onlinePlayers.size() > 0;
+ }
+
+ public boolean isOnline()
+ {
+ return isOnlineNow();
+ }
+
+ public TntGenerator getGenerator()
+ {
+ return _generator;
+ }
+
+ public void setGenerator(TntGenerator generator)
+ {
+ _generator = generator;
+ }
+
+ public boolean isAdmin()
+ {
+ return _admin;
+ }
+
+ public int getId()
+ {
+ return _id;
+ }
+
+ public void setId(int id)
+ {
+ _id = id;
+ }
+
+ public int getEnergy()
+ {
+ if (_energy > getEnergyMax())
+ {
+ _energy = getEnergyMax();
+ }
+
+ return _energy;
+ }
+
+ public String getEnergyLeftString()
+ {
+ if (getEnergyCostPerMinute() > 0)
+ return UtilTime.convertString(60000L * getEnergy() / getEnergyCostPerMinute(), 1, TimeUnit.FIT);
+
+ return "Infinite";
+ }
+
+ public int getKills()
+ {
+ return _kills;
+ }
+
+ public void addKills(int amount)
+ {
+ _kills += amount;
+ }
+
+ public int getMurder()
+ {
+ return _murder;
+ }
+
+ public void addMurder(int amount)
+ {
+ _murder += amount;
+ }
+
+ public int getDeaths()
+ {
+ return _deaths;
+ }
+
+ public void addDeaths(int amount)
+ {
+ _deaths += amount;
+ }
+
+ public int getWarWins()
+ {
+ return _warWins;
+ }
+
+ public void addWarWins(int amount)
+ {
+ _warWins += amount;
+ }
+
+ public int getWarLosses()
+ {
+ return _warLosses;
+ }
+
+ public void addWarLosses(int amount)
+ {
+ _warLosses += amount;
+ }
+
+ public int getEloRating()
+ {
+ return _eloRating;
+ }
+
+ public void addEloRating(int amount)
+ {
+ _eloRating += amount;
+ }
+
+ public ClanWarData getWarData(ClanInfo against)
+ {
+ ClanWarData data = null;
+
+ data = _warIn.get(against.getName());
+ if (data == null) data = _warOut.get(against.getName());
+
+ return data;
+ }
+
+ public int getWarPoints(ClanInfo against)
+ {
+ int warPoints = 0;
+
+ if (against != null)
+ {
+ ClanWarData data = _warIn.get(against.getName());
+ if (data != null)
+ {
+ warPoints = data.getClanBPoints();
+ }
+ else if ((data = _warOut.get(against.getName())) != null)
+ {
+ warPoints = data.getClanAPoints();
+ }
+ }
+
+ return warPoints;
+ }
+
+ public String getFormattedWarPoints(ClanInfo clan)
+ {
+ String warString = "";
+ int warPoints = getWarPoints(clan);
+
+ String prefix;
+ if (warPoints >= 5) prefix = C.cPurple;
+ else if (warPoints <= -5) prefix = C.cRed;
+ else prefix = C.cWhite;
+
+ warString += prefix;
+ if (warPoints > 0) warString += "+";
+ warString += warPoints;
+
+ return warString;
+ }
+
+ public void addWar(ClanWarData war)
+ {
+ if (war.getClanA().equals(getName()))
+ _warOut.put(war.getClanB(), war);
+ else if (war.getClanB().equals(getName()))
+ _warIn.put(war.getClanA(), war);
+ else throw new RuntimeException("Failed to add war to clan `" + getName() + "` ClanA: " + war.getClanA() + ", ClanB: " + war.getClanB());
+ }
+
+ public List getWars()
+ {
+ List wars = new LinkedList();
+ wars.addAll(_warIn.values());
+ wars.addAll(_warOut.values());
+ return wars;
+ }
+
+ public void clearWar(String againstClan)
+ {
+ _warIn.remove(againstClan);
+ _warOut.remove(againstClan);
+ }
+
+ public boolean isEnemy(ClanInfo againstClan)
+ {
+ int warPoints = getWarPoints(againstClan);
+ return warPoints >= 5 || warPoints <= -5;
+ }
+
+ public void adjustEnergy(int energy)
+ {
+ _energy += energy;
+ }
+
+ public int getClaimCount()
+ {
+ return _claimSet.size();
+ }
+
+ public int getSize()
+ {
+ return _memberMap.size();
+ }
+
+ public int getMaxSize()
+ {
+ if (ssAdmin())
+ return 1000;
+
+ return 20;
+ }
+
+ public int getEnergyMax()
+ {
+ // 10080 = 7 days of minutes
+ return Math.max(10080, getEnergyCostPerMinute() * 60 * 24 * 7);
+ }
+
+ public int getEnergyCostPerMinute()
+ {
+ return (getSize() * getClaimCount());
+ }
+
+ public int getEnergyPurchasableMinutes()
+ {
+ return getEnergyPurchasable() / getEnergyCostPerMinute();
+ }
+
+ public int getEnergyPurchasable()
+ {
+ return Math.max(getEnergyMax() - getEnergy(), 0);
+ }
+
+ public List getOnlinePlayers()
+ {
+ ArrayList players = new ArrayList(_onlinePlayers.size());
+ for (UUID uuid : _onlinePlayers)
+ {
+ players.add(UtilPlayer.searchExact(uuid));
+ }
+ return players;
+ }
+
+ public Player[] getOnlinePlayersArray()
+ {
+ Player[] players = new Player[_onlinePlayers.size()];
+ for (int i = 0; i < _onlinePlayers.size(); i++)
+ {
+ players[i] = UtilPlayer.searchExact(_onlinePlayers.get(i));
+ }
+ return players;
+ }
+
+ public int getOnlinePlayerCount()
+ {
+ return _onlinePlayers.size();
+ }
+
+ public void playerOnline(Player player)
+ {
+ ClansPlayer clansPlayer = _memberMap.get(player.getUniqueId());
+
+ _onlinePlayers.add(player.getUniqueId());
+ clansPlayer.setPlayerName(player.getName());
+ clansPlayer.setOnline(true);
+ }
+
+ public void playerOnline(String player)
+ {
+ Player p = UtilPlayer.searchExact(player);
+ if (p != null) playerOnline(p);
+ }
+
+ public void playerOffline(String player)
+ {
+ Player p = UtilPlayer.searchExact(player);
+ if (p != null) playerOffline(p);
+ }
+
+ @Override
+ public String toString()
+ {
+ return _id + "," + _name;
+ }
+
+ public void playerOffline(Player player)
+ {
+ ClansPlayer clansPlayer = _memberMap.get(player.getUniqueId());
+
+ if (clansPlayer != null)
+ {
+ clansPlayer.setOnline(false);
+ }
+
+ _onlinePlayers.remove(player.getUniqueId());
+ }
+
+ public Set getMemberNameSet()
+ {
+ HashSet set = new HashSet();
+
+ for (ClansPlayer cp : _memberMap.values())
+ {
+ set.add(cp.getPlayerName());
+ }
+
+ return set;
+ }
+
+ public ClansPlayer getClansPlayerFromName(String playerName)
+ {
+ for (ClansPlayer cp : _memberMap.values())
+ {
+ if (cp.getPlayerName().equals(playerName))
+ return cp;
+ }
+
+ return null;
+ }
+
+ public String getBedStatusStr()
+ {
+ return _bedStatus == BedStatus.DESTROYED ? C.cRed + "Destroyed" : (_bedStatus == BedStatus.DOESNT_EXIST ? C.cWhite + "None" : (_bedStatus == BedStatus.EXISTS_AND_OBSTRUCTED ? C.cRed + "Obstructed" : (_bedStatus == BedStatus.EXISTS_AND_UNOBSTRUCTED ? C.cGreen + UtilWorld.locToStrClean(_home) : "N/A")));
+ }
+
+ public void left(String name)
+ {
+ _recentlyLeft.put(name, System.currentTimeMillis());
+ }
+}
diff --git a/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanRole.java b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanRole.java
new file mode 100644
index 00000000..d7eb15b5
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanRole.java
@@ -0,0 +1,31 @@
+package mineplex.game.clans.clans;
+
+public enum ClanRole
+{
+ NONE(0, "None"), RECRUIT(100, "Recruit"), MEMBER(500, "Member"), ADMIN(1000, "Admin"), LEADER(Integer.MAX_VALUE, "Leader");
+
+ private int _powerValue;
+ private String _friendlyName;
+
+ ClanRole(int powerValue, String friendlyName)
+ {
+ _powerValue = powerValue;
+ _friendlyName = friendlyName;
+ }
+
+ public boolean has(ClanRole role)
+ {
+ return getPowerValue() >= role.getPowerValue();
+ }
+
+ public String getFriendlyName()
+ {
+ return _friendlyName;
+ }
+
+ public int getPowerValue()
+ {
+ return _powerValue;
+ }
+}
+
diff --git a/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanTips.java b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanTips.java
new file mode 100644
index 00000000..c89a9ff9
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClanTips.java
@@ -0,0 +1,256 @@
+package mineplex.game.clans.clans;
+
+import mineplex.core.MiniPlugin;
+import mineplex.core.common.util.C;
+import mineplex.core.common.util.F;
+import mineplex.core.common.util.UtilBlock;
+import mineplex.core.common.util.UtilPlayer;
+import mineplex.core.common.util.UtilServer;
+import mineplex.core.preferences.Preference;
+import mineplex.core.preferences.PreferencesManager;
+import mineplex.game.clans.clans.event.ClanTipEvent;
+import mineplex.game.clans.clans.event.PlayerClaimTerritoryEvent;
+import mineplex.game.clans.clans.event.PlayerEnterTerritoryEvent;
+import mineplex.game.clans.clans.event.PlayerUnClaimTerritoryEvent;
+import net.minecraft.server.v1_8_R3.EnumDirection;
+import org.bukkit.block.BlockFace;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.plugin.java.JavaPlugin;
+
+import java.util.LinkedList;
+
+public class ClanTips extends MiniPlugin
+{
+ private PreferencesManager _preferences;
+ private ClansManager _clans;
+
+ public ClanTips(final JavaPlugin plugin, final ClansManager clans, final PreferencesManager preferences)
+ {
+ super("Clans Tips", plugin);
+
+ _clans = clans;
+ _preferences = preferences;
+ }
+
+ @EventHandler
+ public void onEnterTerritory(final PlayerEnterTerritoryEvent event)
+ {
+ if (event.getLastTerritory().equals(event.getNewTerritory()))
+ {
+ return;
+ }
+
+ final Player player = event.getPlayer();
+ final String newTerritory = event.getNewTerritory();
+
+ if (_preferences.get(player).isActive(Preference.CLAN_TIPS))
+ {
+ if (newTerritory.equals("Fields"))
+ {
+ displayTip(TipType.ENTER_FIELDS, player);
+ }
+ else if (newTerritory.equals("Shop") && event.isSafe())
+ {
+ displayTip(TipType.ENTER_SHOP, player);
+ }
+ else if (newTerritory.equals("Borderlands"))
+ {
+ displayTip(TipType.ENTER_BORDERLANDS, player);
+ }
+ else if (newTerritory.equals("Spawn"))
+ {
+ displayTip(TipType.ENTER_SPAWN, player);
+ }
+ }
+ }
+
+ @EventHandler
+ public void onClaimTerritory(final PlayerClaimTerritoryEvent event)
+ {
+ if (event.getClan().getClaimCount() == 0)
+ {
+ displayTip(TipType.FIRST_CLAIM_SETHOME, event.getClaimer());
+
+ // Place New
+ boolean bedPlaced = UtilBlock.placeBed(event.getClaimer().getLocation(), BlockFace.valueOf(EnumDirection.fromAngle(event.getClaimer().getLocation().getYaw()).name()), true, true);
+
+ if (!bedPlaced)
+ {
+ UtilPlayer.message(event.getClaimer(), F.main("Clans", "This is not a suitable place for a bed."));
+ return;
+ }
+
+ // Cleanup old
+ if (event.getClan().getHome() != null)
+ {
+ System.out.println("<-old bed cleanup-> <--> " + UtilBlock.deleteBed(event.getClan().getHome()));
+ }
+
+ // Task
+ _clans.getClanDataAccess().setHome(event.getClan(), event.getClaimer().getLocation(), event.getClaimer().getName());
+
+ return;
+ }
+ displayTip(TipType.CLAIM, event.getClaimer());
+ }
+
+ @EventHandler
+ public void onUnClaimTerritory(final PlayerUnClaimTerritoryEvent event)
+ {
+ displayTip(TipType.UNCLAIM, event.getUnClaimer());
+ }
+
+ public void displayTip(TipType tip, Player player)
+ {
+ if (tip == null)
+ {
+ return;
+ }
+
+ if (player == null)
+ {
+ return;
+ }
+
+ if (!_preferences.get(player).isActive(Preference.CLAN_TIPS) && !tip._ignorePreferences)
+ {
+ return;
+ }
+
+ ClanTipEvent event = new ClanTipEvent(tip, player);
+
+ UtilServer.getServer().getPluginManager().callEvent(event);
+
+ if (event.isCancelled())
+ {
+ return;
+ }
+
+ UtilPlayer.message(player, " ");
+ UtilPlayer.message(player, tip._messages);
+
+ if (!tip._ignorePreferences)
+ {
+ UtilPlayer.message(player, C.cGray + "(You can disable these Clans Tips in the " + F.elem("/prefs") + " menu.)");
+ }
+
+ UtilPlayer.message(player, " ");
+ }
+
+ public static enum TipType
+ {
+ UNCLAIM(
+ new String[] {
+ C.cDAquaB + "You unclaimed some Clan Territory!",
+ C.cAqua + "When territory is unclaimed, it cannot be reclaimed by anyone for 30 minutes."
+ }),
+
+ CLAIM(
+ new String[] {
+ C.cDAquaB + "You claimed some Clan Territory!",
+ C.cAqua + "Clan Territory is an area of the map that only your Clan is allowed to edit! This means that you can build a base and stash your loot safely inside.",
+ C.cAqua + "Each territory is a 16x16 area, which extends from bedrock to the sky!", C.cGreen + "The borders are marked with glowstone."
+ }),
+
+ ENTER_FIELDS(
+ new String[] {
+ C.cDRedB + "Fields",
+ C.cRed + "Fields is a very lucrative area, filled with ores that periodically respawn over time. This is a great place to get a large amount of resources for your clan; however, be aware of other clans who may also be after the riches buried within the fields."
+ }),
+
+ ENTER_SHOP(
+ new String[] {
+ C.cDGreenB + "Shops",
+ C.cGreen + "Shops is a safe area where combat is disabled between players! Use this safety to purchase food, building blocks, armor, weapons, and other valuable resources. Be careful when leaving though, others may be hiding just outside the gates, eager to steal your recent purchases."
+ }),
+
+ ENTER_BORDERLANDS(
+ new String[] {
+ C.cDRedB + "Borderlands",
+ C.cRed + "The Borderlands are the very outer reaches of the map, out here you can not edit the terrain. Be careful as very powerful boss monsters will periodically spawn out here! Don't try to fight them alone! If you do manage to slay one of these powerful beasts, you'll be handsomely rewarded with powerful gear or legendary weapons."
+ }),
+
+ ENTER_SPAWN(
+ new String[] {
+ C.cDGreenB + "Spawn",
+ C.cGreen + "Spawn is a Safe Zone where you spawn after dying. No one can attack you here, and you cannot attack anyone else. If you have set your Clan Home, you are able to teleport to it from Spawns."
+ }),
+
+ FIRST_CLAIM_SETHOME(
+ new String[] {
+ C.cDAquaB + "First Claim",
+ C.cAqua + "Congratulations on your first Clan Claim.",
+ C.cAqua + "We have automatically placed your Clan Home where you are currently standing.",
+ C.cAqua + "In the future, to set your Clan Home elsewhere, use the " + F.elem("/c sethome") + " command.",
+ C.cAqua + "You can return to your Clan Home by using " + F.elem("/c home") + C.cAqua + ", but remember, you must be in a Safe Spawn location to do this.",
+ C.cAqua + "When you die and respawn, you are also given an option to spawn at your Clan Home."
+ }),
+
+ DOMINANCE_RIP(
+ new String[] {
+ C.cDAquaB + "Lost War Point",
+ C.cAqua + "You were killed by another Clan and they have gained 1 War Point against you.",
+ C.cAqua + "If your War Points with them reaches -25, they will get to besiege your Territory, giving them access to cannon it for 30 minutes."
+ }),
+
+ DOMINANCE_NOOICE(
+ new String[] {
+ C.cDAquaB + "Gained War Point",
+ C.cAqua + "You killed someone in another Clan and you have gained 1 War Point against them.",
+ C.cAqua + "If your War Points with them reaches +25, you will get to besiege their Territory, giving you access to cannon it for 30 minutes."
+ }),
+
+ ENERGY(
+ new String[] {
+ C.cDAquaB + "Energy",
+ C.cAqua + "To top up your energy, go to the Shop and buy some in the Energy Shop.",
+ C.cAqua + "To find the Shop, look at your map (use " + C.cYellow + "/map" + C.cAqua + " if you don't have one) and go to either the top-most highlighted area, or the bottom-most highlighted area.",
+ }),
+
+ NPC_RIPPARONI(
+ new String[] {
+ C.cDAqua + "Logout NPC",
+ C.cAqua + "When you quit Clans, a copy of you will remain in the game for 30 seconds. Other players are able to kill this copy and take your items. Make sure you quit somewhere safe!",
+ }),
+
+ SETHOME(
+ new String[] {
+ C.cDAqua + "Clan Home",
+ C.cAqua + "Your Clan Home is a bed in your Territory which you can teleport to from the Spawn Islands. However, you are unable to teleport to your Clan Home if the bed is broken, blocks have been placed above the bed, or enemies are in your Territory."
+ }),
+ MOUNT_CANNON(
+ new String[] {
+ C.cDAqua + "Meownon",
+ C.cAqua + "Congratulations on your new purchase! You are now in possesion, of the one, and only, Meownon 3000.24! " + C.Italics + "we are not responsible for any injuries caused by the meownon, or any related products. stay safe kids."
+ }),
+ ENTER_NETHER(
+ new String[] {
+ C.cDRedB + "The Nether",
+ C.cRed + "The Nether is a dangerous place full of powerful mobs and hazardous terrain! However, the mobs here drop powerful Ancient Runes, which can be used to strengthen your gear, making your clan even more fearsome than before!"
+ }),
+ ;
+
+ // this is only LinkedList because UtilPlayer.message wants it
+ private LinkedList _messages;
+ private boolean _ignorePreferences;
+
+ TipType(String[] messages)
+ {
+ this(messages, false);
+ }
+
+ TipType(String[] messages, boolean ignorePreferences)
+ {
+ _messages = new LinkedList<>();
+
+ for (String message : messages)
+ {
+ _messages.add(message);
+ }
+
+ _ignorePreferences = ignorePreferences;
+ }
+ }
+
+}
diff --git a/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansAdmin.java b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansAdmin.java
new file mode 100644
index 00000000..bf810210
--- /dev/null
+++ b/Plugins[Modified]/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansAdmin.java
@@ -0,0 +1,963 @@
+package mineplex.game.clans.clans;
+
+import java.util.ArrayList;
+
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.entity.Player;
+
+import mineplex.core.account.permissions.Permission;
+import mineplex.core.account.permissions.PermissionGroup;
+import mineplex.core.common.util.C;
+import mineplex.core.common.util.Callback;
+import mineplex.core.common.util.F;
+import mineplex.core.common.util.UtilInput;
+import mineplex.core.common.util.UtilPlayer;
+import mineplex.core.common.util.UtilPlayerBase;
+import mineplex.core.common.util.UtilServer;
+import mineplex.core.common.util.UtilWorld;
+import mineplex.core.slack.SlackAPI;
+import mineplex.core.slack.SlackMessage;
+import mineplex.core.slack.SlackTeam;
+import mineplex.game.clans.core.ClaimLocation;
+import mineplex.game.clans.core.repository.ClanTerritory;
+import mineplex.game.clans.core.repository.tokens.ClanToken;
+import mineplex.game.clans.core.war.ClanWarData;
+
+public class ClansAdmin
+{
+ public enum Perm implements Permission
+ {
+ USE_ADMIN_COMMANDS,
+ }
+
+ private ClansManager Clans;
+
+ public ClansAdmin(ClansManager clans)
+ {
+ Clans = clans;
+
+ generatePermissions();
+ }
+
+ private void generatePermissions()
+ {
+ PermissionGroup.ADMIN.setPermission(Perm.USE_ADMIN_COMMANDS, true, true);
+ PermissionGroup.CMOD.setPermission(Perm.USE_ADMIN_COMMANDS, false, true);
+ }
+
+ public void command(Player caller, String[] args)
+ {
+ if (!Clans.getClientManager().Get(caller).hasPermission(Perm.USE_ADMIN_COMMANDS) && !caller.isOp())
+ {
+ UtilPlayerBase.message(caller, C.mHead + "Permissions> " + C.mBody + "You do not have permission to do that.");
+ return;
+ }
+
+ if (!UtilServer.isTestServer())
+ {
+ StringBuilder cmd = new StringBuilder("/c");
+ for (String a : args)
+ {
+ cmd.append(" ").append(a);
+ }
+ for (int i = 0; i < cmd.length(); i++)
+ {
+ if (cmd.charAt(i) == '`')
+ {
+ cmd.setCharAt(i, '\'');
+ }
+ }
+ SlackAPI.getInstance().sendMessage(SlackTeam.DEVELOPER, "#clans-commandspy",
+ new SlackMessage("Clans Command Logger", "crossed_swords", caller.getName() + " has issued command `" + cmd.toString() + "` on " + UtilServer.getServerName() + "."),
+ true);
+ }
+
+ if (args.length == 1)
+ help(caller);
+
+ else if (args[1].equalsIgnoreCase("help") || args[1].equalsIgnoreCase("h"))
+ help(caller);
+
+ else if (args[1].equalsIgnoreCase("set") || args[1].equalsIgnoreCase("mimic"))
+ setMimic(caller, args);
+
+ else if (args[1].equalsIgnoreCase("create"))
+ create(caller, args);
+
+ else if (args[1].equalsIgnoreCase("disband") || args[1].equalsIgnoreCase("delete") || args[1].equalsIgnoreCase("d"))
+ delete(caller, args);
+
+ else if (args[1].equalsIgnoreCase("invite") || args[1].equalsIgnoreCase("i"))
+ invite(caller, args);
+
+ else if (args[1].equalsIgnoreCase("promote"))
+ promote(caller, args);
+
+ else if (args[1].equalsIgnoreCase("demote"))
+ demote(caller, args);
+
+ else if (args[1].equalsIgnoreCase("kick") || args[1].equalsIgnoreCase("k"))
+ kick(caller, args);
+
+ else if (args[1].equalsIgnoreCase("ally") || args[1].equalsIgnoreCase("a"))
+ ally(caller, args);
+
+// else if (args[1].equalsIgnoreCase("trust"))
+// trust(caller, args);
+
+ else if (args[0].equalsIgnoreCase("neutral") || args[0].equalsIgnoreCase("neut") || args[0].equalsIgnoreCase("n"))
+ neutral(caller, args);
+
+ else if (args[1].equalsIgnoreCase("claim") || args[1].equalsIgnoreCase("c"))
+ claim(caller);
+
+ else if (args[1].equalsIgnoreCase("unclaim") || args[1].equalsIgnoreCase("uc"))
+ unclaim(caller, args);
+
+ else if (args[1].equalsIgnoreCase("home") || args[1].equalsIgnoreCase("h"))
+ home(caller, args);
+
+ else if (args[1].equalsIgnoreCase("safe"))
+ safe(caller);
+
+ else if (args[1].equalsIgnoreCase("autoclaim"))
+ autoclaim(caller);
+
+ else if (args[1].equalsIgnoreCase("wp"))
+ wp(caller, args);
+
+ else if (args[1].equalsIgnoreCase("rename"))
+ rename(caller, args);
+
+ else if (args[1].equalsIgnoreCase("timer"))
+ resetTime(caller, args);
+
+ else
+ help(caller);
+ }
+
+ private void help(Player caller)
+ {
+ UtilPlayer.message(caller, F.main("Clans Admin", "Admin Commands List;"));
+
+ UtilPlayer.message(caller, F.help("/c x create ", "Create Admin Clan", ChatColor.GOLD));
+
+ UtilPlayer.message(caller, F.help("/c x set ", "Set Mimic Clan", ChatColor.GOLD));
+ UtilPlayer.message(caller, F.help("/c x wp [remove/set/add] ", "Modify war points", ChatColor.GOLD));
+
+ UtilPlayer.message(caller, F.help("/c x home (set)", "Teleport to Mimic Home", ChatColor.GOLD));
+ UtilPlayer.message(caller, F.help("/c x invite