aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me/Danker/commands
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/me/Danker/commands')
-rw-r--r--src/main/java/me/Danker/commands/ArmourCommand.java150
-rw-r--r--src/main/java/me/Danker/commands/BankCommand.java115
-rw-r--r--src/main/java/me/Danker/commands/DHelpCommand.java52
-rw-r--r--src/main/java/me/Danker/commands/DisplayCommand.java108
-rw-r--r--src/main/java/me/Danker/commands/GetkeyCommand.java41
-rw-r--r--src/main/java/me/Danker/commands/GuildOfCommand.java116
-rw-r--r--src/main/java/me/Danker/commands/ImportFishingCommand.java233
-rw-r--r--src/main/java/me/Danker/commands/LootCommand.java533
-rw-r--r--src/main/java/me/Danker/commands/MoveCommand.java69
-rw-r--r--src/main/java/me/Danker/commands/PetsCommand.java247
-rw-r--r--src/main/java/me/Danker/commands/ReloadConfigCommand.java36
-rw-r--r--src/main/java/me/Danker/commands/ResetLootCommand.java181
-rw-r--r--src/main/java/me/Danker/commands/ScaleCommand.java70
-rw-r--r--src/main/java/me/Danker/commands/SetkeyCommand.java43
-rw-r--r--src/main/java/me/Danker/commands/SkillsCommand.java334
-rw-r--r--src/main/java/me/Danker/commands/SlayerCommand.java112
-rw-r--r--src/main/java/me/Danker/commands/ToggleCommand.java83
17 files changed, 2523 insertions, 0 deletions
diff --git a/src/main/java/me/Danker/commands/ArmourCommand.java b/src/main/java/me/Danker/commands/ArmourCommand.java
new file mode 100644
index 0000000..255825c
--- /dev/null
+++ b/src/main/java/me/Danker/commands/ArmourCommand.java
@@ -0,0 +1,150 @@
+package me.Danker.commands;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Base64;
+import java.util.Collections;
+import java.util.List;
+
+import com.google.gson.JsonObject;
+
+import me.Danker.handlers.APIHandler;
+import me.Danker.handlers.ConfigHandler;
+import me.Danker.utils.Utils;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.CommandException;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.nbt.CompressedStreamTools;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+
+public class ArmourCommand extends CommandBase {
+
+ @Override
+ public String getCommandName() {
+ return "armor";
+ }
+
+ @Override
+ public List<String> getCommandAliases()
+ {
+ return Collections.singletonList("armour");
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender arg0) {
+ return getCommandName() + " [name]";
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public List<String> addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) {
+ if (args.length == 1) {
+ return Utils.getMatchingPlayers(args[0]);
+ }
+ return null;
+ }
+
+ @Override
+ public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException {
+ // MULTI THREAD DRIFTING
+ new Thread(() -> {
+ APIHandler ah = new APIHandler();
+ ConfigHandler cf = new ConfigHandler();
+ EntityPlayer player = (EntityPlayer) arg0;
+
+ // Check key
+ String key = cf.getString("api", "APIKey");
+ if (key.equals("")) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "API key not set. Use /setkey."));
+ }
+
+ // Get UUID for Hypixel API requests
+ String username;
+ String uuid;
+ if (arg1.length == 0) {
+ username = player.getName();
+ uuid = player.getUniqueID().toString().replaceAll("[\\-]", "");
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Checking armour of " + EnumChatFormatting.DARK_GREEN + username));
+ } else {
+ username = arg1[0];
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Checking armour of " + EnumChatFormatting.DARK_GREEN + username));
+ uuid = ah.getUUID(username);
+ }
+
+ // Find stats of latest profile
+ String latestProfile = ah.getLatestProfileID(uuid, key);
+ if (latestProfile == null) return;
+
+ String profileURL = "https://api.hypixel.net/skyblock/profile?profile=" + latestProfile + "&key=" + key;
+ System.out.println("Fetching profile...");
+ JsonObject profileResponse = ah.getResponse(profileURL);
+ if (!profileResponse.get("success").getAsBoolean()) {
+ String reason = profileResponse.get("cause").getAsString();
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Failed with reason: " + reason));
+ return;
+ }
+
+ String armourBase64 = profileResponse.get("profile").getAsJsonObject().get("members").getAsJsonObject().get(uuid).getAsJsonObject().get("inv_armor").getAsJsonObject().get("data").getAsString();
+ InputStream armourStream = new ByteArrayInputStream(Base64.getDecoder().decode(armourBase64));
+ // String armourDecodedGZIP = new String(Base64.getDecoder().decode(armourBase64));
+
+ try {
+ NBTTagCompound armour = CompressedStreamTools.readCompressed(armourStream);
+ NBTTagList armourList = armour.getTagList("i", 10);
+
+ String helmet = EnumChatFormatting.RED + "None";
+ String chest = EnumChatFormatting.RED + "None";
+ String legs = EnumChatFormatting.RED + "None";
+ String boots = EnumChatFormatting.RED + "None";
+ // Loop through armour
+ for (int i = 0; i < armourList.tagCount(); i++) {
+ NBTTagCompound armourPiece = armourList.getCompoundTagAt(i);
+ if (armourPiece.hasNoTags()) continue;
+
+ String armourPieceName = armourPiece.getCompoundTag("tag").getCompoundTag("display").getString("Name");
+ // NBT is served boots -> helmet
+ switch (i) {
+ case 0:
+ boots = armourPieceName;
+ break;
+ case 1:
+ legs = armourPieceName;
+ break;
+ case 2:
+ chest = armourPieceName;
+ break;
+ case 3:
+ helmet = armourPieceName;
+ break;
+ default:
+ System.err.println("An error has occurred.");
+ break;
+ }
+ }
+ armourStream.close();
+
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.AQUA + "" + EnumChatFormatting.BOLD + "-------------------\n" +
+ EnumChatFormatting.AQUA + " " + username + "'s Armour:\n" +
+ EnumChatFormatting.GREEN + " Helmet: " + helmet + "\n" +
+ EnumChatFormatting.GREEN + " Chestplate: " + chest + "\n" +
+ EnumChatFormatting.GREEN + " Leggings: " + legs + "\n" +
+ EnumChatFormatting.GREEN + " Boots: " + boots + "\n" +
+ EnumChatFormatting.AQUA + " " + EnumChatFormatting.BOLD + "-------------------"));
+ } catch (IOException ex) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "An error has occurred while reading inventory data. See logs for more info."));
+ System.err.println(ex);
+ }
+ }).start();
+ }
+
+}
diff --git a/src/main/java/me/Danker/commands/BankCommand.java b/src/main/java/me/Danker/commands/BankCommand.java
new file mode 100644
index 0000000..e32e66f
--- /dev/null
+++ b/src/main/java/me/Danker/commands/BankCommand.java
@@ -0,0 +1,115 @@
+package me.Danker.commands;
+
+import java.text.NumberFormat;
+import java.util.Collections;
+import java.util.List;
+
+import com.google.gson.JsonObject;
+
+import me.Danker.handlers.APIHandler;
+import me.Danker.handlers.ConfigHandler;
+import me.Danker.utils.Utils;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.CommandException;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+
+public class BankCommand extends CommandBase {
+
+ @Override
+ public String getCommandName() {
+ return "bank";
+ }
+
+ @Override
+ public List<String> getCommandAliases()
+ {
+ return Collections.singletonList("purse");
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender arg0) {
+ return getCommandName() + " [name]";
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public List<String> addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) {
+ if (args.length == 1) {
+ return Utils.getMatchingPlayers(args[0]);
+ }
+ return null;
+ }
+
+ @Override
+ public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException {
+ // MULTI THREAD DRIFTING
+ new Thread(() -> {
+ APIHandler ah = new APIHandler();
+ ConfigHandler cf = new ConfigHandler();
+ EntityPlayer player = (EntityPlayer) arg0;
+
+ // Check key
+ String key = cf.getString("api", "APIKey");
+ if (key.equals("")) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "API key not set. Use /setkey."));
+ }
+
+ // Get UUID for Hypixel API requests
+ String username;
+ String uuid;
+ if (arg1.length == 0) {
+ username = player.getName();
+ uuid = player.getUniqueID().toString().replaceAll("[\\-]", "");
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Checking coins of " + EnumChatFormatting.DARK_GREEN + username));
+ } else {
+ username = arg1[0];
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Checking coins of " + EnumChatFormatting.DARK_GREEN + username));
+ uuid = ah.getUUID(username);
+ }
+
+ // Find stats of latest profile
+ String latestProfile = ah.getLatestProfileID(uuid, key);
+ if (latestProfile == null) return;
+
+ String profileURL = "https://api.hypixel.net/skyblock/profile?profile=" + latestProfile + "&key=" + key;
+ System.out.println("Fetching profile...");
+ JsonObject profileResponse = ah.getResponse(profileURL);
+ if (!profileResponse.get("success").getAsBoolean()) {
+ String reason = profileResponse.get("cause").getAsString();
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Failed with reason: " + reason));
+ return;
+ }
+
+ System.out.println("Fetching bank + purse coins...");
+ double purseCoins = profileResponse.get("profile").getAsJsonObject().get("members").getAsJsonObject().get(uuid).getAsJsonObject().get("coin_purse").getAsDouble();
+ purseCoins = (double) Math.floor(purseCoins * 100.0) / 100.0;
+
+ // Check for bank api
+ if (profileResponse.get("profile").getAsJsonObject().has("banking")) {
+ double bankCoins = profileResponse.get("profile").getAsJsonObject().get("banking").getAsJsonObject().get("balance").getAsDouble();
+ bankCoins = (double) Math.floor(bankCoins * 100.0) / 100.0;
+
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.AQUA + "" + EnumChatFormatting.BOLD + "-------------------\n" +
+ EnumChatFormatting.AQUA + " " + username + "'s Coins:\n" +
+ EnumChatFormatting.GREEN + " Bank: " + EnumChatFormatting.GOLD + NumberFormat.getInstance().format(bankCoins) + "\n" +
+ EnumChatFormatting.GREEN + " Purse: " + EnumChatFormatting.GOLD + NumberFormat.getInstance().format(purseCoins) + "\n" +
+ EnumChatFormatting.AQUA + " " + EnumChatFormatting.BOLD + "-------------------"));
+ } else {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.AQUA + "" + EnumChatFormatting.BOLD + "-------------------\n" +
+ EnumChatFormatting.AQUA + " " + username + "'s Coins:\n" +
+ EnumChatFormatting.GREEN + " Bank: " + EnumChatFormatting.RED + "Bank API disabled.\n" +
+ EnumChatFormatting.GREEN + " Purse: " + EnumChatFormatting.GOLD + NumberFormat.getInstance().format(purseCoins) + "\n" +
+ EnumChatFormatting.AQUA + " " + EnumChatFormatting.BOLD + "-------------------"));
+ }
+ }).start();
+ }
+
+}
diff --git a/src/main/java/me/Danker/commands/DHelpCommand.java b/src/main/java/me/Danker/commands/DHelpCommand.java
new file mode 100644
index 0000000..9ca6a6e
--- /dev/null
+++ b/src/main/java/me/Danker/commands/DHelpCommand.java
@@ -0,0 +1,52 @@
+package me.Danker.commands;
+
+import me.Danker.TheMod;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.CommandException;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+
+public class DHelpCommand extends CommandBase {
+
+ @Override
+ public String getCommandName() {
+ return "dhelp";
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender arg0) {
+ return getCommandName();
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException {
+ EntityPlayer player = (EntityPlayer) arg0;
+
+ player.addChatMessage(new ChatComponentText("\n" + EnumChatFormatting.GOLD + " " + TheMod.MODID + " Version " + TheMod.VERSION + "\n" +
+ EnumChatFormatting.AQUA + " <> = Mandatory parameter. [] = Optional parameter.\n" +
+ EnumChatFormatting.GOLD + " /dhelp" + EnumChatFormatting.AQUA + " - Returns this message.\n" +
+ EnumChatFormatting.GOLD + " /toggle <gparty/coords/golden/slayercount/list>" + EnumChatFormatting.AQUA + " - Toggles features. /toggle list returns values of every toggle.\n" +
+ EnumChatFormatting.GOLD + " /setkey <key>" + EnumChatFormatting.AQUA + " - Sets API key.\n" +
+ EnumChatFormatting.GOLD + " /getkey" + EnumChatFormatting.AQUA + " - Returns key set with /setkey.\n" +
+ EnumChatFormatting.GOLD + " /loot <zombie/spider/wolf/fishing> [winter/session]" + EnumChatFormatting.AQUA + " - Returns loot received from slayer quests or fishing stats. /loot fishing winter returns winter sea creatures instead.\n" +
+ EnumChatFormatting.GOLD + " /display <zombie/spider/wolf/fishing/off> [winter/session]" + EnumChatFormatting.AQUA + " - Text display for trackers. /display fishing winter displays winter sea creatures instead.\n" +
+ EnumChatFormatting.GOLD + " /resetloot <zombie/spider/wolf/fishing/confirm/cancel>" + EnumChatFormatting.AQUA + " - Resets loot for trackers. /resetloot confirm confirms the reset.\n" +
+ EnumChatFormatting.GOLD + " /move <coords/display> <x> <y>" + EnumChatFormatting.AQUA + " - Moves text display to specified X and Y coordinates.\n" +
+ EnumChatFormatting.GOLD + " /scale <coords/display> <scale (0.1 - 10)" + EnumChatFormatting.AQUA + " - Scales text display to a specified multipler between 0.1x and 10x.\n" +
+ EnumChatFormatting.GOLD + " /slayer [player]" + EnumChatFormatting.AQUA + " - Uses API to get slayer xp of a person. If no name is provided, it checks yours.\n" +
+ EnumChatFormatting.GOLD + " /skills [player]" + EnumChatFormatting.AQUA + " - Uses API to get skill levels of a person. If no name is provided, it checks yours.\n" +
+ EnumChatFormatting.GOLD + " /guildof [player]" + EnumChatFormatting.AQUA + " - Uses API to get guild name and guild master of a person. If no name is provided, it checks yours.\n" +
+ EnumChatFormatting.GOLD + " /petsof [player]" + EnumChatFormatting.AQUA + " - Uses API to get pets of a person. If no name is provided, it checks yours.\n" +
+ EnumChatFormatting.GOLD + " /bank [player]" + EnumChatFormatting.AQUA + " - Uses API to get bank and purse coins of a person. If no name is provided, it checks yours.\n" +
+ EnumChatFormatting.GOLD + " /armor [player]" + EnumChatFormatting.AQUA + " - Uses API to get armour of a person. If no name is provided, it checks yours.\n" +
+ EnumChatFormatting.GOLD + " /importfishing" + EnumChatFormatting.AQUA + " - Imports your fishing stats from your latest profile to your fishing tracker using the API.\n"));
+ }
+
+}
diff --git a/src/main/java/me/Danker/commands/DisplayCommand.java b/src/main/java/me/Danker/commands/DisplayCommand.java
new file mode 100644
index 0000000..916245e
--- /dev/null
+++ b/src/main/java/me/Danker/commands/DisplayCommand.java
@@ -0,0 +1,108 @@
+package me.Danker.commands;
+
+import java.util.List;
+
+import me.Danker.handlers.ConfigHandler;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.CommandException;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+
+public class DisplayCommand extends CommandBase {
+ public static String display;
+
+ @Override
+ public String getCommandName() {
+ return "display";
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender arg0) {
+ return getCommandName() + " <zombie/spider/wolf/fishing/off> [winter/session]";
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public List<String> addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) {
+ if (args.length == 1) {
+ return getListOfStringsMatchingLastWord(args, "wolf", "spider", "zombie", "fishing", "off");
+ } else if (args.length == 2 && args[0].equalsIgnoreCase("fishing")) {
+ return getListOfStringsMatchingLastWord(args, "winter", "session");
+ } else if (args.length == 2 || (args.length == 3 && args[0].equalsIgnoreCase("fishing") && args[1].equalsIgnoreCase("winter"))) {
+ return getListOfStringsMatchingLastWord(args, "session");
+ }
+ return null;
+ }
+
+ @Override
+ public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException {
+ final EntityPlayer player = (EntityPlayer) arg0;
+
+ if (arg1.length == 0) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /display <zombie/spider/wolf/fishing/off> [winter/session]"));
+ return;
+ }
+
+ final ConfigHandler cf = new ConfigHandler();
+ boolean showSession = false;
+
+ if (arg1.length > 1) {
+ if (arg1[1].equalsIgnoreCase("session")) {
+ showSession = true;
+ } else if (arg1.length > 2) {
+ if (arg1[2].equalsIgnoreCase("session")) {
+ showSession = true;
+ }
+ }
+ }
+
+ if (arg1[0].equalsIgnoreCase("wolf")) {
+ if (showSession) {
+ display = "wolf_session";
+ } else {
+ display = "wolf";
+ }
+ } else if (arg1[0].equalsIgnoreCase("spider")) {
+ if (showSession) {
+ display = "spider_session";
+ } else {
+ display = "spider";
+ }
+ } else if (arg1[0].equalsIgnoreCase("zombie")) {
+ if (showSession) {
+ display = "zombie_session";
+ } else {
+ display = "zombie";
+ }
+ } else if (arg1[0].equalsIgnoreCase("fishing")) {
+ if (arg1.length > 1 && arg1[1].equalsIgnoreCase("winter")) {
+ if (showSession) {
+ display = "fishing_winter_session";
+ } else {
+ display = "fishing_winter";
+ }
+ } else {
+ if (showSession) {
+ display = "fishing_session";
+ } else {
+ display = "fishing";
+ }
+ }
+ } else if (arg1[0].equalsIgnoreCase("off")) {
+ display = "off";
+ } else {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /display <zombie/spider/wolf/fishing/off> [winter/session]"));
+ return;
+ }
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Display set to " + EnumChatFormatting.DARK_GREEN + display + EnumChatFormatting.GREEN + "."));
+ cf.writeStringConfig("misc", "display", display);
+ }
+
+}
diff --git a/src/main/java/me/Danker/commands/GetkeyCommand.java b/src/main/java/me/Danker/commands/GetkeyCommand.java
new file mode 100644
index 0000000..80354fe
--- /dev/null
+++ b/src/main/java/me/Danker/commands/GetkeyCommand.java
@@ -0,0 +1,41 @@
+package me.Danker.commands;
+
+import me.Danker.handlers.ConfigHandler;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.CommandException;
+import net.minecraft.command.ICommand;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+
+public class GetkeyCommand extends CommandBase implements ICommand {
+
+ @Override
+ public String getCommandName() {
+ return "getkey";
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender arg0) {
+ return getCommandName();
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException {
+ final EntityPlayer player = (EntityPlayer)arg0;
+ final ConfigHandler cf = new ConfigHandler();
+
+ if (cf.getString("api", "APIKey").equals("")) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "API key not set. Set your API key using /setkey."));
+ } else {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Your set API key is " + EnumChatFormatting.DARK_GREEN + cf.getString("api", "APIKey")));
+ }
+ }
+
+}
diff --git a/src/main/java/me/Danker/commands/GuildOfCommand.java b/src/main/java/me/Danker/commands/GuildOfCommand.java
new file mode 100644
index 0000000..238ba81
--- /dev/null
+++ b/src/main/java/me/Danker/commands/GuildOfCommand.java
@@ -0,0 +1,116 @@
+package me.Danker.commands;
+
+import java.util.List;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+
+import me.Danker.handlers.APIHandler;
+import me.Danker.handlers.ConfigHandler;
+import me.Danker.utils.Utils;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.CommandException;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+
+public class GuildOfCommand extends CommandBase {
+
+ @Override
+ public String getCommandName() {
+ return "guildof";
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender arg0) {
+ return getCommandName() + " [name]";
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public List<String> addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) {
+ if (args.length == 1) {
+ return Utils.getMatchingPlayers(args[0]);
+ }
+ return null;
+ }
+
+ @Override
+ public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException {
+ // MULTI THREAD DRIFTING
+ new Thread(() -> {
+ APIHandler ah = new APIHandler();
+ ConfigHandler cf = new ConfigHandler();
+ EntityPlayer player = (EntityPlayer) arg0;
+
+ // Check key
+ String key = cf.getString("api", "APIKey");
+ if (key.equals("")) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "API key not set. Use /setkey."));
+ }
+
+ // Get UUID for Hypixel API requests
+ String username;
+ String uuid;
+ if (arg1.length == 0) {
+ username = player.getName();
+ uuid = player.getUniqueID().toString().replaceAll("[\\-]", "");
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Checking guild of " + EnumChatFormatting.DARK_GREEN + username));
+ } else {
+ username = arg1[0];
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Checking guild of " + EnumChatFormatting.DARK_GREEN + username));
+ uuid = ah.getUUID(username);
+ }
+
+ // Find guild ID
+ System.out.println("Fetching guild...");
+ String guildURL = "https://api.hypixel.net/guild?player=" + uuid + "&key=" + key;
+ JsonObject guildResponse = ah.getResponse(guildURL);
+ if (!guildResponse.get("success").getAsBoolean()) {
+ String reason = guildResponse.get("cause").getAsString();
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Failed with reason: " + reason));
+ return;
+ }
+
+ System.out.println("Fetching guild stats and members...");
+
+ String guildName = "N/A";
+ String guildMaster = "N/A";
+ // Check if player is in guild
+ if (!guildResponse.get("guild").isJsonNull()) {
+ guildName = guildResponse.get("guild").getAsJsonObject().get("name").getAsString();
+
+ // Loop through members to find guildmaster
+ JsonArray guildMembers = guildResponse.get("guild").getAsJsonObject().get("members").getAsJsonArray();
+ for (JsonElement member : guildMembers) {
+ JsonObject memberObject = member.getAsJsonObject();
+ String memberRank = memberObject.get("rank").getAsString();
+
+ if (memberRank.equals("GUILDMASTER") || memberRank.equals("Guild Master")) {
+ // Get username from UUID
+ String gmUUID = memberObject.get("uuid").getAsString();
+ String gmNameURL = "https://api.mojang.com/user/profiles/" + gmUUID + "/names";
+ JsonArray gmNameResponse = ah.getArrayResponse(gmNameURL);
+
+ guildMaster = gmNameResponse.get(gmNameResponse.size() - 1).getAsJsonObject().get("name").getAsString();
+ break;
+ }
+ }
+ }
+
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.AQUA + "" + EnumChatFormatting.BOLD + "-------------------\n" +
+ EnumChatFormatting.AQUA + " " + username + "'s Guild:\n" +
+ EnumChatFormatting.GREEN + " Guild: " + EnumChatFormatting.DARK_GREEN + EnumChatFormatting.BOLD + guildName + "\n" +
+ EnumChatFormatting.GREEN + " Guildmaster: " + EnumChatFormatting.DARK_GREEN + EnumChatFormatting.BOLD + guildMaster + "\n" +
+ EnumChatFormatting.AQUA + " " + EnumChatFormatting.BOLD + "-------------------"));
+ }).start();
+ }
+
+}
diff --git a/src/main/java/me/Danker/commands/ImportFishingCommand.java b/src/main/java/me/Danker/commands/ImportFishingCommand.java
new file mode 100644
index 0000000..bbbcb9f
--- /dev/null
+++ b/src/main/java/me/Danker/commands/ImportFishingCommand.java
@@ -0,0 +1,233 @@
+package me.Danker.commands;
+
+import com.google.gson.JsonObject;
+
+import me.Danker.handlers.APIHandler;
+import me.Danker.handlers.ConfigHandler;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.CommandException;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+
+public class ImportFishingCommand extends CommandBase {
+
+ @Override
+ public String getCommandName() {
+ return "importfishing";
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender arg0) {
+ return getCommandName();
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException {
+ // MULTI THREAD DRIFTING
+ new Thread(() -> {
+ APIHandler ah = new APIHandler();
+ LootCommand lc = new LootCommand();
+ ConfigHandler cf = new ConfigHandler();
+ EntityPlayer player = (EntityPlayer) arg0;
+
+ // Check key
+ String key = cf.getString("api", "APIKey");
+ if (key.equals("")) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "API key not set. Use /setkey."));
+ }
+
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Importing your fishing stats..."));
+
+ // Get UUID for Hypixel API requests
+ String username = player.getName();
+ String uuid = player.getUniqueID().toString().replaceAll("[\\-]", "");
+
+ String latestProfile = ah.getLatestProfileID(uuid, key);
+ if (latestProfile == null) return;
+
+ String profileURL = "https://api.hypixel.net/skyblock/profile?profile=" + latestProfile + "&key=" + key;
+ System.out.println("Fetching profile...");
+ JsonObject profileResponse = ah.getResponse(profileURL);
+ if (!profileResponse.get("success").getAsBoolean()) {
+ String reason = profileResponse.get("cause").getAsString();
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Failed with reason: " + reason));
+ return;
+ }
+
+ System.out.println("Fetching fishing stats...");
+ JsonObject statsObject = profileResponse.get("profile").getAsJsonObject().get("members").getAsJsonObject().get(uuid).getAsJsonObject().get("stats").getAsJsonObject();
+
+ lc.greatCatches = 0;
+ lc.goodCatches = 0;
+ if (statsObject.has("items_fished_treasure")) {
+ if (statsObject.has("items_fished_large_treasure")) {
+ lc.greatCatches = statsObject.get("items_fished_large_treasure").getAsInt();
+ lc.goodCatches = statsObject.get("items_fished_treasure").getAsInt() - lc.greatCatches;
+ } else {
+ lc.goodCatches = statsObject.get("items_fished_treasure").getAsInt();
+ }
+ }
+
+ lc.seaCreatures = 0;
+ lc.squids = 0;
+ if (statsObject.has("kills_pond_squid")) {
+ lc.squids = statsObject.get("kills_pond_squid").getAsInt();
+ }
+ lc.seaCreatures += lc.squids;
+
+ lc.seaWalkers = 0;
+ if (statsObject.has("kills_sea_walker")) {
+ lc.seaWalkers = statsObject.get("kills_sea_walker").getAsInt();
+ }
+ lc.seaCreatures += lc.seaWalkers;
+
+ lc.nightSquids = 0;
+ if (statsObject.has("kills_night_squid")) {
+ lc.nightSquids = statsObject.get("kills_night_squid").getAsInt();
+ }
+ lc.seaCreatures += lc.nightSquids;
+
+ lc.seaGuardians = 0;
+ if (statsObject.has("kills_sea_guardian")) {
+ lc.seaGuardians = statsObject.get("kills_sea_guardian").getAsInt();
+ }
+ lc.seaCreatures += lc.seaGuardians;
+
+ lc.seaWitches = 0;
+ if (statsObject.has("kills_sea_witch")) {
+ lc.seaWitches = statsObject.get("kills_sea_witch").getAsInt();
+ }
+ lc.seaCreatures += lc.seaWitches;
+
+ lc.seaArchers = 0;
+ if (statsObject.has("kills_sea_archer")) {
+ lc.seaArchers = statsObject.get("kills_sea_archer").getAsInt();
+ }
+ lc.seaCreatures += lc.seaArchers;
+
+ lc.monsterOfTheDeeps = 0;
+ if (statsObject.has("kills_zombie_deep")) {
+ if (statsObject.has("kills_chicken_deep")) {
+ lc.monsterOfTheDeeps = statsObject.get("kills_zombie_deep").getAsInt() + statsObject.get("kills_chicken_deep").getAsInt();
+ } else {
+ lc.monsterOfTheDeeps = statsObject.get("kills_zombie_deep").getAsInt();
+ }
+ } else if (statsObject.has("kills_chicken_deep")) {
+ lc.monsterOfTheDeeps = statsObject.get("kills_chicken_deep").getAsInt();
+ }
+ lc.seaCreatures += lc.monsterOfTheDeeps;
+
+ lc.catfishes = 0;
+ if (statsObject.has("kills_catfish")) {
+ lc.catfishes = statsObject.get("kills_catfish").getAsInt();
+ }
+ lc.seaCreatures += lc.catfishes;
+
+ lc.carrotKings = 0;
+ if (statsObject.has("kills_carrot_king")) {
+ lc.carrotKings = statsObject.get("kills_carrot_king").getAsInt();
+ }
+ lc.seaCreatures += lc.carrotKings;
+
+ lc.seaLeeches = 0;
+ if (statsObject.has("kills_sea_leech")) {
+ lc.seaLeeches = statsObject.get("kills_sea_leech").getAsInt();
+ }
+ lc.seaCreatures += lc.seaLeeches;
+
+ lc.guardianDefenders = 0;
+ if (statsObject.has("kills_guardian_defender")) {
+ lc.guardianDefenders = statsObject.get("kills_guardian_defender").getAsInt();
+ }
+ lc.seaCreatures += lc.guardianDefenders;
+
+ lc.deepSeaProtectors = 0;
+ if (statsObject.has("kills_deep_sea_protector")) {
+ lc.deepSeaProtectors = statsObject.get("kills_deep_sea_protector").getAsInt();
+ }
+ lc.seaCreatures += lc.deepSeaProtectors;
+
+ lc.hydras = 0;
+ if (statsObject.has("kills_water_hydra")) {
+ // Hydra splits
+ lc.hydras = statsObject.get("kills_water_hydra").getAsInt() / 2;
+ }
+ lc.seaCreatures += lc.hydras;
+
+ lc.seaEmperors = 0;
+ if (statsObject.has("kills_skeleton_emperor")) {
+ if (statsObject.has("kills_guardian_emperor")) {
+ lc.seaEmperors = statsObject.get("kills_skeleton_emperor").getAsInt() + statsObject.get("kills_guardian_emperor").getAsInt();
+ } else {
+ lc.seaEmperors = statsObject.get("kills_skeleton_emperor").getAsInt();
+ }
+ } else if (statsObject.has("kills_guardian_emperor")) {
+ lc.seaEmperors = statsObject.get("kills_guardian_emperor").getAsInt();
+ }
+ lc.seaCreatures += lc.seaEmperors;
+
+ lc.fishingMilestone = 0;
+ if (statsObject.has("pet_milestone_sea_creatures_killed")) {
+ lc.fishingMilestone = statsObject.get("pet_milestone_sea_creatures_killed").getAsInt();
+ }
+
+ lc.frozenSteves = 0;
+ if (statsObject.has("kills_frozen_steve")) {
+ lc.frozenSteves = statsObject.get("kills_frozen_steve").getAsInt();
+ }
+ lc.seaCreatures += lc.frozenSteves;
+
+ lc.frostyTheSnowmans = 0;
+ if (statsObject.has("kills_frosty_the_snowman")) {
+ lc.frostyTheSnowmans = statsObject.get("kills_frosty_the_snowman").getAsInt();
+ }
+ lc.seaCreatures += lc.frostyTheSnowmans;
+
+ lc.grinches = 0;
+ if (statsObject.has("kills_grinch")) {
+ lc.grinches = statsObject.get("kills_grinch").getAsInt();
+ }
+ lc.seaCreatures += lc.grinches;
+
+ lc.yetis = 0;
+ if (statsObject.has("kills_yeti")) {
+ lc.yetis = statsObject.get("kills_yeti").getAsInt();
+ }
+ lc.seaCreatures += lc.yetis;
+
+ System.out.println("Writing to config...");
+ cf.writeIntConfig("fishing", "goodCatch", lc.goodCatches);
+ cf.writeIntConfig("fishing", "greatCatch", lc.greatCatches);
+ cf.writeIntConfig("fishing", "seaCreature", lc.seaCreatures);
+ cf.writeIntConfig("fishing", "squid", lc.squids);
+ cf.writeIntConfig("fishing", "seaWalker", lc.seaWalkers);
+ cf.writeIntConfig("fishing", "nightSquid", lc.nightSquids);
+ cf.writeIntConfig("fishing", "seaGuardian", lc.seaGuardians);
+ cf.writeIntConfig("fishing", "seaWitch", lc.seaWitches);
+ cf.writeIntConfig("fishing", "seaArcher", lc.seaArchers);
+ cf.writeIntConfig("fishing", "monsterOfDeep", lc.monsterOfTheDeeps);
+ cf.writeIntConfig("fishing", "catfish", lc.catfishes);
+ cf.writeIntConfig("fishing", "carrotKing", lc.carrotKings);
+ cf.writeIntConfig("fishing", "seaLeech", lc.seaLeeches);
+ cf.writeIntConfig("fishing", "guardianDefender", lc.guardianDefenders);
+ cf.writeIntConfig("fishing", "deepSeaProtector", lc.deepSeaProtectors);
+ cf.writeIntConfig("fishing", "hydra", lc.hydras);
+ cf.writeIntConfig("fishing", "seaEmperor", lc.seaEmperors);
+ cf.writeIntConfig("fishing", "milestone", lc.fishingMilestone);
+ cf.writeIntConfig("fishing", "frozenSteve", lc.frozenSteves);
+ cf.writeIntConfig("fishing", "snowman", lc.frostyTheSnowmans);
+ cf.writeIntConfig("fishing", "grinch", lc.grinches);
+ cf.writeIntConfig("fishing", "yeti", lc.yetis);
+
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Fishing stats imported."));
+ }).start();
+ }
+
+}
diff --git a/src/main/java/me/Danker/commands/LootCommand.java b/src/main/java/me/Danker/commands/LootCommand.java
new file mode 100644
index 0000000..d64e9d9
--- /dev/null
+++ b/src/main/java/me/Danker/commands/LootCommand.java
@@ -0,0 +1,533 @@
+package me.Danker.commands;
+
+import java.text.NumberFormat;
+import java.util.List;
+import java.util.Locale;
+
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.CommandException;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+
+public class LootCommand extends CommandBase {
+ // Wolf
+ public static int wolfSvens;
+ public static int wolfTeeth;
+ public static int wolfWheels;
+ public static int wolfWheelsDrops;
+ public static int wolfSpirits;
+ public static int wolfBooks;
+ public static int wolfEggs;
+ public static int wolfCoutures;
+ public static int wolfBaits;
+ public static int wolfFluxes;
+ public static double wolfTime;
+ public static int wolfBosses;
+ // Spider
+ public static int spiderTarantulas;
+ public static int spiderWebs;
+ public static int spiderTAP;
+ public static int spiderTAPDrops;
+ public static int spiderBites;
+ public static int spiderCatalysts;
+ public static int spiderBooks;
+ public static int spiderSwatters;
+ public static int spiderTalismans;
+ public static int spiderMosquitos;
+ public static double spiderTime;
+ public static int spiderBosses;
+ // Zombie
+ public static int zombieRevs;
+ public static int zombieRevFlesh;
+ public static int zombieFoulFlesh;
+ public static int zombieFoulFleshDrops;
+ public static int zombiePestilences;
+ public static int zombieUndeadCatas;
+ public static int zombieBooks;
+ public static int zombieBeheadeds;
+ public static int zombieRevCatas;
+ public static int zombieSnakes;
+ public static int zombieScythes;
+ public static double zombieTime;
+ public static int zombieBosses;
+
+ // Fishing
+ public static int seaCreatures;
+ public static int goodCatches;
+ public static int greatCatches;
+ public static int squids;
+ public static int seaWalkers;
+ public static int nightSquids;
+ public static int seaGuardians;
+ public static int seaWitches;
+ public static int seaArchers;
+ public static int monsterOfTheDeeps;
+ public static int catfishes;
+ public static int carrotKings;
+ public static int seaLeeches;
+ public static int guardianDefenders;
+ public static int deepSeaProtectors;
+ public static int hydras;
+ public static int seaEmperors;
+ public static double empTime;
+ public static int empSCs;
+ public static int fishingMilestone;
+ // Fishing Winter
+ public static int frozenSteves;
+ public static int frostyTheSnowmans;
+ public static int grinches;
+ public static int yetis;
+
+ // Single sessions (No config saves)
+ // Wolf
+ public static int wolfSvensSession = 0;
+ public static int wolfTeethSession = 0;
+ public static int wolfWheelsSession = 0;
+ public static int wolfWheelsDropsSession = 0;
+ public static int wolfSpiritsSession = 0;
+ public static int wolfBooksSession = 0;
+ public static int wolfEggsSession = 0;
+ public static int wolfCouturesSession = 0;
+ public static int wolfBaitsSession = 0;
+ public static int wolfFluxesSession = 0;
+ public static double wolfTimeSession = -1;
+ public static int wolfBossesSession = -1;
+ // Spider
+ public static int spiderTarantulasSession = 0;
+ public static int spiderWebsSession = 0;
+ public static int spiderTAPSession = 0;
+ public static int spiderTAPDropsSession = 0;
+ public static int spiderBitesSession = 0;
+ public static int spiderCatalystsSession = 0;
+ public static int spiderBooksSession = 0;
+ public static int spiderSwattersSession = 0;
+ public static int spiderTalismansSession = 0;
+ public static int spiderMosquitosSession = 0;
+ public static double spiderTimeSession = -1;
+ public static int spiderBossesSession = -1;
+ // Zombie
+ public static int zombieRevsSession = 0;
+ public static int zombieRevFleshSession = 0;
+ public static int zombieFoulFleshSession = 0;
+ public static int zombieFoulFleshDropsSession = 0;
+ public static int zombiePestilencesSession = 0;
+ public static int zombieUndeadCatasSession = 0;
+ public static int zombieBooksSession = 0;
+ public static int zombieBeheadedsSession = 0;
+ public static int zombieRevCatasSession = 0;
+ public static int zombieSnakesSession = 0;
+ public static int zombieScythesSession = 0;
+ public static double zombieTimeSession = -1;
+ public static int zombieBossesSession = -1;
+
+ // Fishing
+ public static int seaCreaturesSession = 0;
+ public static int goodCatchesSession = 0;
+ public static int greatCatchesSession = 0;
+ public static int squidsSession = 0;
+ public static int seaWalkersSession = 0;
+ public static int nightSquidsSession = 0;
+ public static int seaGuardiansSession = 0;
+ public static int seaWitchesSession = 0;
+ public static int seaArchersSession = 0;
+ public static int monsterOfTheDeepsSession = 0;
+ public static int catfishesSession = 0;
+ public static int carrotKingsSession = 0;
+ public static int seaLeechesSession = 0;
+ public static int guardianDefendersSession = 0;
+ public static int deepSeaProtectorsSession = 0;
+ public static int hydrasSession = 0;
+ public static int seaEmperorsSession = 0;
+ public static double empTimeSession = -1;
+ public static int empSCsSession = -1;
+ public static int fishingMilestoneSession = 0;
+ // Fishing Winter
+ public static int frozenStevesSession = 0;
+ public static int frostyTheSnowmansSession = 0;
+ public static int grinchesSession = 0;
+ public static int yetisSession = 0;
+
+ public String getTimeBetween(double timeOne, double timeTwo) {
+ double secondsBetween = Math.floor(timeTwo - timeOne);
+
+ String timeFormatted = "";
+ int days;
+ int hours;
+ int minutes;
+ int seconds;
+
+ if (secondsBetween > 86400) {
+ // More than 1d, display #d#h
+ days = (int) (secondsBetween / 86400);
+ hours = (int) (secondsBetween % 86400 / 3600);
+ timeFormatted = days + "d" + hours + "h";
+ } else if (secondsBetween > 3600) {
+ // More than 1h, display #h#m
+ hours = (int) (secondsBetween / 3600);
+ minutes = (int) (secondsBetween % 3600 / 60);
+ timeFormatted = hours + "h" + minutes + "m";
+ } else {
+ // Display #m#s
+ minutes = (int) (secondsBetween / 60);
+ seconds = (int) (secondsBetween % 60);
+ timeFormatted = minutes + "m" + seconds + "s";
+ }
+
+ return timeFormatted;
+ }
+
+ @Override
+ public String getCommandName() {
+ return "loot";
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender arg0) {
+ return getCommandName() + " <zombie/spider/wolf/fishing> [winter/session]";
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public List<String> addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) {
+ if (args.length == 1) {
+ return getListOfStringsMatchingLastWord(args, "wolf", "spider", "zombie", "fishing");
+ } else if (args.length == 2 && args[0].equalsIgnoreCase("fishing")) {
+ return getListOfStringsMatchingLastWord(args, "winter", "session");
+ } else if (args.length == 2 || (args.length == 3 && args[0].equalsIgnoreCase("fishing") && args[1].equalsIgnoreCase("winter"))) {
+ return getListOfStringsMatchingLastWord(args, "session");
+ }
+ return null;
+ }
+
+ @Override
+ public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException {
+ final EntityPlayer player = (EntityPlayer) arg0;
+
+ if (arg1.length == 0) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /loot <zombie/spider/wolf/fishing> [winter/session]"));
+ return;
+ }
+
+ double timeNow = System.currentTimeMillis() / 1000;
+ String timeBetween;
+ String bossesBetween;
+ String drop20;
+ NumberFormat nf = NumberFormat.getIntegerInstance(Locale.US);
+ boolean showSession = false;
+
+ if (arg1.length > 1) {
+ if (arg1[1].equalsIgnoreCase("session")) {
+ showSession = true;
+ } else if (arg1.length > 2) {
+ if (arg1[2].equalsIgnoreCase("session")) {
+ showSession = true;
+ }
+ }
+ }
+
+ if (arg1[0].equalsIgnoreCase("wolf")) {
+ if (showSession) {
+ if (wolfTimeSession == -1) {
+ timeBetween = "Never";
+ } else {
+ timeBetween = getTimeBetween(wolfTimeSession, timeNow);
+ }
+ if (wolfBossesSession == -1) {
+ bossesBetween = "Never";
+ } else {
+ bossesBetween = nf.format(wolfBossesSession);
+ }
+ if (ToggleCommand.slayerCountTotal) {
+ drop20 = nf.format(wolfWheelsSession);
+ } else {
+ drop20 = nf.format(wolfWheelsDropsSession) + " times";
+ }
+
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.AQUA + "" + EnumChatFormatting.BOLD + "-------------------\n" +
+ EnumChatFormatting.DARK_AQUA + EnumChatFormatting.BOLD + " Sven Loot Summary (Current Session):\n" +
+ EnumChatFormatting.GOLD + " Svens Killed: " + nf.format(wolfSvensSession) + "\n" +
+ EnumChatFormatting.GREEN + " Wolf Teeth: " + nf.format(wolfTeethSession) + "\n" +
+ EnumChatFormatting.BLUE + " Hamster Wheels: " + drop20 + "\n" +
+ EnumChatFormatting.AQUA + " Spirit Runes: " + wolfSpiritsSession + "\n" +
+ EnumChatFormatting.WHITE + " Critical VI Books: " + wolfBooksSession + "\n" +
+ EnumChatFormatting.DARK_RED + " Red Claw Eggs: " + wolfEggsSession + "\n" +
+ EnumChatFormatting.GOLD + " Couture Runes: " + wolfCouturesSession + "\n" +
+ EnumChatFormatting.AQUA + " Grizzly Baits: " + wolfBaitsSession + "\n" +
+ EnumChatFormatting.DARK_PURPLE + " Overfluxes: " + wolfFluxesSession + "\n" +
+ EnumChatFormatting.AQUA + " Time Since RNG: " + timeBetween + "\n" +
+ EnumChatFormatting.AQUA + " Bosses Since RNG: " + bossesBetween + "\n" +
+ EnumChatFormatting.AQUA + EnumChatFormatting.BOLD + " -------------------"));
+ return;
+ }
+
+ if (wolfTime == -1) {
+ timeBetween = "Never";
+ } else {
+ timeBetween = getTimeBetween(wolfTime, timeNow);
+ }
+ if (wolfBosses == -1) {
+ bossesBetween = "Never";
+ } else {
+ bossesBetween = nf.format(wolfBosses);
+ }
+ if (ToggleCommand.slayerCountTotal) {
+ drop20 = nf.format(wolfWheels);
+ } else {
+ drop20 = nf.format(wolfWheelsDrops) + " times";
+ }
+
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.AQUA + "" + EnumChatFormatting.BOLD + "-------------------\n" +
+ EnumChatFormatting.DARK_AQUA + EnumChatFormatting.BOLD + " Sven Loot Summary:\n" +
+ EnumChatFormatting.GOLD + " Svens Killed: " + nf.format(wolfSvens) + "\n" +
+ EnumChatFormatting.GREEN + " Wolf Teeth: " + nf.format(wolfTeeth) + "\n" +
+ EnumChatFormatting.BLUE + " Hamster Wheels: " + drop20 + "\n" +
+ EnumChatFormatting.AQUA + " Spirit Runes: " + wolfSpirits + "\n" +
+ EnumChatFormatting.WHITE + " Critical VI Books: " + wolfBooks + "\n" +
+ EnumChatFormatting.DARK_RED + " Red Claw Eggs: " + wolfEggs + "\n" +
+ EnumChatFormatting.GOLD + " Couture Runes: " + wolfCoutures + "\n" +
+ EnumChatFormatting.AQUA + " Grizzly Baits: " + wolfBaits + "\n" +
+ EnumChatFormatting.DARK_PURPLE + " Overfluxes: " + wolfFluxes + "\n" +
+ EnumChatFormatting.AQUA + " Time Since RNG: " + timeBetween + "\n" +
+ EnumChatFormatting.AQUA + " Bosses Since RNG: " + bossesBetween + "\n" +
+ EnumChatFormatting.AQUA + EnumChatFormatting.BOLD + " -------------------"));
+ } else if (arg1[0].equalsIgnoreCase("spider")) {
+ if (showSession) {
+ if (spiderTimeSession == -1) {
+ timeBetween = "Never";
+ } else {
+ timeBetween = getTimeBetween(spiderTimeSession, timeNow);
+ }
+ if (spiderBossesSession == -1) {
+ bossesBetween = "Never";
+ } else {
+ bossesBetween = nf.format(spiderBossesSession);
+ }
+ if (ToggleCommand.slayerCountTotal) {
+ drop20 = nf.format(spiderTAPSession);
+ } else {
+ drop20 = nf.format(spiderTAPDropsSession) + " times";
+ }
+
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "" + EnumChatFormatting.BOLD + "-------------------\n" +
+ EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD + " Spider Loot Summary (Current Session):\n" +
+ EnumChatFormatting.GOLD + " Tarantulas Killed: " + nf.format(spiderTarantulasSession) + "\n" +
+ EnumChatFormatting.GREEN + " Tarantula Webs: " + nf.format(spiderWebsSession) + "\n" +
+ EnumChatFormatting.DARK_GREEN + " Arrow Poison: " + drop20 + "\n" +
+ EnumChatFormatting.DARK_GRAY + " Bite Runes: " + spiderBitesSession + "\n" +
+ EnumChatFormatting.WHITE + " Bane VI Books: " + spiderBooksSession + "\n" +
+ EnumChatFormatting.AQUA + " Spider Catalysts: " + spiderCatalystsSession + "\n" +
+ EnumChatFormatting.DARK_PURPLE + " Tarantula Talismans: " + spiderTalismansSession + "\n" +
+ EnumChatFormatting.LIGHT_PURPLE + " Fly Swatters: " + spiderSwattersSession + "\n" +
+ EnumChatFormatting.GOLD + " Digested Mosquitos: " + spiderMosquitosSession + "\n" +
+ EnumChatFormatting.AQUA + " Time Since RNG: " + timeBetween + "\n" +
+ EnumChatFormatting.AQUA + " Bosses Since RNG: " + bossesBetween + "\n" +
+ EnumChatFormatting.RED + EnumChatFormatting.BOLD + " -------------------"));
+ return;
+ }
+
+ if (spiderTime == -1) {
+ timeBetween = "Never";
+ } else {
+ timeBetween = getTimeBetween(spiderTime, timeNow);
+ }
+ if (spiderBosses == -1) {
+ bossesBetween = "Never";
+ } else {
+ bossesBetween = nf.format(spiderBosses);
+ }
+ if (ToggleCommand.slayerCountTotal) {
+ drop20 = nf.format(spiderTAP);
+ } else {
+ drop20 = nf.format(spiderTAPDrops) + " times";
+ }
+
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "" + EnumChatFormatting.BOLD + "-------------------\n" +
+ EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD + " Spider Loot Summary:\n" +
+ EnumChatFormatting.GOLD + " Tarantulas Killed: " + nf.format(spiderTarantulas) + "\n" +
+ EnumChatFormatting.GREEN + " Tarantula Webs: " + nf.format(spiderWebs) + "\n" +
+ EnumChatFormatting.DARK_GREEN + " Arrow Poison: " + drop20 + "\n" +
+ EnumChatFormatting.DARK_GRAY + " Bite Runes: " + spiderBites + "\n" +
+ EnumChatFormatting.WHITE + " Bane VI Books: " + spiderBooks + "\n" +
+ EnumChatFormatting.AQUA + " Spider Catalysts: " + spiderCatalysts + "\n" +
+ EnumChatFormatting.DARK_PURPLE + " Tarantula Talismans: " + spiderTalismans + "\n" +
+ EnumChatFormatting.LIGHT_PURPLE + " Fly Swatters: " + spiderSwatters + "\n" +
+ EnumChatFormatting.GOLD + " Digested Mosquitos: " + spiderMosquitos + "\n" +
+ EnumChatFormatting.AQUA + " Time Since RNG: " + timeBetween + "\n" +
+ EnumChatFormatting.AQUA + " Bosses Since RNG: " + bossesBetween + "\n" +
+ EnumChatFormatting.RED + EnumChatFormatting.BOLD + " -------------------"));
+ } else if (arg1[0].equalsIgnoreCase("zombie")) {
+ if (showSession) {
+ if (zombieTimeSession == -1) {
+ timeBetween = "Never";
+ } else {
+ timeBetween = getTimeBetween(zombieTimeSession, timeNow);
+ }
+ if (zombieBossesSession == -1) {
+ bossesBetween = "Never";
+ } else {
+ bossesBetween = nf.format(zombieBossesSession);
+ }
+ if (ToggleCommand.slayerCountTotal) {
+ drop20 = nf.format(zombieFoulFleshSession);
+ } else {
+ drop20 = nf.format(zombieFoulFleshDropsSession) + " times";
+ }
+
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "" + EnumChatFormatting.BOLD + "-------------------\n" +
+ EnumChatFormatting.DARK_GREEN + EnumChatFormatting.BOLD + " Zombie Loot Summary (Current Session):\n" +
+ EnumChatFormatting.GOLD + " Revs Killed: " + nf.format(zombieRevsSession) + "\n" +
+ EnumChatFormatting.GREEN + " Revenant Flesh: " + nf.format(zombieRevFleshSession) + "\n" +
+ EnumChatFormatting.BLUE + " Foul Flesh: " + drop20 + "\n" +
+ EnumChatFormatting.DARK_GREEN + " Pestilence Runes: " + zombiePestilencesSession + "\n" +
+ EnumChatFormatting.WHITE + " Smite VI Books: " + zombieBooksSession + "\n" +
+ EnumChatFormatting.AQUA + " Undead Catalysts: " + zombieUndeadCatasSession + "\n" +
+ EnumChatFormatting.DARK_PURPLE + " Beheaded Horrors: " + zombieBeheadedsSession + "\n" +
+ EnumChatFormatting.RED + " Revenant Catalysts: " + zombieRevCatasSession + "\n" +
+ EnumChatFormatting.DARK_GREEN + " Snake Runes: " + zombieSnakesSession + "\n" +
+ EnumChatFormatting.GOLD + " Scythe Blades: " + zombieScythesSession + "\n" +
+ EnumChatFormatting.AQUA + " Time Since RNG: " + timeBetween + "\n" +
+ EnumChatFormatting.AQUA + " Bosses Since RNG: " + bossesBetween + "\n" +
+ EnumChatFormatting.GREEN + EnumChatFormatting.BOLD + " -------------------"));
+ return;
+ }
+
+ if (zombieTime == -1) {
+ timeBetween = "Never";
+ } else {
+ timeBetween = getTimeBetween(zombieTime, timeNow);
+ }
+ if (zombieBosses == -1) {
+ bossesBetween = "Never";
+ } else {
+ bossesBetween = nf.format(zombieBosses);
+ }
+ if (ToggleCommand.slayerCountTotal) {
+ drop20 = nf.format(zombieFoulFlesh);
+ } else {
+ drop20 = nf.format(zombieFoulFleshDrops) + " times";
+ }
+
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "" + EnumChatFormatting.BOLD + "-------------------\n" +
+ EnumChatFormatting.DARK_GREEN + EnumChatFormatting.BOLD + " Zombie Loot Summary:\n" +
+ EnumChatFormatting.GOLD + " Revs Killed: " + nf.format(zombieRevs) + "\n" +
+ EnumChatFormatting.GREEN + " Revenant Flesh: " + nf.format(zombieRevFlesh) + "\n" +
+ EnumChatFormatting.BLUE + " Foul Flesh: " + drop20 + "\n" +
+ EnumChatFormatting.DARK_GREEN + " Pestilence Runes: " + zombiePestilences + "\n" +
+ EnumChatFormatting.WHITE + " Smite VI Books: " + zombieBooks + "\n" +
+ EnumChatFormatting.AQUA + " Undead Catalysts: " + zombieUndeadCatas + "\n" +
+ EnumChatFormatting.DARK_PURPLE + " Beheaded Horrors: " + zombieBeheadeds + "\n" +
+ EnumChatFormatting.RED + " Revenant Catalysts: " + zombieRevCatas + "\n" +
+ EnumChatFormatting.DARK_GREEN + " Snake Runes: " + zombieSnakes + "\n" +
+ EnumChatFormatting.GOLD + " Scythe Blades: " + zombieScythes + "\n" +
+ EnumChatFormatting.AQUA + " Time Since RNG: " + timeBetween + "\n" +
+ EnumChatFormatting.AQUA + " Bosses Since RNG: " + bossesBetween + "\n" +
+ EnumChatFormatting.GREEN + EnumChatFormatting.BOLD + " -------------------"));
+ } else if (arg1[0].equalsIgnoreCase("fishing")) {
+ if (arg1.length > 1) {
+ if (arg1[1].equalsIgnoreCase("winter")) {
+ if (showSession) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.AQUA + "" + EnumChatFormatting.BOLD + "-------------------\n" +
+ EnumChatFormatting.WHITE + EnumChatFormatting.BOLD + " Winter Fishing Summary (Current Session):\n" +
+ EnumChatFormatting.AQUA + " Frozen Steves: " + nf.format(frozenStevesSession) + "\n" +
+ EnumChatFormatting.WHITE + " Snowmans: " + nf.format(frostyTheSnowmansSession) + "\n" +
+ EnumChatFormatting.DARK_GREEN + " Grinches: " + nf.format(grinchesSession) + "\n" +
+ EnumChatFormatting.GOLD + " Yetis: " + nf.format(yetisSession) + "\n" +
+ EnumChatFormatting.AQUA + EnumChatFormatting.BOLD + " -------------------"));
+ return;
+ }
+
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.AQUA + "" + EnumChatFormatting.BOLD + "-------------------\n" +
+ EnumChatFormatting.WHITE + EnumChatFormatting.BOLD + " Winter Fishing Summary:\n" +
+ EnumChatFormatting.AQUA + " Frozen Steves: " + nf.format(frozenSteves) + "\n" +
+ EnumChatFormatting.WHITE + " Snowmans: " + nf.format(frostyTheSnowmans) + "\n" +
+ EnumChatFormatting.DARK_GREEN + " Grinches: " + nf.format(grinches) + "\n" +
+ EnumChatFormatting.GOLD + " Yetis: " + nf.format(yetis) + "\n" +
+ EnumChatFormatting.AQUA + EnumChatFormatting.BOLD + " -------------------"));
+ return;
+ }
+ }
+
+ if (showSession) {
+ if (empTimeSession == -1) {
+ timeBetween = "Never";
+ } else {
+ timeBetween = getTimeBetween(empTimeSession, timeNow);
+ }
+ if (empSCsSession == -1) {
+ bossesBetween = "Never";
+ } else {
+ bossesBetween = nf.format(empSCsSession);
+ }
+
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.DARK_AQUA + "" + EnumChatFormatting.BOLD + "-------------------\n" +
+ EnumChatFormatting.AQUA + EnumChatFormatting.BOLD + " Fishing Summary (Current Session):\n" +
+ EnumChatFormatting.AQUA + " Sea Creatures Caught: " + nf.format(seaCreaturesSession) + "\n" +
+ EnumChatFormatting.GOLD + " Good Catches: " + nf.format(goodCatchesSession) + "\n" +
+ EnumChatFormatting.DARK_PURPLE + " Great Catches: " + nf.format(greatCatchesSession) + "\n\n" +
+ EnumChatFormatting.GRAY + " Squids: " + nf.format(squidsSession) + "\n" +
+ EnumChatFormatting.GREEN + " Sea Walkers: " + nf.format(seaWalkersSession) + "\n" +
+ EnumChatFormatting.DARK_GRAY + " Night Squids: " + nf.format(nightSquidsSession) + "\n" +
+ EnumChatFormatting.DARK_AQUA + " Sea Guardians: " + nf.format(seaGuardiansSession) + "\n" +
+ EnumChatFormatting.BLUE + " Sea Witches: " + nf.format(seaWitchesSession) + "\n" +
+ EnumChatFormatting.GREEN + " Sea Archers: " + nf.format(seaArchersSession) + "\n" +
+ EnumChatFormatting.GREEN + " Monster of the Deeps: " + nf.format(monsterOfTheDeepsSession) + "\n" +
+ EnumChatFormatting.YELLOW + " Catfishes: " + nf.format(catfishesSession) + "\n" +
+ EnumChatFormatting.GOLD + " Carrot Kings: " + nf.format(carrotKingsSession) + "\n" +
+ EnumChatFormatting.GRAY + " Sea Leeches: " + nf.format(seaLeechesSession) + "\n" +
+ EnumChatFormatting.DARK_PURPLE + " Guardian Defenders: " + nf.format(guardianDefendersSession) + "\n" +
+ EnumChatFormatting.DARK_PURPLE + " Deep Sea Protectors: " + nf.format(deepSeaProtectorsSession) + "\n" +
+ EnumChatFormatting.GOLD + " Hydras: " + nf.format(hydrasSession) + "\n" +
+ EnumChatFormatting.GOLD + " Sea Emperors: " + nf.format(seaEmperorsSession) + "\n" +
+ EnumChatFormatting.AQUA + " Time Since Sea Emperor: " + timeBetween + "\n" +
+ EnumChatFormatting.AQUA + " Sea Creatures Since Sea Emperor: " + bossesBetween + "\n" +
+ EnumChatFormatting.DARK_AQUA + EnumChatFormatting.BOLD + " -------------------"));
+ return;
+ }
+
+ if (empTime == -1) {
+ timeBetween = "Never";
+ } else {
+ timeBetween = getTimeBetween(empTime, timeNow);
+ }
+ if (empSCs == -1) {
+ bossesBetween = "Never";
+ } else {
+ bossesBetween = nf.format(empSCs);
+ }
+
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.DARK_AQUA + "" + EnumChatFormatting.BOLD + "-------------------\n" +
+ EnumChatFormatting.AQUA + EnumChatFormatting.BOLD + " Fishing Summary:\n" +
+ EnumChatFormatting.AQUA + " Sea Creatures Caught: " + nf.format(seaCreatures) + "\n" +
+ EnumChatFormatting.GOLD + " Good Catches: " + nf.format(goodCatches) + "\n" +
+ EnumChatFormatting.DARK_PURPLE + " Great Catches: " + nf.format(greatCatches) + "\n\n" +
+ EnumChatFormatting.GRAY + " Squids: " + nf.format(squids) + "\n" +
+ EnumChatFormatting.GREEN + " Sea Walkers: " + nf.format(seaWalkers) + "\n" +
+ EnumChatFormatting.DARK_GRAY + " Night Squids: " + nf.format(nightSquids) + "\n" +
+ EnumChatFormatting.DARK_AQUA + " Sea Guardians: " + nf.format(seaGuardians) + "\n" +
+ EnumChatFormatting.BLUE + " Sea Witches: " + nf.format(seaWitches) + "\n" +
+ EnumChatFormatting.GREEN + " Sea Archers: " + nf.format(seaArchers) + "\n" +
+ EnumChatFormatting.GREEN + " Monster of the Deeps: " + nf.format(monsterOfTheDeeps) + "\n" +
+ EnumChatFormatting.YELLOW + " Catfishes: " + nf.format(catfishes) + "\n" +
+ EnumChatFormatting.GOLD + " Carrot Kings: " + nf.format(carrotKings) + "\n" +
+ EnumChatFormatting.GRAY + " Sea Leeches: " + nf.format(seaLeeches) + "\n" +
+ EnumChatFormatting.DARK_PURPLE + " Guardian Defenders: " + nf.format(guardianDefenders) + "\n" +
+ EnumChatFormatting.DARK_PURPLE + " Deep Sea Protectors: " + nf.format(deepSeaProtectors) + "\n" +
+ EnumChatFormatting.GOLD + " Hydras: " + nf.format(hydras) + "\n" +
+ EnumChatFormatting.GOLD + " Sea Emperors: " + nf.format(seaEmperors) + "\n" +
+ EnumChatFormatting.AQUA + " Time Since Sea Emperor: " + timeBetween + "\n" +
+ EnumChatFormatting.AQUA + " Sea Creatures Since Sea Emperor: " + bossesBetween + "\n" +
+ EnumChatFormatting.DARK_AQUA + EnumChatFormatting.BOLD + " -------------------"));
+ } else {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /loot <zombie/spider/wolf/fishing> [winter/session]"));
+ }
+
+ }
+
+}
diff --git a/src/main/java/me/Danker/commands/MoveCommand.java b/src/main/java/me/Danker/commands/MoveCommand.java
new file mode 100644
index 0000000..1232e18
--- /dev/null
+++ b/src/main/java/me/Danker/commands/MoveCommand.java
@@ -0,0 +1,69 @@
+package me.Danker.commands;
+
+import java.util.List;
+
+import me.Danker.handlers.ConfigHandler;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.CommandException;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+
+public class MoveCommand extends CommandBase {
+
+ public static int[] coordsXY = {0, 0};
+ public static int[] displayXY = {0, 0};
+
+ @Override
+ public String getCommandName() {
+ return "move";
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender arg0) {
+ return getCommandName() + " <coords/display> <x> <y>";
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public List<String> addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) {
+ if (args.length == 1) {
+ return getListOfStringsMatchingLastWord(args, "coords", "display");
+ }
+ return null;
+ }
+
+ @Override
+ public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException {
+ final EntityPlayer player = (EntityPlayer)arg0;
+ final ConfigHandler cf = new ConfigHandler();
+
+ if (arg1.length < 2) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /move <coords/display> <x> <y>"));
+ return;
+ }
+
+ if (arg1[0].equalsIgnoreCase("coords")) {
+ coordsXY[0] = Integer.parseInt(arg1[1]);
+ coordsXY[1] = Integer.parseInt(arg1[2]);
+ cf.writeIntConfig("locations", "coordsX", coordsXY[0]);
+ cf.writeIntConfig("locations", "coordsY", coordsXY[1]);
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Coords have been moved to " + EnumChatFormatting.DARK_GREEN + arg1[1] + ", " + arg1[2]));
+ } else if (arg1[0].equalsIgnoreCase("display")) {
+ displayXY[0] = Integer.parseInt(arg1[1]);
+ displayXY[1] = Integer.parseInt(arg1[2]);
+ cf.writeIntConfig("locations", "displayX", displayXY[0]);
+ cf.writeIntConfig("locations", "displayY", displayXY[1]);
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Tracker display has been moved to " + EnumChatFormatting.DARK_GREEN + arg1[1] + ", " + arg1[2]));
+ } else {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /move <coords/display> <x> <y>"));
+ }
+ }
+
+}
diff --git a/src/main/java/me/Danker/commands/PetsCommand.java b/src/main/java/me/Danker/commands/PetsCommand.java
new file mode 100644
index 0000000..75367ab
--- /dev/null
+++ b/src/main/java/me/Danker/commands/PetsCommand.java
@@ -0,0 +1,247 @@
+package me.Danker.commands;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+
+import me.Danker.handlers.APIHandler;
+import me.Danker.handlers.ConfigHandler;
+import me.Danker.utils.Utils;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.CommandException;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+
+public class PetsCommand extends CommandBase {
+
+ static int petXpToLevel(double xp, String rarity) {
+ int[] xpPerLevel = {100, 110, 120, 130, 145, 160, 175, 190, 210, 230, 250, 275, 300, 330, 360, 400, 440, 490, 540, 600, 660, 730,
+ 800, 880, 860, 1050, 1150, 1260, 1380, 1510, 1650, 1800, 1960, 2130, 2310, 2500, 2700, 2920, 3160, 3420, 3700,
+ 4000, 4350, 4750, 5200, 5700, 6300, 7000, 7800, 8700, 9700, 10800, 12000, 13300, 14700, 16200, 17800, 19500,
+ 21300, 23200, 25200, 27400, 29800, 32400, 35200, 38200, 41400, 44800, 48400, 52200, 56200, 60400, 64800, 69400,
+ 74200, 79200, 84700, 90700, 97200, 104200, 111700, 119700, 128200, 137200, 146700, 156700, 167700, 179700, 192700,
+ 206700, 221700, 237700, 254700, 272700, 291700, 311700, 333700, 357700, 383700, 411700, 441700, 476700, 516700,
+ 561700, 611700, 666700, 726700, 791700, 861700, 936700, 1016700, 1101700, 1191700, 1286700, 1386700, 1496700,
+ 1616700, 1746700, 1886700};
+
+ int levelOffset = 0;
+ if (rarity.equals("UNCOMMON")) {
+ levelOffset = 6;
+ } else if (rarity.equals("RARE")) {
+ levelOffset = 11;
+ } else if (rarity.equals("EPIC")) {
+ levelOffset = 16;
+ } else if (rarity.equals("LEGENDARY")) {
+ levelOffset = 20;
+ }
+
+ for (int i = levelOffset, xpAdded = 0; i < levelOffset + 99; i++) {
+ xpAdded += xpPerLevel[i];
+ if (xp < xpAdded) {
+ return i + 1 - levelOffset;
+ }
+ }
+ return 100;
+ }
+
+ static String capitalize(String string) {
+ String capitalized = string.substring(0, 1).toUpperCase() + string.substring(1).toLowerCase();
+ return capitalized;
+ }
+
+ @Override
+ public String getCommandName() {
+ return "petsof";
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender arg0) {
+ return getCommandName() + " [name]";
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public List<String> addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) {
+ if (args.length == 1) {
+ return Utils.getMatchingPlayers(args[0]);
+ }
+ return null;
+ }
+
+ @Override
+ public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException {
+ // MULTI THREAD DRIFTING
+ new Thread(() -> {
+ APIHandler ah = new APIHandler();
+ ConfigHandler cf = new ConfigHandler();
+ EntityPlayer player = (EntityPlayer) arg0;
+
+ // Check key
+ String key = cf.getString("api", "APIKey");
+ if (key.equals("")) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "API key not set. Use /setkey."));
+ }
+
+ // Get UUID for Hypixel API requests
+ String username;
+ String uuid;
+ if (arg1.length == 0) {
+ username = player.getName();
+ uuid = player.getUniqueID().toString().replaceAll("[\\-]", "");
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Checking pets of " + EnumChatFormatting.DARK_GREEN + username));
+ } else {
+ username = arg1[0];
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Checking pets of " + EnumChatFormatting.DARK_GREEN + username));
+ uuid = ah.getUUID(username);
+ }
+
+ // Find stats of latest profile
+ String latestProfile = ah.getLatestProfileID(uuid, key);
+ if (latestProfile == null) return;
+
+ String profileURL = "https://api.hypixel.net/skyblock/profile?profile=" + latestProfile + "&key=" + key;
+ System.out.println("Fetching profile...");
+ JsonObject profileResponse = ah.getResponse(profileURL);
+ if (!profileResponse.get("success").getAsBoolean()) {
+ String reason = profileResponse.get("cause").getAsString();
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Failed with reason: " + reason));
+ return;
+ }
+
+ System.out.println("Fetching pets...");
+ JsonArray petsArray = profileResponse.get("profile").getAsJsonObject().get("members").getAsJsonObject().get(uuid).getAsJsonObject().get("pets").getAsJsonArray();
+ if (petsArray.size() == 0) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + username + " has no pets."));
+ return;
+ }
+
+ System.out.println("Looping through pets...");
+ // Push each pet into list
+ List<JsonElement> sortedPets = new ArrayList<JsonElement>();
+ for (JsonElement petElement : petsArray) {
+ sortedPets.add(petElement);
+ }
+
+ // Sort pets by exp
+ Collections.sort(sortedPets, (pet1, pet2) -> {
+ double petXp1 = pet1.getAsJsonObject().get("exp").getAsDouble();
+ double petXp2 = pet2.getAsJsonObject().get("exp").getAsDouble();
+ return -Double.compare(petXp1, petXp2);
+ });
+
+ // Sort pets into rarities
+ List<JsonObject> commonPets = new ArrayList<JsonObject>();
+ List<JsonObject> uncommonPets = new ArrayList<JsonObject>();
+ List<JsonObject> rarePets = new ArrayList<JsonObject>();
+ List<JsonObject> epicPets = new ArrayList<JsonObject>();
+ List<JsonObject> legendaryPets = new ArrayList<JsonObject>();
+
+ for (JsonElement petElement : sortedPets) {
+ JsonObject pet = petElement.getAsJsonObject();
+ String rarity = pet.get("tier").getAsString();
+
+ if (rarity.equals("COMMON")) {
+ commonPets.add(pet);
+ } else if (rarity.equals("UNCOMMON")) {
+ uncommonPets.add(pet);
+ } else if (rarity.equals("RARE")) {
+ rarePets.add(pet);
+ } else if (rarity.equals("EPIC")) {
+ epicPets.add(pet);
+ } else if (rarity.equals("LEGENDARY")) {
+ legendaryPets.add(pet);
+ }
+ }
+
+ String finalMessage = EnumChatFormatting.AQUA + "" + EnumChatFormatting.BOLD + "-------------------\n" +
+ EnumChatFormatting.AQUA + " " + username + "'s Pets:\n";
+
+ // Loop through pet rarities
+ for (JsonObject legPet : legendaryPets) {
+ String petName = capitalize(legPet.get("type").getAsString());
+ int level = petXpToLevel(legPet.get("exp").getAsDouble(), "LEGENDARY");
+
+ String messageToAdd = "";
+ if (legPet.get("active").getAsBoolean()) {
+ messageToAdd = EnumChatFormatting.GOLD + " " + EnumChatFormatting.BOLD + ">>> Legendary " + petName + " (" + level + ") <<<";
+ } else {
+ messageToAdd = EnumChatFormatting.GOLD + " Legendary " + petName + " (" + level + ")";
+ }
+
+ finalMessage += messageToAdd + "\n";
+ }
+
+ for (JsonObject epicPet: epicPets) {
+ String petName = capitalize(epicPet.get("type").getAsString());
+ int level = petXpToLevel(epicPet.get("exp").getAsDouble(), "EPIC");
+
+ String messageToAdd = "";
+ if (epicPet.get("active").getAsBoolean()) {
+ messageToAdd = EnumChatFormatting.DARK_PURPLE + " " + EnumChatFormatting.BOLD + ">>> Epic " + petName + " (" + level + ") <<<";
+ } else {
+ messageToAdd = EnumChatFormatting.DARK_PURPLE + " Epic " + petName + " (" + level + ")";
+ }
+
+ finalMessage += messageToAdd + "\n";
+ }
+
+ for (JsonObject rarePet: rarePets) {
+ String petName = capitalize(rarePet.get("type").getAsString());
+ int level = petXpToLevel(rarePet.get("exp").getAsDouble(), "RARE");
+
+ String messageToAdd = "";
+ if (rarePet.get("active").getAsBoolean()) {
+ messageToAdd = EnumChatFormatting.BLUE + " " + EnumChatFormatting.BOLD + ">>> Rare " + petName + " (" + level + ") <<<";
+ } else {
+ messageToAdd = EnumChatFormatting.BLUE + " Rare " + petName + " (" + level + ")";
+ }
+
+ finalMessage += messageToAdd + "\n";
+ }
+
+ for (JsonObject uncommonPet: uncommonPets) {
+ String petName = capitalize(uncommonPet.get("type").getAsString());
+ int level = petXpToLevel(uncommonPet.get("exp").getAsDouble(), "UNCOMMON");
+
+ String messageToAdd = "";
+ if (uncommonPet.get("active").getAsBoolean()) {
+ messageToAdd = EnumChatFormatting.GREEN + " " + EnumChatFormatting.BOLD + ">>> Uncommon " + petName + " (" + level + ") <<<";
+ } else {
+ messageToAdd = EnumChatFormatting.GREEN + " Uncommon " + petName + " (" + level + ")";
+ }
+
+ finalMessage += messageToAdd + "\n";
+ }
+
+ for (JsonObject commonPet: commonPets) {
+ String petName = capitalize(commonPet.get("type").getAsString());
+ int level = petXpToLevel(commonPet.get("exp").getAsDouble(), "COMMON");
+
+ String messageToAdd = "";
+ if (commonPet.get("active").getAsBoolean()) {
+ messageToAdd = EnumChatFormatting.BOLD + ">>> Common " + petName + " (" + level + ") <<<";
+ } else {
+ messageToAdd = " Common " + petName + " (" + level + ")";
+ }
+
+ finalMessage += messageToAdd + "\n";
+ }
+
+ finalMessage += EnumChatFormatting.AQUA + " " + EnumChatFormatting.BOLD + "-------------------";
+ player.addChatMessage(new ChatComponentText(finalMessage));
+
+ }).start();
+ }
+
+}
diff --git a/src/main/java/me/Danker/commands/ReloadConfigCommand.java b/src/main/java/me/Danker/commands/ReloadConfigCommand.java
new file mode 100644
index 0000000..122f1c1
--- /dev/null
+++ b/src/main/java/me/Danker/commands/ReloadConfigCommand.java
@@ -0,0 +1,36 @@
+package me.Danker.commands;
+
+import me.Danker.handlers.ConfigHandler;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.CommandException;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+
+public class ReloadConfigCommand extends CommandBase {
+
+ @Override
+ public String getCommandName() {
+ return "reloadconfig";
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender arg0) {
+ return getCommandName();
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException {
+ final EntityPlayer player = (EntityPlayer)arg0;
+ final ConfigHandler cf = new ConfigHandler();
+ cf.reloadConfig();
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Reloaded config."));
+ }
+
+}
diff --git a/src/main/java/me/Danker/commands/ResetLootCommand.java b/src/main/java/me/Danker/commands/ResetLootCommand.java
new file mode 100644
index 0000000..1afc204
--- /dev/null
+++ b/src/main/java/me/Danker/commands/ResetLootCommand.java
@@ -0,0 +1,181 @@
+package me.Danker.commands;
+
+import java.util.List;
+
+import me.Danker.handlers.ConfigHandler;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.CommandException;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+
+public class ResetLootCommand extends CommandBase {
+
+ static String resetOption;
+ static boolean confirmReset = false;
+
+ @Override
+ public String getCommandName() {
+ return "resetloot";
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender arg0) {
+ return getCommandName() + "<zombie/spider/wolf/fishing/confirm/cancel>";
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public List<String> addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) {
+ if (args.length != 1) return null;
+
+ if (confirmReset) {
+ return getListOfStringsMatchingLastWord(args, "confirm", "cancel");
+ } else {
+ return getListOfStringsMatchingLastWord(args, "zombie", "spider", "wolf", "fishing");
+ }
+ }
+
+ @Override
+ public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException {
+ final EntityPlayer player = (EntityPlayer) arg0;
+
+ if (arg1.length == 0) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /resetloot <zombie/spider/wolf/fishing>"));
+ return;
+ }
+
+ if (confirmReset) {
+ if (arg1[0].equalsIgnoreCase("confirm")) {
+ confirmReset = false;
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Resetting " + resetOption + " tracker..."));
+ if (resetOption.equalsIgnoreCase("zombie")) {
+ resetZombie();
+ } else if (resetOption.equalsIgnoreCase("spider")) {
+ resetSpider();
+ } else if (resetOption.equalsIgnoreCase("wolf")) {
+ resetWolf();
+ } else if (resetOption.equalsIgnoreCase("fishing")) {
+ resetFishing();
+ }
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Reset complete."));
+ } else if (arg1[0].equalsIgnoreCase("cancel")) {
+ confirmReset = false;
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Reset cancelled."));
+ } else {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Please confirm the reset of the " + resetOption + " tracker by using /resetloot confirm." +
+ EnumChatFormatting.RED + " Cancel by using /resetloot cancel."));
+ }
+ } else {
+ if (arg1[0].equalsIgnoreCase("zombie") || arg1[0].equalsIgnoreCase("spider") || arg1[0].equalsIgnoreCase("wolf") || arg1[0].equalsIgnoreCase("fishing")) {
+ resetOption = arg1[0];
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "Are you sure you want to reset the " + resetOption + " tracker?" +
+ " Confirm with " + EnumChatFormatting.GREEN + "/resetloot confirm" + EnumChatFormatting.YELLOW + "." +
+ " Cancel by using " + EnumChatFormatting.GREEN + "/resetloot cancel" + EnumChatFormatting.YELLOW + "."));
+ confirmReset = true;
+ } else if (arg1[0].equalsIgnoreCase("confirm") || arg1[0].equalsIgnoreCase("cancel")) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Pick something to reset first."));
+ } else {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /resetloot <zombie/spider/wolf/fishing>"));
+ }
+ }
+ }
+
+ static void resetZombie() {
+ LootCommand lc = new LootCommand();
+ ConfigHandler cf = new ConfigHandler();
+
+ lc.zombieRevsSession = 0;
+ lc.zombieRevFleshSession = 0;
+ lc.zombieFoulFleshSession = 0;
+ lc.zombieFoulFleshDropsSession = 0;
+ lc.zombiePestilencesSession = 0;
+ lc.zombieUndeadCatasSession = 0;
+ lc.zombieBooksSession = 0;
+ lc.zombieBeheadedsSession = 0;
+ lc.zombieRevCatasSession = 0;
+ lc.zombieSnakesSession = 0;
+ lc.zombieScythesSession = 0;
+ lc.zombieTimeSession = -1;
+ lc.zombieBossesSession = -1;
+ cf.deleteCategory("zombie");
+ cf.reloadConfig();
+ }
+
+ static void resetSpider() {
+ LootCommand lc = new LootCommand();
+ ConfigHandler cf = new ConfigHandler();
+
+ lc.spiderTarantulasSession = 0;
+ lc.spiderWebsSession = 0;
+ lc.spiderTAPSession = 0;
+ lc.spiderTAPDropsSession = 0;
+ lc.spiderBitesSession = 0;
+ lc.spiderCatalystsSession = 0;
+ lc.spiderBooksSession = 0;
+ lc.spiderSwattersSession = 0;
+ lc.spiderTalismansSession = 0;
+ lc.spiderMosquitosSession = 0;
+ lc.spiderTimeSession = -1;
+ lc.spiderBossesSession = -1;
+ cf.deleteCategory("spider");
+ cf.reloadConfig();
+ }
+
+ static void resetWolf() {
+ LootCommand lc = new LootCommand();
+ ConfigHandler cf = new ConfigHandler();
+ lc.wolfSvensSession = 0;
+ lc.wolfTeethSession = 0;
+ lc.wolfWheelsSession = 0;
+ lc.wolfWheelsDropsSession = 0;
+ lc.wolfSpiritsSession = 0;
+ lc.wolfBooksSession = 0;
+ lc.wolfEggsSession = 0;
+ lc.wolfCouturesSession = 0;
+ lc.wolfBaitsSession = 0;
+ lc.wolfFluxesSession = 0;
+ lc.wolfTimeSession = -1;
+ lc.wolfBossesSession = -1;
+ cf.deleteCategory("wolf");
+ cf.reloadConfig();
+ }
+
+ static void resetFishing() {
+ LootCommand lc = new LootCommand();
+ ConfigHandler cf = new ConfigHandler();
+ lc.seaCreaturesSession = 0;
+ lc.goodCatchesSession = 0;
+ lc.greatCatchesSession = 0;
+ lc.squidsSession = 0;
+ lc.seaWalkersSession = 0;
+ lc.nightSquidsSession = 0;
+ lc.seaGuardiansSession = 0;
+ lc.seaWitchesSession = 0;
+ lc.seaArchersSession = 0;
+ lc.monsterOfTheDeepsSession = 0;
+ lc.catfishesSession = 0;
+ lc.carrotKingsSession = 0;
+ lc.seaLeechesSession = 0;
+ lc.guardianDefendersSession = 0;
+ lc.deepSeaProtectorsSession = 0;
+ lc.hydrasSession = 0;
+ lc.seaEmperorsSession = 0;
+ lc.empTimeSession = -1;
+ lc.empSCsSession = -1;
+ lc.fishingMilestoneSession = 0;
+ lc.frozenStevesSession = 0;
+ lc.frostyTheSnowmansSession = 0;
+ lc.grinchesSession = 0;
+ lc.yetisSession = 0;
+ cf.deleteCategory("fishing");
+ cf.reloadConfig();
+ }
+
+}
diff --git a/src/main/java/me/Danker/commands/ScaleCommand.java b/src/main/java/me/Danker/commands/ScaleCommand.java
new file mode 100644
index 0000000..f8c73c9
--- /dev/null
+++ b/src/main/java/me/Danker/commands/ScaleCommand.java
@@ -0,0 +1,70 @@
+package me.Danker.commands;
+
+import java.util.List;
+
+import me.Danker.handlers.ConfigHandler;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.CommandException;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+
+public class ScaleCommand extends CommandBase {
+
+ public static double coordsScale;
+ public static double displayScale;
+
+ @Override
+ public String getCommandName() {
+ return "scale";
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender arg0) {
+ return getCommandName() + " <coords/display> <size (0.1 - 10)>";
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public List<String> addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) {
+ if (args.length == 1) {
+ return getListOfStringsMatchingLastWord(args, "coords", "display");
+ }
+ return null;
+ }
+
+ @Override
+ public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException {
+ final EntityPlayer player = (EntityPlayer) arg0;
+
+ if (arg1.length < 2) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /scale <coords/display> <size (0.1 - 10)>"));
+ return;
+ }
+
+ double scaleAmount = (double) Math.floor(Double.parseDouble(arg1[1]) * 10.0) / 10.0;
+ if (scaleAmount < 0.1 || scaleAmount > 10.0) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Scale multipler can only be between 0.1x and 10x."));
+ return;
+ }
+
+ if (arg1[0].equalsIgnoreCase("coords")) {
+ coordsScale = scaleAmount;
+ ConfigHandler.writeDoubleConfig("scales", "coordsScale", coordsScale);
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Coords have been scaled to " + EnumChatFormatting.DARK_GREEN + coordsScale + "x"));
+ } else if (arg1[0].equalsIgnoreCase("display")) {
+ displayScale = scaleAmount;
+ ConfigHandler.writeDoubleConfig("scales", "displayScale", displayScale);
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Display has been scaled to " + EnumChatFormatting.DARK_GREEN + displayScale + "x"));
+ } else {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /scale <coords/display> <size (0.1 - 10)>"));
+ }
+ }
+
+}
diff --git a/src/main/java/me/Danker/commands/SetkeyCommand.java b/src/main/java/me/Danker/commands/SetkeyCommand.java
new file mode 100644
index 0000000..f68ff75
--- /dev/null
+++ b/src/main/java/me/Danker/commands/SetkeyCommand.java
@@ -0,0 +1,43 @@
+package me.Danker.commands;
+
+import me.Danker.handlers.ConfigHandler;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.CommandException;
+import net.minecraft.command.ICommand;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+
+public class SetkeyCommand extends CommandBase implements ICommand {
+
+ @Override
+ public String getCommandName() {
+ return "setkey";
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender arg0) {
+ return getCommandName() + " <key>";
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException {
+ final EntityPlayer player = (EntityPlayer)arg0;
+
+ if (arg1.length == 0) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /setkey <key>"));
+ return;
+ }
+
+ final ConfigHandler cf = new ConfigHandler();
+ cf.writeStringConfig("api", "APIKey", arg1[0]);
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Set API key to " + EnumChatFormatting.DARK_GREEN + arg1[0]));
+ }
+
+}
diff --git a/src/main/java/me/Danker/commands/SkillsCommand.java b/src/main/java/me/Danker/commands/SkillsCommand.java
new file mode 100644
index 0000000..5818772
--- /dev/null
+++ b/src/main/java/me/Danker/commands/SkillsCommand.java
@@ -0,0 +1,334 @@
+package me.Danker.commands;
+
+import java.util.List;
+
+import com.google.gson.JsonObject;
+
+import me.Danker.handlers.APIHandler;
+import me.Danker.handlers.ConfigHandler;
+import me.Danker.utils.Utils;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.CommandException;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+
+public class SkillsCommand extends CommandBase {
+
+ static double xpToLevel(double xp) {
+ int level;
+ double progress;
+
+ if (xp < 50) {
+ level = 0;
+ progress = xp / 50;
+ } else if (xp < 175) {
+ level = 1;
+ progress = (xp - 50) / 125;
+ } else if (xp < 375) {
+ level = 2;
+ progress = (xp - 175) / 200;
+ } else if (xp < 675) {
+ level = 3;
+ progress = (xp - 375) / 300;
+ } else if (xp < 1175) {
+ level = 4;
+ progress = (xp - 675) / 500;
+ } else if (xp < 1925) {
+ level = 5;
+ progress = (xp - 1175) / 750;
+ } else if (xp < 2925) {
+ level = 6;
+ progress = (xp - 1925) / 1000;
+ } else if (xp < 4425) {
+ level = 7;
+ progress = (xp - 2925) / 1500;
+ } else if (xp < 6425) {
+ level = 8;
+ progress = (xp - 4425) / 2000;
+ } else if (xp < 9925) {
+ level = 9;
+ progress = (xp - 6425) / 3500;
+ } else if (xp < 14925) {
+ level = 10;
+ progress = (xp - 9925) / 5000;
+ } else if (xp < 22425) {
+ level = 11;
+ progress = (xp - 14925) / 7500;
+ } else if (xp < 32425) {
+ level = 12;
+ progress = (xp - 22425) / 10000;
+ } else if (xp < 47425) {
+ level = 13;
+ progress = (xp - 32425) / 15000;
+ } else if (xp < 67425) {
+ level = 14;
+ progress = (xp - 47425) / 20000;
+ } else if (xp < 97425) {
+ level = 15;
+ progress = (xp - 67425) / 30000;
+ } else if (xp < 147425) {
+ level = 16;
+ progress = (xp - 97425) / 50000;
+ } else if (xp < 222425) {
+ level = 17;
+ progress = (xp - 147425) / 75000;
+ } else if (xp < 322425) {
+ level = 18;
+ progress = (xp - 222425) / 100000;
+ } else if (xp < 522425) {
+ level = 19;
+ progress = (xp - 322425) / 200000;
+ } else if (xp < 822425) {
+ level = 20;
+ progress = (xp - 522425) / 300000;
+ } else if (xp < 1222425) {
+ level = 21;
+ progress = (xp - 822425) / 400000;
+ } else if (xp < 1722425) {
+ level = 22;
+ progress = (xp - 1222425) / 500000;
+ } else if (xp < 2322425) {
+ level = 23;
+ progress = (xp - 1722425) / 600000;
+ } else if (xp < 3022425) {
+ level = 24;
+ progress = (xp - 2322425) / 700000;
+ } else if (xp < 3822425) {
+ level = 25;
+ progress = (xp - 3022425) / 800000;
+ } else if (xp < 4722425) {
+ level = 26;
+ progress = (xp - 3822425) / 900000;
+ } else if (xp < 5722425) {
+ level = 27;
+ progress = (xp - 4722425) / 1000000;
+ } else if (xp < 6822425) {
+ level = 28;
+ progress = (xp - 5722425) / 1100000;
+ } else if (xp < 8022425) {
+ level = 29;
+ progress = (xp - 6822425) / 1200000;
+ } else if (xp < 9322425) {
+ level = 30;
+ progress = (xp - 8022425) / 1300000;
+ } else if (xp < 10722425) {
+ level = 31;
+ progress = (xp - 9322425) / 1400000;
+ } else if (xp < 12222425) {
+ level = 32;
+ progress = (xp - 10722425) / 1500000;
+ } else if (xp < 13822425) {
+ level = 33;
+ progress = (xp - 12222425) / 1600000;
+ } else if (xp < 15522425) {
+ level = 34;
+ progress = (xp - 13822425) / 1700000;
+ } else if (xp < 17322425) {
+ level = 35;
+ progress = (xp - 15522425) / 1800000;
+ } else if (xp < 19222425) {
+ level = 36;
+ progress = (xp - 17322425) / 1900000;
+ } else if (xp < 21222425) {
+ level = 37;
+ progress = (xp - 19222425) / 2000000;
+ } else if (xp < 23322425) {
+ level = 38;
+ progress = (xp - 21222425) / 2100000;
+ } else if (xp < 25522425) {
+ level = 39;
+ progress = (xp - 23322425) / 2200000;
+ } else if (xp < 27822425) {
+ level = 40;
+ progress = (xp - 25522425) / 2300000;
+ } else if (xp < 30222425) {
+ level = 41;
+ progress = (xp - 27822425) / 2400000;
+ } else if (xp < 32722425) {
+ level = 42;
+ progress = (xp - 30222425) / 2500000;
+ } else if (xp < 35322425) {
+ level = 43;
+ progress = (xp - 32722425) / 2600000;
+ } else if (xp < 38072425) {
+ level = 44;
+ progress = (xp - 35322425) / 2750000;
+ } else if (xp < 40972425) {
+ level = 45;
+ progress = (xp - 38072425) / 2900000;
+ } else if (xp < 44072425) {
+ level = 46;
+ progress = (xp - 40972425) / 3100000;
+ } else if (xp < 47472425) {
+ level = 47;
+ progress = (xp - 44072425) / 3400000;
+ } else if (xp < 51172425) {
+ level = 48;
+ progress = (xp - 47472425) / 3700000;
+ } else if (xp < 55172425) {
+ level = 49;
+ progress = (xp - 51172425) / 4000000;
+ } else {
+ level = 50;
+ progress = 0;
+ }
+
+ return level + progress;
+ }
+
+ @Override
+ public String getCommandName() {
+ return "skills";
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender arg0) {
+ return getCommandName() + " [name]";
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public List<String> addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) {
+ if (args.length == 1) {
+ return Utils.getMatchingPlayers(args[0]);
+ }
+ return null;
+ }
+
+ @Override
+ public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException {
+ // MULTI THREAD DRIFTING
+ new Thread(() -> {
+ APIHandler ah = new APIHandler();
+ ConfigHandler cf = new ConfigHandler();
+ EntityPlayer player = (EntityPlayer) arg0;
+
+ // Check key
+ String key = cf.getString("api", "APIKey");
+ if (key.equals("")) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "API key not set. Use /setkey."));
+ }
+
+ // Get UUID for Hypixel API requests
+ String username;
+ String uuid;
+ if (arg1.length == 0) {
+ username = player.getName();
+ uuid = player.getUniqueID().toString().replaceAll("[\\-]", "");
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Checking skills of " + EnumChatFormatting.DARK_GREEN + username));
+ } else {
+ username = arg1[0];
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Checking skills of " + EnumChatFormatting.DARK_GREEN + username));
+ uuid = ah.getUUID(username);
+ }
+
+ // Find stats of latest profile
+ String latestProfile = ah.getLatestProfileID(uuid, key);
+ if (latestProfile == null) return;
+
+ String profileURL = "https://api.hypixel.net/skyblock/profile?profile=" + latestProfile + "&key=" + key;
+ System.out.println("Fetching profile...");
+ JsonObject profileResponse = ah.getResponse(profileURL);
+ if (!profileResponse.get("success").getAsBoolean()) {
+ String reason = profileResponse.get("cause").getAsString();
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Failed with reason: " + reason));
+ return;
+ }
+
+ System.out.println("Fetching skills...");
+ JsonObject userObject = profileResponse.get("profile").getAsJsonObject().get("members").getAsJsonObject().get(uuid).getAsJsonObject();
+
+ double farmingLevel = 0;
+ double miningLevel = 0;
+ double combatLevel = 0;
+ double foragingLevel = 0;
+ double fishingLevel = 0;
+ double enchantingLevel = 0;
+ double alchemyLevel = 0;
+ double tamingLevel = 0;
+
+ if (userObject.has("experience_skill_farming") || userObject.has("experience_skill_mining") || userObject.has("experience_skill_combat") || userObject.has("experience_skill_foraging") || userObject.has("experience_skill_fishing") || userObject.has("experience_skill_enchanting") || userObject.has("experience_skill_alchemy")) {
+ if (userObject.has("experience_skill_farming")) {
+ farmingLevel = xpToLevel(userObject.get("experience_skill_farming").getAsDouble());
+ farmingLevel = (double) Math.round(farmingLevel * 100) / 100;
+ }
+ if (userObject.has("experience_skill_mining")) {
+ miningLevel = xpToLevel(userObject.get("experience_skill_mining").getAsDouble());
+ miningLevel = (double) Math.round(miningLevel * 100) / 100;
+ }
+ if (userObject.has("experience_skill_combat")) {
+ combatLevel = xpToLevel(userObject.get("experience_skill_combat").getAsDouble());
+ combatLevel = (double) Math.round(combatLevel * 100) / 100;
+ }
+ if (userObject.has("experience_skill_foraging")) {
+ foragingLevel = xpToLevel(userObject.get("experience_skill_foraging").getAsDouble());
+ foragingLevel = (double) Math.round(foragingLevel * 100) / 100;
+ }
+ if (userObject.has("experience_skill_fishing")) {
+ fishingLevel = xpToLevel(userObject.get("experience_skill_fishing").getAsDouble());
+ fishingLevel = (double) Math.round(fishingLevel * 100) / 100;
+ }
+ if (userObject.has("experience_skill_enchanting")) {
+ enchantingLevel = xpToLevel(userObject.get("experience_skill_enchanting").getAsDouble());
+ enchantingLevel = (double) Math.round(enchantingLevel * 100) / 100;
+ }
+ if (userObject.has("experience_skill_alchemy")) {
+ alchemyLevel = xpToLevel(userObject.get("experience_skill_alchemy").getAsDouble());
+ alchemyLevel = (double) Math.round(alchemyLevel * 100) / 100;
+ }
+ if (userObject.has("experience_skill_taming")) {
+ tamingLevel = xpToLevel(userObject.get("experience_skill_taming").getAsDouble());
+ tamingLevel = (double) Math.round(tamingLevel * 100) / 100;
+ }
+ } else {
+ // Get skills from achievement API, will be floored
+
+ String playerURL = "https://api.hypixel.net/player?uuid=" + uuid + "&key=" + key;
+ System.out.println("Fetching skills from achievement API");
+ JsonObject playerObject = ah.getResponse(playerURL);
+
+ if (!playerObject.get("success").getAsBoolean()) {
+ String reason = profileResponse.get("cause").getAsString();
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Failed with reason: " + reason));
+ return;
+ }
+
+ JsonObject achievementObject = playerObject.get("player").getAsJsonObject().get("achievements").getAsJsonObject();
+ farmingLevel = achievementObject.get("skyblock_harvester").getAsInt();
+ miningLevel = achievementObject.get("skyblock_excavator").getAsInt();
+ combatLevel = achievementObject.get("skyblock_combat").getAsInt();
+ foragingLevel = achievementObject.get("skyblock_gatherer").getAsInt();
+ fishingLevel = achievementObject.get("skyblock_angler").getAsInt();
+ enchantingLevel = achievementObject.get("skyblock_augmentation").getAsInt();
+ alchemyLevel = achievementObject.get("skyblock_concoctor").getAsInt();
+ tamingLevel = achievementObject.get("skyblock_domesticator").getAsInt();
+ }
+
+ double skillAvg = (farmingLevel + miningLevel + combatLevel + foragingLevel + fishingLevel + enchantingLevel + alchemyLevel + tamingLevel) / 8;
+ skillAvg = (double) Math.round(skillAvg * 100) / 100;
+ double trueAvg = (Math.floor(farmingLevel) + Math.floor(miningLevel) + Math.floor(combatLevel) + Math.floor(foragingLevel) + Math.floor(fishingLevel) + Math.floor(enchantingLevel) + Math.floor(alchemyLevel) + Math.floor(tamingLevel)) / 8;
+
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.AQUA + "" + EnumChatFormatting.BOLD + "-------------------\n" +
+ EnumChatFormatting.AQUA + " " + username + "'s Skills:\n" +
+ EnumChatFormatting.GREEN + " Farming: " + EnumChatFormatting.DARK_GREEN + EnumChatFormatting.BOLD + farmingLevel + "\n" +
+ EnumChatFormatting.GREEN + " Mining: " + EnumChatFormatting.DARK_GREEN + EnumChatFormatting.BOLD + miningLevel + "\n" +
+ EnumChatFormatting.GREEN + " Combat: " + EnumChatFormatting.DARK_GREEN + EnumChatFormatting.BOLD + combatLevel + "\n" +
+ EnumChatFormatting.GREEN + " Foraging: " + EnumChatFormatting.DARK_GREEN + EnumChatFormatting.BOLD + foragingLevel + "\n" +
+ EnumChatFormatting.GREEN + " Fishing: " + EnumChatFormatting.DARK_GREEN + EnumChatFormatting.BOLD + fishingLevel + "\n" +
+ EnumChatFormatting.GREEN + " Enchanting: " + EnumChatFormatting.DARK_GREEN + EnumChatFormatting.BOLD + enchantingLevel + "\n" +
+ EnumChatFormatting.GREEN + " Alchemy: " + EnumChatFormatting.DARK_GREEN + EnumChatFormatting.BOLD + alchemyLevel + "\n" +
+ EnumChatFormatting.GREEN + " Taming: " + EnumChatFormatting.DARK_GREEN + EnumChatFormatting.BOLD + tamingLevel + "\n" +
+ EnumChatFormatting.AQUA + " Average Skill Level: " + EnumChatFormatting.GOLD + EnumChatFormatting.BOLD + skillAvg + "\n" +
+ EnumChatFormatting.AQUA + " True Average Skill Level: " + EnumChatFormatting.GOLD + EnumChatFormatting.BOLD + trueAvg + "\n" +
+ EnumChatFormatting.AQUA + " " + EnumChatFormatting.BOLD + "-------------------"));
+ }).start();
+ }
+
+}
diff --git a/src/main/java/me/Danker/commands/SlayerCommand.java b/src/main/java/me/Danker/commands/SlayerCommand.java
new file mode 100644
index 0000000..f8100b4
--- /dev/null
+++ b/src/main/java/me/Danker/commands/SlayerCommand.java
@@ -0,0 +1,112 @@
+package me.Danker.commands;
+
+import java.text.NumberFormat;
+import java.util.List;
+
+import com.google.gson.JsonObject;
+
+import me.Danker.handlers.APIHandler;
+import me.Danker.handlers.ConfigHandler;
+import me.Danker.utils.Utils;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.CommandException;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+
+public class SlayerCommand extends CommandBase {
+
+ @Override
+ public String getCommandName() {
+ return "slayer";
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender arg0) {
+ return getCommandName() + " [name]";
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public List<String> addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) {
+ if (args.length == 1) {
+ return Utils.getMatchingPlayers(args[0]);
+ }
+ return null;
+ }
+
+ @Override
+ public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException {
+ // MULTI THREAD DRIFTING
+ new Thread(() -> {
+ APIHandler ah = new APIHandler();
+ ConfigHandler cf = new ConfigHandler();
+ EntityPlayer player = (EntityPlayer) arg0;
+
+ // Check key
+ String key = cf.getString("api", "APIKey");
+ if (key.equals("")) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "API key not set. Use /setkey."));
+ }
+
+ // Get UUID for Hypixel API requests
+ String username;
+ String uuid;
+ if (arg1.length == 0) {
+ username = player.getName();
+ uuid = player.getUniqueID().toString().replaceAll("[\\-]", "");
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Checking slayer of " + EnumChatFormatting.DARK_GREEN + username));
+ } else {
+ username = arg1[0];
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Checking slayer of " + EnumChatFormatting.DARK_GREEN + username));
+ uuid = ah.getUUID(username);
+ }
+
+ // Find stats of latest profile
+ String latestProfile = ah.getLatestProfileID(uuid, key);
+ if (latestProfile == null) return;
+
+ String profileURL = "https://api.hypixel.net/skyblock/profile?profile=" + latestProfile + "&key=" + key;
+ System.out.println("Fetching profile...");
+ JsonObject profileResponse = ah.getResponse(profileURL);
+ if (!profileResponse.get("success").getAsBoolean()) {
+ String reason = profileResponse.get("cause").getAsString();
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Failed with reason: " + reason));
+ return;
+ }
+
+ System.out.println("Fetching slayer stats...");
+ JsonObject slayersObject = profileResponse.get("profile").getAsJsonObject().get("members").getAsJsonObject().get(uuid).getAsJsonObject().get("slayer_bosses").getAsJsonObject();
+ // Zombie
+ int zombieXP = 0;
+ if (slayersObject.get("zombie").getAsJsonObject().has("xp")) {
+ zombieXP = slayersObject.get("zombie").getAsJsonObject().get("xp").getAsInt();
+ }
+ // Spider
+ int spiderXP = 0;
+ if (slayersObject.get("spider").getAsJsonObject().has("xp")) {
+ spiderXP = slayersObject.get("spider").getAsJsonObject().get("xp").getAsInt();
+ }
+ // Wolf
+ int wolfXP = 0;
+ if (slayersObject.get("wolf").getAsJsonObject().has("xp")) {
+ wolfXP = slayersObject.get("wolf").getAsJsonObject().get("xp").getAsInt();
+ }
+
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.AQUA + "" + EnumChatFormatting.BOLD + "-------------------\n" +
+ EnumChatFormatting.AQUA + " " + username + "'s Total XP: " + EnumChatFormatting.GOLD + EnumChatFormatting.BOLD + NumberFormat.getIntegerInstance().format(zombieXP + spiderXP + wolfXP) + "\n" +
+ EnumChatFormatting.AQUA + " Zombie XP: " + EnumChatFormatting.BLUE + EnumChatFormatting.BOLD + NumberFormat.getIntegerInstance().format(zombieXP) + "\n" +
+ EnumChatFormatting.AQUA + " Spider XP: " + EnumChatFormatting.BLUE + EnumChatFormatting.BOLD + NumberFormat.getIntegerInstance().format(spiderXP) + "\n" +
+ EnumChatFormatting.AQUA + " Wolf XP: " + EnumChatFormatting.BLUE + EnumChatFormatting.BOLD + NumberFormat.getIntegerInstance().format(wolfXP) + "\n" +
+ EnumChatFormatting.AQUA + " " + EnumChatFormatting.BOLD + "-------------------"));
+
+ }).start();
+ }
+
+}
diff --git a/src/main/java/me/Danker/commands/ToggleCommand.java b/src/main/java/me/Danker/commands/ToggleCommand.java
new file mode 100644
index 0000000..decf99a
--- /dev/null
+++ b/src/main/java/me/Danker/commands/ToggleCommand.java
@@ -0,0 +1,83 @@
+package me.Danker.commands;
+
+import java.util.List;
+
+import me.Danker.handlers.ConfigHandler;
+import net.minecraft.command.CommandBase;
+import net.minecraft.command.CommandException;
+import net.minecraft.command.ICommand;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+
+public class ToggleCommand extends CommandBase implements ICommand {
+ public static boolean gpartyToggled;
+ public static boolean coordsToggled;
+ public static boolean goldenToggled;
+ public static boolean slayerCountTotal;
+ public static boolean rngesusAlerts;
+
+ @Override
+ public String getCommandName() {
+ return "toggle";
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender arg0) {
+ return getCommandName() + " <gparty/coords/golden/slayercount/rngesusalerts/list>";
+ }
+
+ @Override
+ public int getRequiredPermissionLevel() {
+ return 0;
+ }
+
+ @Override
+ public List<String> addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) {
+ if (args.length == 1) {
+ return getListOfStringsMatchingLastWord(args, "gparty", "coords", "golden", "slayercount", "rngesusalerts", "list");
+ }
+ return null;
+ }
+
+ @Override
+ public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException {
+ final EntityPlayer player = (EntityPlayer)arg0;
+ final ConfigHandler cf = new ConfigHandler();
+
+ if (arg1.length == 0) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /toggle <gparty/coords/golden/slayercount/rngesusalerts/list>"));
+ return;
+ }
+
+ if (arg1[0].equalsIgnoreCase("gparty")) {
+ gpartyToggled = !gpartyToggled;
+ cf.writeBooleanConfig("toggles", "GParty", gpartyToggled);
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Guild party notifications has been set to " + EnumChatFormatting.DARK_GREEN + gpartyToggled + EnumChatFormatting.GREEN + "."));
+ } else if (arg1[0].equalsIgnoreCase("coords")) {
+ coordsToggled = !coordsToggled;
+ cf.writeBooleanConfig("toggles", "Coords", coordsToggled);
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Coord/Angle display has been set to " + EnumChatFormatting.DARK_GREEN + coordsToggled + EnumChatFormatting.GREEN + "."));
+ } else if (arg1[0].equalsIgnoreCase("golden")) {
+ goldenToggled = !goldenToggled;
+ cf.writeBooleanConfig("toggles", "Golden", goldenToggled);
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Golden T6 enchants has been set to " + EnumChatFormatting.DARK_GREEN + goldenToggled + EnumChatFormatting.GREEN + "."));
+ } else if (arg1[0].equalsIgnoreCase("slayercount")) {
+ slayerCountTotal = !slayerCountTotal;
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Counting total 20% slayer drops has been set to " + EnumChatFormatting.DARK_GREEN + slayerCountTotal + EnumChatFormatting.GREEN + "."));
+ } else if (arg1[0].equalsIgnoreCase("rngesusalerts")) {
+ rngesusAlerts = !rngesusAlerts;
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Slayer RNGesus alerts has been set to " + EnumChatFormatting.DARK_GREEN + rngesusAlerts + EnumChatFormatting.GREEN + "."));
+ } else if (arg1[0].equalsIgnoreCase("list")) {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Guild party notifications: " + EnumChatFormatting.DARK_GREEN + gpartyToggled + "\n" +
+ EnumChatFormatting.GREEN + " Coord/Angle display: " + EnumChatFormatting.DARK_GREEN + coordsToggled + "\n" +
+ EnumChatFormatting.GREEN + " Golden T6 enchants: " + EnumChatFormatting.DARK_GREEN + goldenToggled + "\n" +
+ EnumChatFormatting.GREEN + " Counting total 20% slayer drops: " + EnumChatFormatting.DARK_GREEN + slayerCountTotal + "\n" +
+ EnumChatFormatting.GREEN + " Slayer RNGesus alerts: " + EnumChatFormatting.DARK_GREEN + rngesusAlerts));
+ } else {
+ player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /toggle <gparty/coords/golden/slayercount/rngesusalerts/list>"));
+ }
+ }
+}