aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java6
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/commands/dev/DevTestCommand.java12
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/commands/dev/PackDevCommand.java8
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/commands/dev/StatsCommand.java8
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/commands/dungeon/DnCommand.java5
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/commands/dungeon/JoinDungeonCommand.java13
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/commands/dungeon/MapCommand.java9
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/commands/help/FeaturesCommand.java20
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/commands/help/HelpCommand.java10
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/commands/help/LinksCommand.java7
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/commands/misc/AhCommand.java10
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/commands/misc/CosmeticsCommand.java7
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/commands/profile/PeekCommand.java44
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/commands/profile/ViewProfileCommand.java20
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/core/util/StringUtils.java10
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/infopanes/DevInfoPane.java8
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java3
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/listener/NEUEventListener.java25
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java50
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/listener/ScoreboardLocationChangeListener.java4
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CookieWarning.java7
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolver.java26
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolver.java64
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FairySouls.java4
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/Navigation.java5
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java5
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/TrophyRewardOverlay.java15
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/ApiData.java58
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/Minion.java94
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/MinionHelperManager.java290
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/MinionHelperOverlay.java344
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/MinionHelperTooltips.java92
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/loaders/MinionHelperApiLoader.java188
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/loaders/MinionHelperInventoryLoader.java109
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/loaders/MinionHelperRepoLoader.java306
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/renderables/RenderableObject.java23
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/renderables/RenderableText.java40
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/CollectionRequirement.java44
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/CustomRequirement.java33
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/MinionRequirement.java24
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/ReputationRequirement.java44
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/SlayerRequirement.java44
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/sources/CraftingSource.java37
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/sources/CustomSource.java37
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/sources/MinionSource.java36
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/sources/NpcSource.java49
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityPlayerSP.java5
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java22
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeGenerator.java61
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/util/NEUDebugLogger.java2
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java4
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java15
52 files changed, 2134 insertions, 272 deletions
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
index 6bf6d86b..2d457ee6 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
@@ -60,6 +60,12 @@ import io.github.moulberry.notenoughupdates.miscgui.CalendarOverlay;
import io.github.moulberry.notenoughupdates.miscgui.InventoryStorageSelector;
import io.github.moulberry.notenoughupdates.miscgui.SignCalculator;
import io.github.moulberry.notenoughupdates.miscgui.TrophyRewardOverlay;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.MinionHelperManager;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.loaders.MinionHelperApiLoader;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.loaders.MinionHelperInventoryLoader;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.MinionHelperOverlay;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.loaders.MinionHelperRepoLoader;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.MinionHelperTooltips;
import io.github.moulberry.notenoughupdates.mixins.AccessorMinecraft;
import io.github.moulberry.notenoughupdates.options.NEUConfig;
import io.github.moulberry.notenoughupdates.overlays.FuelBar;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/DevTestCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/DevTestCommand.java
index 7cca9d3b..faed1984 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/DevTestCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/DevTestCommand.java
@@ -28,6 +28,7 @@ import io.github.moulberry.notenoughupdates.miscfeatures.customblockzones.Locati
import io.github.moulberry.notenoughupdates.miscfeatures.customblockzones.SpecialBlockZone;
import io.github.moulberry.notenoughupdates.miscgui.GuiPriceGraph;
import io.github.moulberry.notenoughupdates.util.SBInfo;
+import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.command.CommandException;
@@ -105,8 +106,7 @@ public class DevTestCommand extends ClientCommandBase {
Minecraft.getMinecraft().getNetHandler().getNetworkManager().closeChannel(component);
return;
}
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- DEV_FAIL_STRINGS[devFailIndex++]));
+ Utils.addChatMessage(EnumChatFormatting.RED + DEV_FAIL_STRINGS[devFailIndex++]);
return;
}
if (args.length >= 1 && args[0].equalsIgnoreCase("profileinfo")) {
@@ -159,18 +159,16 @@ public class DevTestCommand extends ClientCommandBase {
}
if (args.length == 1 && args[0].equalsIgnoreCase("searchmode")) {
NotEnoughUpdates.INSTANCE.config.hidden.firstTimeSearchFocus = true;
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.AQUA +
- "I would never search"));
+ Utils.addChatMessage(EnumChatFormatting.AQUA + "I would never search");
return;
}
if (args.length == 2 && args[0].equalsIgnoreCase("openGui")) {
try {
NotEnoughUpdates.INSTANCE.openGui = (GuiScreen) Class.forName(args[1]).newInstance();
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- "Opening gui: " + NotEnoughUpdates.INSTANCE.openGui));
+ Utils.addChatMessage("Opening gui: " + NotEnoughUpdates.INSTANCE.openGui);
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException | ClassCastException e) {
e.printStackTrace();
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("Failed to open this gui."));
+ Utils.addChatMessage("Failed to open this gui.");
}
}
if (args.length == 1 && args[0].equalsIgnoreCase("center")) {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/PackDevCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/PackDevCommand.java
index e1504472..1d30a15f 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/PackDevCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/PackDevCommand.java
@@ -22,6 +22,7 @@ package io.github.moulberry.notenoughupdates.commands.dev;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
import io.github.moulberry.notenoughupdates.core.util.MiscUtils;
+import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.AbstractClientPlayer;
import net.minecraft.command.CommandException;
@@ -290,11 +291,10 @@ public class PackDevCommand extends ClientCommandBase {
}
if ((single && closest == null) || (!single && result.length() == 0)) {
- mc.thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.RED + "No " + typeFriendlyName + "s found within " + dist + " blocks."));
+ Utils.addChatMessage(EnumChatFormatting.RED + "No " + typeFriendlyName + "s found within " + dist + " blocks.");
} else {
- mc.thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.GREEN + "Copied " + typeFriendlyName + " data to clipboard"));
+ Utils.addChatMessage(
+ EnumChatFormatting.GREEN + "Copied " + typeFriendlyName + " data to clipboard");
return single ? livingBaseDataBuilder(closest, clazz) : result;
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/StatsCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/StatsCommand.java
index 756afc88..b03e7f05 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/StatsCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/StatsCommand.java
@@ -24,11 +24,11 @@ import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
import io.github.moulberry.notenoughupdates.util.DiscordMarkdownBuilder;
import io.github.moulberry.notenoughupdates.util.HastebinUploader;
import io.github.moulberry.notenoughupdates.util.SBInfo;
+import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.command.ICommandSender;
import net.minecraft.util.BlockPos;
-import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import net.minecraftforge.common.ForgeVersion;
import net.minecraftforge.fml.common.Loader;
@@ -118,10 +118,8 @@ public class StatsCommand extends ClientCommandBase {
}
private static void modPrefixedMessage(String message) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.GOLD + "[" + EnumChatFormatting.RED + "NotEnoughUpdates" + EnumChatFormatting.GOLD + "]: " +
- message));
-
+ Utils.addChatMessage(
+ EnumChatFormatting.GOLD + "[" + EnumChatFormatting.RED + "NotEnoughUpdates" + EnumChatFormatting.GOLD + "]: " + message);
}
private static String createStats() {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/dungeon/DnCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/dungeon/DnCommand.java
index a5a7bcca..3b697905 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/dungeon/DnCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/dungeon/DnCommand.java
@@ -20,10 +20,10 @@
package io.github.moulberry.notenoughupdates.commands.dungeon;
import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
+import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommandSender;
-import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
public class DnCommand extends ClientCommandBase {
@@ -35,7 +35,6 @@ public class DnCommand extends ClientCommandBase {
@Override
public void processCommand(ICommandSender sender, String[] args) throws CommandException {
Minecraft.getMinecraft().thePlayer.sendChatMessage("/warp dungeon_hub");
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.AQUA + "Warping to:" + EnumChatFormatting.YELLOW + " Deez Nuts lmao"));
+ Utils.addChatMessage(EnumChatFormatting.AQUA + "Warping to:" + EnumChatFormatting.YELLOW + " Deez Nuts lmao");
}
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/dungeon/JoinDungeonCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/dungeon/JoinDungeonCommand.java
index d69f86f3..5916bb61 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/dungeon/JoinDungeonCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/dungeon/JoinDungeonCommand.java
@@ -21,10 +21,10 @@ package io.github.moulberry.notenoughupdates.commands.dungeon;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
+import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommandSender;
-import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import org.apache.commons.lang3.StringUtils;
@@ -40,19 +40,16 @@ public class JoinDungeonCommand extends ClientCommandBase {
Minecraft.getMinecraft().thePlayer.sendChatMessage("/join " + StringUtils.join(args, " "));
} else {
if (args.length != 1) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.RED + "Example Usage: /join f7, /join m6 or /join 7"));
+ Utils.addChatMessage(EnumChatFormatting.RED + "Example Usage: /join f7, /join m6 or /join 7");
} else {
String cataPrefix = "catacombs";
if (args[0].startsWith("m")) {
cataPrefix = "master_catacombs";
}
String cmd = "/joindungeon " + cataPrefix + " " + args[0].charAt(args[0].length() - 1);
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.YELLOW + "Running command: " + cmd));
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.YELLOW +
- "The dungeon should start soon. If it doesn't, make sure you have a party of 5 people"));
+ Utils.addChatMessage(EnumChatFormatting.YELLOW + "Running command: " + cmd);
+ Utils.addChatMessage(EnumChatFormatting.YELLOW +
+ "The dungeon should start soon. If it doesn't, make sure you have a party of 5 people");
Minecraft.getMinecraft().thePlayer.sendChatMessage(cmd);
}
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/dungeon/MapCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/dungeon/MapCommand.java
index 83db26bb..807fcc27 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/dungeon/MapCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/dungeon/MapCommand.java
@@ -24,6 +24,7 @@ import com.google.gson.JsonObject;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
import io.github.moulberry.notenoughupdates.dungeons.GuiDungeonMapEditor;
+import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.block.material.MapColor;
import net.minecraft.client.Minecraft;
import net.minecraft.command.CommandException;
@@ -51,8 +52,9 @@ public class MapCommand extends ClientCommandBase {
@Override
public void processCommand(ICommandSender sender, String[] args) throws CommandException {
if (!NotEnoughUpdates.INSTANCE.config.hidden.dev) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.RED + "[NEU] The map does not work right now. You can use the map from other mods, for example: SkyblockAddons, DungeonsGuide or Skytils."));
+ Utils.addChatMessage(
+ EnumChatFormatting.RED +
+ "[NEU] The map does not work right now. You can use the map from other mods, for example: SkyblockAddons, DungeonsGuide or Skytils.");
return;
}
@@ -133,8 +135,7 @@ public class MapCommand extends ClientCommandBase {
e.printStackTrace();
}
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN +
- "Saved to file."));
+ Utils.addChatMessage(EnumChatFormatting.GREEN + "Saved to file.");
}
return;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/help/FeaturesCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/help/FeaturesCommand.java
index 5f709c4f..bc389ad4 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/help/FeaturesCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/help/FeaturesCommand.java
@@ -41,18 +41,9 @@ public class FeaturesCommand extends ClientCommandBase {
@Override
public void processCommand(ICommandSender sender, String[] args) throws CommandException {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(""));
+ Utils.addChatMessage("");
if (Constants.MISC == null || !Constants.MISC.has("featureslist")) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- "" + EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD + "WARNING: " + EnumChatFormatting.RESET +
- EnumChatFormatting.RED + "Could not load URL from repo."));
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- "" + EnumChatFormatting.RED + "Please run " + EnumChatFormatting.BOLD + "/neuresetrepo" +
- EnumChatFormatting.RESET + EnumChatFormatting.RED + " and " + EnumChatFormatting.BOLD + "restart your game" +
- EnumChatFormatting.RESET + EnumChatFormatting.RED + " in order to fix. " + EnumChatFormatting.DARK_RED +
- EnumChatFormatting.BOLD + "If that doesn't fix it" + EnumChatFormatting.RESET + EnumChatFormatting.RED +
- ", please join discord.gg/moulberry and post in #neu-support"));
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(""));
+ Utils.showOutdatedRepoNotification();
return;
}
String url = Constants.MISC.get("featureslist").getAsString();
@@ -60,9 +51,8 @@ public class FeaturesCommand extends ClientCommandBase {
Desktop desk = Desktop.getDesktop();
try {
desk.browse(new URI(url));
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.DARK_PURPLE + "" + EnumChatFormatting.BOLD + "NEU" + EnumChatFormatting.RESET +
- EnumChatFormatting.GOLD + "> Opening Feature List in browser."));
+ Utils.addChatMessage( EnumChatFormatting.DARK_PURPLE + "" + EnumChatFormatting.BOLD + "NEU" + EnumChatFormatting.RESET +
+ EnumChatFormatting.GOLD + "> Opening Feature List in browser.");
} catch (URISyntaxException | IOException ignored) {
ChatComponentText clickTextFeatures = new ChatComponentText(
@@ -72,6 +62,6 @@ public class FeaturesCommand extends ClientCommandBase {
Minecraft.getMinecraft().thePlayer.addChatMessage(clickTextFeatures);
}
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(""));
+ Utils.addChatMessage("");
}
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/help/HelpCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/help/HelpCommand.java
index 7655f561..86699b79 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/help/HelpCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/help/HelpCommand.java
@@ -22,9 +22,8 @@ package io.github.moulberry.notenoughupdates.commands.help;
import com.google.common.collect.Lists;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
-import net.minecraft.client.Minecraft;
+import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.command.ICommandSender;
-import net.minecraft.util.ChatComponentText;
import java.util.ArrayList;
@@ -66,7 +65,7 @@ public class HelpCommand extends ClientCommandBase {
"\u00a76/neupackdev \u00a7r\u00a77- pack creator command - getnpc, getmob(s), getarmorstand(s), getall. Optional radius argument for all."
);
for (String neuHelpMessage : neuHelpMessages) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(neuHelpMessage));
+ Utils.addChatMessage(neuHelpMessage);
}
if (NotEnoughUpdates.INSTANCE.config.hidden.dev) {
ArrayList<String> neuDevHelpMessages = Lists.newArrayList(
@@ -76,7 +75,7 @@ public class HelpCommand extends ClientCommandBase {
);
for (String neuDevHelpMessage : neuDevHelpMessages) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(neuDevHelpMessage));
+ Utils.addChatMessage(neuDevHelpMessage);
}
}
String[] helpInfo = {
@@ -89,8 +88,7 @@ public class HelpCommand extends ClientCommandBase {
};
for (String message : helpInfo) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(message));
+ Utils.addChatMessage(message);
}
-
}
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/help/LinksCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/help/LinksCommand.java
index 9938403c..793e652e 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/help/LinksCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/help/LinksCommand.java
@@ -22,10 +22,9 @@ package io.github.moulberry.notenoughupdates.commands.help;
import com.google.gson.JsonObject;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
-import net.minecraft.client.Minecraft;
+import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommandSender;
-import net.minecraft.util.ChatComponentText;
import java.io.File;
@@ -43,9 +42,9 @@ public class LinksCommand extends ClientCommandBase {
try {
JsonObject update = NotEnoughUpdates.INSTANCE.manager.getJsonFromFile(updateJson);
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(""));
+ Utils.addChatMessage("");
NotEnoughUpdates.INSTANCE.displayLinks(update,0 );
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(""));
+ Utils.addChatMessage("");
} catch (Exception ignored) {
}
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/AhCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/AhCommand.java
index 1cd6bcce..5e3bd9b1 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/AhCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/AhCommand.java
@@ -22,10 +22,9 @@ package io.github.moulberry.notenoughupdates.commands.misc;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.auction.CustomAHGui;
import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
-import net.minecraft.client.Minecraft;
+import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommandSender;
-import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import org.apache.commons.lang3.StringUtils;
@@ -38,12 +37,11 @@ public class AhCommand extends ClientCommandBase {
@Override
public void processCommand(ICommandSender sender, String[] args) throws CommandException {
if (!NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard()) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "You must be on Skyblock to use this feature."));
+ Utils.addChatMessage(EnumChatFormatting.RED + "You must be on Skyblock to use this feature.");
} else if (NotEnoughUpdates.INSTANCE.config.apiData.apiKey == null ||
NotEnoughUpdates.INSTANCE.config.apiData.apiKey.trim().isEmpty()) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "Can't open NeuAH, apikey is not set. Run /api new and put the result in settings."));
+ Utils.addChatMessage(
+ EnumChatFormatting.RED + "Can't open NeuAH, apikey is not set. Run /api new and put the result in settings.");
} else {
NotEnoughUpdates.INSTANCE.openGui = new CustomAHGui();
NotEnoughUpdates.INSTANCE.manager.auctionManager.customAH.lastOpen = System.currentTimeMillis();
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/CosmeticsCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/CosmeticsCommand.java
index f74b5813..762f18bd 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/CosmeticsCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/CosmeticsCommand.java
@@ -22,11 +22,10 @@ package io.github.moulberry.notenoughupdates.commands.misc;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
import io.github.moulberry.notenoughupdates.cosmetics.GuiCosmetics;
-import net.minecraft.client.Minecraft;
+import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommandSender;
-import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
public class CosmeticsCommand extends ClientCommandBase {
@@ -38,8 +37,8 @@ public class CosmeticsCommand extends ClientCommandBase {
@Override
public void processCommand(ICommandSender sender, String[] args) throws CommandException {
if (!OpenGlHelper.isFramebufferEnabled() && NotEnoughUpdates.INSTANCE.config.notifications.doFastRenderNotif) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "NEU cosmetics do not work with OF Fast Render. Go to ESC > Options > Video Settings > Performance > Fast Render to disable it."));
+ Utils.addChatMessage(EnumChatFormatting.RED +
+ "NEU cosmetics do not work with OF Fast Render. Go to ESC > Options > Video Settings > Performance > Fast Render to disable it.");
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/profile/PeekCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/profile/PeekCommand.java
index 21afff87..2336eea2 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/profile/PeekCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/profile/PeekCommand.java
@@ -72,8 +72,8 @@ public class PeekCommand extends ClientCommandBase {
if (peekCommandExecutorService == null || peekCommandExecutorService.isShutdown()) {
peekCommandExecutorService = Executors.newSingleThreadScheduledExecutor();
} else {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.RED + "[PEEK] New peek command run, cancelling old one."));
+ Utils.addChatMessage(
+ EnumChatFormatting.RED + "[PEEK] New peek command run, cancelling old one.");
peekCommandExecutorService.shutdownNow();
peekCommandExecutorService = Executors.newSingleThreadScheduledExecutor();
}
@@ -113,8 +113,7 @@ public class PeekCommand extends ClientCommandBase {
EnumChatFormatting.STRIKETHROUGH + "-=-"), id);
if (skill == null) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.YELLOW + "Skills api disabled!"));
+ Utils.addChatMessage(EnumChatFormatting.YELLOW + "Skills api disabled!");
} else {
float totalSkillLVL = 0;
float totalSkillCount = 0;
@@ -180,19 +179,16 @@ public class PeekCommand extends ClientCommandBase {
overallScore += cata * cata / 2000f;
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- g + "Combat: " + combatPrefix + (int) Math.floor(combat) +
+ Utils.addChatMessage(g + "Combat: " + combatPrefix + (int) Math.floor(combat) +
(cata > 0 ? g + " - Cata: " + cataPrefix + cata : "") +
- g + " - AVG: " + avgPrefix + (int) Math.floor(avgSkillLVL)));
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- g + "Slayer: " + zombiePrefix + (int) Math.floor(zombie) + g + "-" +
+ g + " - AVG: " + avgPrefix + (int) Math.floor(avgSkillLVL));
+ Utils.addChatMessage(g + "Slayer: " + zombiePrefix + (int) Math.floor(zombie) + g + "-" +
spiderPrefix + (int) Math.floor(spider) + g + "-" +
wolfPrefix + (int) Math.floor(wolf) + "-" +
- endermanPrefix + (int) Math.floor(enderman)));
+ endermanPrefix + (int) Math.floor(enderman));
}
if (stats == null) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.YELLOW + "Skills, collection and/or inventory apis disabled!"));
+ Utils.addChatMessage(EnumChatFormatting.YELLOW + "Skills, collection and/or inventory apis disabled!");
} else {
int health = (int) stats.get("health");
int defence = (int) stats.get("defence");
@@ -220,11 +216,10 @@ public class PeekCommand extends ClientCommandBase {
: EnumChatFormatting.YELLOW)
: EnumChatFormatting.RED;
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- g + "Stats : " + healthPrefix + health + EnumChatFormatting.RED + "\u2764 " +
- defencePrefix + defence + EnumChatFormatting.GREEN + "\u2748 " +
- strengthPrefix + strength + EnumChatFormatting.RED + "\u2741 " +
- intelligencePrefix + intelligence + EnumChatFormatting.AQUA + "\u270e "));
+ Utils.addChatMessage( g + "Stats : " + healthPrefix + health + EnumChatFormatting.RED + "\u2764 " +
+ defencePrefix + defence + EnumChatFormatting.GREEN + "\u2748 " +
+ strengthPrefix + strength + EnumChatFormatting.RED + "\u2741 " +
+ intelligencePrefix + intelligence + EnumChatFormatting.AQUA + "\u270e ");
}
float bankBalance = Utils.getElementAsFloat(Utils.getElement(profileInfo, "banking.balance"), -1);
float purseBalance = Utils.getElementAsFloat(Utils.getElement(profileInfo, "coin_purse"), 0);
@@ -235,11 +230,10 @@ public class PeekCommand extends ClientCommandBase {
(money > 200 * 1000 * 1000
? EnumChatFormatting.GREEN
: EnumChatFormatting.YELLOW) : EnumChatFormatting.RED;
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- g + "Purse: " + moneyPrefix + Utils.shortNumberFormat(purseBalance, 0) + g + " - Bank: " +
- (bankBalance == -1 ? EnumChatFormatting.YELLOW + "N/A" : moneyPrefix +
- (isMe ? "4.8b" : Utils.shortNumberFormat(bankBalance, 0))) +
- (networth > 0 ? g + " - Net: " + moneyPrefix + Utils.shortNumberFormat(networth, 0) : "")));
+ Utils.addChatMessage( g + "Purse: " + moneyPrefix + Utils.shortNumberFormat(purseBalance, 0) + g + " - Bank: " +
+ (bankBalance == -1 ? EnumChatFormatting.YELLOW + "N/A" : moneyPrefix +
+ (isMe ? "4.8b" : Utils.shortNumberFormat(bankBalance, 0))) +
+ (networth > 0 ? g + " - Net: " + moneyPrefix + Utils.shortNumberFormat(networth, 0) : ""));
overallScore += Math.min(2, money / (100f * 1000 * 1000));
@@ -255,8 +249,7 @@ public class PeekCommand extends ClientCommandBase {
String col = NotEnoughUpdates.petRarityToColourMap.get(activePetTier);
if (col == null) col = EnumChatFormatting.LIGHT_PURPLE.toString();
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(g + "Pet : " +
- col + WordUtils.capitalizeFully(activePet.replace("_", " "))));
+ Utils.addChatMessage(g + "Pet : " + col + WordUtils.capitalizeFully(activePet.replace("_", " ")));
String overall = "Skywars Main";
if (isMe) {
@@ -281,8 +274,7 @@ public class PeekCommand extends ClientCommandBase {
overall = EnumChatFormatting.RED + "Played Skyblock";
}
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(g + "Overall score: " +
- overall + g + " (" + Math.round(overallScore * 10) / 10f + ")"));
+ Utils.addChatMessage(g + "Overall score: " + overall + g + " (" + Math.round(overallScore * 10) / 10f + ")");
peekCommandExecutorService.shutdownNow();
} else {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/profile/ViewProfileCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/profile/ViewProfileCommand.java
index e4ca497c..b5a3549c 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/profile/ViewProfileCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/profile/ViewProfileCommand.java
@@ -22,6 +22,7 @@ package io.github.moulberry.notenoughupdates.commands.profile;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer;
+import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.command.ICommandSender;
@@ -38,32 +39,31 @@ public class ViewProfileCommand extends ClientCommandBase {
public static final Consumer<String[]> RUNNABLE = (args) -> {
if (!OpenGlHelper.isFramebufferEnabled()) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "Some parts of the profile viewer do not work with OF Fast Render. Go to ESC > Options > Video Settings > Performance > Fast Render to disable it."));
+ Utils.addChatMessage(EnumChatFormatting.RED +
+ "Some parts of the profile viewer do not work with OF Fast Render. Go to ESC > Options > Video Settings > Performance > Fast Render to disable it.");
}
if (NotEnoughUpdates.INSTANCE.config.apiData.apiKey == null ||
NotEnoughUpdates.INSTANCE.config.apiData.apiKey.trim().isEmpty()) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "Can't view profile, apikey is not set. Run /api new and put the result in settings."));
+ Utils.addChatMessage(EnumChatFormatting.RED +
+ "Can't view profile, apikey is not set. Run /api new and put the result in settings.");
} else if (args.length == 0) {
NotEnoughUpdates.profileViewer.getProfileByName(Minecraft.getMinecraft().thePlayer.getName(), profile -> {
if (profile == null) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "Invalid player name/api key. Maybe api is down? Try /api new."));
+ Utils.addChatMessage(EnumChatFormatting.RED +
+ "Invalid player name/api key. Maybe api is down? Try /api new.");
} else {
profile.resetCache();
NotEnoughUpdates.INSTANCE.openGui = new GuiProfileViewer(profile);
}
});
} else if (args.length > 1) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "Too many arguments. Usage: /neuprofile [name]"));
+ Utils.addChatMessage(EnumChatFormatting.RED +
+ "Too many arguments. Usage: /neuprofile [name]");
} else {
NotEnoughUpdates.profileViewer.getProfileByName(args[0], profile -> {
if (profile == null) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "Invalid player name/api key. Maybe api is down? Try /api new."));
+ Utils.addChatMessage(EnumChatFormatting.RED + "Invalid player name/api key. Maybe api is down? Try /api new.");
} else {
profile.resetCache();
NotEnoughUpdates.INSTANCE.openGui = new GuiProfileViewer(profile);
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/StringUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/StringUtils.java
index d52f9ba1..59ba0a33 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/util/StringUtils.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/StringUtils.java
@@ -63,4 +63,14 @@ public class StringUtils {
str = str.replace(",", "");
return Integer.parseInt(str);
}
+
+ public static String removeLastWord(String string, String splitString) {
+ try {
+ String[] split = string.split(splitString);
+ String rawTier = split[split.length - 1];
+ return string.substring(0, string.length() - rawTier.length() - 1);
+ } catch (StringIndexOutOfBoundsException e) {
+ throw new RuntimeException("removeLastWord: '" + string + "'", e);
+ }
+ }
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/DevInfoPane.java b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/DevInfoPane.java
index a449919e..3c815016 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/DevInfoPane.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/DevInfoPane.java
@@ -25,7 +25,6 @@ import io.github.moulberry.notenoughupdates.NEUOverlay;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.block.Block;
-import net.minecraft.client.Minecraft;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.CraftingManager;
@@ -33,7 +32,6 @@ import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.ShapedRecipes;
import net.minecraft.item.crafting.ShapelessRecipes;
import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.oredict.ShapedOreRecipe;
@@ -688,7 +686,7 @@ public class DevInfoPane extends TextInfoPane {
json.addProperty("modver", NotEnoughUpdates.VERSION);
try {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("Added: " + internalname));
+ Utils.addChatMessage("Added: " + internalname);
manager.writeJsonDefaultDir(json, internalname + ".json");
manager.loadItem(internalname);
} catch (IOException ignored) {
@@ -918,7 +916,7 @@ public class DevInfoPane extends TextInfoPane {
json.addProperty("clickcommand", "");
try {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("Added: " + internalname));
+ Utils.addChatMessage("Added: " + internalname);
manager.writeJsonDefaultDir(json, internalname + ".json");
manager.loadItem(internalname);
} catch (IOException ignored) {
@@ -951,7 +949,7 @@ public class DevInfoPane extends TextInfoPane {
json.addProperty("clickcommand", "viewrecipe");
json.add("recipe", entry.getValue());
try {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("Added: " + internalname));
+ Utils.addChatMessage("Added: " + internalname);
if (entry.getKey() != 0 && entry.getKey() < 32000) {
manager.writeJsonDefaultDir(json, internalname + "-" + entry.getKey() + ".json");
} else {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java b/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java
index 457042ee..6b350789 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java
@@ -173,8 +173,7 @@ public class ChatListener {
0,
36
);
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.YELLOW + "[NEU] API Key automatically configured"));
+ Utils.addChatMessage(EnumChatFormatting.YELLOW + "[NEU] API Key automatically configured");
NotEnoughUpdates.INSTANCE.saveConfig();
} else if (unformatted.startsWith("Player List Info is now disabled!")) {
SBInfo.getInstance().hasNewTab = false;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/listener/NEUEventListener.java b/src/main/java/io/github/moulberry/notenoughupdates/listener/NEUEventListener.java
index 26c2d1f9..0add19f5 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/listener/NEUEventListener.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/NEUEventListener.java
@@ -290,35 +290,24 @@ public class NEUEventListener {
if (!NotEnoughUpdates.INSTANCE.config.hidden.loadedModBefore) {
NotEnoughUpdates.INSTANCE.config.hidden.loadedModBefore = true;
if (Constants.MISC == null || !Constants.MISC.has("featureslist")) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- "" + EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD + "WARNING: " + EnumChatFormatting.RESET +
- EnumChatFormatting.RED + "Could not load Feature List URL from repo."));
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- "" + EnumChatFormatting.RED + "Please run " + EnumChatFormatting.BOLD + "/neuresetrepo" +
- EnumChatFormatting.RESET + EnumChatFormatting.RED + " and " + EnumChatFormatting.BOLD +
- "restart your game" + EnumChatFormatting.RESET + EnumChatFormatting.RED + " in order to fix. " +
- EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD + "If that doesn't fix it" +
- EnumChatFormatting.RESET + EnumChatFormatting.RED +
- ", please join discord.gg/moulberry and post in #neu-support"));
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(""));
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- "" + EnumChatFormatting.GOLD + "To view the feature list after restarting type /neufeatures"));
+ Utils.showOutdatedRepoNotification();
+ Utils.addChatMessage(
+ "" + EnumChatFormatting.GOLD + "To view the feature list after restarting type /neufeatures");
} else {
String url = Constants.MISC.get("featureslist").getAsString();
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(""));
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.BLUE + "It seems this is your first time using NotEnoughUpdates."));
+ Utils.addChatMessage("");
+ Utils.addChatMessage(EnumChatFormatting.BLUE + "It seems this is your first time using NotEnoughUpdates.");
ChatComponentText clickTextFeatures = new ChatComponentText(EnumChatFormatting.YELLOW +
"Click this message if you would like to view a list of NotEnoughUpdate's Features.");
clickTextFeatures.setChatStyle(Utils.createClickStyle(ClickEvent.Action.OPEN_URL, url));
Minecraft.getMinecraft().thePlayer.addChatMessage(clickTextFeatures);
}
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(""));
+ Utils.addChatMessage("");
ChatComponentText clickTextHelp = new ChatComponentText(EnumChatFormatting.YELLOW +
"Click this message if you would like to view a list of NotEnoughUpdate's commands.");
clickTextHelp.setChatStyle(Utils.createClickStyle(ClickEvent.Action.RUN_COMMAND, "/neuhelp"));
Minecraft.getMinecraft().thePlayer.addChatMessage(clickTextHelp);
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(""));
+ Utils.addChatMessage("");
}
}
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java b/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java
index 794282f1..104f6076 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java
@@ -312,8 +312,7 @@ public class RenderListener {
JsonObject json = neu.manager.getItemInformation().get(resInternalname);
json.addProperty("crafttext", "Requires: " + col);
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- "Added: " + resInternalname));
+ Utils.addChatMessage("Added: " + resInternalname);
neu.manager.writeJsonDefaultDir(json, resInternalname + ".json");
neu.manager.loadItem(resInternalname);
}
@@ -510,7 +509,8 @@ public class RenderListener {
}
}
if (AuctionProfit.inAuctionPage()) {
- if (x + 18 > guiLeft + xSize && x + 18 < guiLeft + xSize + 4 + 28 + 20 && y > guiTop - 180 && y < guiTop + 56) {
+ if (x + 18 > guiLeft + xSize && x + 18 < guiLeft + xSize + 4 + 28 + 20 && y > guiTop - 180 &&
+ y < guiTop + 56) {
x -= 68 - 200;
}
}
@@ -628,7 +628,8 @@ public class RenderListener {
}
}
if (AuctionProfit.inAuctionPage()) {
- if (x + 18 > guiLeft + xSize && x + 18 < guiLeft + xSize + 4 + 28 + 20 && y > guiTop - 180 && y < guiTop + 56) {
+ if (x + 18 > guiLeft + xSize && x + 18 < guiLeft + xSize + 4 + 28 + 20 && y > guiTop - 180 &&
+ y < guiTop + 56) {
x -= 68 - 200;
}
}
@@ -1036,7 +1037,8 @@ public class RenderListener {
}
}
if (AuctionProfit.inAuctionPage()) {
- if (x + 18 > guiLeft + xSize && x + 18 < guiLeft + xSize + 4 + 28 + 20 && y > guiTop - 180 && y < guiTop + 56) {
+ if (x + 18 > guiLeft + xSize && x + 18 < guiLeft + xSize + 4 + 28 + 20 && y > guiTop - 180 &&
+ y < guiTop + 56) {
x -= 68 - 200;
}
}
@@ -1185,17 +1187,15 @@ public class RenderListener {
))
) {
writer.write(gson.toJson(jsonObject));
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.AQUA + "Parsed and saved: " + EnumChatFormatting.WHITE + id));
+ Utils.addChatMessage(EnumChatFormatting.AQUA + "Parsed and saved: " + EnumChatFormatting.WHITE + id);
}
} catch (IOException ignored) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.RED + "Error while writing file."));
+ Utils.addChatMessage(EnumChatFormatting.RED + "Error while writing file.");
}
} catch (Exception e) {
e.printStackTrace();
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.RED + "Error while parsing inventory. Try again or check logs for details."));
+ Utils.addChatMessage(
+ EnumChatFormatting.RED + "Error while parsing inventory. Try again or check logs for details.");
}
}
} else if (Keyboard.isKeyDown(Keyboard.KEY_RETURN) && NotEnoughUpdates.INSTANCE.config.hidden.dev) {
@@ -1290,8 +1290,7 @@ public class RenderListener {
} else if (cachedDefinitions.containsKey(item)) {
costArray.add(new JsonPrimitive(cachedDefinitions.get(item) + ":" + amountString));
} else {
- mc.thePlayer.addChatMessage(new ChatComponentText(
- "Change the item ID of " + item + " to the correct one and press Enter."));
+ Utils.addChatMessage("Change the item ID of " + item + " to the correct one and press Enter.");
NEUOverlay.getTextField().setText(item);
event.setCanceled(true);
typing = true;
@@ -1320,17 +1319,16 @@ public class RenderListener {
))
) {
writer.write(gson.toJson(newNPC));
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.AQUA + "Parsed and saved: " + EnumChatFormatting.WHITE + displayname));
+ Utils.addChatMessage(
+ EnumChatFormatting.AQUA + "Parsed and saved: " + EnumChatFormatting.WHITE + displayname);
}
} catch (IOException ignored) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.RED + "Error while writing file."));
+ Utils.addChatMessage(EnumChatFormatting.RED + "Error while writing file.");
}
} catch (Exception e) {
e.printStackTrace();
- mc.thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.RED + "Error while parsing inventory. Try again or check logs for details"));
+ Utils.addChatMessage(
+ EnumChatFormatting.RED + "Error while parsing inventory. Try again or check logs for details");
}
}
} else if (NotEnoughUpdates.INSTANCE.config.hidden.dev && Keyboard.isKeyDown(Keyboard.KEY_B) &&
@@ -1350,9 +1348,9 @@ public class RenderListener {
if (stack.getDisplayName().isEmpty() || stack.getDisplayName().equals(" ")) continue;
String internalName = NotEnoughUpdates.INSTANCE.manager.getInternalNameForItem(stack);
if (internalName == null) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
+ Utils.addChatMessage(
EnumChatFormatting.RED + "ERROR: Could not get internal name for: " + EnumChatFormatting.AQUA +
- stack.getDisplayName()));
+ stack.getDisplayName());
continue;
}
JsonObject itemObject = NotEnoughUpdates.INSTANCE.manager.getJsonForItem(stack);
@@ -1372,13 +1370,11 @@ public class RenderListener {
itemObject.add("lore", newLore);
if (!NEUItemEditor.saveOnly(internalName, itemObject)) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.RED + "ERROR: Failed to save item: " + EnumChatFormatting.AQUA +
- stack.getDisplayName()));
+ Utils.addChatMessage(
+ EnumChatFormatting.RED + "ERROR: Failed to save item: " + EnumChatFormatting.AQUA + stack.getDisplayName());
}
}
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.AQUA + "Parsed page: " + lower.getDisplayName().getUnformattedText()));
+ Utils.addChatMessage(EnumChatFormatting.AQUA + "Parsed page: " + lower.getDisplayName().getUnformattedText());
event.setCanceled(true);
return;
}
@@ -1565,7 +1561,7 @@ public class RenderListener {
json.addProperty("clickcommand", "viewrecipe");
json.addProperty("modver", NotEnoughUpdates.VERSION);
try {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("Added: " + resInternalname));
+ Utils.addChatMessage("Added: " + resInternalname);
neu.manager.writeJsonDefaultDir(json, resInternalname + ".json");
neu.manager.loadItem(resInternalname);
} catch (IOException ignored) {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/listener/ScoreboardLocationChangeListener.java b/src/main/java/io/github/moulberry/notenoughupdates/listener/ScoreboardLocationChangeListener.java
index 622b2088..3727a441 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ScoreboardLocationChangeListener.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ScoreboardLocationChangeListener.java
@@ -31,10 +31,10 @@ public class ScoreboardLocationChangeListener {
try {
Thread.sleep(3000);
TimersOverlay.afterPearls = TimersOverlay.heavyPearlCount();
- //Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW+"You exited the beast with ["+EnumChatFormatting.AQUA+(TimersOverlay.afterPearls-TimersOverlay.beforePearls)+EnumChatFormatting.YELLOW+"/"+EnumChatFormatting.AQUA+TimersOverlay.availablePearls+EnumChatFormatting.YELLOW+"] Heavy Pearls!"));
+ //Utils.sendMessageToPlayer(EnumChatFormatting.YELLOW+"You exited the beast with ["+EnumChatFormatting.AQUA+(TimersOverlay.afterPearls-TimersOverlay.beforePearls)+EnumChatFormatting.YELLOW+"/"+EnumChatFormatting.AQUA+TimersOverlay.availablePearls+EnumChatFormatting.YELLOW+"] Heavy Pearls!");
if (TimersOverlay.afterPearls - TimersOverlay.beforePearls == TimersOverlay.availablePearls) {
NotEnoughUpdates.INSTANCE.config.getProfileSpecific().dailyHeavyPearlCompleted = System.currentTimeMillis();
- //Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN+"Daily "+EnumChatFormatting.DARK_AQUA+"Heavy Pearls"+EnumChatFormatting.GREEN+" Complete!"));
+ //Utils.sendMessageToPlayer(EnumChatFormatting.GREEN+"Daily "+EnumChatFormatting.DARK_AQUA+"Heavy Pearls"+EnumChatFormatting.GREEN+" Complete!");
}
} catch (InterruptedException e) {
e.printStackTrace();
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CookieWarning.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CookieWarning.java
index f21d0c50..fede9bdf 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CookieWarning.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CookieWarning.java
@@ -23,8 +23,8 @@ import com.google.common.collect.Lists;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.mixins.AccessorGuiPlayerTabOverlay;
import io.github.moulberry.notenoughupdates.util.NotificationHandler;
+import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
-import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
public class CookieWarning {
@@ -94,9 +94,8 @@ public class CookieWarning {
}
} catch (NumberFormatException e) {
e.printStackTrace();
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.RED +
- "NEU ran into an issue when retrieving the Booster Cookie Timer. Check the logs for details."));
+ Utils.addChatMessage(EnumChatFormatting.RED +
+ "NEU ran into an issue when retrieving the Booster Cookie Timer. Check the logs for details.");
hasNotified = true;
}
if (minutes < NotEnoughUpdates.INSTANCE.config.notifications.boosterCookieWarningMins && !hasNotified) {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolver.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolver.java
index 167b6a2f..93a80866 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolver.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolver.java
@@ -25,10 +25,10 @@ import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils;
import io.github.moulberry.notenoughupdates.options.customtypes.NEUDebugFlag;
import io.github.moulberry.notenoughupdates.util.NEUDebugLogger;
import io.github.moulberry.notenoughupdates.util.SBInfo;
+import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.item.EntityArmorStand;
import net.minecraft.util.BlockPos;
-import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IChatComponent;
import net.minecraft.util.Vec3i;
@@ -169,7 +169,7 @@ public class CrystalMetalDetectorSolver {
NEUDebugLogger.log(NEUDebugFlag.METAL, "Known location identified.");
// falls through
case FOUND:
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "[NEU] Found solution."));
+ Utils.addChatMessage(EnumChatFormatting.YELLOW + "[NEU] Found solution.");
if (NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.contains(NEUDebugFlag.METAL) &&
(previousState == SolutionState.INVALID || previousState == SolutionState.FAILED)) {
NEUDebugLogger.log(
@@ -180,14 +180,12 @@ public class CrystalMetalDetectorSolver {
}
break;
case INVALID:
- mc.thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.RED + "[NEU] Previous solution is invalid."));
+ Utils.addChatMessage(EnumChatFormatting.RED + "[NEU] Previous solution is invalid.");
logDiagnosticData(false);
resetSolution(false);
break;
case FAILED:
- mc.thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.RED + "[NEU] Failed to find a solution."));
+ Utils.addChatMessage(EnumChatFormatting.RED + "[NEU] Failed to find a solution.");
logDiagnosticData(false);
resetSolution(false);
break;
@@ -195,8 +193,9 @@ public class CrystalMetalDetectorSolver {
NEUDebugLogger.log(NEUDebugFlag.METAL, "Multiple known locations identified:");
// falls through
case MULTIPLE:
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW +
- "[NEU] Need another position to find solution. Possible blocks: " + possibleBlocks.size()));
+ Utils.addChatMessage(
+ EnumChatFormatting.YELLOW + "[NEU] Need another position to find solution. Possible blocks: " +
+ possibleBlocks.size());
break;
default:
throw new IllegalStateException("Metal detector is in invalid state");
@@ -372,8 +371,8 @@ public class CrystalMetalDetectorSolver {
if (keeperEntities.size() == 0) {
if (!visitKeeperMessagePrinted) {
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW +
- "[NEU] Approach a Keeper while holding the metal detector to enable faster treasure hunting."));
+ Utils.addChatMessage(EnumChatFormatting.YELLOW +
+ "[NEU] Approach a Keeper while holding the metal detector to enable faster treasure hunting.");
visitKeeperMessagePrinted = true;
}
return false;
@@ -387,8 +386,8 @@ public class CrystalMetalDetectorSolver {
minesCenter = keeperEntity.getPosition().add(keeperOffsets.get(keeperType.toLowerCase()));
NEUDebugLogger.log(NEUDebugFlag.METAL, "Mines center: " +
EnumChatFormatting.WHITE + minesCenter.toString());
- mc.thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.YELLOW + "[NEU] Faster treasure hunting is now enabled based on Keeper location."));
+ Utils.addChatMessage(
+ EnumChatFormatting.YELLOW + "[NEU] Faster treasure hunting is now enabled based on Keeper location.");
return true;
}
@@ -560,8 +559,7 @@ public class CrystalMetalDetectorSolver {
}
if (!NotEnoughUpdates.INSTANCE.config.mining.metalDetectorEnabled) {
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "[NEU] Metal Detector Solver is not enabled."));
+ Utils.addChatMessage(EnumChatFormatting.RED + "[NEU] Metal Detector Solver is not enabled.");
return;
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolver.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolver.java
index 19cf9c09..9715e34b 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolver.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolver.java
@@ -232,35 +232,35 @@ public class CrystalWishingCompassSolver {
case SUCCESS:
return;
case STILL_PROCESSING_PRIOR_USE:
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW +
- "[NEU] Wait a little longer before using the wishing compass again."));
+ Utils.addChatMessage(
+ EnumChatFormatting.YELLOW + "[NEU] Wait a little longer before using the wishing compass again.");
event.setCanceled(true);
break;
case LOCATION_TOO_CLOSE:
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW +
- "[NEU] Move a little further before using the wishing compass again."));
+ Utils.addChatMessage(
+ EnumChatFormatting.YELLOW + "[NEU] Move a little further before using the wishing compass again.");
event.setCanceled(true);
break;
case POSSIBLE_TARGETS_CHANGED:
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW +
- "[NEU] Possible wishing compass targets have changed. Solver has been reset."));
+ Utils.addChatMessage(
+ EnumChatFormatting.YELLOW + "[NEU] Possible wishing compass targets have changed. Solver has been reset.");
event.setCanceled(true);
break;
case NO_PARTICLES_FOR_PREVIOUS_COMPASS:
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW +
- "[NEU] No particles detected for prior compass use. Need another position to solve."));
+ Utils.addChatMessage(EnumChatFormatting.YELLOW +
+ "[NEU] No particles detected for prior compass use. Need another position to solve.");
break;
case PLAYER_IN_NUCLEUS:
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW +
- "[NEU] Wishing compass must be used outside the nucleus for accurate results."));
+ Utils.addChatMessage(
+ EnumChatFormatting.YELLOW + "[NEU] Wishing compass must be used outside the nucleus for accurate results.");
event.setCanceled(true);
break;
default:
throw new IllegalStateException("Unexpected wishing compass solver state: \n" + getDiagnosticMessage());
}
} catch (Exception e) {
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "[NEU] Error processing wishing compass action - see log for details"));
+ Utils.addChatMessage(EnumChatFormatting.RED +
+ "[NEU] Error processing wishing compass action - see log for details");
e.printStackTrace();
event.setCanceled(true);
solverState = SolverState.FAILED_EXCEPTION;
@@ -373,39 +373,36 @@ public class CrystalWishingCompassSolver {
showSolution();
break;
case FAILED_EXCEPTION:
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "[NEU] Unable to determine wishing compass target."));
+ Utils.addChatMessage(EnumChatFormatting.RED + "[NEU] Unable to determine wishing compass target.");
logDiagnosticData(false);
break;
case FAILED_TIMEOUT_NO_REPEATING:
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "[NEU] Timed out waiting for repeat set of compass particles."));
+ Utils.addChatMessage(
+ EnumChatFormatting.RED + "[NEU] Timed out waiting for repeat set of compass particles.");
logDiagnosticData(false);
break;
case FAILED_TIMEOUT_NO_PARTICLES:
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "[NEU] Timed out waiting for compass particles."));
+ Utils.addChatMessage(EnumChatFormatting.RED + "[NEU] Timed out waiting for compass particles.");
logDiagnosticData(false);
break;
case FAILED_INTERSECTION_CALCULATION:
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "[NEU] Unable to determine intersection of wishing compasses."));
+ Utils.addChatMessage(
+ EnumChatFormatting.RED + "[NEU] Unable to determine intersection of wishing compasses.");
logDiagnosticData(false);
break;
case FAILED_INVALID_SOLUTION:
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "[NEU] Failed to find solution."));
+ Utils.addChatMessage(EnumChatFormatting.RED + "[NEU] Failed to find solution.");
logDiagnosticData(false);
break;
case NEED_SECOND_COMPASS:
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW +
- "[NEU] Need another position to determine wishing compass target."));
+ Utils.addChatMessage(
+ EnumChatFormatting.YELLOW + "[NEU] Need another position to determine wishing compass target.");
break;
}
}
} catch (Exception e) {
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "[NEU] Exception while calculating wishing compass solution - see log for details"));
+ Utils.addChatMessage(
+ EnumChatFormatting.RED + "[NEU] Exception while calculating wishing compass solution - see log for details");
e.printStackTrace();
}
}
@@ -779,15 +776,14 @@ public class CrystalWishingCompassSolver {
if (solution == null) return;
if (NUCLEUS_BB.isVecInside(solution)) {
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "[NEU] " +
- EnumChatFormatting.AQUA + "Wishing compass target is the Crystal Nucleus"));
+ Utils.addChatMessage(EnumChatFormatting.YELLOW + "[NEU] " + EnumChatFormatting.AQUA + "Wishing compass target is the Crystal Nucleus");
return;
}
String destinationMessage = getWishingCompassDestinationsMessage();
if (!isSkytilsPresent) {
- mc.thePlayer.addChatMessage(new ChatComponentText(destinationMessage));
+ Utils.addChatMessage(destinationMessage);
return;
}
@@ -797,13 +793,13 @@ public class CrystalWishingCompassSolver {
String skytilsCommand = String.format("/sthw add %s %s", getSolutionCoordsText(), targetNameForSkytils);
if (NotEnoughUpdates.INSTANCE.config.mining.wishingCompassAutocreateKnownWaypoints &&
solutionPossibleTargets.size() == 1) {
- mc.thePlayer.addChatMessage(new ChatComponentText(destinationMessage));
+ Utils.addChatMessage(destinationMessage);
int commandResult = ClientCommandHandler.instance.executeCommand(mc.thePlayer, skytilsCommand);
if (commandResult == 1) {
return;
}
- mc.thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.RED + "[NEU] Failed to automatically run /sthw"));
+ Utils.addChatMessage(
+ EnumChatFormatting.RED + "[NEU] Failed to automatically run /sthw");
}
destinationMessage += EnumChatFormatting.YELLOW + " [Add Skytils Waypoint]";
@@ -918,8 +914,8 @@ public class CrystalWishingCompassSolver {
}
if (!NotEnoughUpdates.INSTANCE.config.mining.wishingCompassSolver) {
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "[NEU] Wishing Compass Solver is not enabled."));
+ Utils.addChatMessage(EnumChatFormatting.RED +
+ "[NEU] Wishing Compass Solver is not enabled.");
return;
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FairySouls.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FairySouls.java
index 75f1b427..4cdb1557 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FairySouls.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FairySouls.java
@@ -29,11 +29,11 @@ import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils;
import io.github.moulberry.notenoughupdates.util.Constants;
import io.github.moulberry.notenoughupdates.util.SBInfo;
+import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommandSender;
import net.minecraft.util.BlockPos;
-import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import net.minecraftforge.client.event.ClientChatReceivedEvent;
import net.minecraftforge.client.event.RenderWorldLastEvent;
@@ -370,7 +370,7 @@ public class FairySouls {
}
private static void print(String s) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(s));
+ Utils.addChatMessage(s);
}
private static void printHelp() {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/Navigation.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/Navigation.java
index 9cc872b7..3e37b522 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/Navigation.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/Navigation.java
@@ -93,7 +93,7 @@ public class Navigation {
}
}
- private NotEnoughUpdates neu;
+ private final NotEnoughUpdates neu;
public Navigation(NotEnoughUpdates notEnoughUpdates) {
neu = notEnoughUpdates;
@@ -378,8 +378,7 @@ public class Navigation {
private void showError(String message, boolean log) {
EntityPlayerSP player = Minecraft.getMinecraft().thePlayer;
if (player != null)
- player.addChatMessage(new ChatComponentText(EnumChatFormatting.DARK_RED +
- "[NEU-Waypoint] " + message));
+ Utils.addChatMessage(EnumChatFormatting.DARK_RED + "[NEU-Waypoint] " + message);
if (log)
new RuntimeException("[NEU-Waypoint] " + message).printStackTrace();
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java
index fa20b48a..344f21aa 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java
@@ -50,7 +50,6 @@ import net.minecraft.inventory.ContainerChest;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import net.minecraftforge.client.event.ClientChatReceivedEvent;
import net.minecraftforge.event.entity.player.ItemTooltipEvent;
@@ -1290,9 +1289,9 @@ public class PetInfoOverlay extends TextOverlay {
setCurrentPet(getClosestPetIndex(pet, rarity.petId, "", lastLevelHovered));
if (PetInfoOverlay.config.selectedPet == -1) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
+ Utils.addChatMessage(
EnumChatFormatting.RED + "[NEU] Can't find pet \u00a7" + petStringMatch +
- EnumChatFormatting.RED + " try revisiting all pages of /pets."));
+ EnumChatFormatting.RED + " try revisiting all pages of /pets.");
}
} else if ((chatMessage.toLowerCase().startsWith("you despawned your")) || (chatMessage.toLowerCase().contains(
"switching to profile"))
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TrophyRewardOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TrophyRewardOverlay.java
index df635d5c..a3a65dce 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TrophyRewardOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TrophyRewardOverlay.java
@@ -163,7 +163,7 @@ public class TrophyRewardOverlay {
texts.add("Trophy Fish Exchange");
texts.add("Magma Fish: §e" + total);
- for (Map.Entry<String, Integer> entry : sortByValue(totalExchange).entrySet()) {
+ for (Map.Entry<String, Integer> entry : sortByValueReverse(totalExchange).entrySet()) {
String name = entry.getKey();
int amount = totalAmount.get(name);
String[] split = name.split(" ");
@@ -209,6 +209,19 @@ public class TrophyRewardOverlay {
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) {
List<Map.Entry<K, V>> list = new ArrayList<>(map.entrySet());
list.sort(Map.Entry.comparingByValue());
+
+ Map<K, V> result = new LinkedHashMap<>();
+ for (Map.Entry<K, V> entry : list) {
+ result.put(entry.getKey(), entry.getValue());
+ }
+
+ return result;
+ }
+
+ //TODO move into utils class maybe?
+ public static <K, V extends Comparable<? super V>> Map<K, V> sortByValueReverse(Map<K, V> map) {
+ List<Map.Entry<K, V>> list = new ArrayList<>(map.entrySet());
+ list.sort(Map.Entry.comparingByValue());
Collections.reverse(list);
Map<K, V> result = new LinkedHashMap<>();
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/ApiData.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/ApiData.java
new file mode 100644
index 00000000..ee39e9b4
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/ApiData.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscgui.minionhelper;
+
+import java.util.Map;
+
+public class ApiData {
+
+ private final Map<String, Integer> highestCollectionTier;
+ private final Map<String, Integer> slayerTiers;
+ private final int magesReputation;
+ private final int barbariansReputation;
+
+ public ApiData(
+ Map<String, Integer> highestCollectionTier,
+ Map<String, Integer> slayerTiers,
+ int magesReputation,
+ int barbariansReputation
+ ) {
+ this.highestCollectionTier = highestCollectionTier;
+ this.slayerTiers = slayerTiers;
+ this.magesReputation = magesReputation;
+ this.barbariansReputation = barbariansReputation;
+ }
+
+ public Map<String, Integer> getHighestCollectionTier() {
+ return highestCollectionTier;
+ }
+
+ public Map<String, Integer> getSlayerTiers() {
+ return slayerTiers;
+ }
+
+ public int getMagesReputation() {
+ return magesReputation;
+ }
+
+ public int getBarbariansReputation() {
+ return barbariansReputation;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/Minion.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/Minion.java
new file mode 100644
index 00000000..9cd1a08b
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/Minion.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscgui.minionhelper;
+
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.requirements.MinionRequirement;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.sources.MinionSource;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Minion {
+ private final String internalName;
+ private final int tier;
+ private String displayName;
+ private MinionSource minionSource;
+ private boolean crafted = false;
+ private Minion parent;
+ private final List<MinionRequirement> requirements = new ArrayList<>();
+ private boolean meetRequirements = false;
+
+ public Minion(String internalName, int tier) {
+ this.internalName = internalName;
+ this.tier = tier;
+ }
+
+ public MinionSource getMinionSource() {
+ return minionSource;
+ }
+
+ public void setMinionSource(MinionSource minionSource) {
+ this.minionSource = minionSource;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public void setDisplayName(String displayName) {
+ this.displayName = displayName;
+ }
+
+ public boolean isCrafted() {
+ return crafted;
+ }
+
+ public void setCrafted(boolean crafted) {
+ this.crafted = crafted;
+ }
+
+ public String getInternalName() {
+ return internalName;
+ }
+
+ public void setParent(Minion parent) {
+ this.parent = parent;
+ }
+
+ public Minion getParent() {
+ return parent;
+ }
+
+ public int getTier() {
+ return tier;
+ }
+
+ public List<MinionRequirement> getRequirements() {
+ return requirements;
+ }
+
+ public boolean doesMeetRequirements() {
+ return meetRequirements;
+ }
+
+ public void setMeetRequirements(boolean meetRequirements) {
+ this.meetRequirements = meetRequirements;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/MinionHelperManager.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/MinionHelperManager.java
new file mode 100644
index 00000000..d7bb0e1e
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/MinionHelperManager.java
@@ -0,0 +1,290 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscgui.minionhelper;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.gson.JsonObject;
+import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.requirements.CollectionRequirement;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.requirements.CustomRequirement;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.requirements.MinionRequirement;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.requirements.ReputationRequirement;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.requirements.SlayerRequirement;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.sources.CraftingSource;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.sources.CustomSource;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.sources.MinionSource;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.sources.NpcSource;
+import io.github.moulberry.notenoughupdates.util.Utils;
+import net.minecraft.client.Minecraft;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.ContainerChest;
+import net.minecraftforge.client.event.GuiOpenEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class MinionHelperManager {
+ private static MinionHelperManager instance = null;
+ private final Map<String, Minion> minions = new HashMap<>();
+ private final Map<String, String> upgradeCostFormatCache = new HashMap<>();
+ private final Map<String, String> fullCostFormatCache = new HashMap<>();
+ private ApiData apiData = null;
+ private final List<String> cheapItems = Arrays.asList(
+ "WOOD_SWORD",
+ "WOOD_HOE",
+ "WOOD_AXE",
+ "WOOD_PICKAXE",
+ "WOOD_SPADE",
+ "FISHING_ROD",
+ "SKYBLOCK_PELT"
+ );
+
+ public static MinionHelperManager getInstance() {
+ if (instance == null) {
+ instance = new MinionHelperManager();
+ }
+ return instance;
+ }
+
+ @SubscribeEvent
+ public void onGuiOpen(GuiOpenEvent event) {
+ upgradeCostFormatCache.clear();
+ fullCostFormatCache.clear();
+ }
+
+ public boolean inCraftedMinionsInventory() {
+ if (!NotEnoughUpdates.INSTANCE.isOnSkyblock()) return false;
+
+ Minecraft minecraft = Minecraft.getMinecraft();
+ if (minecraft == null || minecraft.thePlayer == null) return false;
+
+ Container inventoryContainer = minecraft.thePlayer.openContainer;
+ if (!(inventoryContainer instanceof ContainerChest)) return false;
+ ContainerChest containerChest = (ContainerChest) inventoryContainer;
+ return containerChest.getLowerChestInventory().getDisplayName()
+ .getUnformattedText().equalsIgnoreCase("Crafted Minions");
+ }
+
+ public Minion getMinionById(String internalName) {
+ if (minions.containsKey(internalName)) {
+ return minions.get(internalName);
+ } else {
+ System.err.println("Cannot get minion for id '" + internalName + "'!");
+ return null;
+ }
+ }
+
+ public Minion getMinionByName(String displayName, int tier) {
+ for (Minion minion : minions.values()) {
+ if (displayName.equals(minion.getDisplayName())) {
+ if (minion.getTier() == tier) {
+ return minion;
+ }
+ }
+ }
+ System.err.println("Cannot get minion for display name '" + displayName + "'!");
+ return null;
+ }
+
+ public String calculateUpgradeCostsFormat(MinionSource source, boolean upgradeOnly) {
+ String internalName = source.getMinion().getInternalName();
+ if (upgradeOnly) {
+ if (upgradeCostFormatCache.containsKey(internalName)) {
+ upgradeCostFormatCache.get(internalName);
+ }
+ } else {
+ if (fullCostFormatCache.containsKey(internalName)) {
+ fullCostFormatCache.get(internalName);
+ }
+ }
+
+ if (source instanceof CustomSource) {
+ return "§7" + ((CustomSource) source).getCustomSource();
+ }
+
+ long costs = calculateUpgradeCosts(source, upgradeOnly);
+ String format = Utils.shortNumberFormat(costs, 0);
+ String fullCostsFormat = !upgradeOnly ? "§o" : "";
+ String result = "§6" + fullCostsFormat + format + " coins";
+
+ if (source instanceof NpcSource) {
+ ArrayListMultimap<String, Integer> items = ((NpcSource) source).getItems();
+ if (items.containsKey("SKYBLOCK_PELT")) {
+ int amount = items.get("SKYBLOCK_PELT").get(0);
+ result += " §7+ §5" + amount + " Pelts";
+ }
+ }
+
+ if (upgradeOnly) {
+ upgradeCostFormatCache.put(internalName, result);
+ } else {
+ fullCostFormatCache.put(internalName, result);
+ }
+
+ return result;
+ }
+
+ public long calculateUpgradeCosts(MinionSource source, boolean upgradeOnly) {
+ if (source instanceof CraftingSource) {
+ CraftingSource craftingSource = (CraftingSource) source;
+ return getCosts(source, upgradeOnly, craftingSource.getItems());
+
+ } else if (source instanceof NpcSource) {
+ NpcSource npcSource = (NpcSource) source;
+ long upgradeCost = getCosts(source, upgradeOnly, npcSource.getItems());
+ long coins = npcSource.getCoins();
+ upgradeCost += coins;
+
+ return upgradeCost;
+ }
+
+ return 0;
+ }
+
+ private long getCosts(MinionSource source, boolean upgradeOnly, ArrayListMultimap<String, Integer> items) {
+ long upgradeCost = 0;
+ for (Map.Entry<String, Integer> entry : items.entries()) {
+ String internalName = entry.getKey();
+ int amount = entry.getValue();
+ JsonObject bazaarInfo = NotEnoughUpdates.INSTANCE.manager.auctionManager.getBazaarInfo(internalName);
+ if (bazaarInfo == null) {
+ if (internalName.contains("_GENERATOR_")) {
+ upgradeCost += calculateUpgradeCosts(getMinionById(internalName).getMinionSource(), false);
+ } else {
+ if (!cheapItems.contains(internalName)) {
+ long lowestBin = NotEnoughUpdates.INSTANCE.manager.auctionManager.getLowestBin(internalName);
+ upgradeCost += lowestBin * amount;
+ }
+ }
+ continue;
+ }
+ if (!bazaarInfo.has("curr_sell")) {
+ System.err.println("curr_sell does not exist for '" + internalName + "'");
+ continue;
+ }
+ long bazaarInstantSellPrice = (long) bazaarInfo.get("curr_sell").getAsFloat();
+ long added = bazaarInstantSellPrice * amount;
+ upgradeCost += added;
+ }
+ if (!upgradeOnly) {
+ Minion parent = source.getMinion().getParent();
+ if (parent != null) {
+ upgradeCost += calculateUpgradeCosts(parent.getMinionSource(), false);
+ }
+ }
+ return upgradeCost;
+ }
+
+ public void createMinion(String internalName, int tier) {
+ minions.put(internalName, new Minion(internalName, tier));
+ }
+
+ public Map<String, Minion> getAllMinions() {
+ return minions;
+ }
+
+ public List<MinionRequirement> getRequirements(Minion minion) {
+ if (!minion.getRequirements().isEmpty()) {
+ return minion.getRequirements();
+ }
+
+ Minion parent = minion.getParent();
+ if (parent != null) {
+ return getRequirements(parent);
+ }
+
+ return Collections.emptyList();
+ }
+
+ public boolean meetAllRequirements(Minion minion) {
+ List<MinionRequirement> list = getRequirements(minion);
+ for (MinionRequirement requirement : list) {
+ if (!meetRequirement(minion, requirement)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ public boolean meetRequirement(Minion minion, MinionRequirement requirement) {
+ if (apiData == null) return false;
+
+ if (requirement instanceof CollectionRequirement) {
+ CollectionRequirement collectionRequirement = (CollectionRequirement) requirement;
+ String collection = collectionRequirement.getCollection();
+ String internalName = formatInternalName(collection);
+
+ int need = collectionRequirement.getLevel();
+ Map<String, Integer> highestCollectionTier = apiData.getHighestCollectionTier();
+ if (highestCollectionTier.containsKey(internalName)) {
+ int has = highestCollectionTier.get(internalName);
+
+ return has >= need;
+ } else {
+ Utils.addChatMessage("§cInvalid hypixel collection name: '" + internalName + "'");
+ }
+
+ } else if (requirement instanceof SlayerRequirement) {
+ SlayerRequirement slayerRequirement = (SlayerRequirement) requirement;
+ String slayer = slayerRequirement.getSlayer();
+ int need = slayerRequirement.getLevel();
+ Map<String, Integer> slayerTiers = apiData.getSlayerTiers();
+ if (slayerTiers.containsKey(slayer)) {
+ return slayerTiers.get(slayer) >= need;
+ }
+
+ } else if (requirement instanceof ReputationRequirement) {
+ ReputationRequirement reputationRequirement = (ReputationRequirement) requirement;
+ int need = reputationRequirement.getReputation();
+ String reputationType = reputationRequirement.getReputationType();
+ if (reputationType.equals("BARBARIAN")) {
+ return apiData.getBarbariansReputation() >= need;
+ } else if (reputationType.equals("MAGE")) {
+ return apiData.getMagesReputation() >= need;
+ } else {
+ Utils.addChatMessage("§cUnknown reputation type: '" + reputationType + "'");
+ return false;
+ }
+ } else if (requirement instanceof CustomRequirement) {
+ return minion.isCrafted();
+ }
+
+ return false;
+ }
+
+ public String formatInternalName(String text) {
+ return text.toUpperCase().replace(" ", "_");
+ }
+
+ public void setApiData(ApiData apiData) {
+ this.apiData = apiData;
+ }
+
+ public void reloadRequirements() {
+ for (Minion minion : minions.values()) {
+ minion.setMeetRequirements(meetAllRequirements(minion));
+ }
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/MinionHelperOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/MinionHelperOverlay.java
new file mode 100644
index 00000000..193b0675
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/MinionHelperOverlay.java
@@ -0,0 +1,344 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscgui.minionhelper;
+
+import com.google.common.collect.ArrayListMultimap;
+import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
+import io.github.moulberry.notenoughupdates.miscgui.TrophyRewardOverlay;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.renderables.RenderableObject;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.renderables.RenderableText;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.requirements.MinionRequirement;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.sources.CraftingSource;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.sources.CustomSource;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.sources.MinionSource;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.sources.NpcSource;
+import io.github.moulberry.notenoughupdates.mixins.AccessorGuiContainer;
+import io.github.moulberry.notenoughupdates.util.Utils;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.client.gui.ScaledResolution;
+import net.minecraft.client.gui.inventory.GuiChest;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.client.event.GuiOpenEvent;
+import net.minecraftforge.client.event.GuiScreenEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import org.lwjgl.input.Keyboard;
+import org.lwjgl.input.Mouse;
+import org.lwjgl.opengl.GL11;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+public class MinionHelperOverlay {
+ private static MinionHelperOverlay instance = null;
+ private final MinionHelperManager manager = MinionHelperManager.getInstance();
+ private Minion lastHovered = null;
+
+ private LinkedHashMap<String, RenderableObject> cacheShift = null;
+ private LinkedHashMap<String, RenderableObject> cacheNoShift = null;
+
+ public static MinionHelperOverlay getInstance() {
+ if (instance == null) {
+ instance = new MinionHelperOverlay();
+ }
+ return instance;
+ }
+
+ @SubscribeEvent
+ public void onGuiOpen(GuiOpenEvent event) {
+ cacheShift = null;
+ cacheNoShift = null;
+ }
+
+ public static final ResourceLocation auctionProfitImage =
+ new ResourceLocation("notenoughupdates:auction_profit.png");
+
+ @SubscribeEvent
+ public void onDrawBackground(GuiScreenEvent.BackgroundDrawnEvent event) {
+ if (!manager.inCraftedMinionsInventory()) return;
+
+ boolean shift = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT);
+ LinkedHashMap<String, RenderableObject> renderMap = getRenderMap(shift);
+
+ renderHover(renderMap, shift);
+ render(event, renderMap);
+ }
+
+ @SubscribeEvent
+ public void onMouseClick(GuiScreenEvent.MouseInputEvent.Pre event) {
+ if (!manager.inCraftedMinionsInventory()) return;
+ if (!Mouse.getEventButtonState()) return;
+
+ boolean shift = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT);
+ LinkedHashMap<String, RenderableObject> renderMap = getRenderMap(shift);
+
+ RenderableObject mouseObject = getObjectOverMouse(renderMap);
+
+ if (mouseObject != null) {
+ if (mouseObject instanceof MinionSource) {
+ event.setCanceled(true);
+ Minion minion = ((MinionSource) mouseObject).getMinion();
+ NotEnoughUpdates.INSTANCE.manager.displayGuiItemRecipe(minion.getInternalName());
+ }
+ }
+ }
+
+ private RenderableObject getObjectOverMouse(LinkedHashMap<String, RenderableObject> renderMap) {
+ GuiScreen gui = Minecraft.getMinecraft().currentScreen;
+ if (!(gui instanceof GuiChest)) return null;
+
+ int xSize = ((AccessorGuiContainer) gui).getXSize();
+ int guiLeft = ((AccessorGuiContainer) gui).getGuiLeft();
+ int guiTop = ((AccessorGuiContainer) gui).getGuiTop();
+
+ int x = guiLeft + xSize + 4;
+ int y = guiTop;
+
+ final ScaledResolution scaledresolution = new ScaledResolution(Minecraft.getMinecraft());
+ final int scaledWidth = scaledresolution.getScaledWidth();
+ final int scaledHeight = scaledresolution.getScaledHeight();
+ int mouseX = Mouse.getX() * scaledWidth / Minecraft.getMinecraft().displayWidth;
+ int mouseY = scaledHeight - Mouse.getY() * scaledHeight / Minecraft.getMinecraft().displayHeight - 1;
+
+ int index = 0;
+ for (RenderableObject renderableObject : renderMap.values()) {
+
+ if (mouseX > x && mouseX < x + 130 &&
+ mouseY > y + index && mouseY < y + 13 + index) {
+ return renderableObject;
+ }
+ index += 10;
+ }
+
+ return null;
+ }
+
+ private void renderHover(
+ LinkedHashMap<String, RenderableObject> renderMap,
+ boolean shift
+ ) {
+ lastHovered = null;
+
+ if (!(Minecraft.getMinecraft().currentScreen instanceof GuiChest)) return;
+
+ final ScaledResolution scaledresolution = new ScaledResolution(Minecraft.getMinecraft());
+ final int scaledWidth = scaledresolution.getScaledWidth();
+ final int scaledHeight = scaledresolution.getScaledHeight();
+ int mouseX = Mouse.getX() * scaledWidth / Minecraft.getMinecraft().displayWidth;
+ int mouseY = scaledHeight - Mouse.getY() * scaledHeight / Minecraft.getMinecraft().displayHeight - 1;
+
+ RenderableObject mouseObject = getObjectOverMouse(renderMap);
+ if (mouseObject != null) {
+ GlStateManager.pushMatrix();
+ GlStateManager.scale(2f / scaledresolution.getScaleFactor(), 2f / scaledresolution.getScaleFactor(), 1);
+ Utils.drawHoveringText(getTooltip(shift, mouseObject),
+ mouseX * scaledresolution.getScaleFactor() / 2,
+ mouseY * scaledresolution.getScaleFactor() / 2,
+ scaledWidth * scaledresolution.getScaleFactor() / 2,
+ scaledHeight * scaledresolution.getScaleFactor() / 2, -1, Minecraft.getMinecraft().fontRendererObj
+ );
+ GlStateManager.popMatrix();
+ }
+ }
+
+ private List<String> getTooltip(boolean shift, RenderableObject renderableObject) {
+ List<String> lines = new ArrayList<>();
+
+ if (renderableObject instanceof RenderableText) {
+ RenderableText renderableText = (RenderableText) renderableObject;
+ lines.addAll(renderableText.getLines());
+ } else if (renderableObject instanceof MinionSource) {
+ MinionSource minionSource = (MinionSource) renderableObject;
+
+ Minion minion = minionSource.getMinion();
+ lastHovered = minion;
+ String displayName = minion.getDisplayName();
+ lines.add(displayName + " " + minion.getTier());
+ for (MinionRequirement requirement : manager.getRequirements(minionSource.getMinion())) {
+ String color = manager.meetRequirement(minion, requirement) ? "§a" : "§c";
+ lines.add(" " + color + "Requirement: §f" + requirement.printDescription());
+ }
+
+ if (minionSource instanceof CraftingSource) {
+ CraftingSource craftingSource = (CraftingSource) minionSource;
+ lines.add("");
+ if (shift || minion.getTier() == 1) {
+ lines.add("Full crafting costs:");
+ } else {
+ lines.add("Upgrade costs:");
+ }
+ String format = manager.calculateUpgradeCostsFormat(craftingSource, !shift);
+ lines.add(format);
+
+ lines.add("");
+
+ Map<String, Integer> allItems = grabAllItems(craftingSource.getItems());
+
+ lines.add("Crafting recipe requires:");
+ for (Map.Entry<String, Integer> entry : allItems.entrySet()) {
+ String name = entry.getKey();
+ int amount = entry.getValue();
+ lines.add(name + ": " + amount);
+ }
+ } else if (minionSource instanceof NpcSource) {
+ NpcSource npcSource = (NpcSource) minionSource;
+ int coins = npcSource.getCoins();
+ String npcName = npcSource.getNpcName();
+ lines.add("");
+ lines.add("Can bet bought at the NPC");
+ lines.add("name: " + npcName);
+ lines.add("");
+ lines.add("Cost:");
+ String format = Utils.shortNumberFormat(coins, 0);
+ String result = "§6" + format + " coins";
+ lines.add(" coins: " + result);
+ lines.add(" Items:");
+ Map<String, Integer> allItems = grabAllItems(npcSource.getItems());
+ for (Map.Entry<String, Integer> entry : allItems.entrySet()) {
+ String name = entry.getKey();
+ int amount = entry.getValue();
+ lines.add(" " + name + ": " + amount);
+ }
+
+ } else if (minionSource instanceof CustomSource) {
+ CustomSource customSource = (CustomSource) minionSource;
+ String source = customSource.getCustomSource();
+ lines.add("");
+ lines.add(source);
+ }
+
+ lines.add("");
+ lines.add("§eClick to view recipe");
+ if (!shift) {
+ lines.add("");
+ lines.add("§8[SHIFT show full costs]");
+ }
+ }
+ return lines;
+ }
+
+ private Map<String, Integer> grabAllItems(ArrayListMultimap<String, Integer> multimap) {
+ Map<String, Integer> allItems = new HashMap<>();
+ for (Map.Entry<String, Integer> entry : multimap.entries()) {
+ String name = entry.getKey();
+ int amount = entry.getValue();
+ amount = allItems.getOrDefault(name, 0) + amount;
+ allItems.put(name, amount);
+ }
+ return allItems;
+ }
+
+ private Map<Minion, Long> getMissing(boolean shift) {
+
+ Map<Minion, Long> prices = new HashMap<>();
+ for (Minion minion : manager.getAllMinions().values()) {
+
+ if (!minion.doesMeetRequirements() && !shift) continue;
+ if (!minion.isCrafted()) {
+ long price = manager.calculateUpgradeCosts(minion.getMinionSource(), true);
+ prices.put(minion, price);
+ }
+ }
+ return prices;
+ }
+
+ private void render(GuiScreenEvent.BackgroundDrawnEvent event, Map<String, RenderableObject> renderMap) {
+ Minecraft minecraft = Minecraft.getMinecraft();
+ if (!(Minecraft.getMinecraft().currentScreen instanceof GuiChest)) return;
+ Gui gui = event.gui;
+ int xSize = ((AccessorGuiContainer) gui).getXSize();
+ int guiLeft = ((AccessorGuiContainer) gui).getGuiLeft();
+ int guiTop = ((AccessorGuiContainer) gui).getGuiTop();
+ minecraft.getTextureManager().bindTexture(auctionProfitImage);
+ GL11.glColor4f(1, 1, 1, 1);
+ GlStateManager.disableLighting();
+ Utils.drawTexturedRect(guiLeft + xSize + 4, guiTop, 180, 101, 0, 180 / 256f, 0, 101 / 256f, GL11.GL_NEAREST);
+
+ int a = guiLeft + xSize + 4;
+ FontRenderer fontRendererObj = minecraft.fontRendererObj;
+
+ int extra = 0;
+ for (Map.Entry<String, RenderableObject> entry : renderMap.entrySet()) {
+ String line = entry.getKey();
+ RenderableObject renderableObject = entry.getValue();
+ String prefix = "";
+ if (renderableObject instanceof MinionSource) {
+ Minion minion = ((MinionSource) renderableObject).getMinion();
+ if (lastHovered == minion) {
+ prefix = "§e";
+ }
+ }
+ fontRendererObj.drawString(prefix + line, a + 6, guiTop + 6 + extra, -1, false);
+ extra += 10;
+ }
+ }
+
+ private LinkedHashMap<String, RenderableObject> getRenderMap(boolean shift) {
+ if (!shift) {
+ if (cacheNoShift != null) return cacheNoShift;
+ } else {
+ if (cacheShift != null) return cacheShift;
+ }
+ Map<Minion, Long> prices = getMissing(shift);
+
+ LinkedHashMap<String, RenderableObject> renderMap = new LinkedHashMap<>();
+ if (prices.isEmpty()) {
+ renderMap.put("all minions collected!", new RenderableText("You have all the minions available collected! :)"));
+ } else {
+ renderMap.put(
+ "To craft: " + prices.size(),
+ new RenderableText("you can craft that many more minions!")
+ );//TODO formulierung
+ int i = 0;
+
+ //TOOD change
+ int max = 20;
+
+ Map<Minion, Long> sort = TrophyRewardOverlay.sortByValue(prices);
+ for (Minion minion : sort.keySet()) {
+ String displayName = minion.getDisplayName();
+ displayName = displayName.replace(" Minion", "");
+ String format = manager.calculateUpgradeCostsFormat(minion.getMinionSource(), true);
+ String requirementFormat = !minion.doesMeetRequirements() ? "§7§o" : "";
+ renderMap.put(
+ requirementFormat + displayName + "§r " + requirementFormat + minion.getTier() + "§r §8- " + format,
+ minion.getMinionSource()
+ );
+
+ i++;
+ if (i == max) break;
+ }
+ }
+
+ if (shift) {
+ cacheShift = renderMap;
+ } else {
+ cacheNoShift = renderMap;
+ }
+
+ return renderMap;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/MinionHelperTooltips.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/MinionHelperTooltips.java
new file mode 100644
index 00000000..71293815
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/MinionHelperTooltips.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscgui.minionhelper;
+
+import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
+import io.github.moulberry.notenoughupdates.core.util.StringUtils;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.sources.MinionSource;
+import io.github.moulberry.notenoughupdates.util.ItemUtils;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.event.entity.player.ItemTooltipEvent;
+import net.minecraftforge.fml.common.eventhandler.EventPriority;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import org.lwjgl.input.Keyboard;
+
+import java.util.List;
+
+public class MinionHelperTooltips {
+ private static MinionHelperTooltips instance = null;
+ private final MinionHelperManager manager = MinionHelperManager.getInstance();
+ private boolean pressedShiftLast = false;
+ private boolean showFullCost = false;
+
+ public static MinionHelperTooltips getInstance() {
+ if (instance == null) {
+ instance = new MinionHelperTooltips();
+ }
+ return instance;
+ }
+
+ @SubscribeEvent(priority = EventPriority.LOW)
+ public void onItemTooltipLow(ItemTooltipEvent event) {
+ if (!manager.inCraftedMinionsInventory()) return;
+ if (!NotEnoughUpdates.INSTANCE.config.fishing.trophyRewardTooltips) return;
+
+ boolean shift = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT);
+ if (!pressedShiftLast && shift) {
+ showFullCost = !showFullCost;
+ }
+ pressedShiftLast = shift;
+
+ ItemStack itemStack = event.itemStack;
+ if (itemStack == null) return;
+ String displayName = itemStack.getDisplayName();
+ if (!displayName.endsWith(" Minion")) return;
+ displayName = StringUtils.cleanColour(displayName);
+
+ List<String> lore = ItemUtils.getLore(itemStack);
+ if (lore.get(0).equals("§7You haven't crafted this minion.")) return;
+
+ int index = 0;
+ for (String line : lore) {
+ index++;
+ if (!line.contains("Tier")) continue;
+
+ Minion minion = manager.getMinionByName(displayName, index);
+ if (minion == null) {
+ System.err.println("minion is null for displayName '" + displayName + "' and tier " + index);
+ continue;
+ }
+ MinionSource minionSource = minion.getMinionSource();
+ if (minionSource == null) {
+ System.err.println("minionSource is null for " + minion.getInternalName());
+ continue;
+ }
+ String format = manager.calculateUpgradeCostsFormat(minionSource, !showFullCost);
+ event.toolTip.set(index, line + " §8- " + format);
+ }
+
+ if (showFullCost) {
+ event.toolTip.add("§8[Press SHIFT to show upgrade costs]");
+ } else {
+ event.toolTip.add("§8[Press SHIFT to show full costs]");
+ }
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/loaders/MinionHelperApiLoader.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/loaders/MinionHelperApiLoader.java
new file mode 100644
index 00000000..b6239fe6
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/loaders/MinionHelperApiLoader.java
@@ -0,0 +1,188 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscgui.minionhelper.loaders;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
+import io.github.moulberry.notenoughupdates.core.util.StringUtils;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.ApiData;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.MinionHelperManager;
+import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer;
+import io.github.moulberry.notenoughupdates.util.Constants;
+import io.github.moulberry.notenoughupdates.util.SBInfo;
+import io.github.moulberry.notenoughupdates.util.Utils;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.EntityPlayerSP;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.event.world.WorldEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.gameevent.TickEvent;
+
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class MinionHelperApiLoader {
+ private static MinionHelperApiLoader instance = null;
+ private final MinionHelperManager manager = MinionHelperManager.getInstance();
+ private boolean dirty = true;
+ private int ticks = 0;
+
+ public static MinionHelperApiLoader getInstance() {
+ if (instance == null) {
+ instance = new MinionHelperApiLoader();
+ }
+ return instance;
+ }
+
+ @SubscribeEvent
+ public void onWorldLoad(WorldEvent.Load event) {
+ dirty = true;
+ }
+
+ @SubscribeEvent
+ public void onTick(TickEvent.ClientTickEvent event) {
+ if (!NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard()) return;
+ ticks++;
+
+ if (ticks % 20 != 0) return;
+
+ if (dirty) {
+ load();
+ }
+ }
+
+ private void load() {
+ EntityPlayerSP thePlayer = Minecraft.getMinecraft().thePlayer;
+ if (thePlayer == null) return;
+
+ dirty = false;
+ String uuid = thePlayer.getUniqueID().toString().replace("-", "");
+ HashMap<String, String> map = new HashMap<String, String>() {{
+ put("uuid", uuid);
+ }};
+
+ NotEnoughUpdates neu = NotEnoughUpdates.INSTANCE;
+ neu.manager.hypixelApi.getHypixelApiAsync(
+ neu.config.apiData.apiKey,
+ "skyblock/profiles",
+ map
+ ).thenAccept(this::updateInformation);
+ }
+
+ private void updateInformation(JsonObject entireApiResponse) {
+ if (!entireApiResponse.has("success") || !entireApiResponse.get("success").getAsBoolean()) return;
+ JsonArray profiles = entireApiResponse.getAsJsonArray("profiles");
+ for (JsonElement element : profiles) {
+ JsonObject profile = element.getAsJsonObject();
+ String profileName = profile.get("cute_name").getAsString();
+ JsonObject player = profile.getAsJsonObject("members").getAsJsonObject(Minecraft.getMinecraft().thePlayer
+ .getUniqueID()
+ .toString()
+ .replace("-", ""));
+
+ if (profileName.equals(SBInfo.getInstance().currentProfile)) {
+ readData(player);
+ return;
+ }
+ }
+ }
+
+ private void readData(JsonObject player) {
+ try {
+ Map<String, Integer> highestCollectionTier = new HashMap<>();
+ Map<String, Integer> slayerTier = new HashMap<>();
+ int magesReputation = 0;
+ int barbariansReputation = 0;
+
+ if (player.has("unlocked_coll_tiers")) {
+ for (JsonElement element : player.get("unlocked_coll_tiers").getAsJsonArray()) {
+ String text = element.getAsString();
+ String[] split = text.split("_");
+ int level = Integer.parseInt(split[split.length - 1]);
+ String name = StringUtils.removeLastWord(text, "_");
+
+ LinkedHashMap<String, ItemStack> collectionMap = ProfileViewer.getCollectionToCollectionDisplayMap();
+ if (collectionMap.containsKey(name)) {
+ ItemStack itemStack = collectionMap.get(name);
+ String displayName = itemStack.getDisplayName();
+ name = Utils.cleanColour(displayName);
+ name = manager.formatInternalName(name);
+ } else {
+ /**
+ * Because skyblock is good in naming things
+ * Since there is no space in the profile viewer page for more collectionToCollectionDisplayMap entries
+ */
+ if (name.equals("SAND:1")) name = "RED_SAND";
+ if (name.equals("MYCEL")) name = "MYCELIUM";
+ }
+
+ level = Math.max(highestCollectionTier.getOrDefault(name, 0), level);
+ highestCollectionTier.put(name, level);
+ }
+ }
+
+ if (player.has("nether_island_player_data")) {
+ JsonObject netherData = player.getAsJsonObject("nether_island_player_data");
+ if (netherData.has("mages_reputation")) {
+ magesReputation = netherData.get("mages_reputation").getAsInt();
+ }
+ if (netherData.has("barbarians_reputation")) {
+ barbariansReputation = netherData.get("barbarians_reputation").getAsInt();
+ }
+ }
+
+ JsonObject slayerLeveling = Constants.LEVELING.getAsJsonObject("slayer_xp");
+
+ if (player.has("slayer_bosses")) {
+ JsonObject slayerBosses = player.getAsJsonObject("slayer_bosses");
+ for (Map.Entry<String, JsonElement> entry : slayerBosses.entrySet()) {
+ String name = entry.getKey();
+ JsonObject slayerEntry = entry.getValue().getAsJsonObject();
+ if (slayerEntry.has("xp")) {
+ long xp = slayerEntry.get("xp").getAsLong();
+
+ int tier = 0;
+ for (JsonElement element : slayerLeveling.getAsJsonArray(name)) {
+ int needForLevel = element.getAsInt();
+ if (xp >= needForLevel) {
+ tier++;
+ } else {
+ break;
+ }
+ }
+ slayerTier.put(name, tier);
+ }
+ }
+ }
+
+ manager.setApiData(new ApiData(highestCollectionTier, slayerTier, magesReputation, barbariansReputation));
+
+ manager.reloadRequirements();
+
+ } catch (Throwable t) {
+ t.printStackTrace();
+ Utils.addChatMessage("there was a mistake!");
+ throw new RuntimeException("lul", t);
+ }
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/loaders/MinionHelperInventoryLoader.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/loaders/MinionHelperInventoryLoader.java
new file mode 100644
index 00000000..3f694f82
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/loaders/MinionHelperInventoryLoader.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscgui.minionhelper.loaders;
+
+import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
+import io.github.moulberry.notenoughupdates.core.util.StringUtils;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.Minion;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.MinionHelperManager;
+import io.github.moulberry.notenoughupdates.util.ItemUtils;
+import net.minecraft.client.Minecraft;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.ContainerChest;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.gameevent.TickEvent;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MinionHelperInventoryLoader {
+ private static MinionHelperInventoryLoader instance = null;
+ private final MinionHelperManager manager = MinionHelperManager.getInstance();
+ private final List<String> loadedAlready = new ArrayList<>();
+
+ public static MinionHelperInventoryLoader getInstance() {
+ if (instance == null) {
+ instance = new MinionHelperInventoryLoader();
+ }
+ return instance;
+ }
+
+ int ticks = 0;
+
+ @SubscribeEvent
+ public void onTick(TickEvent.ClientTickEvent event) {
+ if (!NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard()) return;
+ ticks++;
+
+ if (ticks % 5 != 0) return;
+
+ if (manager.inCraftedMinionsInventory()) {
+ checkInv();
+ } else {
+ loadedAlready.clear();
+ }
+ }
+
+ private void checkInv() {
+ Container openContainer = Minecraft.getMinecraft().thePlayer.openContainer;
+ if (openContainer instanceof ContainerChest) {
+
+ Slot firstSlot = openContainer.inventorySlots.get(10);
+ boolean shouldLoad = false;
+ if (firstSlot != null) {
+ if (firstSlot.getHasStack()) {
+ ItemStack stack = firstSlot.getStack();
+ String displayName = stack.getDisplayName();
+ if (!loadedAlready.contains(displayName)) {
+ loadedAlready.add(displayName);
+ shouldLoad = true;
+ }
+ }
+ }
+
+ if (!shouldLoad) return;
+
+ for (Slot slot : openContainer.inventorySlots) {
+ if (!slot.getHasStack()) continue;
+ ItemStack stack = slot.getStack();
+ if (stack == null) continue;
+ if (slot.slotNumber != slot.getSlotIndex()) continue;
+
+ String displayName = stack.getDisplayName();
+ if (!displayName.contains(" Minion")) continue;
+
+ displayName = StringUtils.cleanColour(displayName);
+ int index = 0;
+ for (String line : ItemUtils.getLore(stack)) {
+ index++;
+ if (!line.contains("Tier")) {
+ continue;
+ }
+ if (line.contains("§a")) {
+ Minion minion = manager.getMinionByName(displayName, index);
+ minion.setCrafted(true);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/loaders/MinionHelperRepoLoader.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/loaders/MinionHelperRepoLoader.java
new file mode 100644
index 00000000..2786b7cd
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/loaders/MinionHelperRepoLoader.java
@@ -0,0 +1,306 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscgui.minionhelper.loaders;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
+import io.github.moulberry.notenoughupdates.core.util.StringUtils;
+import io.github.moulberry.notenoughupdates.events.RepositoryReloadEvent;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.Minion;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.MinionHelperManager;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.requirements.CollectionRequirement;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.requirements.CustomRequirement;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.requirements.ReputationRequirement;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.requirements.SlayerRequirement;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.sources.CraftingSource;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.sources.CustomSource;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.sources.NpcSource;
+import io.github.moulberry.notenoughupdates.util.Constants;
+import io.github.moulberry.notenoughupdates.util.Utils;
+import net.minecraftforge.fml.common.eventhandler.EventPriority;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.gameevent.TickEvent;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.regex.Pattern;
+
+public class MinionHelperRepoLoader {
+ private static MinionHelperRepoLoader instance = null;
+ private final MinionHelperManager manager = MinionHelperManager.getInstance();
+ private boolean dirty = true;
+ private int ticks = 0;
+
+ public static MinionHelperRepoLoader getInstance() {
+ if (instance == null) {
+ instance = new MinionHelperRepoLoader();
+ }
+ return instance;
+ }
+
+ /**
+ * This adds support for the /neureloadrepo command
+ */
+ @SubscribeEvent(priority = EventPriority.LOWEST)
+ public void onRepoReload(RepositoryReloadEvent event) {
+ dirty = true;
+ }
+
+ @SubscribeEvent
+ public void onTick(TickEvent.ClientTickEvent event) {
+ if (!NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard()) return;
+ ticks++;
+
+ if (ticks % 5 != 0) return;
+
+ if (dirty) {
+ dirty = false;
+ load();
+ }
+ }
+
+ void load() {
+ //TODO load new from config entries and so?
+ loadMinions();
+
+ loadNpcData();
+ loadMinionData();
+ loadCustomSources();
+
+ checkMissingData();
+ }
+
+ private void loadCustomSources() {
+ Map<String, String> customDescriptions = new HashMap<>();
+
+ customDescriptions.put("SNOW_GENERATOR_1", "Gifts");
+
+ customDescriptions.put("FLOWER_GENERATOR_1", "Dark Auction");
+
+ customDescriptions.put("REVENANT_GENERATOR_1", "Revenant Slayer");
+ customDescriptions.put("TARANTULA_GENERATOR_1", "Tarantula Slayer");
+ customDescriptions.put("VOIDLING_GENERATOR_1", "Voidling Slayer");
+ customDescriptions.put("INFERNO_GENERATOR_1", "Inferno Slayer");
+
+ for (Map.Entry<String, String> entry : customDescriptions.entrySet()) {
+ String internalName = entry.getKey();
+ String description = entry.getValue();
+ Minion minion = manager.getMinionById(internalName);
+ if (minion == null) continue;
+ minion.setMinionSource(new CustomSource(minion, description));
+ }
+
+
+ manager.getMinionById("FLOWER_GENERATOR_1").getRequirements().add(new CustomRequirement("Buy Flower Minion 1 from Dark Auction"));
+ manager.getMinionById("SNOW_GENERATOR_1").getRequirements().add(new CustomRequirement("Gain Snow Minion 1 from opening gifts"));
+
+ }
+
+ private void loadNpcData() {
+ TreeMap<String, JsonObject> itemInformation = NotEnoughUpdates.INSTANCE.manager.getItemInformation();
+ for (Map.Entry<String, JsonObject> entry : itemInformation.entrySet()) {
+ String internalName = entry.getKey();
+ if (!internalName.endsWith("_NPC")) continue;
+ JsonObject jsonObject = entry.getValue();
+ if (!jsonObject.has("recipes")) continue;
+
+ if (!jsonObject.has("displayname")) continue;
+ String npcName = jsonObject.get("displayname").getAsString();
+ npcName = StringUtils.cleanColour(npcName);
+ if (npcName.contains(" (")) {
+ npcName = npcName.split(" \\(")[0];
+ }
+
+ for (JsonElement element : jsonObject.get("recipes").getAsJsonArray()) {
+ JsonObject object = element.getAsJsonObject();
+ if (!object.has("type")) continue;
+ if (!object.get("type").getAsString().equals("npc_shop")) continue;
+ if (!object.has("result")) continue;
+
+ String result = object.get("result").getAsString();
+ if (!result.contains("_GENERATOR_")) continue;
+ Minion minion = manager.getMinionById(result);
+ if (!object.has("cost")) continue;
+
+ RecipeBuilder builder = new RecipeBuilder();
+
+ for (JsonElement costEntry : object.get("cost").getAsJsonArray()) {
+ String price = costEntry.getAsString();
+ builder.addLine(minion, price);
+ }
+
+ ArrayListMultimap<String, Integer> map = builder.getItems();
+ int coins = 0;
+ if (map.containsKey("SKYBLOCK_COIN")) {
+ coins = map.get("SKYBLOCK_COIN").get(0);
+ map.removeAll("SKYBLOCK_COIN");
+ }
+
+ minion.setMinionSource(new NpcSource(minion, npcName, coins, builder.getItems()));
+ minion.setParent(builder.getParent());
+ }
+ }
+ }
+
+ private void checkMissingData() {
+ for (Minion minion : manager.getAllMinions().values()) {
+ if (minion.getMinionSource() == null) {
+ Utils.addChatMessage("§7The Minion '" + minion.getInternalName() + " has no source!");
+ }
+ if (minion.getDisplayName() == null) {
+ Utils.addChatMessage("§cThe Minion '" + minion.getInternalName() + " has no display name!");
+ }
+ if (manager.getRequirements(minion).isEmpty()) {
+ Utils.addChatMessage("§cThe Minion '" + minion.getInternalName() + " has no requirements!");
+ }
+ }
+ }
+
+ private void loadMinionData() {
+ TreeMap<String, JsonObject> itemInformation = NotEnoughUpdates.INSTANCE.manager.getItemInformation();
+
+ for (Map.Entry<String, Minion> entry : manager.getAllMinions().entrySet()) {
+ String internalName = entry.getKey();
+ if (!itemInformation.containsKey(internalName)) continue;
+ Minion minion = entry.getValue();
+
+ JsonObject jsonObject = itemInformation.get(internalName);
+ if (jsonObject.has("displayname")) {
+ String displayName = jsonObject.get("displayname").getAsString();
+ displayName = StringUtils.cleanColour(displayName);
+ displayName = StringUtils.removeLastWord(displayName, " ");
+ minion.setDisplayName(displayName);
+ }
+
+ if (jsonObject.has("recipe")) {
+ loadRecipes(minion, jsonObject);
+ }
+ loadRequirements(minion, jsonObject);
+ }
+ }
+
+ private void loadRequirements(Minion minion, JsonObject jsonObject) {
+ for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
+ String name = entry.getKey();
+ if (name.endsWith("_req") || name.equals("crafttext")) {
+ String value = entry.getValue().getAsString();
+
+ try {
+ switch (name) {
+ case "reputation_req": {
+ String[] split = value.split(":");
+ String reputationType = split[0];
+ int reputation = Integer.parseInt(split[1]);
+ minion.getRequirements().add(new ReputationRequirement(reputationType, reputation));
+ break;
+ }
+ case "crafttext": {
+ if (minion.getTier() != 1) break;
+ if (value.isEmpty()) break;
+
+ //Requires: Red Sand I
+ String rawCollection = value.split(Pattern.quote(": "))[1];
+ String cleanCollection = StringUtils.removeLastWord(rawCollection, " ");
+ String rawTier = rawCollection.substring(cleanCollection.length() + 1);
+ int tier = Utils.parseRomanNumeral(rawTier);
+ minion.getRequirements().add(new CollectionRequirement(cleanCollection, tier));
+ break;
+ }
+ case "slayer_req": {
+ String[] split = value.split("_");
+ String slayerType = split[0];
+ int tier = Integer.parseInt(split[1]);
+ minion.getRequirements().add(new SlayerRequirement(slayerType, tier));
+ break;
+ }
+ }
+ } catch (ArrayIndexOutOfBoundsException | NumberFormatException e) {
+ Utils.addChatMessage(
+ "§4Error §cwhile loading repo entry " + minion.getDisplayName() + " " + minion.getTier() + ": " +
+ e.getClass().getSimpleName() + ": " + e.getMessage());
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ private void loadRecipes(Minion minion, JsonObject jsonObject) {
+ JsonObject recipes = jsonObject.get("recipe").getAsJsonObject();
+ RecipeBuilder builder = new RecipeBuilder();
+ for (Map.Entry<String, JsonElement> entry : recipes.entrySet()) {
+ String rawString = entry.getValue().getAsString();
+
+ builder.addLine(minion, rawString);
+ }
+
+ minion.setMinionSource(new CraftingSource(minion, builder.getItems()));
+ minion.setParent(builder.getParent());
+ }
+
+ private void loadMinions() {
+ for (Map.Entry<String, JsonElement> entry : Constants.MISC.get("minions").getAsJsonObject().entrySet()) {
+ String internalName = entry.getKey();
+ int maxTier = entry.getValue().getAsInt();
+ for (int i = 0; i < maxTier; i++) {
+ int tier = i + 1;
+ manager.createMinion(internalName + "_" + tier, tier);
+ }
+ }
+ }
+
+ class RecipeBuilder {
+ private Minion parent = null;
+ private final ArrayListMultimap<String, Integer> items = ArrayListMultimap.create();
+
+ public Minion getParent() {
+ return parent;
+ }
+
+ public ArrayListMultimap<String, Integer> getItems() {
+ return items;
+ }
+
+ public void addLine(Minion minion, String rawString) {
+ String[] split = rawString.split(":");
+ String itemName = split[0];
+
+ boolean isParent = false;
+ if (itemName.contains("_GENERATOR_")) {
+ String minionInternalName = minion.getInternalName();
+ boolean same = StringUtils.removeLastWord(itemName, "_").equals(StringUtils.removeLastWord(minionInternalName, "_"));
+ if (same) {
+ parent = manager.getMinionById(itemName);
+ if (parent == null) {
+ String message = "Parent is null for minion " + minionInternalName;
+ Utils.addChatMessage(message);
+ }
+ isParent = true;
+ }
+ }
+ if (!isParent) {
+ int amount = Integer.parseInt(split[1]);
+ items.put(itemName, amount);
+ }
+ }
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/renderables/RenderableObject.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/renderables/RenderableObject.java
new file mode 100644
index 00000000..c390138a
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/renderables/RenderableObject.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscgui.minionhelper.renderables;
+
+public abstract class RenderableObject {
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/renderables/RenderableText.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/renderables/RenderableText.java
new file mode 100644
index 00000000..413cf754
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/renderables/RenderableText.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscgui.minionhelper.renderables;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class RenderableText extends RenderableObject {
+
+ private final List<String> lines;
+
+ public RenderableText(List<String> lines) {
+ this.lines = lines;
+ }
+
+ public RenderableText(String... lines) {
+ this(Arrays.asList(lines));
+ }
+
+ public List<String> getLines() {
+ return lines;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/CollectionRequirement.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/CollectionRequirement.java
new file mode 100644
index 00000000..376065a0
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/CollectionRequirement.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscgui.minionhelper.requirements;
+
+public class CollectionRequirement extends MinionRequirement {
+
+ private final String collection;
+ private final int level;
+
+ public CollectionRequirement(String collection, int level) {
+ this.collection = collection;
+ this.level = level;
+ }
+
+ public int getLevel() {
+ return level;
+ }
+
+ public String getCollection() {
+ return collection;
+ }
+
+ @Override
+ public String printDescription() {
+ return collection + " collection at level " + level;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/CustomRequirement.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/CustomRequirement.java
new file mode 100644
index 00000000..2755e4ad
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/CustomRequirement.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscgui.minionhelper.requirements;
+
+public class CustomRequirement extends MinionRequirement {
+
+ private final String text;
+
+ public CustomRequirement(String text) {
+ this.text = text;
+ }
+ @Override
+ public String printDescription() {
+ return text;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/MinionRequirement.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/MinionRequirement.java
new file mode 100644
index 00000000..763428df
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/MinionRequirement.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscgui.minionhelper.requirements;
+
+public abstract class MinionRequirement {
+ public abstract String printDescription();
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/ReputationRequirement.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/ReputationRequirement.java
new file mode 100644
index 00000000..0ee153a2
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/ReputationRequirement.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscgui.minionhelper.requirements;
+
+public class ReputationRequirement extends MinionRequirement {
+
+ private final String reputationType;
+ private final int reputation;
+
+ public ReputationRequirement(String reputationType, int reputation) {
+ this.reputationType = reputationType;
+ this.reputation = reputation;
+ }
+
+ public int getReputation() {
+ return reputation;
+ }
+
+ public String getReputationType() {
+ return reputationType;
+ }
+
+ @Override
+ public String printDescription() {
+ return reputation + " " + reputationType + " reputation";
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/SlayerRequirement.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/SlayerRequirement.java
new file mode 100644
index 00000000..0b81c5be
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/requirements/SlayerRequirement.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscgui.minionhelper.requirements;
+
+public class SlayerRequirement extends MinionRequirement {
+
+ private final String slayer;
+ private final int level;
+
+ public SlayerRequirement(String slayer, int level) {
+ this.slayer = slayer;
+ this.level = level;
+ }
+
+ public int getLevel() {
+ return level;
+ }
+
+ public String getSlayer() {
+ return slayer;
+ }
+
+ @Override
+ public String printDescription() {
+ return slayer + " slayer at level " + level;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/sources/CraftingSource.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/sources/CraftingSource.java
new file mode 100644
index 00000000..1c0f0747
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/sources/CraftingSource.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscgui.minionhelper.sources;
+
+import com.google.common.collect.ArrayListMultimap;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.Minion;
+
+public class CraftingSource extends MinionSource {
+ //name -> amount
+ private final ArrayListMultimap<String, Integer> items;
+
+ public CraftingSource(Minion minion, ArrayListMultimap<String, Integer> items) {
+ super(minion);
+ this.items = items;
+ }
+
+ public ArrayListMultimap<String, Integer> getItems() {
+ return items;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/sources/CustomSource.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/sources/CustomSource.java
new file mode 100644
index 00000000..ccbd84fb
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/sources/CustomSource.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscgui.minionhelper.sources;
+
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.Minion;
+
+public class CustomSource extends MinionSource {
+
+ //TODO rename variable
+ private final String customSource;
+
+ public CustomSource(Minion minion, String customSource) {
+ super(minion);
+ this.customSource = customSource;
+ }
+
+ public String getCustomSource() {
+ return customSource;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/sources/MinionSource.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/sources/MinionSource.java
new file mode 100644
index 00000000..fcb4a3c3
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/sources/MinionSource.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscgui.minionhelper.sources;
+
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.Minion;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.renderables.RenderableObject;
+
+public abstract class MinionSource extends RenderableObject {
+ private final Minion minion;
+
+ public MinionSource(Minion minion) {
+ this.minion = minion;
+ }
+
+ //TODO remove later maybe?
+ public Minion getMinion() {
+ return minion;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/sources/NpcSource.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/sources/NpcSource.java
new file mode 100644
index 00000000..9bb6d7b4
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/minionhelper/sources/NpcSource.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2022 NotEnoughUpdates contributors
+ *
+ * This file is part of NotEnoughUpdates.
+ *
+ * NotEnoughUpdates is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * NotEnoughUpdates is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package io.github.moulberry.notenoughupdates.miscgui.minionhelper.sources;
+
+import com.google.common.collect.ArrayListMultimap;
+import io.github.moulberry.notenoughupdates.miscgui.minionhelper.Minion;
+
+public class NpcSource extends MinionSource {
+ private final String npcName;
+ // name -> amount
+ private final ArrayListMultimap<String, Integer> items;
+ private int coins = 0;
+
+ public NpcSource(Minion minion, String npcName, int coins, ArrayListMultimap<String, Integer> items) {
+ super(minion);
+ this.npcName = npcName;
+ this.coins = coins;
+ this.items = items;
+ }
+
+ public String getNpcName() {
+ return npcName;
+ }
+
+ public ArrayListMultimap<String, Integer> getItems() {
+ return items;
+ }
+
+ public int getCoins() {
+ return coins;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityPlayerSP.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityPlayerSP.java
index 765ed372..581a2c17 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityPlayerSP.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityPlayerSP.java
@@ -21,10 +21,10 @@ package io.github.moulberry.notenoughupdates.mixins;
import io.github.moulberry.notenoughupdates.miscfeatures.SlotLocking;
import io.github.moulberry.notenoughupdates.util.SBInfo;
+import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.entity.item.EntityItem;
-import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
@@ -42,8 +42,7 @@ public class MixinEntityPlayerSP {
int slot = Minecraft.getMinecraft().thePlayer.inventory.currentItem;
if (SlotLocking.getInstance().isSlotIndexLocked(slot) || SlotLocking.getInstance().isSwapedSlotLocked()) {
ci.cancel();
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "NotEnoughUpdates has prevented you from dropping that locked item!"));
+ Utils.addChatMessage(EnumChatFormatting.RED + "NotEnoughUpdates has prevented you from dropping that locked item!");
}
}
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java
index 7ed3a799..3193741a 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java
@@ -158,10 +158,10 @@ public class ProfileViewer {
put("SUGAR_CANE", Utils.createItemStack(Items.reeds, EnumChatFormatting.YELLOW + "Sugar Cane"));
put("FEATHER", Utils.createItemStack(Items.feather, EnumChatFormatting.YELLOW + "Feather"));
put("LEATHER", Utils.createItemStack(Items.leather, EnumChatFormatting.YELLOW + "Leather"));
- put("PORK", Utils.createItemStack(Items.porkchop, EnumChatFormatting.YELLOW + "Porkchop"));
- put("RAW_CHICKEN", Utils.createItemStack(Items.chicken, EnumChatFormatting.YELLOW + "Chicken"));
+ put("PORK", Utils.createItemStack(Items.porkchop, EnumChatFormatting.YELLOW + "Raw Porkchop"));
+ put("RAW_CHICKEN", Utils.createItemStack(Items.chicken, EnumChatFormatting.YELLOW + "Raw Chicken"));
put("MUTTON", Utils.createItemStack(Items.mutton, EnumChatFormatting.YELLOW + "Mutton"));
- put("RABBIT", Utils.createItemStack(Items.rabbit, EnumChatFormatting.YELLOW + "Rabbit"));
+ put("RABBIT", Utils.createItemStack(Items.rabbit, EnumChatFormatting.YELLOW + "Raw Rabbit"));
put("NETHER_STALK", Utils.createItemStack(Items.nether_wart, EnumChatFormatting.YELLOW + "Nether Wart"));
/* MINING COLLECTIONS */
@@ -181,7 +181,7 @@ public class ProfileViewer {
"OBSIDIAN",
Utils.createItemStack(Item.getItemFromBlock(Blocks.obsidian), EnumChatFormatting.GRAY + "Obsidian")
);
- put("GLOWSTONE_DUST", Utils.createItemStack(Items.glowstone_dust, EnumChatFormatting.GRAY + "Glowstone"));
+ put("GLOWSTONE_DUST", Utils.createItemStack(Items.glowstone_dust, EnumChatFormatting.GRAY + "Glowstone Dust"));
put("GRAVEL", Utils.createItemStack(Item.getItemFromBlock(Blocks.gravel), EnumChatFormatting.GRAY + "Gravel"));
put("ICE", Utils.createItemStack(Item.getItemFromBlock(Blocks.ice), EnumChatFormatting.GRAY + "Ice"));
put(
@@ -220,27 +220,27 @@ public class ProfileViewer {
put("MAGMA_CREAM", Utils.createItemStack(Items.magma_cream, EnumChatFormatting.RED + "Magma Cream"));
/* FORAGING COLLECTIONS */
- put("LOG", Utils.createItemStack(Item.getItemFromBlock(Blocks.log), EnumChatFormatting.DARK_GREEN + "Oak"));
+ put("LOG", Utils.createItemStack(Item.getItemFromBlock(Blocks.log), EnumChatFormatting.DARK_GREEN + "Oak Wood"));
put(
"LOG:1",
- Utils.createItemStack(Item.getItemFromBlock(Blocks.log), EnumChatFormatting.DARK_GREEN + "Spruce", 1)
+ Utils.createItemStack(Item.getItemFromBlock(Blocks.log), EnumChatFormatting.DARK_GREEN + "Spruce Wood", 1)
);
put(
"LOG:2",
- Utils.createItemStack(Item.getItemFromBlock(Blocks.log), EnumChatFormatting.DARK_GREEN + "Birch", 2)
+ Utils.createItemStack(Item.getItemFromBlock(Blocks.log), EnumChatFormatting.DARK_GREEN + "Birch Wood", 2)
);
put(
"LOG_2:1",
- Utils.createItemStack(Item.getItemFromBlock(Blocks.log2), EnumChatFormatting.DARK_GREEN + "Dark Oak", 1)
+ Utils.createItemStack(Item.getItemFromBlock(Blocks.log2), EnumChatFormatting.DARK_GREEN + "Dark Oak Wood", 1)
);
- put("LOG_2", Utils.createItemStack(Item.getItemFromBlock(Blocks.log2), EnumChatFormatting.DARK_GREEN + "Acacia"));
+ put("LOG_2", Utils.createItemStack(Item.getItemFromBlock(Blocks.log2), EnumChatFormatting.DARK_GREEN + "Acacia Wood"));
put(
"LOG:3",
- Utils.createItemStack(Item.getItemFromBlock(Blocks.log), EnumChatFormatting.DARK_GREEN + "Jungle", 3)
+ Utils.createItemStack(Item.getItemFromBlock(Blocks.log), EnumChatFormatting.DARK_GREEN + "Jungle Wood", 3)
);
/* FISHING COLLECTIONS */
- put("RAW_FISH", Utils.createItemStack(Items.fish, EnumChatFormatting.AQUA + "Fish"));
+ put("RAW_FISH", Utils.createItemStack(Items.fish, EnumChatFormatting.AQUA + "Raw Fish"));
put("RAW_FISH:1", Utils.createItemStack(Items.fish, EnumChatFormatting.AQUA + "Salmon", 1));
put("RAW_FISH:2", Utils.createItemStack(Items.fish, EnumChatFormatting.AQUA + "Clownfish", 2));
put("RAW_FISH:3", Utils.createItemStack(Items.fish, EnumChatFormatting.AQUA + "Pufferfish", 3));
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeGenerator.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeGenerator.java
index d63ea42c..54daf42d 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeGenerator.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeGenerator.java
@@ -33,7 +33,6 @@ import net.minecraft.inventory.ContainerChest;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagList;
-import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
@@ -91,32 +90,30 @@ public class RecipeGenerator {
if (uiTitle.equals("Confirm Process") && saveRecipe) {
ForgeRecipe recipe = parseSingleForgeRecipe(menu);
if (recipe == null) {
- p.addChatMessage(new ChatComponentText(
- "" + EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD + "Could not parse recipe for this UI"));
+ Utils.addChatMessage(
+ "" + EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD + "Could not parse recipe for this UI");
} else {
- p.addChatMessage(new ChatComponentText(
- "" + EnumChatFormatting.GREEN + EnumChatFormatting.BOLD + "Parsed recipe:"));
- p.addChatMessage(new ChatComponentText("" + EnumChatFormatting.AQUA + " Inputs:"));
+ Utils.addChatMessage("" + EnumChatFormatting.GREEN + EnumChatFormatting.BOLD + "Parsed recipe:");
+ Utils.addChatMessage("" + EnumChatFormatting.AQUA + " Inputs:");
for (Ingredient i : recipe.getInputs())
- p.addChatMessage(new ChatComponentText(
- " - " + EnumChatFormatting.AQUA + i.getInternalItemId() + " x " + i.getCount()));
- p.addChatMessage(new ChatComponentText("" + EnumChatFormatting.AQUA + " Output: " + EnumChatFormatting.GOLD +
- recipe.getOutput().getInternalItemId() + " x " + recipe.getOutput().getCount()));
- p.addChatMessage(new ChatComponentText(
+ Utils.addChatMessage(" - " + EnumChatFormatting.AQUA + i.getInternalItemId() + " x " + i.getCount());
+ Utils.addChatMessage("" + EnumChatFormatting.AQUA + " Output: " + EnumChatFormatting.GOLD +
+ recipe.getOutput().getInternalItemId() + " x " + recipe.getOutput().getCount());
+ Utils.addChatMessage(
"" + EnumChatFormatting.AQUA + " Time: " + EnumChatFormatting.GRAY + recipe.getTimeInSeconds() +
- " seconds (no QF) ."));
+ " seconds (no QF) .");
boolean saved = false;
try {
saved = saveRecipes(recipe.getOutput().getInternalItemId(), Collections.singletonList(recipe));
- } catch (IOException e) {
+ } catch (IOException ignored) {
}
if (!saved)
- p.addChatMessage(new ChatComponentText("" +
- EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD + EnumChatFormatting.OBFUSCATED + "#" +
- EnumChatFormatting.RESET + EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD + " ERROR " +
- EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD + EnumChatFormatting.OBFUSCATED + "#" +
- EnumChatFormatting.RESET + EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD +
- " Failed to save recipe. Does the item already exist?"));
+ Utils.addChatMessage(
+ "" + EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD + EnumChatFormatting.OBFUSCATED + "#" +
+ EnumChatFormatting.RESET + EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD + " ERROR " +
+ EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD + EnumChatFormatting.OBFUSCATED + "#" +
+ EnumChatFormatting.RESET + EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD +
+ " Failed to save recipe. Does the item already exist?");
}
}
if (saveRecipe) attemptToSaveBestiary(menu);
@@ -171,8 +168,7 @@ public class RecipeGenerator {
for (String loreLine : mobLore) {
Matcher loreMatcher = LORE_PATTERN.matcher(loreLine);
if (!loreMatcher.matches()) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- "[WARNING] Unknown lore line: " + loreLine));
+ Utils.addChatMessage("[WARNING] Unknown lore line: " + loreLine);
continue;
}
if (loreMatcher.group("coins") != null)
@@ -186,8 +182,7 @@ public class RecipeGenerator {
List<JsonObject> possibleItems = neu.manager.getItemInformation().values().stream().filter(it -> it.get(
"displayname").getAsString().equals(dropName)).collect(Collectors.toList());
if (possibleItems.size() != 1) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- "[WARNING] Could not parse drop, ambiguous or missing item information: " + loreLine));
+ Utils.addChatMessage("[WARNING] Could not parse drop, ambiguous or missing item information: " + loreLine);
continue;
}
Ingredient item = new Ingredient(neu.manager, possibleItems.get(0).get("internalname").getAsString());
@@ -197,9 +192,7 @@ public class RecipeGenerator {
drops.add(new MobLootRecipe.MobDrop(item, chance, new ArrayList<>()));
}
if (loreMatcher.group("missing") != null) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
- "[WARNING] You are missing Bestiary levels for drop: " + loreLine));
-
+ Utils.addChatMessage("[WARNING] You are missing Bestiary levels for drop: " + loreLine);
}
}
recipes.add(new MobLootRecipe(
@@ -218,15 +211,15 @@ public class RecipeGenerator {
boolean saved = false;
try {
saved = saveRecipes(internalMobName, recipes);
- } catch (IOException e) {
+ } catch (IOException ignored) {
}
if (!saved)
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("" +
- EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD + EnumChatFormatting.OBFUSCATED + "#" +
- EnumChatFormatting.RESET + EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD + " ERROR " +
- EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD + EnumChatFormatting.OBFUSCATED + "#" +
- EnumChatFormatting.RESET + EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD +
- " Failed to save recipe. Does the item already exist?")); // TODO: MERGE CODE OVER
+ Utils.addChatMessage(
+ "" + EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD + EnumChatFormatting.OBFUSCATED + "#" +
+ EnumChatFormatting.RESET + EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD + " ERROR " +
+ EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD + EnumChatFormatting.OBFUSCATED + "#" +
+ EnumChatFormatting.RESET + EnumChatFormatting.DARK_RED + EnumChatFormatting.BOLD +
+ " Failed to save recipe. Does the item already exist?"); // TODO: MERGE CODE OVER
}
private int parseIntIgnoringCommas(String text) {
@@ -307,7 +300,7 @@ public class RecipeGenerator {
);
}
- private static Map<Character, Integer> durationSuffixLengthMap = new HashMap<Character, Integer>() {{
+ private static final Map<Character, Integer> durationSuffixLengthMap = new HashMap<Character, Integer>() {{
put('d', 60 * 60 * 24);
put('h', 60 * 60);
put('m', 60);
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/NEUDebugLogger.java b/src/main/java/io/github/moulberry/notenoughupdates/util/NEUDebugLogger.java
index 230b8ae5..e5d00a66 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/util/NEUDebugLogger.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/util/NEUDebugLogger.java
@@ -34,7 +34,7 @@ public class NEUDebugLogger {
public static boolean allFlagsEnabled = false;
private static void chatLogger(String message) {
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "[NEU DEBUG] " + message));
+ Utils.addChatMessage(EnumChatFormatting.YELLOW + "[NEU DEBUG] " + message);
}
public static boolean isFlagEnabled(NEUDebugFlag flag) {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java b/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java
index 9419be4f..8bac8dbc 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java
@@ -38,7 +38,6 @@ import net.minecraft.scoreboard.Score;
import net.minecraft.scoreboard.ScoreObjective;
import net.minecraft.scoreboard.ScorePlayerTeam;
import net.minecraft.scoreboard.Scoreboard;
-import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IChatComponent;
import net.minecraftforge.client.event.ClientChatReceivedEvent;
@@ -149,8 +148,7 @@ public class SBInfo {
public boolean checkForSkyblockLocation() {
if (!NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard() || getLocation() == null) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "[NEU] This command is not available outside SkyBlock"));
+ Utils.addChatMessage(EnumChatFormatting.RED + "[NEU] This command is not available outside SkyBlock");
return false;
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java b/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java
index f45b840c..50782575 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java
@@ -326,6 +326,7 @@ public class Utils {
}
public static String shortNumberFormat(double n, int iteration) {
+ if (n < 1000 && iteration == 0) return "" + (int) n;
double d = ((long) n / 100) / 10.0;
boolean isRound = (d * 10) % 10 == 0;
return (d < 1000 ?
@@ -1936,9 +1937,13 @@ public class Utils {
public static void showOutdatedRepoNotification() {
NotificationHandler.displayNotification(Lists.newArrayList(
EnumChatFormatting.RED + EnumChatFormatting.BOLD.toString() + "Missing repo data",
- EnumChatFormatting.RED + "Data used for many NEU features is not up to date, this should normally not be the case.",
- EnumChatFormatting.RED + "You can try " + EnumChatFormatting.BOLD + "/neuresetrepo" + EnumChatFormatting.RESET + EnumChatFormatting.RED +" and restart your game" +
- " to see if that fixes the issue.", EnumChatFormatting.RED + "If the problem persists please join " + EnumChatFormatting.BOLD + "discord.gg/moulberry" +
+ EnumChatFormatting.RED +
+ "Data used for many NEU features is not up to date, this should normally not be the case.",
+ EnumChatFormatting.RED + "You can try " + EnumChatFormatting.BOLD + "/neuresetrepo" + EnumChatFormatting.RESET +
+ EnumChatFormatting.RED + " and restart your game" +
+ " to see if that fixes the issue.",
+ EnumChatFormatting.RED + "If the problem persists please join " + EnumChatFormatting.BOLD +
+ "discord.gg/moulberry" +
EnumChatFormatting.RESET + EnumChatFormatting.RED + " and message in " + EnumChatFormatting.BOLD +
"#neu-support" + EnumChatFormatting.RESET + EnumChatFormatting.RED + " to get support"
),
@@ -1970,4 +1975,8 @@ public class Utils {
}
return -1;
}
+
+ public static void addChatMessage(String message) {
+ Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(message));
+ }
}