From f29ebcc6cdf202a69f267a4dbdbfc9239929fd8a Mon Sep 17 00:00:00 2001
From: Lulonaut <67191924+Lulonaut@users.noreply.github.com>
Date: Sun, 20 Mar 2022 08:47:29 +0100
Subject: dungeons and pv bingo tab (#93)
---
.../assets/notenoughupdates/invbuttons/presets.json | 3 ++-
.../resources/assets/notenoughupdates/pv_bingo_tab.png | Bin 0 -> 2635 bytes
2 files changed, 2 insertions(+), 1 deletion(-)
create mode 100644 src/main/resources/assets/notenoughupdates/pv_bingo_tab.png
(limited to 'src/main/resources')
diff --git a/src/main/resources/assets/notenoughupdates/invbuttons/presets.json b/src/main/resources/assets/notenoughupdates/invbuttons/presets.json
index 4184e6d4..e36f8021 100644
--- a/src/main/resources/assets/notenoughupdates/invbuttons/presets.json
+++ b/src/main/resources/assets/notenoughupdates/invbuttons/presets.json
@@ -2569,7 +2569,8 @@
"anchorRight": false,
"anchorBottom": false,
"backgroundIndex": 0,
- "command": ""
+ "command": "joindungeon master_catacombs 7",
+ "icon": "DIAMOND_NECRON_HEAD"
},
{
"x": 151,
diff --git a/src/main/resources/assets/notenoughupdates/pv_bingo_tab.png b/src/main/resources/assets/notenoughupdates/pv_bingo_tab.png
new file mode 100644
index 00000000..135035cf
Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/pv_bingo_tab.png differ
--
cgit
From 47efdd4f84cc9a29738fe16d631eb33ee716db61 Mon Sep 17 00:00:00 2001
From: DeDiamondPro <67508414+DeDiamondPro@users.noreply.github.com>
Date: Sun, 27 Mar 2022 19:12:44 +0200
Subject: New wiki in wiki renderer (#97)
* partly working and pushing cuz jani
* way better rendering stuff but still not perfect
* finish most of wiki renderer for new wiki
* JANI MY FRIEND PLEASE TEST
* Windows time :sad:
* fix wiki renderer
* Some things I forgor
* changelog
* Better corrupted file handling in graph and added check for crash that I have no idea how it happened.
---
Update Notes/2.1.md | 1 +
.../moulberry/notenoughupdates/NEUManager.java | 12 +-
.../moulberry/notenoughupdates/NEUOverlay.java | 32 ++++--
.../notenoughupdates/infopanes/HTMLInfoPane.java | 124 ++++++++++++++++++---
.../notenoughupdates/infopanes/InfoPane.java | 4 +-
.../notenoughupdates/miscgui/GuiPriceGraph.java | 16 ++-
.../options/seperateSections/Misc.java | 18 +--
.../assets/notenoughupdates/official-wiki.css | 1 +
8 files changed, 165 insertions(+), 43 deletions(-)
create mode 100644 src/main/resources/assets/notenoughupdates/official-wiki.css
(limited to 'src/main/resources')
diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md
index 9c9fc310..1344905e 100644
--- a/Update Notes/2.1.md
+++ b/Update Notes/2.1.md
@@ -16,6 +16,7 @@
- [Added bingo tab in /pv](https://cdn.discordapp.com/attachments/702456294874808330/951909539383500820/unknown.png) - Lulonaut
- Added wishing compass solver that shows target coordinates using two samples - CraftyOldMiner
- Improved metal detector logic to solve using a single position in most cases using known locations based on Keeper coordinates - CraftyOldMiner
+- Added support for official Hypixel wiki, can be toggled in /neu misc - DeDiamondPro
### **Minor Changes:**
- Add built-in recipes for forge crafts - nea89
- Add Stranded Villager Trades to the item list - nea89
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java
index df31834f..abe0bdcf 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java
@@ -23,6 +23,7 @@ import org.apache.commons.io.FileUtils;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
+import javax.net.ssl.HttpsURLConnection;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import java.io.*;
@@ -1032,11 +1033,12 @@ public class NEUManager {
} catch (IOException e) {
return null;
}
- try (
- BufferedInputStream inStream = new BufferedInputStream(new URL(
- url + "?action=raw&templates=expand").openStream());
- FileOutputStream fileOutputStream = new FileOutputStream(f)
- ) {
+ try {
+ HttpsURLConnection con = (HttpsURLConnection) new URL(url + "?action=raw&templates=expand").openConnection();
+ con.setRequestMethod("GET");
+ con.setRequestProperty("User-Agent", "NotEnoughUpdates");
+ BufferedInputStream inStream = new BufferedInputStream(con.getInputStream());
+ FileOutputStream fileOutputStream = new FileOutputStream(f);
byte[] dataBuffer = new byte[1024];
int bytesRead;
while ((bytesRead = inStream.read(dataBuffer, 0, 1024)) != -1) {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java
index 5ad02f94..b7aa42d6 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java
@@ -751,16 +751,27 @@ public class NEUOverlay extends Gui {
public void showInfo(JsonObject item) {
if (item.has("info") && item.has("infoType")) {
JsonArray lore = item.get("info").getAsJsonArray();
- StringBuilder loreBuilder = new StringBuilder();
- for (int i = 0; i < lore.size(); i++) {
- loreBuilder.append(lore.get(i).getAsString());
- if (i != lore.size() - 1)
- loreBuilder.append("\n");
+ String infoType = item.get("infoType").getAsString();
+ String infoText = "";
+ if (infoType.equals("WIKI_URL")) {
+ for (JsonElement url : lore) {
+ infoText = url.getAsString();
+ if (
+ url.getAsString().startsWith("https://wiki.hypixel.net/") && NotEnoughUpdates.INSTANCE.config.misc.wiki == 0
+ || url.getAsString().startsWith("https://hypixel-skyblock.fandom.com/") &&
+ NotEnoughUpdates.INSTANCE.config.misc.wiki == 1) break;
+ }
+ } else {
+ StringBuilder loreBuilder = new StringBuilder();
+ for (int i = 0; i < lore.size(); i++) {
+ loreBuilder.append(lore.get(i).getAsString());
+ if (i != lore.size() - 1)
+ loreBuilder.append("\n");
+ }
+ infoText = loreBuilder.toString();
}
- String infoText = loreBuilder.toString();
String internalname = item.get("internalname").getAsString();
String name = item.get("displayname").getAsString();
- String infoType = item.get("infoType").getAsString();
displayInformationPane(new TextInfoPane(
this,
manager,
@@ -825,6 +836,10 @@ public class NEUOverlay extends Gui {
if (selectedItemGroup != null) {
int selectedX = Math.min(selectedItemGroupX, width - getBoxPadding() - 18 * selectedItemGroup.size());
if (mouseY > selectedItemGroupY + 17 && mouseY < selectedItemGroupY + 35) {
+ if (!Mouse.getEventButtonState()) {
+ Utils.pushGuiScale(-1);
+ return true; //End early if the mouse isn't pressed, but still cancel event.
+ }
for (int i = 0; i < selectedItemGroup.size(); i++) {
if (mouseX >= selectedX - 1 + 18 * i && mouseX <= selectedX + 17 + 18 * i) {
JsonObject item = selectedItemGroup.get(i);
@@ -1349,7 +1364,8 @@ public class NEUOverlay extends Gui {
} else if (getSortMode() == SORT_MODE_PET) {
return internalname.matches(petRegex) && item.get("displayname").getAsString().contains("[");
} else if (getSortMode() == SORT_MODE_TOOL) {
- return checkItemType(item.get("lore").getAsJsonArray(),
+ return checkItemType(
+ item.get("lore").getAsJsonArray(),
"SWORD",
"BOW",
"AXE",
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/HTMLInfoPane.java b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/HTMLInfoPane.java
index baf88457..e4098f3e 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/HTMLInfoPane.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/HTMLInfoPane.java
@@ -14,6 +14,7 @@ import io.github.moulberry.notenoughupdates.util.AllowEmptyHTMLTag;
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.ScaledResolution;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.texture.DynamicTexture;
@@ -30,10 +31,12 @@ import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
+import java.util.regex.Pattern;
public class HTMLInfoPane extends TextInfoPane {
private static final WikiModel wikiModel;
@@ -47,6 +50,10 @@ public class HTMLInfoPane extends TextInfoPane {
private int imageHeight = 0;
private int imageWidth = 0;
+ private float xMin = 0;
+ private int mouseOffset = 0;
+ private boolean selected = false;
+
private static boolean hasAttemptedDownload = false;
/*
@@ -61,6 +68,16 @@ public class HTMLInfoPane extends TextInfoPane {
conf.addTokenTag("infobox", new IgnoreTag("infobox"));
conf.addTokenTag("tabber", new IgnoreTag("tabber"));
conf.addTokenTag("kbd", new HTMLTag("kbd"));
+ conf.addTokenTag("td", new AllowEmptyHTMLTag("td"));
+ conf.addTokenTag("tbody", new AllowEmptyHTMLTag("tbody"));
+ conf.addTokenTag("style", new AllowEmptyHTMLTag("style"));
+ conf.addTokenTag("article", new AllowEmptyHTMLTag("article"));
+ conf.addTokenTag("section", new AllowEmptyHTMLTag("section"));
+ conf.addTokenTag("link", new AllowEmptyHTMLTag("link"));
+ conf.addTokenTag("wbr", new AllowEmptyHTMLTag("wbr"));
+ conf.addTokenTag("dl", new AllowEmptyHTMLTag("dl"));
+ conf.addTokenTag("dd", new AllowEmptyHTMLTag("dd"));
+ conf.addTokenTag("dt", new AllowEmptyHTMLTag("dt"));
wikiModel = new WikiModel(conf, "https://hypixel-skyblock.fandom.com/wiki/Special:Filepath/${image}",
"https://hypixel-skyblock.fandom.com/wiki/${title}"
) {
@@ -101,7 +118,7 @@ public class HTMLInfoPane extends TextInfoPane {
) {
return manager.getWebFile(wikiUrl).thenApply(f -> {
if (f == null) {
- return new HTMLInfoPane(overlay, manager, "error", "error", "Failed to load wiki url: " + wikiUrl);
+ return new HTMLInfoPane(overlay, manager, "error", "error", "Failed to load wiki url: " + wikiUrl, false);
}
StringBuilder sb = new StringBuilder();
@@ -114,9 +131,16 @@ public class HTMLInfoPane extends TextInfoPane {
sb.append(l).append("\n");
}
} catch (IOException e) {
- return new HTMLInfoPane(overlay, manager, "error", "error", "Failed to load wiki url: " + wikiUrl);
+ return new HTMLInfoPane(overlay, manager, "error", "error", "Failed to load wiki url: " + wikiUrl, false);
}
- return createFromWikiText(overlay, manager, name, f.getName(), sb.toString());
+ return createFromWikiText(
+ overlay,
+ manager,
+ name,
+ f.getName(),
+ sb.toString(),
+ wikiUrl.startsWith("https://wiki.hypixel.net/")
+ );
});
}
@@ -126,15 +150,37 @@ public class HTMLInfoPane extends TextInfoPane {
* a more permanent solution that can be abstracted to work with arbitrary wiki codes (eg. moulberry.github.io/
* files/neu_help.html).
*/
+
+ private static final Pattern replacePattern = Pattern.compile(
+ "|",
+ Pattern.DOTALL
+ );
+
public static HTMLInfoPane createFromWikiText(
NEUOverlay overlay, NEUManager manager, String name, String filename,
- String wiki
+ String wiki, boolean isOfficialWiki
) {
- String[] split = wiki.split("");
- wiki = split[split.length - 1]; //Remove everything before infobox
- wiki = wiki.split("")[0]; //Remove navbox
- wiki = wiki.split("
")[1].split("")[0]; // hide top bar
+ wiki = wiki.split("
")[0]; // hide giant bottom list
+ wiki = wiki.split("
")[0]; // hide small bottom category thing
+ wiki = replacePattern.matcher(wiki).replaceAll("");
+ wiki = wiki.replaceAll(
+ "",
+ ""
+ ); // hide beta box
+ wiki = wiki.replaceAll("
.*
", ""); // hide title
+ wiki = wiki.replace("src=\"/", "src=\"https://wiki.hypixel.net/");
+ wiki = wiki.replace("\uD83D\uDDF8", "✓"); // replace checkmark with one that renders
+ wiki = wiki.replace("\uD83E\uDC10", "\u27F5"); // replace left arrow with one that renders
+ wiki = wiki.replace("\uD83E\uDC12", "\u27F6"); // replace right arrow with one that renders
+ } else {
+ String[] split = wiki.split("");
+ wiki = split[split.length - 1]; //Remove everything before infobox
+ wiki = wiki.split("")[0]; //Remove navbox
+ wiki = wiki.split("
= barX && mouseX <= barWidth && mouseY >= barY && mouseY <= barHeight || selected;
+ Gui.drawRect(barX, barY, barWidth, barHeight, new Color(255, 255, 255, isHovered ? 150 : 100).getRGB());
+ }
} else {
scrollHeight.setValue(0);
@@ -435,6 +508,27 @@ public class HTMLInfoPane extends TextInfoPane {
@Override
public void mouseInput(int width, int height, int mouseX, int mouseY, boolean mouseDown) {
+ int paneWidth = (int) (width / 3 * overlay.getWidthMult());
+ int rightSide = (int) (width * overlay.getInfoPaneOffsetFactor());
+ int leftSide = rightSide - paneWidth;
+ int imageW = paneWidth - overlay.getBoxPadding() * 2;
+ float scaleF = IMAGE_WIDTH * ZOOM_FACTOR / (float) imageW;
+ float xSize = Math.min((paneWidth - overlay.getBoxPadding() * 2f) / imageWidth * scaleF, 1);
+ float xMax = xMin + xSize;
+ int barX = (int) (xMin * imageW) + leftSide + overlay.getBoxPadding();
+ int barY = height - overlay.getBoxPadding() - 10;
+ int barWidth = (int) (xMax * imageW) + leftSide + overlay.getBoxPadding();
+ int barHeight = height - overlay.getBoxPadding() - 5;
+ if (!mouseDown)
+ selected = false;
+ if (mouseX >= barX && mouseX <= barWidth && mouseY >= barY && mouseY <= barHeight && mouseDown || selected) {
+ if (!selected)
+ mouseOffset = mouseX - barX;
+ xMin = (mouseX - leftSide - overlay.getBoxPadding() / 2f - mouseOffset) / imageWidth * scaleF;
+ xMin = Math.max(0, xMin);
+ xMin = Math.min(xMin, 1 - xSize);
+ selected = true;
+ }
super.mouseInput(width, height, mouseX, mouseY, mouseDown);
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/InfoPane.java b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/InfoPane.java
index 70d7d65b..03cb64f6 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/InfoPane.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/InfoPane.java
@@ -61,10 +61,10 @@ public abstract class InfoPane extends Gui {
return HTMLInfoPane.createFromWikiUrl(overlay, manager, name, infoText);
case "WIKI":
return CompletableFuture.completedFuture(
- HTMLInfoPane.createFromWikiText(overlay, manager, name, internalName, infoText));
+ HTMLInfoPane.createFromWikiText(overlay, manager, name, internalName, infoText, false));
case "HTML":
return CompletableFuture.completedFuture(
- new HTMLInfoPane(overlay, manager, name, internalName, infoText));
+ new HTMLInfoPane(overlay, manager, name, internalName, infoText, false));
default:
return CompletableFuture.completedFuture(
new TextInfoPane(overlay, manager, name, infoText));
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiPriceGraph.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiPriceGraph.java
index 3955b35f..63a08d41 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiPriceGraph.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiPriceGraph.java
@@ -117,12 +117,11 @@ public class GuiPriceGraph extends GuiScreen {
Utils.drawStringCentered("Loading...", Minecraft.getMinecraft().fontRendererObj,
guiLeft + 166, guiTop + 116, false, 0xffffff00
);
- else if (dataPoints == null || dataPoints.get() == null || dataPoints.get().size() <= 1)
+ else if (dataPoints == null || dataPoints.get() == null || dataPoints.get().size() <= 1 || lowestValue == null)
Utils.drawStringCentered("No data found.", Minecraft.getMinecraft().fontRendererObj,
guiLeft + 166, guiTop + 116, false, 0xffff0000
);
else {
-
int graphColor = SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.ahGraph.graphColor);
int graphColor2 = SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.ahGraph.graphColor2);
Integer lowestDist = null;
@@ -399,15 +398,17 @@ public class GuiPriceGraph extends GuiScreen {
if (!file.getName().endsWith(".gz")) continue;
if (file.lastModified() <
System.currentTimeMillis() - NotEnoughUpdates.INSTANCE.config.ahGraph.dataRetention * 86400000L)
+ //noinspection ResultOfMethodCallIgnored
file.delete();
}
Date date = new Date();
Long epochSecond = date.toInstant().getEpochSecond();
File file = new File(dir, "prices_" + format.format(date) + ".gz");
HashMap prices = new HashMap<>();
- if (file.exists())
- prices = load(file);
- if (prices == null) return;
+ if (file.exists()) {
+ HashMap tempPrices = load(file);
+ if (tempPrices != null) prices = tempPrices;
+ }
for (Map.Entry item : items.entrySet()) {
if (prices.containsKey(item.getKey())) {
if (bazaar && item.getValue().getAsJsonObject().has("curr_buy") && item.getValue().getAsJsonObject().has(
@@ -493,7 +494,10 @@ public class GuiPriceGraph extends GuiScreen {
))
) {
return GSON.fromJson(reader, type);
- } catch (Exception ignored) {
+ } catch (Exception e) {
+ System.out.println("Deleting " + file.getName() + " because it is probably corrupted.");
+ //noinspection ResultOfMethodCallIgnored
+ file.delete();
}
}
return null;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Misc.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Misc.java
index e872bfc0..dafbe202 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Misc.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Misc.java
@@ -1,13 +1,7 @@
package io.github.moulberry.notenoughupdates.options.seperateSections;
import com.google.gson.annotations.Expose;
-import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigAccordionId;
-import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorAccordion;
-import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorBoolean;
-import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorButton;
-import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorDropdown;
-import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorSlider;
-import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigOption;
+import io.github.moulberry.notenoughupdates.core.config.annotations.*;
public class Misc {
@Expose
@@ -147,4 +141,14 @@ public class Misc {
@ConfigEditorBoolean
public boolean disableNPCRetexturing = false;
+ @Expose
+ @ConfigOption(
+ name = "Wiki",
+ desc = "The wiki to use in the wiki renderer."
+ )
+ @ConfigEditorDropdown(values = {
+ "Hypixel",
+ "Fandom"
+ })
+ public int wiki = 0;
}
diff --git a/src/main/resources/assets/notenoughupdates/official-wiki.css b/src/main/resources/assets/notenoughupdates/official-wiki.css
new file mode 100644
index 00000000..a9f82a32
--- /dev/null
+++ b/src/main/resources/assets/notenoughupdates/official-wiki.css
@@ -0,0 +1 @@
+.client-js .mw-dismissable-notice { display: none}.mw-dismissable-notice-close { visibility: hidden}.sitedir-ltr .mw-dismissable-notice-close { float: right}.sitedir-rtl .mw-dismissable-notice-close { float: left}.sitedir-ltr .mw-dismissable-notice-body { margin: .5em 20% .5em 5em}.sitedir-rtl .mw-dismissable-notice-body { margin: .5em 5em .5em 20%}.hlist dl,.hlist ol,.hlist ul { margin: 0; padding: 0}.hlist dl dl,.hlist ol dl,.hlist ul dl,.hlist dl ol,.hlist ol ol,.hlist ul ol,.hlist dl ul,.hlist ol ul,.hlist ul ul { display: inline}.hlist dd,.hlist dt,.hlist li { margin: 0; display: inline}ul.hlist li,.hlist>ul li,.hlist>dl li { display: inline-block; margin-right: 8px}.hlist-separated li:after { content: '•'!important; padding-left: 8px; font-size: 1em; line-height: 1}.hlist-separated :last-child:after { content: none!important}.mw-ui-button { background-color: #f8f9fa; color: #202122; display: inline-block; -moz-box-sizing: border-box; box-sizing: border-box; border: 1px solid #a2a9b1; border-radius: 2px; cursor: pointer; vertical-align: middle; font-family: inherit; font-size: 1em; font-weight: 700; line-height: 1.28571429em; text-align: center; -webkit-appearance: none}.mw-ui-button:not(.mw-ui-icon-element) { min-height: 32px; min-width: 4em; max-width: 28.75em; margin: 0; padding: 5px 12px}.mw-ui-button:not(:disabled) { -webkit-transition: background-color 100ms,color 100ms,border-color 100ms,box-shadow 100ms; transition: background-color 100ms,color 100ms,border-color 100ms,box-shadow 100ms}.mw-ui-button:not(:disabled):visited { color: #202122}.mw-ui-button:not(:disabled):hover { background-color: #fff; color: #404244; border-color: #a2a9b1}.mw-ui-button:not(:disabled):focus { color: #202122; border-color: #36c; box-shadow: inset 0 0 0 1px #36c,inset 0 0 0 2px #fff; outline-width: 0}.mw-ui-button:not(:disabled):focus::-moz-focus-inner { border-color: transparent; padding: 0}.mw-ui-button:not(:disabled):active,.mw-ui-button:not(:disabled).is-on { background-color: #c8ccd1; color: #000; border-color: #72777d; box-shadow: none}.mw-ui-button:disabled { background-color: #c8ccd1; color: #fff; border-color: #c8ccd1; cursor: default}.mw-ui-button.mw-ui-icon-element:not(.mw-ui-icon-with-label-desktop) { color: transparent!important}.mw-ui-button.mw-ui-icon-element:not(.mw-ui-icon-with-label-desktop) span { display: block; position: absolute!important; clip: rect(1px,1px,1px,1px); width: 1px; height: 1px; margin: -1px; border: 0; padding: 0; overflow: hidden}@media all and (max-width: 1000px) { .mw-ui-button.mw-ui-icon-element.mw-ui-icon-with-label-desktop { color:transparent!important } .mw-ui-button.mw-ui-icon-element span { display: block; position: absolute!important; clip: rect(1px,1px,1px,1px); width: 1px; height: 1px; margin: -1px; border: 0; padding: 0; overflow: hidden }}.mw-ui-button.mw-ui-quiet,.mw-ui-button.mw-ui-quiet.mw-ui-progressive,.mw-ui-button.mw-ui-quiet.mw-ui-destructive { background-color: transparent; color: #202122; border-color: transparent; font-weight: 700}.mw-ui-button.mw-ui-quiet:not(.mw-ui-icon-element),.mw-ui-button.mw-ui-quiet.mw-ui-progressive:not(.mw-ui-icon-element),.mw-ui-button.mw-ui-quiet.mw-ui-destructive:not(.mw-ui-icon-element) { min-height: 32px}input[type=checkbox]:hover+.mw-ui-button.mw-ui-quiet,input[type=checkbox]:hover+.mw-ui-button.mw-ui-quiet.mw-ui-progressive,input[type=checkbox]:hover+.mw-ui-button.mw-ui-quiet.mw-ui-destructive,.mw-ui-button.mw-ui-quiet:hover,.mw-ui-button.mw-ui-quiet.mw-ui-progressive:hover,.mw-ui-button.mw-ui-quiet.mw-ui-destructive:hover { background-color: rgba(0,24,73,.02745098); color: #202122; border-color: transparent}input[type=checkbox]:focus+.mw-ui-button.mw-ui-quiet,input[type=checkbox]:focus+.mw-ui-button.mw-ui-quiet.mw-ui-progressive,input[type=checkbox]:focus+.mw-ui-button.mw-ui-quiet.mw-ui-destructive,.mw-ui-button.mw-ui-quiet:focus,.mw-ui-button.mw-ui-quiet.mw-ui-progressive:focus,.mw-ui-button.mw-ui-quiet.mw-ui-destructive:focus { color: #202122; border-color: #36c; box-shadow: inset 0 0 0 1px #36c,inset 0 0 0 2px #fff}input[type=checkbox]:active+.mw-ui-button.mw-ui-quiet,input[type=checkbox]:active+.mw-ui-button.mw-ui-quiet.mw-ui-progressive,input[type=checkbox]:active+.mw-ui-button.mw-ui-quiet.mw-ui-destructive,.mw-ui-button.mw-ui-quiet:active,.mw-ui-button.mw-ui-quiet.mw-ui-progressive:active,.mw-ui-button.mw-ui-quiet.mw-ui-destructive:active { background-color: rgba(0,36,73,.08235294); color: #000; border-color: #72777d; box-shadow: none}.mw-ui-button.mw-ui-quiet:disabled,.mw-ui-button.mw-ui-quiet.mw-ui-progressive:disabled,.mw-ui-button.mw-ui-quiet.mw-ui-destructive:disabled,.mw-ui-button.mw-ui-quiet:disabled:hover,.mw-ui-button.mw-ui-quiet.mw-ui-progressive:disabled:hover,.mw-ui-button.mw-ui-quiet.mw-ui-destructive:disabled:hover,.mw-ui-button.mw-ui-quiet:disabled:active,.mw-ui-button.mw-ui-quiet.mw-ui-progressive:disabled:active,.mw-ui-button.mw-ui-quiet.mw-ui-destructive:disabled:active { background-color: transparent; color: #72777d; border-color: transparent}.mw-ui-button.mw-ui-progressive:not(:disabled) { background-color: #36c; color: #fff; border-color: #36c}.mw-ui-button.mw-ui-progressive:not(:disabled):hover { background-color: #447ff5; border-color: #447ff5}.mw-ui-button.mw-ui-progressive:not(:disabled):focus { box-shadow: inset 0 0 0 1px #36c,inset 0 0 0 2px #fff}.mw-ui-button.mw-ui-progressive:not(:disabled):active,.mw-ui-button.mw-ui-progressive:not(:disabled).is-on { background-color: #2a4b8d; border-color: #2a4b8d; box-shadow: none}.mw-ui-button.mw-ui-progressive:disabled { background-color: #c8ccd1; color: #fff; border-color: #c8ccd1}.mw-ui-button.mw-ui-progressive.mw-ui-quiet { color: #36c; background-color: transparent; border-color: transparent}input[type=checkbox]:hover+.mw-ui-button.mw-ui-progressive.mw-ui-quiet,.mw-ui-button.mw-ui-progressive.mw-ui-quiet:hover { background-color: rgba(52,123,255,.2); border-color: transparent; color: #447ff5}input[type=checkbox]:focus+.mw-ui-button.mw-ui-progressive.mw-ui-quiet,.mw-ui-button.mw-ui-progressive.mw-ui-quiet:focus { color: #36c; border-color: #36c}input[type=checkbox]:active+.mw-ui-button.mw-ui-progressive.mw-ui-quiet,.mw-ui-button.mw-ui-progressive.mw-ui-quiet:active { color: #fff; background-color: #2a4b8d; border-color: #2a4b8d}.mw-ui-button.mw-ui-destructive:not(:disabled) { background-color: #d33; color: #fff; border-color: #d33}.mw-ui-button.mw-ui-destructive:not(:disabled):hover { background-color: #ff4242; border-color: #ff4242}.mw-ui-button.mw-ui-destructive:not(:disabled):focus { box-shadow: inset 0 0 0 1px #d33,inset 0 0 0 2px #fff}.mw-ui-button.mw-ui-destructive:not(:disabled):active,.mw-ui-button.mw-ui-destructive:not(:disabled).is-on { background-color: #b32424; border-color: #b32424; box-shadow: none}.mw-ui-button.mw-ui-destructive:disabled { background-color: #c8ccd1; color: #fff; border-color: #c8ccd1}.mw-ui-button.mw-ui-destructive.mw-ui-quiet { color: #d33; background-color: transparent; border-color: transparent}input[type=checkbox]:hover+.mw-ui-button.mw-ui-destructive.mw-ui-quiet,.mw-ui-button.mw-ui-destructive.mw-ui-quiet:hover { background-color: rgba(209,29,19,.2); border-color: transparent; color: #ff4242}input[type=checkbox]:focus+.mw-ui-button.mw-ui-destructive.mw-ui-quiet,.mw-ui-button.mw-ui-destructive.mw-ui-quiet:focus { color: #d33; border-color: #d33}input[type=checkbox]:active+.mw-ui-button.mw-ui-destructive.mw-ui-quiet,.mw-ui-button.mw-ui-destructive.mw-ui-quiet:active { color: #fff; background-color: #b32424; border-color: #b32424}.mw-ui-button.mw-ui-big { font-size: 1.3em}.mw-ui-button.mw-ui-block { display: block; width: 100%; margin-left: auto; margin-right: auto}a.mw-ui-button { text-decoration: none}a.mw-ui-button:hover,a.mw-ui-button:focus { text-decoration: none}.mw-ui-button-group>* { min-width: 48px; border-radius: 0; float: left}.mw-ui-button-group>*:first-child { border-top-left-radius: 2px; border-bottom-left-radius: 2px}.mw-ui-button-group>*:not(:first-child) { border-left: 0}.mw-ui-button-group>*:last-child { border-top-right-radius: 2px; border-bottom-right-radius: 2px}.mw-ui-button-group .is-on .button { cursor: default}.mw-ui-icon { font-size: initial; position: relative; display: inline-block; box-sizing: content-box!important; width: 1.25em; height: 1.25em; min-width: 1.25em; min-height: 1.25em; flex-basis: 1.25em; vertical-align: middle; line-height: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; -moz-appearance: none; -webkit-appearance: none; background-color: transparent; border: 0; margin: 0; padding: 0}.mw-ui-icon:before { content: ''; display: block; width: 100%; height: 100%; min-width: 1.25em; min-height: 1.25em; background-repeat: no-repeat; background-size: 1.25em 1.25em; background-position: center}.mw-ui-icon-flush-top { margin-top: -.75em}.mw-ui-icon-flush-left { margin-left: -.75em}.mw-ui-icon-flush-right { margin-right: -.75em}.mw-ui-icon-element { border-radius: 2px; padding: .75em; -webkit-transition: background-color 100ms; transition: background-color 100ms; color: transparent}.mw-ui-icon-element:focus,.mw-ui-icon-element:active,.mw-ui-icon-element:visited { color: transparent}.mw-ui-icon-element:active { background-color: rgba(0,0,0,.03)}@media(hover: hover) { .mw-ui-icon-element:not(.disabled):hover { background-color:rgba(0,0,0,.03) }}.mw-ui-icon-small { width: 1em; height: 1em; min-width: 1em; min-height: 1em; flex-basis: 1em; line-height: 1em}.mw-ui-icon-small:before { content: ''; display: block; width: 100%; height: 100%; min-width: 1em; min-height: 1em; background-repeat: no-repeat; background-size: 1em 1em; background-position: center}.mw-ui-icon-small.mw-ui-icon-element { padding: .5625em}.mw-ui-icon-small.mw-ui-icon-flush-left { margin-left: -.5625em}.mw-ui-icon-small.mw-ui-icon-flush-right { margin-right: -.5625em}.mw-ui-icon-small.mw-ui-icon-before:before { min-width: 1em; min-height: 1em; margin-right: .5625em}.mw-ui-icon-before { width: auto; max-width: 100%}.mw-ui-icon-before:before { display: inline-block; font-size: initial; width: auto; min-width: 1.25em; min-height: 1.25em; margin-right: 8px; vertical-align: middle}.mw-ui-icon-before span { vertical-align: middle}@media all and (min-width: 1000px) { .mw-ui-icon-with-label-desktop { color:#54595d; width: auto; line-height: inherit; flex-basis: auto } .mw-ui-icon-with-label-desktop:hover,.mw-ui-icon-with-label-desktop:focus,.mw-ui-icon-with-label-desktop:active,.mw-ui-icon-with-label-desktop:visited { color: #54595d; text-decoration: none } .mw-ui-icon-with-label-desktop:before { width: auto; display: inline-block; margin-right: 8px; vertical-align: text-bottom }}.minerva__tab-container { white-space: nowrap; overflow-x: auto}.minerva__tab-container .minerva__tab { font-size: .85em; margin: 0 10px 0 0; color: #54595d; font-weight: 700; padding-bottom: 6px; display: inline-block}.minerva__tab-container .minerva__tab:visited,.minerva__tab-container .minerva__tab:hover,.minerva__tab-container .minerva__tab:active,.minerva__tab-container .minerva__tab.new,.minerva__tab-container .minerva__tab.new:visited,.minerva__tab-container .minerva__tab.new:active,.minerva__tab-container .minerva__tab.new:hover { color: #54595d; text-decoration: none}.minerva__tab-container .minerva__tab:last-child { margin-right: 0}.minerva__tab-container .minerva__tab.selected { border-bottom: 2px solid #54595d}.toggle-list__list--drop-down { -webkit-transform: translateY(-8px); -ms-transform: translateY(-8px); transform: translateY(-8px); -webkit-tap-highlight-color: transparent}.minerva-animations-ready .toggle-list__list--drop-down { -webkit-transition: opacity 100ms ease-in-out,-webkit-tap-highlight-color 0s ease-in-out,transform 100ms ease-in-out,visibility 100ms ease-in-out; transition: opacity 100ms ease-in-out,-webkit-tap-highlight-color 0s ease-in-out,transform 100ms ease-in-out,visibility 100ms ease-in-out}.toggle-list__checkbox:checked~.toggle-list__list--drop-down { -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0)}.toggle-list-item { display: block; padding: .75em .875em}.toggle-list-item:hover { background: #eaecf0}.toggle-list-item__anchor { display: block; line-height: 1}.toggle-list-item__anchor:hover { text-decoration: none}.toggle-list-item__anchor:visited,.toggle-list-item__anchor:active { color: #54595d}.toggle-list-item__icon { vertical-align: middle}.toggle-list-item__label { text-align: left; color: #54595d; font-weight: 700; white-space: nowrap; vertical-align: middle; font-size: .875em}.minerva-user-menu-list { top: 100%; right: -.75em; min-width: 200px; border-radius: 2px}.minerva--history-page-action-enabled .page-actions-menu__list-item { flex-basis: auto}.minerva--history-page-action-enabled .page-actions-menu__list-item:first-child { flex-grow: 0}.page-actions-overflow-list { top: 100%; right: -.75em; border-radius: 2px}.mw-ui-icon-minerva-ellipsis:before { -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg)}@media screen { @counter-style meetei { system: numeric; symbols: '\ABF0''\ABF1''\ABF2''\ABF3''\ABF4''\ABF5''\ABF6''\ABF7''\ABF8''\ABF9'; suffix: ') ' } @counter-style santali { system: numeric; symbols: '\1C50''\1C51''\1C52''\1C53''\1C54''\1C55''\1C56''\1C57''\1C58''\1C59' } ol:lang(azb) li,ol:lang(bcc) li,ol:lang(bgn) li,ol:lang(bqi) li,ol:lang(fa) li,ol:lang(glk) li,ol:lang(kk-arab) li,ol:lang(lrc) li,ol:lang(luz) li,ol:lang(mzn) li { list-style-type: persian } ol:lang(ckb) li,ol:lang(sdh) li { list-style-type: arabic-indic } ol:lang(hi) li,ol:lang(mai) li,ol:lang(mr) li,ol:lang(ne) li { list-style-type: devanagari } ol:lang(as) li,ol:lang(bn) li { list-style-type: bengali } ol:lang(mni) li { list-style-type: meetei } ol:lang(or) li { list-style-type: oriya } ol:lang(sat) li { list-style-type: santali }}div,span,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,ins,em,img,small,strike,strong,sub,sup,tt,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,input,button,select,audio,video { margin: 0; padding: 0; border: 0; font: inherit; font-size: 100%; vertical-align: baseline; background: 0 0}table,caption,tbody,tfoot,thead,tr,th,td { font-size: 100%}caption { font-weight: 700}button { border: 0; background-color: transparent; cursor: pointer}input { line-height: normal}ul { list-style: none}table { border-collapse: collapse}html,body { height: 100%}html { font-size: 100%; -webkit-text-size-adjust: none}body { background-color: transparent; color: #202122; margin: 0}main { display: block}.mw-body { border-top: 1px solid transparent; padding-bottom: 32px}.overlay-enabled,.mw-body { background-color: transparent}.header-container { border-bottom: 1px solid #c8ccd1; padding: 0 16px}.header-container.header-chrome { background-color: #eaecf0; border: 0; box-shadow: inset 0 -1px 3px rgba(0,0,0,.08)}.navigation-drawer--loading,#footer-info-lastmod { display: none}.header { display: table; width: 100%; border-spacing: 0; border-collapse: collapse; height: 3.375em; white-space: nowrap; border-top: 1px solid #c8ccd1; margin-top: -1px}.header>div,.header>.navigation-drawer { position: relative; vertical-align: middle; display: table-cell}.header>div a { display: block}.header .branding-box { width: auto; opacity: .66}.header .branding-box h1,.header .branding-box a { margin-left: 5px; font-size: 1em; text-decoration: none; color: #202122}.header .branding-box h1 span,.header .branding-box a span { line-height: 1; font-size: inherit}.header .branding-box h1 img,.header .branding-box a img { vertical-align: middle}.header .branding-box h1>*,.header .branding-box a>* { float: left}.header .branding-box h1 sup,.header .branding-box a sup { color: #54595d; display: none}.beta .header .branding-box h1 sup,.beta .header .branding-box a sup { display: initial}.header>.header-title { vertical-align: middle}#searchInput { cursor: text}.search-box,.header .search-box { display: none; width: auto}.search-box .search { background-color: #fff; background-position: left .5em center; background-repeat: no-repeat; background-size: 1.125em; -webkit-appearance: none; width: 100%; margin-top: 0; height: 2.25em; border: 1px solid #fff; border-radius: 2px; padding: 7px 0 7px 2.0625em; box-shadow: 0 1px 1px rgba(0,0,0,.05); outline: 0; -webkit-transition: border-color 250ms,box-shadow 250ms; transition: border-color 250ms,box-shadow 250ms}.client-nojs .search-box .search:focus,.search-overlay .search-box .search:focus { border-color: #36c; box-shadow: inset 0 0 0 1px #36c,0 1px 1px rgba(0,0,0,.05)}input.search::-webkit-search-decoration,input.search::-webkit-search-cancel-button,input.search::-webkit-search-results-button,input.search::-webkit-search-results-decoration { display: none}.content h2 { clear: left}.content .collapsible-heading .edit-page { visibility: hidden}.content .collapsible-heading.open-block .edit-page { visibility: visible}.content .mw-parser-output>h2,.content .section-heading { border-bottom: 1px solid #eaecf0; margin-bottom: .5em}.content .mw-parser-output>h1,.content .mw-parser-output>h2,.content .mw-parser-output>h3,.content .mw-parser-output>h4,.content .mw-parser-output>h5,.content .section-heading,.content .in-block { display: table}.content .mw-parser-output>h1 .mw-headline,.content .mw-parser-output>h2 .mw-headline,.content .mw-parser-output>h3 .mw-headline,.content .mw-parser-output>h4 .mw-headline,.content .mw-parser-output>h5 .mw-headline,.content .section-heading .mw-headline,.content .in-block .mw-headline { width: 100%}.content .mw-parser-output>h1>span,.content .mw-parser-output>h2>span,.content .mw-parser-output>h3>span,.content .mw-parser-output>h4>span,.content .mw-parser-output>h5>span,.content .section-heading>span,.content .in-block>span { display: table-cell; vertical-align: middle}.content .mw-parser-output>h1>.mw-editsection>.mw-ui-icon-element,.content .mw-parser-output>h2>.mw-editsection>.mw-ui-icon-element,.content .mw-parser-output>h3>.mw-editsection>.mw-ui-icon-element,.content .mw-parser-output>h4>.mw-editsection>.mw-ui-icon-element,.content .mw-parser-output>h5>.mw-editsection>.mw-ui-icon-element,.content .section-heading>.mw-editsection>.mw-ui-icon-element,.content .in-block>.mw-editsection>.mw-ui-icon-element { margin-top: -.75em; margin-bottom: -.75em}.client-nojs .section-heading .indicator { display: none}#page-secondary-actions { clear: both}#page-secondary-actions a { margin: 10px 2px 2px 0}#bodyContent .panel .content,.overlay .content-header,.overlay .panel,.page-list.side-list .list-thumb,.page-list li,.topic-title-list li,.site-link-list li,.drawer,.messagebox,.errorbox,.successbox,.warningbox,.list-header,.mw-revision { padding-left: 16px; padding-right: 16px}.talk-overlay .comment .comment-content,.image-list,.pre-content,#mw-content-text>form>.oo-ui-fieldLayout>.oo-ui-fieldLayout-body,#mw-content-text>form>.oo-ui-widget,.content,.post-content { margin: 0 16px}.minerva__subtitle { margin-top: 10px; margin-bottom: 10px}.minerva__subtitle:empty { margin: 0}@media all and (min-width: 720px) { .page-summary-list,.topic-title-list,.site-link-list,.overlay .panel,.list-header { padding-left:3.35em; padding-right: 3.35em }}.heading-holder { padding: 20px 0 0; position: relative}.heading-holder .tagline { color: #54595d; font-size: .85em}.page-heading { margin-bottom: 12px}.mw-ui-icon-element.disabled,.language-selector.disabled { cursor: default; opacity: .25}#page-actions { position: relative}.page-actions-menu { -moz-box-sizing: border-box; box-sizing: border-box; border-top: 1px solid #eaecf0; border-bottom: 1px solid #c8ccd1; margin-top: -1px}.page-actions-menu__list { display: flex; height: 3em; justify-content: space-between}.page-actions-menu__list-item { display: flex; justify-content: flex-end; align-items: center; min-width: 0; overflow: hidden}.page-actions-menu__list-item>a { font-weight: 500}.page-actions-menu__list-item li>*:hover { box-shadow: none}.page-actions-menu__list-item:first-child { flex-grow: 1; justify-content: flex-start; margin-left: -8px}.page-actions-menu__list-item:last-child { margin-right: -8px}.client-nojs .watch-this-article { visibility: hidden}.client-nojs .is-authenticated .watch-this-article { visibility: visible}@media all and (max-width: 320px - 1) { .client-nojs #page-actions { display:none } .client-nojs #section_0 { border: 0 }}.minerva-user-navigation { display: flex; min-width: 7em; min-height: 3.375em; height: 100%; width: 100%; align-items: center; justify-content: flex-end; position: relative}.minerva-user-navigation>*:last-child { margin-right: -.75em}.view-border-box *,.view-border-box { -moz-box-sizing: border-box; box-sizing: border-box}.client-js .mw-redirectedfrom,.printfooter,.jsonly { display: none}.client-js .jsonly { display: inherit}.hidden { display: none!important}#mw-mf-viewport { position: relative; height: 100%}#mw-mf-page-center { width: 100%; min-height: 100%; position: relative; background-color: #eaecf0}.content { position: relative; z-index: 0}.minerva-footer { border-top: solid 1px #c8ccd1; overflow: auto; padding-bottom: 6px}.client-nojs footer .indicator,.client-nojs .mw-footer .indicator { display: none}footer .hlist li:after,.mw-footer .hlist li:after { color: #36c}footer>.post-content,.mw-footer>.post-content { overflow: auto; margin-top: 42px}footer>.post-content>*,.mw-footer>.post-content>* { margin-bottom: 9px}footer>.post-content>h2,.mw-footer>.post-content>h2 { border-bottom: solid 1px #c8ccd1; padding-bottom: 10px; margin-top: 42px; font-size: 1em; font-weight: 700}footer>.post-content>h2:first-child,.mw-footer>.post-content>h2:first-child { margin-top: 0}footer>.post-content .hlist,.mw-footer>.post-content .hlist,footer>.post-content .license,.mw-footer>.post-content .license { font-size: .875em}.last-modified-bar { border-bottom: solid 1px #c8ccd1; background-color: #eaecf0; color: #72777d; padding-top: .75em; padding-bottom: .75em; font-size: .875em; -webkit-transition: background-color 250ms,color 250ms; transition: background-color 250ms,color 250ms}.last-modified-bar a,.last-modified-bar a:visited { color: #54595d}.last-modified-bar a:nth-child(1),.last-modified-bar a:visited:nth-child(1) { font-weight: 700}.last-modified-bar a.external { background-image: none; padding-right: 0}.last-modified-bar__content { align-items: center; display: -ms-flexbox; display: flex}.last-modified-bar__text { padding-right: 3.5em; padding-left: .75em; line-height: 1.65; vertical-align: middle; flex-grow: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap}@media(max-width: 720px) { .last-modified-bar__text { padding-right:1em }}@media print { .noprint,.banner-container,.header,.minerva__tab-container,.page-actions-menu,.post-content { display: none } h1,h2,h3,h4,h5,h6 { page-break-after: avoid } table,figure,img { page-break-inside: avoid } img { max-width: 100% } img.image-lazy-loaded { -webkit-animation: none!important; animation: none!important }}@media print and (max-device-width: 720px) { @page { margin:50px 0 } html { padding: 0 50px } .header-container,.header-container.header-chrome { background: #fff; box-shadow: none!important } .header { border-top: 0; display: block; height: auto; padding: 0 16px } .header .branding-box { padding-left: 0!important } .header .branding-box sup { display: none!important } .header>nav,.header>div { display: none!important } .header>.branding-box { height: auto; display: block!important; padding: 0 0 51px 50px } .header>.branding-box h1 { font-size: inherit } .header>.branding-box h1>* { float: none } .header>.branding-box h1 img { height: 41px; width: auto; vertical-align: inherit } .hatnote,.pre-content #page-actions { display: none } .pre-content { display: block; padding: 51px 0 35px } .pre-content h1 { font-size: 70px; font-weight: 400; font-style: italic; font-stretch: normal; line-height: normal; letter-spacing: normal; text-align: left; color: #000 } .pre-content .tagline { font-size: 36px } .mw-body>.content { padding-top: 55px; position: relative } .mw-body>.content:before { top: 0 } .thumbinner { width: auto!important } .thumbinner>a { width: 100% } .thumb { position: relative; padding: 58px 0!important; text-align: left; margin: 0!important } .thumb:after { bottom: 30px } .thumb:after,.mw-body>.content:before { position: absolute; left: 0; content: ''; display: block; width: 55px; height: 2px; background: #999 } .thumbcaption { margin-top: 23px!important; width: 100%; font-style: italic; font-size: 28px } [class|=mw-content] { font-size: 36px } [class|=mw-content] a { text-decoration: underline; color: #202122 } [class|=mw-content] blockquote { color: #54595d; padding: 5px 39px; font-style: italic } [class|=mw-content] .section-heading { border-bottom: 0; padding-bottom: 0; margin-bottom: 16px } [class|=mw-content] h2 { font-size: 48px } [class|=mw-content] h3 { font-size: 40px; margin-bottom: 13px } [class|=mw-content] h4,[class|=mw-content] h5,[class|=mw-content] h6 { font-size: 36px; margin-bottom: 12px } [class|=mw-content] .wikitable { font-size: 16px } [class|=mw-content] .infobox { font-size: 30px } .references .mw-cite-backlink { display: none } .references .reference-text { font-style: italic } .references a { text-decoration: none } .references .external.text { background-image: none } .printfooter { display: block; padding-top: 108px; font-size: 30px } #mw-mf-page-center>footer { border-top: solid 4px #000; padding-top: 23px; background: #fff!important } #mw-mf-page-center>footer .mw-ui-icon:before { display: none!important } #mw-mf-page-center>footer .last-modified-bar { background: 0 0!important; border: 0!important } #mw-mf-page-center>footer .last-modifier-tagline { font-size: 36px; padding-top: 0!important; padding-bottom: 16px!important } #mw-mf-page-center>footer .last-modified-bar,#mw-mf-page-center>footer .last-modified-bar a { font-weight: 700!important; color: #000!important } #mw-mf-page-center>footer .post-content { margin-top: 15px!important; display: block } #mw-mf-page-center>footer .post-content .hlist,#mw-mf-page-center>footer .post-content h2 { display: none } #mw-mf-page-center>footer .post-content .license a,#mw-mf-page-center>footer .post-content .license { font-size: 30px; color: #999; font-weight: 400 }}@font-face { font-family: raleway; font-style: normal; font-weight: 400; font-display: swap; src: url(https://fonts.gstatic.com/s/raleway/v22/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCFPrEHJA.woff2) format('woff2'); unicode-range: U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face { font-family: raleway; font-style: normal; font-weight: 400; font-display: swap; src: url(https://fonts.gstatic.com/s/raleway/v22/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCMPrEHJA.woff2) format('woff2'); unicode-range: U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face { font-family: raleway; font-style: normal; font-weight: 400; font-display: swap; src: url(https://fonts.gstatic.com/s/raleway/v22/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCHPrEHJA.woff2) format('woff2'); unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face { font-family: raleway; font-style: normal; font-weight: 400; font-display: swap; src: url(https://fonts.gstatic.com/s/raleway/v22/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCGPrEHJA.woff2) format('woff2'); unicode-range: U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face { font-family: raleway; font-style: normal; font-weight: 400; font-display: swap; src: url(https://fonts.gstatic.com/s/raleway/v22/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCIPrE.woff2) format('woff2'); unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face { font-family: neuton; font-style: italic; font-weight: 400; font-display: swap; src: url(https://fonts.gstatic.com/s/neuton/v16/UMBRrPtMoH62xUZCyrg2Wi_FBw.woff2) format('woff2'); unicode-range: U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face { font-family: neuton; font-style: italic; font-weight: 400; font-display: swap; src: url(https://fonts.gstatic.com/s/neuton/v16/UMBRrPtMoH62xUZCyrg4Wi8.woff2) format('woff2'); unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face { font-family: neuton; font-style: normal; font-weight: 200; font-display: swap; src: url(https://fonts.gstatic.com/s/neuton/v16/UMBQrPtMoH62xUZKAKkvcwr4Pro.woff2) format('woff2'); unicode-range: U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face { font-family: neuton; font-style: normal; font-weight: 200; font-display: swap; src: url(https://fonts.gstatic.com/s/neuton/v16/UMBQrPtMoH62xUZKAKkvfQr4.woff2) format('woff2'); unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face { font-family: neuton; font-style: normal; font-weight: 300; font-display: swap; src: url(https://fonts.gstatic.com/s/neuton/v16/UMBQrPtMoH62xUZKZKovcwr4Pro.woff2) format('woff2'); unicode-range: U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face { font-family: neuton; font-style: normal; font-weight: 300; font-display: swap; src: url(https://fonts.gstatic.com/s/neuton/v16/UMBQrPtMoH62xUZKZKovfQr4.woff2) format('woff2'); unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face { font-family: neuton; font-style: normal; font-weight: 400; font-display: swap; src: url(https://fonts.gstatic.com/s/neuton/v16/UMBTrPtMoH62xUZCwYg6Qis.woff2) format('woff2'); unicode-range: U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face { font-family: neuton; font-style: normal; font-weight: 400; font-display: swap; src: url(https://fonts.gstatic.com/s/neuton/v16/UMBTrPtMoH62xUZCz4g6.woff2) format('woff2'); unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face { font-family: neuton; font-style: normal; font-weight: 700; font-display: swap; src: url(https://fonts.gstatic.com/s/neuton/v16/UMBQrPtMoH62xUZKdK0vcwr4Pro.woff2) format('woff2'); unicode-range: U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face { font-family: neuton; font-style: normal; font-weight: 700; font-display: swap; src: url(https://fonts.gstatic.com/s/neuton/v16/UMBQrPtMoH62xUZKdK0vfQr4.woff2) format('woff2'); unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face { font-family: neuton; font-style: normal; font-weight: 800; font-display: swap; src: url(https://fonts.gstatic.com/s/neuton/v16/UMBQrPtMoH62xUZKaK4vcwr4Pro.woff2) format('woff2'); unicode-range: U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face { font-family: neuton; font-style: normal; font-weight: 800; font-display: swap; src: url(https://fonts.gstatic.com/s/neuton/v16/UMBQrPtMoH62xUZKaK4vfQr4.woff2) format('woff2'); unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@media screen and (min-width: 1000px) { .header { max-width:1250px!important }}.banner-container,.header,.page-header-bar,.overlay-header,.content,.overlay-content,.content-unstyled,.pre-content,.post-content,.last-modified-bar,#mw-content-text>form { max-width: 1250px!important}.page-Main_Page .page-heading,.page-Main_Page .pre-content { display: none!important}.page-Main_Page pre { display: none}.page-Main_Page .blocks-list { display: flex; flex-wrap: wrap; justify-content: space-evenly; list-style: none; column-gap: 20px; row-gap: 20px; padding: 0; margin: 0}.page-Main_Page .blocks-item { box-sizing: border-box; color: #ffc376; display: flex; flex: 1 0 180px; text-align: center; margin: 0!important; border: 1px solid #ecebeb; border-radius: 8px; box-shadow: 0 2px 15px rgba(175,175,175,.2); flex-flow: wrap; position: relative}.page-Main_Page .blocks-item:hover { box-shadow: 0 2px 15px rgba(231,135,27,.4)!important; cursor: pointer; top: -2px}.page-Main_Page .blocks-item>a { color: #ffc376; padding: 0 10px 15px; display: flex; flex-direction: column; flex: 1; justify-content: center; border-radius: inherit; text-decoration: none; background-color: transparent}.page-Main_Page .block-icon { background-position: top center; background-repeat: no-repeat; background-size: contain; height: 140px; margin: 0; transition: all .1s ease-in-out}.page-Main_Page .blocks-item-title { margin: 0; font-size: 22px; color: #ffc376}.page-Main_Page .blocks-item-description:not(:empty) { margin-top: 10px}.page-Main_Page .blocks-item-description { font-weight: 300; margin: 0; color: #1a1a1a}.page-Main_Page .block-icon:before { content: ""; display: block; position: relative}.page-Main_Page .blocks-item#block-accessories>a>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/accessories.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/accessories.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/accessories.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/accessories.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/accessories.png) 2x)}.page-Main_Page .blocks-item#block-accessories>a>.block-icon:before,.page-Main_Page .blocks-item#block-accessories:hover>a>.block-icon,.page-Main_Page .blocks-item#block-accessories>a:focus>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/accessories.ro.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/accessories.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/accessories.ro.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/accessories.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/accessories.ro.png) 2x)}.page-Main_Page .blocks-item#block-armor>a>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/armor.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/armor.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/armor.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/armor.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/armor.png) 2x)}.page-Main_Page .blocks-item#block-armor>a>.block-icon:before,.page-Main_Page .blocks-item#block-armor:hover>a>.block-icon,.page-Main_Page .blocks-item#block-armor>a:focus>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/armor.ro.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/armor.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/armor.ro.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/armor.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/armor.ro.png) 2x)}.page-Main_Page .blocks-item#block-collections>a>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/collections.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/collections.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/collections.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/collections.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/collections.png) 2x)}.page-Main_Page .blocks-item#block-collections>a>.block-icon:before,.page-Main_Page .blocks-item#block-collections:hover>a>.block-icon,.page-Main_Page .blocks-item#block-collections>a:focus>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/collections.ro.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/collections.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/collections.ro.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/collections.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/collections.ro.png) 2x)}.page-Main_Page .blocks-item#block-hub>a>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/hub.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/hub.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/hub.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/hub.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/hub.png) 2x)}.page-Main_Page .blocks-item#block-hub>a>.block-icon:before,.page-Main_Page .blocks-item#block-hub:hover>a>.block-icon,.page-Main_Page .blocks-item#block-hub>a:focus>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/hub.ro.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/hub.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/hub.ro.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/hub.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/hub.ro.png) 2x)}.page-Main_Page .blocks-item#block-fairysouls>a>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/fairysouls.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/fairysouls.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/fairysouls.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/fairysouls.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/fairysouls.png) 2x)}.page-Main_Page .blocks-item#block-fairysouls>a>.block-icon:before,.page-Main_Page .blocks-item#block-fairysouls:hover>a>.block-icon,.page-Main_Page .blocks-item#block-fairysouls>a:focus>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/fairysouls.ro.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/fairysouls.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/fairysouls.ro.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/fairysouls.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/fairysouls.ro.png) 2x)}.page-Main_Page .blocks-item#block-island>a>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/island.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/island.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/island.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/island.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/island.png) 2x)}.page-Main_Page .blocks-item#block-island>a>.block-icon:before,.page-Main_Page .blocks-item#block-island:hover>a>.block-icon,.page-Main_Page .blocks-item#block-island>a:focus>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/island.ro.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/island.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/island.ro.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/island.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/island.ro.png) 2x)}.page-Main_Page .blocks-item#block-locations>a>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/locations.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/locations.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/locations.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/locations.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/locations.png) 2x)}.page-Main_Page .blocks-item#block-locations>a>.block-icon:before,.page-Main_Page .blocks-item#block-locations:hover>a>.block-icon,.page-Main_Page .blocks-item#block-locations>a:focus>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/locations.ro.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/locations.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/locations.ro.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/locations.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/locations.ro.png) 2x)}.page-Main_Page .blocks-item#block-minions>a>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/minions.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/minions.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/minions.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/minions.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/minions.png) 2x)}.page-Main_Page .blocks-item#block-minions>a>.block-icon:before,.page-Main_Page .blocks-item#block-minions:hover>a>.block-icon,.page-Main_Page .blocks-item#block-minions>a:focus>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/minions.ro.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/minions.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/minions.ro.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/minions.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/minions.ro.png) 2x)}.page-Main_Page .blocks-item#block-pets>a>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/pets.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/pets.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/pets.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/pets.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/pets.png) 2x)}.page-Main_Page .blocks-item#block-pets>a>.block-icon:before,.page-Main_Page .blocks-item#block-pets:hover>a>.block-icon,.page-Main_Page .blocks-item#block-pets>a:focus>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/pets.ro.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/pets.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/pets.ro.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/pets.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/pets.ro.png) 2x)}.page-Main_Page .blocks-item#block-reforging>a>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/reforging.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/reforging.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/reforging.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/reforging.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/reforging.png) 2x)}.page-Main_Page .blocks-item#block-reforging>a>.block-icon:before,.page-Main_Page .blocks-item#block-reforging:hover>a>.block-icon,.page-Main_Page .blocks-item#block-reforging>a:focus>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/reforging.ro.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/reforging.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/reforging.ro.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/reforging.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/reforging.ro.png) 2x)}.page-Main_Page .blocks-item#block-skills>a>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/skills.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/skills.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/skills.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/skills.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/skills.png) 2x)}.page-Main_Page .blocks-item#block-skills>a>.block-icon:before,.page-Main_Page .blocks-item#block-skills:hover>a>.block-icon,.page-Main_Page .blocks-item#block-skills>a:focus>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/skills.ro.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/skills.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/skills.ro.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/skills.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/skills.ro.png) 2x)}.page-Main_Page .blocks-item#block-stats>a>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/stats.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/stats.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/stats.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/stats.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/stats.png) 2x)}.page-Main_Page .blocks-item#block-stats>a>.block-icon:before,.page-Main_Page .blocks-item#block-stats:hover>a>.block-icon,.page-Main_Page .blocks-item#block-stats>a:focus>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/stats.ro.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/stats.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/stats.ro.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/stats.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/stats.ro.png) 2x)}.page-Main_Page .blocks-item#block-weapons>a>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/weapons.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/weapons.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/weapons.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/weapons.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/weapons.png) 2x)}.page-Main_Page .blocks-item#block-weapons>a>.block-icon:before,.page-Main_Page .blocks-item#block-weapons:hover>a>.block-icon,.page-Main_Page .blocks-item#block-weapons>a:focus>.block-icon { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/low-res/weapons.ro.png); background-image: image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/weapons.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/weapons.ro.png) 2x); background-image: -webkit-image-set(url(https://wiki.hypixel.net/images/hypixel/icons/low-res/weapons.ro.png) 1x,url(https://wiki.hypixel.net/images/hypixel/icons/hi-res/weapons.ro.png) 2x)}.page-Main_Page #wrapper { display: flex; flex-direction: row; column-gap: 50px; row-gap: 50px; justify-content: space-between}.page-Main_Page #wrapper #content { display: flex; flex-direction: column; row-gap: 50px}.page-Main_Page #wrapper #content #introduction { display: flex; flex-direction: row; column-gap: 25px; row-gap: 25px; align-content: center}.page-Main_Page #wrapper #content #introduction #welcome { margin: .5em 0}.page-Main_Page #wrapper #content #introduction .blocks-item { margin: 0!important}.page-Main_Page #wrapper #content #statistics .stats-list { display: flex; flex-wrap: wrap; list-style: none; justify-content: space-evenly; padding: 0; row-gap: 25px}.page-Main_Page #wrapper #content #statistics .stats-list .stats-item { margin: 0}.page-Main_Page #wrapper #content #statistics .stats-list .stats-item .stats-icon { background-position: center; background-size: contain; background-repeat: no-repeat; height: 55px; width: 55px; display: inline-block; position: relative; vertical-align: middle}.page-Main_Page #wrapper #content #statistics .stats-list .stats-item .stats-icon.stats-icon-edits { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/edits.png)}.page-Main_Page #wrapper #content #statistics .stats-list .stats-item .stats-icon.stats-icon-pages { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/pages.png)}.page-Main_Page #wrapper #content #statistics .stats-list .stats-item .stats-icon.stats-icon-files { background-image: url(https://wiki.hypixel.net/images/hypixel/icons/files.png)}.page-Main_Page #wrapper #content #statistics .stats-list .stats-item .stats-item-text { vertical-align: middle; display: inline-flex; position: relative; flex-direction: column; flex-wrap: nowrap; justify-content: center; align-content: center; margin: 0 15px}.page-Main_Page #wrapper #content #statistics .stats-list .stats-item .stats-item-text span:first-child { font-size: 20px}.page-Main_Page #wrapper #content #statistics .stats-list .stats-item .stats-item-text span:nth-child(2) { font-size: 16px}.page-Main_Page #wrapper #content #other-game-content ul { columns: 200px auto}.page-Main_Page #wrapper #content .content-heading { height: 50px; background-color: #1f1f1f; border: 1px solid #333; border-image: url(https://wiki.hypixel.net/images/hypixel/borders/classic_border.png) 1000 1000 repeat!important; border-image-width: 35px!important; border-image-outset: 2px!important; margin: 0 0 1em; font-size: 20px; display: flex; justify-content: center; align-items: center}.page-Main_Page #wrapper #sidebar { display: flex; flex-direction: column; row-gap: 50px}.page-Main_Page #wrapper #sidebar .sidebar-heading { text-align: center; font-size: 20px}.page-Main_Page #wrapper #sidebar .sidebar-content { display: flex; flex-direction: column; flex-wrap: nowrap; row-gap: 15px; background-color: #1f1f1f; padding: 20px; border-radius: 3px; border: 1px solid #333; border-image: url(https://wiki.hypixel.net/images/hypixel/borders/square_border.png) 500 500 repeat; border-image-width: 35px!important; border-image-outset: 2px!important}.page-Main_Page #wrapper #sidebar #clock { display: none}.page-Main_Page #wrapper #sidebar #clock p { text-align: center; margin: 0}.page-Main_Page #wrapper #sidebar #clock #clock-time { font-size: 2em}.page-Main_Page #wrapper #sidebar #clock #clock-date { font-size: 1em}@media(max-width: 1000px) { #wrapper { flex-wrap:wrap }}@media(max-width: 720px) { #introduction { flex-wrap:wrap; justify-content: center } .stats-list { flex-direction: column; align-content: center }}.mw-ui-button.mw-ui-progressive { background-color: #e7871b; color: #fff; border: 1px solid #e7871b}.oo-ui-panelLayout-framed { background-color: #eaecf0!important; border-radius: 4px; border: none!important}.oo-ui-dropdownInputWidget.oo-ui-widget-enabled { background-color: transparent}ul.mw-contributions-list li { min-height: 0!important}ul.special li { min-height: 0!important}body { color: transparent; background-color: transparent; font-family: Raleway,helvetica,serif!important}#content h1,#content h2,#content h3 { font-family: Neuton,Raleway,helvetica,serif!important}html,#mw-mf-page-center,#mw-script-doc,#content,.navbox,.navbox-subgroup,.overlay.search-overlay { background-color: #fff!important}.overlay.search-overlay { background-color: #fff!important}.overlay.search-overlay .search-box { display: block!important; position: relative!important}a.external { background-image: none!important; padding-right: 0!important}.mw-body h2.list-header { margin-top: 16px}.page-heading>h1 { font-size: 1.7em!important; font-weight: 400!important; line-height: 1.3; word-wrap: break-word; word-break: break-word}.list-header { background-color: transparent; color: inherit}#toc ul { list-style: decimal}#mw-toc-heading::before { background-image: url(data:image/svg+xml;base64,PHN2ZyBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9jdXNhYmxlPSJmYWxzZSIgZGF0YS1wcmVmaXg9ImZhcyIgZGF0YS1pY29uPSJsaXN0IiBjbGFzcz0ic3ZnLWlubGluZS0tZmEgZmEtbGlzdCBmYS13LTE2IiByb2xlPSJpbWciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUxMiA1MTIiPjxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik04MCAzNjhIMTZhMTYgMTYgMCAwIDAtMTYgMTZ2NjRhMTYgMTYgMCAwIDAgMTYgMTZoNjRhMTYgMTYgMCAwIDAgMTYtMTZ2LTY0YTE2IDE2IDAgMCAwLTE2LTE2em0wLTMyMEgxNkExNiAxNiAwIDAgMCAwIDY0djY0YTE2IDE2IDAgMCAwIDE2IDE2aDY0YTE2IDE2IDAgMCAwIDE2LTE2VjY0YTE2IDE2IDAgMCAwLTE2LTE2em0wIDE2MEgxNmExNiAxNiAwIDAgMC0xNiAxNnY2NGExNiAxNiAwIDAgMCAxNiAxNmg2NGExNiAxNiAwIDAgMCAxNi0xNnYtNjRhMTYgMTYgMCAwIDAtMTYtMTZ6bTQxNiAxNzZIMTc2YTE2IDE2IDAgMCAwLTE2IDE2djMyYTE2IDE2IDAgMCAwIDE2IDE2aDMyMGExNiAxNiAwIDAgMCAxNi0xNnYtMzJhMTYgMTYgMCAwIDAtMTYtMTZ6bTAtMzIwSDE3NmExNiAxNiAwIDAgMC0xNiAxNnYzMmExNiAxNiAwIDAgMCAxNiAxNmgzMjBhMTYgMTYgMCAwIDAgMTYtMTZWODBhMTYgMTYgMCAwIDAtMTYtMTZ6bTAgMTYwSDE3NmExNiAxNiAwIDAgMC0xNiAxNnYzMmExNiAxNiAwIDAgMCAxNiAxNmgzMjBhMTYgMTYgMCAwIDAgMTYtMTZ2LTMyYTE2IDE2IDAgMCAwLTE2LTE2eiI+PC9wYXRoPjwvc3ZnPg==); content: ""; float: left; height: 14px; left: -14px; position: relative; top: 5px; width: 14px}#footer-company { padding: 0 50px 0 0}#footer-links { display: flex; flex: 1; flex-direction: column; flex-wrap: wrap; font-size: 15px; max-height: 120px}#footer-links>li { padding: 4px 10px}#footer-logo { max-height: 64px}#footer-socials { font-size: 16px; vertical-align: top; color: gray; display: block; padding: 0 4px}#footer-socials .fab { min-width: 18px; text-align: center; vertical-align: middle}#footer-socials a:hover { color: gray!important}#footer-socials a:hover>.fa-discord { color: #7289da}#footer-socials a:hover>.fa-facebook { color: #4267b2}#footer-socials a:hover>.fa-instagram { color: #405de6}#footer-socials a:hover>.fa-tiktok { color: #000}#footer-socials a:hover>.fa-twitter { color: #1da1f2}#footer-socials a:hover>.fa-youtube { color: red}#mw-content-text>form { width: 100%!important}.branding-box { background: url(https://wiki.hypixel.net/images/hypixel-full.png) no-repeat; background-origin: content-box; background-size: contain; background-position: center; opacity: 1!important; padding: 10px 0; cursor: pointer; height: 100%}.branding-box>a { height: 100%; width: 100%}.branding-box>a>span { color: transparent}.client-nojs .search-box .search:focus { border: none; box-shadow: none}.search-overlay .search-box .search:focus { border: none; box-shadow: none}.toggle-list__toggle,#mw-mf-main-menu-button { border: none; box-shadow: none; outline: none!important}.footer { background-image: linear-gradient(to bottom,rgba(26,26,26,0.92),#1a1a1a),url(https://wiki.hypixel.net/images/artwork.png); background-position: center; background-repeat: no-repeat; background-size: cover; border-top: 1px solid #ddd; color: #fff; margin-top: 60px; padding: 30px 0; user-select: none}.footer a { color: gray!important; text-decoration: none!important; transition: .12s ease-in-out}.footer a:hover { color: #fff!important}.footer-copyright { color: gray; display: block; padding: 0 4px}.footer-inner { display: flex; flex-wrap: wrap; justify-content: space-between; margin: 0 auto; max-width: 1160px; padding: 0!important; width: 65%!important}.header { height: 71px!important; user-select: none}.header-chrome:before { background-image: radial-gradient(farthest-side at top,rgba(255,255,255,0.5),#ffffff),url(https://wiki.hypixel.net/images/artwork.png)!important; background-position: center; background-repeat: no-repeat; background-size: cover; content: ""; height: 72px; left: 0; max-width: 100%!important; position: absolute; width: 100%!important}.last-modified-bar { margin: auto; width: 90%; background-color: #eaecf0!important; border-radius: 4px}.minerva__tab.selected { border-bottom: 2px solid #e7871b!important}.mw-editform .editOptions { margin-top: 20px}.mw-ui-icon-element.cancel { height: 44px; margin: 10px; padding: 0; vertical-align: middle; width: 44px}.mw-ui-icon-element:not(.disabled):hover { background-color: rgba(0,0,0,.1)}.overlay-footer-container { display: none}.overlay.search-overlay.visible { animation-duration: .1s!important}.minerva__tab-container { display: none}.page-actions-menu,#filetoc,.warningbox { border-radius: 4px; margin-bottom: 16px; padding: 0 20px; background-color: #eaecf0; border: 1px solid #c8ccd1}.warningbox { padding: 10px 25px!important}.warningbox,#mw-clearyourcache { margin-bottom: 16px!important}.search { -webkit-appearance: none!important; background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=search&format=original&skin=minerva&version=1qbws); background-position: left .8em center!important; background-size: 18px!important; border: 1px solid #fff!important; border-radius: 6px!important; box-shadow: 0 0 10px #bbb!important; box-sizing: border-box!important; color: #666!important; font-family: BlinkMacSystemFont,segoe ui,helvetica,Arial,sans-serif!important; font-size: 14px!important; height: 40px!important; line-height: 1.15!important; max-width: 380px; padding-left: 40px!important; padding-right: 20px!important; transition: border .12s ease-in-out!important; width: 100%!important}.search:focus { outline: 1px solid #ffc376!important}.search-box .search { border-radius: 4px}.content kbd { border-radius: 4px}.content samp { border-radius: 4px}.content code { border-radius: 4px}.content pre { border-radius: 4px}footer { border: none!important}fieldset { margin: 10px 0}#mw-mf-page-left { box-shadow: 0 5px 17px 0 rgba(0,0,0,.24),0 0 1px #a2a9b1!important; position: absolute!important; height: max-content; border-radius: 3px; -webkit-transition: opacity 100ms ease-in-out,-webkit-tap-highlight-color 0s ease-in-out,transform 100ms ease-in-out,visibility 100ms ease-in-out!important; transition: opacity 100ms ease-in-out,-webkit-tap-highlight-color 0s ease-in-out,transform 100ms ease-in-out,visibility 100ms ease-in-out!important; top: 45px!important; left: -12px!important; transform: translate(0,-10px)!important}#mw-mf-page-left li { border: none!important}#mw-mf-page-left li:hover { background-color: #eaecf0!important}#mw-mf-page-left ul { padding-bottom: 0!important}#mw-mf-page-left ul li a { color: #54595d!important}#mw-mf-page-left ul li a:hover { box-shadow: none!important}form.search-box { display: block; width: 100%}input { outline: none}#main-menu-input:checked~#mw-mf-page-left { transform: translate(0,0)!important}.hlist { display: none}.last-modified-bar.active { background-color: #218e47!important}.wikitable>tr>th,.wikitable>tr>td,.wikitable>*>tr>th,.wikitable>*>tr>td { padding: .25em .55em!important}.suggestions { border-radius: 6px!important}.suggestions-result,.suggestions-special { padding: .5em 1em!important}.suggestions-results,.suggestions-special { border-color: #ccc!important}kbd,samp,code,pre,.page-actions-menu,#filetoc,.warningbox,.last-modified-bar { border: 1px solid #333; border-image: url(https://wiki.hypixel.net/images/hypixel/borders/classic_border.png) 1000 1000 repeat!important; border-image-width: 35px!important; border-image-outset: 2px!important}@media only screen { .oo-ui-tabOptionWidget { color: #fff!important } .oo-ui-tabOptionWidget.oo-ui-optionWidget-selected { background-color: #212121 } .suggestions-results,.suggestions-special { background-color: #1f1f1f!important; border-color: #333!important } .suggestions-results .special-label,.suggestions-special .special-label { color: #ccc!important } .suggestions-results .suggestions-result,.suggestions-special .suggestions-result,.suggestions-results .special-query,.suggestions-special .special-query { color: #fff!important } .search { color: #ccc!important } html,body,#mw-mf-page-center,#mw-script-doc,#content,.navbox,.navbox-subgroup,.overlay.search-overlay,.oo-ui-tabSelectWidget-framed,.oo-ui-tagMultiselectWidget-handle,.mw-prefs-buttons,.mw-scribunto-message,.mw-scribunto-console-fieldset,.mw-history-compareselectedversions { background-color: transparent!important; color: #fff } .mw-rcfilters-ui-watchlistTopSectionWidget-separator { border-color: #212121!important } .mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-content-title,.mw-rcfilters-ui-filterTagMultiselectWidget-emptyFilters { color: #fff!important } .oo-ui-tabSelectWidget-framed { border-bottom-color: transparent } .oo-ui-tagMultiselectWidget-handle,.oo-ui-buttonGroupWidget,.oo-ui-dropdownWidget-handle,.oo-ui-optionWidget,.oo-ui-selectWidget,.oo-ui-optionWidget-selected { background-color: #1a1a1a!important; color: #fff!important; border-color: #212121!important } .oo-ui-optionWidget-highlighted { background-color: #212121!important } .oo-ui-optionWidget-selected { background-color: #1f1f1f!important } input,select,.oo-ui-buttonElement-button,#mw-scribunto-input,.diff-context { color: #fff!important; background-color: #1f1f1f!important; border: 1px solid #333!important } legend { color: #aaa } .content .mw-parser-output>h2 { border-bottom: 2px solid #333 } .content .mw-parser-output>h3 { border-bottom: 1px solid #333; margin-bottom: .5em } .content .section-heading { border-bottom: 1px solid #aaa } .content kbd,.content samp,.content code,.content pre,.content .toc,.content .infobox { background-color: #1f1f1f!important; border-color: #333!important } .content .infobox td { border-color: #333!important } .infobox tr { color: #fff!important } table.wikitable>tr>th,table.wikitable>tr>td { background-color: #212121; border-color: #333!important } table.wikitable>tr>th { background-color: #2b2b2b } table.wikitable>tr:nth-child(odd)>td { background: #2b2b2b } table.wikitable>*>tr>th,table.wikitable>*>tr>td { background-color: #212121; border-color: #333!important } table.wikitable>*>tr>th { background-color: #2b2b2b } table.wikitable>*>tr:nth-child(odd)>td { background: #2b2b2b } .mw-datatable>tr>th,.mw_metadata>tr>th,.mw-datatable>tr>td,.mw_metadata>tr>td { background-color: #212121!important; border-color: #333!important } .mw-datatable>tr>th,.mw_metadata>tr>th { background-color: #2b2b2b!important } .mw-datatable>*>tr>th,.mw_metadata>*>tr>th,.mw-datatable>*>tr>td,.mw_metadata>*>tr>td { background-color: #212121!important; border-color: #333!important } .mw-datatable>*>tr>th,.mw_metadata>*>tr>th { background-color: #2b2b2b!important } .footer { background-image: linear-gradient(to bottom,rgba(26,26,26,0.85),#1a1a1a),url(https://wiki.hypixel.net/images/artwork.png); border-top: 1px solid #1a1a1a } .header-chrome:before { background-image: radial-gradient(farthest-side at top,rgba(26,26,26,0.5),#1a1a1a),url(https://wiki.hypixel.net/images/artwork.png)!important } .oo-ui-iconElement-icon,.oo-ui-indicatorElement-indicator { filter: invert(1) hue-rotate(180deg) brightness(1.2) } .mw-ui-icon:not(.mw-ui-icon-wikimedia-history-invert):before { filter: invert(1) hue-rotate(180deg) brightness(1.2) } .mw-ui-icon:not(.mw-ui-icon-mf-expand-invert):before { filter: invert(1) hue-rotate(180deg) brightness(1.2) } .last-modified-bar { background-color: #1f1f1f!important } .last-modified-bar .last-modified-bar__text { color: #fff!important } .oo-ui-panelLayout-framed { background-color: #1f1f1f!important } .minerva__tab { color: #aaa!important } .mw-ui-icon-with-label-desktop:hover,.mw-ui-icon-with-label-desktop:focus,.mw-ui-icon-with-label-desktop:active,.mw-ui-icon-with-label-desktop:visited { color: #aaa!important } .page-heading>h1,.page-heading>.tagline { color: #fff!important } .toggle-list__list { color: #fff!important; background-color: #1f1f1f!important; box-shadow: 0 5px 17px 0 rgba(0,0,0,.24),0 0 1px #000!important; border: 1px solid #333 } .search { box-shadow: 0 0 10px #1f1f1f!important } .search,.page-actions-menu,#filetoc,.warningbox { background-color: #1f1f1f!important; border-color: #333!important } .toggle-list-item:hover { background: #000; color: #fff } .blocks-item-description,.mw-mf-user { color: #fff!important } .blocks-item { box-shadow: 0 2px 15px rgba(35,35,35,.5)!important; border: 1px solid #333!important; background-color: #212121 } .mw-ui-button { background-color: #1f1f1f!important; border: 1px solid #333!important; color: #fff!important } .mw-ui-button:hover { background-color: #212121!important } .mw-history-undo a,.mw-rollback-link a { background-color: #1f1f1f!important; border: 1px solid #333!important; color: #fff!important } .mw-history-undo a:hover,.mw-rollback-link a:hover { background-color: #212121!important } .toggle-list-item__label { color: #aaa!important } .page-list .info,.page-list .component { color: #aaa!important } .page-list li { border-color: #333!important } .topic-title-list .info,.topic-title-list .component { color: #aaa!important } .topic-title-list li { border-color: #333!important } .site-link-list .info,.site-link-list .component { color: #aaa!important } .site-link-list li { border-color: #333!important } .page-list.side-list .list-thumb { color: #aaa!important } .topic-title-list.side-list .list-thumb { color: #aaa!important } .site-link-list.side-list .list-thumb { color: #aaa!important } ul.mw-contributions-list li { border-color: #1f1f1f!important } ul.special li { border-color: #1f1f1f!important } .ns-special .content-header { border-color: #1f1f1f!important } .mw-prefs-buttons { border-color: #1f1f1f!important } #mw-mf-page-left { box-shadow: 0 5px 17px 0 rgba(0,0,0,.24),0 0 1px #000!important } #mw-mf-page-left ul li { background-color: #1f1f1f!important; color: #fff!important } #mw-mf-page-left ul li a { color: #aaa!important } #mw-mf-page-left li:hover { background-color: #000!important } .mw-ui-icon-element:not(.disabled):hover { background-color: rgba(0,0,0,.4) }}@media only screen and (min-width: 720px) { .header .branding-box { width:auto!important; min-width: 82px } .overlay.search-overlay .overlay-title { padding-left: 236px!important; width: 380px!important } #page-actions a { color: #fff!important } #page-actions label { color: #fff!important }}@media only screen and (max-width: 720px) { #footer-company { padding:0 0 30px; text-align: center; width: 100% } #footer-links { max-height: 100%; text-align: center } .header-chrome:before { background-image: linear-gradient(to bottom,rgba(255,255,255,0.5),#ffffff),url(https://wiki.hypixel.net/images/artwork.png)!important; height: 170px!important } .last-modified-bar { margin: 0 16px } .header-chrome:before { background-image: linear-gradient(to bottom,rgba(26,26,26,0.5),#1a1a1a),url(https://wiki.hypixel.net/images/artwork.png)!important }}@media only screen and (min-width: 1000px) { .footer-inner { padding:0; width: 90% }}@media only screen and (max-width: 1000px) { #footer-links { max-width:100% } .footer-inner { padding: 0 5%!important; width: calc(90%)!important }}.infobox { border: 15px solid #232445!important; border-image: url(https://wiki.hypixel.net/images/hypixel/borders/square_border.png) 1000 1000 repeat!important; border-image-width: 100px!important; border-image-outset: 2px!important; border-collapse: separate!important}.infobox { background-color: #f2f2f2; border-collapse: collapse; clear: both; display: table!important; float: right; margin: 0!important; margin-left: 20px!important; width: 320px; margin-bottom: 15px!important; table-layout: fixed}.infobox table { border-collapse: inherit!important}.infobox img { display: block; margin: 20px auto; max-width: 150px; height: auto}.infobox td { border-top: 1px solid #c7c7c7; padding: 2px 8px; text-align: right}.infobox td:first-of-type { font-weight: 700; text-align: left}.infobox td:last-child { float: right; width: 100%; text-align: right}.infobox tr:first-of-type>th { font-size: 16px; font-weight: 700; padding: 10px 0; text-align: center}.infobox.minor { border-image-width: 0 100px 100px 100px!important; border-width: 0 15px 15px!important; margin-top: -15px!important}.infobox tr:first-of-type>td { border-top: none}.mw-parser-output .infobox:last-of-type { margin-bottom: 15px}span.color-divine,span.color-light_blue,span.color-aqua { color: #5ff!important}span.color-black { color: #000!important}span.color-rare,span.color-blue { color: #55f!important}span.color-dark_aqua { color: #0aa!important}span.color-dark_blue { color: #00a!important}span.color-dark_gray { color: #555!important}span.color-dark_green { color: #0a0!important}span.color-epic,span.color-dark_purple { color: #a0a!important}span.color-dark_red { color: #a00!important}span.color-legendary,span.color-orange,span.color-gold { color: #fa0!important}span.color-gray { color: #aaa!important}span.color-uncommon,span.color-green { color: #5f5!important}span.color-pink,span.color-mythic,span.color-light_purple { color: #f5f!important}span.color-supreme,span.color-special,span.color-very-special,span.color-red { color: #f55!important}span.color-common,span.color-white { color: #fff!important}span.color-yellow { color: #ff5!important}.tabber__header__prev:after,.tabber__header__next:after { filter: invert(1)}:not(.infobox) .tabber__tab--active { background-color: rgba(51,102,204,.2)}:not(.infobox) .tabber__panel,:not(.infobox) .tabber__header { background-color: #1f1f1f; border: 1px solid #333}:not(.infobox) .tabber__panel { padding: 1em!important}:not(.infobox) .tabber__panel h1,:not(.infobox) .tabber__panel h2,:not(.infobox) .tabber__panel h3 { margin-top: 0}.diff-addedline .diffchange { background: #0083ff}.codeEditor-status { color: #000!important}#toctogglecheckbox:not(:checked)+.toctitle { border-bottom: 1px solid #333; margin-bottom: 10px}a.new { color: #d33!important}.contributionscores { width: 100%}.contributionscores td { text-align: center!important}.contributionscores .header { display: table-row}.contributionscores .content { width: auto}.wikiEditor-ui-toolbar { background-color: #1f1f1f!important}.wikiEditor-ui-toolbar .label:after { filter: invert(1) hue-rotate(180deg) brightness(1.2)}.wikiEditor-ui-toolbar .tabs .tab a::before { filter: invert(1) hue-rotate(180deg) brightness(1.2)}.wikiEditor-ui .wikiEditor-ui-view { border: 1px solid #54595d}.wikiEditor-ui-toolbar { box-shadow: 0 10px 9px 0 rgba(0,0,0,.1)}.wikiEditor-ui-toolbar .sections .section { border-top: none}.wikiEditor-ui-toolbar .group { border-right: none; border-left: none}.tabber__panel { overflow: visible}:not(.tabber__panel--active).tabber__panel { display: none}.tabber__section { height: auto!important; overflow: visible}.infobox td { font-size: 13px}.minecraft-inventory td { font-size: 15px!important}.content { padding: 0}.tabber__tab--active,.tabber__tab--active:visited { box-shadow: inset 0 -2px 0 0 #ffc376; border-width: 0 1px; background-color: rgba(255,195,118,.1)!important; font-weight: 700}.tabber__tab--active a:active,.tabber__tab a:visited { color: #ffc376!important}.tabber__tab:hover { box-shadow: inset 0 -2px 0 0 #ffc376; color: #ffc376; filter: brightness(1.5)}.tabber__tab a:active,.tabber__tab a:visited { color: #bdbcb9!important}.tabber__tabs { box-shadow: none!important}.tabber__tabs a:first-of-type { border-left: none}.tabber__tab { color: #36c; line-height: 30px; font-weight: 400}.tabber { margin-bottom: 5px}#mw-mf-page-left ul { list-style-type: none; padding-left: 0}#mw-mf-page-left li { margin-bottom: 0}#mw-mf-page-left ul li a { color: #aaa!important}#mw-mf-main-menu-button:hover+#mw-mf-page-left,#mw-mf-page-left:hover { visibility: visible}.mw-hypixel-right ul { padding-left: 0}.mw-hypixel-right li { margin-bottom: 0}.mw-hypixel-right a { text-decoration: none}table.mw-collapsible :first-child tr:first-child th:last-child::before { color: #ffc376!important}.infobox.minor img,.remove-img-span img { display: inline!important; margin: 0!important}.infobox.minor tr:first-of-type>th { padding: 7px; border-bottom: 1px solid #333!important}.infobox.minor tr:nth-of-type(2)>td { border-top: none}.occupants-minor,.resources-minor { text-align: left!important; font-weight: 400; padding: 5px 0 0!important}.occupants-minor:first-of-type,.resources-minor:first-of-type { border-right: 1px solid #333!important}.occupants-minor li,.resources-minor li,.materials-minor li { margin-bottom: 0!important}.occupants-minor ul,.resources-minor ul,.materials-minor ul { list-style: none!important; padding: 7px!important; font-weight: 400!important}.color-wheel-minor { border-radius: 50px; border-style: solid; border-width: 30px; height: 0; width: 0; transform: rotate(45deg)}.loot-drops-minor li { list-style-type: none; margin-bottom: 0}.gemstone-slot-minor { text-align: center!important; padding: 5px}.upgrades-low-minor { text-align: center!important; font-weight: 400!important; border-right: 1px solid #333!important}.upgrades-right-minor { padding: 2px!important; padding-top: 5px!important; text-align: center!important}.upgrades-text-minor { font-size: 15px!important; font-weight: 700!important}.attributes-minor { text-align: center!important; font-weight: 400!important; border-right: 1px #333 solid!important}.attributes-text-minor { font-size: 13px!important; font-weight: 700!important}.container-navbox { max-width: 100%; height: auto; padding: 6px; font-size: 15px; background-color: #1f1f1f; border: 1px solid #c8ccd1; border-color: #333!important; border-image: url(https://wiki.hypixel.net/images/hypixel/borders/classic_border.png) 1000 1000 repeat!important; border-image-width: 35px!important; border-image-outset: 2px!important; clear: both}.container-navbox-header { width: auto; height: 35px; padding: 10px; border-bottom: 2px solid #333; text-align: center; display: flex; flex-direction: row; align-items: center; justify-content: space-between; font-size: 18px; vertical-align: middle}.container-navbox-header p { margin: 0!important}.container-navbox-section { max-width: 100%; height: auto; border-bottom: 2px solid #333; display: flex; flex-direction: row; background-color: #1f1f1f; column-gap: 5px}.container-navbox-section:last-child { border-bottom: none}.container-navbox-group-header { width: 200px; max-height: 100%; padding: 1em; display: flex; align-items: center; background-color: #1f1f1f; font-weight: 700; white-space: pre-wrap; column-gap: 10px}.container-navbox-group { width: 100%; padding: 15px 1em}.container-navbox-group ul { columns: 220px auto}.container-navbox-group ul li { margin-bottom: 5px}.dropdown:hover .dropdown-content { visibility: visible; opacity: 1}blockquote { font-family: Raleway,helvetica,serif!important}.cata-image-loot-tabber * .tabber__tabs a::before { content: ""; width: 35px; height: 45px; background-position: center; background-repeat: no-repeat; background-size: cover}.cata-image-loot-tabber * .tabber__tabs a:nth-child(1)::before { background-image: url(https://wiki.hypixel.net/images/a/a8/SkyBlock_furniture_wood_chest_plus.png)}.cata-image-loot-tabber * .tabber__tabs a:nth-child(2)::before { background-image: url(https://wiki.hypixel.net/images/b/be/SkyBlock_furniture_gold_chest_plus.png)}.cata-image-loot-tabber * .tabber__tabs a:nth-child(3)::before { background-image: url(https://wiki.hypixel.net/images/e/e9/SkyBlock_furniture_diamond_chest_plus.png)}.cata-image-loot-tabber * .tabber__tabs a:nth-child(4)::before { background-image: url(https://wiki.hypixel.net/images/8/82/SkyBlock_furniture_emerald_chest_plus.png)}.cata-image-loot-tabber * .tabber__tabs a:nth-child(5)::before { background-image: url(https://wiki.hypixel.net/images/b/be/SkyBlock_furniture_ender_chest_plus.png)}.cata-image-loot-tabber * .tabber__tabs a:nth-child(6)::before { background-image: url(https://wiki.hypixel.net/images/b/be/SkyBlock_furniture_ender_chest_plus.png)}.boss-quote-table-quote { font-family: sans,serif; font-size: 40px; font-weight: 700; color: #f55; padding: 16px 10px; line-height: .5}.toc>ul { margin: 0 5em 0 32px!important}.toctogglecheckbox~ul { display: none}.toctogglecheckbox:not(:checked)~ul { display: block}.dialogue-headine { padding: .5em 0; line-height: 1.3; word-wrap: break-word; word-break: break-word; font-weight: 700}.content code { padding: .1em .4em}code { border-image: none!important}.mw-parser-output { display: inline-block; width: 100%; max-width: 100%}@media(min-width: 1000px) { .header-container.header-chrome { position:fixed; z-index: 2; width: 100%; top: 0; padding: 0!important } .header-container.header-chrome:before { box-shadow: 0 0 20px 10px #1a1a1a } #mw-mf-page-center,#mw-mf-page-center::before { top: 100px!important } .minerva-user-menu-list { top: 60px }}@media(max-width: 1000px) { .hypixel-site-navigation .toggle-list__toggle { padding-left:0!important; padding-right: 0!important } #hypixel-site-navigation-wrapper { padding: 0 .75em }}@media(max-width: 720px) { .header { flex-wrap:wrap!important; height: auto!important; justify-content: space-around!important } #hypixel-site-navigation-wrapper { order: 3; flex-wrap: wrap!important; row-gap: 15px; justify-content: space-around } #hypixel-site-navigation-wrapper .toggle-list__list { left: 0!important; width: 100%!important } .branding-box { width: 80px; height: 40px } .search-box { width: 100%!important; left: 0!important }}.main-menu-mask { display: none!important}#hypixel-site-navigation-wrapper { display: flex; flex-wrap: nowrap}.hypixel-site-navigation { color: #fff!important; text-shadow: 1px 1px rgba(0,0,0,.5)}.hypixel-site-navigation a { color: inherit!important}.hypixel-site-navigation .toggle-list__toggle { padding: .75em}.hypixel-site-navigation .toggle-list__toggle:hover { background-color: rgba(0,0,0,.4)}.hypixel-site-navigation .toggle-list__list { top: 100%; min-width: 200px}.hypixel-site-navigation .toggle-list__list .toggle-list-item .toggle-list-item__anchor { min-height: 20px}.toggle-list__list,.minerva-user-menu-list { border-radius: 3px}.minerva-user-navigation { width: auto!important; min-width: revert!important}.header { display: flex; justify-content: space-between; align-content: center; align-items: center; flex-direction: row; flex-wrap: nowrap}.hypixel-site-navigation>label::after { content: ""; background-image: linear-gradient(transparent,transparent),url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj48dGl0bGU+ZXhwYW5kPC90aXRsZT48ZyBmaWxsPSIjYTJhOWIxIj48cGF0aCBkPSJNMTcuNSA0Ljc1bC03LjUgNy41LTcuNS03LjVMMSA2LjI1bDkgOSA5LTl6Ii8+PC9nPjwvc3ZnPg==); display: inline-block; vertical-align: middle; min-width: 1em; min-height: 1em; padding: 0 0 0 20px; background-repeat: no-repeat; background-size: 1em 1em; background-position: center}#mw-mf-page-left ul li a span,.toggle-list-item__label { color: #fff!important}.mw-ui-icon-wikimedia-flag-ltr-base20:before { background-image: url(https://wiki.hypixel.net/resources/lib/ooui/themes/wikimediaui/images/icons/flag-ltr.svg)}.mw-ui-icon-wikimedia-articleRedirect-ltr-base20:before { background-image: url(https://wiki.hypixel.net/resources/lib/ooui/themes/wikimediaui/images/icons/articleRedirect-ltr.svg)}@media(max-width: 720px) { table.infobox { display:table!important } table.wikitable { display: block!important }}table.infobox { display: revert!important}.infobox ul { list-style: none}#userloginForm .mw-userlogin-rememberme { display: block!important}.mw-hp-tree { color: #5f5; margin-left: 20px}.mw-hp-tree li { margin-bottom: 0; list-style-type: disc}.mw-hp-tree li::marker { color: #fff}.mw-hp-tree ul:first-of-type { margin-top: 6px}.mw-hp-tree ul:last-of-type { margin-bottom: 6px}.mw-hp-tree-container { margin-left: 5px}.mw-hp-tree-text::after { content: "Expand"; color: #ba91ff; display: inline-block}.mw-hp-tree-text-down::after { content: "Collapse"; color: #7698ff; display: inline-block}.mw-hp-tree-anchor { cursor: pointer; user-select: none}.mw-hp-tree-nested { display: none}.mw-hp-tree-active { display: block}.mw-display-qrcode { border: 2px solid #fff}.mw-overlays-container .search-overlay { top: 71px}.mw-overlays-container .search-overlay .search-content,.mw-overlays-container .search-overlay .results { margin-left: 0!important}.mw-overlays-container .search-overlay .search-content { z-index: 4; position: relative; border: none!important}.mw-overlays-container .search-overlay .overlay-content { padding-top: 0!important; z-index: 3}.mw-overlays-container .search-overlay .overlay-header { flex-wrap: nowrap!important}.mw-overlays-container .search-overlay .overlay-title { padding-right: 15px}.mw-overlays-container .search-overlay .search { max-width: unset!important}.mw-overlays-container .search-overlay .clear { right: 5px!important}.mw-overlays-container .search-overlay .results { position: relative; box-shadow: none!important; background: 0 0!important}.mw-overlays-container .search-overlay .results ul>li { color: #fff; background: #1f1f1f; border: 1px solid #333!important; border-radius: 6px; margin: 5px 0; box-shadow: 0 0 10px #1f1f1f!important}.mw-overlays-container .search-overlay .results .list-thumb { background-color: #212121; border-radius: 6px}.mw-overlays-container .search-overlay .results .page-summary h2,.mw-overlays-container .search-overlay .results .page-summary h3 { color: #fff}@media(min-width: 720px) { .overlay-content { padding-left:236px!important } .overlay-header-container { z-index: 4!important } .search-content,.results { width: 380px!important }}@media(max-width: 720px) { div.overlay-header-container { position:relative!important; top: -71px!important } .overlay-content { padding: 0 15px } .search-content,.results { width: 100%!important }}table.sortable .headerSort { padding-right: 21px!important; position: relative}table.sortable .headerSort:after { background-image: inherit; content: ""; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-repeat: no-repeat; background-position: center right; filter: invert(100%); pointer-events: none}.warningbox>p { color: #fff; margin: .5em 0}.suggestions-special { border-radius: 6px}.mw-dismissable-notice { background-color: #1f1f1f; border-radius: 8px; border: 1px solid #333; border-image-width: 35px!important; border-image-outset: 2px!important}.mw-dismissable-notice { position: fixed; display: block; bottom: 25px; z-index: 6; width: 100%; max-width: 92%!important; box-shadow: 0 -5px 30px 20px rgba(0,0,0,.3); margin: 0!important; left: 50%; transform: translateX(-50%)}.mw-dismissable-notice-body { padding: 20px; margin: 0!important}.mw-dismissable-notice-close { padding: 20px}.banner-container { position: relative}.warningbox { color: #fff!important}#content { position: relative; z-index: 1; background-color: transparent!important}div#mw-mf-page-center::before { content: ""; position: fixed; top: 0; bottom: 0; right: 0; height: 100%; width: 100%; background-image: linear-gradient(#1a1a1a,transparent),url(https://wiki.hypixel.net/images/hypixel/background.png); background-image: linear-gradient(#1a1a1a,transparent),image-set(url(https://wiki.hypixel.net/images/hypixel/background.png) 1x,url(https://wiki.hypixel.net/images/hypixel/background-large.png) 2x); background-attachment: fixed; background-color: #1a1a1a; background-position: center; background-repeat: no-repeat; background-size: cover; opacity: .075; z-index: 0; pointer-events: none}.page-Main_Page #wrapper #content { background: 0 0!important}.last-modified-bar,.footer { position: relative}.last-modified-bar a,.last-modified-bar a:visited { color: #fff}.overlay { z-index: 2!important}.mwe-math-element { overflow: auto; display: block}#page-secondary-actions { display: none}.loot-drops-minor li { margin-bottom: 0!important}.warningbox { color: #fff}.warningbox>p { margin: .5em 0!important; font-size: 17px}.toctitle>.mw-ui-icon-minerva-listBullet { display: none}.infobox img { max-width: 100%!important}.hp-loottable td { border: 2px solid #1a1a1a!important}.hp-loottable td:last-child { color: #5f5}.is-affected-by-mf { outline: dotted 3px transparent; outline-offset: -1px; outline-color: #5ff}.is-affected-by-pl { outline: dotted 3px transparent; outline-offset: -1px; outline-color: #f5f}.is-affected-by-mf.is-affected-by-pl { outline-color: #b591b7!important}.cata-image-loot-tabber * .tabber__tabs a:nth-child(1)::before { background-image: url(https://wiki.hypixel.net/images/b/b9/SkyBlock_furniture_dungeon_wood_reward_chest.png); height: 65px}.cata-image-loot-tabber * .tabber__tabs a:nth-child(2)::before { background-image: url(https://wiki.hypixel.net/images/8/85/SkyBlock_furniture_dungeon_gold_reward_chest.png); height: 65px}.cata-image-loot-tabber * .tabber__tabs a:nth-child(3)::before { background-image: url(https://wiki.hypixel.net/images/9/98/SkyBlock_furniture_dungeon_diamond_reward_chest.png); height: 65px; width: 40px}.cata-image-loot-tabber * .tabber__tabs a:nth-child(4)::before { background-image: url(https://wiki.hypixel.net/images/e/e4/SkyBlock_furniture_dungeon_emerald_reward_chest.png); height: 65px; width: 40px}.cata-image-loot-tabber * .tabber__tabs a:nth-child(5)::before { background-image: url(https://wiki.hypixel.net/images/4/40/SkyBlock_furniture_dungeon_obsidian_reward_chest.png); height: 65px; width: 50px}.cata-image-loot-tabber * .tabber__tabs a:nth-child(6)::before { background-image: url(https://wiki.hypixel.net/images/8/87/SkyBlock_furniture_dungeon_bedrock_reward_chest.png); height: 65px; width: 55px}.diff-deletedline .diffchange { background: #988e78!important}.hide { display: none}.page-notif-box { border: 2px solid #333!important; border-left-width: 10px!important; border-radius: 6px; border-collapse: separate!important; width: 75%; background-color: #1f1f1f!important; box-shadow: 0 0 10px #1f1f1f!important; display: flex; margin: auto!important; color: #fff; font-weight: 700; margin-top: 25px!important; margin-bottom: 25px!important}.page-notif-box tr>td { border: none; padding: .25em .9em}.page-notif-box img { max-width: revert!important; flex-shrink: 0}.page-notif-box-updating,.page-notif-box-changed { border-color: #e7871b!important}.page-notif-box-no-obtain,.page-notif-box-cannot-obtain { border-color: #e30000!important}.page-notif-box-alpha { border-color: #0d6f67!important}.hp-input { height: 35px; width: 100%; border: none!important}.dungeon-calc-container td,.loot-calc-container td { border: 2px solid #1a1a1a}.dungeon-calc-button,.loot-calc-button { cursor: pointer; vertical-align: bottom; background-color: #3f7dfb!important; transition-duration: .35s; padding: 5px!important}.dungeon-calc-button:hover,.loot-calc-button:hover { background-color: #5e93fe!important}.hp-loottable td:last-child { color: #5f5}.dungeon-loottable td:last-child { color: #5f5}.listspacing li { margin-bottom: 0!important}.listspacing li:last-child { margin-bottom: 1em!important}.listdisplay li { display: inline!important}.categoryboxcontainer { max-width: 100%; height: 35px; background-color: #1f1f1f; border: 1px solid #333; padding: 3px; font-size: 15px; clear: both}.categoryboxcontainer li { display: inline-block; padding-left: 5px; padding-right: 5px; line-height: 35px}.categoryboxcontainer li:first-child { padding-left: 0; border-left: none}.categoryboxcontainer li:nth-child(2) { border-left: none}.categoryboxcontainer li:empty { display: none}.tooltiptemp { position: relative!important; display: inline-block!important; text-decoration: underline dotted; cursor: help}.tooltiptemp .tooltiptexttemp { visibility: hidden; width: 240px; background-color: #000; color: #fff; text-align: center; border: 1px #333 solid; border-radius: 6px; padding: 5px 0; position: absolute; z-index: 1; bottom: 100%!important; left: 50%!important; margin-left: -120px!important; opacity: 0; transition: opacity 1s}.tooltiptemp .tooltiptexttemp::after { content: ""; position: absolute; top: 100%; left: 50%; margin-left: -5px; border-width: 5px; border-style: solid; border-color: #000 transparent transparent transparent}.tooltiptemp:hover .tooltiptexttemp { visibility: visible; opacity: 1}.tooltiptemp p { margin: 0}.raw-mctooltip { position: relative!important; display: inline-block!important; font-weight: 400}.raw-mctooltip:hover .raw-mctooltiptext { display: inline}.raw-mctooltiptext { display: none; font-family: minecraft,helvetica,serif; margin: 0}.content .mw-parser-output>h2 { padding: .25em 0; font-size: 1.8em; margin-top: 35px}.content .mw-parser-output>h2,.content .mw-parser-output>h3 { text-transform: uppercase; font-weight: 400}.heading-holder { padding: 0!important}.mw-body-content blockquote { background-color: #212121; border-radius: 6px; border: 1px solid #333!important; border-left-width: 5px!important; display: table}.tabber__tab { font-weight: 400!important; column-gap: 10px}.tabber__header .tabber__tab:not(.tabber__tab--active) { color: #fff}.mw-collapsible-toggle { padding-left: 5px}.tabber__header,.tabber__section,.tabber__panel { scroll-snap-type: none!important; overscroll-behavior: none!important; scroll-snap-align: none!important; overflow: hidden!important}.mw-userlogin-help { display: none}@media(min-width: 720px) { .header .branding-box { max-height:55px }}@font-face { font-family: minecraft; src: url(https://wiki.hypixel.net/fonts/minecraft.woff) format("woff")}.minecraft-inventory { -moz-user-select: none; -ms-user-select: none; -webkit-user-select: none; background-color: #c6c6c6; border: 4px solid; border-color: #fff #555 #555 #fff; border-radius: 4px; box-shadow: 0 0 0 1px #000; color: #404040; display: inline-block; font-family: minecraft,serif; font-size: 15px; font-weight: 400; padding: 2px 6px 6px; user-select: none; margin: 10px 0}.minecraft-inventory table { border-collapse: separate; margin: 0!important}.minecraft-inventory td { background: #8b8b8b no-repeat center center/32px 32px; border: 2px solid; border-color: #373737 #fff #fff #373737; box-sizing: border-box; padding: 0; position: relative; width: 36px}.minecraft-inventory td>.external { background: 0 0; padding: 0}.minecraft-inventory td>a:hover { text-decoration: none}.minecraft-inventory td:hover:after { background: #fff; content: ""; float: left; height: 100%; left: 0; opacity: .5; pointer-events: none; position: absolute; top: 0; width: 100%}.minecraft-inventory td:hover .mctooltip { display: block}.minecraft-inventory>span { padding: 2px}.minecraft-inventory tr { height: 36px}.minecraft-inventory .enchanted::before { content: ""; height: 32px; left: 0; position: absolute; top: 0; width: 32px; background-image: url(https://wiki.hypixel.net/images/minecraft/glint.webp); mix-blend-mode: color-dodge}.minecraft-inventory .enchanted::after { content: ""; height: 32px; left: 0; position: absolute; top: 0; width: 32px; background-image: url(https://wiki.hypixel.net/images/minecraft/item-spritesheet_cutout.png); background-position: inherit}.minecraft-inventory .amount { margin: 0; position: relative; z-index: 999}.minecraft-inventory .sbsprite { background-repeat: no-repeat; color: #fff; direction: rtl; display: block; text-shadow: 2px 2px #3f3f3f; background-image: url(https://wiki.hypixel.net/images/skyblock/item-spritesheet.png); height: 22px; line-height: 44px; margin: 0 5px; text-indent: -8px; width: 22px}.minecraft-inventory .mcsprite { background-repeat: no-repeat; color: #fff; direction: rtl; display: block; text-shadow: 2px 2px #3f3f3f; background-image: url(https://wiki.hypixel.net/images/minecraft/item-spritesheet.png); height: 32px; line-height: 54px; text-indent: -2px; width: 32px}.minecraft-inventory .sbpet { background-repeat: no-repeat; color: #fff; direction: rtl; display: block; text-shadow: 2px 2px #3f3f3f; background-image: url(https://wiki.hypixel.net/images/skyblock/pet-spritesheet.png); height: 22px; line-height: 44px; margin: 0 6px; text-indent: -8px; width: 20px}.mctooltip { background: rgba(16,0,16,.93); border: 2px solid; border-image: linear-gradient(to bottom,rgba(80,0,255,0.31),rgba(40,0,127,0.31)); border-image-slice: 1; border-radius: 4px; box-shadow: 0 0 0 2px rgba(16,0,16,.93); display: none; line-height: 18px; margin-left: 15px; margin-top: -30px; padding: 4px 4px 3px; position: fixed; text-indent: initial; text-shadow: 2px 2px #3f3f3f; z-index: 9999}.mctooltip>span { direction: ltr; display: block; white-space: nowrap; text-align: left}.mctooltip>span:nth-child(1):not(:last-child) { padding-bottom: 5px}.mctooltip>span:nth-child(n+2) { float: left}.mctooltip>span:nth-child(n+2):not(:last-child) { padding-right: 4px}.mctooltip>span.inline { display: inline-block!important}.mctooltip .rarity-divine { color: #5ff}.mctooltip .rarity-rare { color: #55f; text-shadow: 2px 2px #15153f}.mctooltip .rarity-epic { color: #a0a; text-shadow: 2px 2px #2a002a}.mctooltip .rarity-supreme { color: #a00; text-shadow: 2px 2px #2a0000}.mctooltip .rarity-legendary { color: #fa0; text-shadow: 2px 2px #2a2a00}.mctooltip .rarity-uncommon { color: #5f5; text-shadow: 2px 2px #153f15}.mctooltip .rarity-mythic { color: #f5f; text-shadow: 2px 2px #3f153f}.mctooltip .rarity-veryspecial { color: #f55; text-shadow: 2px 2px #3f1515}.mctooltip .rarity-special { color: #f55; text-shadow: 2px 2px #3f1515}.mctooltip .color-aqua { text-shadow: 2px 2px #153f3f}.mctooltip .color-black { text-shadow: 2px 2px #000}.mctooltip .color-blue { text-shadow: 2px 2px #15153f}.mctooltip .color-dark_aqua { text-shadow: 2px 2px #002a2a}.mctooltip .color-dark_blue { text-shadow: 2px 2px #00002a}.mctooltip .color-dark_gray { text-shadow: 2px 2px #151515}.mctooltip .color-dark_green { text-shadow: 2px 2px #002a00}.mctooltip .color-dark_purple { text-shadow: 2px 2px #2a002a}.mctooltip .color-dark_red { text-shadow: 2px 2px #2a0000}.mctooltip .color-gold { text-shadow: 2px 2px #2a2a00}.mctooltip .color-gray { text-shadow: 2px 2px #2a2a2a}.mctooltip .color-green { text-shadow: 2px 2px #153f15}.mctooltip .color-light_purple { text-shadow: 2px 2px #3f153f}.mctooltip .color-red { text-shadow: 2px 2px #3f1515}.mctooltip .color-white { text-shadow: 2px 2px #3f3f3f}.mctooltip .color-yellow { text-shadow: 2px 2px #3f3f15}.color-aqua { color: #5ff}.color-black { color: #000}.color-blue { color: #55f}.color-dark_aqua { color: #0aa}.color-dark_blue { color: #00a}.color-dark_gray { color: #555}.color-dark_green { color: #0a0}.color-dark_purple { color: #a0a}.color-dark_red { color: #a00}.color-gold { color: #fa0}.color-gray { color: #aaa}.color-green { color: #5f5}.color-light_purple { color: #f5f}.color-red { color: #f55}.color-white { color: #fff}.color-yellow { color: #ff5}.mcentity { background-image: url(https://wiki.hypixel.net/images/minecraft/entity-spritesheet.png); height: 16px; width: 16px}.mcblock { background-image: url(https://wiki.hypixel.net/images/minecraft/block-spritesheet.png); height: 16px; width: 16px}.sbspray { background-image: url(https://wiki.hypixel.net/images/skyblock/spray-spritesheet.png); height: 128px; width: 128px}.sbnpc { background-image: url(https://wiki.hypixel.net/images/skyblock/npc-spritesheet.png); height: 120px; width: 270px}.sbnpc-_56ms { background-position: 0 0}.sbnpc-adventurer { background-position: -120px 0}.sbnpc-agents { background-position: -240px 0}.sbnpc-anita { background-position: -360px 0}.sbnpc-archeologist { background-position: -480px 0}.sbnpc-armorsmith { background-position: -600px 0}.sbnpc-arthur { background-position: -720px 0}.sbnpc-artist { background-position: -840px 0}.sbnpc-artist_2 { background-position: -960px 0}.sbnpc-auction_agent_0 { background-position: -1080px 0}.sbnpc-auction_agent_1 { background-position: -1200px 0}.sbnpc-auction_agent_2 { background-position: -1320px 0}.sbnpc-auction_agent_3 { background-position: -1440px 0}.sbnpc-auction_master { background-position: -1560px 0}.sbnpc-baker { background-position: -1680px 0}.sbnpc-banker { background-position: -1800px 0}.sbnpc-bartender { background-position: -1920px 0}.sbnpc-bazaar { background-position: -2040px 0}.sbnpc-bazaar_assistant { background-position: -2160px 0}.sbnpc-beekeeper { background-position: -2280px 0}.sbnpc-bestiary { background-position: -2400px 0}.sbnpc-beth { background-position: -2520px 0}.sbnpc-blue_shark { background-position: -2640px 0}.sbnpc-bodyguard_1 { background-position: -2760px 0}.sbnpc-bodyguard_2 { background-position: 0 -270px}.sbnpc-bonzo { background-position: -120px -270px}.sbnpc-bonzo_summon_0 { background-position: -240px -270px}.sbnpc-bonzo_summon_1 { background-position: -360px -270px}.sbnpc-bonzo_summon_2 { background-position: -480px -270px}.sbnpc-bonzo_undead { background-position: -600px -270px}.sbnpc-builder { background-position: -720px -270px}.sbnpc-candidate { background-position: -840px -270px}.sbnpc-cannibal_undead { background-position: -960px -270px}.sbnpc-carpenter { background-position: -1080px -270px}.sbnpc-catacombs_blacksmith { background-position: -1200px -270px}.sbnpc-century_simon { background-position: -1320px -270px}.sbnpc-charlie { background-position: -1440px -270px}.sbnpc-clerk_election { background-position: -1560px -270px}.sbnpc-community_shop { background-position: -1680px -270px}.sbnpc-crypt_dreadlord { background-position: -1800px -270px}.sbnpc-crypt_souleater { background-position: -1920px -270px}.sbnpc-crystal_sentry { background-position: -2040px -270px}.sbnpc-dante_grey { background-position: -2160px -270px}.sbnpc-dante_statue { background-position: -2280px -270px}.sbnpc-default_lost_adventurer { background-position: -2400px -270px}.sbnpc-derp_candidate { background-position: -2520px -270px}.sbnpc-diamond_guy { background-position: -2640px -270px}.sbnpc-dictator { background-position: -2760px -270px}.sbnpc-dirt_guy { background-position: 0 -540px}.sbnpc-donpireso { background-position: -120px -540px}.sbnpc-duncan { background-position: -240px -540px}.sbnpc-dungeons_candidate { background-position: -360px -540px}.sbnpc-dungeons_hub_selector { background-position: -480px -540px}.sbnpc-dusk { background-position: -600px -540px}.sbnpc-dwarf_banker { background-position: -720px -540px}.sbnpc-dwarf_citizen_female_5 { background-position: -840px -540px}.sbnpc-dwarf_citizen_female_6 { background-position: -960px -540px}.sbnpc-dwarf_citizen_female_7 { background-position: -1080px -540px}.sbnpc-dwarf_citizen_male_1 { background-position: -1200px -540px}.sbnpc-dwarf_citizen_male_2 { background-position: -1320px -540px}.sbnpc-dwarf_citizen_male_3 { background-position: -1440px -540px}.sbnpc-dwarf_citizen_male_4 { background-position: -1560px -540px}.sbnpc-dwarf_council_female_5 { background-position: -1680px -540px}.sbnpc-dwarf_council_female_6 { background-position: -1800px -540px}.sbnpc-dwarf_council_female_7 { background-position: -1920px -540px}.sbnpc-dwarf_council_female_8 { background-position: -2040px -540px}.sbnpc-dwarf_council_male_1 { background-position: -2160px -540px}.sbnpc-dwarf_council_male_2 { background-position: -2280px -540px}.sbnpc-dwarf_council_male_3 { background-position: -2400px -540px}.sbnpc-dwarf_council_male_4 { background-position: -2520px -540px}.sbnpc-dwarf_militia_1 { background-position: -2640px -540px}.sbnpc-dwarf_militia_2 { background-position: -2760px -540px}.sbnpc-dwarf_militia_3 { background-position: 0 -810px}.sbnpc-dwarf_militia_4 { background-position: -120px -810px}.sbnpc-dwarf_militia_5 { background-position: -240px -810px}.sbnpc-dwarf_militia_6 { background-position: -360px -810px}.sbnpc-dwarf_royalguard_female_5 { background-position: -480px -810px}.sbnpc-dwarf_royalguard_female_6 { background-position: -600px -810px}.sbnpc-dwarf_royalguard_female_7 { background-position: -720px -810px}.sbnpc-dwarf_royalguard_female_8 { background-position: -840px -810px}.sbnpc-dwarf_royalguard_male_1 { background-position: -960px -810px}.sbnpc-dwarf_royalguard_male_2 { background-position: -1080px -810px}.sbnpc-dwarf_royalguard_male_3 { background-position: -1200px -810px}.sbnpc-dwarf_royalguard_male_4 { background-position: -1320px -810px}.sbnpc-economist_candidate { background-position: -1440px -810px}.sbnpc-elle { background-position: -1560px -810px}.sbnpc-emissary_female_1 { background-position: -1680px -810px}.sbnpc-emissary_female_2 { background-position: -1800px -810px}.sbnpc-emissary_female_3 { background-position: -1920px -810px}.sbnpc-emissary_male_1 { background-position: -2040px -810px}.sbnpc-emissary_male_2 { background-position: -2160px -810px}.sbnpc-emissary_male_3 { background-position: -2280px -810px}.sbnpc-end_dealer { background-position: -2400px -810px}.sbnpc-enderman_liquid_hot_magma { background-position: -2520px -810px}.sbnpc-enraged_revenant_horror { background-position: -2640px -810px}.sbnpc-entity_liquid_hot_magma { background-position: -2760px -810px}.sbnpc-event_master { background-position: 0 -1080px}.sbnpc-events_candidate { background-position: -120px -1080px}.sbnpc-fairy { background-position: -240px -1080px}.sbnpc-farm_merchant { background-position: -360px -1080px}.sbnpc-farmer { background-position: -480px -1080px}.sbnpc-farmer_jon { background-position: -600px -1080px}.sbnpc-fire_guy { background-position: -720px -1080px}.sbnpc-fish_merchant { background-position: -840px -1080px}.sbnpc-fisherman { background-position: -960px -1080px}.sbnpc-fishing_candidate { background-position: -1080px -1080px}.sbnpc-flamer_undead { background-position: -1200px -1080px}.sbnpc-forger { background-position: -1320px -1080px}.sbnpc-frank_undead { background-position: -1440px -1080px}.sbnpc-friendly_hiker { background-position: -1560px -1080px}.sbnpc-frost_undead { background-position: -1680px -1080px}.sbnpc-frosty { background-position: -1800px -1080px}.sbnpc-frozen_lost_adventurer { background-position: -1920px -1080px}.sbnpc-furry_e_boy { background-position: -2040px -1080px}.sbnpc-gatekeeper { background-position: -2160px -1080px}.sbnpc-giant_undead { background-position: -2280px -1080px}.sbnpc-goblin { background-position: -2400px -1080px}.sbnpc-goblin_armor_1 { background-position: -2520px -1080px}.sbnpc-goblin_armor_2 { background-position: -2640px -1080px}.sbnpc-goblin_armor_3 { background-position: -2760px -1080px}.sbnpc-goblin_armor_4 { background-position: 0 -1350px}.sbnpc-goblin_king_1 { background-position: -120px -1350px}.sbnpc-goblin_murderlover { background-position: -240px -1350px}.sbnpc-goblin_naked_1 { background-position: -360px -1350px}.sbnpc-goblin_naked_2 { background-position: -480px -1350px}.sbnpc-goblin_naked_3 { background-position: -600px -1350px}.sbnpc-goblin_naked_4 { background-position: -720px -1350px}.sbnpc-goblin_naked_5 { background-position: -840px -1350px}.sbnpc-gold_forger { background-position: -960px -1350px}.sbnpc-goon { background-position: -1080px -1350px}.sbnpc-grandma_wolf { background-position: -1200px -1350px}.sbnpc-great_white_shark { background-position: -1320px -1350px}.sbnpc-guber { background-position: -1440px -1350px}.sbnpc-guildford { background-position: -1560px -1350px}.sbnpc-gulliver { background-position: -1680px -1350px}.sbnpc-gustave { background-position: -1800px -1350px}.sbnpc-haymitch { background-position: -1920px -1350px}.sbnpc-hephaestus { background-position: -2040px -1350px}.sbnpc-holy_lost_adventurer { background-position: -2160px -1350px}.sbnpc-hub_selector { background-position: -2280px -1350px}.sbnpc-hungry_hiker { background-position: -2400px -1350px}.sbnpc-hunter_ava { background-position: -2520px -1350px}.sbnpc-ice_fisherman { background-position: -2640px -1350px}.sbnpc-iron_forger { background-position: -2760px -1350px}.sbnpc-jacob { background-position: 0 -1620px}.sbnpc-jake { background-position: -120px -1620px}.sbnpc-juliette { background-position: -240px -1620px}.sbnpc-kessie { background-position: -360px -1620px}.sbnpc-king_midas { background-position: -480px -1620px}.sbnpc-lapis_miner { background-position: -600px -1620px}.sbnpc-lazy_miner { background-position: -720px -1620px}.sbnpc-leech_undead { background-position: -840px -1620px}.sbnpc-lift_operator { background-position: -960px -1620px}.sbnpc-liquid_hot_magma { background-position: -1080px -1620px}.sbnpc-livid { background-position: -1200px -1620px}.sbnpc-livid_undead { background-position: -1320px -1620px}.sbnpc-lonely_philosopher { background-position: -1440px -1620px}.sbnpc-lumber_merchant { background-position: -1560px -1620px}.sbnpc-lumberjack { background-position: -1680px -1620px}.sbnpc-mason { background-position: -1800px -1620px}.sbnpc-master_tactician { background-position: -1920px -1620px}.sbnpc-mayhem_main { background-position: -2040px -1620px}.sbnpc-mayor { background-position: -2160px -1620px}.sbnpc-melancholic_viking { background-position: -2280px -1620px}.sbnpc-melody { background-position: -2400px -1620px}.sbnpc-mine_merchant { background-position: -2520px -1620px}.sbnpc-mining_candidate { background-position: -2640px -1620px}.sbnpc-minos_champion { background-position: -2760px -1620px}.sbnpc-minos_inquisitor { background-position: 0 -1890px}.sbnpc-minotaur { background-position: -120px -1890px}.sbnpc-mort { background-position: -240px -1890px}.sbnpc-mr_dead_undead { background-position: -360px -1890px}.sbnpc-mute_undead { background-position: -480px -1890px}.sbnpc-nitroholic { background-position: -600px -1890px}.sbnpc-nurse_shark { background-position: -720px -1890px}.sbnpc-old_man_garry { background-position: -840px -1890px}.sbnpc-ooze_undead { background-position: -960px -1890px}.sbnpc-ophelia { background-position: -1080px -1890px}.sbnpc-oringo { background-position: -1200px -1890px}.sbnpc-parasite_undead { background-position: -1320px -1890px}.sbnpc-pat { background-position: -1440px -1890px}.sbnpc-personal_bank_upgrader { background-position: -1560px -1890px}.sbnpc-pet_collector { background-position: -1680px -1890px}.sbnpc-pet_sitter { background-position: -1800px -1890px}.sbnpc-pets_candidate { background-position: -1920px -1890px}.sbnpc-placeholder_candidate { background-position: -2040px -1890px}.sbnpc-player_jerry { background-position: -2160px -1890px}.sbnpc-potato_king { background-position: -2280px -1890px}.sbnpc-professor { background-position: -2400px -1890px}.sbnpc-psycho_undead { background-position: -2520px -1890px}.sbnpc-putrid_undead { background-position: -2640px -1890px}.sbnpc-puzzler { background-position: -2760px -1890px}.sbnpc-rainmaker { background-position: 0 -2160px}.sbnpc-reaper_undead { background-position: -120px -2160px}.sbnpc-redstone_engineer { background-position: -240px -2160px}.sbnpc-refraction { background-position: -360px -2160px}.sbnpc-relenter { background-position: -480px -2160px}.sbnpc-revenant_horror { background-position: -600px -2160px}.sbnpc-revoker_undead { background-position: -720px -2160px}.sbnpc-rick { background-position: -840px -2160px}.sbnpc-romero_final { background-position: -960px -2160px}.sbnpc-romero_normal { background-position: -1080px -2160px}.sbnpc-sadan { background-position: -1200px -2160px}.sbnpc-salesman_christmas { background-position: -1320px -2160px}.sbnpc-salesman_easter { background-position: -1440px -2160px}.sbnpc-salesman_generic { background-position: -1560px -2160px}.sbnpc-salesman_halloween { background-position: -1680px -2160px}.sbnpc-salesman_summer { background-position: -1800px -2160px}.sbnpc-scarf_archer { background-position: -1920px -2160px}.sbnpc-scarf_mage { background-position: -2040px -2160px}.sbnpc-scarf_priest { background-position: -2160px -2160px}.sbnpc-scarf_undead { background-position: -2280px -2160px}.sbnpc-scarf_warrior { background-position: -2400px -2160px}.sbnpc-scoop { background-position: -2520px -2160px}.sbnpc-scorpius { background-position: -2640px -2160px}.sbnpc-shadow_assassin { background-position: -2760px -2160px}.sbnpc-shady_bartender { background-position: 0 -2430px}.sbnpc-shady_cousin { background-position: -120px -2430px}.sbnpc-shaggy { background-position: -240px -2430px}.sbnpc-shepherd { background-position: -360px -2430px}.sbnpc-simon_hat { background-position: -480px -2430px}.sbnpc-sirius { background-position: -600px -2430px}.sbnpc-skeletor_prime { background-position: -720px -2430px}.sbnpc-skull_undead { background-position: -840px -2430px}.sbnpc-slayer { background-position: -960px -2430px}.sbnpc-slayer_candidate { background-position: -1080px -2430px}.sbnpc-snowmaker { background-position: -1200px -2430px}.sbnpc-spirit_bear { background-position: -1320px -2430px}.sbnpc-spooky { background-position: -1440px -2430px}.sbnpc-st_jerry { background-position: -1560px -2430px}.sbnpc-sylent { background-position: -1680px -2430px}.sbnpc-tailor_assistant { background-position: -1800px -2430px}.sbnpc-tailor_owner { background-position: -1920px -2430px}.sbnpc-tammy { background-position: -2040px -2430px}.sbnpc-tear_undead { background-position: -2160px -2430px}.sbnpc-technoblade { background-position: -2280px -2430px}.sbnpc-terracotta { background-position: -2400px -2430px}.sbnpc-terry { background-position: -2520px -2430px}.sbnpc-thirty_virus { background-position: -2640px -2430px}.sbnpc-tiger_shark { background-position: -2760px -2430px}.sbnpc-timedeo { background-position: -2880px 0}.sbnpc-tomioka { background-position: -2880px -270px}.sbnpc-tony { background-position: -2880px -540px}.sbnpc-treasure_horder { background-position: -2880px -810px}.sbnpc-treasure_hunter { background-position: -2880px -1080px}.sbnpc-trevor { background-position: -2880px -1350px}.sbnpc-trinity { background-position: -2880px -1620px}.sbnpc-unstable_lost_adventurer { background-position: -2880px -1890px}.sbnpc-vader_undead { background-position: -2880px -2160px}.sbnpc-vinny { background-position: -2880px -2430px}.sbnpc-walker_undead { background-position: 0 -2700px}.sbnpc-walter { background-position: -120px -2700px}.sbnpc-weaponsmith { background-position: -240px -2700px}.sbnpc-weirdo_0 { background-position: -360px -2700px}.sbnpc-weirdo_1 { background-position: -480px -2700px}.sbnpc-weirdo_2 { background-position: -600px -2700px}.sbnpc-winona { background-position: -720px -2700px}.sbnpc-winter_banker { background-position: -840px -2700px}.sbnpc-wizard { background-position: -960px -2700px}.sbnpc-wizard_candidate { background-position: -1080px -2700px}.sbnpc-wizard_quest { background-position: -1200px -2700px}.sbnpc-wolf_shaman { background-position: -1320px -2700px}.sbnpc-wool_weaver { background-position: -1440px -2700px}.sbnpc-young_lost_adventurer { background-position: -1560px -2700px}.sbnpc-zog { background-position: -1680px -2700px}.sbnpc-zombie_commander { background-position: -1800px -2700px}.sbsprite-cobblestone_generator_10 { background-position: 0 0}.sbsprite-cobblestone_generator_11 { background-position: -22px 0}.sbsprite-danger_3_portal { background-position: -44px 0}.sbsprite-resource_regenerator_crystal { background-position: -66px 0}.sbsprite-sugar_cane_generator_12 { background-position: -88px 0}.sbsprite-cobblestone_generator_12 { background-position: -110px 0}.sbsprite-sugar_cane_generator_11 { background-position: -132px 0}.sbsprite-sugar_cane_generator_10 { background-position: -154px 0}.sbsprite-small_shelves { background-position: -176px 0}.sbsprite-bingo_talisman { background-position: -198px 0}.sbsprite-red_scarf { background-position: -220px 0}.sbsprite-wither_helmet { background-position: -242px 0}.sbsprite-glowstone_generator_11 { background-position: -264px 0}.sbsprite-glowstone_generator_10 { background-position: -286px 0}.sbsprite-fast_travel_crypt { background-position: -308px 0}.sbsprite-present_personality { background-position: -330px 0}.sbsprite-extra_large_gemstone_sack { background-position: -352px 0}.sbsprite-gold_bonzo_head { background-position: -374px 0}.sbsprite-shadow_assassin_mauve { background-position: -396px 0}.sbsprite-ender_artifact { background-position: -418px 0}.sbsprite-sheep_generator_1 { background-position: -440px 0}.sbsprite-beach_chair_plus { background-position: -462px 0}.sbsprite-sheep_generator_2 { background-position: -484px 0}.sbsprite-sheep_generator_3 { background-position: -506px 0}.sbsprite-sheep_generator_4 { background-position: -528px 0}.sbsprite-sheep_generator_5 { background-position: -550px 0}.sbsprite-sheep_generator_6 { background-position: -572px 0}.sbsprite-frozen_spider { background-position: -594px 0}.sbsprite-sheep_generator_7 { background-position: -616px 0}.sbsprite-sheep_generator_8 { background-position: -638px 0}.sbsprite-sheep_generator_9 { background-position: -660px 0}.sbsprite-nether_wart_island_crystal { background-position: -682px 0}.sbsprite-medium_fishing_sack { background-position: -704px 0}.sbsprite-gold_generator_9 { background-position: -726px 0}.sbsprite-gold_generator_7 { background-position: -748px 0}.sbsprite-gold_generator_8 { background-position: -770px 0}.sbsprite-gold_generator_5 { background-position: -792px 0}.sbsprite-penguin_10 { background-position: -814px 0}.sbsprite-diver_helmet { background-position: -836px 0}.sbsprite-gold_generator_6 { background-position: -858px 0}.sbsprite-penguin_11 { background-position: -880px 0}.sbsprite-gold_generator_3 { background-position: -902px 0}.sbsprite-gold_generator_4 { background-position: -924px 0}.sbsprite-pet_skin_sheep_purple { background-position: -946px 0}.sbsprite-gold_generator_1 { background-position: -968px 0}.sbsprite-gold_generator_2 { background-position: -990px 0}.sbsprite-jar_of_pickles { background-position: -1012px 0}.sbsprite-griffin_upgrade_stone_legendary { background-position: -1034px 0}.sbsprite-pet_skin_sheep_orange { background-position: 0 -22px}.sbsprite-talisman { background-position: -22px -22px}.sbsprite-jungle_generator_7 { background-position: -44px -22px}.sbsprite-jungle_generator_6 { background-position: -66px -22px}.sbsprite-tutti_frutti_poison { background-position: -88px -22px}.sbsprite-fishing_generator_11 { background-position: -110px -22px}.sbsprite-jungle_generator_9 { background-position: -132px -22px}.sbsprite-fishing_generator_10 { background-position: -154px -22px}.sbsprite-jungle_generator_8 { background-position: -176px -22px}.sbsprite-jungle_generator_3 { background-position: -198px -22px}.sbsprite-witch_mask { background-position: -220px -22px}.sbsprite-yellow { background-position: -242px -22px}.sbsprite-jungle_generator_2 { background-position: -264px -22px}.sbsprite-jungle_generator_5 { background-position: -286px -22px}.sbsprite-jungle_generator_4 { background-position: -308px -22px}.sbsprite-bat_person_artifact { background-position: -330px -22px}.sbsprite-cocoa_generator_11 { background-position: -352px -22px}.sbsprite-cocoa_generator_12 { background-position: -374px -22px}.sbsprite-jungle_generator_1 { background-position: -396px -22px}.sbsprite-cocoa_generator_10 { background-position: -418px -22px}.sbsprite-beheaded_horror { background-position: -440px -22px}.sbsprite-clay_generator_6 { background-position: -462px -22px}.sbsprite-clay_generator_7 { background-position: -484px -22px}.sbsprite-clay_generator_8 { background-position: -506px -22px}.sbsprite-clay_generator_9 { background-position: -528px -22px}.sbsprite-clay_generator_2 { background-position: -550px -22px}.sbsprite-clay_generator_3 { background-position: -572px -22px}.sbsprite-clay_generator_4 { background-position: -594px -22px}.sbsprite-clay_generator_5 { background-position: -616px -22px}.sbsprite-gold_livid_head { background-position: -638px -22px}.sbsprite-clay_generator_1 { background-position: -660px -22px}.sbsprite-medium_slayer_sack { background-position: -682px -22px}.sbsprite-pet_skin_wither { background-position: -704px -22px}.sbsprite-pink_frosted_donut_3 { background-position: -726px -22px}.sbsprite-pink_frosted_donut_2 { background-position: -748px -22px}.sbsprite-pink_frosted_donut_5 { background-position: -770px -22px}.sbsprite-garland { background-position: -792px -22px}.sbsprite-pink_frosted_donut_4 { background-position: -814px -22px}.sbsprite-pink_frosted_donut_7 { background-position: -836px -22px}.sbsprite-pink_frosted_donut_6 { background-position: -858px -22px}.sbsprite-pink_frosted_donut_9 { background-position: -880px -22px}.sbsprite-pink_frosted_donut_8 { background-position: -902px -22px}.sbsprite-rune_jerry { background-position: -924px -22px}.sbsprite-feather_ring { background-position: -946px -22px}.sbsprite-perfect_forge { background-position: -968px -22px}.sbsprite-bingo_relic { background-position: -990px -22px}.sbsprite-revenant_catalyst { background-position: -1012px -22px}.sbsprite-sun_2 { background-position: -1034px -22px}.sbsprite-sun_1 { background-position: 0 -44px}.sbsprite-pet_skin_tiger_twilight { background-position: -22px -44px}.sbsprite-blessing_of_life { background-position: -44px -44px}.sbsprite-plasma { background-position: -66px -44px}.sbsprite-carrot_patch { background-position: -88px -44px}.sbsprite-pink_frosted_donut_1 { background-position: -110px -44px}.sbsprite-bestiary_the_park { background-position: -132px -44px}.sbsprite-end_stone_10 { background-position: -154px -44px}.sbsprite-end_stone_11 { background-position: -176px -44px}.sbsprite-griffin_upgrade_stone_epic { background-position: -198px -44px}.sbsprite-iron_generator_10 { background-position: -220px -44px}.sbsprite-pet_skin_rock_embarrassed { background-position: -242px -44px}.sbsprite-fast_travel_barn { background-position: -264px -44px}.sbsprite-iron_generator_11 { background-position: -286px -44px}.sbsprite-iron_generator_12 { background-position: -308px -44px}.sbsprite-large_runes_sack { background-position: -330px -44px}.sbsprite-rune_redstone { background-position: -352px -44px}.sbsprite-horseman_candle { background-position: -374px -44px}.sbsprite-tepid_green_tea { background-position: -396px -44px}.sbsprite-large_agronomy_sack { background-position: -418px -44px}.sbsprite-wise_shimmer { background-position: -440px -44px}.sbsprite-maxor_the_fish { background-position: -462px -44px}.sbsprite-revenant_generator_4 { background-position: -484px -44px}.sbsprite-revenant_generator_5 { background-position: -506px -44px}.sbsprite-revenant_generator_6 { background-position: -528px -44px}.sbsprite-revenant_generator_7 { background-position: -550px -44px}.sbsprite-revenant_generator_1 { background-position: -572px -44px}.sbsprite-revenant_generator_2 { background-position: -594px -44px}.sbsprite-epoch_cake_orange { background-position: -616px -44px}.sbsprite-revenant_generator_3 { background-position: -638px -44px}.sbsprite-large_gemstone_sack { background-position: -660px -44px}.sbsprite-mender_crown { background-position: -682px -44px}.sbsprite-mummy_10 { background-position: -704px -44px}.sbsprite-revenant_generator_8 { background-position: -726px -44px}.sbsprite-revenant_generator_9 { background-position: -748px -44px}.sbsprite-mummy_11 { background-position: -770px -44px}.sbsprite-hard_stone_generator_9 { background-position: -792px -44px}.sbsprite-hard_stone_generator_8 { background-position: -814px -44px}.sbsprite-hard_stone_generator_7 { background-position: -836px -44px}.sbsprite-hard_stone_generator_6 { background-position: -858px -44px}.sbsprite-hard_stone_generator_5 { background-position: -880px -44px}.sbsprite-hard_stone_generator_4 { background-position: -902px -44px}.sbsprite-medium_talisman_bag { background-position: -924px -44px}.sbsprite-hard_stone_generator_3 { background-position: -946px -44px}.sbsprite-black_small_backpack { background-position: -968px -44px}.sbsprite-hard_stone_generator_2 { background-position: -990px -44px}.sbsprite-harp { background-position: -1012px -44px}.sbsprite-hard_stone_generator_1 { background-position: -1034px -44px}.sbsprite-pet_skin_sheep_green { background-position: 0 -66px}.sbsprite-magma_cube_generator_10 { background-position: -22px -66px}.sbsprite-fishing_crystal { background-position: -44px -66px}.sbsprite-magma_cube_generator_11 { background-position: -66px -66px}.sbsprite-rough_amber_gem { background-position: -88px -66px}.sbsprite-oak_generator_5 { background-position: -110px -66px}.sbsprite-oak_generator_4 { background-position: -132px -66px}.sbsprite-oak_generator_3 { background-position: -154px -66px}.sbsprite-oak_generator_2 { background-position: -176px -66px}.sbsprite-red_claw_ring { background-position: -198px -66px}.sbsprite-oak_generator_9 { background-position: -220px -66px}.sbsprite-oak_generator_8 { background-position: -242px -66px}.sbsprite-purple_small_backpack { background-position: -264px -66px}.sbsprite-oak_generator_7 { background-position: -286px -66px}.sbsprite-oak_generator_6 { background-position: -308px -66px}.sbsprite-picnic_set { background-position: -330px -66px}.sbsprite-oak_generator_1 { background-position: -352px -66px}.sbsprite-pet_skin_sheep_neon_red { background-position: -374px -66px}.sbsprite-hot_stuff { background-position: -396px -66px}.sbsprite-skeleton_generator_11 { background-position: -418px -66px}.sbsprite-skeleton_generator_10 { background-position: -440px -66px}.sbsprite-mayor_jerry { background-position: -462px -66px}.sbsprite-generals_armor_of_the_resistance_helmet { background-position: -484px -66px}.sbsprite-recall_potion { background-position: -506px -66px}.sbsprite-portable_builder { background-position: -528px -66px}.sbsprite-rune_ice { background-position: -550px -66px}.sbsprite-zombie_brain_mixin { background-position: -572px -66px}.sbsprite-pet_skin_rabbit_aquamarine { background-position: -594px -66px}.sbsprite-rune_music { background-position: -616px -66px}.sbsprite-magnetic_talisman { background-position: -638px -66px}.sbsprite-light_grey_jumbo_backpack { background-position: -660px -66px}.sbsprite-onyx { background-position: -682px -66px}.sbsprite-rune_fire { background-position: -704px -66px}.sbsprite-pet_skin_sheep_black { background-position: -726px -66px}.sbsprite-ice_fireplace { background-position: -748px -66px}.sbsprite-sun_personality { background-position: -770px -66px}.sbsprite-pet { background-position: -792px -66px}.sbsprite-melon_2 { background-position: -814px -66px}.sbsprite-melon_3 { background-position: -836px -66px}.sbsprite-epoch_cake_purple { background-position: -858px -66px}.sbsprite-melon_1 { background-position: -880px -66px}.sbsprite-krampus_helmet { background-position: -902px -66px}.sbsprite-coffee_table { background-position: -924px -66px}.sbsprite-necromancer_lord_helmet { background-position: -946px -66px}.sbsprite-melon_8 { background-position: -968px -66px}.sbsprite-blue_ice_hunk { background-position: -990px -66px}.sbsprite-divan_helmet { background-position: -1012px -66px}.sbsprite-melon_9 { background-position: -1034px -66px}.sbsprite-melon_6 { background-position: 0 -88px}.sbsprite-melon_7 { background-position: -22px -88px}.sbsprite-melon_4 { background-position: -44px -88px}.sbsprite-melon_5 { background-position: -66px -88px}.sbsprite-blue_candy { background-position: -88px -88px}.sbsprite-squid_hat { background-position: -110px -88px}.sbsprite-dungeon_green_support_orb { background-position: -132px -88px}.sbsprite-coin_diamond_3 { background-position: -154px -88px}.sbsprite-pink { background-position: -176px -88px}.sbsprite-coin_diamond_2 { background-position: -198px -88px}.sbsprite-repelling_candle { background-position: -220px -88px}.sbsprite-enderman_generator_11 { background-position: -242px -88px}.sbsprite-power_artifact { background-position: -264px -88px}.sbsprite-enderman_generator_10 { background-position: -286px -88px}.sbsprite-amethyst_crystal { background-position: -308px -88px}.sbsprite-crimson_essence { background-position: -330px -88px}.sbsprite-blue_small_backpack { background-position: -352px -88px}.sbsprite-grey_jumbo_backpack { background-position: -374px -88px}.sbsprite-wither_essence { background-position: -396px -88px}.sbsprite-brown_jumbo_backpack { background-position: -418px -88px}.sbsprite-archer_dungeon_ability_1 { background-position: -440px -88px}.sbsprite-crochet_tiger_plushie { background-position: -462px -88px}.sbsprite-final_destination_helmet { background-position: -484px -88px}.sbsprite-luxurious_spool { background-position: -506px -88px}.sbsprite-auto_recombobulator { background-position: -528px -88px}.sbsprite-killer_11 { background-position: -550px -88px}.sbsprite-spooky_bait { background-position: -572px -88px}.sbsprite-killer_10 { background-position: -594px -88px}.sbsprite-fast_travel_howl { background-position: -616px -88px}.sbsprite-etherwarp_conduit { background-position: -638px -88px}.sbsprite-forest_island_crystal { background-position: -660px -88px}.sbsprite-spirit_mask { background-position: -682px -88px}.sbsprite-sacks { background-position: -704px -88px}.sbsprite-obsidian_generator_10 { background-position: -726px -88px}.sbsprite-chicken_generator_10 { background-position: -748px -88px}.sbsprite-chicken_generator_12 { background-position: -770px -88px}.sbsprite-wood_singularity { background-position: -792px -88px}.sbsprite-chicken_generator_11 { background-position: -814px -88px}.sbsprite-sun_6 { background-position: -836px -88px}.sbsprite-builder_melon { background-position: -858px -88px}.sbsprite-santa_1 { background-position: -880px -88px}.sbsprite-sun_5 { background-position: -902px -88px}.sbsprite-dirt_bottle { background-position: -924px -88px}.sbsprite-sun_4 { background-position: -946px -88px}.sbsprite-handy_blood_chalice { background-position: -968px -88px}.sbsprite-sun_3 { background-position: -990px -88px}.sbsprite-sun_9 { background-position: -1012px -88px}.sbsprite-superior_fragment { background-position: -1034px -88px}.sbsprite-sun_8 { background-position: 0 -110px}.sbsprite-sun_7 { background-position: -22px -110px}.sbsprite-your_essence { background-position: -44px -110px}.sbsprite-pink_greater_backpack { background-position: -66px -110px}.sbsprite-unstable_fragment { background-position: -88px -110px}.sbsprite-obsidian_generator_11 { background-position: -110px -110px}.sbsprite-obsidian_generator_12 { background-position: -132px -110px}.sbsprite-perfect_sapphire_gem { background-position: -154px -110px}.sbsprite-gravel_generator_11 { background-position: -176px -110px}.sbsprite-gravel_generator_10 { background-position: -198px -110px}.sbsprite-candy_corn { background-position: -220px -110px}.sbsprite-mineral_talisman { background-position: -242px -110px}.sbsprite-divan_alloy { background-position: -264px -110px}.sbsprite-moil_log { background-position: -286px -110px}.sbsprite-super_magic_mushroom_soup { background-position: -308px -110px}.sbsprite-easter_basket { background-position: -330px -110px}.sbsprite-hunter_talisman { background-position: -352px -110px}.sbsprite-medium_potion_bag { background-position: -374px -110px}.sbsprite-pet_skin_megalodon_bullhead { background-position: -396px -110px}.sbsprite-broken_piggy_bank { background-position: -418px -110px}.sbsprite-mayor_technoblade { background-position: -440px -110px}.sbsprite-farming_talisman { background-position: -462px -110px}.sbsprite-flawed_sapphire_gem { background-position: -484px -110px}.sbsprite-light_blue_large_backpack { background-position: -506px -110px}.sbsprite-kindred { background-position: -528px -110px}.sbsprite-pocket_espresso_machine { background-position: -550px -110px}.sbsprite-overflux_power_orb { background-position: -572px -110px}.sbsprite-potato_spreading { background-position: -594px -110px}.sbsprite-acacia_generator_11 { background-position: -616px -110px}.sbsprite-birch_generator_6 { background-position: -638px -110px}.sbsprite-acacia_generator_10 { background-position: -660px -110px}.sbsprite-birch_generator_5 { background-position: -682px -110px}.sbsprite-birch_generator_4 { background-position: -704px -110px}.sbsprite-birch_generator_3 { background-position: -726px -110px}.sbsprite-holy_dragon_helmet { background-position: -748px -110px}.sbsprite-basketball_personality { background-position: -770px -110px}.sbsprite-birch_generator_9 { background-position: -792px -110px}.sbsprite-birch_generator_8 { background-position: -814px -110px}.sbsprite-birch_generator_7 { background-position: -836px -110px}.sbsprite-birch_generator_2 { background-position: -858px -110px}.sbsprite-birch_generator_1 { background-position: -880px -110px}.sbsprite-anubis { background-position: -902px -110px}.sbsprite-santa_8 { background-position: -924px -110px}.sbsprite-santa_9 { background-position: -946px -110px}.sbsprite-santa_6 { background-position: -968px -110px}.sbsprite-santa_7 { background-position: -990px -110px}.sbsprite-santa_4 { background-position: -1012px -110px}.sbsprite-candy_talisman { background-position: -1034px -110px}.sbsprite-santa_5 { background-position: 0 -132px}.sbsprite-santa_2 { background-position: -22px -132px}.sbsprite-santa_3 { background-position: -44px -132px}.sbsprite-small_combat_sack { background-position: -66px -132px}.sbsprite-speed_racer { background-position: -88px -132px}.sbsprite-pet_skin_parrot_blue_macaw { background-position: -110px -132px}.sbsprite-red_large_backpack { background-position: -132px -132px}.sbsprite-sea_archer_helmet { background-position: -154px -132px}.sbsprite-happy_mask { background-position: -176px -132px}.sbsprite-blue_large_backpack { background-position: -198px -132px}.sbsprite-enderman_generator_4 { background-position: -220px -132px}.sbsprite-enderman_generator_3 { background-position: -242px -132px}.sbsprite-enderman_generator_2 { background-position: -264px -132px}.sbsprite-enderman_generator_1 { background-position: -286px -132px}.sbsprite-enderman_generator_8 { background-position: -308px -132px}.sbsprite-enderman_generator_7 { background-position: -330px -132px}.sbsprite-enderman_generator_6 { background-position: -352px -132px}.sbsprite-enderman_generator_5 { background-position: -374px -132px}.sbsprite-green_candy { background-position: -396px -132px}.sbsprite-bestiary_milestone { background-position: -418px -132px}.sbsprite-colossal_exp_bottle_upgrade { background-position: -440px -132px}.sbsprite-sun_11 { background-position: -462px -132px}.sbsprite-sun_10 { background-position: -484px -132px}.sbsprite-vampire_witch_mask { background-position: -506px -132px}.sbsprite-pet_skin_sheep_yellow { background-position: -528px -132px}.sbsprite-bank_upgrade_palatial { background-position: -550px -132px}.sbsprite-flawed_ruby_gem { background-position: -572px -132px}.sbsprite-redstone_generator_9 { background-position: -594px -132px}.sbsprite-redstone_generator_7 { background-position: -616px -132px}.sbsprite-redstone_generator_8 { background-position: -638px -132px}.sbsprite-arachne_fragment { background-position: -660px -132px}.sbsprite-spider_generator_10 { background-position: -682px -132px}.sbsprite-spider_generator_11 { background-position: -704px -132px}.sbsprite-epoch_cake_red { background-position: -726px -132px}.sbsprite-orange_jumbo_backpack { background-position: -748px -132px}.sbsprite-giant_the_fish { background-position: -770px -132px}.sbsprite-minnow_bait { background-position: -792px -132px}.sbsprite-enderman_generator_9 { background-position: -814px -132px}.sbsprite-mastiff_puppy { background-position: -836px -132px}.sbsprite-talisman_enrichment_critical_damage { background-position: -858px -132px}.sbsprite-fast_travel_forge { background-position: -880px -132px}.sbsprite-goblin_omelette { background-position: -902px -132px}.sbsprite-builder_ancient_fruit { background-position: -924px -132px}.sbsprite-master_skull_tier_10 { background-position: -946px -132px}.sbsprite-hardened_wood { background-position: -968px -132px}.sbsprite-large_winter_sack { background-position: -990px -132px}.sbsprite-talisman_enrichment_intelligence { background-position: -1012px -132px}.sbsprite-snow_snowglobe { background-position: -1034px -132px}.sbsprite-summoning_eye { background-position: 0 -154px}.sbsprite-cavespider_generator_10 { background-position: -22px -154px}.sbsprite-clownfish_10 { background-position: -44px -154px}.sbsprite-cavespider_generator_11 { background-position: -66px -154px}.sbsprite-revenant_generator_12 { background-position: -88px -154px}.sbsprite-clownfish_11 { background-position: -110px -154px}.sbsprite-revenant_generator_11 { background-position: -132px -154px}.sbsprite-revenant_generator_10 { background-position: -154px -154px}.sbsprite-red_small_backpack { background-position: -176px -154px}.sbsprite-soulflow { background-position: -198px -154px}.sbsprite-farming_fortune { background-position: -220px -154px}.sbsprite-dungeon_stone_berserk { background-position: -242px -154px}.sbsprite-green_greater_backpack { background-position: -264px -154px}.sbsprite-mastiff_helmet { background-position: -286px -154px}.sbsprite-purple { background-position: -308px -154px}.sbsprite-skeleton_generator_7 { background-position: -330px -154px}.sbsprite-skeleton_generator_6 { background-position: -352px -154px}.sbsprite-skeleton_generator_9 { background-position: -374px -154px}.sbsprite-skeleton_generator_8 { background-position: -396px -154px}.sbsprite-speed_ring { background-position: -418px -154px}.sbsprite-skeleton_generator_3 { background-position: -440px -154px}.sbsprite-rabbit_hutch { background-position: -462px -154px}.sbsprite-skeleton_generator_2 { background-position: -484px -154px}.sbsprite-skeleton_generator_5 { background-position: -506px -154px}.sbsprite-minion_storage_expander { background-position: -528px -154px}.sbsprite-skeleton_generator_4 { background-position: -550px -154px}.sbsprite-werewolf_helmet { background-position: -572px -154px}.sbsprite-light_blue_small_backpack { background-position: -594px -154px}.sbsprite-skeleton_generator_1 { background-position: -616px -154px}.sbsprite-lapis_chest { background-position: -638px -154px}.sbsprite-healing_talisman { background-position: -660px -154px}.sbsprite-magma_cube_head { background-position: -682px -154px}.sbsprite-shadow_goggles { background-position: -704px -154px}.sbsprite-ice_generator_11 { background-position: -726px -154px}.sbsprite-fine_jasper_gem { background-position: -748px -154px}.sbsprite-candy_artifact { background-position: -770px -154px}.sbsprite-pet_skin_dragon_neon_blue { background-position: -792px -154px}.sbsprite-fast_travel_desert { background-position: -814px -154px}.sbsprite-rune_end { background-position: -836px -154px}.sbsprite-old_shimmer { background-position: -858px -154px}.sbsprite-skyblock_bench { background-position: -880px -154px}.sbsprite-hay_bale { background-position: -902px -154px}.sbsprite-crit_chance { background-position: -924px -154px}.sbsprite-dungeon_stone { background-position: -946px -154px}.sbsprite-artifact_potion_affinity { background-position: -968px -154px}.sbsprite-yoggie { background-position: -990px -154px}.sbsprite-starred_adaptive_helmet { background-position: -1012px -154px}.sbsprite-foraging_3_portal { background-position: -1034px -154px}.sbsprite-pet_skin_dragon_neon_red { background-position: 0 -176px}.sbsprite-ditto_skull { background-position: -22px -176px}.sbsprite-pig_generator_6 { background-position: -44px -176px}.sbsprite-redstone_generator_1 { background-position: -66px -176px}.sbsprite-pig_generator_5 { background-position: -88px -176px}.sbsprite-redstone_generator_2 { background-position: -110px -176px}.sbsprite-pig_generator_8 { background-position: -132px -176px}.sbsprite-pig_generator_7 { background-position: -154px -176px}.sbsprite-flawless_amethyst_gem { background-position: -176px -176px}.sbsprite-redstone_generator_5 { background-position: -198px -176px}.sbsprite-wither_catalyst { background-position: -220px -176px}.sbsprite-pig_generator_9 { background-position: -242px -176px}.sbsprite-redstone_generator_6 { background-position: -264px -176px}.sbsprite-cyan_jumbo_backpack { background-position: -286px -176px}.sbsprite-redstone_generator_3 { background-position: -308px -176px}.sbsprite-redstone_generator_4 { background-position: -330px -176px}.sbsprite-ice_generator_10 { background-position: -352px -176px}.sbsprite-pig_generator_2 { background-position: -374px -176px}.sbsprite-builder_lettuce { background-position: -396px -176px}.sbsprite-first_master_star { background-position: -418px -176px}.sbsprite-pig_generator_1 { background-position: -440px -176px}.sbsprite-pig_generator_4 { background-position: -462px -176px}.sbsprite-green_medium_backpack { background-position: -484px -176px}.sbsprite-pig_generator_3 { background-position: -506px -176px}.sbsprite-sugar_cane_generator_9 { background-position: -528px -176px}.sbsprite-greater_backpack { background-position: -550px -176px}.sbsprite-sugar_cane_generator_6 { background-position: -572px -176px}.sbsprite-sugar_cane_generator_5 { background-position: -594px -176px}.sbsprite-pet_skin_sheep_neon_blue { background-position: -616px -176px}.sbsprite-sugar_cane_generator_8 { background-position: -638px -176px}.sbsprite-sugar_cane_generator_7 { background-position: -660px -176px}.sbsprite-sugar_cane_generator_2 { background-position: -682px -176px}.sbsprite-sugar_cane_generator_1 { background-position: -704px -176px}.sbsprite-cauldron { background-position: -726px -176px}.sbsprite-sugar_cane_generator_4 { background-position: -748px -176px}.sbsprite-sugar_cane_generator_3 { background-position: -770px -176px}.sbsprite-wheat_island_crystal { background-position: -792px -176px}.sbsprite-boss_collection_scarf { background-position: -814px -176px}.sbsprite-deep_sea_orb { background-position: -836px -176px}.sbsprite-pet_skin_elephant_red { background-position: -858px -176px}.sbsprite-pink_large_backpack { background-position: -880px -176px}.sbsprite-gemstone_collection { background-position: -902px -176px}.sbsprite-carpentry_bench { background-position: -924px -176px}.sbsprite-pet_skin_wolf_henzo_doggo { background-position: -946px -176px}.sbsprite-sloth_11 { background-position: -968px -176px}.sbsprite-sloth_10 { background-position: -990px -176px}.sbsprite-vampire_mask { background-position: -1012px -176px}.sbsprite-reindeer_personality { background-position: -1034px -176px}.sbsprite-minos_hunter_helmet { background-position: 0 -198px}.sbsprite-catacombs_2 { background-position: -22px -198px}.sbsprite-catacombs_3 { background-position: -44px -198px}.sbsprite-catacombs_1 { background-position: -66px -198px}.sbsprite-catacombs_6 { background-position: -88px -198px}.sbsprite-small_runes_sack { background-position: -110px -198px}.sbsprite-catacombs_4 { background-position: -132px -198px}.sbsprite-catacombs_5 { background-position: -154px -198px}.sbsprite-clownfish_hat { background-position: -176px -198px}.sbsprite-fine_topaz_gem { background-position: -198px -198px}.sbsprite-beastmaster_crest_uncommon { background-position: -220px -198px}.sbsprite-superlite_motor { background-position: -242px -198px}.sbsprite-red_greater_backpack { background-position: -264px -198px}.sbsprite-hunter_ring { background-position: -286px -198px}.sbsprite-necromancer_brooch { background-position: -308px -198px}.sbsprite-spooky_shard { background-position: -330px -198px}.sbsprite-grey_medium_backpack { background-position: -352px -198px}.sbsprite-diamond_chest { background-position: -374px -198px}.sbsprite-slime_hat { background-position: -396px -198px}.sbsprite-hermit_crab_2 { background-position: -418px -198px}.sbsprite-enderman_cortex_rewriter { background-position: -440px -198px}.sbsprite-hermit_crab_1 { background-position: -462px -198px}.sbsprite-carrot_generator_11 { background-position: -484px -198px}.sbsprite-carrot_generator_12 { background-position: -506px -198px}.sbsprite-mushroom_generator_4 { background-position: -528px -198px}.sbsprite-carrot_generator_10 { background-position: -550px -198px}.sbsprite-mushroom_generator_3 { background-position: -572px -198px}.sbsprite-mushroom_generator_6 { background-position: -594px -198px}.sbsprite-mushroom_generator_5 { background-position: -616px -198px}.sbsprite-mushroom_generator_8 { background-position: -638px -198px}.sbsprite-mushroom_generator_7 { background-position: -660px -198px}.sbsprite-mushroom_generator_9 { background-position: -682px -198px}.sbsprite-diamond_professor_head { background-position: -704px -198px}.sbsprite-large_foraging_sack { background-position: -726px -198px}.sbsprite-robotron_reflector { background-position: -748px -198px}.sbsprite-wish_ultimate { background-position: -770px -198px}.sbsprite-tessellated_ender_pearl { background-position: -792px -198px}.sbsprite-pet_skin_sheep_red { background-position: -814px -198px}.sbsprite-spirit_decoy { background-position: -836px -198px}.sbsprite-stacked_pumpkins { background-position: -858px -198px}.sbsprite-medium_runes_sack { background-position: -880px -198px}.sbsprite-mushroom_generator_2 { background-position: -902px -198px}.sbsprite-young_dragon_helmet { background-position: -924px -198px}.sbsprite-mushroom_generator_1 { background-position: -946px -198px}.sbsprite-hermit_crab_6 { background-position: -968px -198px}.sbsprite-gravity_talisman { background-position: -990px -198px}.sbsprite-hermit_crab_5 { background-position: -1012px -198px}.sbsprite-hermit_crab_4 { background-position: -1034px -198px}.sbsprite-hermit_crab_3 { background-position: 0 -220px}.sbsprite-melon_10 { background-position: -22px -220px}.sbsprite-party_time_event { background-position: -44px -220px}.sbsprite-grinch_10 { background-position: -66px -220px}.sbsprite-melon_11 { background-position: -88px -220px}.sbsprite-hermit_crab_9 { background-position: -110px -220px}.sbsprite-hermit_crab_8 { background-position: -132px -220px}.sbsprite-grinch_11 { background-position: -154px -220px}.sbsprite-hermit_crab_7 { background-position: -176px -220px}.sbsprite-flower_generator_10 { background-position: -198px -220px}.sbsprite-race_giant_mushroom { background-position: -220px -220px}.sbsprite-flower_generator_11 { background-position: -242px -220px}.sbsprite-flower_generator_12 { background-position: -264px -220px}.sbsprite-redstone_chest { background-position: -286px -220px}.sbsprite-undead_catalyst { background-position: -308px -220px}.sbsprite-master_skull_tier_7 { background-position: -330px -220px}.sbsprite-reindeer_9 { background-position: -352px -220px}.sbsprite-master_skull_tier_6 { background-position: -374px -220px}.sbsprite-rune_slimy { background-position: -396px -220px}.sbsprite-master_skull_tier_9 { background-position: -418px -220px}.sbsprite-medium_shelves { background-position: -440px -220px}.sbsprite-master_skull_tier_8 { background-position: -462px -220px}.sbsprite-plasmaflux_power_orb { background-position: -484px -220px}.sbsprite-adaptive_helmet { background-position: -506px -220px}.sbsprite-pet_skin_endermite_radiant { background-position: -528px -220px}.sbsprite-master_skull_tier_1 { background-position: -550px -220px}.sbsprite-master_skull_tier_3 { background-position: -572px -220px}.sbsprite-oil_barrel { background-position: -594px -220px}.sbsprite-master_skull_tier_2 { background-position: -616px -220px}.sbsprite-master_skull_tier_5 { background-position: -638px -220px}.sbsprite-master_skull_tier_4 { background-position: -660px -220px}.sbsprite-pet_skin_guardian { background-position: -682px -220px}.sbsprite-flawless_jade_gem { background-position: -704px -220px}.sbsprite-survivor_cube { background-position: -726px -220px}.sbsprite-undead_2 { background-position: -748px -220px}.sbsprite-undead_3 { background-position: -770px -220px}.sbsprite-undead_4 { background-position: -792px -220px}.sbsprite-undead_5 { background-position: -814px -220px}.sbsprite-undead_6 { background-position: -836px -220px}.sbsprite-undead_7 { background-position: -858px -220px}.sbsprite-undead_8 { background-position: -880px -220px}.sbsprite-undead_9 { background-position: -902px -220px}.sbsprite-enchanted_book_bundle_vicious { background-position: -924px -220px}.sbsprite-endstone_chest { background-position: -946px -220px}.sbsprite-titanium_fuel_tank { background-position: -968px -220px}.sbsprite-golden_ball { background-position: -990px -220px}.sbsprite-undead_1 { background-position: -1012px -220px}.sbsprite-happy_emoji_5 { background-position: -1034px -220px}.sbsprite-reindeer_1 { background-position: 0 -242px}.sbsprite-warden_heart { background-position: -22px -242px}.sbsprite-happy_emoji_4 { background-position: -44px -242px}.sbsprite-reindeer_2 { background-position: -66px -242px}.sbsprite-happy_emoji_7 { background-position: -88px -242px}.sbsprite-reindeer_3 { background-position: -110px -242px}.sbsprite-happy_emoji_6 { background-position: -132px -242px}.sbsprite-kalhuiki_mask { background-position: -154px -242px}.sbsprite-reindeer_4 { background-position: -176px -242px}.sbsprite-happy_emoji_1 { background-position: -198px -242px}.sbsprite-reindeer_5 { background-position: -220px -242px}.sbsprite-reindeer_6 { background-position: -242px -242px}.sbsprite-happy_emoji_3 { background-position: -264px -242px}.sbsprite-reindeer_7 { background-position: -286px -242px}.sbsprite-happy_emoji_2 { background-position: -308px -242px}.sbsprite-reindeer_8 { background-position: -330px -242px}.sbsprite-happy_emoji_9 { background-position: -352px -242px}.sbsprite-festive_skeleton_personality { background-position: -374px -242px}.sbsprite-happy_emoji_8 { background-position: -396px -242px}.sbsprite-mimic_fragment { background-position: -418px -242px}.sbsprite-pet_skin_parrot_gold_macaw { background-position: -440px -242px}.sbsprite-mithril_drill_engine { background-position: -462px -242px}.sbsprite-titan_helmet { background-position: -484px -242px}.sbsprite-warden_helmet { background-position: -506px -242px}.sbsprite-nether_wart_pouch { background-position: -528px -242px}.sbsprite-red_nose { background-position: -550px -242px}.sbsprite-emerald_generator_12 { background-position: -572px -242px}.sbsprite-farming_1_portal { background-position: -594px -242px}.sbsprite-pet_skin_horse_zombie { background-position: -616px -242px}.sbsprite-devour_ring { background-position: -638px -242px}.sbsprite-mining_1_portal { background-position: -660px -242px}.sbsprite-builder_lilac_fruit { background-position: -682px -242px}.sbsprite-diamond_livid_head { background-position: -704px -242px}.sbsprite-fast_travel_dungeon_hub { background-position: -726px -242px}.sbsprite-emerald_generator_10 { background-position: -748px -242px}.sbsprite-emerald_generator_11 { background-position: -770px -242px}.sbsprite-bestiary_catacombs { background-position: -792px -242px}.sbsprite-fine_amber_gem { background-position: -814px -242px}.sbsprite-beach_ball_personality { background-position: -836px -242px}.sbsprite-cow_generator_11 { background-position: -858px -242px}.sbsprite-cow_generator_12 { background-position: -880px -242px}.sbsprite-mummy_personality { background-position: -902px -242px}.sbsprite-rune_wet { background-position: -924px -242px}.sbsprite-jumbo_backpack_upgrade { background-position: -946px -242px}.sbsprite-shadow_assassin_admiral { background-position: -968px -242px}.sbsprite-beating_heart { background-position: -990px -242px}.sbsprite-giant_tooth { background-position: -1012px -242px}.sbsprite-black_large_backpack { background-position: -1034px -242px}.sbsprite-corleonite { background-position: 0 -264px}.sbsprite-magma_cube_generator_1 { background-position: -22px -264px}.sbsprite-magma_cube_generator_5 { background-position: -44px -264px}.sbsprite-gold_candy { background-position: -66px -264px}.sbsprite-magma_cube_generator_4 { background-position: -88px -264px}.sbsprite-magma_cube_generator_3 { background-position: -110px -264px}.sbsprite-magma_cube_generator_2 { background-position: -132px -264px}.sbsprite-magma_cube_generator_9 { background-position: -154px -264px}.sbsprite-dining_table { background-position: -176px -264px}.sbsprite-magma_cube_generator_8 { background-position: -198px -264px}.sbsprite-magma_cube_generator_7 { background-position: -220px -264px}.sbsprite-magma_cube_generator_6 { background-position: -242px -264px}.sbsprite-sadan_brooch { background-position: -264px -264px}.sbsprite-birch_generator_11 { background-position: -286px -264px}.sbsprite-birch_generator_10 { background-position: -308px -264px}.sbsprite-strong_dragon_helmet { background-position: -330px -264px}.sbsprite-greater_enchanted_chest_upgrade { background-position: -352px -264px}.sbsprite-pink_frosted_donut_11 { background-position: -374px -264px}.sbsprite-molten_cube { background-position: -396px -264px}.sbsprite-pink_frosted_donut_10 { background-position: -418px -264px}.sbsprite-ultimate_carrot_candy_upgrade { background-position: -440px -264px}.sbsprite-old_baby { background-position: -462px -264px}.sbsprite-coin_lapis { background-position: -484px -264px}.sbsprite-superior_shimmer { background-position: -506px -264px}.sbsprite-diver_fragment { background-position: -528px -264px}.sbsprite-blue_greater_backpack { background-position: -550px -264px}.sbsprite-piggy_bank { background-position: -572px -264px}.sbsprite-flawed_jade_gem { background-position: -594px -264px}.sbsprite-dungeon_boss_key { background-position: -616px -264px}.sbsprite-spider_catalyst { background-position: -638px -264px}.sbsprite-shark_scale_helmet { background-position: -660px -264px}.sbsprite-ghost_book { background-position: -682px -264px}.sbsprite-titanium_alloy { background-position: -704px -264px}.sbsprite-pet_skin_enderman_slayer { background-position: -726px -264px}.sbsprite-hegemony_artifact { background-position: -748px -264px}.sbsprite-potion_affinity_talisman { background-position: -770px -264px}.sbsprite-trick_or_treat_bag { background-position: -792px -264px}.sbsprite-fake_gold_ring { background-position: -814px -264px}.sbsprite-dr_paper { background-position: -836px -264px}.sbsprite-fuel_tank { background-position: -858px -264px}.sbsprite-rough_amethyst_gem { background-position: -880px -264px}.sbsprite-flawless_sapphire_gem { background-position: -902px -264px}.sbsprite-pink_small_backpack { background-position: -924px -264px}.sbsprite-cow_generator_10 { background-position: -946px -264px}.sbsprite-mithril_infusion { background-position: -968px -264px}.sbsprite-beastmaster_crest_common { background-position: -990px -264px}.sbsprite-shiny_relic { background-position: -1012px -264px}.sbsprite-concentrated_stone { background-position: -1034px -264px}.sbsprite-sloth_personality { background-position: 0 -286px}.sbsprite-stocking { background-position: -22px -286px}.sbsprite-egg_pile { background-position: -44px -286px}.sbsprite-blessing_of_wisdom { background-position: -66px -286px}.sbsprite-happy_snowman { background-position: -88px -286px}.sbsprite-gingerbread_10 { background-position: -110px -286px}.sbsprite-gingerbread_11 { background-position: -132px -286px}.sbsprite-diamond_generator_11 { background-position: -154px -286px}.sbsprite-diamond_generator_10 { background-position: -176px -286px}.sbsprite-medium_backpack { background-position: -198px -286px}.sbsprite-rune_white_spiral { background-position: -220px -286px}.sbsprite-diamond_generator_12 { background-position: -242px -286px}.sbsprite-blacksmith_plus { background-position: -264px -286px}.sbsprite-light_blue_greater_backpack { background-position: -286px -286px}.sbsprite-watcher_eye { background-position: -308px -286px}.sbsprite-pet_skin_silverfish { background-position: -330px -286px}.sbsprite-rough_ruby_gem { background-position: -352px -286px}.sbsprite-fine_amethyst_gem { background-position: -374px -286px}.sbsprite-flawed_topaz_gem { background-position: -396px -286px}.sbsprite-spirit_bone { background-position: -418px -286px}.sbsprite-snow_blaster { background-position: -440px -286px}.sbsprite-unknown_item { background-position: -462px -286px}.sbsprite-spider_essence { background-position: -484px -286px}.sbsprite-light_bait { background-position: -506px -286px}.sbsprite-beastmaster_crest_legendary { background-position: -528px -286px}.sbsprite-mayor_diana { background-position: -550px -286px}.sbsprite-enchanted_jack_o_lantern { background-position: -572px -286px}.sbsprite-medium_foraging_sack { background-position: -594px -286px}.sbsprite-emerald_chest { background-position: -616px -286px}.sbsprite-carrot_generator_6 { background-position: -638px -286px}.sbsprite-reindeer_11 { background-position: -660px -286px}.sbsprite-carrot_generator_7 { background-position: -682px -286px}.sbsprite-reindeer_10 { background-position: -704px -286px}.sbsprite-carrot_generator_4 { background-position: -726px -286px}.sbsprite-carrot_generator_5 { background-position: -748px -286px}.sbsprite-carrot_generator_2 { background-position: -770px -286px}.sbsprite-carrot_generator_3 { background-position: -792px -286px}.sbsprite-carrot_generator_1 { background-position: -814px -286px}.sbsprite-carrot_generator_8 { background-position: -836px -286px}.sbsprite-dragon_scale { background-position: -858px -286px}.sbsprite-carrot_generator_9 { background-position: -880px -286px}.sbsprite-protector_dragon_helmet { background-position: -902px -286px}.sbsprite-rune_hearts { background-position: -924px -286px}.sbsprite-pet_skin_sheep_magenta { background-position: -946px -286px}.sbsprite-shadow_assassin_helmet { background-position: -968px -286px}.sbsprite-gemstone_gauntlet_gold { background-position: -990px -286px}.sbsprite-lucky_dice { background-position: -1012px -286px}.sbsprite-wolf_ring { background-position: -1034px -286px}.sbsprite-haunt_ability { background-position: 0 -308px}.sbsprite-undead_essence { background-position: -22px -308px}.sbsprite-bitter_ice_tea { background-position: -44px -308px}.sbsprite-beastmaster_crest_rare { background-position: -66px -308px}.sbsprite-enchanted_titanium { background-position: -88px -308px}.sbsprite-red_claw_talisman { background-position: -110px -308px}.sbsprite-intimidation_talisman { background-position: -132px -308px}.sbsprite-ice_bait { background-position: -154px -308px}.sbsprite-empty_soda_can { background-position: -176px -308px}.sbsprite-jerry_candy { background-position: -198px -308px}.sbsprite-ghast_generator_3 { background-position: -220px -308px}.sbsprite-fancy_flower_pot { background-position: -242px -308px}.sbsprite-ghast_generator_2 { background-position: -264px -308px}.sbsprite-cyan_greater_backpack { background-position: -286px -308px}.sbsprite-ghast_generator_5 { background-position: -308px -308px}.sbsprite-ghast_generator_4 { background-position: -330px -308px}.sbsprite-ghast_generator_7 { background-position: -352px -308px}.sbsprite-cold_ones { background-position: -374px -308px}.sbsprite-ghast_generator_6 { background-position: -396px -308px}.sbsprite-mega_jerry_lure { background-position: -418px -308px}.sbsprite-ghast_generator_9 { background-position: -440px -308px}.sbsprite-rune_smokey { background-position: -462px -308px}.sbsprite-ghast_generator_8 { background-position: -484px -308px}.sbsprite-healer_dungeon_ability_2 { background-position: -506px -308px}.sbsprite-healer_dungeon_ability_3 { background-position: -528px -308px}.sbsprite-ghast_generator_1 { background-position: -550px -308px}.sbsprite-brown_medium_backpack { background-position: -572px -308px}.sbsprite-healer_dungeon_ability_1 { background-position: -594px -308px}.sbsprite-ice_cream_2 { background-position: -616px -308px}.sbsprite-ice_cream_1 { background-position: -638px -308px}.sbsprite-ice_cream_4 { background-position: -660px -308px}.sbsprite-ice_cream_3 { background-position: -682px -308px}.sbsprite-ice_cream_6 { background-position: -704px -308px}.sbsprite-ice_cream_5 { background-position: -726px -308px}.sbsprite-ice_cream_8 { background-position: -748px -308px}.sbsprite-ice_cream_7 { background-position: -770px -308px}.sbsprite-ice_cream_9 { background-position: -792px -308px}.sbsprite-ice_cream_10 { background-position: -814px -308px}.sbsprite-ice_cream_11 { background-position: -836px -308px}.sbsprite-coin_iron { background-position: -858px -308px}.sbsprite-chewed_gum { background-position: -880px -308px}.sbsprite-training_weights { background-position: -902px -308px}.sbsprite-orange_large_backpack { background-position: -924px -308px}.sbsprite-campfire_talisman_24 { background-position: -946px -308px}.sbsprite-campfire_talisman_25 { background-position: -968px -308px}.sbsprite-campfire_talisman_26 { background-position: -990px -308px}.sbsprite-campfire_talisman_27 { background-position: -1012px -308px}.sbsprite-campfire_talisman_28 { background-position: -1034px -308px}.sbsprite-campfire_talisman_29 { background-position: 0 -330px}.sbsprite-candle_table { background-position: -22px -330px}.sbsprite-jingle_bells { background-position: -44px -330px}.sbsprite-lynx_talisman { background-position: -66px -330px}.sbsprite-campfire_talisman_20 { background-position: -88px -330px}.sbsprite-campfire_talisman_21 { background-position: -110px -330px}.sbsprite-campfire_talisman_22 { background-position: -132px -330px}.sbsprite-campfire_talisman_23 { background-position: -154px -330px}.sbsprite-perfect_ruby_gem { background-position: -176px -330px}.sbsprite-pet_skin_megalodon_baby { background-position: -198px -330px}.sbsprite-jungle_amulet { background-position: -220px -330px}.sbsprite-reaper_mask { background-position: -242px -330px}.sbsprite-enchanting_plus { background-position: -264px -330px}.sbsprite-catacombs_expert_ring { background-position: -286px -330px}.sbsprite-ice_knight_statue { background-position: -308px -330px}.sbsprite-bits_talisman { background-position: -330px -330px}.sbsprite-dark_orb { background-position: -352px -330px}.sbsprite-blessing_of_power { background-position: -374px -330px}.sbsprite-beastmaster_crest_epic { background-position: -396px -330px}.sbsprite-bulky_stone { background-position: -418px -330px}.sbsprite-yellow_small_backpack { background-position: -440px -330px}.sbsprite-small_potion_bag { background-position: -462px -330px}.sbsprite-green_jumbo_backpack { background-position: -484px -330px}.sbsprite-zombie_heart { background-position: -506px -330px}.sbsprite-pet_skin_black_cat_ivory { background-position: -528px -330px}.sbsprite-titanium_relic { background-position: -550px -330px}.sbsprite-fast_travel_jungle { background-position: -572px -330px}.sbsprite-pet_skin_rabbit { background-position: -594px -330px}.sbsprite-enderman_mask { background-position: -616px -330px}.sbsprite-perfect_amethyst_gem { background-position: -638px -330px}.sbsprite-boss_collection_sadan { background-position: -660px -330px}.sbsprite-blessing_of_stone { background-position: -682px -330px}.sbsprite-master_catacombs_pass_0 { background-position: -704px -330px}.sbsprite-snowman { background-position: -726px -330px}.sbsprite-candy_the_fish { background-position: -748px -330px}.sbsprite-gold_chest { background-position: -770px -330px}.sbsprite-master_catacombs_pass_6 { background-position: -792px -330px}.sbsprite-master_catacombs_pass_5 { background-position: -814px -330px}.sbsprite-master_catacombs_pass_8 { background-position: -836px -330px}.sbsprite-master_catacombs_pass_7 { background-position: -858px -330px}.sbsprite-master_catacombs_pass_2 { background-position: -880px -330px}.sbsprite-master_catacombs_pass_1 { background-position: -902px -330px}.sbsprite-master_catacombs_pass_4 { background-position: -924px -330px}.sbsprite-master_catacombs_pass_3 { background-position: -946px -330px}.sbsprite-candy_bowl { background-position: -968px -330px}.sbsprite-large_talisman_bag { background-position: -990px -330px}.sbsprite-secret_dungeon_redstone_key { background-position: -1012px -330px}.sbsprite-knockoff_cola { background-position: -1034px -330px}.sbsprite-grinch_2 { background-position: 0 -352px}.sbsprite-grinch_3 { background-position: -22px -352px}.sbsprite-grinch_4 { background-position: -44px -352px}.sbsprite-personal_bank_item { background-position: -66px -352px}.sbsprite-grinch_5 { background-position: -88px -352px}.sbsprite-grinch_6 { background-position: -110px -352px}.sbsprite-blessing_of_time { background-position: -132px -352px}.sbsprite-grinch_7 { background-position: -154px -352px}.sbsprite-grinch_8 { background-position: -176px -352px}.sbsprite-grinch_9 { background-position: -198px -352px}.sbsprite-crit_damage { background-position: -220px -352px}.sbsprite-grinch_1 { background-position: -242px -352px}.sbsprite-bunny_4 { background-position: -264px -352px}.sbsprite-bunny_3 { background-position: -286px -352px}.sbsprite-the_watchers_head { background-position: -308px -352px}.sbsprite-bunny_2 { background-position: -330px -352px}.sbsprite-bunny_1 { background-position: -352px -352px}.sbsprite-bunny_8 { background-position: -374px -352px}.sbsprite-bunny_7 { background-position: -396px -352px}.sbsprite-master_catacombs_pass_9 { background-position: -418px -352px}.sbsprite-bat_person_helmet { background-position: -440px -352px}.sbsprite-bunny_6 { background-position: -462px -352px}.sbsprite-bunny_5 { background-position: -484px -352px}.sbsprite-refined_amber { background-position: -506px -352px}.sbsprite-pet_skin_rock_derp { background-position: -528px -352px}.sbsprite-pet_skin_sheep_gray { background-position: -550px -352px}.sbsprite-flawed_amber_gem { background-position: -572px -352px}.sbsprite-pumpkin_11 { background-position: -594px -352px}.sbsprite-pumpkin_10 { background-position: -616px -352px}.sbsprite-white_small_backpack { background-position: -638px -352px}.sbsprite-blaze_hat { background-position: -660px -352px}.sbsprite-woodcutting_crystal { background-position: -682px -352px}.sbsprite-bunny_9 { background-position: -704px -352px}.sbsprite-roofed_forest_island { background-position: -726px -352px}.sbsprite-campfire_talisman_13 { background-position: -748px -352px}.sbsprite-campfire_talisman_14 { background-position: -770px -352px}.sbsprite-rune_lava { background-position: -792px -352px}.sbsprite-campfire_talisman_15 { background-position: -814px -352px}.sbsprite-campfire_talisman_16 { background-position: -836px -352px}.sbsprite-campfire_talisman_17 { background-position: -858px -352px}.sbsprite-campfire_talisman_18 { background-position: -880px -352px}.sbsprite-golden_dante_statue { background-position: -902px -352px}.sbsprite-campfire_talisman_19 { background-position: -924px -352px}.sbsprite-foraging_4_portal { background-position: -946px -352px}.sbsprite-new_year_cake_bag { background-position: -968px -352px}.sbsprite-santa_personality { background-position: -990px -352px}.sbsprite-campfire_talisman_10 { background-position: -1012px -352px}.sbsprite-campfire_talisman_11 { background-position: -1034px -352px}.sbsprite-campfire_talisman_12 { background-position: 0 -374px}.sbsprite-jerry_stone { background-position: -22px -374px}.sbsprite-cyclops_personality { background-position: -44px -374px}.sbsprite-desert_island_crystal { background-position: -66px -374px}.sbsprite-happy_emoji_personality { background-position: -88px -374px}.sbsprite-rough_sapphire_gem { background-position: -110px -374px}.sbsprite-fallen_star_hat { background-position: -132px -374px}.sbsprite-blaze_generator_10 { background-position: -154px -374px}.sbsprite-blaze_generator_11 { background-position: -176px -374px}.sbsprite-goblin_omelette_blue_cheese { background-position: -198px -374px}.sbsprite-treasure_artifact { background-position: -220px -374px}.sbsprite-hermit_crab_personality { background-position: -242px -374px}.sbsprite-orange { background-position: -264px -374px}.sbsprite-pond_island { background-position: -286px -374px}.sbsprite-fast_travel_void { background-position: -308px -374px}.sbsprite-transmission_tuner { background-position: -330px -374px}.sbsprite-bestiary_the_end { background-position: -352px -374px}.sbsprite-danger_1_portal { background-position: -374px -374px}.sbsprite-pink_jumbo_backpack { background-position: -396px -374px}.sbsprite-sea_walker_helmet { background-position: -418px -374px}.sbsprite-wise_fragment { background-position: -440px -374px}.sbsprite-jerry_talisman_golden { background-position: -462px -374px}.sbsprite-superior_baby { background-position: -484px -374px}.sbsprite-flower_bed { background-position: -506px -374px}.sbsprite-cactus_generator_1 { background-position: -528px -374px}.sbsprite-endstone_geode { background-position: -550px -374px}.sbsprite-holy_baby { background-position: -572px -374px}.sbsprite-cactus_generator_3 { background-position: -594px -374px}.sbsprite-cactus_generator_2 { background-position: -616px -374px}.sbsprite-cactus_generator_5 { background-position: -638px -374px}.sbsprite-cactus_generator_4 { background-position: -660px -374px}.sbsprite-cactus_generator_7 { background-position: -682px -374px}.sbsprite-cactus_generator_6 { background-position: -704px -374px}.sbsprite-cactus_generator_9 { background-position: -726px -374px}.sbsprite-protector_shimmer { background-position: -748px -374px}.sbsprite-cactus_generator_8 { background-position: -770px -374px}.sbsprite-rune_sparkling { background-position: -792px -374px}.sbsprite-bingo_ring { background-position: -814px -374px}.sbsprite-griffin_upgrade_stone_rare { background-position: -836px -374px}.sbsprite-chick_nest { background-position: -858px -374px}.sbsprite-solved_prism { background-position: -880px -374px}.sbsprite-king_talisman { background-position: -902px -374px}.sbsprite-treasure_ring { background-position: -924px -374px}.sbsprite-black_medium_backpack { background-position: -946px -374px}.sbsprite-surfboard { background-position: -968px -374px}.sbsprite-mithril_fuel_tank { background-position: -990px -374px}.sbsprite-fast_travel_home { background-position: -1012px -374px}.sbsprite-water_trough { background-position: -1034px -374px}.sbsprite-mayor_dante { background-position: 0 -396px}.sbsprite-cheese_fuel { background-position: -22px -396px}.sbsprite-pet_skin_lion_lioness { background-position: -44px -396px}.sbsprite-pink_bunny_personality { background-position: -66px -396px}.sbsprite-goldor_the_fish { background-position: -88px -396px}.sbsprite-speed_wither_helmet { background-position: -110px -396px}.sbsprite-pink_medium_backpack { background-position: -132px -396px}.sbsprite-mayor_derpy { background-position: -154px -396px}.sbsprite-talisman_enrichment_health { background-position: -176px -396px}.sbsprite-enderpack { background-position: -198px -396px}.sbsprite-pet_skin_rock_thinking { background-position: -220px -396px}.sbsprite-soul_fragment { background-position: -242px -396px}.sbsprite-skyblock_chair { background-position: -264px -396px}.sbsprite-mayor_paul { background-position: -286px -396px}.sbsprite-autopet_rules_2 { background-position: -308px -396px}.sbsprite-bat_talisman { background-position: -330px -396px}.sbsprite-killer_4 { background-position: -352px -396px}.sbsprite-killer_5 { background-position: -374px -396px}.sbsprite-killer_6 { background-position: -396px -396px}.sbsprite-killer_7 { background-position: -418px -396px}.sbsprite-killer_8 { background-position: -440px -396px}.sbsprite-killer_9 { background-position: -462px -396px}.sbsprite-builder_appalled_pumpkin { background-position: -484px -396px}.sbsprite-holy_shimmer { background-position: -506px -396px}.sbsprite-royal_pigeon { background-position: -528px -396px}.sbsprite-life_preserver { background-position: -550px -396px}.sbsprite-killer_1 { background-position: -572px -396px}.sbsprite-killer_2 { background-position: -594px -396px}.sbsprite-killer_3 { background-position: -616px -396px}.sbsprite-pet_skin_rock_cool { background-position: -638px -396px}.sbsprite-dingy { background-position: -660px -396px}.sbsprite-intimidation_ring { background-position: -682px -396px}.sbsprite-easter_egg_6 { background-position: -704px -396px}.sbsprite-builder_kiwi { background-position: -726px -396px}.sbsprite-easter_egg_5 { background-position: -748px -396px}.sbsprite-easter_egg_4 { background-position: -770px -396px}.sbsprite-rough_jade_gem { background-position: -792px -396px}.sbsprite-easter_egg_3 { background-position: -814px -396px}.sbsprite-easter_egg_2 { background-position: -836px -396px}.sbsprite-easter_egg_1 { background-position: -858px -396px}.sbsprite-snow_generator_11 { background-position: -880px -396px}.sbsprite-snow_generator_10 { background-position: -902px -396px}.sbsprite-easter_egg_9 { background-position: -924px -396px}.sbsprite-easter_egg_8 { background-position: -946px -396px}.sbsprite-easter_egg_7 { background-position: -968px -396px}.sbsprite-medium_gemstone_sack { background-position: -990px -396px}.sbsprite-large_enchanted_agronomy_sack { background-position: -1012px -396px}.sbsprite-blessed_fruit { background-position: -1034px -396px}.sbsprite-dungeon_stone_archer { background-position: 0 -418px}.sbsprite-arrow_swapper { background-position: -22px -418px}.sbsprite-snow_cannon { background-position: -44px -418px}.sbsprite-jerry_box_mega { background-position: -66px -418px}.sbsprite-pet_skin_sheep_brown { background-position: -88px -418px}.sbsprite-brewing_plus { background-position: -110px -418px}.sbsprite-mayor_barry { background-position: -132px -418px}.sbsprite-bat_ring { background-position: -154px -418px}.sbsprite-candle_arch { background-position: -176px -418px}.sbsprite-mithril_plate { background-position: -198px -418px}.sbsprite-carrot_bait { background-position: -220px -418px}.sbsprite-speed_artifact { background-position: -242px -418px}.sbsprite-salmon_hat { background-position: -264px -418px}.sbsprite-mini_sandcastle { background-position: -286px -418px}.sbsprite-scavenger_talisman { background-position: -308px -418px}.sbsprite-fast_travel_kuudra { background-position: -330px -418px}.sbsprite-foraging_fortune { background-position: -352px -418px}.sbsprite-bunny_personality { background-position: -374px -418px}.sbsprite-sandcastle_personality { background-position: -396px -418px}.sbsprite-undead_11 { background-position: -418px -418px}.sbsprite-magenta_jumbo_backpack { background-position: -440px -418px}.sbsprite-undead_10 { background-position: -462px -418px}.sbsprite-diamond_necron_head { background-position: -484px -418px}.sbsprite-wet_pumpkin { background-position: -506px -418px}.sbsprite-gemstone_gauntlet { background-position: -528px -418px}.sbsprite-cobblestone_generator_9 { background-position: -550px -418px}.sbsprite-cobblestone_generator_8 { background-position: -572px -418px}.sbsprite-iron_generator_1 { background-position: -594px -418px}.sbsprite-cobblestone_generator_7 { background-position: -616px -418px}.sbsprite-control_switch { background-position: -638px -418px}.sbsprite-iron_generator_2 { background-position: -660px -418px}.sbsprite-cobblestone_generator_6 { background-position: -682px -418px}.sbsprite-pumpkin_bomb { background-position: -704px -418px}.sbsprite-cobblestone_generator_5 { background-position: -726px -418px}.sbsprite-cobblestone_generator_4 { background-position: -748px -418px}.sbsprite-dwarven_tankard { background-position: -770px -418px}.sbsprite-jerry_talisman_purple { background-position: -792px -418px}.sbsprite-cobblestone_generator_3 { background-position: -814px -418px}.sbsprite-cobblestone_generator_2 { background-position: -836px -418px}.sbsprite-reindeer_plush { background-position: -858px -418px}.sbsprite-cobblestone_generator_1 { background-position: -880px -418px}.sbsprite-big_xtree { background-position: -902px -418px}.sbsprite-farming_island { background-position: -924px -418px}.sbsprite-rune_endersnake { background-position: -946px -418px}.sbsprite-rune { background-position: -968px -418px}.sbsprite-sweet_flesh { background-position: -990px -418px}.sbsprite-shark_10 { background-position: -1012px -418px}.sbsprite-shark_12 { background-position: -1034px -418px}.sbsprite-viking_tear { background-position: 0 -440px}.sbsprite-shark_11 { background-position: -22px -440px}.sbsprite-iron_generator_7 { background-position: -44px -440px}.sbsprite-iron_generator_8 { background-position: -66px -440px}.sbsprite-iron_generator_9 { background-position: -88px -440px}.sbsprite-beacon_skull { background-position: -110px -440px}.sbsprite-coin_gold_2 { background-position: -132px -440px}.sbsprite-iron_generator_3 { background-position: -154px -440px}.sbsprite-iron_generator_4 { background-position: -176px -440px}.sbsprite-sea_creature_ring { background-position: -198px -440px}.sbsprite-iron_generator_5 { background-position: -220px -440px}.sbsprite-iron_generator_6 { background-position: -242px -440px}.sbsprite-nether_warts_generator_7 { background-position: -264px -440px}.sbsprite-nether_warts_generator_8 { background-position: -286px -440px}.sbsprite-nether_warts_generator_9 { background-position: -308px -440px}.sbsprite-nether_warts_generator_3 { background-position: -330px -440px}.sbsprite-wolf_fur_mixin { background-position: -352px -440px}.sbsprite-mayor_marina { background-position: -374px -440px}.sbsprite-candy_ring { background-position: -396px -440px}.sbsprite-nether_warts_generator_4 { background-position: -418px -440px}.sbsprite-nether_warts_generator_5 { background-position: -440px -440px}.sbsprite-nether_warts_generator_6 { background-position: -462px -440px}.sbsprite-large_backpack { background-position: -484px -440px}.sbsprite-fine_sapphire_gem { background-position: -506px -440px}.sbsprite-nether_warts_generator_1 { background-position: -528px -440px}.sbsprite-nether_warts_generator_2 { background-position: -550px -440px}.sbsprite-griffin_upgrade_stone_uncommon { background-position: -572px -440px}.sbsprite-grey_greater_backpack { background-position: -594px -440px}.sbsprite-shiny_orb { background-position: -616px -440px}.sbsprite-large_enchanted_husbandry_sack { background-position: -638px -440px}.sbsprite-milk_cookies { background-position: -660px -440px}.sbsprite-spider_artifact { background-position: -682px -440px}.sbsprite-green_gift { background-position: -704px -440px}.sbsprite-fast_travel_park { background-position: -726px -440px}.sbsprite-jungle_heart { background-position: -748px -440px}.sbsprite-toil_log { background-position: -770px -440px}.sbsprite-absolute_ender_pearl { background-position: -792px -440px}.sbsprite-catacombs_pass_10 { background-position: -814px -440px}.sbsprite-protector_fragment { background-position: -836px -440px}.sbsprite-ice_generator_1 { background-position: -858px -440px}.sbsprite-ice_generator_2 { background-position: -880px -440px}.sbsprite-old_fragment { background-position: -902px -440px}.sbsprite-ice_generator_3 { background-position: -924px -440px}.sbsprite-traveling_zoo { background-position: -946px -440px}.sbsprite-ice_generator_4 { background-position: -968px -440px}.sbsprite-ice_generator_5 { background-position: -990px -440px}.sbsprite-ice_generator_6 { background-position: -1012px -440px}.sbsprite-ice_generator_7 { background-position: -1034px -440px}.sbsprite-ice_generator_8 { background-position: 0 -462px}.sbsprite-ice_generator_9 { background-position: -22px -462px}.sbsprite-lady_bug_personality { background-position: -44px -462px}.sbsprite-pet_skin_rock_laugh { background-position: -66px -462px}.sbsprite-experimentation_table { background-position: -88px -462px}.sbsprite-titanium_ore { background-position: -110px -462px}.sbsprite-blue_medium_backpack { background-position: -132px -462px}.sbsprite-ice_sofa { background-position: -154px -462px}.sbsprite-rune_lightning { background-position: -176px -462px}.sbsprite-tarantula_talisman { background-position: -198px -462px}.sbsprite-mayor_aatrox { background-position: -220px -462px}.sbsprite-race_crystal_core { background-position: -242px -462px}.sbsprite-black_cat_plush { background-position: -264px -462px}.sbsprite-small_agronomy_sack { background-position: -286px -462px}.sbsprite-magenta_greater_backpack { background-position: -308px -462px}.sbsprite-pet_skin_sheep_light_gray { background-position: -330px -462px}.sbsprite-diamond_scarf_head { background-position: -352px -462px}.sbsprite-hay_bed { background-position: -374px -462px}.sbsprite-talisman_enrichment_sea_creature_chance { background-position: -396px -462px}.sbsprite-strong_shimmer { background-position: -418px -462px}.sbsprite-shady_ring { background-position: -440px -462px}.sbsprite-dante_talisman { background-position: -462px -462px}.sbsprite-pink_bunny_1 { background-position: -484px -462px}.sbsprite-black_greater_backpack { background-position: -506px -462px}.sbsprite-builder_cactus { background-position: -528px -462px}.sbsprite-magenta_small_backpack { background-position: -550px -462px}.sbsprite-talisman_enrichment_defense { background-position: -572px -462px}.sbsprite-pink_bunny_3 { background-position: -594px -462px}.sbsprite-talisman_enrichment_magic_find { background-position: -616px -462px}.sbsprite-pink_bunny_2 { background-position: -638px -462px}.sbsprite-pink_bunny_5 { background-position: -660px -462px}.sbsprite-pink_bunny_4 { background-position: -682px -462px}.sbsprite-salmon_opal { background-position: -704px -462px}.sbsprite-pink_bunny_7 { background-position: -726px -462px}.sbsprite-pink_bunny_6 { background-position: -748px -462px}.sbsprite-pink_bunny_9 { background-position: -770px -462px}.sbsprite-pink_bunny_8 { background-position: -792px -462px}.sbsprite-refined_mithril { background-position: -814px -462px}.sbsprite-happy_emoji_10 { background-position: -836px -462px}.sbsprite-happy_emoji_11 { background-position: -858px -462px}.sbsprite-mine_talisman { background-position: -880px -462px}.sbsprite-old_dragon_helmet { background-position: -902px -462px}.sbsprite-boss_collection_livid { background-position: -924px -462px}.sbsprite-green_small_backpack { background-position: -946px -462px}.sbsprite-rune_bite { background-position: -968px -462px}.sbsprite-jungle_generator_11 { background-position: -990px -462px}.sbsprite-mega_luck { background-position: -1012px -462px}.sbsprite-jungle_generator_10 { background-position: -1034px -462px}.sbsprite-pet_skin_chicken_baby_chick { background-position: 0 -484px}.sbsprite-pile_of_cash { background-position: -22px -484px}.sbsprite-dungeoneering { background-position: -44px -484px}.sbsprite-base_griffin_upgrade_stone { background-position: -66px -484px}.sbsprite-red_tent { background-position: -88px -484px}.sbsprite-dungeon_red_support_orb { background-position: -110px -484px}.sbsprite-fast_travel_nether { background-position: -132px -484px}.sbsprite-night_vision_charm { background-position: -154px -484px}.sbsprite-zombie_grave { background-position: -176px -484px}.sbsprite-fish_bait { background-position: -198px -484px}.sbsprite-ice_lolly_personality { background-position: -220px -484px}.sbsprite-grizzly_paw { background-position: -242px -484px}.sbsprite-large_potion_bag { background-position: -264px -484px}.sbsprite-poorly_wrapped_rock { background-position: -286px -484px}.sbsprite-drill_engine { background-position: -308px -484px}.sbsprite-dark_oak_generator_10 { background-position: -330px -484px}.sbsprite-dungeon_normal_key { background-position: -352px -484px}.sbsprite-dark_oak_generator_11 { background-position: -374px -484px}.sbsprite-unstable_shimmer { background-position: -396px -484px}.sbsprite-green_egg { background-position: -418px -484px}.sbsprite-rough_topaz_gem { background-position: -440px -484px}.sbsprite-mana_flux_power_orb { background-position: -462px -484px}.sbsprite-amber_material { background-position: -484px -484px}.sbsprite-grinch_personality { background-position: -506px -484px}.sbsprite-fast_travel_crystals { background-position: -528px -484px}.sbsprite-lapis_generator_2 { background-position: -550px -484px}.sbsprite-lapis_generator_3 { background-position: -572px -484px}.sbsprite-rune_sack { background-position: -594px -484px}.sbsprite-lapis_generator_4 { background-position: -616px -484px}.sbsprite-tightly_tied_hay_bale { background-position: -638px -484px}.sbsprite-beach_ball { background-position: -660px -484px}.sbsprite-lapis_generator_5 { background-position: -682px -484px}.sbsprite-lapis_generator_10 { background-position: -704px -484px}.sbsprite-lapis_generator_12 { background-position: -726px -484px}.sbsprite-light_grey_large_backpack { background-position: -748px -484px}.sbsprite-lapis_generator_1 { background-position: -770px -484px}.sbsprite-lapis_generator_11 { background-position: -792px -484px}.sbsprite-pet_item_quick_claw { background-position: -814px -484px}.sbsprite-basketball_9 { background-position: -836px -484px}.sbsprite-deck_chair { background-position: -858px -484px}.sbsprite-lady_bug_9 { background-position: -880px -484px}.sbsprite-basketball_8 { background-position: -902px -484px}.sbsprite-lady_bug_8 { background-position: -924px -484px}.sbsprite-basketball_7 { background-position: -946px -484px}.sbsprite-basketball_6 { background-position: -968px -484px}.sbsprite-rune_pestilence { background-position: -990px -484px}.sbsprite-basketball_5 { background-position: -1012px -484px}.sbsprite-mithril_generator_12 { background-position: -1034px -484px}.sbsprite-sea_creature_talisman { background-position: 0 -506px}.sbsprite-basketball_4 { background-position: -22px -506px}.sbsprite-mithril_generator_11 { background-position: -44px -506px}.sbsprite-basketball_3 { background-position: -66px -506px}.sbsprite-mithril_generator_10 { background-position: -88px -506px}.sbsprite-basketball_2 { background-position: -110px -506px}.sbsprite-blue_egg { background-position: -132px -506px}.sbsprite-basketball_1 { background-position: -154px -506px}.sbsprite-lady_bug_1 { background-position: -176px -506px}.sbsprite-emerald_ring { background-position: -198px -506px}.sbsprite-lady_bug_3 { background-position: -220px -506px}.sbsprite-lady_bug_2 { background-position: -242px -506px}.sbsprite-lady_bug_5 { background-position: -264px -506px}.sbsprite-lapis_generator_6 { background-position: -286px -506px}.sbsprite-epoch_cake_green { background-position: -308px -506px}.sbsprite-lady_bug_4 { background-position: -330px -506px}.sbsprite-lapis_generator_7 { background-position: -352px -506px}.sbsprite-medium_husbandry_sack { background-position: -374px -506px}.sbsprite-bunny_11 { background-position: -396px -506px}.sbsprite-lady_bug_7 { background-position: -418px -506px}.sbsprite-lapis_generator_8 { background-position: -440px -506px}.sbsprite-bunny_10 { background-position: -462px -506px}.sbsprite-candy_relic { background-position: -484px -506px}.sbsprite-lady_bug_6 { background-position: -506px -506px}.sbsprite-lapis_generator_9 { background-position: -528px -506px}.sbsprite-red_jumbo_backpack { background-position: -550px -506px}.sbsprite-holy_fragment { background-position: -572px -506px}.sbsprite-ice_cream_personality { background-position: -594px -506px}.sbsprite-dungeon_blue_support_orb { background-position: -616px -506px}.sbsprite-blaze_generator_4 { background-position: -638px -506px}.sbsprite-blaze_generator_3 { background-position: -660px -506px}.sbsprite-blaze_generator_2 { background-position: -682px -506px}.sbsprite-blaze_generator_1 { background-position: -704px -506px}.sbsprite-blaze_generator_8 { background-position: -726px -506px}.sbsprite-blaze_generator_7 { background-position: -748px -506px}.sbsprite-pet_skin_whale_orca { background-position: -770px -506px}.sbsprite-blaze_generator_6 { background-position: -792px -506px}.sbsprite-blaze_generator_5 { background-position: -814px -506px}.sbsprite-deadgehog_helmet { background-position: -836px -506px}.sbsprite-volta { background-position: -858px -506px}.sbsprite-blaze_generator_9 { background-position: -880px -506px}.sbsprite-frozen_chicken { background-position: -902px -506px}.sbsprite-pet_skin_dragon_neon_purple { background-position: -924px -506px}.sbsprite-cavespider_generator_6 { background-position: -946px -506px}.sbsprite-cavespider_generator_5 { background-position: -968px -506px}.sbsprite-rune_gem { background-position: -990px -506px}.sbsprite-cavespider_generator_8 { background-position: -1012px -506px}.sbsprite-cavespider_generator_7 { background-position: -1034px -506px}.sbsprite-cavespider_generator_2 { background-position: 0 -528px}.sbsprite-cavespider_generator_1 { background-position: -22px -528px}.sbsprite-cavespider_generator_4 { background-position: -44px -528px}.sbsprite-jerry_talisman_blue { background-position: -66px -528px}.sbsprite-cavespider_generator_3 { background-position: -88px -528px}.sbsprite-speed_talisman { background-position: -110px -528px}.sbsprite-mummy_1 { background-position: -132px -528px}.sbsprite-rabbit_hat { background-position: -154px -528px}.sbsprite-bat_person_ring { background-position: -176px -528px}.sbsprite-mummy_3 { background-position: -198px -528px}.sbsprite-cavespider_generator_9 { background-position: -220px -528px}.sbsprite-mummy_2 { background-position: -242px -528px}.sbsprite-mummy_5 { background-position: -264px -528px}.sbsprite-strong_baby { background-position: -286px -528px}.sbsprite-mummy_4 { background-position: -308px -528px}.sbsprite-mummy_7 { background-position: -330px -528px}.sbsprite-mummy_6 { background-position: -352px -528px}.sbsprite-spooky_helmet { background-position: -374px -528px}.sbsprite-dining_chair { background-position: -396px -528px}.sbsprite-mummy_9 { background-position: -418px -528px}.sbsprite-mummy_8 { background-position: -440px -528px}.sbsprite-ender_relic { background-position: -462px -528px}.sbsprite-flawed_jasper_gem { background-position: -484px -528px}.sbsprite-cactus_generator_10 { background-position: -506px -528px}.sbsprite-pet_skin_silverfish_fossilized { background-position: -528px -528px}.sbsprite-cactus_generator_11 { background-position: -550px -528px}.sbsprite-cactus_generator_12 { background-position: -572px -528px}.sbsprite-dark_goggles { background-position: -594px -528px}.sbsprite-starred_bonzo_mask { background-position: -616px -528px}.sbsprite-pigs_foot { background-position: -638px -528px}.sbsprite-gemstone_mixture { background-position: -660px -528px}.sbsprite-tarantula_black_widow { background-position: -682px -528px}.sbsprite-builder_berry_bush { background-position: -704px -528px}.sbsprite-chicken_head { background-position: -726px -528px}.sbsprite-pet_skin_elephant_purple { background-position: -748px -528px}.sbsprite-cow_head { background-position: -770px -528px}.sbsprite-witch_broomstick { background-position: -792px -528px}.sbsprite-pet_skin_monkey_gorilla { background-position: -814px -528px}.sbsprite-grey_large_backpack { background-position: -836px -528px}.sbsprite-pet_skin_sheep_neon_green { background-position: -858px -528px}.sbsprite-magic_mushroom_soup { background-position: -880px -528px}.sbsprite-petrified_starfall { background-position: -902px -528px}.sbsprite-spruce_generator_9 { background-position: -924px -528px}.sbsprite-second_master_star { background-position: -946px -528px}.sbsprite-sled { background-position: -968px -528px}.sbsprite-spruce_generator_1 { background-position: -990px -528px}.sbsprite-voidling_generator_2 { background-position: -1012px -528px}.sbsprite-red { background-position: -1034px -528px}.sbsprite-spirit_wing { background-position: 0 -550px}.sbsprite-spruce_generator_2 { background-position: -22px -550px}.sbsprite-voidling_generator_1 { background-position: -44px -550px}.sbsprite-spruce_generator_3 { background-position: -66px -550px}.sbsprite-voidling_generator_4 { background-position: -88px -550px}.sbsprite-spruce_generator_4 { background-position: -110px -550px}.sbsprite-voidling_generator_3 { background-position: -132px -550px}.sbsprite-spruce_generator_5 { background-position: -154px -550px}.sbsprite-voidling_generator_6 { background-position: -176px -550px}.sbsprite-spruce_generator_6 { background-position: -198px -550px}.sbsprite-voidling_generator_5 { background-position: -220px -550px}.sbsprite-spruce_generator_7 { background-position: -242px -550px}.sbsprite-voidling_generator_8 { background-position: -264px -550px}.sbsprite-spruce_generator_8 { background-position: -286px -550px}.sbsprite-voidling_generator_7 { background-position: -308px -550px}.sbsprite-voidling_generator_9 { background-position: -330px -550px}.sbsprite-magenta_large_backpack { background-position: -352px -550px}.sbsprite-fast_travel_end { background-position: -374px -550px}.sbsprite-cow_generator_8 { background-position: -396px -550px}.sbsprite-cow_generator_9 { background-position: -418px -550px}.sbsprite-present_1 { background-position: -440px -550px}.sbsprite-topaz_crystal { background-position: -462px -550px}.sbsprite-bestiary_private_island { background-position: -484px -550px}.sbsprite-present_2 { background-position: -506px -550px}.sbsprite-present_3 { background-position: -528px -550px}.sbsprite-cow_generator_1 { background-position: -550px -550px}.sbsprite-cow_generator_2 { background-position: -572px -550px}.sbsprite-dragon_horn { background-position: -594px -550px}.sbsprite-bat_artifact { background-position: -616px -550px}.sbsprite-cow_generator_3 { background-position: -638px -550px}.sbsprite-cow_generator_4 { background-position: -660px -550px}.sbsprite-cow_generator_5 { background-position: -682px -550px}.sbsprite-cow_generator_6 { background-position: -704px -550px}.sbsprite-cow_generator_7 { background-position: -726px -550px}.sbsprite-goblin_omelette_pesto { background-position: -748px -550px}.sbsprite-farming_2_portal { background-position: -770px -550px}.sbsprite-village_talisman { background-position: -792px -550px}.sbsprite-cheetah_talisman { background-position: -814px -550px}.sbsprite-mining_2_portal { background-position: -836px -550px}.sbsprite-present_8 { background-position: -858px -550px}.sbsprite-wood_talisman { background-position: -880px -550px}.sbsprite-present_9 { background-position: -902px -550px}.sbsprite-present_4 { background-position: -924px -550px}.sbsprite-present_5 { background-position: -946px -550px}.sbsprite-present_6 { background-position: -968px -550px}.sbsprite-present_7 { background-position: -990px -550px}.sbsprite-healing_ring { background-position: -1012px -550px}.sbsprite-titanium_artifact { background-position: -1034px -550px}.sbsprite-penguin_1 { background-position: 0 -572px}.sbsprite-penguin_2 { background-position: -22px -572px}.sbsprite-ruby_crystal { background-position: -44px -572px}.sbsprite-tiki_torch { background-position: -66px -572px}.sbsprite-wheat_generator_10 { background-position: -88px -572px}.sbsprite-emerald_generator_8 { background-position: -110px -572px}.sbsprite-wheat_generator_12 { background-position: -132px -572px}.sbsprite-emerald_generator_7 { background-position: -154px -572px}.sbsprite-wheat_generator_11 { background-position: -176px -572px}.sbsprite-scarecrow { background-position: -198px -572px}.sbsprite-emerald_generator_9 { background-position: -220px -572px}.sbsprite-emerald_generator_4 { background-position: -242px -572px}.sbsprite-emerald_generator_3 { background-position: -264px -572px}.sbsprite-emerald_generator_6 { background-position: -286px -572px}.sbsprite-emerald_generator_5 { background-position: -308px -572px}.sbsprite-pet_skin_elephant_monochrome { background-position: -330px -572px}.sbsprite-emerald_generator_2 { background-position: -352px -572px}.sbsprite-emerald_generator_1 { background-position: -374px -572px}.sbsprite-flawless_topaz_gem { background-position: -396px -572px}.sbsprite-raw_soulflow { background-position: -418px -572px}.sbsprite-large_enchanted_mining_sack { background-position: -440px -572px}.sbsprite-gold_scarf_head { background-position: -462px -572px}.sbsprite-orange_medium_backpack { background-position: -484px -572px}.sbsprite-fine_jade_gem { background-position: -506px -572px}.sbsprite-white_gift { background-position: -528px -572px}.sbsprite-goblin_omelette_sunny_side { background-position: -550px -572px}.sbsprite-builder_brown_mushroom { background-position: -572px -572px}.sbsprite-giant_flesh { background-position: -594px -572px}.sbsprite-jumbo_backpack { background-position: -616px -572px}.sbsprite-eternal_flame_ring { background-position: -638px -572px}.sbsprite-wrapped_gift_for_juliette { background-position: -660px -572px}.sbsprite-enchanted_book_bundle_counter_strike { background-position: -682px -572px}.sbsprite-pet_item_toy_jerry { background-position: -704px -572px}.sbsprite-golden_plate { background-position: -726px -572px}.sbsprite-penguin_5 { background-position: -748px -572px}.sbsprite-grandfather_clock { background-position: -770px -572px}.sbsprite-penguin_6 { background-position: -792px -572px}.sbsprite-penguin_3 { background-position: -814px -572px}.sbsprite-pet_skin_elephant_orange { background-position: -836px -572px}.sbsprite-fast_travel_museum { background-position: -858px -572px}.sbsprite-penguin_4 { background-position: -880px -572px}.sbsprite-penguin_9 { background-position: -902px -572px}.sbsprite-penguin_7 { background-position: -924px -572px}.sbsprite-penguin_8 { background-position: -946px -572px}.sbsprite-light_grey_medium_backpack { background-position: -968px -572px}.sbsprite-blue_jumbo_backpack { background-position: -990px -572px}.sbsprite-cyan_small_backpack { background-position: -1012px -572px}.sbsprite-jade_crystal { background-position: -1034px -572px}.sbsprite-large_dungeon_sack { background-position: 0 -594px}.sbsprite-summoning_ring { background-position: -22px -594px}.sbsprite-dragon_essence { background-position: -44px -594px}.sbsprite-basket_of_seeds { background-position: -66px -594px}.sbsprite-bunny_jerry { background-position: -88px -594px}.sbsprite-perfect_jade_gem { background-position: -110px -594px}.sbsprite-spray_can { background-position: -132px -594px}.sbsprite-campfire_talisman_4 { background-position: -154px -594px}.sbsprite-campfire_talisman_5 { background-position: -176px -594px}.sbsprite-campfire_talisman_2 { background-position: -198px -594px}.sbsprite-campfire_talisman_3 { background-position: -220px -594px}.sbsprite-remnant_of_the_eye { background-position: -242px -594px}.sbsprite-campfire_talisman_1 { background-position: -264px -594px}.sbsprite-talisman_enrichment_critical_chance { background-position: -286px -594px}.sbsprite-ghast_head { background-position: -308px -594px}.sbsprite-white_greater_backpack { background-position: -330px -594px}.sbsprite-mayor_diaz { background-position: -352px -594px}.sbsprite-campfire_talisman_8 { background-position: -374px -594px}.sbsprite-campfire_talisman_9 { background-position: -396px -594px}.sbsprite-jaderald { background-position: -418px -594px}.sbsprite-campfire_talisman_6 { background-position: -440px -594px}.sbsprite-gold_thorn_head { background-position: -462px -594px}.sbsprite-campfire_talisman_7 { background-position: -484px -594px}.sbsprite-dark_bait { background-position: -506px -594px}.sbsprite-game_annihilator { background-position: -528px -594px}.sbsprite-purple_greater_backpack { background-position: -550px -594px}.sbsprite-bestiary_deep_caverns { background-position: -572px -594px}.sbsprite-foraging_5_portal { background-position: -594px -594px}.sbsprite-wolf_talisman { background-position: -616px -594px}.sbsprite-gold_professor_head { background-position: -638px -594px}.sbsprite-pet_skin_sheep_light_blue { background-position: -660px -594px}.sbsprite-ice_lolly_4 { background-position: -682px -594px}.sbsprite-basketball_10 { background-position: -704px -594px}.sbsprite-ice_lolly_3 { background-position: -726px -594px}.sbsprite-mineral_helmet { background-position: -748px -594px}.sbsprite-basketball_11 { background-position: -770px -594px}.sbsprite-ice_lolly_2 { background-position: -792px -594px}.sbsprite-basketball_12 { background-position: -814px -594px}.sbsprite-ice_lolly_1 { background-position: -836px -594px}.sbsprite-rock_candy { background-position: -858px -594px}.sbsprite-ice_lolly_8 { background-position: -880px -594px}.sbsprite-tarantula_generator_2 { background-position: -902px -594px}.sbsprite-ice_lolly_7 { background-position: -924px -594px}.sbsprite-tarantula_generator_1 { background-position: -946px -594px}.sbsprite-ice_lolly_6 { background-position: -968px -594px}.sbsprite-ice_lolly_5 { background-position: -990px -594px}.sbsprite-purple_egg { background-position: -1012px -594px}.sbsprite-ice_lolly_9 { background-position: -1034px -594px}.sbsprite-tarantula_generator_9 { background-position: 0 -616px}.sbsprite-tarantula_generator_8 { background-position: -22px -616px}.sbsprite-tarantula_generator_7 { background-position: -44px -616px}.sbsprite-tarantula_generator_6 { background-position: -66px -616px}.sbsprite-tarantula_generator_5 { background-position: -88px -616px}.sbsprite-tarantula_generator_4 { background-position: -110px -616px}.sbsprite-tarantula_generator_3 { background-position: -132px -616px}.sbsprite-hypixel_castle { background-position: -154px -616px}.sbsprite-rune_golden { background-position: -176px -616px}.sbsprite-wheat_generator_9 { background-position: -198px -616px}.sbsprite-ftx_3070 { background-position: -220px -616px}.sbsprite-wheat_generator_8 { background-position: -242px -616px}.sbsprite-wheat_generator_5 { background-position: -264px -616px}.sbsprite-wheat_generator_4 { background-position: -286px -616px}.sbsprite-builder_corn { background-position: -308px -616px}.sbsprite-cheap_coffee { background-position: -330px -616px}.sbsprite-wheat_generator_7 { background-position: -352px -616px}.sbsprite-wheat_generator_6 { background-position: -374px -616px}.sbsprite-mushroom_generator_11 { background-position: -396px -616px}.sbsprite-wheat_generator_1 { background-position: -418px -616px}.sbsprite-mushroom_generator_10 { background-position: -440px -616px}.sbsprite-ender_plus { background-position: -462px -616px}.sbsprite-wheat_generator_3 { background-position: -484px -616px}.sbsprite-wheat_generator_2 { background-position: -506px -616px}.sbsprite-voidling_generator_10 { background-position: -528px -616px}.sbsprite-voidling_generator_11 { background-position: -550px -616px}.sbsprite-mushroom_generator_12 { background-position: -572px -616px}.sbsprite-personal_bonus { background-position: -594px -616px}.sbsprite-flawless_amber_gem { background-position: -616px -616px}.sbsprite-rune_darkness_within { background-position: -638px -616px}.sbsprite-bag_of_cash { background-position: -660px -616px}.sbsprite-pet_skin_hound_beagle { background-position: -682px -616px}.sbsprite-pufferfish_hat { background-position: -704px -616px}.sbsprite-lime_greater_backpack { background-position: -726px -616px}.sbsprite-food_trough { background-position: -748px -616px}.sbsprite-pet_skin_yeti_grown_up { background-position: -770px -616px}.sbsprite-slime_generator_10 { background-position: -792px -616px}.sbsprite-undead_personality { background-position: -814px -616px}.sbsprite-slime_generator_11 { background-position: -836px -616px}.sbsprite-nether_wart_island { background-position: -858px -616px}.sbsprite-gravel_generator_5 { background-position: -880px -616px}.sbsprite-gravel_generator_4 { background-position: -902px -616px}.sbsprite-gravel_generator_7 { background-position: -924px -616px}.sbsprite-gravel_generator_6 { background-position: -946px -616px}.sbsprite-gravel_generator_9 { background-position: -968px -616px}.sbsprite-gravel_generator_8 { background-position: -990px -616px}.sbsprite-shiny_shard { background-position: -1012px -616px}.sbsprite-pet_skin_rabbit_rose { background-position: -1034px -616px}.sbsprite-quiver { background-position: 0 -638px}.sbsprite-rune_snake { background-position: -22px -638px}.sbsprite-bonzo_mask { background-position: -44px -638px}.sbsprite-fast_travel { background-position: -66px -638px}.sbsprite-treasurite { background-position: -88px -638px}.sbsprite-chicken_coop { background-position: -110px -638px}.sbsprite-end_portal_fumes_mixin { background-position: -132px -638px}.sbsprite-crafting_plus { background-position: -154px -638px}.sbsprite-gravel_generator_1 { background-position: -176px -638px}.sbsprite-gravel_generator_3 { background-position: -198px -638px}.sbsprite-gravel_generator_2 { background-position: -220px -638px}.sbsprite-easter_egg_11 { background-position: -242px -638px}.sbsprite-easter_egg_10 { background-position: -264px -638px}.sbsprite-protein_bar { background-position: -286px -638px}.sbsprite-hard_stone_generator_10 { background-position: -308px -638px}.sbsprite-coin_gold { background-position: -330px -638px}.sbsprite-light_blue_jumbo_backpack { background-position: -352px -638px}.sbsprite-hard_stone_generator_12 { background-position: -374px -638px}.sbsprite-hard_stone_generator_11 { background-position: -396px -638px}.sbsprite-rune_blood { background-position: -418px -638px}.sbsprite-raggedy_shark_tooth_necklace { background-position: -440px -638px}.sbsprite-pure_mithril { background-position: -462px -638px}.sbsprite-coin_emerald { background-position: -484px -638px}.sbsprite-pet_skin_black_cat_onyx { background-position: -506px -638px}.sbsprite-easter_egg_12 { background-position: -528px -638px}.sbsprite-emperor_head { background-position: -550px -638px}.sbsprite-power_wither_helmet { background-position: -572px -638px}.sbsprite-bee_11 { background-position: -594px -638px}.sbsprite-bee_10 { background-position: -616px -638px}.sbsprite-pet_skin_wolf { background-position: -638px -638px}.sbsprite-pumpkin_4 { background-position: -660px -638px}.sbsprite-pumpkin_3 { background-position: -682px -638px}.sbsprite-pumpkin_6 { background-position: -704px -638px}.sbsprite-fine_ruby_gem { background-position: -726px -638px}.sbsprite-pumpkin_5 { background-position: -748px -638px}.sbsprite-pumpkin_2 { background-position: -770px -638px}.sbsprite-electron_transmitter { background-position: -792px -638px}.sbsprite-pumpkin_1 { background-position: -814px -638px}.sbsprite-gingerbread_house { background-position: -836px -638px}.sbsprite-bee_1 { background-position: -858px -638px}.sbsprite-large_mining_sack { background-position: -880px -638px}.sbsprite-bee_2 { background-position: -902px -638px}.sbsprite-bee_3 { background-position: -924px -638px}.sbsprite-bee_4 { background-position: -946px -638px}.sbsprite-midas_jewel { background-position: -968px -638px}.sbsprite-unstable_dragon_helmet { background-position: -990px -638px}.sbsprite-vaccine_talisman { background-position: -1012px -638px}.sbsprite-whale_bait { background-position: -1034px -638px}.sbsprite-bee_9 { background-position: 0 -660px}.sbsprite-bee_5 { background-position: -22px -660px}.sbsprite-booster_cookie_box { background-position: -44px -660px}.sbsprite-perfect_topaz_gem { background-position: -66px -660px}.sbsprite-bee_6 { background-position: -88px -660px}.sbsprite-bee_7 { background-position: -110px -660px}.sbsprite-bee_8 { background-position: -132px -660px}.sbsprite-elvish_helmet { background-position: -154px -660px}.sbsprite-pumpkin_8 { background-position: -176px -660px}.sbsprite-light_grey_greater_backpack { background-position: -198px -660px}.sbsprite-pumpkin_7 { background-position: -220px -660px}.sbsprite-pumpkin_9 { background-position: -242px -660px}.sbsprite-best_weapon_rack { background-position: -264px -660px}.sbsprite-washed_up_souvenir { background-position: -286px -660px}.sbsprite-coin_diamond { background-position: -308px -660px}.sbsprite-builder_pink_berry { background-position: -330px -660px}.sbsprite-clownfish_personality { background-position: -352px -660px}.sbsprite-easter_egg_personality { background-position: -374px -660px}.sbsprite-jerry_talisman_green { background-position: -396px -660px}.sbsprite-spiked_atrocity { background-position: -418px -660px}.sbsprite-flower_generator_8 { background-position: -440px -660px}.sbsprite-flower_generator_9 { background-position: -462px -660px}.sbsprite-farmer_orb { background-position: -484px -660px}.sbsprite-flower_generator_4 { background-position: -506px -660px}.sbsprite-crypt_skull_key { background-position: -528px -660px}.sbsprite-flower_generator_5 { background-position: -550px -660px}.sbsprite-flower_generator_6 { background-position: -572px -660px}.sbsprite-flower_generator_7 { background-position: -594px -660px}.sbsprite-flower_generator_1 { background-position: -616px -660px}.sbsprite-flower_generator_2 { background-position: -638px -660px}.sbsprite-nutcracker { background-position: -660px -660px}.sbsprite-flower_generator_3 { background-position: -682px -660px}.sbsprite-scarf_studies { background-position: -704px -660px}.sbsprite-builder_apple { background-position: -726px -660px}.sbsprite-skyblock_table { background-position: -748px -660px}.sbsprite-sleeping_eye { background-position: -770px -660px}.sbsprite-spider_generator_1 { background-position: -792px -660px}.sbsprite-pet_skin_elephant_blue { background-position: -814px -660px}.sbsprite-spider_generator_2 { background-position: -836px -660px}.sbsprite-spider_generator_3 { background-position: -858px -660px}.sbsprite-shark_bait { background-position: -880px -660px}.sbsprite-spider_generator_4 { background-position: -902px -660px}.sbsprite-spider_generator_5 { background-position: -924px -660px}.sbsprite-black { background-position: -946px -660px}.sbsprite-sapphire_polished_drill_engine { background-position: -968px -660px}.sbsprite-cocoa_generator_1 { background-position: -990px -660px}.sbsprite-cocoa_generator_7 { background-position: -1012px -660px}.sbsprite-cocoa_generator_6 { background-position: -1034px -660px}.sbsprite-rune_snow { background-position: 0 -682px}.sbsprite-cocoa_generator_9 { background-position: -22px -682px}.sbsprite-cocoa_generator_8 { background-position: -44px -682px}.sbsprite-cocoa_generator_3 { background-position: -66px -682px}.sbsprite-cocoa_generator_2 { background-position: -88px -682px}.sbsprite-cocoa_generator_5 { background-position: -110px -682px}.sbsprite-cocoa_generator_4 { background-position: -132px -682px}.sbsprite-spider_generator_6 { background-position: -154px -682px}.sbsprite-spider_generator_7 { background-position: -176px -682px}.sbsprite-spider_generator_8 { background-position: -198px -682px}.sbsprite-spider_generator_9 { background-position: -220px -682px}.sbsprite-brown_large_backpack { background-position: -242px -682px}.sbsprite-flower_maelstrom { background-position: -264px -682px}.sbsprite-pumpkin_generator_12 { background-position: -286px -682px}.sbsprite-coal_generator_9 { background-position: -308px -682px}.sbsprite-diamond_thorn_head { background-position: -330px -682px}.sbsprite-ender_stone_generator_11 { background-position: -352px -682px}.sbsprite-coal_generator_8 { background-position: -374px -682px}.sbsprite-ender_stone_generator_10 { background-position: -396px -682px}.sbsprite-coal_generator_7 { background-position: -418px -682px}.sbsprite-jerry_box_blue { background-position: -440px -682px}.sbsprite-coal_generator_6 { background-position: -462px -682px}.sbsprite-coal_generator_5 { background-position: -484px -682px}.sbsprite-pumpkin_generator_11 { background-position: -506px -682px}.sbsprite-coal_generator_4 { background-position: -528px -682px}.sbsprite-pumpkin_generator_10 { background-position: -550px -682px}.sbsprite-talisman_of_space { background-position: -572px -682px}.sbsprite-talisman_enrichment_strength { background-position: -594px -682px}.sbsprite-white_jumbo_backpack { background-position: -616px -682px}.sbsprite-full_fairy_control { background-position: -638px -682px}.sbsprite-quartz_generator_9 { background-position: -660px -682px}.sbsprite-rune_wake { background-position: -682px -682px}.sbsprite-quartz_generator_8 { background-position: -704px -682px}.sbsprite-festive_jerry_personality { background-position: -726px -682px}.sbsprite-quartz_generator_5 { background-position: -748px -682px}.sbsprite-builder_berry { background-position: -770px -682px}.sbsprite-quartz_generator_4 { background-position: -792px -682px}.sbsprite-quartz_generator_7 { background-position: -814px -682px}.sbsprite-quartz_generator_6 { background-position: -836px -682px}.sbsprite-quartz_generator_1 { background-position: -858px -682px}.sbsprite-quartz_generator_3 { background-position: -880px -682px}.sbsprite-quartz_generator_2 { background-position: -902px -682px}.sbsprite-bingo_heirloom { background-position: -924px -682px}.sbsprite-dwarf_turtle_shelmet { background-position: -946px -682px}.sbsprite-wolf_paw { background-position: -968px -682px}.sbsprite-jasper_crystal { background-position: -990px -682px}.sbsprite-party_hat_crab { background-position: -1012px -682px}.sbsprite-feather_artifact { background-position: -1034px -682px}.sbsprite-coal_generator_3 { background-position: 0 -704px}.sbsprite-coal_generator_2 { background-position: -22px -704px}.sbsprite-coal_generator_1 { background-position: -44px -704px}.sbsprite-fast_travel_gold { background-position: -66px -704px}.sbsprite-crystal_hollows_crystals { background-position: -88px -704px}.sbsprite-mining_island { background-position: -110px -704px}.sbsprite-flawless_jasper_gem { background-position: -132px -704px}.sbsprite-halloween_candles { background-position: -154px -704px}.sbsprite-ascension_rope { background-position: -176px -704px}.sbsprite-brown_small_backpack { background-position: -198px -704px}.sbsprite-diver_puffer { background-position: -220px -704px}.sbsprite-melon_generator_10 { background-position: -242px -704px}.sbsprite-melon_generator_12 { background-position: -264px -704px}.sbsprite-melon_generator_11 { background-position: -286px -704px}.sbsprite-desert_island { background-position: -308px -704px}.sbsprite-green { background-position: -330px -704px}.sbsprite-crystallized_heart { background-position: -352px -704px}.sbsprite-sinful_dice { background-position: -374px -704px}.sbsprite-soulflow_supercell { background-position: -396px -704px}.sbsprite-sea_creature_artifact { background-position: -418px -704px}.sbsprite-grey_small_backpack { background-position: -440px -704px}.sbsprite-aatrox_batphone { background-position: -462px -704px}.sbsprite-clay_generator_10 { background-position: -484px -704px}.sbsprite-clay_generator_11 { background-position: -506px -704px}.sbsprite-end_stone_personality { background-position: -528px -704px}.sbsprite-builder_banana_bunch { background-position: -550px -704px}.sbsprite-danger_2_portal { background-position: -572px -704px}.sbsprite-mayor_scorpius { background-position: -594px -704px}.sbsprite-voodoo { background-position: -616px -704px}.sbsprite-jerry_box_purple { background-position: -638px -704px}.sbsprite-wither_artifact { background-position: -660px -704px}.sbsprite-skull_chest { background-position: -682px -704px}.sbsprite-pet_skin_elephant_pink { background-position: -704px -704px}.sbsprite-oak_generator_10 { background-position: -726px -704px}.sbsprite-slime_generator_1 { background-position: -748px -704px}.sbsprite-slime_generator_2 { background-position: -770px -704px}.sbsprite-frozen_blaze_icicle { background-position: -792px -704px}.sbsprite-oak_generator_11 { background-position: -814px -704px}.sbsprite-slime_generator_5 { background-position: -836px -704px}.sbsprite-slime_generator_6 { background-position: -858px -704px}.sbsprite-slime_generator_3 { background-position: -880px -704px}.sbsprite-slime_generator_4 { background-position: -902px -704px}.sbsprite-slime_generator_9 { background-position: -924px -704px}.sbsprite-slime_generator_7 { background-position: -946px -704px}.sbsprite-slime_generator_8 { background-position: -968px -704px}.sbsprite-dungeon_golden_key { background-position: -990px -704px}.sbsprite-mender_fedora { background-position: -1012px -704px}.sbsprite-pet_skin_rock_smile { background-position: -1034px -704px}.sbsprite-builder_orange { background-position: 0 -726px}.sbsprite-ghast_generator_10 { background-position: -22px -726px}.sbsprite-beach_chair { background-position: -44px -726px}.sbsprite-ghast_generator_11 { background-position: -66px -726px}.sbsprite-boss { background-position: -88px -726px}.sbsprite-race_precursor_ruins { background-position: -110px -726px}.sbsprite-perfectly_cut_fuel_tank { background-position: -132px -726px}.sbsprite-ice_essence { background-position: -154px -726px}.sbsprite-jerry_box_green { background-position: -176px -726px}.sbsprite-fireplace { background-position: -198px -726px}.sbsprite-moldy_bread { background-position: -220px -726px}.sbsprite-pet_skin_tiger_saber_tooth { background-position: -242px -726px}.sbsprite-obsidian_generator_5 { background-position: -264px -726px}.sbsprite-obsidian_generator_4 { background-position: -286px -726px}.sbsprite-obsidian_generator_7 { background-position: -308px -726px}.sbsprite-obsidian_generator_6 { background-position: -330px -726px}.sbsprite-obsidian_generator_1 { background-position: -352px -726px}.sbsprite-obsidian_generator_3 { background-position: -374px -726px}.sbsprite-foraging_1_portal { background-position: -396px -726px}.sbsprite-obsidian_generator_2 { background-position: -418px -726px}.sbsprite-dungeon_stone_tank { background-position: -440px -726px}.sbsprite-obsidian_generator_9 { background-position: -462px -726px}.sbsprite-obsidian_generator_8 { background-position: -484px -726px}.sbsprite-pet_skin_sheep_light_green { background-position: -506px -726px}.sbsprite-decayed_bat { background-position: -528px -726px}.sbsprite-pet_skin_squid_glow { background-position: -550px -726px}.sbsprite-potato_generator_4 { background-position: -572px -726px}.sbsprite-potato_generator_5 { background-position: -594px -726px}.sbsprite-potato_generator_12 { background-position: -616px -726px}.sbsprite-potato_generator_6 { background-position: -638px -726px}.sbsprite-potato_generator_11 { background-position: -660px -726px}.sbsprite-potato_generator_7 { background-position: -682px -726px}.sbsprite-potato_generator_10 { background-position: -704px -726px}.sbsprite-potato_generator_8 { background-position: -726px -726px}.sbsprite-potato_generator_9 { background-position: -748px -726px}.sbsprite-slayer_energy_drink { background-position: -770px -726px}.sbsprite-arachne_keeper_fragment { background-position: -792px -726px}.sbsprite-cat_talisman { background-position: -814px -726px}.sbsprite-large_slayer_sack { background-position: -836px -726px}.sbsprite-rune_rainbow { background-position: -858px -726px}.sbsprite-potato_generator_1 { background-position: -880px -726px}.sbsprite-potato_generator_2 { background-position: -902px -726px}.sbsprite-potato_generator_3 { background-position: -924px -726px}.sbsprite-lime_large_backpack { background-position: -946px -726px}.sbsprite-bestiary_spiders_den { background-position: -968px -726px}.sbsprite-ruby_polished_drill_engine { background-position: -990px -726px}.sbsprite-yellow_jumbo_backpack { background-position: -1012px -726px}.sbsprite-pet_skin_dolphin_snubnose { background-position: -1034px -726px}.sbsprite-spider_egg_mixin { background-position: 0 -748px}.sbsprite-pet_skin_dragon_pastel { background-position: -22px -748px}.sbsprite-honed_shark_tooth_necklace { background-position: -44px -748px}.sbsprite-bob_omb { background-position: -66px -748px}.sbsprite-dungeon_wizard_crystal { background-position: -88px -748px}.sbsprite-barn_island { background-position: -110px -748px}.sbsprite-weapon_rack { background-position: -132px -748px}.sbsprite-shadow_assassin_crimson { background-position: -154px -748px}.sbsprite-small_talisman_bag { background-position: -176px -748px}.sbsprite-medium_combat_sack { background-position: -198px -748px}.sbsprite-bonzo_statue { background-position: -220px -748px}.sbsprite-zombie_artifact { background-position: -242px -748px}.sbsprite-cheese_hunter { background-position: -264px -748px}.sbsprite-hologram { background-position: -286px -748px}.sbsprite-ultrasequencer { background-position: -308px -748px}.sbsprite-wise_dragon_helmet { background-position: -330px -748px}.sbsprite-cyan_medium_backpack { background-position: -352px -748px}.sbsprite-light_grey_small_backpack { background-position: -374px -748px}.sbsprite-catacombs_pass_5 { background-position: -396px -748px}.sbsprite-catacombs_pass_4 { background-position: -418px -748px}.sbsprite-catacombs_pass_3 { background-position: -440px -748px}.sbsprite-magma_bucket_upgrade { background-position: -462px -748px}.sbsprite-catacombs_pass_2 { background-position: -484px -748px}.sbsprite-coin_redstone { background-position: -506px -748px}.sbsprite-catacombs_pass_1 { background-position: -528px -748px}.sbsprite-hermit_crab_10 { background-position: -550px -748px}.sbsprite-catacombs_pass_0 { background-position: -572px -748px}.sbsprite-hermit_crab_11 { background-position: -594px -748px}.sbsprite-dungeon_stone_mage { background-position: -616px -748px}.sbsprite-gingerbread_personality { background-position: -638px -748px}.sbsprite-titanium_drill_engine { background-position: -660px -748px}.sbsprite-catacombs_pass_9 { background-position: -682px -748px}.sbsprite-fast_travel_dragontail { background-position: -704px -748px}.sbsprite-catacombs_pass_8 { background-position: -726px -748px}.sbsprite-catacombs_pass_7 { background-position: -748px -748px}.sbsprite-reaper_spirit { background-position: -770px -748px}.sbsprite-catacombs_pass_6 { background-position: -792px -748px}.sbsprite-armor_of_the_resistance_helmet { background-position: -814px -748px}.sbsprite-orange_small_backpack { background-position: -836px -748px}.sbsprite-bait_ring { background-position: -858px -748px}.sbsprite-luck_talisman { background-position: -880px -748px}.sbsprite-beach_ball_11 { background-position: -902px -748px}.sbsprite-beach_ball_10 { background-position: -924px -748px}.sbsprite-shark_personality { background-position: -946px -748px}.sbsprite-coal_generator_11 { background-position: -968px -748px}.sbsprite-coal_generator_12 { background-position: -990px -748px}.sbsprite-fourth_master_star { background-position: -1012px -748px}.sbsprite-water_hydra_head { background-position: -1034px -748px}.sbsprite-coal_generator_10 { background-position: 0 -770px}.sbsprite-ice_dinner_table { background-position: -22px -770px}.sbsprite-talisman_enrichment_attack_speed { background-position: -44px -770px}.sbsprite-gemstone_fuel_tank { background-position: -66px -770px}.sbsprite-green_large_backpack { background-position: -88px -770px}.sbsprite-fairy_wings_charm { background-position: -110px -770px}.sbsprite-rare_diamond { background-position: -132px -770px}.sbsprite-bunny { background-position: -154px -770px}.sbsprite-storm_the_fish { background-position: -176px -770px}.sbsprite-penguin_personality { background-position: -198px -770px}.sbsprite-shark_1 { background-position: -220px -770px}.sbsprite-shard_of_the_shredded { background-position: -242px -770px}.sbsprite-shark_2 { background-position: -264px -770px}.sbsprite-sheep_generator_11 { background-position: -286px -770px}.sbsprite-diamonite { background-position: -308px -770px}.sbsprite-prehistoric_egg { background-position: -330px -770px}.sbsprite-shark_3 { background-position: -352px -770px}.sbsprite-sheep_generator_12 { background-position: -374px -770px}.sbsprite-shark_4 { background-position: -396px -770px}.sbsprite-shark_5 { background-position: -418px -770px}.sbsprite-shark_6 { background-position: -440px -770px}.sbsprite-shark_7 { background-position: -462px -770px}.sbsprite-shark_8 { background-position: -484px -770px}.sbsprite-shark_9 { background-position: -506px -770px}.sbsprite-bbq { background-position: -528px -770px}.sbsprite-pet_skin_sheep_white { background-position: -550px -770px}.sbsprite-sheep_generator_10 { background-position: -572px -770px}.sbsprite-rune_spirit { background-position: -594px -770px}.sbsprite-aote_stone { background-position: -616px -770px}.sbsprite-french_bread { background-position: -638px -770px}.sbsprite-ember_helmet { background-position: -660px -770px}.sbsprite-large_bed { background-position: -682px -770px}.sbsprite-builder_bush { background-position: -704px -770px}.sbsprite-talisman_enrichment_ferocity { background-position: -726px -770px}.sbsprite-fire_talisman { background-position: -748px -770px}.sbsprite-purple_candy { background-position: -770px -770px}.sbsprite-spider_talisman { background-position: -792px -770px}.sbsprite-intimidation_artifact { background-position: -814px -770px}.sbsprite-large_candy_sack { background-position: -836px -770px}.sbsprite-present_10 { background-position: -858px -770px}.sbsprite-present_11 { background-position: -880px -770px}.sbsprite-beach_ball_9 { background-position: -902px -770px}.sbsprite-tarantula_generator_10 { background-position: -924px -770px}.sbsprite-beach_ball_8 { background-position: -946px -770px}.sbsprite-gold_sadan_head { background-position: -968px -770px}.sbsprite-tarantula_generator_11 { background-position: -990px -770px}.sbsprite-large_enchanted_foraging_sack { background-position: -1012px -770px}.sbsprite-warrior_dungeon_ability_1 { background-position: -1034px -770px}.sbsprite-beach_ball_5 { background-position: 0 -792px}.sbsprite-beach_ball_4 { background-position: -22px -792px}.sbsprite-beach_ball_7 { background-position: -44px -792px}.sbsprite-cracked_piggy_bank { background-position: -66px -792px}.sbsprite-beach_ball_6 { background-position: -88px -792px}.sbsprite-ice_lolly_11 { background-position: -110px -792px}.sbsprite-ice_lolly_10 { background-position: -132px -792px}.sbsprite-razor_sharp_shark_tooth_necklace { background-position: -154px -792px}.sbsprite-farm_crystal { background-position: -176px -792px}.sbsprite-bank_upgrade_luxurious { background-position: -198px -792px}.sbsprite-large_fishing_sack { background-position: -220px -792px}.sbsprite-lime_small_backpack { background-position: -242px -792px}.sbsprite-portable_wool_weaver { background-position: -264px -792px}.sbsprite-beach_ball_1 { background-position: -286px -792px}.sbsprite-beach_ball_3 { background-position: -308px -792px}.sbsprite-beach_ball_2 { background-position: -330px -792px}.sbsprite-revive_stone_orb { background-position: -352px -792px}.sbsprite-fish_hat { background-position: -374px -792px}.sbsprite-skull_personality { background-position: -396px -792px}.sbsprite-builder_onion { background-position: -418px -792px}.sbsprite-melon_generator_3 { background-position: -440px -792px}.sbsprite-zombie_generator_9 { background-position: -462px -792px}.sbsprite-melon_generator_2 { background-position: -484px -792px}.sbsprite-melon_generator_1 { background-position: -506px -792px}.sbsprite-melon_generator_7 { background-position: -528px -792px}.sbsprite-zombie_generator_5 { background-position: -550px -792px}.sbsprite-melon_generator_6 { background-position: -572px -792px}.sbsprite-zombie_generator_6 { background-position: -594px -792px}.sbsprite-melon_generator_5 { background-position: -616px -792px}.sbsprite-zombie_generator_7 { background-position: -638px -792px}.sbsprite-melon_generator_4 { background-position: -660px -792px}.sbsprite-zombie_generator_8 { background-position: -682px -792px}.sbsprite-zombie_generator_1 { background-position: -704px -792px}.sbsprite-zombie_generator_2 { background-position: -726px -792px}.sbsprite-optical_lens { background-position: -748px -792px}.sbsprite-zombie_generator_3 { background-position: -770px -792px}.sbsprite-zombie_generator_4 { background-position: -792px -792px}.sbsprite-beach_umbrella { background-position: -814px -792px}.sbsprite-diamond_atom { background-position: -836px -792px}.sbsprite-coin_talisman { background-position: -858px -792px}.sbsprite-nether_island { background-position: -880px -792px}.sbsprite-rune_couture { background-position: -902px -792px}.sbsprite-fish_affinity_talisman { background-position: -924px -792px}.sbsprite-wedding_ring_4 { background-position: -946px -792px}.sbsprite-wedding_ring_5 { background-position: -968px -792px}.sbsprite-wedding_ring_6 { background-position: -990px -792px}.sbsprite-wedding_ring_7 { background-position: -1012px -792px}.sbsprite-wedding_ring_8 { background-position: -1034px -792px}.sbsprite-large_enchanted_combat_sack { background-position: 0 -814px}.sbsprite-wedding_ring_9 { background-position: -22px -814px}.sbsprite-rune_clouds { background-position: -44px -814px}.sbsprite-perfect_amber_gem { background-position: -66px -814px}.sbsprite-precursor_gear { background-position: -88px -814px}.sbsprite-wedding_ring_2 { background-position: -110px -814px}.sbsprite-wedding_ring_3 { background-position: -132px -814px}.sbsprite-rune_enchant { background-position: -154px -814px}.sbsprite-god_potion { background-position: -176px -814px}.sbsprite-rune_magical { background-position: -198px -814px}.sbsprite-pet_skin_monkey_golden { background-position: -220px -814px}.sbsprite-spiked_bait { background-position: -242px -814px}.sbsprite-ghost_11 { background-position: -264px -814px}.sbsprite-perfect_jasper_gem { background-position: -286px -814px}.sbsprite-quartz_generator_11 { background-position: -308px -814px}.sbsprite-sandcastle_1 { background-position: -330px -814px}.sbsprite-sandcastle_2 { background-position: -352px -814px}.sbsprite-pet_skin_sheep_pink { background-position: -374px -814px}.sbsprite-premium_flesh { background-position: -396px -814px}.sbsprite-sandcastle_5 { background-position: -418px -814px}.sbsprite-blessed_bait { background-position: -440px -814px}.sbsprite-sandcastle_6 { background-position: -462px -814px}.sbsprite-sandcastle_3 { background-position: -484px -814px}.sbsprite-sandcastle_4 { background-position: -506px -814px}.sbsprite-wise_wither_helmet { background-position: -528px -814px}.sbsprite-sandcastle_9 { background-position: -550px -814px}.sbsprite-quartz_generator_10 { background-position: -572px -814px}.sbsprite-sandcastle_7 { background-position: -594px -814px}.sbsprite-sandcastle_8 { background-position: -616px -814px}.sbsprite-mayor_cole { background-position: -638px -814px}.sbsprite-fifth_master_star { background-position: -660px -814px}.sbsprite-ghost_10 { background-position: -682px -814px}.sbsprite-young_shimmer { background-position: -704px -814px}.sbsprite-minion_chair { background-position: -726px -814px}.sbsprite-pig_mask { background-position: -748px -814px}.sbsprite-hyper_catalyst_upgrade { background-position: -770px -814px}.sbsprite-potion { background-position: -792px -814px}.sbsprite-exceedingly_rare_ender_artifact_upgrader { background-position: -814px -814px}.sbsprite-refined_titanium { background-position: -836px -814px}.sbsprite-sharp_shark_tooth_necklace { background-position: -858px -814px}.sbsprite-wreath { background-position: -880px -814px}.sbsprite-melon_generator_9 { background-position: -902px -814px}.sbsprite-melon_generator_8 { background-position: -924px -814px}.sbsprite-epoch_cake_pink { background-position: -946px -814px}.sbsprite-dungeon_stone_healer { background-position: -968px -814px}.sbsprite-young_baby { background-position: -990px -814px}.sbsprite-presents { background-position: -1012px -814px}.sbsprite-dark_oak_generator_5 { background-position: -1034px -814px}.sbsprite-dark_oak_generator_6 { background-position: 0 -836px}.sbsprite-large_enchanted_fishing_sack { background-position: -22px -836px}.sbsprite-radiant_power_orb { background-position: -44px -836px}.sbsprite-dark_oak_generator_3 { background-position: -66px -836px}.sbsprite-large_husbandry_sack { background-position: -88px -836px}.sbsprite-dark_oak_generator_4 { background-position: -110px -836px}.sbsprite-dark_oak_generator_9 { background-position: -132px -836px}.sbsprite-dark_oak_generator_7 { background-position: -154px -836px}.sbsprite-dark_oak_generator_8 { background-position: -176px -836px}.sbsprite-dark_oak_generator_1 { background-position: -198px -836px}.sbsprite-dark_oak_generator_2 { background-position: -220px -836px}.sbsprite-illusion_glass { background-position: -242px -836px}.sbsprite-iron_chest { background-position: -264px -836px}.sbsprite-festive_zombie_personality { background-position: -286px -836px}.sbsprite-frozen_blaze_helmet { background-position: -308px -836px}.sbsprite-fast_travel_nest { background-position: -330px -836px}.sbsprite-brown_greater_backpack { background-position: -352px -836px}.sbsprite-red_gift { background-position: -374px -836px}.sbsprite-builder_lemon { background-position: -396px -836px}.sbsprite-rune_hot { background-position: -418px -836px}.sbsprite-small_mining_sack { background-position: -440px -836px}.sbsprite-pet_skin_jerry_green_elf { background-position: -462px -836px}.sbsprite-amber_polished_drill_engine { background-position: -484px -836px}.sbsprite-pedestal { background-position: -506px -836px}.sbsprite-red_claw_artifact { background-position: -528px -836px}.sbsprite-zombie_generator_11 { background-position: -550px -836px}.sbsprite-zombie_generator_10 { background-position: -572px -836px}.sbsprite-wither_relic { background-position: -594px -836px}.sbsprite-spider_hat { background-position: -616px -836px}.sbsprite-sludge_juice { background-position: -638px -836px}.sbsprite-precursor_eye { background-position: -660px -836px}.sbsprite-fast_travel_scarleton { background-position: -682px -836px}.sbsprite-connect_four { background-position: -704px -836px}.sbsprite-sloth_3 { background-position: -726px -836px}.sbsprite-sloth_4 { background-position: -748px -836px}.sbsprite-pet_skin_enderman { background-position: -770px -836px}.sbsprite-sloth_1 { background-position: -792px -836px}.sbsprite-sloth_2 { background-position: -814px -836px}.sbsprite-rabbit_generator_9 { background-position: -836px -836px}.sbsprite-builder_chesto_berry { background-position: -858px -836px}.sbsprite-rabbit_generator_4 { background-position: -880px -836px}.sbsprite-sloth_7 { background-position: -902px -836px}.sbsprite-rabbit_generator_3 { background-position: -924px -836px}.sbsprite-sloth_8 { background-position: -946px -836px}.sbsprite-rabbit_generator_2 { background-position: -968px -836px}.sbsprite-sloth_5 { background-position: -990px -836px}.sbsprite-rabbit_generator_1 { background-position: -1012px -836px}.sbsprite-sloth_6 { background-position: -1034px -836px}.sbsprite-rabbit_generator_8 { background-position: 0 -858px}.sbsprite-lantern { background-position: -22px -858px}.sbsprite-rabbit_generator_7 { background-position: -44px -858px}.sbsprite-rabbit_generator_6 { background-position: -66px -858px}.sbsprite-sloth_9 { background-position: -88px -858px}.sbsprite-rabbit_generator_5 { background-position: -110px -858px}.sbsprite-clownfish_8 { background-position: -132px -858px}.sbsprite-clownfish_9 { background-position: -154px -858px}.sbsprite-clownfish_6 { background-position: -176px -858px}.sbsprite-clownfish_7 { background-position: -198px -858px}.sbsprite-clownfish_4 { background-position: -220px -858px}.sbsprite-clownfish_5 { background-position: -242px -858px}.sbsprite-mender_helmet { background-position: -264px -858px}.sbsprite-clownfish_2 { background-position: -286px -858px}.sbsprite-clownfish_3 { background-position: -308px -858px}.sbsprite-enderman_hat { background-position: -330px -858px}.sbsprite-superior_dragon_helmet { background-position: -352px -858px}.sbsprite-clownfish_1 { background-position: -374px -858px}.sbsprite-reset_heart_of_the_mountain { background-position: -396px -858px}.sbsprite-lapis_crystal { background-position: -418px -858px}.sbsprite-purple_jumbo_backpack { background-position: -440px -858px}.sbsprite-purple_large_backpack { background-position: -462px -858px}.sbsprite-dragon_claw { background-position: -484px -858px}.sbsprite-potato_talisman { background-position: -506px -858px}.sbsprite-nether_warts_generator_12 { background-position: -528px -858px}.sbsprite-nether_warts_generator_11 { background-position: -550px -858px}.sbsprite-nether_warts_generator_10 { background-position: -572px -858px}.sbsprite-yellow_medium_backpack { background-position: -594px -858px}.sbsprite-acacia_generator_9 { background-position: -616px -858px}.sbsprite-arachne_crystal { background-position: -638px -858px}.sbsprite-acacia_generator_8 { background-position: -660px -858px}.sbsprite-acacia_generator_7 { background-position: -682px -858px}.sbsprite-helix { background-position: -704px -858px}.sbsprite-acacia_generator_6 { background-position: -726px -858px}.sbsprite-mutant_nether_stalk { background-position: -748px -858px}.sbsprite-acacia_generator_5 { background-position: -770px -858px}.sbsprite-acacia_generator_4 { background-position: -792px -858px}.sbsprite-acacia_generator_3 { background-position: -814px -858px}.sbsprite-acacia_generator_2 { background-position: -836px -858px}.sbsprite-acacia_generator_1 { background-position: -858px -858px}.sbsprite-orange_greater_backpack { background-position: -880px -858px}.sbsprite-boss_collection_professor { background-position: -902px -858px}.sbsprite-soulflow_engine { background-position: -924px -858px}.sbsprite-armor_showcase { background-position: -946px -858px}.sbsprite-gingerbread_2 { background-position: -968px -858px}.sbsprite-gingerbread_1 { background-position: -990px -858px}.sbsprite-gingerbread_6 { background-position: -1012px -858px}.sbsprite-gingerbread_5 { background-position: -1034px -858px}.sbsprite-gingerbread_4 { background-position: 0 -880px}.sbsprite-small_backpack { background-position: -22px -880px}.sbsprite-gingerbread_3 { background-position: -44px -880px}.sbsprite-gingerbread_9 { background-position: -66px -880px}.sbsprite-gingerbread_8 { background-position: -88px -880px}.sbsprite-gingerbread_7 { background-position: -110px -880px}.sbsprite-small_fishing_sack { background-position: -132px -880px}.sbsprite-fast_travel_castle { background-position: -154px -880px}.sbsprite-glacite_jewel { background-position: -176px -880px}.sbsprite-medium_agronomy_sack { background-position: -198px -880px}.sbsprite-mining_fortune { background-position: -220px -880px}.sbsprite-pet_item_spooky_cupcake { background-position: -242px -880px}.sbsprite-red_medium_backpack { background-position: -264px -880px}.sbsprite-third_master_star { background-position: -286px -880px}.sbsprite-pet_skin_phoenix_ice { background-position: -308px -880px}.sbsprite-golem_hat { background-position: -330px -880px}.sbsprite-ghost_personality { background-position: -352px -880px}.sbsprite-epoch_cake_yellow { background-position: -374px -880px}.sbsprite-creeper_generator_11 { background-position: -396px -880px}.sbsprite-creeper_generator_10 { background-position: -418px -880px}.sbsprite-magenta_medium_backpack { background-position: -440px -880px}.sbsprite-pet_skin_elephant_green { background-position: -462px -880px}.sbsprite-soulflow_pile { background-position: -484px -880px}.sbsprite-pumpkin_personality { background-position: -506px -880px}.sbsprite-small_slayer_sack { background-position: -528px -880px}.sbsprite-poisoned_candle { background-position: -550px -880px}.sbsprite-bestiary_crimson_isle { background-position: -572px -880px}.sbsprite-ring_potion_affinity { background-position: -594px -880px}.sbsprite-rock_gemstone { background-position: -616px -880px}.sbsprite-blood_god_crest { background-position: -638px -880px}.sbsprite-judgement_core { background-position: -660px -880px}.sbsprite-rune_tidal { background-position: -682px -880px}.sbsprite-lava_talisman { background-position: -704px -880px}.sbsprite-revived_heart { background-position: -726px -880px}.sbsprite-killer_personality { background-position: -748px -880px}.sbsprite-snow_suit_helmet { background-position: -770px -880px}.sbsprite-blobfish_hat { background-position: -792px -880px}.sbsprite-stool { background-position: -814px -880px}.sbsprite-builder_blue_corn { background-position: -836px -880px}.sbsprite-pulpous_orange_juice { background-position: -858px -880px}.sbsprite-fast_travel_drag { background-position: -880px -880px}.sbsprite-tank_dungeon_ability_2 { background-position: -902px -880px}.sbsprite-tank_dungeon_ability_1 { background-position: -924px -880px}.sbsprite-treasure_talisman { background-position: -946px -880px}.sbsprite-bookcase { background-position: -968px -880px}.sbsprite-skeletor_helmet { background-position: -990px -880px}.sbsprite-unstable_baby { background-position: -1012px -880px}.sbsprite-large_combat_sack { background-position: -1034px -880px}.sbsprite-minos_relic { background-position: 0 -902px}.sbsprite-pet_item_bubblegum { background-position: -22px -902px}.sbsprite-small_xtree { background-position: -44px -902px}.sbsprite-epoch_cake_aqua { background-position: -66px -902px}.sbsprite-wither_blood { background-position: -88px -902px}.sbsprite-egg_hunt { background-position: -110px -902px}.sbsprite-rune_fire_spiral { background-position: -132px -902px}.sbsprite-wither_goggles { background-position: -154px -902px}.sbsprite-egg_stack { background-position: -176px -902px}.sbsprite-mummy_candle { background-position: -198px -902px}.sbsprite-enchanted_book_bundle_big_brain { background-position: -220px -902px}.sbsprite-builder_beetroot { background-position: -242px -902px}.sbsprite-rabbit_generator_11 { background-position: -264px -902px}.sbsprite-rabbit_generator_10 { background-position: -286px -902px}.sbsprite-rabbit_generator_12 { background-position: -308px -902px}.sbsprite-rotten_apple { background-position: -330px -902px}.sbsprite-etherwarp_merger { background-position: -352px -902px}.sbsprite-redstone_generator_11 { background-position: -374px -902px}.sbsprite-redstone_generator_10 { background-position: -396px -902px}.sbsprite-protector_baby { background-position: -418px -902px}.sbsprite-fast_travel_deep { background-position: -440px -902px}.sbsprite-polished_pumpkin { background-position: -462px -902px}.sbsprite-redstone_generator_12 { background-position: -484px -902px}.sbsprite-tic_tac_toe { background-position: -506px -902px}.sbsprite-foraging_2_portal { background-position: -528px -902px}.sbsprite-recombobulator_3000 { background-position: -550px -902px}.sbsprite-sand_generator_7 { background-position: -572px -902px}.sbsprite-sand_generator_8 { background-position: -594px -902px}.sbsprite-sand_generator_9 { background-position: -616px -902px}.sbsprite-scarecrow_personality { background-position: -638px -902px}.sbsprite-pet_skin_sheep_aqua { background-position: -660px -902px}.sbsprite-skull_10 { background-position: -682px -902px}.sbsprite-melon_personality { background-position: -704px -902px}.sbsprite-skull_11 { background-position: -726px -902px}.sbsprite-flawed_amethyst_gem { background-position: -748px -902px}.sbsprite-revive_stone { background-position: -770px -902px}.sbsprite-creeper_generator_9 { background-position: -792px -902px}.sbsprite-creeper_generator_8 { background-position: -814px -902px}.sbsprite-potato_basket { background-position: -836px -902px}.sbsprite-diamond_essence { background-position: -858px -902px}.sbsprite-creeper_generator_7 { background-position: -880px -902px}.sbsprite-creeper_generator_6 { background-position: -902px -902px}.sbsprite-creeper_generator_5 { background-position: -924px -902px}.sbsprite-creeper_generator_4 { background-position: -946px -902px}.sbsprite-creeper_generator_3 { background-position: -968px -902px}.sbsprite-creeper_generator_2 { background-position: -990px -902px}.sbsprite-sand_generator_1 { background-position: -1012px -902px}.sbsprite-creeper_generator_1 { background-position: -1034px -902px}.sbsprite-sand_generator_2 { background-position: 0 -924px}.sbsprite-sand_generator_3 { background-position: -22px -924px}.sbsprite-sand_generator_4 { background-position: -44px -924px}.sbsprite-sand_generator_5 { background-position: -66px -924px}.sbsprite-jerry_box_golden { background-position: -88px -924px}.sbsprite-sand_generator_6 { background-position: -110px -924px}.sbsprite-seal_of_the_family { background-position: -132px -924px}.sbsprite-gemstone_chamber { background-position: -154px -924px}.sbsprite-aqua { background-position: -176px -924px}.sbsprite-ice_hunk { background-position: -198px -924px}.sbsprite-crystal_ball { background-position: -220px -924px}.sbsprite-ice_chair { background-position: -242px -924px}.sbsprite-sandcastle_11 { background-position: -264px -924px}.sbsprite-sandcastle_10 { background-position: -286px -924px}.sbsprite-furnace_plus { background-position: -308px -924px}.sbsprite-pig_generator_12 { background-position: -330px -924px}.sbsprite-pig_generator_11 { background-position: -352px -924px}.sbsprite-pig_generator_10 { background-position: -374px -924px}.sbsprite-nether_artifact { background-position: -396px -924px}.sbsprite-chicken_generator_1 { background-position: -418px -924px}.sbsprite-sniper_helmet { background-position: -440px -924px}.sbsprite-chicken_generator_4 { background-position: -462px -924px}.sbsprite-chicken_generator_5 { background-position: -484px -924px}.sbsprite-heat_core { background-position: -506px -924px}.sbsprite-chicken_generator_2 { background-position: -528px -924px}.sbsprite-wishing_compass { background-position: -550px -924px}.sbsprite-chicken_generator_3 { background-position: -572px -924px}.sbsprite-desk { background-position: -594px -924px}.sbsprite-white_large_backpack { background-position: -616px -924px}.sbsprite-hub_portal { background-position: -638px -924px}.sbsprite-spruce_generator_10 { background-position: -660px -924px}.sbsprite-spruce_generator_11 { background-position: -682px -924px}.sbsprite-chicken_generator_8 { background-position: -704px -924px}.sbsprite-mithril_generator_9 { background-position: -726px -924px}.sbsprite-scarf_thesis { background-position: -748px -924px}.sbsprite-chicken_generator_9 { background-position: -770px -924px}.sbsprite-mithril_generator_8 { background-position: -792px -924px}.sbsprite-fast_travel_da { background-position: -814px -924px}.sbsprite-chicken_generator_6 { background-position: -836px -924px}.sbsprite-mithril_generator_7 { background-position: -858px -924px}.sbsprite-zombie_ring { background-position: -880px -924px}.sbsprite-chicken_generator_7 { background-position: -902px -924px}.sbsprite-mithril_generator_6 { background-position: -924px -924px}.sbsprite-wood_chest { background-position: -946px -924px}.sbsprite-glowstone_generator_8 { background-position: -968px -924px}.sbsprite-mithril_generator_1 { background-position: -990px -924px}.sbsprite-pink_bunny_12 { background-position: -1012px -924px}.sbsprite-purple_medium_backpack { background-position: -1034px -924px}.sbsprite-glowstone_generator_7 { background-position: 0 -946px}.sbsprite-pink_bunny_11 { background-position: -22px -946px}.sbsprite-pink_bunny_10 { background-position: -44px -946px}.sbsprite-glowstone_generator_9 { background-position: -66px -946px}.sbsprite-glowstone_generator_4 { background-position: -88px -946px}.sbsprite-mithril_generator_5 { background-position: -110px -946px}.sbsprite-glowstone_generator_3 { background-position: -132px -946px}.sbsprite-mithril_generator_4 { background-position: -154px -946px}.sbsprite-glowstone_generator_6 { background-position: -176px -946px}.sbsprite-mithril_generator_3 { background-position: -198px -946px}.sbsprite-glowstone_generator_5 { background-position: -220px -946px}.sbsprite-mithril_generator_2 { background-position: -242px -946px}.sbsprite-very_official_yellow_rock { background-position: -264px -946px}.sbsprite-bat_person_talisman { background-position: -286px -946px}.sbsprite-cyan_large_backpack { background-position: -308px -946px}.sbsprite-fairy_soul { background-position: -330px -946px}.sbsprite-ghost_8 { background-position: -352px -946px}.sbsprite-ghost_9 { background-position: -374px -946px}.sbsprite-power_talisman { background-position: -396px -946px}.sbsprite-ghost_4 { background-position: -418px -946px}.sbsprite-decent_coffee { background-position: -440px -946px}.sbsprite-ghost_5 { background-position: -462px -946px}.sbsprite-ember_fragment { background-position: -484px -946px}.sbsprite-ghost_6 { background-position: -506px -946px}.sbsprite-ghost_7 { background-position: -528px -946px}.sbsprite-dull_shark_tooth_necklace { background-position: -550px -946px}.sbsprite-ghost_1 { background-position: -572px -946px}.sbsprite-ghost_2 { background-position: -594px -946px}.sbsprite-ghost_3 { background-position: -616px -946px}.sbsprite-gold_gift { background-position: -638px -946px}.sbsprite-tank_wither_helmet { background-position: -660px -946px}.sbsprite-spider_ring { background-position: -682px -946px}.sbsprite-santa_10 { background-position: -704px -946px}.sbsprite-santa_11 { background-position: -726px -946px}.sbsprite-yellow_greater_backpack { background-position: -748px -946px}.sbsprite-sapphire_crystal { background-position: -770px -946px}.sbsprite-mayor_foxy { background-position: -792px -946px}.sbsprite-starred_shadow_assassin_helmet { background-position: -814px -946px}.sbsprite-god_potion_2 { background-position: -836px -946px}.sbsprite-goblin_helmet { background-position: -858px -946px}.sbsprite-diamond_generator_5 { background-position: -880px -946px}.sbsprite-lesser_orb_of_healing { background-position: -902px -946px}.sbsprite-diamond_generator_6 { background-position: -924px -946px}.sbsprite-diamond_generator_3 { background-position: -946px -946px}.sbsprite-pet_skin_jerry_red_elf { background-position: -968px -946px}.sbsprite-diamond_generator_4 { background-position: -990px -946px}.sbsprite-lady_bug_10 { background-position: -1012px -946px}.sbsprite-diamond_generator_1 { background-position: -1034px -946px}.sbsprite-star_decorations { background-position: 0 -968px}.sbsprite-diamond_generator_2 { background-position: -22px -968px}.sbsprite-bingo_artifact { background-position: -44px -968px}.sbsprite-diamond_generator_9 { background-position: -66px -968px}.sbsprite-lady_bug_11 { background-position: -88px -968px}.sbsprite-diamond_generator_7 { background-position: -110px -968px}.sbsprite-diamond_generator_8 { background-position: -132px -968px}.sbsprite-heart_of_the_mountain { background-position: -154px -968px}.sbsprite-glowstone_generator_2 { background-position: -176px -968px}.sbsprite-glowstone_generator_1 { background-position: -198px -968px}.sbsprite-pink_donut_personality { background-position: -220px -968px}.sbsprite-artifact_of_space { background-position: -242px -968px}.sbsprite-lesser_soulflow_engine { background-position: -264px -968px}.sbsprite-mithril_crystal { background-position: -286px -968px}.sbsprite-young_fragment { background-position: -308px -968px}.sbsprite-master_catacombs_pass_10 { background-position: -330px -968px}.sbsprite-flying_bats { background-position: -352px -968px}.sbsprite-light_blue_medium_backpack { background-position: -374px -968px}.sbsprite-fast_travel_hub { background-position: -396px -968px}.sbsprite-pumpkin_generator_2 { background-position: -418px -968px}.sbsprite-pumpkin_generator_1 { background-position: -440px -968px}.sbsprite-pumpkin_generator_4 { background-position: -462px -968px}.sbsprite-end_helmet { background-position: -484px -968px}.sbsprite-pumpkin_generator_3 { background-position: -506px -968px}.sbsprite-pumpkin_generator_6 { background-position: -528px -968px}.sbsprite-titanium_talisman { background-position: -550px -968px}.sbsprite-pumpkin_generator_5 { background-position: -572px -968px}.sbsprite-reaper_gem { background-position: -594px -968px}.sbsprite-rune_zap { background-position: -616px -968px}.sbsprite-pumpkin_generator_8 { background-position: -638px -968px}.sbsprite-pumpkin_generator_7 { background-position: -660px -968px}.sbsprite-pumpkin_generator_9 { background-position: -682px -968px}.sbsprite-crooked_artifact { background-position: -704px -968px}.sbsprite-haste_ring { background-position: -726px -968px}.sbsprite-soulflow_battery { background-position: -748px -968px}.sbsprite-medium_mining_sack { background-position: -770px -968px}.sbsprite-skull_1 { background-position: -792px -968px}.sbsprite-coffin { background-position: -814px -968px}.sbsprite-chest_shelves { background-position: -836px -968px}.sbsprite-power_ring { background-position: -858px -968px}.sbsprite-white_medium_backpack { background-position: -880px -968px}.sbsprite-divan_fragment { background-position: -902px -968px}.sbsprite-skull_8 { background-position: -924px -968px}.sbsprite-gold_essence { background-position: -946px -968px}.sbsprite-skull_9 { background-position: -968px -968px}.sbsprite-skull_6 { background-position: -990px -968px}.sbsprite-skull_7 { background-position: -1012px -968px}.sbsprite-skull_4 { background-position: -1034px -968px}.sbsprite-skull_5 { background-position: 0 -990px}.sbsprite-skull_2 { background-position: -22px -990px}.sbsprite-skull_3 { background-position: -44px -990px}.sbsprite-black_jumbo_backpack { background-position: -66px -990px}.sbsprite-fast_travel_mines { background-position: -88px -990px}.sbsprite-skull_vase { background-position: -110px -990px}.sbsprite-fishing_generator_8 { background-position: -132px -990px}.sbsprite-fishing_generator_7 { background-position: -154px -990px}.sbsprite-fishing_generator_6 { background-position: -176px -990px}.sbsprite-fishing_generator_5 { background-position: -198px -990px}.sbsprite-fishing_generator_4 { background-position: -220px -990px}.sbsprite-lime_jumbo_backpack { background-position: -242px -990px}.sbsprite-fishing_generator_3 { background-position: -264px -990px}.sbsprite-fishing_generator_2 { background-position: -286px -990px}.sbsprite-fishing_generator_1 { background-position: -308px -990px}.sbsprite-fishing_generator_9 { background-position: -330px -990px}.sbsprite-yellow_large_backpack { background-position: -352px -990px}.sbsprite-amber_crystal { background-position: -374px -990px}.sbsprite-suspicious_vial { background-position: -396px -990px}.sbsprite-campfire { background-position: -418px -990px}.sbsprite-snow_generator_4 { background-position: -440px -990px}.sbsprite-snow_generator_5 { background-position: -462px -990px}.sbsprite-ring_of_space { background-position: -484px -990px}.sbsprite-snow_generator_6 { background-position: -506px -990px}.sbsprite-talisman_enrichment_walk_speed { background-position: -528px -990px}.sbsprite-snow_generator_7 { background-position: -550px -990px}.sbsprite-snow_generator_1 { background-position: -572px -990px}.sbsprite-snow_generator_2 { background-position: -594px -990px}.sbsprite-snow_generator_3 { background-position: -616px -990px}.sbsprite-lime_medium_backpack { background-position: -638px -990px}.sbsprite-end_stone_1 { background-position: -660px -990px}.sbsprite-strong_fragment { background-position: -682px -990px}.sbsprite-small_foraging_sack { background-position: -704px -990px}.sbsprite-synthetic_heart { background-position: -726px -990px}.sbsprite-end_stone_4 { background-position: -748px -990px}.sbsprite-diamond_sadan_head { background-position: -770px -990px}.sbsprite-end_stone_5 { background-position: -792px -990px}.sbsprite-end_stone_2 { background-position: -814px -990px}.sbsprite-end_stone_3 { background-position: -836px -990px}.sbsprite-diamond_bonzo_head { background-position: -858px -990px}.sbsprite-end_stone_8 { background-position: -880px -990px}.sbsprite-end_stone_9 { background-position: -902px -990px}.sbsprite-end_stone_6 { background-position: -924px -990px}.sbsprite-end_stone_7 { background-position: -946px -990px}.sbsprite-snow_generator_8 { background-position: -968px -990px}.sbsprite-snow_generator_9 { background-position: -990px -990px}.sbsprite-ender_stone_generator_4 { background-position: -1012px -990px}.sbsprite-epoch_cake_blue { background-position: -1034px -990px}.sbsprite-sand_generator_10 { background-position: 0 -1012px}.sbsprite-ender_stone_generator_3 { background-position: -22px -1012px}.sbsprite-sand_generator_11 { background-position: -44px -1012px}.sbsprite-ender_stone_generator_2 { background-position: -66px -1012px}.sbsprite-ender_stone_generator_1 { background-position: -88px -1012px}.sbsprite-pet_skin_sheep_neon_yellow { background-position: -110px -1012px}.sbsprite-fast_travel_spider { background-position: -132px -1012px}.sbsprite-pet_skin_sheep_blue { background-position: -154px -1012px}.sbsprite-epoch_cake_black { background-position: -176px -1012px}.sbsprite-wise_baby { background-position: -198px -1012px}.sbsprite-chronomatron { background-position: -220px -1012px}.sbsprite-scarf_grimoire { background-position: -242px -1012px}.sbsprite-bestiary_hub { background-position: -264px -1012px}.sbsprite-ender_stone_generator_9 { background-position: -286px -1012px}.sbsprite-ender_stone_generator_8 { background-position: -308px -1012px}.sbsprite-ender_stone_generator_7 { background-position: -330px -1012px}.sbsprite-ender_stone_generator_6 { background-position: -352px -1012px}.sbsprite-ender_stone_generator_5 { background-position: -374px -1012px}.sbsprite-small_gemstone_sack { background-position: -396px -1012px}.sbsprite-flawless_ruby_gem { background-position: -418px -1012px}.sbsprite-gold_necron_head { background-position: -440px -1012px}.sbsprite-small_husbandry_sack { background-position: -462px -1012px}.sbsprite-reaper_orb { background-position: -484px -1012px}.sbsprite-blaze_helmet { background-position: -506px -1012px}.sbsprite-bee_personality { background-position: -528px -1012px}.sbsprite-fishing { background-position: -550px -1012px}.sbsprite-titanium_ring { background-position: -572px -1012px}.sbsprite-lime { background-position: -594px -1012px}.sbsprite-feather_talisman { background-position: -616px -1012px}.sbsprite-rough_jasper_gem { background-position: -638px -1012px}.sbsprite-goblin_omelette_spicy { background-position: -660px -1012px}.sbsprite-gold_generator_11 { background-position: -682px -1012px}.sbsprite-gold_generator_10 { background-position: -704px -1012px}.sbsprite-gold_generator_12 { background-position: -726px -1012px}.sbpet-sheep_green { background-position: 0 0}.sbpet-sheep_yellow { background-position: -20px 0}.sbpet-bal { background-position: -40px 0}.sbpet-grandma_wolf { background-position: -60px 0}.sbpet-sheep_orange { background-position: -80px 0}.sbpet-sheep_red { background-position: -100px 0}.sbpet-bat { background-position: -120px 0}.sbpet-elephant_red { background-position: -140px 0}.sbpet-rabbit { background-position: -160px 0}.sbpet-megalodon_baby { background-position: -180px 0}.sbpet-silverfish { background-position: -200px 0}.sbpet-ghoul { background-position: -220px 0}.sbpet-pigman { background-position: 0 -22px}.sbpet-elephant_orange { background-position: -20px -22px}.sbpet-jerry { background-position: -40px -22px}.sbpet-sheep_neon_yellow { background-position: -60px -22px}.sbpet-rat { background-position: -80px -22px}.sbpet-tiger { background-position: -100px -22px}.sbpet-lion { background-position: -120px -22px}.sbpet-horse { background-position: -140px -22px}.sbpet-sheep_neon_green { background-position: -160px -22px}.sbpet-giraffe { background-position: -180px -22px}.sbpet-black_cat_ivory { background-position: -200px -22px}.sbpet-golden_dragon { background-position: -220px -22px}.sbpet-rock_derp { background-position: 0 -44px}.sbpet-parrot { background-position: -20px -44px}.sbpet-sheep_blue { background-position: -40px -44px}.sbpet-monkey_golden { background-position: -60px -44px}.sbpet-jellyfish { background-position: -80px -44px}.sbpet-horse_zombie { background-position: -100px -44px}.sbpet-sheep_purple { background-position: -120px -44px}.sbpet-elephant_purple { background-position: -140px -44px}.sbpet-endermite_radiant { background-position: -160px -44px}.sbpet-rock { background-position: -180px -44px}.sbpet-default { background-position: -200px -44px}.sbpet-blaze { background-position: -220px -44px}.sbpet-endermite { background-position: 0 -66px}.sbpet-megalodon_bullhead { background-position: -20px -66px}.sbpet-hound_beagle { background-position: -40px -66px}.sbpet-zombie { background-position: -60px -66px}.sbpet-guardian { background-position: -80px -66px}.sbpet-scatha { background-position: -100px -66px}.sbpet-wolf { background-position: -120px -66px}.sbpet-rabbit_aquamarine { background-position: -140px -66px}.sbpet-spirit { background-position: -160px -66px}.sbpet-hound { background-position: -180px -66px}.sbpet-dragon_neon_purple { background-position: -200px -66px}.sbpet-tiger_twilight { background-position: -220px -66px}.sbpet-sheep_light_green { background-position: 0 -88px}.sbpet-monkey_gorilla { background-position: -20px -88px}.sbpet-spider { background-position: -40px -88px}.sbpet-mithril_golem { background-position: -60px -88px}.sbpet-dolphin_snubnose { background-position: -80px -88px}.sbpet-snowman { background-position: -100px -88px}.sbpet-bee { background-position: -120px -88px}.sbpet-monkey { background-position: -140px -88px}.sbpet-jerry_red_elf { background-position: -160px -88px}.sbpet-elephant_pink { background-position: -180px -88px}.sbpet-sheep_brown { background-position: -200px -88px}.sbpet-magma_cube { background-position: -220px -88px}.sbpet-pig { background-position: 0 -110px}.sbpet-blue_whale { background-position: -20px -110px}.sbpet-skeleton { background-position: -40px -110px}.sbpet-phoenix_ice { background-position: -60px -110px}.sbpet-ammonite { background-position: -80px -110px}.sbpet-elephant_green { background-position: -100px -110px}.sbpet-armadillo { background-position: -120px -110px}.sbpet-dolphin { background-position: -140px -110px}.sbpet-turtle { background-position: -160px -110px}.sbpet-dragon_neon_red { background-position: -180px -110px}.sbpet-tiger_saber_tooth { background-position: -200px -110px}.sbpet-wither_skeleton { background-position: -220px -110px}.sbpet-parrot_blue_macaw { background-position: 0 -132px}.sbpet-ocelot { background-position: -20px -132px}.sbpet-sheep_light_gray { background-position: -40px -132px}.sbpet-elephant_blue { background-position: -60px -132px}.sbpet-chicken_baby_chick { background-position: -80px -132px}.sbpet-rock_thinking { background-position: -100px -132px}.sbpet-enderman_slayer { background-position: -120px -132px}.sbpet-ender_dragon { background-position: -140px -132px}.sbpet-rabbit_rose { background-position: -160px -132px}.sbpet-sheep_white { background-position: -180px -132px}.sbpet-silverfish_fossilized { background-position: -200px -132px}.sbpet-squid { background-position: -220px -132px}.sbpet-sheep_light_blue { background-position: 0 -154px}.sbpet-elephant { background-position: -20px -154px}.sbpet-golden_dragon_egg { background-position: -40px -154px}.sbpet-enderman { background-position: -60px -154px}.sbpet-chicken { background-position: -80px -154px}.sbpet-parrot_gold_macaw { background-position: -100px -154px}.sbpet-sheep_gray { background-position: -120px -154px}.sbpet-rock_cool { background-position: -140px -154px}.sbpet-rock_laugh { background-position: -160px -154px}.sbpet-sheep_black { background-position: -180px -154px}.sbpet-sheep_neon_blue { background-position: -200px -154px}.sbpet-rock_embarrassed { background-position: -220px -154px}.sbpet-dragon_neon_blue { background-position: 0 -176px}.sbpet-sheep { background-position: -20px -176px}.sbpet-baby_yeti { background-position: -40px -176px}.sbpet-sheep_aqua { background-position: -60px -176px}.sbpet-sheep_pink { background-position: -80px -176px}.sbpet-elephant_monochrome { background-position: -100px -176px}.sbpet-wolf_henzo_doggo { background-position: -120px -176px}.sbpet-squid_glow { background-position: -140px -176px}.sbpet-flying_fish { background-position: -160px -176px}.sbpet-griffin { background-position: -180px -176px}.sbpet-jerry_green_elf { background-position: -200px -176px}.sbpet-dragon_pastel { background-position: -220px -176px}.sbpet-sheep_neon_red { background-position: 0 -198px}.sbpet-sheep_magenta { background-position: -20px -198px}.sbpet-skeleton_horse { background-position: -40px -198px}.sbpet-megalodon { background-position: -60px -198px}.sbpet-lion_lioness { background-position: -80px -198px}.sbpet-tarantula { background-position: -100px -198px}.sbpet-yeti_grown_up { background-position: -120px -198px}.sbpet-phoenix { background-position: -140px -198px}.sbpet-golem { background-position: -160px -198px}.sbpet-black_cat { background-position: -180px -198px}.sbpet-whale_orca { background-position: -200px -198px}.sbpet-rock_smile { background-position: -220px -198px}.sbpet-wither { background-position: 0 -220px}.sbpet-black_cat_onyx { background-position: -20px -220px}.sbspray-AngryTurkey { background-position: 0 0}.sbspray-AnotherDimension { background-position: -128px 0}.sbspray-BlueArrowE { background-position: -256px 0}.sbspray-BlueArrowN { background-position: -384px 0}.sbspray-BlueArrowNE { background-position: -512px 0}.sbspray-BlueArrowNW { background-position: -640px 0}.sbspray-BlueArrowS { background-position: -768px 0}.sbspray-BlueArrowSE { background-position: -896px 0}.sbspray-BlueArrowSW { background-position: -1024px 0}.sbspray-BlueArrowW { background-position: -1152px 0}.sbspray-Bonzo { background-position: 0 -128px}.sbspray-Boom { background-position: -128px -128px}.sbspray-BunnyGG { background-position: -256px -128px}.sbspray-ChestGlow { background-position: -384px -128px}.sbspray-Chill { background-position: -512px -128px}.sbspray-Chimney { background-position: -640px -128px}.sbspray-ChocolateFeast { background-position: -768px -128px}.sbspray-ChristmasTree { background-position: -896px -128px}.sbspray-Coconut { background-position: -1024px -128px}.sbspray-Creeper { background-position: -1152px -128px}.sbspray-EasterBasket { background-position: 0 -256px}.sbspray-EasterCreeper { background-position: -128px -256px}.sbspray-EasterEggs { background-position: -256px -256px}.sbspray-Eek { background-position: -384px -256px}.sbspray-EggHunt { background-position: -512px -256px}.sbspray-EggSurprise { background-position: -640px -256px}.sbspray-Faboolous { background-position: -768px -256px}.sbspray-FarmingArrowE { background-position: -896px -256px}.sbspray-FarmingArrowN { background-position: -1024px -256px}.sbspray-FarmingArrowS { background-position: -1152px -256px}.sbspray-FarmingArrowW { background-position: 0 -384px}.sbspray-FoundU { background-position: -128px -384px}.sbspray-Garlic { background-position: -256px -384px}.sbspray-GenericArmor { background-position: -384px -384px}.sbspray-GenericBooks { background-position: -512px -384px}.sbspray-GenericFishing { background-position: -640px -384px}.sbspray-GenericMob { background-position: -768px -384px}.sbspray-GenericOres { background-position: -896px -384px}.sbspray-GenericPotions { background-position: -1024px -384px}.sbspray-GenericWeapons { background-position: -1152px -384px}.sbspray-GoldenEgg { background-position: 0 -512px}.sbspray-Heart { background-position: -128px -512px}.sbspray-Hypixel { background-position: -256px -512px}.sbspray-HypixelDark { background-position: -384px -512px}.sbspray-IceCream { background-position: -512px -512px}.sbspray-Kite { background-position: -640px -512px}.sbspray-LetUsIn { background-position: -768px -512px}.sbspray-Lifebelt { background-position: -896px -512px}.sbspray-MinionAnimals { background-position: -1024px -512px}.sbspray-MinionFarming { background-position: -1152px -512px}.sbspray-MinionForaging { background-position: 0 -640px}.sbspray-MinionMining { background-position: -128px -640px}.sbspray-MinionMisc { background-position: -256px -640px}.sbspray-MinionMonsters { background-position: -384px -640px}.sbspray-OnFire { background-position: -512px -640px}.sbspray-Porkchop { background-position: -640px -640px}.sbspray-PortalArrowE { background-position: -768px -640px}.sbspray-PortalArrowN { background-position: -896px -640px}.sbspray-PortalArrowS { background-position: -1024px -640px}.sbspray-PortalArrowW { background-position: -1152px -640px}.sbspray-Presents { background-position: 0 -768px}.sbspray-Puffer { background-position: -128px -768px}.sbspray-PuppySurprise { background-position: -256px -768px}.sbspray-RabbitCostume { background-position: -384px -768px}.sbspray-RedArrowE { background-position: -512px -768px}.sbspray-RedArrowN { background-position: -640px -768px}.sbspray-RedArrowNE { background-position: -768px -768px}.sbspray-RedArrowNW { background-position: -896px -768px}.sbspray-RedArrowS { background-position: -1024px -768px}.sbspray-RedArrowSE { background-position: -1152px -768px}.sbspray-RedArrowSW { background-position: 0 -896px}.sbspray-RedArrowW { background-position: -128px -896px}.sbspray-SandCastleH { background-position: -256px -896px}.sbspray-Sandcastle { background-position: -384px -896px}.sbspray-SantaJerry { background-position: -512px -896px}.sbspray-SantaSlips { background-position: -640px -896px}.sbspray-Sign { background-position: -768px -896px}.sbspray-SkyBlockChristmas { background-position: -896px -896px}.sbspray-SniperSnowball { background-position: -1024px -896px}.sbspray-Snowball { background-position: -1152px -896px}.sbspray-StorageArrowE { background-position: 0 -1024px}.sbspray-StorageArrowN { background-position: -128px -1024px}.sbspray-StorageArrowS { background-position: -256px -1024px}.sbspray-StorageArrowW { background-position: -384px -1024px}.sbspray-Surfing { background-position: -512px -1024px}.sbspray-TheWrongEggs { background-position: -640px -1024px}.sbspray-Trap { background-position: -768px -1024px}.sbspray-TrickOrTreat { background-position: -896px -1024px}.sbspray-UndeadJerry { background-position: -1024px -1024px}.sbspray-Volleyball { background-position: -1152px -1024px}.sbspray-Watcher { background-position: 0 -1152px}.sbspray-Whoosh { background-position: -128px -1152px}.sbspray-WitchPlease { background-position: -256px -1152px}.sbspray-Wreath { background-position: -384px -1152px}.sbspray-YellowArrowE { background-position: -512px -1152px}.sbspray-YellowArrowN { background-position: -640px -1152px}.sbspray-YellowArrowNE { background-position: -768px -1152px}.sbspray-YellowArrowNW { background-position: -896px -1152px}.sbspray-YellowArrowS { background-position: -1024px -1152px}.sbspray-YellowArrowSE { background-position: -1152px -1152px}.sbspray-YellowArrowSW { background-position: -1280px 0}.sbspray-YellowArrowW { background-position: -1280px -128px}.mcsprite-acacia_boat { background-position: 0 0}.mcsprite-acacia_button { background-position: -32px 0}.mcsprite-acacia_door { background-position: -64px 0}.mcsprite-acacia_fence { background-position: -96px 0}.mcsprite-acacia_fence_gate { background-position: -128px 0}.mcsprite-acacia_leaves { background-position: -160px 0}.mcsprite-acacia_log { background-position: -192px 0}.mcsprite-acacia_planks { background-position: -224px 0}.mcsprite-acacia_pressure_plate { background-position: -256px 0}.mcsprite-acacia_sapling { background-position: -288px 0}.mcsprite-acacia_sign { background-position: -320px 0}.mcsprite-acacia_slab { background-position: -352px 0}.mcsprite-acacia_stairs { background-position: -384px 0}.mcsprite-acacia_trapdoor { background-position: -416px 0}.mcsprite-acacia_wood { background-position: -448px 0}.mcsprite-acacia_wood_button { background-position: -480px 0}.mcsprite-acacia_wood_door { background-position: -512px 0}.mcsprite-acacia_wood_fence { background-position: -544px 0}.mcsprite-acacia_wood_fence_gate { background-position: -576px 0}.mcsprite-acacia_wood_planks { background-position: -608px 0}.mcsprite-acacia_wood_pressure_plate { background-position: -640px 0}.mcsprite-acacia_wood_sign { background-position: -672px 0}.mcsprite-acacia_wood_slab { background-position: -704px 0}.mcsprite-acacia_wood_stairs { background-position: -736px 0}.mcsprite-acacia_wood_trapdoor { background-position: -768px 0}.mcsprite-activator_rail { background-position: -800px 0}.mcsprite-adult_carrots { background-position: -832px 0}.mcsprite-adult_nether_warts { background-position: -864px 0}.mcsprite-adult_potatoes { background-position: -896px 0}.mcsprite-adult_wheat_crops { background-position: -928px 0}.mcsprite-air { background-position: -960px 0}.mcsprite-allium { background-position: -992px 0}.mcsprite-amethyst_cluster { background-position: -1024px 0}.mcsprite-amethyst_shard { background-position: -1056px 0}.mcsprite-ancient_debris { background-position: -1088px 0}.mcsprite-andesite { background-position: -1120px 0}.mcsprite-andesite_slab { background-position: -1152px 0}.mcsprite-andesite_stairs { background-position: -1184px 0}.mcsprite-andesite_wall { background-position: -1216px 0}.mcsprite-anvil { background-position: -1248px 0}.mcsprite-apple { background-position: 0 -32px}.mcsprite-armor_stand { background-position: -32px -32px}.mcsprite-arrow { background-position: -64px -32px}.mcsprite-arrow_loaded_crossbow { background-position: -96px -32px}.mcsprite-arrow_of_decay { background-position: -128px -32px}.mcsprite-arrow_of_fire_resistance { background-position: -160px -32px}.mcsprite-arrow_of_harming { background-position: -192px -32px}.mcsprite-arrow_of_healing { background-position: -224px -32px}.mcsprite-arrow_of_invisibility { background-position: -256px -32px}.mcsprite-arrow_of_leaping { background-position: -288px -32px}.mcsprite-arrow_of_luck { background-position: -320px -32px}.mcsprite-arrow_of_night_vision { background-position: -352px -32px}.mcsprite-arrow_of_poison { background-position: -384px -32px}.mcsprite-arrow_of_regeneration { background-position: -416px -32px}.mcsprite-arrow_of_slow_falling { background-position: -448px -32px}.mcsprite-arrow_of_slowness { background-position: -480px -32px}.mcsprite-arrow_of_splashing { background-position: -512px -32px}.mcsprite-arrow_of_strength { background-position: -544px -32px}.mcsprite-arrow_of_swiftness { background-position: -576px -32px}.mcsprite-arrow_of_the_turtle_master { background-position: -608px -32px}.mcsprite-arrow_of_water_breathing { background-position: -640px -32px}.mcsprite-arrow_of_weakness { background-position: -672px -32px}.mcsprite-awkward_lingering_potion { background-position: -704px -32px}.mcsprite-awkward_potion { background-position: -736px -32px}.mcsprite-awkward_splash_potion { background-position: -768px -32px}.mcsprite-axolotl_spawn_egg { background-position: -800px -32px}.mcsprite-azalea { background-position: -832px -32px}.mcsprite-azalea_leaves { background-position: -864px -32px}.mcsprite-azure_bluet { background-position: -896px -32px}.mcsprite-baked_potato { background-position: -928px -32px}.mcsprite-bamboo { background-position: -960px -32px}.mcsprite-banner { background-position: -992px -32px}.mcsprite-barrel { background-position: -1024px -32px}.mcsprite-barrier { background-position: -1056px -32px}.mcsprite-basalt { background-position: -1088px -32px}.mcsprite-bat_spawn_egg { background-position: -1120px -32px}.mcsprite-beacon { background-position: -1152px -32px}.mcsprite-bedrock { background-position: -1184px -32px}.mcsprite-bee_nest { background-position: -1216px -32px}.mcsprite-bee_spawn_egg { background-position: -1248px -32px}.mcsprite-beehive { background-position: 0 -64px}.mcsprite-beetroot { background-position: -32px -64px}.mcsprite-beetroot_seeds { background-position: -64px -64px}.mcsprite-beetroot_soup { background-position: -96px -64px}.mcsprite-beetroots { background-position: -128px -64px}.mcsprite-bell { background-position: -160px -64px}.mcsprite-big_dripleaf { background-position: -192px -64px}.mcsprite-birch_boat { background-position: -224px -64px}.mcsprite-birch_button { background-position: -256px -64px}.mcsprite-birch_door { background-position: -288px -64px}.mcsprite-birch_fence { background-position: -320px -64px}.mcsprite-birch_fence_gate { background-position: -352px -64px}.mcsprite-birch_leaves { background-position: -384px -64px}.mcsprite-birch_log { background-position: -416px -64px}.mcsprite-birch_planks { background-position: -448px -64px}.mcsprite-birch_pressure_plate { background-position: -480px -64px}.mcsprite-birch_sapling { background-position: -512px -64px}.mcsprite-birch_sign { background-position: -544px -64px}.mcsprite-birch_slab { background-position: -576px -64px}.mcsprite-birch_stairs { background-position: -608px -64px}.mcsprite-birch_trapdoor { background-position: -640px -64px}.mcsprite-birch_wood { background-position: -672px -64px}.mcsprite-birch_wood_button { background-position: -704px -64px}.mcsprite-birch_wood_door { background-position: -736px -64px}.mcsprite-birch_wood_fence { background-position: -768px -64px}.mcsprite-birch_wood_fence_gate { background-position: -800px -64px}.mcsprite-birch_wood_planks { background-position: -832px -64px}.mcsprite-birch_wood_pressure_plate { background-position: -864px -64px}.mcsprite-birch_wood_sign { background-position: -896px -64px}.mcsprite-birch_wood_slab { background-position: -928px -64px}.mcsprite-birch_wood_stairs { background-position: -960px -64px}.mcsprite-birch_wood_trapdoor { background-position: -992px -64px}.mcsprite-black_banner { background-position: -1024px -64px}.mcsprite-black_bed { background-position: -1056px -64px}.mcsprite-black_bed_lce { background-position: -1088px -64px}.mcsprite-black_candle { background-position: -1120px -64px}.mcsprite-black_carpet { background-position: -1152px -64px}.mcsprite-black_concrete { background-position: -1184px -64px}.mcsprite-black_concrete_powder { background-position: -1216px -64px}.mcsprite-black_dye { background-position: -1248px -64px}.mcsprite-black_firework_star { background-position: 0 -96px}.mcsprite-black_glazed_terracotta { background-position: -32px -96px}.mcsprite-black_shield { background-position: -64px -96px}.mcsprite-black_shulker_box { background-position: -96px -96px}.mcsprite-black_stained_glass { background-position: -128px -96px}.mcsprite-black_stained_glass_pane { background-position: -160px -96px}.mcsprite-black_terracotta { background-position: -192px -96px}.mcsprite-black_wool { background-position: -224px -96px}.mcsprite-blackstone { background-position: -256px -96px}.mcsprite-blackstone_slab { background-position: -288px -96px}.mcsprite-blackstone_stairs { background-position: -320px -96px}.mcsprite-blackstone_wall { background-position: -352px -96px}.mcsprite-blast_furnace { background-position: -384px -96px}.mcsprite-blaze_powder { background-position: -416px -96px}.mcsprite-blaze_rod { background-position: -448px -96px}.mcsprite-blaze_spawn_egg { background-position: -480px -96px}.mcsprite-block_of_amethyst { background-position: -512px -96px}.mcsprite-block_of_coal { background-position: -544px -96px}.mcsprite-block_of_copper { background-position: -576px -96px}.mcsprite-block_of_diamond { background-position: -608px -96px}.mcsprite-block_of_emerald { background-position: -640px -96px}.mcsprite-block_of_gold { background-position: -672px -96px}.mcsprite-block_of_iron { background-position: -704px -96px}.mcsprite-block_of_lapis_lazuli { background-position: -736px -96px}.mcsprite-block_of_netherite { background-position: -768px -96px}.mcsprite-block_of_quartz { background-position: -800px -96px}.mcsprite-block_of_raw_copper { background-position: -832px -96px}.mcsprite-block_of_raw_gold { background-position: -864px -96px}.mcsprite-block_of_raw_iron { background-position: -896px -96px}.mcsprite-block_of_redstone { background-position: -928px -96px}.mcsprite-blue_banner { background-position: -960px -96px}.mcsprite-blue_bed { background-position: -992px -96px}.mcsprite-blue_bed_lce { background-position: -1024px -96px}.mcsprite-blue_candle { background-position: -1056px -96px}.mcsprite-blue_carpet { background-position: -1088px -96px}.mcsprite-blue_concrete { background-position: -1120px -96px}.mcsprite-blue_concrete_powder { background-position: -1152px -96px}.mcsprite-blue_dye { background-position: -1184px -96px}.mcsprite-blue_firework_star { background-position: -1216px -96px}.mcsprite-blue_glazed_terracotta { background-position: -1248px -96px}.mcsprite-blue_ice { background-position: 0 -128px}.mcsprite-blue_orchid { background-position: -32px -128px}.mcsprite-blue_shield { background-position: -64px -128px}.mcsprite-blue_shulker_box { background-position: -96px -128px}.mcsprite-blue_stained_glass { background-position: -128px -128px}.mcsprite-blue_stained_glass_pane { background-position: -160px -128px}.mcsprite-blue_terracotta { background-position: -192px -128px}.mcsprite-blue_wool { background-position: -224px -128px}.mcsprite-bone { background-position: -256px -128px}.mcsprite-bone_block { background-position: -288px -128px}.mcsprite-bone_meal { background-position: -320px -128px}.mcsprite-book { background-position: -352px -128px}.mcsprite-book_and_quill { background-position: -384px -128px}.mcsprite-bookshelf { background-position: -416px -128px}.mcsprite-bottle_o_enchanting { background-position: -448px -128px}.mcsprite-bow { background-position: -480px -128px}.mcsprite-bowl { background-position: -512px -128px}.mcsprite-brain_coral { background-position: -544px -128px}.mcsprite-brain_coral_block { background-position: -576px -128px}.mcsprite-brain_coral_fan { background-position: -608px -128px}.mcsprite-bread { background-position: -640px -128px}.mcsprite-brewing_stand { background-position: -672px -128px}.mcsprite-brick { background-position: -704px -128px}.mcsprite-brick_slab { background-position: -736px -128px}.mcsprite-brick_slab_old { background-position: -768px -128px}.mcsprite-brick_stairs { background-position: -800px -128px}.mcsprite-brick_wall { background-position: -832px -128px}.mcsprite-bricks { background-position: -864px -128px}.mcsprite-bricks_old { background-position: -896px -128px}.mcsprite-broken_anvil { background-position: -928px -128px}.mcsprite-broken_elytra { background-position: -960px -128px}.mcsprite-brown_banner { background-position: -992px -128px}.mcsprite-brown_bed { background-position: -1024px -128px}.mcsprite-brown_bed_lce { background-position: -1056px -128px}.mcsprite-brown_candle { background-position: -1088px -128px}.mcsprite-brown_carpet { background-position: -1120px -128px}.mcsprite-brown_concrete { background-position: -1152px -128px}.mcsprite-brown_concrete_powder { background-position: -1184px -128px}.mcsprite-brown_dye { background-position: -1216px -128px}.mcsprite-brown_firework_star { background-position: -1248px -128px}.mcsprite-brown_glazed_terracotta { background-position: 0 -160px}.mcsprite-brown_mushroom { background-position: -32px -160px}.mcsprite-brown_mushroom_block { background-position: -64px -160px}.mcsprite-brown_shield { background-position: -96px -160px}.mcsprite-brown_shulker_box { background-position: -128px -160px}.mcsprite-brown_stained_glass { background-position: -160px -160px}.mcsprite-brown_stained_glass_pane { background-position: -192px -160px}.mcsprite-brown_terracotta { background-position: -224px -160px}.mcsprite-brown_wool { background-position: -256px -160px}.mcsprite-bubble_column { background-position: -288px -160px}.mcsprite-bubble_coral { background-position: -320px -160px}.mcsprite-bubble_coral_block { background-position: -352px -160px}.mcsprite-bubble_coral_fan { background-position: -384px -160px}.mcsprite-bucket { background-position: -416px -160px}.mcsprite-bucket_of_axolotl { background-position: -448px -160px}.mcsprite-bucket_of_cod { background-position: -480px -160px}.mcsprite-bucket_of_pufferfish { background-position: -512px -160px}.mcsprite-bucket_of_salmon { background-position: -544px -160px}.mcsprite-bucket_of_tropical_fish { background-position: -576px -160px}.mcsprite-budding_amethyst { background-position: -608px -160px}.mcsprite-bundle { background-position: -640px -160px}.mcsprite-buried_treasure_map { background-position: -672px -160px}.mcsprite-cactus { background-position: -704px -160px}.mcsprite-cactus_green { background-position: -736px -160px}.mcsprite-cake { background-position: -768px -160px}.mcsprite-calcite { background-position: -800px -160px}.mcsprite-campfire { background-position: -832px -160px}.mcsprite-candle { background-position: -864px -160px}.mcsprite-carrot { background-position: -896px -160px}.mcsprite-carrot_on_a_stick { background-position: -928px -160px}.mcsprite-cartography_table { background-position: -960px -160px}.mcsprite-carved_pumpkin { background-position: -992px -160px}.mcsprite-cast_fishing_rod { background-position: -1024px -160px}.mcsprite-cat_spawn_egg { background-position: -1056px -160px}.mcsprite-cauldron { background-position: -1088px -160px}.mcsprite-cave_air { background-position: -1120px -160px}.mcsprite-cave_spider_spawn_egg { background-position: -1152px -160px}.mcsprite-chain { background-position: -1184px -160px}.mcsprite-chainmail_boots { background-position: -1216px -160px}.mcsprite-chainmail_chestplate { background-position: -1248px -160px}.mcsprite-chainmail_helmet { background-position: 0 -192px}.mcsprite-chainmail_leggings { background-position: -32px -192px}.mcsprite-charcoal { background-position: -64px -192px}.mcsprite-chest { background-position: -96px -192px}.mcsprite-chicken_spawn_egg { background-position: -128px -192px}.mcsprite-chipped_anvil { background-position: -160px -192px}.mcsprite-chiseled_deepslate { background-position: -192px -192px}.mcsprite-chiseled_nether_bricks { background-position: -224px -192px}.mcsprite-chiseled_polished_blackstone { background-position: -256px -192px}.mcsprite-chiseled_quartz_block { background-position: -288px -192px}.mcsprite-chiseled_red_sandstone { background-position: -320px -192px}.mcsprite-chiseled_sandstone { background-position: -352px -192px}.mcsprite-chiseled_stone_bricks { background-position: -384px -192px}.mcsprite-chiseled_stone_bricks_monster_egg { background-position: -416px -192px}.mcsprite-chorus_flower { background-position: -448px -192px}.mcsprite-chorus_fruit { background-position: -480px -192px}.mcsprite-chorus_plant { background-position: -512px -192px}.mcsprite-clay { background-position: -544px -192px}.mcsprite-clay_ball { background-position: -576px -192px}.mcsprite-clock { background-position: -608px -192px}.mcsprite-clownfish { background-position: -640px -192px}.mcsprite-coal { background-position: -672px -192px}.mcsprite-coal_ore { background-position: -704px -192px}.mcsprite-coarse_dirt { background-position: -736px -192px}.mcsprite-cobbled_deepslate { background-position: -768px -192px}.mcsprite-cobbled_deepslate_slab { background-position: -800px -192px}.mcsprite-cobbled_deepslate_stairs { background-position: -832px -192px}.mcsprite-cobbled_deepslate_wall { background-position: -864px -192px}.mcsprite-cobblestone { background-position: -896px -192px}.mcsprite-cobblestone_monster_egg { background-position: -928px -192px}.mcsprite-cobblestone_slab { background-position: -960px -192px}.mcsprite-cobblestone_stairs { background-position: -992px -192px}.mcsprite-cobblestone_wall { background-position: -1024px -192px}.mcsprite-cobweb { background-position: -1056px -192px}.mcsprite-cocoa_beans { background-position: -1088px -192px}.mcsprite-cod_spawn_egg { background-position: -1120px -192px}.mcsprite-command_block { background-position: -1152px -192px}.mcsprite-compass { background-position: -1184px -192px}.mcsprite-composter { background-position: -1216px -192px}.mcsprite-conduit { background-position: -1248px -192px}.mcsprite-cooked_beef { background-position: 0 -224px}.mcsprite-cooked_chicken { background-position: -32px -224px}.mcsprite-cooked_cod { background-position: -64px -224px}.mcsprite-cooked_fish { background-position: -96px -224px}.mcsprite-cooked_mutton { background-position: -128px -224px}.mcsprite-cooked_porkchop { background-position: -160px -224px}.mcsprite-cooked_rabbit { background-position: -192px -224px}.mcsprite-cooked_salmon { background-position: -224px -224px}.mcsprite-cookie { background-position: -256px -224px}.mcsprite-copper_block { background-position: -288px -224px}.mcsprite-copper_ingot { background-position: -320px -224px}.mcsprite-copper_ore { background-position: -352px -224px}.mcsprite-cornflower { background-position: -384px -224px}.mcsprite-cow_spawn_egg { background-position: -416px -224px}.mcsprite-cracked_deepslate_bricks { background-position: -448px -224px}.mcsprite-cracked_deepslate_tiles { background-position: -480px -224px}.mcsprite-cracked_nether_bricks { background-position: -512px -224px}.mcsprite-cracked_polished_blackstone_bricks { background-position: -544px -224px}.mcsprite-cracked_stone_bricks { background-position: -576px -224px}.mcsprite-cracked_stone_bricks_monster_egg { background-position: -608px -224px}.mcsprite-crafting_table { background-position: -640px -224px}.mcsprite-creeper_head { background-position: -672px -224px}.mcsprite-creeper_spawn_egg { background-position: -704px -224px}.mcsprite-crimson_button { background-position: -736px -224px}.mcsprite-crimson_door { background-position: -768px -224px}.mcsprite-crimson_fence { background-position: -800px -224px}.mcsprite-crimson_fence_gate { background-position: -832px -224px}.mcsprite-crimson_fungus { background-position: -864px -224px}.mcsprite-crimson_hyphae { background-position: -896px -224px}.mcsprite-crimson_nylium { background-position: -928px -224px}.mcsprite-crimson_planks { background-position: -960px -224px}.mcsprite-crimson_pressure_plate { background-position: -992px -224px}.mcsprite-crimson_roots { background-position: -1024px -224px}.mcsprite-crimson_sign { background-position: -1056px -224px}.mcsprite-crimson_slab { background-position: -1088px -224px}.mcsprite-crimson_stairs { background-position: -1120px -224px}.mcsprite-crimson_stem { background-position: -1152px -224px}.mcsprite-crimson_trapdoor { background-position: -1184px -224px}.mcsprite-crossbow { background-position: -1216px -224px}.mcsprite-crying_obsidian { background-position: -1248px -224px}.mcsprite-cut_copper { background-position: 0 -256px}.mcsprite-cut_copper_block { background-position: -32px -256px}.mcsprite-cut_copper_slab { background-position: -64px -256px}.mcsprite-cut_copper_stairs { background-position: -96px -256px}.mcsprite-cut_red_sandstone { background-position: -128px -256px}.mcsprite-cut_red_sandstone_slab { background-position: -160px -256px}.mcsprite-cut_sandstone { background-position: -192px -256px}.mcsprite-cut_sandstone_slab { background-position: -224px -256px}.mcsprite-cyan_banner { background-position: -256px -256px}.mcsprite-cyan_bed { background-position: -288px -256px}.mcsprite-cyan_bed_lce { background-position: -320px -256px}.mcsprite-cyan_candle { background-position: -352px -256px}.mcsprite-cyan_carpet { background-position: -384px -256px}.mcsprite-cyan_concrete { background-position: -416px -256px}.mcsprite-cyan_concrete_powder { background-position: -448px -256px}.mcsprite-cyan_dye { background-position: -480px -256px}.mcsprite-cyan_firework_star { background-position: -512px -256px}.mcsprite-cyan_glazed_terracotta { background-position: -544px -256px}.mcsprite-cyan_shield { background-position: -576px -256px}.mcsprite-cyan_shulker_box { background-position: -608px -256px}.mcsprite-cyan_stained_glass { background-position: -640px -256px}.mcsprite-cyan_stained_glass_pane { background-position: -672px -256px}.mcsprite-cyan_terracotta { background-position: -704px -256px}.mcsprite-cyan_wool { background-position: -736px -256px}.mcsprite-dandelion { background-position: -768px -256px}.mcsprite-dandelion_yellow { background-position: -800px -256px}.mcsprite-dark_oak_boat { background-position: -832px -256px}.mcsprite-dark_oak_button { background-position: -864px -256px}.mcsprite-dark_oak_door { background-position: -896px -256px}.mcsprite-dark_oak_fence { background-position: -928px -256px}.mcsprite-dark_oak_fence_gate { background-position: -960px -256px}.mcsprite-dark_oak_leaves { background-position: -992px -256px}.mcsprite-dark_oak_log { background-position: -1024px -256px}.mcsprite-dark_oak_planks { background-position: -1056px -256px}.mcsprite-dark_oak_pressure_plate { background-position: -1088px -256px}.mcsprite-dark_oak_sapling { background-position: -1120px -256px}.mcsprite-dark_oak_sign { background-position: -1152px -256px}.mcsprite-dark_oak_slab { background-position: -1184px -256px}.mcsprite-dark_oak_stairs { background-position: -1216px -256px}.mcsprite-dark_oak_trapdoor { background-position: -1248px -256px}.mcsprite-dark_oak_wood { background-position: 0 -288px}.mcsprite-dark_oak_wood_button { background-position: -32px -288px}.mcsprite-dark_oak_wood_door { background-position: -64px -288px}.mcsprite-dark_oak_wood_fence { background-position: -96px -288px}.mcsprite-dark_oak_wood_fence_gate { background-position: -128px -288px}.mcsprite-dark_oak_wood_planks { background-position: -160px -288px}.mcsprite-dark_oak_wood_pressure_plate { background-position: -192px -288px}.mcsprite-dark_oak_wood_sign { background-position: -224px -288px}.mcsprite-dark_oak_wood_slab { background-position: -256px -288px}.mcsprite-dark_oak_wood_stairs { background-position: -288px -288px}.mcsprite-dark_oak_wood_trapdoor { background-position: -320px -288px}.mcsprite-dark_prismarine { background-position: -352px -288px}.mcsprite-dark_prismarine_slab { background-position: -384px -288px}.mcsprite-dark_prismarine_stairs { background-position: -416px -288px}.mcsprite-daylight_detector { background-position: -448px -288px}.mcsprite-daylight_sensor { background-position: -480px -288px}.mcsprite-dead_brain_coral { background-position: -512px -288px}.mcsprite-dead_brain_coral_block { background-position: -544px -288px}.mcsprite-dead_brain_coral_fan { background-position: -576px -288px}.mcsprite-dead_bubble_coral { background-position: -608px -288px}.mcsprite-dead_bubble_coral_block { background-position: -640px -288px}.mcsprite-dead_bubble_coral_fan { background-position: -672px -288px}.mcsprite-dead_bush { background-position: -704px -288px}.mcsprite-dead_fire_coral { background-position: -736px -288px}.mcsprite-dead_fire_coral_block { background-position: -768px -288px}.mcsprite-dead_fire_coral_fan { background-position: -800px -288px}.mcsprite-dead_horn_coral { background-position: -832px -288px}.mcsprite-dead_horn_coral_block { background-position: -864px -288px}.mcsprite-dead_horn_coral_fan { background-position: -896px -288px}.mcsprite-dead_tube_coral { background-position: -928px -288px}.mcsprite-dead_tube_coral_block { background-position: -960px -288px}.mcsprite-dead_tube_coral_fan { background-position: -992px -288px}.mcsprite-debug_stick { background-position: -1024px -288px}.mcsprite-deepslate { background-position: -1056px -288px}.mcsprite-deepslate_brick_slab { background-position: -1088px -288px}.mcsprite-deepslate_brick_stairs { background-position: -1120px -288px}.mcsprite-deepslate_brick_wall { background-position: -1152px -288px}.mcsprite-deepslate_bricks { background-position: -1184px -288px}.mcsprite-deepslate_coal_ore { background-position: -1216px -288px}.mcsprite-deepslate_copper_ore { background-position: -1248px -288px}.mcsprite-deepslate_diamond_ore { background-position: 0 -320px}.mcsprite-deepslate_emerald_ore { background-position: -32px -320px}.mcsprite-deepslate_gold_ore { background-position: -64px -320px}.mcsprite-deepslate_iron_ore { background-position: -96px -320px}.mcsprite-deepslate_lapis_lazuli_ore { background-position: -128px -320px}.mcsprite-deepslate_redstone_ore { background-position: -160px -320px}.mcsprite-deepslate_tile_slab { background-position: -192px -320px}.mcsprite-deepslate_tile_stairs { background-position: -224px -320px}.mcsprite-deepslate_tile_wall { background-position: -256px -320px}.mcsprite-deepslate_tiles { background-position: -288px -320px}.mcsprite-detector_rail { background-position: -320px -320px}.mcsprite-diamond { background-position: -352px -320px}.mcsprite-diamond_axe { background-position: -384px -320px}.mcsprite-diamond_boots { background-position: -416px -320px}.mcsprite-diamond_chestplate { background-position: -448px -320px}.mcsprite-diamond_helmet { background-position: -480px -320px}.mcsprite-diamond_hoe { background-position: -512px -320px}.mcsprite-diamond_horse_armor { background-position: -544px -320px}.mcsprite-diamond_leggings { background-position: -576px -320px}.mcsprite-diamond_ore { background-position: -608px -320px}.mcsprite-diamond_pickaxe { background-position: -640px -320px}.mcsprite-diamond_shovel { background-position: -672px -320px}.mcsprite-diamond_sword { background-position: -704px -320px}.mcsprite-diorite { background-position: -736px -320px}.mcsprite-diorite_slab { background-position: -768px -320px}.mcsprite-diorite_stairs { background-position: -800px -320px}.mcsprite-diorite_wall { background-position: -832px -320px}.mcsprite-dirt { background-position: -864px -320px}.mcsprite-dirt_path { background-position: -896px -320px}.mcsprite-dispenser { background-position: -928px -320px}.mcsprite-dolphin_spawn_egg { background-position: -960px -320px}.mcsprite-donkey_spawn_egg { background-position: -992px -320px}.mcsprite-double_smooth_stone_slab { background-position: -1024px -320px}.mcsprite-dragon_egg { background-position: -1056px -320px}.mcsprite-dragon_head { background-position: -1088px -320px}.mcsprite-dragons_breath { background-position: -1120px -320px}.mcsprite-dried_kelp { background-position: -1152px -320px}.mcsprite-dried_kelp_block { background-position: -1184px -320px}.mcsprite-dripstone_block { background-position: -1216px -320px}.mcsprite-dropper { background-position: -1248px -320px}.mcsprite-drowned_spawn_egg { background-position: 0 -352px}.mcsprite-egg { background-position: -32px -352px}.mcsprite-elder_guardian_spawn_egg { background-position: -64px -352px}.mcsprite-elytra { background-position: -96px -352px}.mcsprite-emerald { background-position: -128px -352px}.mcsprite-emerald_ore { background-position: -160px -352px}.mcsprite-empty_locator_map { background-position: -192px -352px}.mcsprite-empty_map { background-position: -224px -352px}.mcsprite-enchanted_apple { background-position: -256px -352px}.mcsprite-enchanted_book { background-position: -288px -352px}.mcsprite-enchanted_golden_apple { background-position: -320px -352px}.mcsprite-enchanting_table { background-position: -352px -352px}.mcsprite-enchantment_table { background-position: -384px -352px}.mcsprite-end_crystal { background-position: -416px -352px}.mcsprite-end_gateway { background-position: -448px -352px}.mcsprite-end_portal { background-position: -480px -352px}.mcsprite-end_portal_frame { background-position: -512px -352px}.mcsprite-end_rod { background-position: -544px -352px}.mcsprite-end_stone { background-position: -576px -352px}.mcsprite-end_stone_brick_slab { background-position: -608px -352px}.mcsprite-end_stone_brick_stairs { background-position: -640px -352px}.mcsprite-end_stone_brick_wall { background-position: -672px -352px}.mcsprite-end_stone_bricks { background-position: -704px -352px}.mcsprite-ender_chest { background-position: -736px -352px}.mcsprite-ender_pearl { background-position: -768px -352px}.mcsprite-enderman_spawn_egg { background-position: -800px -352px}.mcsprite-endermite_spawn_egg { background-position: -832px -352px}.mcsprite-evoker_spawn_egg { background-position: -864px -352px}.mcsprite-exposed_copper { background-position: -896px -352px}.mcsprite-exposed_copper_block { background-position: -928px -352px}.mcsprite-exposed_cut_copper { background-position: -960px -352px}.mcsprite-exposed_cut_copper_block { background-position: -992px -352px}.mcsprite-exposed_cut_copper_slab { background-position: -1024px -352px}.mcsprite-exposed_cut_copper_stairs { background-position: -1056px -352px}.mcsprite-eye_of_ender { background-position: -1088px -352px}.mcsprite-farmland { background-position: -1120px -352px}.mcsprite-feather { background-position: -1152px -352px}.mcsprite-fermented_spider_eye { background-position: -1184px -352px}.mcsprite-fern { background-position: -1216px -352px}.mcsprite-filled_bundle { background-position: -1248px -352px}.mcsprite-fire_charge { background-position: 0 -384px}.mcsprite-fire_coral { background-position: -32px -384px}.mcsprite-fire_coral_block { background-position: -64px -384px}.mcsprite-fire_coral_fan { background-position: -96px -384px}.mcsprite-firework_loaded_crossbow { background-position: -128px -384px}.mcsprite-firework_rocket { background-position: -160px -384px}.mcsprite-firework_star { background-position: -192px -384px}.mcsprite-fishing_rod { background-position: -224px -384px}.mcsprite-fletching_table { background-position: -256px -384px}.mcsprite-flint { background-position: -288px -384px}.mcsprite-flint_and_steel { background-position: -320px -384px}.mcsprite-flower_pot { background-position: -352px -384px}.mcsprite-flowering_azalea { background-position: -384px -384px}.mcsprite-flowering_azalea_leaves { background-position: -416px -384px}.mcsprite-flowing_lava { background-position: -448px -384px}.mcsprite-flowing_water { background-position: -480px -384px}.mcsprite-fox_spawn_egg { background-position: -512px -384px}.mcsprite-frosted_ice { background-position: -544px -384px}.mcsprite-furnace { background-position: -576px -384px}.mcsprite-ghast_spawn_egg { background-position: -608px -384px}.mcsprite-ghast_tear { background-position: -640px -384px}.mcsprite-gilded_blackstone { background-position: -672px -384px}.mcsprite-glass { background-position: -704px -384px}.mcsprite-glass_bottle { background-position: -736px -384px}.mcsprite-glass_pane { background-position: -768px -384px}.mcsprite-glistering_melon { background-position: -800px -384px}.mcsprite-glistering_melon_slice { background-position: -832px -384px}.mcsprite-glow_berries { background-position: -864px -384px}.mcsprite-glow_ink_sac { background-position: -896px -384px}.mcsprite-glow_item_frame { background-position: -928px -384px}.mcsprite-glow_lichen { background-position: -960px -384px}.mcsprite-glow_squid_spawn_egg { background-position: -992px -384px}.mcsprite-glowstone { background-position: -1024px -384px}.mcsprite-glowstone_dust { background-position: -1056px -384px}.mcsprite-goat_horn { background-position: -1088px -384px}.mcsprite-goat_spawn_egg { background-position: -1120px -384px}.mcsprite-gold_ingot { background-position: -1152px -384px}.mcsprite-gold_nugget { background-position: -1184px -384px}.mcsprite-gold_ore { background-position: -1216px -384px}.mcsprite-golden_apple { background-position: -1248px -384px}.mcsprite-golden_axe { background-position: 0 -416px}.mcsprite-golden_boots { background-position: -32px -416px}.mcsprite-golden_carrot { background-position: -64px -416px}.mcsprite-golden_chestplate { background-position: -96px -416px}.mcsprite-golden_helmet { background-position: -128px -416px}.mcsprite-golden_hoe { background-position: -160px -416px}.mcsprite-golden_horse_armor { background-position: -192px -416px}.mcsprite-golden_leggings { background-position: -224px -416px}.mcsprite-golden_pickaxe { background-position: -256px -416px}.mcsprite-golden_shovel { background-position: -288px -416px}.mcsprite-golden_sword { background-position: -320px -416px}.mcsprite-granite { background-position: -352px -416px}.mcsprite-granite_slab { background-position: -384px -416px}.mcsprite-granite_stairs { background-position: -416px -416px}.mcsprite-granite_wall { background-position: -448px -416px}.mcsprite-grass { background-position: -480px -416px}.mcsprite-grass_block { background-position: -512px -416px}.mcsprite-grass_path { background-position: -544px -416px}.mcsprite-gravel { background-position: -576px -416px}.mcsprite-gray_banner { background-position: -608px -416px}.mcsprite-gray_bed { background-position: -640px -416px}.mcsprite-gray_bed_lce { background-position: -672px -416px}.mcsprite-gray_candle { background-position: -704px -416px}.mcsprite-gray_carpet { background-position: -736px -416px}.mcsprite-gray_concrete { background-position: -768px -416px}.mcsprite-gray_concrete_powder { background-position: -800px -416px}.mcsprite-gray_dye { background-position: -832px -416px}.mcsprite-gray_firework_star { background-position: -864px -416px}.mcsprite-gray_glazed_terracotta { background-position: -896px -416px}.mcsprite-gray_shield { background-position: -928px -416px}.mcsprite-gray_shulker_box { background-position: -960px -416px}.mcsprite-gray_stained_glass { background-position: -992px -416px}.mcsprite-gray_stained_glass_pane { background-position: -1024px -416px}.mcsprite-gray_terracotta { background-position: -1056px -416px}.mcsprite-gray_wool { background-position: -1088px -416px}.mcsprite-green_banner { background-position: -1120px -416px}.mcsprite-green_bed { background-position: -1152px -416px}.mcsprite-green_bed_lce { background-position: -1184px -416px}.mcsprite-green_candle { background-position: -1216px -416px}.mcsprite-green_carpet { background-position: -1248px -416px}.mcsprite-green_concrete { background-position: 0 -448px}.mcsprite-green_concrete_powder { background-position: -32px -448px}.mcsprite-green_dye { background-position: -64px -448px}.mcsprite-green_firework_star { background-position: -96px -448px}.mcsprite-green_glazed_terracotta { background-position: -128px -448px}.mcsprite-green_shield { background-position: -160px -448px}.mcsprite-green_shulker_box { background-position: -192px -448px}.mcsprite-green_stained_glass { background-position: -224px -448px}.mcsprite-green_stained_glass_pane { background-position: -256px -448px}.mcsprite-green_terracotta { background-position: -288px -448px}.mcsprite-green_wool { background-position: -320px -448px}.mcsprite-grindstone { background-position: -352px -448px}.mcsprite-guardian_spawn_egg { background-position: -384px -448px}.mcsprite-gunpowder { background-position: -416px -448px}.mcsprite-half_filled_bundle { background-position: -448px -448px}.mcsprite-hanging_roots { background-position: -480px -448px}.mcsprite-hay_bale { background-position: -512px -448px}.mcsprite-head { background-position: -544px -448px}.mcsprite-heart_of_the_sea { background-position: -576px -448px}.mcsprite-heavy_weighted_pressure_plate { background-position: -608px -448px}.mcsprite-hoglin_spawn_egg { background-position: -640px -448px}.mcsprite-honey_block { background-position: -672px -448px}.mcsprite-honey_bottle { background-position: -704px -448px}.mcsprite-honeycomb { background-position: -736px -448px}.mcsprite-honeycomb_block { background-position: -768px -448px}.mcsprite-hopper { background-position: -800px -448px}.mcsprite-horn_coral { background-position: -832px -448px}.mcsprite-horn_coral_block { background-position: -864px -448px}.mcsprite-horn_coral_fan { background-position: -896px -448px}.mcsprite-horse_spawn_egg { background-position: -928px -448px}.mcsprite-husk_spawn_egg { background-position: -960px -448px}.mcsprite-ice { background-position: -992px -448px}.mcsprite-infested_chiseled_stone_bricks { background-position: -1024px -448px}.mcsprite-infested_cobblestone { background-position: -1056px -448px}.mcsprite-infested_cracked_stone_bricks { background-position: -1088px -448px}.mcsprite-infested_deepslate { background-position: -1120px -448px}.mcsprite-infested_mossy_stone_bricks { background-position: -1152px -448px}.mcsprite-infested_stone { background-position: -1184px -448px}.mcsprite-infested_stone_bricks { background-position: -1216px -448px}.mcsprite-ink_sac { background-position: -1248px -448px}.mcsprite-inverted_daylight_detector { background-position: 0 -480px}.mcsprite-inverted_daylight_sensor { background-position: -32px -480px}.mcsprite-invisible_bedrock { background-position: -64px -480px}.mcsprite-iron_axe { background-position: -96px -480px}.mcsprite-iron_bars { background-position: -128px -480px}.mcsprite-iron_boots { background-position: -160px -480px}.mcsprite-iron_chestplate { background-position: -192px -480px}.mcsprite-iron_door { background-position: -224px -480px}.mcsprite-iron_helmet { background-position: -256px -480px}.mcsprite-iron_hoe { background-position: -288px -480px}.mcsprite-iron_horse_armor { background-position: -320px -480px}.mcsprite-iron_ingot { background-position: -352px -480px}.mcsprite-iron_leggings { background-position: -384px -480px}.mcsprite-iron_nugget { background-position: -416px -480px}.mcsprite-iron_ore { background-position: -448px -480px}.mcsprite-iron_pickaxe { background-position: -480px -480px}.mcsprite-iron_shovel { background-position: -512px -480px}.mcsprite-iron_sword { background-position: -544px -480px}.mcsprite-iron_trapdoor { background-position: -576px -480px}.mcsprite-item_frame { background-position: -608px -480px}.mcsprite-jack_olantern { background-position: -640px -480px}.mcsprite-jigsaw { background-position: -672px -480px}.mcsprite-jigsaw_block { background-position: -704px -480px}.mcsprite-jukebox { background-position: -736px -480px}.mcsprite-jungle_boat { background-position: -768px -480px}.mcsprite-jungle_button { background-position: -800px -480px}.mcsprite-jungle_door { background-position: -832px -480px}.mcsprite-jungle_fence { background-position: -864px -480px}.mcsprite-jungle_fence_gate { background-position: -896px -480px}.mcsprite-jungle_leaves { background-position: -928px -480px}.mcsprite-jungle_log { background-position: -960px -480px}.mcsprite-jungle_planks { background-position: -992px -480px}.mcsprite-jungle_pressure_plate { background-position: -1024px -480px}.mcsprite-jungle_sapling { background-position: -1056px -480px}.mcsprite-jungle_sign { background-position: -1088px -480px}.mcsprite-jungle_slab { background-position: -1120px -480px}.mcsprite-jungle_stairs { background-position: -1152px -480px}.mcsprite-jungle_trapdoor { background-position: -1184px -480px}.mcsprite-jungle_wood { background-position: -1216px -480px}.mcsprite-jungle_wood_button { background-position: -1248px -480px}.mcsprite-jungle_wood_door { background-position: 0 -512px}.mcsprite-jungle_wood_fence { background-position: -32px -512px}.mcsprite-jungle_wood_fence_gate { background-position: -64px -512px}.mcsprite-jungle_wood_planks { background-position: -96px -512px}.mcsprite-jungle_wood_pressure_plate { background-position: -128px -512px}.mcsprite-jungle_wood_sign { background-position: -160px -512px}.mcsprite-jungle_wood_slab { background-position: -192px -512px}.mcsprite-jungle_wood_stairs { background-position: -224px -512px}.mcsprite-jungle_wood_trapdoor { background-position: -256px -512px}.mcsprite-kelp { background-position: -288px -512px}.mcsprite-knowledge_book { background-position: -320px -512px}.mcsprite-ladder { background-position: -352px -512px}.mcsprite-lantern { background-position: -384px -512px}.mcsprite-lapis_lazuli { background-position: -416px -512px}.mcsprite-lapis_lazuli_block { background-position: -448px -512px}.mcsprite-lapis_lazuli_ore { background-position: -480px -512px}.mcsprite-large_amethyst_bud { background-position: -512px -512px}.mcsprite-large_fern { background-position: -544px -512px}.mcsprite-lava { background-position: -576px -512px}.mcsprite-lava_bucket { background-position: -608px -512px}.mcsprite-lead { background-position: -640px -512px}.mcsprite-leather { background-position: -672px -512px}.mcsprite-leather_boots { background-position: -704px -512px}.mcsprite-leather_boots_black { background-position: -736px -512px}.mcsprite-leather_boots_blue { background-position: -768px -512px}.mcsprite-leather_boots_cyan { background-position: -800px -512px}.mcsprite-leather_boots_gray { background-position: -832px -512px}.mcsprite-leather_boots_green { background-position: -864px -512px}.mcsprite-leather_boots_light_blue { background-position: -896px -512px}.mcsprite-leather_boots_light_gray { background-position: -928px -512px}.mcsprite-leather_boots_lime { background-position: -960px -512px}.mcsprite-leather_boots_magenta { background-position: -992px -512px}.mcsprite-leather_boots_orange { background-position: -1024px -512px}.mcsprite-leather_boots_pink { background-position: -1056px -512px}.mcsprite-leather_boots_purple { background-position: -1088px -512px}.mcsprite-leather_boots_red { background-position: -1120px -512px}.mcsprite-leather_boots_white { background-position: -1152px -512px}.mcsprite-leather_boots_yellow { background-position: -1184px -512px}.mcsprite-leather_cap { background-position: -1216px -512px}.mcsprite-leather_cap_black { background-position: -1248px -512px}.mcsprite-leather_cap_blue { background-position: 0 -544px}.mcsprite-leather_cap_cyan { background-position: -32px -544px}.mcsprite-leather_cap_gray { background-position: -64px -544px}.mcsprite-leather_cap_green { background-position: -96px -544px}.mcsprite-leather_cap_light_blue { background-position: -128px -544px}.mcsprite-leather_cap_light_gray { background-position: -160px -544px}.mcsprite-leather_cap_lime { background-position: -192px -544px}.mcsprite-leather_cap_magenta { background-position: -224px -544px}.mcsprite-leather_cap_orange { background-position: -256px -544px}.mcsprite-leather_cap_pink { background-position: -288px -544px}.mcsprite-leather_cap_purple { background-position: -320px -544px}.mcsprite-leather_cap_red { background-position: -352px -544px}.mcsprite-leather_cap_white { background-position: -384px -544px}.mcsprite-leather_cap_yellow { background-position: -416px -544px}.mcsprite-leather_horse_armor { background-position: -448px -544px}.mcsprite-leather_pants { background-position: -480px -544px}.mcsprite-leather_pants_black { background-position: -512px -544px}.mcsprite-leather_pants_blue { background-position: -544px -544px}.mcsprite-leather_pants_cyan { background-position: -576px -544px}.mcsprite-leather_pants_gray { background-position: -608px -544px}.mcsprite-leather_pants_green { background-position: -640px -544px}.mcsprite-leather_pants_light_blue { background-position: -672px -544px}.mcsprite-leather_pants_light_gray { background-position: -704px -544px}.mcsprite-leather_pants_lime { background-position: -736px -544px}.mcsprite-leather_pants_magenta { background-position: -768px -544px}.mcsprite-leather_pants_orange { background-position: -800px -544px}.mcsprite-leather_pants_pink { background-position: -832px -544px}.mcsprite-leather_pants_purple { background-position: -864px -544px}.mcsprite-leather_pants_red { background-position: -896px -544px}.mcsprite-leather_pants_white { background-position: -928px -544px}.mcsprite-leather_pants_yellow { background-position: -960px -544px}.mcsprite-leather_tunic { background-position: -992px -544px}.mcsprite-leather_tunic_black { background-position: -1024px -544px}.mcsprite-leather_tunic_blue { background-position: -1056px -544px}.mcsprite-leather_tunic_cyan { background-position: -1088px -544px}.mcsprite-leather_tunic_gray { background-position: -1120px -544px}.mcsprite-leather_tunic_green { background-position: -1152px -544px}.mcsprite-leather_tunic_light_blue { background-position: -1184px -544px}.mcsprite-leather_tunic_light_gray { background-position: -1216px -544px}.mcsprite-leather_tunic_lime { background-position: -1248px -544px}.mcsprite-leather_tunic_magenta { background-position: 0 -576px}.mcsprite-leather_tunic_orange { background-position: -32px -576px}.mcsprite-leather_tunic_pink { background-position: -64px -576px}.mcsprite-leather_tunic_purple { background-position: -96px -576px}.mcsprite-leather_tunic_red { background-position: -128px -576px}.mcsprite-leather_tunic_white { background-position: -160px -576px}.mcsprite-leather_tunic_yellow { background-position: -192px -576px}.mcsprite-lectern { background-position: -224px -576px}.mcsprite-lever { background-position: -256px -576px}.mcsprite-light_blue_banner { background-position: -288px -576px}.mcsprite-light_blue_bed { background-position: -320px -576px}.mcsprite-light_blue_bed_lce { background-position: -352px -576px}.mcsprite-light_blue_candle { background-position: -384px -576px}.mcsprite-light_blue_carpet { background-position: -416px -576px}.mcsprite-light_blue_concrete { background-position: -448px -576px}.mcsprite-light_blue_concrete_powder { background-position: -480px -576px}.mcsprite-light_blue_dye { background-position: -512px -576px}.mcsprite-light_blue_firework_star { background-position: -544px -576px}.mcsprite-light_blue_glazed_terracotta { background-position: -576px -576px}.mcsprite-light_blue_shield { background-position: -608px -576px}.mcsprite-light_blue_shulker_box { background-position: -640px -576px}.mcsprite-light_blue_stained_glass { background-position: -672px -576px}.mcsprite-light_blue_stained_glass_pane { background-position: -704px -576px}.mcsprite-light_blue_terracotta { background-position: -736px -576px}.mcsprite-light_blue_wool { background-position: -768px -576px}.mcsprite-light_gray_banner { background-position: -800px -576px}.mcsprite-light_gray_bed { background-position: -832px -576px}.mcsprite-light_gray_bed_lce { background-position: -864px -576px}.mcsprite-light_gray_candle { background-position: -896px -576px}.mcsprite-light_gray_carpet { background-position: -928px -576px}.mcsprite-light_gray_concrete { background-position: -960px -576px}.mcsprite-light_gray_concrete_powder { background-position: -992px -576px}.mcsprite-light_gray_dye { background-position: -1024px -576px}.mcsprite-light_gray_firework_star { background-position: -1056px -576px}.mcsprite-light_gray_glazed_terracotta { background-position: -1088px -576px}.mcsprite-light_gray_shield { background-position: -1120px -576px}.mcsprite-light_gray_shulker_box { background-position: -1152px -576px}.mcsprite-light_gray_stained_glass { background-position: -1184px -576px}.mcsprite-light_gray_stained_glass_pane { background-position: -1216px -576px}.mcsprite-light_gray_terracotta { background-position: -1248px -576px}.mcsprite-light_gray_wool { background-position: 0 -608px}.mcsprite-light_negative { background-position: -32px -608px}.mcsprite-light_weighted_pressure_plate { background-position: -64px -608px}.mcsprite-lightning_rod { background-position: -96px -608px}.mcsprite-lilac { background-position: -128px -608px}.mcsprite-lily_of_the_valley { background-position: -160px -608px}.mcsprite-lily_pad { background-position: -192px -608px}.mcsprite-lime_banner { background-position: -224px -608px}.mcsprite-lime_bed { background-position: -256px -608px}.mcsprite-lime_bed_lce { background-position: -288px -608px}.mcsprite-lime_candle { background-position: -320px -608px}.mcsprite-lime_carpet { background-position: -352px -608px}.mcsprite-lime_concrete { background-position: -384px -608px}.mcsprite-lime_concrete_powder { background-position: -416px -608px}.mcsprite-lime_dye { background-position: -448px -608px}.mcsprite-lime_firework_star { background-position: -480px -608px}.mcsprite-lime_glazed_terracotta { background-position: -512px -608px}.mcsprite-lime_shield { background-position: -544px -608px}.mcsprite-lime_shulker_box { background-position: -576px -608px}.mcsprite-lime_stained_glass { background-position: -608px -608px}.mcsprite-lime_stained_glass_pane { background-position: -640px -608px}.mcsprite-lime_terracotta { background-position: -672px -608px}.mcsprite-lime_wool { background-position: -704px -608px}.mcsprite-lingering_potion_of_decay { background-position: -736px -608px}.mcsprite-lingering_potion_of_fire_resistance { background-position: -768px -608px}.mcsprite-lingering_potion_of_harming { background-position: -800px -608px}.mcsprite-lingering_potion_of_healing { background-position: -832px -608px}.mcsprite-lingering_potion_of_invisibility { background-position: -864px -608px}.mcsprite-lingering_potion_of_leaping { background-position: -896px -608px}.mcsprite-lingering_potion_of_levitation { background-position: -928px -608px}.mcsprite-lingering_potion_of_luck { background-position: -960px -608px}.mcsprite-lingering_potion_of_night_vision { background-position: -992px -608px}.mcsprite-lingering_potion_of_poison { background-position: -1024px -608px}.mcsprite-lingering_potion_of_regeneration { background-position: -1056px -608px}.mcsprite-lingering_potion_of_slow_falling { background-position: -1088px -608px}.mcsprite-lingering_potion_of_slowness { background-position: -1120px -608px}.mcsprite-lingering_potion_of_strength { background-position: -1152px -608px}.mcsprite-lingering_potion_of_swiftness { background-position: -1184px -608px}.mcsprite-lingering_potion_of_the_turtle_master { background-position: -1216px -608px}.mcsprite-lingering_potion_of_water_breathing { background-position: -1248px -608px}.mcsprite-lingering_potion_of_weakness { background-position: 0 -640px}.mcsprite-lingering_water_bottle { background-position: -32px -640px}.mcsprite-llama_spawn_egg { background-position: -64px -640px}.mcsprite-locked_map { background-position: -96px -640px}.mcsprite-lodestone { background-position: -128px -640px}.mcsprite-loom { background-position: -160px -640px}.mcsprite-magenta_banner { background-position: -192px -640px}.mcsprite-magenta_bed { background-position: -224px -640px}.mcsprite-magenta_bed_lce { background-position: -256px -640px}.mcsprite-magenta_candle { background-position: -288px -640px}.mcsprite-magenta_carpet { background-position: -320px -640px}.mcsprite-magenta_concrete { background-position: -352px -640px}.mcsprite-magenta_concrete_powder { background-position: -384px -640px}.mcsprite-magenta_dye { background-position: -416px -640px}.mcsprite-magenta_firework_star { background-position: -448px -640px}.mcsprite-magenta_glazed_terracotta { background-position: -480px -640px}.mcsprite-magenta_shield { background-position: -512px -640px}.mcsprite-magenta_shulker_box { background-position: -544px -640px}.mcsprite-magenta_stained_glass { background-position: -576px -640px}.mcsprite-magenta_stained_glass_pane { background-position: -608px -640px}.mcsprite-magenta_terracotta { background-position: -640px -640px}.mcsprite-magenta_wool { background-position: -672px -640px}.mcsprite-magma_cream { background-position: -704px -640px}.mcsprite-magma_cube_spawn_egg { background-position: -736px -640px}.mcsprite-map { background-position: -768px -640px}.mcsprite-medium_amethyst_bud { background-position: -800px -640px}.mcsprite-melon { background-position: -832px -640px}.mcsprite-melon_seeds { background-position: -864px -640px}.mcsprite-melon_slice { background-position: -896px -640px}.mcsprite-mhf_alex { background-position: -928px -640px}.mcsprite-mhf_arrowdown { background-position: -960px -640px}.mcsprite-mhf_arrowleft { background-position: -992px -640px}.mcsprite-mhf_arrowright { background-position: -1024px -640px}.mcsprite-mhf_arrowup { background-position: -1056px -640px}.mcsprite-mhf_blaze { background-position: -1088px -640px}.mcsprite-mhf_cactus { background-position: -1120px -640px}.mcsprite-mhf_cake { background-position: -1152px -640px}.mcsprite-mhf_cavespider { background-position: -1184px -640px}.mcsprite-mhf_chest { background-position: -1216px -640px}.mcsprite-mhf_chicken { background-position: -1248px -640px}.mcsprite-mhf_coconutb { background-position: 0 -672px}.mcsprite-mhf_coconutg { background-position: -32px -672px}.mcsprite-mhf_cow { background-position: -64px -672px}.mcsprite-mhf_creeper { background-position: -96px -672px}.mcsprite-mhf_enderman { background-position: -128px -672px}.mcsprite-mhf_exclamation { background-position: -160px -672px}.mcsprite-mhf_ghast { background-position: -192px -672px}.mcsprite-mhf_golem { background-position: -224px -672px}.mcsprite-mhf_herobrine { background-position: -256px -672px}.mcsprite-mhf_lavaslime { background-position: -288px -672px}.mcsprite-mhf_melon { background-position: -320px -672px}.mcsprite-mhf_mushroomcow { background-position: -352px -672px}.mcsprite-mhf_oaklog { background-position: -384px -672px}.mcsprite-mhf_ocelot { background-position: -416px -672px}.mcsprite-mhf_pig { background-position: -448px -672px}.mcsprite-mhf_pigzombie { background-position: -480px -672px}.mcsprite-mhf_present1 { background-position: -512px -672px}.mcsprite-mhf_present2 { background-position: -544px -672px}.mcsprite-mhf_pumpkin { background-position: -576px -672px}.mcsprite-mhf_question { background-position: -608px -672px}.mcsprite-mhf_sheep { background-position: -640px -672px}.mcsprite-mhf_skeleton { background-position: -672px -672px}.mcsprite-mhf_slime { background-position: -704px -672px}.mcsprite-mhf_spider { background-position: -736px -672px}.mcsprite-mhf_squid { background-position: -768px -672px}.mcsprite-mhf_steve { background-position: -800px -672px}.mcsprite-mhf_tnt { background-position: -832px -672px}.mcsprite-mhf_tnt2 { background-position: -864px -672px}.mcsprite-mhf_villager { background-position: -896px -672px}.mcsprite-mhf_wskeleton { background-position: -928px -672px}.mcsprite-mhf_zombie { background-position: -960px -672px}.mcsprite-milk_bucket { background-position: -992px -672px}.mcsprite-minecart { background-position: -1024px -672px}.mcsprite-minecart_with_chest { background-position: -1056px -672px}.mcsprite-minecart_with_command_block { background-position: -1088px -672px}.mcsprite-minecart_with_furnace { background-position: -1120px -672px}.mcsprite-minecart_with_hopper { background-position: -1152px -672px}.mcsprite-minecart_with_tnt { background-position: -1184px -672px}.mcsprite-monster_spawner { background-position: -1216px -672px}.mcsprite-mooshroom_spawn_egg { background-position: -1248px -672px}.mcsprite-moss_block { background-position: 0 -704px}.mcsprite-moss_carpet { background-position: -32px -704px}.mcsprite-moss_stone { background-position: -64px -704px}.mcsprite-mossy_cobblestone { background-position: -96px -704px}.mcsprite-mossy_cobblestone_slab { background-position: -128px -704px}.mcsprite-mossy_cobblestone_stairs { background-position: -160px -704px}.mcsprite-mossy_cobblestone_wall { background-position: -192px -704px}.mcsprite-mossy_stone_brick_slab { background-position: -224px -704px}.mcsprite-mossy_stone_brick_stairs { background-position: -256px -704px}.mcsprite-mossy_stone_brick_wall { background-position: -288px -704px}.mcsprite-mossy_stone_bricks { background-position: -320px -704px}.mcsprite-mossy_stone_bricks_monster_egg { background-position: -352px -704px}.mcsprite-mule_spawn_egg { background-position: -384px -704px}.mcsprite-mundane_lingering_potion { background-position: -416px -704px}.mcsprite-mundane_potion { background-position: -448px -704px}.mcsprite-mundane_splash_potion { background-position: -480px -704px}.mcsprite-mushroom_stem { background-position: -512px -704px}.mcsprite-mushroom_stew { background-position: -544px -704px}.mcsprite-music_disc_11 { background-position: -576px -704px}.mcsprite-music_disc_13 { background-position: -608px -704px}.mcsprite-music_disc_blocks { background-position: -640px -704px}.mcsprite-music_disc_cat { background-position: -672px -704px}.mcsprite-music_disc_chirp { background-position: -704px -704px}.mcsprite-music_disc_far { background-position: -736px -704px}.mcsprite-music_disc_mall { background-position: -768px -704px}.mcsprite-music_disc_mellohi { background-position: -800px -704px}.mcsprite-music_disc_pigstep { background-position: -832px -704px}.mcsprite-music_disc_stal { background-position: -864px -704px}.mcsprite-music_disc_strad { background-position: -896px -704px}.mcsprite-music_disc_wait { background-position: -928px -704px}.mcsprite-music_disc_ward { background-position: -960px -704px}.mcsprite-mycelium { background-position: -992px -704px}.mcsprite-name_tag { background-position: -1024px -704px}.mcsprite-nautilus_shell { background-position: -1056px -704px}.mcsprite-nether_brick { background-position: -1088px -704px}.mcsprite-nether_brick_block { background-position: -1120px -704px}.mcsprite-nether_brick_fence { background-position: -1152px -704px}.mcsprite-nether_brick_slab { background-position: -1184px -704px}.mcsprite-nether_brick_stairs { background-position: -1216px -704px}.mcsprite-nether_brick_wall { background-position: -1248px -704px}.mcsprite-nether_bricks { background-position: 0 -736px}.mcsprite-nether_gold_ore { background-position: -32px -736px}.mcsprite-nether_quartz { background-position: -64px -736px}.mcsprite-nether_quartz_ore { background-position: -96px -736px}.mcsprite-nether_sprouts { background-position: -128px -736px}.mcsprite-nether_sprouts_old { background-position: -160px -736px}.mcsprite-nether_star { background-position: -192px -736px}.mcsprite-nether_wart { background-position: -224px -736px}.mcsprite-nether_wart_block { background-position: -256px -736px}.mcsprite-netherite_axe { background-position: -288px -736px}.mcsprite-netherite_boots { background-position: -320px -736px}.mcsprite-netherite_chestplate { background-position: -352px -736px}.mcsprite-netherite_helmet { background-position: -384px -736px}.mcsprite-netherite_hoe { background-position: -416px -736px}.mcsprite-netherite_ingot { background-position: -448px -736px}.mcsprite-netherite_leggings { background-position: -480px -736px}.mcsprite-netherite_pickaxe { background-position: -512px -736px}.mcsprite-netherite_scrap { background-position: -544px -736px}.mcsprite-netherite_shovel { background-position: -576px -736px}.mcsprite-netherite_sword { background-position: -608px -736px}.mcsprite-netherrack { background-position: -640px -736px}.mcsprite-note_block { background-position: -672px -736px}.mcsprite-oak_boat { background-position: -704px -736px}.mcsprite-oak_button { background-position: -736px -736px}.mcsprite-oak_door { background-position: -768px -736px}.mcsprite-oak_fence { background-position: -800px -736px}.mcsprite-oak_fence_gate { background-position: -832px -736px}.mcsprite-oak_leaves { background-position: -864px -736px}.mcsprite-oak_log { background-position: -896px -736px}.mcsprite-oak_planks { background-position: -928px -736px}.mcsprite-oak_pressure_plate { background-position: -960px -736px}.mcsprite-oak_sapling { background-position: -992px -736px}.mcsprite-oak_sign { background-position: -1024px -736px}.mcsprite-oak_slab { background-position: -1056px -736px}.mcsprite-oak_stairs { background-position: -1088px -736px}.mcsprite-oak_trapdoor { background-position: -1120px -736px}.mcsprite-oak_wood { background-position: -1152px -736px}.mcsprite-oak_wood_button { background-position: -1184px -736px}.mcsprite-oak_wood_door { background-position: -1216px -736px}.mcsprite-oak_wood_fence { background-position: -1248px -736px}.mcsprite-oak_wood_fence_gate { background-position: 0 -768px}.mcsprite-oak_wood_planks { background-position: -32px -768px}.mcsprite-oak_wood_pressure_plate { background-position: -64px -768px}.mcsprite-oak_wood_sign { background-position: -96px -768px}.mcsprite-oak_wood_slab { background-position: -128px -768px}.mcsprite-oak_wood_stairs { background-position: -160px -768px}.mcsprite-oak_wood_trapdoor { background-position: -192px -768px}.mcsprite-observer { background-position: -224px -768px}.mcsprite-obsidian { background-position: -256px -768px}.mcsprite-ocean_explorer_map { background-position: -288px -768px}.mcsprite-ocelot_spawn_egg { background-position: -320px -768px}.mcsprite-ominous_shield { background-position: -352px -768px}.mcsprite-orange_banner { background-position: -384px -768px}.mcsprite-orange_bed { background-position: -416px -768px}.mcsprite-orange_bed_lce { background-position: -448px -768px}.mcsprite-orange_candle { background-position: -480px -768px}.mcsprite-orange_carpet { background-position: -512px -768px}.mcsprite-orange_concrete { background-position: -544px -768px}.mcsprite-orange_concrete_powder { background-position: -576px -768px}.mcsprite-orange_dye { background-position: -608px -768px}.mcsprite-orange_firework_star { background-position: -640px -768px}.mcsprite-orange_glazed_terracotta { background-position: -672px -768px}.mcsprite-orange_shield { background-position: -704px -768px}.mcsprite-orange_shulker_box { background-position: -736px -768px}.mcsprite-orange_stained_glass { background-position: -768px -768px}.mcsprite-orange_stained_glass_pane { background-position: -800px -768px}.mcsprite-orange_terracotta { background-position: -832px -768px}.mcsprite-orange_tulip { background-position: -864px -768px}.mcsprite-orange_wool { background-position: -896px -768px}.mcsprite-oxeye_daisy { background-position: -928px -768px}.mcsprite-oxidized_copper { background-position: -960px -768px}.mcsprite-oxidized_copper_block { background-position: -992px -768px}.mcsprite-oxidized_cut_copper { background-position: -1024px -768px}.mcsprite-oxidized_cut_copper_block { background-position: -1056px -768px}.mcsprite-oxidized_cut_copper_slab { background-position: -1088px -768px}.mcsprite-oxidized_cut_copper_stairs { background-position: -1120px -768px}.mcsprite-packed_ice { background-position: -1152px -768px}.mcsprite-painting { background-position: -1184px -768px}.mcsprite-panda_spawn_egg { background-position: -1216px -768px}.mcsprite-paper { background-position: -1248px -768px}.mcsprite-parrot_spawn_egg { background-position: 0 -800px}.mcsprite-peony { background-position: -32px -800px}.mcsprite-petrified_oak_slab { background-position: -64px -800px}.mcsprite-phantom_membrane { background-position: -96px -800px}.mcsprite-phantom_spawn_egg { background-position: -128px -800px}.mcsprite-pig_spawn_egg { background-position: -160px -800px}.mcsprite-piglin_brute_spawn_egg { background-position: -192px -800px}.mcsprite-piglin_spawn_egg { background-position: -224px -800px}.mcsprite-pillager_spawn_egg { background-position: -256px -800px}.mcsprite-pink_banner { background-position: -288px -800px}.mcsprite-pink_bed { background-position: -320px -800px}.mcsprite-pink_bed_lce { background-position: -352px -800px}.mcsprite-pink_candle { background-position: -384px -800px}.mcsprite-pink_carpet { background-position: -416px -800px}.mcsprite-pink_concrete { background-position: -448px -800px}.mcsprite-pink_concrete_powder { background-position: -480px -800px}.mcsprite-pink_dye { background-position: -512px -800px}.mcsprite-pink_firework_star { background-position: -544px -800px}.mcsprite-pink_glazed_terracotta { background-position: -576px -800px}.mcsprite-pink_shield { background-position: -608px -800px}.mcsprite-pink_shulker_box { background-position: -640px -800px}.mcsprite-pink_stained_glass { background-position: -672px -800px}.mcsprite-pink_stained_glass_pane { background-position: -704px -800px}.mcsprite-pink_terracotta { background-position: -736px -800px}.mcsprite-pink_tulip { background-position: -768px -800px}.mcsprite-pink_wool { background-position: -800px -800px}.mcsprite-piston { background-position: -832px -800px}.mcsprite-player_head { background-position: -864px -800px}.mcsprite-podzol { background-position: -896px -800px}.mcsprite-pointed_dripstone { background-position: -928px -800px}.mcsprite-poisonous_potato { background-position: -960px -800px}.mcsprite-polar_bear_spawn_egg { background-position: -992px -800px}.mcsprite-polished_andesite { background-position: -1024px -800px}.mcsprite-polished_andesite_slab { background-position: -1056px -800px}.mcsprite-polished_andesite_stairs { background-position: -1088px -800px}.mcsprite-polished_basalt { background-position: -1120px -800px}.mcsprite-polished_blackstone { background-position: -1152px -800px}.mcsprite-polished_blackstone_brick_slab { background-position: -1184px -800px}.mcsprite-polished_blackstone_brick_stairs { background-position: -1216px -800px}.mcsprite-polished_blackstone_brick_wall { background-position: -1248px -800px}.mcsprite-polished_blackstone_bricks { background-position: 0 -832px}.mcsprite-polished_blackstone_button { background-position: -32px -832px}.mcsprite-polished_blackstone_pressure_plate { background-position: -64px -832px}.mcsprite-polished_blackstone_slab { background-position: -96px -832px}.mcsprite-polished_blackstone_stairs { background-position: -128px -832px}.mcsprite-polished_blackstone_wall { background-position: -160px -832px}.mcsprite-polished_deepslate { background-position: -192px -832px}.mcsprite-polished_deepslate_slab { background-position: -224px -832px}.mcsprite-polished_deepslate_stairs { background-position: -256px -832px}.mcsprite-polished_deepslate_wall { background-position: -288px -832px}.mcsprite-polished_diorite { background-position: -320px -832px}.mcsprite-polished_diorite_slab { background-position: -352px -832px}.mcsprite-polished_diorite_stairs { background-position: -384px -832px}.mcsprite-polished_granite { background-position: -416px -832px}.mcsprite-polished_granite_slab { background-position: -448px -832px}.mcsprite-polished_granite_stairs { background-position: -480px -832px}.mcsprite-popped_chorus_fruit { background-position: -512px -832px}.mcsprite-poppy { background-position: -544px -832px}.mcsprite-portal { background-position: -576px -832px}.mcsprite-potato { background-position: -608px -832px}.mcsprite-potion_of_decay { background-position: -640px -832px}.mcsprite-potion_of_fire_resistance { background-position: -672px -832px}.mcsprite-potion_of_harming { background-position: -704px -832px}.mcsprite-potion_of_healing { background-position: -736px -832px}.mcsprite-potion_of_invisibility { background-position: -768px -832px}.mcsprite-potion_of_leaping { background-position: -800px -832px}.mcsprite-potion_of_levitation { background-position: -832px -832px}.mcsprite-potion_of_luck { background-position: -864px -832px}.mcsprite-potion_of_night_vision { background-position: -896px -832px}.mcsprite-potion_of_poison { background-position: -928px -832px}.mcsprite-potion_of_regeneration { background-position: -960px -832px}.mcsprite-potion_of_slow_falling { background-position: -992px -832px}.mcsprite-potion_of_slowness { background-position: -1024px -832px}.mcsprite-potion_of_strength { background-position: -1056px -832px}.mcsprite-potion_of_swiftness { background-position: -1088px -832px}.mcsprite-potion_of_the_turtle_master { background-position: -1120px -832px}.mcsprite-potion_of_water_breathing { background-position: -1152px -832px}.mcsprite-potion_of_weakness { background-position: -1184px -832px}.mcsprite-powder_snow { background-position: -1216px -832px}.mcsprite-powder_snow_bucket { background-position: -1248px -832px}.mcsprite-powered_rail { background-position: 0 -864px}.mcsprite-prismarine { background-position: -32px -864px}.mcsprite-prismarine_brick_slab { background-position: -64px -864px}.mcsprite-prismarine_brick_stairs { background-position: -96px -864px}.mcsprite-prismarine_brick_stairs_old { background-position: -128px -864px}.mcsprite-prismarine_bricks { background-position: -160px -864px}.mcsprite-prismarine_bricks_slab { background-position: -192px -864px}.mcsprite-prismarine_crystals { background-position: -224px -864px}.mcsprite-prismarine_shard { background-position: -256px -864px}.mcsprite-prismarine_wall { background-position: -288px -864px}.mcsprite-pufferfish { background-position: -320px -864px}.mcsprite-pufferfish_spawn_egg { background-position: -352px -864px}.mcsprite-pumpkin { background-position: -384px -864px}.mcsprite-pumpkin_pie { background-position: -416px -864px}.mcsprite-pumpkin_seeds { background-position: -448px -864px}.mcsprite-purple_banner { background-position: -480px -864px}.mcsprite-purple_bed { background-position: -512px -864px}.mcsprite-purple_bed_lce { background-position: -544px -864px}.mcsprite-purple_candle { background-position: -576px -864px}.mcsprite-purple_carpet { background-position: -608px -864px}.mcsprite-purple_concrete { background-position: -640px -864px}.mcsprite-purple_concrete_powder { background-position: -672px -864px}.mcsprite-purple_dye { background-position: -704px -864px}.mcsprite-purple_firework_star { background-position: -736px -864px}.mcsprite-purple_glazed_terracotta { background-position: -768px -864px}.mcsprite-purple_shield { background-position: -800px -864px}.mcsprite-purple_shulker_box { background-position: -832px -864px}.mcsprite-purple_stained_glass { background-position: -864px -864px}.mcsprite-purple_stained_glass_pane { background-position: -896px -864px}.mcsprite-purple_terracotta { background-position: -928px -864px}.mcsprite-purple_wool { background-position: -960px -864px}.mcsprite-purpur_block { background-position: -992px -864px}.mcsprite-purpur_pillar { background-position: -1024px -864px}.mcsprite-purpur_slab { background-position: -1056px -864px}.mcsprite-purpur_stairs { background-position: -1088px -864px}.mcsprite-quartz_bricks { background-position: -1120px -864px}.mcsprite-quartz_pillar { background-position: -1152px -864px}.mcsprite-quartz_slab { background-position: -1184px -864px}.mcsprite-quartz_stairs { background-position: -1216px -864px}.mcsprite-rabbit_hide { background-position: -1248px -864px}.mcsprite-rabbit_spawn_egg { background-position: 0 -896px}.mcsprite-rabbit_stew { background-position: -32px -896px}.mcsprite-rabbits_foot { background-position: -64px -896px}.mcsprite-rail { background-position: -96px -896px}.mcsprite-ravager_spawn_egg { background-position: -128px -896px}.mcsprite-raw_beef { background-position: -160px -896px}.mcsprite-raw_chicken { background-position: -192px -896px}.mcsprite-raw_cod { background-position: -224px -896px}.mcsprite-raw_copper { background-position: -256px -896px}.mcsprite-raw_fish { background-position: -288px -896px}.mcsprite-raw_gold { background-position: -320px -896px}.mcsprite-raw_iron { background-position: -352px -896px}.mcsprite-raw_mutton { background-position: -384px -896px}.mcsprite-raw_porkchop { background-position: -416px -896px}.mcsprite-raw_rabbit { background-position: -448px -896px}.mcsprite-raw_salmon { background-position: -480px -896px}.mcsprite-red_banner { background-position: -512px -896px}.mcsprite-red_bed { background-position: -544px -896px}.mcsprite-red_bed_lce { background-position: -576px -896px}.mcsprite-red_candle { background-position: -608px -896px}.mcsprite-red_carpet { background-position: -640px -896px}.mcsprite-red_concrete { background-position: -672px -896px}.mcsprite-red_concrete_powder { background-position: -704px -896px}.mcsprite-red_dye { background-position: -736px -896px}.mcsprite-red_firework_star { background-position: -768px -896px}.mcsprite-red_glazed_terracotta { background-position: -800px -896px}.mcsprite-red_mushroom { background-position: -832px -896px}.mcsprite-red_mushroom_block { background-position: -864px -896px}.mcsprite-red_nether_brick_slab { background-position: -896px -896px}.mcsprite-red_nether_brick_stairs { background-position: -928px -896px}.mcsprite-red_nether_brick_wall { background-position: -960px -896px}.mcsprite-red_nether_bricks { background-position: -992px -896px}.mcsprite-red_sand { background-position: -1024px -896px}.mcsprite-red_sandstone { background-position: -1056px -896px}.mcsprite-red_sandstone_slab { background-position: -1088px -896px}.mcsprite-red_sandstone_stairs { background-position: -1120px -896px}.mcsprite-red_sandstone_wall { background-position: -1152px -896px}.mcsprite-red_shield { background-position: -1184px -896px}.mcsprite-red_shulker_box { background-position: -1216px -896px}.mcsprite-red_stained_glass { background-position: -1248px -896px}.mcsprite-red_stained_glass_pane { background-position: 0 -928px}.mcsprite-red_terracotta { background-position: -32px -928px}.mcsprite-red_tulip { background-position: -64px -928px}.mcsprite-red_wool { background-position: -96px -928px}.mcsprite-redstone { background-position: -128px -928px}.mcsprite-redstone_comparator { background-position: -160px -928px}.mcsprite-redstone_dust { background-position: -192px -928px}.mcsprite-redstone_lamp { background-position: -224px -928px}.mcsprite-redstone_ore { background-position: -256px -928px}.mcsprite-redstone_repeater { background-position: -288px -928px}.mcsprite-redstone_torch { background-position: -320px -928px}.mcsprite-respawn_anchor { background-position: -352px -928px}.mcsprite-rooted_dirt { background-position: -384px -928px}.mcsprite-rose_bush { background-position: -416px -928px}.mcsprite-rose_red { background-position: -448px -928px}.mcsprite-rotten_flesh { background-position: -480px -928px}.mcsprite-saddle { background-position: -512px -928px}.mcsprite-salmon_spawn_egg { background-position: -544px -928px}.mcsprite-sand { background-position: -576px -928px}.mcsprite-sandstone { background-position: -608px -928px}.mcsprite-sandstone_slab { background-position: -640px -928px}.mcsprite-sandstone_stairs { background-position: -672px -928px}.mcsprite-sandstone_wall { background-position: -704px -928px}.mcsprite-scaffolding { background-position: -736px -928px}.mcsprite-sculk_sensor { background-position: -768px -928px}.mcsprite-scute { background-position: -800px -928px}.mcsprite-sea_lantern { background-position: -832px -928px}.mcsprite-sea_pickle { background-position: -864px -928px}.mcsprite-seagrass { background-position: -896px -928px}.mcsprite-seeds { background-position: -928px -928px}.mcsprite-shears { background-position: -960px -928px}.mcsprite-sheep_spawn_egg { background-position: -992px -928px}.mcsprite-shield { background-position: -1024px -928px}.mcsprite-shroomlight { background-position: -1056px -928px}.mcsprite-shrub_lce { background-position: -1088px -928px}.mcsprite-shulker_box { background-position: -1120px -928px}.mcsprite-shulker_shell { background-position: -1152px -928px}.mcsprite-shulker_spawn_egg { background-position: -1184px -928px}.mcsprite-silverfish_spawn_egg { background-position: -1216px -928px}.mcsprite-skeleton_horse_spawn_egg { background-position: -1248px -928px}.mcsprite-skeleton_skull { background-position: 0 -960px}.mcsprite-skeleton_spawn_egg { background-position: -32px -960px}.mcsprite-slime_block { background-position: -64px -960px}.mcsprite-slime_spawn_egg { background-position: -96px -960px}.mcsprite-slimeball { background-position: -128px -960px}.mcsprite-small_amethyst_bud { background-position: -160px -960px}.mcsprite-small_dripleaf { background-position: -192px -960px}.mcsprite-smithing_table { background-position: -224px -960px}.mcsprite-smoker { background-position: -256px -960px}.mcsprite-smooth_basalt { background-position: -288px -960px}.mcsprite-smooth_quartz { background-position: -320px -960px}.mcsprite-smooth_quartz_block { background-position: -352px -960px}.mcsprite-smooth_quartz_slab { background-position: -384px -960px}.mcsprite-smooth_quartz_stairs { background-position: -416px -960px}.mcsprite-smooth_red_sandstone { background-position: -448px -960px}.mcsprite-smooth_red_sandstone_slab { background-position: -480px -960px}.mcsprite-smooth_red_sandstone_stairs { background-position: -512px -960px}.mcsprite-smooth_sandstone { background-position: -544px -960px}.mcsprite-smooth_sandstone_slab { background-position: -576px -960px}.mcsprite-smooth_sandstone_stairs { background-position: -608px -960px}.mcsprite-smooth_stone { background-position: -640px -960px}.mcsprite-smooth_stone_bricks { background-position: -672px -960px}.mcsprite-smooth_stone_slab { background-position: -704px -960px}.mcsprite-snow { background-position: -736px -960px}.mcsprite-snow_block { background-position: -768px -960px}.mcsprite-snowball { background-position: -800px -960px}.mcsprite-soul_campfire { background-position: -832px -960px}.mcsprite-soul_lantern { background-position: -864px -960px}.mcsprite-soul_sand { background-position: -896px -960px}.mcsprite-soul_soil { background-position: -928px -960px}.mcsprite-soul_torch { background-position: -960px -960px}.mcsprite-spawn_agent { background-position: -992px -960px}.mcsprite-spawn_bat { background-position: -1024px -960px}.mcsprite-spawn_bee { background-position: -1056px -960px}.mcsprite-spawn_blaze { background-position: -1088px -960px}.mcsprite-spawn_cat { background-position: -1120px -960px}.mcsprite-spawn_cave_spider { background-position: -1152px -960px}.mcsprite-spawn_chicken { background-position: -1184px -960px}.mcsprite-spawn_cod { background-position: -1216px -960px}.mcsprite-spawn_cow { background-position: -1248px -960px}.mcsprite-spawn_creeper { background-position: 0 -992px}.mcsprite-spawn_dolphin { background-position: -32px -992px}.mcsprite-spawn_donkey { background-position: -64px -992px}.mcsprite-spawn_drowned { background-position: -96px -992px}.mcsprite-spawn_elder_guardian { background-position: -128px -992px}.mcsprite-spawn_enderman { background-position: -160px -992px}.mcsprite-spawn_endermite { background-position: -192px -992px}.mcsprite-spawn_evoker { background-position: -224px -992px}.mcsprite-spawn_fox { background-position: -256px -992px}.mcsprite-spawn_ghast { background-position: -288px -992px}.mcsprite-spawn_goat { background-position: -320px -992px}.mcsprite-spawn_guardian { background-position: -352px -992px}.mcsprite-spawn_horse { background-position: -384px -992px}.mcsprite-spawn_husk { background-position: -416px -992px}.mcsprite-spawn_llama { background-position: -448px -992px}.mcsprite-spawn_magma_cube { background-position: -480px -992px}.mcsprite-spawn_mask { background-position: -512px -992px}.mcsprite-spawn_mooshroom { background-position: -544px -992px}.mcsprite-spawn_mule { background-position: -576px -992px}.mcsprite-spawn_npc { background-position: -608px -992px}.mcsprite-spawn_ocelot { background-position: -640px -992px}.mcsprite-spawn_panda { background-position: -672px -992px}.mcsprite-spawn_parrot { background-position: -704px -992px}.mcsprite-spawn_phantom { background-position: -736px -992px}.mcsprite-spawn_pig { background-position: -768px -992px}.mcsprite-spawn_pillager { background-position: -800px -992px}.mcsprite-spawn_polar_bear { background-position: -832px -992px}.mcsprite-spawn_pufferfish { background-position: -864px -992px}.mcsprite-spawn_rabbit { background-position: -896px -992px}.mcsprite-spawn_ravager { background-position: -928px -992px}.mcsprite-spawn_salmon { background-position: -960px -992px}.mcsprite-spawn_sheep { background-position: -992px -992px}.mcsprite-spawn_shulker { background-position: -1024px -992px}.mcsprite-spawn_silverfish { background-position: -1056px -992px}.mcsprite-spawn_skeleton { background-position: -1088px -992px}.mcsprite-spawn_skeleton_horse { background-position: -1120px -992px}.mcsprite-spawn_slime { background-position: -1152px -992px}.mcsprite-spawn_spider { background-position: -1184px -992px}.mcsprite-spawn_squid { background-position: -1216px -992px}.mcsprite-spawn_stray { background-position: -1248px -992px}.mcsprite-spawn_strider { background-position: 0 -1024px}.mcsprite-spawn_trader_llama { background-position: -32px -1024px}.mcsprite-spawn_tropical_fish { background-position: -64px -1024px}.mcsprite-spawn_turtle { background-position: -96px -1024px}.mcsprite-spawn_vex { background-position: -128px -1024px}.mcsprite-spawn_villager { background-position: -160px -1024px}.mcsprite-spawn_vindicator { background-position: -192px -1024px}.mcsprite-spawn_wandering_trader { background-position: -224px -1024px}.mcsprite-spawn_witch { background-position: -256px -1024px}.mcsprite-spawn_wither_skeleton { background-position: -288px -1024px}.mcsprite-spawn_wolf { background-position: -320px -1024px}.mcsprite-spawn_zoglin { background-position: -352px -1024px}.mcsprite-spawn_zombie { background-position: -384px -1024px}.mcsprite-spawn_zombie_horse { background-position: -416px -1024px}.mcsprite-spawn_zombie_pigman { background-position: -448px -1024px}.mcsprite-spawn_zombie_villager { background-position: -480px -1024px}.mcsprite-spawner { background-position: -512px -1024px}.mcsprite-spectral_arrow { background-position: -544px -1024px}.mcsprite-spider_eye { background-position: -576px -1024px}.mcsprite-spider_spawn_egg { background-position: -608px -1024px}.mcsprite-splash_mundane_potion { background-position: -640px -1024px}.mcsprite-splash_potion_of_decay { background-position: -672px -1024px}.mcsprite-splash_potion_of_fire_resistance { background-position: -704px -1024px}.mcsprite-splash_potion_of_harming { background-position: -736px -1024px}.mcsprite-splash_potion_of_healing { background-position: -768px -1024px}.mcsprite-splash_potion_of_invisibility { background-position: -800px -1024px}.mcsprite-splash_potion_of_leaping { background-position: -832px -1024px}.mcsprite-splash_potion_of_levitation { background-position: -864px -1024px}.mcsprite-splash_potion_of_luck { background-position: -896px -1024px}.mcsprite-splash_potion_of_night_vision { background-position: -928px -1024px}.mcsprite-splash_potion_of_poison { background-position: -960px -1024px}.mcsprite-splash_potion_of_regeneration { background-position: -992px -1024px}.mcsprite-splash_potion_of_slow_falling { background-position: -1024px -1024px}.mcsprite-splash_potion_of_slowness { background-position: -1056px -1024px}.mcsprite-splash_potion_of_strength { background-position: -1088px -1024px}.mcsprite-splash_potion_of_swiftness { background-position: -1120px -1024px}.mcsprite-splash_potion_of_the_turtle_master { background-position: -1152px -1024px}.mcsprite-splash_potion_of_water_breathing { background-position: -1184px -1024px}.mcsprite-splash_potion_of_weakness { background-position: -1216px -1024px}.mcsprite-splash_water_bottle { background-position: -1248px -1024px}.mcsprite-sponge { background-position: 0 -1056px}.mcsprite-spore_blossom { background-position: -32px -1056px}.mcsprite-spruce_boat { background-position: -64px -1056px}.mcsprite-spruce_button { background-position: -96px -1056px}.mcsprite-spruce_door { background-position: -128px -1056px}.mcsprite-spruce_fence { background-position: -160px -1056px}.mcsprite-spruce_fence_gate { background-position: -192px -1056px}.mcsprite-spruce_leaves { background-position: -224px -1056px}.mcsprite-spruce_log { background-position: -256px -1056px}.mcsprite-spruce_planks { background-position: -288px -1056px}.mcsprite-spruce_pressure_plate { background-position: -320px -1056px}.mcsprite-spruce_sapling { background-position: -352px -1056px}.mcsprite-spruce_sign { background-position: -384px -1056px}.mcsprite-spruce_slab { background-position: -416px -1056px}.mcsprite-spruce_stairs { background-position: -448px -1056px}.mcsprite-spruce_trapdoor { background-position: -480px -1056px}.mcsprite-spruce_wood { background-position: -512px -1056px}.mcsprite-spruce_wood_button { background-position: -544px -1056px}.mcsprite-spruce_wood_door { background-position: -576px -1056px}.mcsprite-spruce_wood_fence { background-position: -608px -1056px}.mcsprite-spruce_wood_fence_gate { background-position: -640px -1056px}.mcsprite-spruce_wood_planks { background-position: -672px -1056px}.mcsprite-spruce_wood_pressure_plate { background-position: -704px -1056px}.mcsprite-spruce_wood_sign { background-position: -736px -1056px}.mcsprite-spruce_wood_slab { background-position: -768px -1056px}.mcsprite-spruce_wood_stairs { background-position: -800px -1056px}.mcsprite-spruce_wood_trapdoor { background-position: -832px -1056px}.mcsprite-spyglass { background-position: -864px -1056px}.mcsprite-squid_spawn_egg { background-position: -896px -1056px}.mcsprite-steak { background-position: -928px -1056px}.mcsprite-stick { background-position: -960px -1056px}.mcsprite-sticky_piston { background-position: -992px -1056px}.mcsprite-stone { background-position: -1024px -1056px}.mcsprite-stone_axe { background-position: -1056px -1056px}.mcsprite-stone_brick_slab { background-position: -1088px -1056px}.mcsprite-stone_brick_stairs { background-position: -1120px -1056px}.mcsprite-stone_brick_wall { background-position: -1152px -1056px}.mcsprite-stone_bricks { background-position: -1184px -1056px}.mcsprite-stone_bricks_monster_egg { background-position: -1216px -1056px}.mcsprite-stone_button { background-position: -1248px -1056px}.mcsprite-stone_hoe { background-position: 0 -1088px}.mcsprite-stone_monster_egg { background-position: -32px -1088px}.mcsprite-stone_pickaxe { background-position: -64px -1088px}.mcsprite-stone_pressure_plate { background-position: -96px -1088px}.mcsprite-stone_shovel { background-position: -128px -1088px}.mcsprite-stone_slab { background-position: -160px -1088px}.mcsprite-stone_stairs { background-position: -192px -1088px}.mcsprite-stone_sword { background-position: -224px -1088px}.mcsprite-stray_spawn_egg { background-position: -256px -1088px}.mcsprite-strider_spawn_egg { background-position: -288px -1088px}.mcsprite-string { background-position: -320px -1088px}.mcsprite-stripped_acacia_log { background-position: -352px -1088px}.mcsprite-stripped_acacia_wood { background-position: -384px -1088px}.mcsprite-stripped_birch_log { background-position: -416px -1088px}.mcsprite-stripped_birch_wood { background-position: -448px -1088px}.mcsprite-stripped_crimson_hyphae { background-position: -480px -1088px}.mcsprite-stripped_crimson_stem { background-position: -512px -1088px}.mcsprite-stripped_dark_oak_log { background-position: -544px -1088px}.mcsprite-stripped_dark_oak_wood { background-position: -576px -1088px}.mcsprite-stripped_jungle_log { background-position: -608px -1088px}.mcsprite-stripped_jungle_wood { background-position: -640px -1088px}.mcsprite-stripped_oak_log { background-position: -672px -1088px}.mcsprite-stripped_oak_wood { background-position: -704px -1088px}.mcsprite-stripped_spruce_log { background-position: -736px -1088px}.mcsprite-stripped_spruce_wood { background-position: -768px -1088px}.mcsprite-stripped_warped_hyphae { background-position: -800px -1088px}.mcsprite-stripped_warped_stem { background-position: -832px -1088px}.mcsprite-structure_block { background-position: -864px -1088px}.mcsprite-structure_void { background-position: -896px -1088px}.mcsprite-sugar { background-position: -928px -1088px}.mcsprite-sugar_cane { background-position: -960px -1088px}.mcsprite-sunflower { background-position: -992px -1088px}.mcsprite-suspicious_stew { background-position: -1024px -1088px}.mcsprite-sweet_berries { background-position: -1056px -1088px}.mcsprite-tall_grass { background-position: -1088px -1088px}.mcsprite-target { background-position: -1120px -1088px}.mcsprite-terracotta { background-position: -1152px -1088px}.mcsprite-thick_lingering_potion { background-position: -1184px -1088px}.mcsprite-thick_potion { background-position: -1216px -1088px}.mcsprite-thick_splash_potion { background-position: -1248px -1088px}.mcsprite-tinted_glass { background-position: 0 -1120px}.mcsprite-tipped_arrow { background-position: -32px -1120px}.mcsprite-tnt { background-position: -64px -1120px}.mcsprite-top_snow { background-position: -96px -1120px}.mcsprite-torch { background-position: -128px -1120px}.mcsprite-totem_of_undying { background-position: -160px -1120px}.mcsprite-trader_llama_spawn_egg { background-position: -192px -1120px}.mcsprite-trapped_chest { background-position: -224px -1120px}.mcsprite-treasure_map { background-position: -256px -1120px}.mcsprite-trident { background-position: -288px -1120px}.mcsprite-tripwire_hook { background-position: -320px -1120px}.mcsprite-tropical_fish { background-position: -352px -1120px}.mcsprite-tropical_fish_spawn_egg { background-position: -384px -1120px}.mcsprite-tube_coral { background-position: -416px -1120px}.mcsprite-tube_coral_block { background-position: -448px -1120px}.mcsprite-tube_coral_fan { background-position: -480px -1120px}.mcsprite-tuff { background-position: -512px -1120px}.mcsprite-turtle_egg { background-position: -544px -1120px}.mcsprite-turtle_helmet { background-position: -576px -1120px}.mcsprite-turtle_shell { background-position: -608px -1120px}.mcsprite-turtle_spawn_egg { background-position: -640px -1120px}.mcsprite-twisting_vines { background-position: -672px -1120px}.mcsprite-uncraftable_lingering_potion { background-position: -704px -1120px}.mcsprite-uncraftable_potion { background-position: -736px -1120px}.mcsprite-uncraftable_splash_potion { background-position: -768px -1120px}.mcsprite-uncraftable_tipped_arrow { background-position: -800px -1120px}.mcsprite-vex_spawn_egg { background-position: -832px -1120px}.mcsprite-villager_spawn_egg { background-position: -864px -1120px}.mcsprite-vindicator_spawn_egg { background-position: -896px -1120px}.mcsprite-vines { background-position: -928px -1120px}.mcsprite-void_air { background-position: -960px -1120px}.mcsprite-wandering_trader_spawn_egg { background-position: -992px -1120px}.mcsprite-warped_button { background-position: -1024px -1120px}.mcsprite-warped_door { background-position: -1056px -1120px}.mcsprite-warped_fence { background-position: -1088px -1120px}.mcsprite-warped_fence_gate { background-position: -1120px -1120px}.mcsprite-warped_fungus { background-position: -1152px -1120px}.mcsprite-warped_fungus_on_a_stick { background-position: -1184px -1120px}.mcsprite-warped_hyphae { background-position: -1216px -1120px}.mcsprite-warped_nylium { background-position: -1248px -1120px}.mcsprite-warped_planks { background-position: 0 -1152px}.mcsprite-warped_pressure_plate { background-position: -32px -1152px}.mcsprite-warped_roots { background-position: -64px -1152px}.mcsprite-warped_sign { background-position: -96px -1152px}.mcsprite-warped_slab { background-position: -128px -1152px}.mcsprite-warped_stairs { background-position: -160px -1152px}.mcsprite-warped_stem { background-position: -192px -1152px}.mcsprite-warped_trapdoor { background-position: -224px -1152px}.mcsprite-warped_wart_block { background-position: -256px -1152px}.mcsprite-water { background-position: -288px -1152px}.mcsprite-water_bottle { background-position: -320px -1152px}.mcsprite-water_bucket { background-position: -352px -1152px}.mcsprite-waxed_block_of_copper { background-position: -384px -1152px}.mcsprite-waxed_copper { background-position: -416px -1152px}.mcsprite-waxed_copper_block { background-position: -448px -1152px}.mcsprite-waxed_cut_copper { background-position: -480px -1152px}.mcsprite-waxed_cut_copper_block { background-position: -512px -1152px}.mcsprite-waxed_cut_copper_slab { background-position: -544px -1152px}.mcsprite-waxed_cut_copper_stairs { background-position: -576px -1152px}.mcsprite-waxed_exposed_copper { background-position: -608px -1152px}.mcsprite-waxed_exposed_copper_block { background-position: -640px -1152px}.mcsprite-waxed_exposed_cut_copper { background-position: -672px -1152px}.mcsprite-waxed_exposed_cut_copper_block { background-position: -704px -1152px}.mcsprite-waxed_exposed_cut_copper_slab { background-position: -736px -1152px}.mcsprite-waxed_exposed_cut_copper_stairs { background-position: -768px -1152px}.mcsprite-waxed_oxidized_copper { background-position: -800px -1152px}.mcsprite-waxed_oxidized_copper_block { background-position: -832px -1152px}.mcsprite-waxed_oxidized_cut_copper { background-position: -864px -1152px}.mcsprite-waxed_oxidized_cut_copper_block { background-position: -896px -1152px}.mcsprite-waxed_oxidized_cut_copper_slab { background-position: -928px -1152px}.mcsprite-waxed_oxidized_cut_copper_stairs { background-position: -960px -1152px}.mcsprite-waxed_weathered_copper { background-position: -992px -1152px}.mcsprite-waxed_weathered_copper_block { background-position: -1024px -1152px}.mcsprite-waxed_weathered_cut_copper { background-position: -1056px -1152px}.mcsprite-waxed_weathered_cut_copper_block { background-position: -1088px -1152px}.mcsprite-waxed_weathered_cut_copper_slab { background-position: -1120px -1152px}.mcsprite-waxed_weathered_cut_copper_stairs { background-position: -1152px -1152px}.mcsprite-weathered_copper { background-position: -1184px -1152px}.mcsprite-weathered_copper_block { background-position: -1216px -1152px}.mcsprite-weathered_cut_copper { background-position: -1248px -1152px}.mcsprite-weathered_cut_copper_block { background-position: 0 -1184px}.mcsprite-weathered_cut_copper_slab { background-position: -32px -1184px}.mcsprite-weathered_cut_copper_stairs { background-position: -64px -1184px}.mcsprite-weeping_vines { background-position: -96px -1184px}.mcsprite-wet_sponge { background-position: -128px -1184px}.mcsprite-wheat { background-position: -160px -1184px}.mcsprite-wheat_seeds { background-position: -192px -1184px}.mcsprite-white_banner { background-position: -224px -1184px}.mcsprite-white_bed { background-position: -256px -1184px}.mcsprite-white_bed_lce { background-position: -288px -1184px}.mcsprite-white_candle { background-position: -320px -1184px}.mcsprite-white_carpet { background-position: -352px -1184px}.mcsprite-white_concrete { background-position: -384px -1184px}.mcsprite-white_concrete_powder { background-position: -416px -1184px}.mcsprite-white_dye { background-position: -448px -1184px}.mcsprite-white_firework_star { background-position: -480px -1184px}.mcsprite-white_glazed_terracotta { background-position: -512px -1184px}.mcsprite-white_shield { background-position: -544px -1184px}.mcsprite-white_shulker_box { background-position: -576px -1184px}.mcsprite-white_stained_glass { background-position: -608px -1184px}.mcsprite-white_stained_glass_pane { background-position: -640px -1184px}.mcsprite-white_terracotta { background-position: -672px -1184px}.mcsprite-white_tulip { background-position: -704px -1184px}.mcsprite-white_wool { background-position: -736px -1184px}.mcsprite-witch_spawn_egg { background-position: -768px -1184px}.mcsprite-wither_rose { background-position: -800px -1184px}.mcsprite-wither_skeleton_skull { background-position: -832px -1184px}.mcsprite-wither_skeleton_spawn_egg { background-position: -864px -1184px}.mcsprite-wolf_spawn_egg { background-position: -896px -1184px}.mcsprite-wooden_axe { background-position: -928px -1184px}.mcsprite-wooden_hoe { background-position: -960px -1184px}.mcsprite-wooden_pickaxe { background-position: -992px -1184px}.mcsprite-wooden_shovel { background-position: -1024px -1184px}.mcsprite-wooden_slab { background-position: -1056px -1184px}.mcsprite-wooden_sword { background-position: -1088px -1184px}.mcsprite-woodland_explorer_map { background-position: -1120px -1184px}.mcsprite-written_book { background-position: -1152px -1184px}.mcsprite-yellow_banner { background-position: -1184px -1184px}.mcsprite-yellow_bed { background-position: -1216px -1184px}.mcsprite-yellow_bed_lce { background-position: -1248px -1184px}.mcsprite-yellow_candle { background-position: 0 -1216px}.mcsprite-yellow_carpet { background-position: -32px -1216px}.mcsprite-yellow_concrete { background-position: -64px -1216px}.mcsprite-yellow_concrete_powder { background-position: -96px -1216px}.mcsprite-yellow_dye { background-position: -128px -1216px}.mcsprite-yellow_firework_star { background-position: -160px -1216px}.mcsprite-yellow_glazed_terracotta { background-position: -192px -1216px}.mcsprite-yellow_shield { background-position: -224px -1216px}.mcsprite-yellow_shulker_box { background-position: -256px -1216px}.mcsprite-yellow_stained_glass { background-position: -288px -1216px}.mcsprite-yellow_stained_glass_pane { background-position: -320px -1216px}.mcsprite-yellow_terracotta { background-position: -352px -1216px}.mcsprite-yellow_wool { background-position: -384px -1216px}.mcsprite-zoglin_spawn_egg { background-position: -416px -1216px}.mcsprite-zombie_head { background-position: -448px -1216px}.mcsprite-zombie_horse_spawn_egg { background-position: -480px -1216px}.mcsprite-zombie_pigman_spawn_egg { background-position: -512px -1216px}.mcsprite-zombie_spawn_egg { background-position: -544px -1216px}.mcsprite-zombie_villager_spawn_egg { background-position: -576px -1216px}.mcsprite-zombified_piglin_spawn_egg { background-position: -608px -1216px}.toc { display: none; position: relative; margin: 1em 0; padding: .2em .5em; background-color: #f8f9fa; border: solid 1px #eaecf0; box-sizing: border-box}.toctogglecheckbox~ul { visibility: hidden; height: 0}.toctogglecheckbox:not(:checked)~ul { visibility: visible; padding-bottom: 20px; height: auto}.toctitle { padding: 0 25px 0 32px}.toctitle .mw-ui-icon { position: absolute; left: 0}.toctitle .toctogglespan+.mw-ui-icon { top: 8px; right: 0; left: auto}.toctogglelabel { cursor: pointer; position: absolute; left: 0; top: 0; right: 0; height: 50px; z-index: 1}.client-js .toc .toctitle { visibility: hidden; background-position: right center; font-weight: 700; border-bottom: 0}.client-js .toc .toctitle h2 { display: inline-block; font-family: -apple-system,blinkmacsystemfont,segoe ui,roboto,lato,helvetica,arial,sans-serif; font-size: 1.125em; vertical-align: middle}.client-js .toc .tocnumber { display: none}.client-js .toc>ul { margin: 0 22.85714286em 0 32px; padding-left: 0; font-size: .875em}.client-js .toc ul { list-style: none}@media screen and (min-width: 720px) { .client-js .toc { display:table } .client-js .toc .toctitle { visibility: visible }}body { font-family: -apple-system,blinkmacsystemfont,segoe ui,roboto,lato,helvetica,arial,sans-serif; line-height: 1.4; -webkit-tap-highlight-color: rgba(0,0,0,.2); overflow-y: scroll}.content { line-height: 1.65; word-wrap: break-word}.content .center { width: 100%; text-align: center}.content .center>*,.content .center .thumb { margin-left: auto; margin-right: auto}@media all and (max-width: 320px - 1) { html { font-size:80% } .content { margin: 0 12px }}.nomobile { display: none!important}@supports(font: -apple-system-body) { html { font:-apple-system-body } body { font-size: 94.11764706% } @media all and (max-width: 320px - 1) { body { font-size:75.29411765% } }}.content figure,.content .thumb { margin: .6em 0}.content figure .thumbinner,.content .thumb .thumbinner { margin: 0 auto; max-width: 100%!important}.content figcaption,.content .thumbcaption { margin: .5em 0 0; font-size: .8125em; line-height: 1.5; padding: 0!important; color: #54595d}.content .thumbcaption { width: auto!important}.content .mw-image-border,.content .thumbborder { border: 1px solid #c8ccd1}.content .magnify { display: none}.content img { vertical-align: middle}.content .floatright { clear: right; float: right; margin: 0 0 .6em .6em}.content .floatleft { clear: left; float: left; margin: 0 .6em .6em 0}.content a>img,.content noscript>img { max-width: 100%!important; height: auto!important}.content .noresize { max-width: 100%; overflow-x: auto}.content .noresize a>img { max-width: none!important}h1 { font-size: 1.7em}h2 { font-size: 1.5em}h3 { font-size: 1.2em; font-weight: 700}h4 { font-weight: 700}.pre-content h1,.content h1,.content h2 { font-family: linux libertine,helvetica,georgia,times,serif}.pre-content h1,.content h1,.content h2,h3,h4,h5,h6 { line-height: 1.3; word-wrap: break-word; word-break: break-word}.content h2,.content h3,.content h4,.content h5,.content h6 { padding: .5em 0}.content p+h3 { margin-top: 1.5em}.content {}.content ol { padding-left: 2.25em}.content ul { list-style-type: disc; padding-left: 1em}.content ul>li>ul { list-style-type: circle}.content ul>li>ul>li>ul { list-style-type: square}.content ol ol,.content ul ol,.content ol ul,.content ul ul { margin-left: 1em}.content li { margin-bottom: 10px}.content li:last-child { margin-bottom: inherit}dl { margin-left: 1em}dl dt { font-weight: 700}dl dd { display: block; overflow: auto}body.mw-hide-empty-elt .mw-empty-elt { display: none}a:not([href]) { color: #3f7dfb; cursor: pointer}a { color: #3f7dfb; text-decoration: none}a:visited { color: #ba91ff}a:active { color: #986be5}a:hover { text-decoration: underline}a.new,a.new:visited,a.new:hover { color: #d33}a.new>*,a.new:visited>*,a.new:hover>* { color: #d33}a.external { background-size: 10px; background-repeat: no-repeat; background-position: center right; padding-right: 13px}.return-link { display: block; font-size: .875em; margin-top: 1.5em}.plainlinks a { background: 0 0!important; padding: 0!important}.content p { margin: .5em 0 1em}.content hr { background-color: #a2a9b1; height: 1px; border: 0}.content kbd,.content samp,.content code,.content pre { font-family: menlo,consolas,liberation mono,courier new,monospace; border: solid 1px #c8ccd1; white-space: pre-wrap}.content code { padding: .2em .5em}.content pre { padding: 1em}b,strong { font-weight: 700}blockquote { border-left: 3px solid #c8ccd1; padding: 8px 24px 8px 32px; font-family: linux libertine,helvetica,georgia,times,serif; font-size: 1.1em}blockquote>:first-child { margin-top: 0}blockquote>:last-child { margin-bottom: 0}blockquote>:only-child { margin-top: 0; margin-bottom: 0}em,i { font-style: italic}sup { vertical-align: super}sub { vertical-align: sub}sub,sup,.content .mw-ref { font-size: .75em; line-height: 1}@media all and (max-width: 720px) { .content table { display:block; width: 100%!important; box-sizing: border-box } .content table.wikitable { border: 0 } .content caption { display: block }}.content table { margin: 1em 0; overflow: auto; overflow-y: hidden; overflow-x: auto}.content table caption { text-align: left}.wikitable { border: 1px solid #54595d; border-color: rgba(84,89,93,.3)}.wikitable>tr>th,.wikitable>tr>td,.wikitable>*>tr>th,.wikitable>*>tr>td { border: 1px solid #54595d; border-color: rgba(84,89,93,.3); padding: .2em}.wikitable>tr>th,.wikitable>*>tr>th { background-color: #eaecf0}@media screen and (min-width: 720px) { .client-js #searchIcon { display:none } .header .branding-box { width: 10.0625em } .header .search-box { display: table-cell; width: auto } .header .search-box .search { width: 23.4375em } .pre-content,#mw-content-text>form,.content,.post-content { max-width: 993.3px; margin: 0 3.35em } .content figure,.content .thumb { max-width: 704px } .content figure.mw-halign-left,.content .thumb.mw-halign-left,.content figure.tleft,.content .thumb.tleft { float: left; clear: left; margin-right: 1.4em } .content figure.mw-default-size,.content .thumb.mw-default-size,.content figure.mw-halign-right,.content .thumb.mw-halign-right,.content figure.tright,.content .thumb.tright { float: right; clear: right; margin-left: 1.4em } .content table caption { background: inherit } .content table tbody { display: table-row-group } .last-modified-bar { background-color: transparent; padding-left: 0; padding-right: 0; font-size: 1em }}@media screen and (min-width: 1000px) { .banner-container,.header,.page-header-bar,.overlay-header,.content,.overlay-content,.content-unstyled,.pre-content,.post-content,#mw-content-text>form { margin-left:auto; margin-right: auto; width: 90%; max-width: 993.3px } .header { max-width: 995.3px }}toast.mw-notification-type-error,.mw-notification.mw-notification-type-error { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.content.styles.images&image=toast.mw-notification-type-error%2C.mw-notification.mw-notification-type-error&format=rasterized&skin=minerva&version=qhhuv); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.content.styles.images&image=toast.mw-notification-type-error%2C.mw-notification.mw-notification-type-error&format=original&skin=minerva&version=qhhuv)}toast.mw-notification-type-error,.mw-notification.mw-notification-type-error--reference { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.content.styles.images&image=toast.mw-notification-type-error%2C.mw-notification.mw-notification-type-error&variant=reference&format=rasterized&skin=minerva&version=qhhuv); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.content.styles.images&image=toast.mw-notification-type-error%2C.mw-notification.mw-notification-type-error&variant=reference&format=original&skin=minerva&version=qhhuv)}a.external { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.content.styles.images&image=a.external&format=rasterized&lang=en&skin=minerva&version=qhhuv); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.content.styles.images&image=a.external&format=original&lang=en&skin=minerva&version=qhhuv)}a.external--reference { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.content.styles.images&image=a.external&variant=reference&format=rasterized&lang=en&skin=minerva&version=qhhuv); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.content.styles.images&image=a.external&variant=reference&format=original&lang=en&skin=minerva&version=qhhuv)}.mw-ui-icon-wikimedia-history-base20:before,.mw-ui-background-icon-history { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=history&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=history&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-history-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=history&variant=invert&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=history&variant=invert&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-history-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=history&variant=progressive&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=history&variant=progressive&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-language-base20:before,.mw-ui-background-icon-language { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=language&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=language&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-language-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=language&variant=invert&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=language&variant=invert&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-language-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=language&variant=progressive&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=language&variant=progressive&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-edit-base20:before,.mw-ui-background-icon-edit { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=edit&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=edit&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-edit-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=edit&variant=invert&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=edit&variant=invert&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-edit-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=edit&variant=progressive&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=edit&variant=progressive&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-editLock-base20:before,.mw-ui-background-icon-editLock { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=editLock&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=editLock&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-editLock-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=editLock&variant=invert&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=editLock&variant=invert&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-editLock-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=editLock&variant=progressive&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=editLock&variant=progressive&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-search-base20:before,.mw-ui-background-icon-search { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=search&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=search&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-search-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=search&variant=invert&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=search&variant=invert&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-search-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=search&variant=progressive&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=search&variant=progressive&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-menu-base20:before,.mw-ui-background-icon-menu { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=menu&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=menu&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-menu-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=menu&variant=invert&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=menu&variant=invert&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-menu-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=menu&variant=progressive&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=menu&variant=progressive&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-star-base20:before,.mw-ui-background-icon-star { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=star&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=star&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-star-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=star&variant=invert&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=star&variant=invert&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-star-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=star&variant=progressive&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=star&variant=progressive&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-halfStar-base20:before,.mw-ui-background-icon-halfStar { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=halfStar&format=rasterized&lang=en&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=halfStar&format=original&lang=en&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-halfStar-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=halfStar&variant=invert&format=rasterized&lang=en&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=halfStar&variant=invert&format=original&lang=en&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-halfStar-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=halfStar&variant=progressive&format=rasterized&lang=en&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=halfStar&variant=progressive&format=original&lang=en&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-unStar-base20:before,.mw-ui-background-icon-unStar { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=unStar&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=unStar&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-unStar-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=unStar&variant=invert&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=unStar&variant=invert&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-unStar-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=unStar&variant=progressive&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=unStar&variant=progressive&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-userAvatar-base20:before,.mw-ui-background-icon-userAvatar { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=userAvatar&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=userAvatar&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-userAvatar-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=userAvatar&variant=invert&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=userAvatar&variant=invert&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-wikimedia-userAvatar-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=userAvatar&variant=progressive&format=rasterized&skin=minerva&version=4y50j); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.icons.wikimedia&image=userAvatar&variant=progressive&format=original&skin=minerva&version=4y50j)}.mw-ui-icon-minerva-speechBubbles:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.advanced.icons&image=speechBubbles&format=rasterized&lang=en&skin=minerva&version=jhnt0); background-image: linear-gradient(transparent,transparent),url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj48dGl0bGU+c3BlZWNoIGJ1YmJsZXM8L3RpdGxlPjxnIGZpbGw9IiM1NDU5NWQiPjxwYXRoIGQ9Ik0xNyA0djdhMiAyIDAgMDEtMiAySDR2MWEyIDIgMCAwMDIgMmgxMGw0IDRWNmEyIDIgMCAwMC0yLTJ6TTYgMTBIMHY2eiIvPjxyZWN0IHdpZHRoPSIxNiIgaGVpZ2h0PSIxMiIgcng9IjIiLz48L2c+PC9zdmc+)}.mw-ui-icon-minerva-specialPages:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.advanced.icons&image=specialPages&format=rasterized&lang=en&skin=minerva&version=jhnt0); background-image: linear-gradient(transparent,transparent),url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj48dGl0bGU+c3BlY2lhbCBwYWdlczwvdGl0bGU+PGcgZmlsbD0iIzU0NTk1ZCI+PHBhdGggZD0iTTcgMGEyIDIgMCAwMC0yIDJoOWEyIDIgMCAwMTIgMnYxMmEyIDIgMCAwMDItMlYyYTIgMiAwIDAwLTItMnoiLz48cGF0aCBkPSJNMTMgMjBINGEyIDIgMCAwMS0yLTJWNWEyIDIgMCAwMTItMmg5YTIgMiAwIDAxMiAydjEzYTIgMiAwIDAxLTIgMnptLTYuNS0zLjVsLjQxLTEuMDlMOCAxNWwtMS4wOS0uNDEtLjQxLTEuMDktLjQxIDEuMDlMNSAxNWwxLjA5LjQxLjQxIDEuMDl6bTIuOTgyLS45NDlsLjk1Mi0yLjU2MSAyLjUzLS45NjQtMi41My0uOTY0TDkuNDgyIDguNWwtLjk1MiAyLjU2Mi0yLjUzLjk2NCAyLjUzLjk2NC45NTIgMi41NjF6TTYgMTAuNWwuNTQ3LTEuNDUzTDggOC41bC0xLjQ1My0uNTQ3TDYgNi41bC0uNTQ3IDEuNDUzTDQgOC41bDEuNDUzLjU0N0w2IDEwLjV6Ii8+PC9nPjwvc3ZnPg==)}.mw-ui-icon-minerva-recentChanges:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.advanced.icons&image=recentChanges&format=rasterized&lang=en&skin=minerva&version=jhnt0); background-image: linear-gradient(transparent,transparent),url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj48dGl0bGU+cmVjZW50IGNoYW5nZXM8L3RpdGxlPjxnIGZpbGw9IiM1NDU5NWQiPjxjaXJjbGUgY3g9IjIiIGN5PSI0IiByPSIyIi8+PGNpcmNsZSBjeD0iMiIgY3k9IjEwIiByPSIyIi8+PGNpcmNsZSBjeD0iMiIgY3k9IjE2IiByPSIyIi8+PHBhdGggZD0iTTYgM2gxMXYySDZ6bTAgNmg2djJINnptMCA2aDJ2Mkg2em0xMi43Ni0zLjExbDEuMDc4LTEuMTEyYS41NTYuNTU2IDAgMDAwLS43ODNsLTEuODU1LTEuODMzYS41NTYuNTU2IDAgMDAtLjc4MyAwbC0xLjA5IDEuMDc3IDIuNjUgMi42NXptLTMuMjI3LTIuMDYyTDEwIDE1LjM2MVYxOGgyLjYzOWw1LjUzMy01LjUzM3oiLz48L2c+PC9zdmc+)}.mw-ui-icon-minerva-die:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.icons&image=die&format=rasterized&skin=minerva&version=17p52); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.icons&image=die&format=original&skin=minerva&version=17p52)}.mw-ui-icon-minerva-heart:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.icons&image=heart&format=rasterized&skin=minerva&version=17p52); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.icons&image=heart&format=original&skin=minerva&version=17p52)}.mw-ui-icon-minerva-home:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.icons&image=home&format=rasterized&skin=minerva&version=17p52); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.icons&image=home&format=original&skin=minerva&version=17p52)}.mw-ui-icon-minerva-logIn:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.icons&image=logIn&format=rasterized&lang=en&skin=minerva&version=17p52); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.icons&image=logIn&format=original&lang=en&skin=minerva&version=17p52)}.mw-ui-icon-minerva-logOut:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.icons&image=logOut&format=rasterized&lang=en&skin=minerva&version=17p52); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.icons&image=logOut&format=original&lang=en&skin=minerva&version=17p52)}.mw-ui-icon-minerva-settings:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.icons&image=settings&format=rasterized&skin=minerva&version=17p52); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.icons&image=settings&format=original&skin=minerva&version=17p52)}.mw-ui-icon-minerva-mapPin:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.icons&image=mapPin&format=rasterized&skin=minerva&version=17p52); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.icons&image=mapPin&format=original&skin=minerva&version=17p52)}.mw-ui-icon-minerva-unStar:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.icons&image=unStar&format=rasterized&skin=minerva&version=17p52); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.icons&image=unStar&format=original&skin=minerva&version=17p52)}.mw-ui-icon-minerva-userContributions:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.icons&image=userContributions&format=rasterized&lang=en&skin=minerva&version=17p52); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.mainMenu.icons&image=userContributions&format=original&lang=en&skin=minerva&version=17p52)}#mw-mf-page-left { position: fixed; top: 0; left: 0; bottom: 0; min-width: 275px; visibility: hidden; max-width: 80%; z-index: 2; overflow-y: auto; background-color: #eaecf0; -webkit-transform: translate(-100%,0); -ms-transform: translate(-100%,0); transform: translate(-100%,0)}@media screen and (min-width: 720px) { #mw-mf-page-left { min-width:320px }}#mw-mf-page-left ul { padding-bottom: 22px}.main-menu-mask { position: fixed; top: 0; left: 0; right: 0; opacity: 0; bottom: 0; background: rgba(0,0,0,.8); z-index: 1; visibility: hidden}#main-menu-input:checked~.main-menu-mask { visibility: visible; opacity: .5}#main-menu-input:checked~#mw-mf-page-left { visibility: visible; box-shadow: 1px 0 8px 0 rgba(0,0,0,.35); -webkit-transform: translate(0,0); -ms-transform: translate(0,0); transform: translate(0,0)}.minerva-animations-ready #mw-mf-page-left { -webkit-transition: opacity 250ms ease-in-out,visibility 250ms ease-in-out,transform 250ms ease-in-out; transition: opacity 250ms ease-in-out,visibility 250ms ease-in-out,transform 250ms ease-in-out}.minerva-animations-ready .main-menu-mask { -webkit-transition: opacity 100ms ease-in-out,visibility 0ms linear 100ms; transition: opacity 100ms ease-in-out,visibility 0ms linear 100ms}.minerva-animations-ready #main-menu-input:checked~.main-menu-mask { -webkit-transition: opacity 100ms ease-in-out; transition: opacity 100ms ease-in-out}.navigation-full-screen #mw-mf-page-left { max-width: none; -webkit-transform: none; -ms-transform: none; transform: none}.hotfix-T264376 .main-menu-mask { display: none}.hotfix-T264376 #main-menu-input:checked~.main-menu-mask { display: block}#mw-mf-page-left .secondary-action { border: 0; font-size: 16px; position: absolute; right: 0; top: 0; bottom: 0; border-left: 1px solid #a2a9b1; color: transparent}#mw-mf-page-left .primary-action { margin-right: 3.5em}#mw-mf-page-left ul:first-child li:first-child { border-top: 0}#mw-mf-page-left ul li { background-color: #fff; position: relative; border-top: 1px solid #eaecf0; margin-top: -1px}#mw-mf-page-left ul li:first-child { border-top: 0}#mw-mf-page-left ul li a { color: #54595d; display: block; max-width: 100%; padding: 12px 10px 12px 15px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap}#mw-mf-page-left ul li a.secondary-action { padding-left: 10px}#mw-mf-page-left ul li a:hover { box-shadow: inset 4px 0 0 0 #36c; text-decoration: none}#mw-mf-page-left ul li a span { font-size: .875em; font-weight: 700; vertical-align: middle}#mw-mf-page-left ul.hlist li { background-color: transparent; border: 0; margin: 0; font-size: .75em}#mw-mf-page-left ul.hlist li:after { content: none}#mw-mf-page-left ul.hlist li a { color: #36c; padding: .7em 12px}#mw-mf-page-left ul.hlist li a:hover { background-color: transparent; box-shadow: none}.notifications-overlay { visibility: visible}.notifications-overlay.navigation-drawer { display: block; width: auto; right: 0; box-shadow: -5px 0 0 0 rgba(0,0,0,.35); -webkit-transform: translate(100%,0); -ms-transform: translate(100%,0); transform: translate(100%,0); -webkit-transition: transform 250ms ease-in-out; transition: transform 250ms ease-in-out}.notifications-overlay.navigation-drawer.visible { -webkit-transform: translate(0,0); -ms-transform: translate(0,0); transform: translate(0,0)}@media all and (min-width: 720px) { .notifications-overlay.navigation-drawer { left:40% } .notifications-overlay.navigation-drawer .overlay-header { margin: 0; width: 100%; max-width: none } .notifications-overlay.navigation-drawer .overlay-header .cancel { left: 0 }}.toggle-list__checkbox { position: absolute; z-index: -1; opacity: 0}.toggle-list__toggle { display: inline-block; cursor: pointer}.toggle-list__checkbox:focus+.toggle-list__toggle { outline: dotted 1px; outline: auto #447ff5}.toggle-list__checkbox:checked+.toggle-list__toggle { outline: 0; background: rgba(1,1,1,.1)}.touch-events .toggle-list__checkbox:focus+.toggle-list__toggle { outline: 0}.toggle-list__list { background: #fff; position: absolute; overflow-y: auto; z-index: 2; box-shadow: 0 5px 17px 0 rgba(0,0,0,.24),0 0 1px #a2a9b1; visibility: hidden; opacity: 0}.toggle-list__checkbox:checked~.toggle-list__list { visibility: visible; opacity: 1}.mw-ui-icon-minerva-articleRedirect:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=articleRedirect&format=rasterized&lang=en&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=articleRedirect&format=original&lang=en&skin=minerva&version=bdzvr)}.oo-ui-image-invert.oo-ui-icon-articleRedirect,.mw-ui-icon-articleRedirect-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=articleRedirect&variant=invert&format=rasterized&lang=en&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=articleRedirect&variant=invert&format=original&lang=en&skin=minerva&version=bdzvr)}.oo-ui-image-progressive.oo-ui-icon-articleRedirect,.mw-ui-icon-articleRedirect-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=articleRedirect&variant=progressive&format=rasterized&lang=en&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=articleRedirect&variant=progressive&format=original&lang=en&skin=minerva&version=bdzvr)}.mw-ui-icon-minerva-infoFilled:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=infoFilled&format=rasterized&lang=en&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=infoFilled&format=original&lang=en&skin=minerva&version=bdzvr)}.oo-ui-image-invert.oo-ui-icon-infoFilled,.mw-ui-icon-infoFilled-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=infoFilled&variant=invert&format=rasterized&lang=en&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=infoFilled&variant=invert&format=original&lang=en&skin=minerva&version=bdzvr)}.oo-ui-image-progressive.oo-ui-icon-infoFilled,.mw-ui-icon-infoFilled-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=infoFilled&variant=progressive&format=rasterized&lang=en&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=infoFilled&variant=progressive&format=original&lang=en&skin=minerva&version=bdzvr)}.mw-ui-icon-minerva-quotes:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=quotes&format=rasterized&lang=en&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=quotes&format=original&lang=en&skin=minerva&version=bdzvr)}.oo-ui-image-invert.oo-ui-icon-quotes,.mw-ui-icon-quotes-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=quotes&variant=invert&format=rasterized&lang=en&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=quotes&variant=invert&format=original&lang=en&skin=minerva&version=bdzvr)}.oo-ui-image-progressive.oo-ui-icon-quotes,.mw-ui-icon-quotes-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=quotes&variant=progressive&format=rasterized&lang=en&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=quotes&variant=progressive&format=original&lang=en&skin=minerva&version=bdzvr)}.mw-ui-icon-minerva-link:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=link&format=rasterized&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=link&format=original&skin=minerva&version=bdzvr)}.oo-ui-image-invert.oo-ui-icon-link,.mw-ui-icon-link-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=link&variant=invert&format=rasterized&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=link&variant=invert&format=original&skin=minerva&version=bdzvr)}.oo-ui-image-progressive.oo-ui-icon-link,.mw-ui-icon-link-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=link&variant=progressive&format=rasterized&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=link&variant=progressive&format=original&skin=minerva&version=bdzvr)}.mw-ui-icon-minerva-listBullet:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=listBullet&format=rasterized&lang=en&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=listBullet&format=original&lang=en&skin=minerva&version=bdzvr)}.oo-ui-image-invert.oo-ui-icon-listBullet,.mw-ui-icon-listBullet-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=listBullet&variant=invert&format=rasterized&lang=en&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=listBullet&variant=invert&format=original&lang=en&skin=minerva&version=bdzvr)}.oo-ui-image-progressive.oo-ui-icon-listBullet,.mw-ui-icon-listBullet-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=listBullet&variant=progressive&format=rasterized&lang=en&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=listBullet&variant=progressive&format=original&lang=en&skin=minerva&version=bdzvr)}.mw-ui-icon-minerva-ellipsis:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=ellipsis&format=rasterized&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=ellipsis&format=original&skin=minerva&version=bdzvr)}.oo-ui-image-invert.oo-ui-icon-ellipsis,.mw-ui-icon-ellipsis-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=ellipsis&variant=invert&format=rasterized&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=ellipsis&variant=invert&format=original&skin=minerva&version=bdzvr)}.oo-ui-image-progressive.oo-ui-icon-ellipsis,.mw-ui-icon-ellipsis-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=ellipsis&variant=progressive&format=rasterized&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=ellipsis&variant=progressive&format=original&skin=minerva&version=bdzvr)}.mw-ui-icon-minerva-userAvatar:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userAvatar&format=rasterized&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userAvatar&format=original&skin=minerva&version=bdzvr)}.oo-ui-image-invert.oo-ui-icon-userAvatar,.mw-ui-icon-userAvatar-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userAvatar&variant=invert&format=rasterized&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userAvatar&variant=invert&format=original&skin=minerva&version=bdzvr)}.oo-ui-image-progressive.oo-ui-icon-userAvatar,.mw-ui-icon-userAvatar-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userAvatar&variant=progressive&format=rasterized&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userAvatar&variant=progressive&format=original&skin=minerva&version=bdzvr)}.mw-ui-icon-minerva-userAvatarOutline:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userAvatarOutline&format=rasterized&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userAvatarOutline&format=original&skin=minerva&version=bdzvr)}.oo-ui-image-invert.oo-ui-icon-userAvatarOutline,.mw-ui-icon-userAvatarOutline-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userAvatarOutline&variant=invert&format=rasterized&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userAvatarOutline&variant=invert&format=original&skin=minerva&version=bdzvr)}.oo-ui-image-progressive.oo-ui-icon-userAvatarOutline,.mw-ui-icon-userAvatarOutline-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userAvatarOutline&variant=progressive&format=rasterized&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userAvatarOutline&variant=progressive&format=original&skin=minerva&version=bdzvr)}.mw-ui-icon-minerva-userGroup:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userGroup&format=rasterized&lang=en&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userGroup&format=original&lang=en&skin=minerva&version=bdzvr)}.oo-ui-image-invert.oo-ui-icon-userGroup,.mw-ui-icon-userGroup-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userGroup&variant=invert&format=rasterized&lang=en&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userGroup&variant=invert&format=original&lang=en&skin=minerva&version=bdzvr)}.oo-ui-image-progressive.oo-ui-icon-userGroup,.mw-ui-icon-userGroup-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userGroup&variant=progressive&format=rasterized&lang=en&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userGroup&variant=progressive&format=original&lang=en&skin=minerva&version=bdzvr)}.mw-ui-icon-minerva-userTalk:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userTalk&format=rasterized&lang=en&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userTalk&format=original&lang=en&skin=minerva&version=bdzvr)}.oo-ui-image-invert.oo-ui-icon-userTalk,.mw-ui-icon-userTalk-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userTalk&variant=invert&format=rasterized&lang=en&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userTalk&variant=invert&format=original&lang=en&skin=minerva&version=bdzvr)}.oo-ui-image-progressive.oo-ui-icon-userTalk,.mw-ui-icon-userTalk-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userTalk&variant=progressive&format=rasterized&lang=en&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=userTalk&variant=progressive&format=original&lang=en&skin=minerva&version=bdzvr)}.mw-ui-icon-minerva-logoWikidata:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=logoWikidata&format=rasterized&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=logoWikidata&format=original&skin=minerva&version=bdzvr)}.oo-ui-image-invert.oo-ui-icon-logoWikidata,.mw-ui-icon-logoWikidata-invert:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=logoWikidata&variant=invert&format=rasterized&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=logoWikidata&variant=invert&format=original&skin=minerva&version=bdzvr)}.oo-ui-image-progressive.oo-ui-icon-logoWikidata,.mw-ui-icon-logoWikidata-progressive:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=logoWikidata&variant=progressive&format=rasterized&skin=minerva&version=bdzvr); background-image: linear-gradient(transparent,transparent),url(https://wiki.hypixel.net/load.php?modules=skins.minerva.overflow.icons&image=logoWikidata&variant=progressive&format=original&skin=minerva&version=bdzvr)}.mw-ui-icon-minerva-markup:before { background-image: url(https://wiki.hypixel.net/load.php?modules=skins.minerva.personalMenu.icons&image=markup&format=rasterized&skin=minerva&version=1j2d9); background-image: linear-gradient(transparent,transparent),url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj48dGl0bGU+bWFya3VwPC90aXRsZT48ZyBmaWxsPSIjNTQ1OTVkIj48cGF0aCBkPSJNNi41IDMuNUwwIDEwbDEuNSAxLjUgNSA1TDggMTVsLTUtNSA1LTV6bTcgMEwxMiA1bDUgNS01IDUgMS41IDEuNUwyMCAxMHoiLz48L2c+PC9zdmc+)}div#mw-content-text { position: absolute;}body { text-rendering: optimizeLegibility; text-rendering: geometricPrecision}
--
cgit
From 2692193e54e4dd6c0117dcdb85368dc83bb04f1a Mon Sep 17 00:00:00 2001
From: Roman / Nea
Date: Mon, 18 Apr 2022 17:33:32 +0200
Subject: Mob loot recipe PR (#81)
* entity renderer (somewhat functionaL)
* more modifiers and entities
* Fix cookie fuckup
* add neu repo as resource pack, cause why not at this point
* add tabs, because i can
* add extra skin parts and make less tabs
* hot tall men
* fix texture offsets and also parts:true
* some untested changes
* still broken, but better (just like me (stop being edgy nea ( no u ))))
* stuff (with er skeletons
* niceities
* skytils interop
* horseys
* horseys ouch
* panos
* stupid tests :angery:
* NPE
* add drop chance
* colored leather armo
* finish off
* move shit into hover cause items look pretty terrible
* Update 2.1.md
* better recipe display name
* always show mobs toggle
* moving parts
---
.github/CODEOWNERS | 2 +
Update Notes/2.1.md | 1 +
build.gradle.kts | 193 ++++-----
.../moulberry/notenoughupdates/NEUManager.java | 18 +-
.../moulberry/notenoughupdates/NEUOverlay.java | 2 +-
.../notenoughupdates/NEURepoResourcePack.java | 75 ++++
.../notenoughupdates/NotEnoughUpdates.java | 9 +
.../commands/EntityViewerCommand.java | 81 ++++
.../commands/dev/DevTestCommand.java | 2 +-
.../miscfeatures/entityviewer/AgeModifier.java | 30 ++
.../miscfeatures/entityviewer/ChargedModifier.java | 17 +
.../miscfeatures/entityviewer/EntityViewer.java | 177 +++++++++
.../entityviewer/EntityViewerModifier.java | 8 +
.../entityviewer/EquipmentModifier.java | 72 ++++
.../miscfeatures/entityviewer/GUIClientPlayer.java | 40 ++
.../miscfeatures/entityviewer/HorseModifier.java | 66 +++
.../entityviewer/InvisibleModifier.java | 12 +
.../miscfeatures/entityviewer/RidingModifier.java | 14 +
.../miscfeatures/entityviewer/SkinModifier.java | 46 +++
.../miscfeatures/entityviewer/WitherModifier.java | 29 ++
.../notenoughupdates/miscgui/GuiItemRecipe.java | 199 +++++++---
.../mixins/AccessorEntityAgeable.java | 12 +
.../mixins/AccessorEntityArmorStand.java | 12 +
.../notenoughupdates/mixins/AccessorMinecraft.java | 14 +
.../mixins/MixinEntityAgeable.java | 1 +
.../notenoughupdates/mixins/MixinEntityHorse.java | 17 +
.../mixins/MixinEntitySkeleton.java | 17 +
.../notenoughupdates/options/NEUConfig.java | 4 +
.../options/seperateSections/Itemlist.java | 10 +
.../profileviewer/GuiProfileViewer.java | 36 +-
.../notenoughupdates/profileviewer/Panorama.java | 38 ++
.../notenoughupdates/recipes/CraftingOverlay.java | 2 +-
.../notenoughupdates/recipes/CraftingRecipe.java | 257 ++++++------
.../notenoughupdates/recipes/ForgeRecipe.java | 442 ++++++++++-----------
.../notenoughupdates/recipes/Ingredient.java | 5 +-
.../notenoughupdates/recipes/MobLootRecipe.java | 309 ++++++++++++++
.../notenoughupdates/recipes/NeuRecipe.java | 24 +-
.../notenoughupdates/recipes/RecipeGenerator.java | 169 +++++++-
.../notenoughupdates/recipes/RecipeType.java | 59 +++
.../recipes/VillagerTradeRecipe.java | 256 ++++++------
.../moulberry/notenoughupdates/util/ItemUtils.java | 33 ++
.../moulberry/notenoughupdates/util/JsonUtils.java | 42 ++
.../notenoughupdates/util/SkytilsCompat.java | 82 ++++
.../moulberry/notenoughupdates/util/Utils.java | 17 +-
.../resources/assets/notenoughupdates/dream.json | 49 +++
.../textures/gui/crafting_table_tall.png | Bin 0 -> 12019 bytes
.../textures/gui/entity_viewer.png | Bin 0 -> 8085 bytes
.../notenoughupdates/textures/gui/forge_recipe.png | Bin 889 -> 0 bytes
.../textures/gui/forge_recipe_tall.png | Bin 0 -> 9257 bytes
.../textures/gui/mob_loot_tall.png | Bin 0 -> 9503 bytes
.../assets/notenoughupdates/textures/gui/tab.png | Bin 0 -> 1247 bytes
.../textures/gui/villager_recipe.png | Bin 8633 -> 0 bytes
.../textures/gui/villager_recipe_tall.png | Bin 0 -> 9218 bytes
src/main/resources/mixins.notenoughupdates.json | 7 +
54 files changed, 2302 insertions(+), 705 deletions(-)
create mode 100644 .github/CODEOWNERS
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/NEURepoResourcePack.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/commands/EntityViewerCommand.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/AgeModifier.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/ChargedModifier.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EntityViewer.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EntityViewerModifier.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EquipmentModifier.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/GUIClientPlayer.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/HorseModifier.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/InvisibleModifier.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/RidingModifier.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/SkinModifier.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/WitherModifier.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorEntityAgeable.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorEntityArmorStand.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorMinecraft.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityHorse.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntitySkeleton.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/recipes/MobLootRecipe.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeType.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/util/JsonUtils.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/util/SkytilsCompat.java
create mode 100644 src/main/resources/assets/notenoughupdates/dream.json
create mode 100644 src/main/resources/assets/notenoughupdates/textures/gui/crafting_table_tall.png
create mode 100644 src/main/resources/assets/notenoughupdates/textures/gui/entity_viewer.png
delete mode 100644 src/main/resources/assets/notenoughupdates/textures/gui/forge_recipe.png
create mode 100644 src/main/resources/assets/notenoughupdates/textures/gui/forge_recipe_tall.png
create mode 100644 src/main/resources/assets/notenoughupdates/textures/gui/mob_loot_tall.png
create mode 100644 src/main/resources/assets/notenoughupdates/textures/gui/tab.png
delete mode 100644 src/main/resources/assets/notenoughupdates/textures/gui/villager_recipe.png
create mode 100644 src/main/resources/assets/notenoughupdates/textures/gui/villager_recipe_tall.png
(limited to 'src/main/resources')
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 00000000..2381ceb8
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+/src/main/java/io/github/moulberry/notenoughupdates/recipes/* @romangraef
+/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemRecipe.java @romangraef
diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md
index 18a4ba8a..dff52a65 100644
--- a/Update Notes/2.1.md
+++ b/Update Notes/2.1.md
@@ -19,6 +19,7 @@
- Added support for official Hypixel wiki, can be toggled in /neu misc - DeDiamondPro
### **Minor Changes:**
- Add built-in recipes for forge crafts - nea89
+- Add mob drop viewer in the recipe viewer - nea89
- Add Stranded Villager Trades to the item list - nea89
- Make cata xp in /pv be calculated on how many runs you have and shows master mode xp rates
- Added a config option to hide Dwarven Mines waypoints when already at the location - Lulonaut
diff --git a/build.gradle.kts b/build.gradle.kts
index e134387e..3ffaf61a 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,58 +1,76 @@
-import java.io.ByteArrayOutputStream
import net.minecraftforge.gradle.user.ReobfMappingType
+import java.io.ByteArrayOutputStream
+
plugins {
- java
- id("net.minecraftforge.gradle.forge") version "6f5327738df"
- id("com.github.johnrengelman.shadow") version "6.1.0"
- id("org.spongepowered.mixin") version "d75e32e"
+ java
+ id("net.minecraftforge.gradle.forge") version "6f5327738df"
+ id("com.github.johnrengelman.shadow") version "6.1.0"
+ id("org.spongepowered.mixin") version "d75e32e"
}
group = "io.github.moulberry"
val baseVersion = "2.1"
-var buildVersion = properties["BUILD_VERSION"]
-if (buildVersion == null) {
- val stdout = ByteArrayOutputStream()
- val execResult = exec {
- commandLine("git", "describe", "--always", "--first-parent", "--abbrev=7")
- standardOutput = stdout
- }
- if (execResult.exitValue == 0)
- buildVersion = String(stdout.toByteArray()).trim()
+val buildExtra = mutableListOf()
+val buildVersion = properties["BUILD_VERSION"] as? String
+if (buildVersion != null)
+ buildExtra.add(buildVersion)
+val githubCi = properties["GITHUB_ACTIONS"] as? String
+if (githubCi == "true")
+ buildExtra.add("ci")
+
+val stdout = ByteArrayOutputStream()
+val execResult = exec {
+ commandLine("git", "describe", "--always", "--first-parent", "--abbrev=7")
+ standardOutput = stdout
+ isIgnoreExitValue = true
+}
+if (execResult.exitValue == 0) {
+ buildExtra.add(String(stdout.toByteArray()).trim())
+}
+
+val gitDiffStdout = ByteArrayOutputStream()
+val gitDiffResult = exec {
+ commandLine("git", "status", "--porcelain")
+ standardOutput = gitDiffStdout
+ isIgnoreExitValue = true
+}
+if (gitDiffStdout.toByteArray().isNotEmpty()) {
+ buildExtra.add("dirty")
}
-version = baseVersion + (buildVersion?.let { "+$it" } ?: "")
+version = baseVersion + (if (buildExtra.isEmpty()) "" else buildExtra.joinToString(prefix = "+", separator = "."))
// Toolchains:
java {
- // Forge Gradle currently prevents using the toolchain: toolchain.languageVersion.set(JavaLanguageVersion.of(8))
- sourceCompatibility = JavaVersion.VERSION_1_8
- targetCompatibility = JavaVersion.VERSION_1_8
+ // Forge Gradle currently prevents using the toolchain: toolchain.languageVersion.set(JavaLanguageVersion.of(8))
+ sourceCompatibility = JavaVersion.VERSION_1_8
+ targetCompatibility = JavaVersion.VERSION_1_8
}
minecraft {
- version = "1.8.9-11.15.1.2318-1.8.9"
- runDir = "run"
- mappings = "stable_22"
- clientJvmArgs.addAll(
- listOf(
- "-Dmixin.debug=true",
- "-Dasmhelper.verbose=true"
- )
- )
- clientRunArgs.addAll(
- listOf(
- "--tweakClass org.spongepowered.asm.launch.MixinTweaker",
- "--mixin mixins.notenoughupdates.json"
- )
- )
+ version = "1.8.9-11.15.1.2318-1.8.9"
+ runDir = "run"
+ mappings = "stable_22"
+ clientJvmArgs.addAll(
+ listOf(
+ "-Dmixin.debug=true",
+ "-Dasmhelper.verbose=true"
+ )
+ )
+ clientRunArgs.addAll(
+ listOf(
+ "--tweakClass org.spongepowered.asm.launch.MixinTweaker",
+ "--mixin mixins.notenoughupdates.json"
+ )
+ )
}
mixin {
- add(sourceSets.main.get(), "mixins.notenoughupdates.refmap.json")
+ add(sourceSets.main.get(), "mixins.notenoughupdates.refmap.json")
}
// Dependencies:
@@ -67,14 +85,14 @@ dependencies {
annotationProcessor("org.spongepowered:mixin:0.7.11-SNAPSHOT")
implementation("com.fasterxml.jackson.core:jackson-core:2.13.1")
implementation("info.bliki.wiki:bliki-core:3.1.0")
- testImplementation("org.junit.jupiter:junit-jupiter:5.8.2")
+ testImplementation("org.junit.jupiter:junit-jupiter:5.8.2")
}
// Tasks:
tasks.withType(JavaCompile::class) {
- options.encoding = "UTF-8"
+ options.encoding = "UTF-8"
}
tasks.named("test") {
@@ -82,72 +100,61 @@ tasks.named("test") {
}
tasks.withType(Jar::class) {
- archiveBaseName.set("NotEnoughUpdates")
- manifest.attributes.run {
- this["Main-Class"] = "NotSkyblockAddonsInstallerFrame"
- this["TweakClass"] = "org.spongepowered.asm.launch.MixinTweaker"
- this["MixinConfigs"] = "mixins.notenoughupdates.json"
- this["FMLCorePluginContainsFMLMod"] = "true"
- this["ForceLoadAsMod"] = "true"
- this["FMLAT"] = "notenoughupdates_at.cfg"
- }
+ archiveBaseName.set("NotEnoughUpdates")
+ manifest.attributes.run {
+ this["Main-Class"] = "NotSkyblockAddonsInstallerFrame"
+ this["TweakClass"] = "org.spongepowered.asm.launch.MixinTweaker"
+ this["MixinConfigs"] = "mixins.notenoughupdates.json"
+ this["FMLCorePluginContainsFMLMod"] = "true"
+ this["ForceLoadAsMod"] = "true"
+ this["FMLAT"] = "notenoughupdates_at.cfg"
+ }
}
tasks.shadowJar {
- archiveClassifier.set("dep")
- exclude(
- "module-info.class",
- "LICENSE.txt"
- )
- dependencies {
- include(dependency("org.spongepowered:mixin:0.7.11-SNAPSHOT"))
-
- include(dependency("commons-io:commons-io"))
- include(dependency("org.apache.commons:commons-lang3"))
- include(dependency("com.fasterxml.jackson.core:jackson-databind:2.10.2"))
- include(dependency("com.fasterxml.jackson.core:jackson-annotations:2.10.2"))
- include(dependency("com.fasterxml.jackson.core:jackson-core:2.10.2"))
-
- include(dependency("info.bliki.wiki:bliki-core:3.1.0"))
- include(dependency("org.slf4j:slf4j-api:1.7.18"))
- include(dependency("org.luaj:luaj-jse:3.0.1"))
- }
- fun relocate(name: String) = relocate(name, "io.github.moulberry.notenoughupdates.deps.$name")
- relocate("com.fasterxml.jackson")
- relocate("org.eclipse")
- relocate("org.slf4j")
+ archiveClassifier.set("dep")
+ exclude(
+ "module-info.class",
+ "LICENSE.txt"
+ )
+ dependencies {
+ include(dependency("org.spongepowered:mixin:0.7.11-SNAPSHOT"))
+
+ include(dependency("commons-io:commons-io"))
+ include(dependency("org.apache.commons:commons-lang3"))
+ include(dependency("com.fasterxml.jackson.core:jackson-databind:2.10.2"))
+ include(dependency("com.fasterxml.jackson.core:jackson-annotations:2.10.2"))
+ include(dependency("com.fasterxml.jackson.core:jackson-core:2.10.2"))
+
+ include(dependency("info.bliki.wiki:bliki-core:3.1.0"))
+ include(dependency("org.slf4j:slf4j-api:1.7.18"))
+ include(dependency("org.luaj:luaj-jse:3.0.1"))
+ }
+ fun relocate(name: String) = relocate(name, "io.github.moulberry.notenoughupdates.deps.$name")
+ relocate("com.fasterxml.jackson")
+ relocate("org.eclipse")
+ relocate("org.slf4j")
}
tasks.build.get().dependsOn(tasks.shadowJar)
reobf {
- create("shadowJar") {
- mappingType = ReobfMappingType.SEARGE
- }
+ create("shadowJar") {
+ mappingType = ReobfMappingType.SEARGE
+ }
}
tasks.processResources {
- from(sourceSets.main.get().resources.srcDirs)
- filesMatching("mcmod.info") {
- expand(
- "version" to project.version,
- "mcversion" to minecraft.version
- )
- }
- rename("(.+_at.cfg)".toPattern(), "META-INF/$1")
-}
-
-val moveResources by tasks.creating {
- doLast {
- ant.withGroovyBuilder {
- "move"(
- "file" to "$buildDir/resources/main",
- "todir" to "$buildDir/classes/java"
- )
- }
- }
- dependsOn(tasks.processResources)
-}
-
-tasks.classes { dependsOn(moveResources) }
+ from(sourceSets.main.get().resources.srcDirs)
+ filesMatching("mcmod.info") {
+ expand(
+ "version" to project.version,
+ "mcversion" to minecraft.version
+ )
+ }
+ rename("(.+_at.cfg)".toPattern(), "META-INF/$1")
+}
+sourceSets.main {
+ output.setResourcesDir(file("$buildDir/classes/java/main"))
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java
index abe0bdcf..6572431b 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java
@@ -895,12 +895,12 @@ public class NEUManager {
String clickcommand = item.get("clickcommand").getAsString();
switch (clickcommand.intern()) {
case "viewrecipe":
- displayGuiItemRecipe(internalName, null);
+ displayGuiItemRecipe(internalName);
break;
case "viewoption":
neu.sendChatMessage("/viewpotion " + internalName.split(";")[0].toLowerCase(Locale.ROOT));
}
- displayGuiItemRecipe(internalName, "");
+ displayGuiItemRecipe(internalName);
}
public void showRecipe(String internalName) {
@@ -990,16 +990,16 @@ public class NEUManager {
List usages = getAvailableUsagesFor(internalName);
if (usages.isEmpty()) return false;
Minecraft.getMinecraft().displayGuiScreen(
- new GuiItemRecipe("Item Usages", usages, this));
+ new GuiItemRecipe(usages, this));
return true;
}
- public boolean displayGuiItemRecipe(String internalName, String text) {
+ public boolean displayGuiItemRecipe(String internalName) {
if (!recipesMap.containsKey(internalName)) return false;
List recipes = getAvailableRecipesFor(internalName);
if (recipes.isEmpty()) return false;
Minecraft.getMinecraft().displayGuiScreen(
- new GuiItemRecipe(text != null ? text : "Item Recipe", recipes, this));
+ new GuiItemRecipe(recipes, this));
return true;
}
@@ -1010,7 +1010,7 @@ public class NEUManager {
public boolean failViewItem(String text) {
if (viewItemAttemptID != null && !viewItemAttemptID.isEmpty()) {
if (System.currentTimeMillis() - viewItemAttemptTime < 500) {
- return displayGuiItemRecipe(viewItemAttemptID, text);
+ return displayGuiItemRecipe(viewItemAttemptID);
}
}
return false;
@@ -1570,4 +1570,10 @@ public class NEUManager {
}
}
}
+
+ public ItemStack createItem(String internalname) {
+ JsonObject jsonObject = itemMap.get(internalname);
+ if (jsonObject == null) return null;
+ return jsonToStack(jsonObject);
+ }
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java
index 7965abae..8d0955bb 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java
@@ -1358,7 +1358,7 @@ public class NEUOverlay extends Gui {
}
if (getSortMode() == SORT_MODE_ALL) {
- return !internalname.matches(mobRegex);
+ return NotEnoughUpdates.INSTANCE.config.itemlist.alwaysShowMonsters || !internalname.matches(mobRegex);
} else if (getSortMode() == SORT_MODE_MOB) {
return internalname.matches(mobRegex);
} else if (getSortMode() == SORT_MODE_PET) {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEURepoResourcePack.java b/src/main/java/io/github/moulberry/notenoughupdates/NEURepoResourcePack.java
new file mode 100644
index 00000000..2a5cda92
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NEURepoResourcePack.java
@@ -0,0 +1,75 @@
+package io.github.moulberry.notenoughupdates;
+
+import com.google.gson.JsonObject;
+import net.minecraft.client.resources.IResourcePack;
+import net.minecraft.client.resources.data.IMetadataSection;
+import net.minecraft.client.resources.data.IMetadataSerializer;
+import net.minecraft.util.ResourceLocation;
+
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.util.HashSet;
+import java.util.Set;
+
+public class NEURepoResourcePack implements IResourcePack {
+
+ File repoLocation;
+ Set resourceDomains = new HashSet<>();
+
+ public NEURepoResourcePack(File repoLocation, String domain) {
+ this.repoLocation = repoLocation;
+ resourceDomains.add(domain);
+ }
+
+ public boolean loadRepoLocation() {
+ if (repoLocation != null) return true;
+ NotEnoughUpdates instance = NotEnoughUpdates.INSTANCE;
+ if (instance == null) return false;
+ NEUManager manager = instance.manager;
+ if (manager == null) return false;
+ repoLocation = manager.repoLocation;
+ return repoLocation != null;
+ }
+
+ public File getFileForResource(ResourceLocation loc) {
+ if (repoLocation == null) {
+ if (!loadRepoLocation())
+ return null;
+ }
+ if (!"neurepo".equals(loc.getResourceDomain())) {
+ return null;
+ }
+ return new File(repoLocation, loc.getResourcePath());
+ }
+
+ @Override
+ public InputStream getInputStream(ResourceLocation resourceLocation) throws IOException {
+ return new BufferedInputStream(new FileInputStream(getFileForResource(resourceLocation)));
+ }
+
+ @Override
+ public boolean resourceExists(ResourceLocation resourceLocation) {
+ File file = getFileForResource(resourceLocation);
+ return file != null && file.exists();
+ }
+
+ @Override
+ public Set getResourceDomains() {
+ return resourceDomains;
+ }
+
+ @Override
+ public T getPackMetadata(IMetadataSerializer iMetadataSerializer, String s) throws IOException {
+ return iMetadataSerializer.parseMetadataSection(s, new JsonObject());
+ }
+
+ @Override
+ public BufferedImage getPackImage() throws IOException {
+ return null;
+ }
+
+ @Override
+ public String getPackName() {
+ return "NEU Repo Resources";
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
index 0a77c677..6b2fd09e 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
@@ -35,6 +35,7 @@ import io.github.moulberry.notenoughupdates.miscfeatures.customblockzones.Custom
import io.github.moulberry.notenoughupdates.miscfeatures.customblockzones.DwarvenMinesTextures;
import io.github.moulberry.notenoughupdates.miscgui.CalendarOverlay;
import io.github.moulberry.notenoughupdates.miscgui.InventoryStorageSelector;
+import io.github.moulberry.notenoughupdates.mixins.AccessorMinecraft;
import io.github.moulberry.notenoughupdates.options.NEUConfig;
import io.github.moulberry.notenoughupdates.overlays.FuelBar;
import io.github.moulberry.notenoughupdates.overlays.OverlayManager;
@@ -58,6 +59,7 @@ import net.minecraft.world.biome.BiomeGenJungle;
import net.minecraft.world.biome.BiomeGenMesa;
import net.minecraft.world.biome.BiomeGenSnow;
import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.client.registry.ClientRegistry;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
@@ -160,6 +162,13 @@ public class NotEnoughUpdates {
return this.neuDir;
}
+ public NotEnoughUpdates() {
+ // Budget Construction Event
+ ((AccessorMinecraft) FMLClientHandler.instance().getClient())
+ .onGetDefaultResourcePacks()
+ .add(new NEURepoResourcePack(null, "neurepo"));
+ }
+
/**
* Instantiates NEUIo, NEUManager and NEUOverlay instances. Registers keybinds and adds a shutdown hook to clear tmp folder.
*/
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/EntityViewerCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/EntityViewerCommand.java
new file mode 100644
index 00000000..c7b1862e
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/EntityViewerCommand.java
@@ -0,0 +1,81 @@
+package io.github.moulberry.notenoughupdates.commands;
+
+import com.google.common.collect.Lists;
+import io.github.moulberry.notenoughupdates.miscfeatures.entityviewer.EntityViewer;
+import net.minecraft.client.Minecraft;
+import net.minecraft.command.CommandException;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.event.ClickEvent;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.ChatStyle;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.gameevent.TickEvent;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedDeque;
+
+public class EntityViewerCommand extends ClientCommandBase {
+ public EntityViewerCommand() {
+ super("neushowentity");
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+ @Override
+ public List getCommandAliases() {
+ return Lists.newArrayList("neuentityviewer");
+ }
+
+ @Override
+ public String getCommandUsage(ICommandSender sender) {
+ return EnumChatFormatting.RED + "Use /neushowentity list";
+ }
+
+ public void showUsage(ICommandSender sender) {
+ sender.addChatMessage(new ChatComponentText(getCommandUsage(sender)));
+ }
+
+ private final Queue queuedGUIS = new ConcurrentLinkedDeque<>();
+
+ @SubscribeEvent
+ public void onTick(TickEvent event) {
+ if (Minecraft.getMinecraft().currentScreen == null) {
+ EntityViewer poll = queuedGUIS.poll();
+ if (poll == null) return;
+ Minecraft.getMinecraft().displayGuiScreen(poll);
+ }
+ }
+
+ @Override
+ public void processCommand(ICommandSender sender, String[] strings) throws CommandException {
+ if (strings.length == 0) {
+ showUsage(sender);
+ return;
+ }
+ if (strings[0].equals("list")) {
+ for (String label : EntityViewer.validEntities.keySet()) {
+ sender.addChatMessage(new ChatComponentText(EnumChatFormatting.BLUE + " " + label)
+ .setChatStyle(new ChatStyle().setChatClickEvent(
+ new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/neuentityviewer " + label))));
+ }
+ return;
+ }
+ EntityLivingBase entityLivingBase;
+ if (strings[0].startsWith("@")) {
+ ResourceLocation resourceLocation = new ResourceLocation(strings[0].substring(1));
+ entityLivingBase = EntityViewer.constructEntity(resourceLocation);
+ } else {
+ entityLivingBase = EntityViewer.constructEntity(strings[0], Arrays.copyOfRange(strings, 1, strings.length));
+ }
+ if (entityLivingBase == null) {
+ sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Could not create that entity"));
+ return;
+ }
+ queuedGUIS.add(new EntityViewer(strings[0], entityLivingBase));
+ }
+}
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 53a7894b..27944c92 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
@@ -1,4 +1,4 @@
-package io.github.moulberry.notenoughupdates.commands.dev;
+ package io.github.moulberry.notenoughupdates.commands.dev;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/AgeModifier.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/AgeModifier.java
new file mode 100644
index 00000000..5884512f
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/AgeModifier.java
@@ -0,0 +1,30 @@
+package io.github.moulberry.notenoughupdates.miscfeatures.entityviewer;
+
+import com.google.gson.JsonObject;
+import io.github.moulberry.notenoughupdates.mixins.AccessorEntityAgeable;
+import io.github.moulberry.notenoughupdates.mixins.AccessorEntityArmorStand;
+import net.minecraft.entity.EntityAgeable;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.item.EntityArmorStand;
+import net.minecraft.entity.monster.EntityZombie;
+
+public class AgeModifier extends EntityViewerModifier {
+ @Override
+ public EntityLivingBase applyModifier(EntityLivingBase base, JsonObject info) {
+ boolean baby = info.has("baby") && info.get("baby").getAsBoolean();
+ if (base instanceof EntityAgeable) {
+ ((AccessorEntityAgeable) base).setGrowingAgeDirect(baby ? -1 : 1);
+ return base;
+ }
+ if (base instanceof EntityZombie) {
+ ((EntityZombie) base).setChild(baby);
+ return base;
+ }
+ if (base instanceof EntityArmorStand) {
+ ((AccessorEntityArmorStand) base).setSmallDirect(baby);
+ return base;
+ }
+ System.out.println("Cannot apply age to a non ageable entity: " + base);
+ return null;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/ChargedModifier.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/ChargedModifier.java
new file mode 100644
index 00000000..17dce66d
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/ChargedModifier.java
@@ -0,0 +1,17 @@
+package io.github.moulberry.notenoughupdates.miscfeatures.entityviewer;
+
+import com.google.gson.JsonObject;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.monster.EntityCreeper;
+
+public class ChargedModifier extends EntityViewerModifier {
+
+ @Override
+ public EntityLivingBase applyModifier(EntityLivingBase base, JsonObject info) {
+ if (base instanceof EntityCreeper) {
+ base.getDataWatcher().updateObject(17, (byte) 1);
+ return base;
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EntityViewer.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EntityViewer.java
new file mode 100644
index 00000000..e9075e47
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EntityViewer.java
@@ -0,0 +1,177 @@
+package io.github.moulberry.notenoughupdates.miscfeatures.entityviewer;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
+import io.github.moulberry.notenoughupdates.util.Utils;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.client.gui.inventory.GuiInventory;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.boss.EntityDragon;
+import net.minecraft.entity.boss.EntityWither;
+import net.minecraft.entity.item.EntityArmorStand;
+import net.minecraft.entity.monster.*;
+import net.minecraft.entity.passive.*;
+import net.minecraft.util.ResourceLocation;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
+
+public class EntityViewer extends GuiScreen {
+
+ public static Map> validEntities = new HashMap>() {{
+ put("Zombie", () -> new EntityZombie(null));
+ put("Chicken", () -> new EntityChicken(null));
+ put("Slime", () -> new EntitySlime(null));
+ put("Wolf", () -> new EntityWolf(null));
+ put("Skeleton", () -> new EntitySkeleton(null));
+ put("Creeper", () -> new EntityCreeper(null));
+ put("Ocelot", () -> new EntityOcelot(null));
+ put("Blaze", () -> new EntityBlaze(null));
+ put("Rabbit", () -> new EntityRabbit(null));
+ put("Sheep", () -> new EntitySheep(null));
+ put("Horse", () -> new EntityHorse(null));
+ put("Eisengolem", () -> new EntityIronGolem(null));
+ put("Silverfish", () -> new EntitySilverfish(null));
+ put("Witch", () -> new EntityWitch(null));
+ put("Endermite", () -> new EntityEndermite(null));
+ put("Snowman", () -> new EntitySnowman(null));
+ put("Villager", () -> new EntityVillager(null));
+ put("Guardian", () -> new EntityGuardian(null));
+ put("ArmorStand", () -> new EntityArmorStand(null));
+ put("Squid", () -> new EntitySquid(null));
+ put("Bat", () -> new EntityBat(null));
+ put("Spider", () -> new EntitySpider(null));
+ put("CaveSpider", () -> new EntityCaveSpider(null));
+ put("Pigman", () -> new EntityPigZombie(null));
+ put("Ghast", () -> new EntityGhast(null));
+ put("MagmaCube", () -> new EntityMagmaCube(null));
+ put("Wither", () -> new EntityWither(null));
+ put("Enderman", () -> new EntityEnderman(null));
+ put("Mooshroom", ()-> new EntityMooshroom(null));
+ put("WitherSkeleton", () -> {
+ EntitySkeleton skeleton = new EntitySkeleton(null);
+ skeleton.setSkeletonType(1);
+ return skeleton;
+ });
+ put("Cow", () -> new EntityCow(null));
+ put("Dragon", ()-> new EntityDragon(null));
+ put("Player", () -> new GUIClientPlayer());
+ }};
+
+ public static Map validModifiers = new HashMap() {{
+ put("playerdata", new SkinModifier());
+ put("equipment", new EquipmentModifier());
+ put("riding", new RidingModifier());
+ put("charged", new ChargedModifier());
+ put("witherdata", new WitherModifier());
+ put("invisible", new InvisibleModifier());
+ put("age", new AgeModifier());
+ put("horse", new HorseModifier());
+ }};
+
+ public int guiLeft = 0;
+ public int guiTop = 0;
+ public int xSize = 176;
+ public int ySize = 166;
+
+ private final String label;
+ private final EntityLivingBase entity;
+ private static final ResourceLocation BACKGROUND = new ResourceLocation("notenoughupdates", "textures/gui/entity_viewer.png");
+
+ public EntityViewer(String label, EntityLivingBase entity) {
+ this.label = label;
+ this.entity = entity;
+ }
+
+ public static EntityLivingBase constructEntity(ResourceLocation resourceLocation) {
+ Gson gson = NotEnoughUpdates.INSTANCE.manager.gson;
+ try (Reader is = new InputStreamReader(
+ Minecraft.getMinecraft().getResourceManager().getResource(resourceLocation).getInputStream(), StandardCharsets.UTF_8)) {
+ return constructEntity(gson.fromJson(is, JsonObject.class));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static EntityLivingBase constructEntity(JsonObject info) {
+ List modifiers = info.has("modifiers") ?
+ StreamSupport.stream(info.get("modifiers").getAsJsonArray().spliterator(), false)
+ .map(JsonElement::getAsJsonObject).collect(Collectors.toList())
+ : Collections.emptyList();
+ return EntityViewer.constructEntity(info.get("entity").getAsString(), modifiers);
+ }
+
+ public static EntityLivingBase constructEntity(String string, String[] modifiers) {
+ Gson gson = NotEnoughUpdates.INSTANCE.manager.gson;
+ return constructEntity(string, Arrays.stream(modifiers).map(it -> gson.fromJson(it, JsonObject.class)).collect(Collectors.toList()));
+ }
+
+ public static EntityLivingBase constructEntity(String string, List modifiers) {
+ Supplier extends EntityLivingBase> aClass = validEntities.get(string);
+ if (aClass == null) {
+ System.err.println("Could not find entity of type: " + string);
+ return null;
+ }
+ try {
+ EntityLivingBase entity = aClass.get();
+ for (JsonObject modifier : modifiers) {
+ String type = modifier.get("type").getAsString();
+ EntityViewerModifier entityViewerModifier = validModifiers.get(type);
+ entity = entityViewerModifier.applyModifier(entity, modifier);
+ if (entity == null) break;
+ }
+ return entity;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ @Override
+ public void drawScreen(int mouseX, int mouseY, float partialTicks) {
+ drawDefaultBackground();
+ FontRenderer fontRenderer = Minecraft.getMinecraft().fontRendererObj;
+
+ this.guiLeft = (width - this.xSize) / 2;
+ this.guiTop = (height - this.ySize) / 2;
+
+
+ Minecraft.getMinecraft().getTextureManager().bindTexture(BACKGROUND);
+ drawTexturedModalRect(guiLeft, guiTop, 0, 0, this.xSize, this.ySize);
+
+
+ Utils.drawStringScaledMaxWidth(label, fontRenderer, guiLeft + 10, guiTop + 10, false, 100, 0xFF00FF);
+ renderEntity(entity, guiLeft + 90, guiTop + 75, mouseX, mouseY);
+ }
+
+ public static void renderEntity(EntityLivingBase entity, int posX, int posY, int mouseX, int mouseY) {
+ GlStateManager.color(1F, 1F, 1F, 1F);
+
+ int scale = 30;
+ float bottomOffset = 0F;
+ EntityLivingBase stack = entity;
+ while (true) {
+
+ stack.ticksExisted = Minecraft.getMinecraft().thePlayer.ticksExisted;
+ GuiInventory.drawEntityOnScreen(posX, (int) (posY - bottomOffset * scale), scale, posX - mouseX, (int) (posY - stack.getEyeHeight() * scale - mouseY), stack);
+ bottomOffset += stack.getMountedYOffset();
+ if (!(stack.riddenByEntity instanceof EntityLivingBase)) {
+ break;
+ }
+ stack = (EntityLivingBase) stack.riddenByEntity;
+ }
+
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EntityViewerModifier.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EntityViewerModifier.java
new file mode 100644
index 00000000..bab6c354
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EntityViewerModifier.java
@@ -0,0 +1,8 @@
+package io.github.moulberry.notenoughupdates.miscfeatures.entityviewer;
+
+import com.google.gson.JsonObject;
+import net.minecraft.entity.EntityLivingBase;
+
+public abstract class EntityViewerModifier {
+ public abstract EntityLivingBase applyModifier(EntityLivingBase base, JsonObject info);
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EquipmentModifier.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EquipmentModifier.java
new file mode 100644
index 00000000..3011e479
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EquipmentModifier.java
@@ -0,0 +1,72 @@
+package io.github.moulberry.notenoughupdates.miscfeatures.entityviewer;
+
+import com.google.gson.JsonObject;
+import io.github.moulberry.notenoughupdates.NEUManager;
+import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemArmor;
+import net.minecraft.item.ItemStack;
+
+public class EquipmentModifier extends EntityViewerModifier {
+
+ private ItemStack createItem(String item) {
+ NEUManager manager = NotEnoughUpdates.INSTANCE.manager;
+ String[] split = item.split("#");
+ if (split.length == 2) {
+ switch (split[0].intern()) {
+ case "LEATHER_LEGGINGS":
+ return coloredLeatherArmor(Items.leather_leggings, split[1]);
+ case "LEATHER_HELMET":
+ return coloredLeatherArmor(Items.leather_helmet, split[1]);
+ case "LEATHER_CHESTPLATE":
+ return coloredLeatherArmor(Items.leather_chestplate, split[1]);
+ case "LEATHER_BOOTS":
+ return coloredLeatherArmor(Items.leather_boots, split[1]);
+ default:
+ throw new RuntimeException("Unknown leather piece: " + item);
+ }
+ }
+ return manager.createItem(item);
+ }
+
+ private ItemStack coloredLeatherArmor(ItemArmor item, String colorHex) {
+ ItemStack is = new ItemStack(item);
+ item.setColor(is, Integer.parseInt(colorHex, 16));
+ return is;
+ }
+
+ @Override
+ public EntityLivingBase applyModifier(EntityLivingBase base, JsonObject info) {
+ if (info.has("hand"))
+ setCurrentItemOrArmor(base, 0, createItem(info.get("hand").getAsString()));
+ if (info.has("helmet"))
+ setCurrentItemOrArmor(base, 4, createItem(info.get("helmet").getAsString()));
+ if (info.has("chestplate"))
+ setCurrentItemOrArmor(base, 3, createItem(info.get("chestplate").getAsString()));
+ if (info.has("leggings"))
+ setCurrentItemOrArmor(base, 2, createItem(info.get("leggings").getAsString()));
+ if (info.has("feet"))
+ setCurrentItemOrArmor(base, 1, createItem(info.get("feet").getAsString()));
+ return base;
+ }
+
+ public void setCurrentItemOrArmor(EntityLivingBase entity, int slot, ItemStack itemStack) {
+ if (entity instanceof EntityPlayer) {
+ setPlayerCurrentItemOrArmor((EntityPlayer) entity, slot, itemStack);
+ } else {
+ entity.setCurrentItemOrArmor(slot, itemStack);
+ }
+ }
+
+ // Biscuit person needs to learn how to code and not fuck up valid vanilla behaviour
+ public static void setPlayerCurrentItemOrArmor(EntityPlayer player, int slot, ItemStack itemStack) {
+ if (slot == 0) {
+ player.inventory.mainInventory[player.inventory.currentItem] = itemStack;
+ } else {
+ player.inventory.armorInventory[slot - 1] = itemStack;
+ }
+ }
+
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/GUIClientPlayer.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/GUIClientPlayer.java
new file mode 100644
index 00000000..bbff2db1
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/GUIClientPlayer.java
@@ -0,0 +1,40 @@
+package io.github.moulberry.notenoughupdates.miscfeatures.entityviewer;
+
+import com.mojang.authlib.GameProfile;
+import net.minecraft.client.entity.AbstractClientPlayer;
+import net.minecraft.client.network.NetworkPlayerInfo;
+import net.minecraft.client.resources.DefaultPlayerSkin;
+import net.minecraft.util.ResourceLocation;
+
+import java.util.UUID;
+
+public class GUIClientPlayer extends AbstractClientPlayer {
+ public GUIClientPlayer() {
+ super(null, new GameProfile(UUID.randomUUID(), "GuiPlayer"));
+ }
+
+ ResourceLocation overrideSkin = DefaultPlayerSkin.getDefaultSkinLegacy();
+ ResourceLocation overrideCape = null;
+ boolean overrideIsSlim = false;
+ NetworkPlayerInfo playerInfo = new NetworkPlayerInfo(this.getGameProfile()) {
+ @Override
+ public String getSkinType() {
+ return overrideIsSlim ? "slim" : "default";
+ }
+
+ @Override
+ public ResourceLocation getLocationSkin() {
+ return overrideSkin;
+ }
+
+ @Override
+ public ResourceLocation getLocationCape() {
+ return overrideCape;
+ }
+ };
+
+ @Override
+ protected NetworkPlayerInfo getPlayerInfo() {
+ return playerInfo;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/HorseModifier.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/HorseModifier.java
new file mode 100644
index 00000000..7fd2dadd
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/HorseModifier.java
@@ -0,0 +1,66 @@
+package io.github.moulberry.notenoughupdates.miscfeatures.entityviewer;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.passive.EntityHorse;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+public class HorseModifier extends EntityViewerModifier {
+ @Override
+ public EntityLivingBase applyModifier(EntityLivingBase base, JsonObject info) {
+ if (!(base instanceof EntityHorse))
+ return null;
+ EntityHorse horse = (EntityHorse) base;
+ if (info.has("kind")) {
+ String type = info.get("kind").getAsString().intern();
+ switch (type) {
+ case "skeleton":
+ horse.setHorseType(4);
+ break;
+ case "zombie":
+ horse.setHorseType(3);
+ break;
+ case "mule":
+ horse.setHorseType(2);
+ break;
+ case "donkey":
+ horse.setHorseType(1);
+ break;
+ case "horse":
+ horse.setHorseType(0);
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown horse type: " + type);
+ }
+ }
+ if (info.has("armor")) {
+ JsonElement el = info.get("armor");
+ if (el.isJsonNull()) {
+ horse.setHorseArmorStack(null);
+ } else {
+ Item item;
+ switch (el.getAsString().intern()) {
+ case "iron":
+ item = Items.iron_horse_armor;
+ break;
+ case "golden":
+ item = Items.golden_horse_armor;
+ break;
+ case "diamond":
+ item = Items.diamond_horse_armor;
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown horse armor: " + el.getAsString());
+ }
+ horse.setHorseArmorStack(new ItemStack(item));
+ }
+ }
+ if (info.has("saddled")) {
+ horse.setHorseSaddled(info.get("saddled").getAsBoolean());
+ }
+ return horse;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/InvisibleModifier.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/InvisibleModifier.java
new file mode 100644
index 00000000..c2138b3f
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/InvisibleModifier.java
@@ -0,0 +1,12 @@
+package io.github.moulberry.notenoughupdates.miscfeatures.entityviewer;
+
+import com.google.gson.JsonObject;
+import net.minecraft.entity.EntityLivingBase;
+
+public class InvisibleModifier extends EntityViewerModifier {
+ @Override
+ public EntityLivingBase applyModifier(EntityLivingBase base, JsonObject info) {
+ base.setInvisible(!info.has("invisible") || info.get("invisible").getAsBoolean());
+ return base;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/RidingModifier.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/RidingModifier.java
new file mode 100644
index 00000000..9879542a
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/RidingModifier.java
@@ -0,0 +1,14 @@
+package io.github.moulberry.notenoughupdates.miscfeatures.entityviewer;
+
+import com.google.gson.JsonObject;
+import net.minecraft.entity.EntityLivingBase;
+
+public class RidingModifier extends EntityViewerModifier {
+ @Override
+ public EntityLivingBase applyModifier(EntityLivingBase base, JsonObject info) {
+ EntityLivingBase newEntity = EntityViewer.constructEntity(info);
+ if (newEntity == null) return null;
+ newEntity.mountEntity(base);
+ return base;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/SkinModifier.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/SkinModifier.java
new file mode 100644
index 00000000..55e8a432
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/SkinModifier.java
@@ -0,0 +1,46 @@
+package io.github.moulberry.notenoughupdates.miscfeatures.entityviewer;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EnumPlayerModelParts;
+import net.minecraft.util.ResourceLocation;
+
+import java.util.Map;
+
+public class SkinModifier extends EntityViewerModifier {
+ @Override
+ public EntityLivingBase applyModifier(EntityLivingBase base, JsonObject info) {
+ if (base instanceof GUIClientPlayer) {
+ GUIClientPlayer player = (GUIClientPlayer) base;
+ if (info.has("cape")) {
+ player.overrideCape = new ResourceLocation(info.get("cape").getAsString());
+ }
+ if (info.has("skin")) {
+ player.overrideSkin = new ResourceLocation(info.get("skin").getAsString());
+ }
+ if (info.has("slim")) {
+ player.overrideIsSlim = info.get("slim").getAsBoolean();
+ }
+ if (info.has("parts")) {
+ JsonElement parts = info.get("parts");
+ byte partBitField = player.getDataWatcher().getWatchableObjectByte(10);
+ if (parts.isJsonPrimitive() && parts.getAsJsonPrimitive().isBoolean()) {
+ partBitField = parts.getAsBoolean() ? (byte) -1 : 0;
+ } else {
+ JsonObject obj = parts.getAsJsonObject();
+ for (Map.Entry part : obj.entrySet()) {
+ EnumPlayerModelParts modelPart = EnumPlayerModelParts.valueOf(part.getKey());
+ if (part.getValue().getAsBoolean()) {
+ partBitField |= modelPart.getPartMask();
+ } else {
+ partBitField &= ~modelPart.getPartMask();
+ }
+ }
+ }
+ player.getDataWatcher().updateObject(10, partBitField);
+ }
+ }
+ return base;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/WitherModifier.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/WitherModifier.java
new file mode 100644
index 00000000..c5580f17
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/WitherModifier.java
@@ -0,0 +1,29 @@
+package io.github.moulberry.notenoughupdates.miscfeatures.entityviewer;
+
+import com.google.gson.JsonObject;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.boss.EntityWither;
+
+public class WitherModifier extends EntityViewerModifier {
+ @Override
+ public EntityLivingBase applyModifier(EntityLivingBase base, JsonObject info) {
+ if (!(base instanceof EntityWither))
+ return null;
+ EntityWither wither = (EntityWither) base;
+ if (info.has("tiny")) {
+ if (info.get("tiny").getAsBoolean()) {
+ wither.setInvulTime(800);
+ } else {
+ wither.setInvulTime(0);
+ }
+ }
+ if (info.has("armored")) {
+ if (info.get("armored").getAsBoolean()) {
+ wither.setHealth(1);
+ } else {
+ wither.setHealth(wither.getMaxHealth());
+ }
+ }
+ return base;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemRecipe.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemRecipe.java
index 63a4d6d8..be9ce6c7 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemRecipe.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemRecipe.java
@@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableList;
import io.github.moulberry.notenoughupdates.NEUManager;
import io.github.moulberry.notenoughupdates.recipes.NeuRecipe;
import io.github.moulberry.notenoughupdates.recipes.RecipeSlot;
+import io.github.moulberry.notenoughupdates.recipes.RecipeType;
import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
@@ -12,6 +13,7 @@ import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.MathHelper;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.input.Keyboard;
@@ -20,48 +22,65 @@ import org.lwjgl.opengl.GL11;
import java.awt.*;
import java.io.IOException;
-import java.util.ArrayList;
import java.util.List;
+import java.util.*;
public class GuiItemRecipe extends GuiScreen {
public static final ResourceLocation resourcePacksTexture = new ResourceLocation("textures/gui/resource_packs.png");
+ public static final ResourceLocation tabsTexture = new ResourceLocation("notenoughupdates", "textures/gui/tab.png");
public static final int SLOT_SIZE = 16;
public static final int SLOT_SPACING = SLOT_SIZE + 2;
public static final int BUTTON_WIDTH = 7;
public static final int BUTTON_HEIGHT = 11;
- public static final int BUTTON_POSITION_Y = 63;
- public static final int BUTTON_POSITION_LEFT_X = 110;
- public static final int BUTTON_POSITION_RIGHT_X = 147;
- public static final int PAGE_STRING_X = 132;
- public static final int PAGE_STRING_Y = 69;
public static final int TITLE_X = 28;
public static final int TITLE_Y = 6;
public static final int HOTBAR_SLOT_X = 8;
- public static final int HOTBAR_SLOT_Y = 142;
+ public static final int HOTBAR_SLOT_Y = 197;
public static final int PLAYER_INVENTORY_X = 8;
- public static final int PLAYER_INVENTORY_Y = 84;
+ public static final int PLAYER_INVENTORY_Y = 140;
+ public static final int TAB_POS_X = -26;
+ public static final int TAB_POS_Y = 8;
+ public static final int TAB_OFFSET_Y = 30;
+ public static final int TAB_SIZE_X = 26;
+ public static final int TAB_SIZE_Y = 30;
+ public static final int TAB_TEXTURE_SIZE_X = 29;
private int currentIndex = 0;
+ private int currentTab = 0;
- private final String title;
- private final List craftingRecipes;
+ private final Map> craftingRecipes = new HashMap<>();
+ private final List tabs = new ArrayList<>();
private final NEUManager manager;
public int guiLeft = 0;
public int guiTop = 0;
public int xSize = 176;
- public int ySize = 166;
+ public int ySize = 222;
- public GuiItemRecipe(String title, List craftingRecipes, NEUManager manager) {
- this.craftingRecipes = craftingRecipes;
+ public GuiItemRecipe(List unsortedRecipes, NEUManager manager) {
this.manager = manager;
- this.title = title;
+
+ for (NeuRecipe recipe : unsortedRecipes) {
+ craftingRecipes.computeIfAbsent(recipe.getType(), ignored -> new ArrayList<>()).add(recipe);
+ if (!tabs.contains(recipe.getType()))
+ tabs.add(recipe.getType());
+ }
}
public NeuRecipe getCurrentRecipe() {
- currentIndex = MathHelper.clamp_int(currentIndex, 0, craftingRecipes.size());
- return craftingRecipes.get(currentIndex);
+ List currentRecipes = getCurrentRecipeList();
+ currentIndex = MathHelper.clamp_int(currentIndex, 0, currentRecipes.size() - 1);
+ return currentRecipes.get(currentIndex);
+ }
+
+ public List getCurrentRecipeList() {
+ return craftingRecipes.get(getCurrentTab());
+ }
+
+ public RecipeType getCurrentTab() {
+ currentTab = MathHelper.clamp_int(currentTab, 0, tabs.size() - 1);
+ return tabs.get(currentTab);
}
public boolean isWithinRect(int x, int y, int topLeftX, int topLeftY, int width, int height) {
@@ -90,17 +109,19 @@ public class GuiItemRecipe extends GuiScreen {
Minecraft.getMinecraft().getTextureManager().bindTexture(currentRecipe.getBackground());
this.drawTexturedModalRect(guiLeft, guiTop, 0, 0, this.xSize, this.ySize);
+ drawTabs();
+
currentRecipe.drawExtraBackground(this, mouseX, mouseY);
List slots = getAllRenderedSlots();
for (RecipeSlot slot : slots) {
- Utils.drawItemStack(slot.getItemStack(), slot.getX(this), slot.getY(this));
+ Utils.drawItemStack(slot.getItemStack(), slot.getX(this), slot.getY(this), true);
}
- if (craftingRecipes.size() > 1) drawArrows(mouseX, mouseY);
+ drawArrows(currentRecipe, mouseX, mouseY);
Utils.drawStringScaledMaxWidth(
- title,
+ currentRecipe.getTitle(),
fontRendererObj,
guiLeft + TITLE_X,
guiTop + TITLE_Y,
@@ -126,42 +147,104 @@ public class GuiItemRecipe extends GuiScreen {
}
}
currentRecipe.drawHoverInformation(this, mouseX, mouseY);
+ drawTabHoverInformation(mouseX, mouseY);
+ }
+
+ private void drawTabHoverInformation(int mouseX, int mouseY) {
+ if (tabs.size() < 2) return;
+ for (int i = 0; i < tabs.size(); i++) {
+ if (isWithinRect(
+ mouseX - guiLeft,
+ mouseY - guiTop,
+ TAB_POS_X,
+ TAB_POS_Y + TAB_OFFSET_Y * i,
+ TAB_SIZE_X,
+ TAB_SIZE_Y
+ )) {
+ RecipeType type = tabs.get(i);
+ Utils.drawHoveringText(
+ Arrays.asList(
+ "" + EnumChatFormatting.RESET + EnumChatFormatting.GREEN + type.getLabel(),
+ "" + EnumChatFormatting.RESET + EnumChatFormatting.GRAY + craftingRecipes.get(type).size() + " Recipes"
+ ),
+ mouseX, mouseY, width, height, -1, Minecraft.getMinecraft().fontRendererObj
+ );
+ return;
+ }
+ }
}
- private void drawArrows(int mouseX, int mouseY) {
+ private void drawTabs() {
+ if (tabs.size() < 2) return;
+ for (int i = 0; i < tabs.size(); i++) {
+ RecipeType recipeType = tabs.get(i);
+ int tabPosX = guiLeft + TAB_POS_X, tabPosY = guiTop + TAB_OFFSET_Y * i + TAB_POS_Y;
+ int textureOffset = 0;
+ if (currentTab == i) {
+ textureOffset = 30;
+ }
+ Minecraft.getMinecraft().getTextureManager().bindTexture(tabsTexture);
+ drawTexturedModalRect(
+ tabPosX, tabPosY,
+ 0, textureOffset,
+ TAB_TEXTURE_SIZE_X, TAB_SIZE_Y
+ );
+ Utils.drawItemStack(recipeType.getIcon(), tabPosX + 7, tabPosY + 7);
+ }
+ }
+
+ public static final int BUTTON_POSITION_RIGHT_OFFSET_X = 37;
+ public static final int PAGE_STRING_OFFSET_X = 22;
+ public static final int PAGE_STRING_OFFSET_Y = 6;
+
+ private void drawArrows(
+ NeuRecipe currentRecipe,
+ int mouseX,
+ int mouseY
+ ) {
+ int recipeCount = getCurrentRecipeList().size();
+ if (recipeCount < 2) return;
+ int[] topLeft = currentRecipe.getPageFlipPositionLeftTopCorner();
+ int buttonPositionLeftX = topLeft[0];
+ int buttonPositionRightX = buttonPositionLeftX + BUTTON_POSITION_RIGHT_OFFSET_X;
+ int pageStringX = buttonPositionLeftX + PAGE_STRING_OFFSET_X;
+ int buttonPositionY = topLeft[1];
+ int pageStringY = buttonPositionY + PAGE_STRING_OFFSET_Y;
+
boolean leftSelected = isWithinRect(
mouseX - guiLeft,
mouseY - guiTop,
- BUTTON_POSITION_LEFT_X,
- BUTTON_POSITION_Y,
+ buttonPositionLeftX,
+ buttonPositionY,
BUTTON_WIDTH,
BUTTON_HEIGHT
);
boolean rightSelected = isWithinRect(
mouseX - guiLeft,
mouseY - guiTop,
- BUTTON_POSITION_RIGHT_X,
- BUTTON_POSITION_Y,
+ buttonPositionRightX,
+ buttonPositionY,
BUTTON_WIDTH,
BUTTON_HEIGHT
);
-
Minecraft.getMinecraft().getTextureManager().bindTexture(resourcePacksTexture);
- Utils.drawTexturedRect(guiLeft + BUTTON_POSITION_LEFT_X, guiTop + BUTTON_POSITION_Y, BUTTON_WIDTH, BUTTON_HEIGHT,
- 34 / 256f, 48 / 256f,
- leftSelected ? 37 / 256f : 5 / 256f, leftSelected ? 59 / 256f : 27 / 256f
- );
- Utils.drawTexturedRect(guiLeft + BUTTON_POSITION_RIGHT_X, guiTop + BUTTON_POSITION_Y, BUTTON_WIDTH, BUTTON_HEIGHT,
- 10 / 256f, 24 / 256f,
- rightSelected ? 37 / 256f : 5 / 256f, rightSelected ? 59 / 256f : 27 / 256f
- );
+ if (currentIndex != 0)
+ Utils.drawTexturedRect(guiLeft + buttonPositionLeftX, guiTop + buttonPositionY, BUTTON_WIDTH, BUTTON_HEIGHT,
+ 34 / 256f, 48 / 256f,
+ leftSelected ? 37 / 256f : 5 / 256f, leftSelected ? 59 / 256f : 27 / 256f
+ );
+ if (currentIndex != recipeCount - 1)
+ Utils.drawTexturedRect(guiLeft + buttonPositionRightX, guiTop + buttonPositionY, BUTTON_WIDTH, BUTTON_HEIGHT,
+ 10 / 256f, 24 / 256f,
+ rightSelected ? 37 / 256f : 5 / 256f, rightSelected ? 59 / 256f : 27 / 256f
+ );
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- String selectedPage = (currentIndex + 1) + "/" + craftingRecipes.size();
+ String selectedPage = (currentIndex + 1) + "/" + recipeCount;
Utils.drawStringCenteredScaledMaxWidth(selectedPage, fontRendererObj,
- guiLeft + PAGE_STRING_X, guiTop + PAGE_STRING_Y, false, 24, Color.BLACK.getRGB()
+ guiLeft + pageStringX, guiTop + pageStringY, false, 24, Color.BLACK.getRGB()
);
}
@@ -196,12 +279,12 @@ public class GuiItemRecipe extends GuiScreen {
int mouseX = Mouse.getX() * width / Minecraft.getMinecraft().displayWidth;
int mouseY = height - Mouse.getY() * height / Minecraft.getMinecraft().displayHeight - 1;
int keyPressed = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() + 256 : Keyboard.getEventKey();
-
+ if (Keyboard.getEventKeyState()) return;
for (RecipeSlot slot : getAllRenderedSlots()) {
if (isWithinRect(mouseX, mouseY, slot.getX(this), slot.getY(this), SLOT_SIZE, SLOT_SIZE)) {
ItemStack itemStack = slot.getItemStack();
- if (keyPressed == manager.keybindViewRecipe.getKeyCode()) { // TODO: rework this so it doesnt skip recipe chains
- manager.displayGuiItemRecipe(manager.getInternalNameForItem(itemStack), "");
+ if (keyPressed == manager.keybindViewRecipe.getKeyCode()) {
+ manager.displayGuiItemRecipe(manager.getInternalNameForItem(itemStack));
} else if (keyPressed == manager.keybindViewUsages.getKeyCode()) {
manager.displayGuiItemUsages(manager.getInternalNameForItem(itemStack));
}
@@ -212,16 +295,22 @@ public class GuiItemRecipe extends GuiScreen {
@Override
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
super.mouseClicked(mouseX, mouseY, mouseButton);
+ NeuRecipe currentRecipe = getCurrentRecipe();
+ int[] topLeft = currentRecipe.getPageFlipPositionLeftTopCorner();
+ int buttonPositionLeftX = topLeft[0];
+ int buttonPositionRightX = buttonPositionLeftX + BUTTON_POSITION_RIGHT_OFFSET_X;
+ int buttonPositionY = topLeft[1];
if (isWithinRect(
mouseX - guiLeft,
mouseY - guiTop,
- BUTTON_POSITION_LEFT_X,
- BUTTON_POSITION_Y,
+ buttonPositionLeftX,
+ buttonPositionY,
BUTTON_WIDTH,
BUTTON_HEIGHT
- )) {
- currentIndex = currentIndex == 0 ? 0 : currentIndex - 1;
+ ) &&
+ currentIndex > 0) {
+ currentIndex = currentIndex - 1;
Utils.playPressSound();
return;
}
@@ -229,21 +318,37 @@ public class GuiItemRecipe extends GuiScreen {
if (isWithinRect(
mouseX - guiLeft,
mouseY - guiTop,
- BUTTON_POSITION_RIGHT_X,
- BUTTON_POSITION_Y,
+ buttonPositionRightX,
+ buttonPositionY,
BUTTON_WIDTH,
BUTTON_HEIGHT
- )) {
- currentIndex = currentIndex == craftingRecipes.size() - 1 ? currentIndex : currentIndex + 1;
+ ) &&
+ currentIndex < getCurrentRecipeList().size()) {
+ currentIndex = currentIndex + 1;
Utils.playPressSound();
return;
}
+ for (int i = 0; i < tabs.size(); i++) {
+ if (isWithinRect(
+ mouseX - guiLeft,
+ mouseY - guiTop,
+ TAB_POS_X,
+ TAB_POS_Y + TAB_OFFSET_Y * i,
+ TAB_SIZE_X,
+ TAB_SIZE_Y
+ )) {
+ currentTab = i;
+ Utils.playPressSound();
+ return;
+ }
+ }
+
for (RecipeSlot slot : getAllRenderedSlots()) {
if (isWithinRect(mouseX, mouseY, slot.getX(this), slot.getY(this), SLOT_SIZE, SLOT_SIZE)) {
ItemStack itemStack = slot.getItemStack();
if (mouseButton == 0) {
- manager.displayGuiItemRecipe(manager.getInternalNameForItem(itemStack), "");
+ manager.displayGuiItemRecipe(manager.getInternalNameForItem(itemStack));
} else if (mouseButton == 1) {
manager.displayGuiItemUsages(manager.getInternalNameForItem(itemStack));
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorEntityAgeable.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorEntityAgeable.java
new file mode 100644
index 00000000..9228f93d
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorEntityAgeable.java
@@ -0,0 +1,12 @@
+package io.github.moulberry.notenoughupdates.mixins;
+
+import net.minecraft.entity.EntityAgeable;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+@Mixin(EntityAgeable.class)
+public interface AccessorEntityAgeable {
+ @Accessor(value = "growingAge")
+ void setGrowingAgeDirect(int newValue);
+
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorEntityArmorStand.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorEntityArmorStand.java
new file mode 100644
index 00000000..b6a3ca6e
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorEntityArmorStand.java
@@ -0,0 +1,12 @@
+package io.github.moulberry.notenoughupdates.mixins;
+
+import net.minecraft.entity.item.EntityArmorStand;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Invoker;
+
+@Mixin(EntityArmorStand.class)
+public interface AccessorEntityArmorStand {
+ @Invoker(value = "setSmall")
+ void setSmallDirect(boolean isSmall);
+
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorMinecraft.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorMinecraft.java
new file mode 100644
index 00000000..0277a18b
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorMinecraft.java
@@ -0,0 +1,14 @@
+package io.github.moulberry.notenoughupdates.mixins;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.resources.IResourcePack;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+import java.util.List;
+
+@Mixin(Minecraft.class)
+public interface AccessorMinecraft {
+ @Accessor(value = "defaultResourcePacks")
+ List onGetDefaultResourcePacks();
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityAgeable.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityAgeable.java
index b8f07b53..801b9041 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityAgeable.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityAgeable.java
@@ -3,6 +3,7 @@ package io.github.moulberry.notenoughupdates.mixins;
import net.minecraft.entity.EntityAgeable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.gen.Accessor;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityHorse.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityHorse.java
new file mode 100644
index 00000000..fe88922e
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityHorse.java
@@ -0,0 +1,17 @@
+package io.github.moulberry.notenoughupdates.mixins;
+
+import net.minecraft.entity.passive.EntityHorse;
+import net.minecraft.world.World;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Redirect;
+
+@Mixin(EntityHorse.class)
+public class MixinEntityHorse {
+ @Redirect(method = "updateHorseSlots", at = @At(value = "FIELD", target = "Lnet/minecraft/world/World;isRemote:Z"))
+ public boolean onUpdateHorseSlots(World instance) {
+ if (instance == null)
+ return true;
+ return instance.isRemote;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntitySkeleton.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntitySkeleton.java
new file mode 100644
index 00000000..54fe53f3
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntitySkeleton.java
@@ -0,0 +1,17 @@
+package io.github.moulberry.notenoughupdates.mixins;
+
+import net.minecraft.entity.monster.EntitySkeleton;
+import net.minecraft.world.World;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Redirect;
+
+@Mixin(EntitySkeleton.class)
+public class MixinEntitySkeleton {
+ @Redirect(method = "setCurrentItemOrArmor", at = @At(value = "FIELD", target = "Lnet/minecraft/world/World;isRemote:Z"))
+ public boolean onSetCurrentItemOrArmor(World instance) {
+ if (instance == null)
+ return true;
+ return instance.isRemote;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java
index 2fba6e80..68449ba8 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java
@@ -150,6 +150,10 @@ public class NEUConfig extends Config {
return;
case 20:
FairySouls.getInstance().setTrackFairySouls(NotEnoughUpdates.INSTANCE.config.misc.trackFairySouls);
+ return;
+ case 21:
+ NotEnoughUpdates.INSTANCE.overlay.updateSearch();
+ return;
}
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Itemlist.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Itemlist.java
index 3e5a4cdf..db154c24 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Itemlist.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Itemlist.java
@@ -107,4 +107,14 @@ public class Itemlist {
)
@ConfigEditorColour
public String backgroundColour = "15:6:0:0:255";
+
+ @Expose
+ @ConfigOption(
+ name = "Always show Monsters",
+ desc = "Always show Monster Items in the item list"
+ )
+ @ConfigEditorBoolean(
+ runnableId = 21
+ )
+ public boolean alwaysShowMonsters = false;
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java
index 11c10ea0..691ccaae 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java
@@ -2222,7 +2222,7 @@ public class GuiProfileViewer extends GuiScreen {
}
Panorama.drawPanorama(-backgroundRotation, guiLeft + 212, guiTop + 44, 81, 108, -0.37f, 0.6f,
- getPanoramasForLocation(location == null ? "dynamic" : location, panoramaIdentifier)
+ Panorama.getPanoramasForLocation(location == null ? "dynamic" : location, panoramaIdentifier)
);
Minecraft.getMinecraft().getTextureManager().bindTexture(pv_pets);
@@ -3114,38 +3114,6 @@ public class GuiProfileViewer extends GuiScreen {
return entityPlayer;
}
- public ResourceLocation[] getPanoramasForLocation(String location, String identifier) {
- if (panoramasMap.containsKey(location + identifier)) return panoramasMap.get(location + identifier);
- try {
- ResourceLocation[] panoramasArray = new ResourceLocation[6];
- for (int i = 0; i < 6; i++) {
- panoramasArray[i] =
- new ResourceLocation("notenoughupdates:panoramas/" + location + "_" + identifier + "/panorama_" + i + ".jpg");
- Minecraft.getMinecraft().getResourceManager().getResource(panoramasArray[i]);
- }
- panoramasMap.put(location + identifier, panoramasArray);
- return panoramasArray;
- } catch (IOException e) {
- try {
- ResourceLocation[] panoramasArray = new ResourceLocation[6];
- for (int i = 0; i < 6; i++) {
- panoramasArray[i] =
- new ResourceLocation("notenoughupdates:panoramas/" + location + "/panorama_" + i + ".jpg");
- Minecraft.getMinecraft().getResourceManager().getResource(panoramasArray[i]);
- }
- panoramasMap.put(location + identifier, panoramasArray);
- return panoramasArray;
- } catch (IOException e2) {
- ResourceLocation[] panoramasArray = new ResourceLocation[6];
- for (int i = 0; i < 6; i++) {
- panoramasArray[i] = new ResourceLocation("notenoughupdates:panoramas/unknown/panorama_" + i + ".jpg");
- }
- panoramasMap.put(location + identifier, panoramasArray);
- return panoramasArray;
- }
- }
- }
-
private void drawExtraPage(int mouseX, int mouseY, float partialTicks) {
FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
@@ -4717,7 +4685,7 @@ public class GuiProfileViewer extends GuiScreen {
}
Panorama.drawPanorama(-backgroundRotation - extraRotation, guiLeft + 23, guiTop + 44, 81, 108, 0.37f, 0.8f,
- getPanoramasForLocation(location == null ? "unknown" : location, panoramaIdentifier)
+ Panorama.getPanoramasForLocation(location == null ? "unknown" : location, panoramaIdentifier)
);
Minecraft.getMinecraft().getTextureManager().bindTexture(pv_basic);
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/Panorama.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/Panorama.java
index ac117bc2..a2d297f5 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/Panorama.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/Panorama.java
@@ -15,6 +15,9 @@ import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.glu.Project;
+import java.io.IOException;
+import java.util.HashMap;
+
public class Panorama {
private static final TexLoc tl = new TexLoc(97, 19, Keyboard.KEY_P);
private static final TexLoc tl2 = new TexLoc(37, 80, Keyboard.KEY_L);
@@ -24,6 +27,41 @@ public class Panorama {
private static int lastWidth = 0;
private static int lastHeight = 0;
+
+ private static final HashMap panoramasMap = new HashMap<>();
+
+ public static synchronized ResourceLocation[] getPanoramasForLocation(String location, String identifier) {
+ if (panoramasMap.containsKey(location + identifier)) return panoramasMap.get(location + identifier);
+ try {
+ ResourceLocation[] panoramasArray = new ResourceLocation[6];
+ for (int i = 0; i < 6; i++) {
+ panoramasArray[i] =
+ new ResourceLocation("notenoughupdates:panoramas/" + location + "_" + identifier + "/panorama_" + i + ".jpg");
+ Minecraft.getMinecraft().getResourceManager().getResource(panoramasArray[i]);
+ }
+ panoramasMap.put(location + identifier, panoramasArray);
+ return panoramasArray;
+ } catch (IOException e) {
+ try {
+ ResourceLocation[] panoramasArray = new ResourceLocation[6];
+ for (int i = 0; i < 6; i++) {
+ panoramasArray[i] =
+ new ResourceLocation("notenoughupdates:panoramas/" + location + "/panorama_" + i + ".jpg");
+ Minecraft.getMinecraft().getResourceManager().getResource(panoramasArray[i]);
+ }
+ panoramasMap.put(location + identifier, panoramasArray);
+ return panoramasArray;
+ } catch (IOException e2) {
+ ResourceLocation[] panoramasArray = new ResourceLocation[6];
+ for (int i = 0; i < 6; i++) {
+ panoramasArray[i] = new ResourceLocation("notenoughupdates:panoramas/unknown/panorama_" + i + ".jpg");
+ }
+ panoramasMap.put(location + identifier, panoramasArray);
+ return panoramasArray;
+ }
+ }
+ }
+
public static void drawPanorama(
float angle,
int x,
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/recipes/CraftingOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/CraftingOverlay.java
index d0b464f6..9d305e1d 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/CraftingOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/CraftingOverlay.java
@@ -103,7 +103,7 @@ public class CraftingOverlay {
if (Keyboard.getEventKey() == Keyboard.KEY_R)
manager.showRecipe(recipeIngredient.getInternalItemId());
if (Keyboard.getEventKey() == Keyboard.KEY_U)
- manager.displayGuiItemRecipe(recipeIngredient.getInternalItemId(), null);
+ manager.displayGuiItemRecipe(recipeIngredient.getInternalItemId());
}
});
});
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/recipes/CraftingRecipe.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/CraftingRecipe.java
index 576cbbd4..79f349fa 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/CraftingRecipe.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/CraftingRecipe.java
@@ -17,130 +17,135 @@ import java.util.Set;
public class CraftingRecipe implements NeuRecipe {
- public static final ResourceLocation BACKGROUND = new ResourceLocation("textures/gui/container/crafting_table.png");
-
- private static final int EXTRA_STRING_X = 132;
- private static final int EXTRA_STRING_Y = 25;
-
- private final NEUManager manager;
- private final Ingredient[] inputs;
- private final String extraText;
- private final Ingredient outputIngredient;
- private List slots;
-
- public CraftingRecipe(NEUManager manager, Ingredient[] inputs, Ingredient output, String extra) {
- this.manager = manager;
- this.inputs = inputs;
- this.outputIngredient = output;
- this.extraText = extra;
- if (inputs.length != 9)
- throw new IllegalArgumentException("Cannot construct crafting recipe with non standard crafting grid size");
- }
-
- @Override
- public Set getIngredients() {
- Set ingredients = Sets.newHashSet(inputs);
- ingredients.remove(null);
- return ingredients;
- }
-
- @Override
- public boolean hasVariableCost() {
- return false;
- }
-
- @Override
- public Set getOutputs() {
- return Collections.singleton(getOutput());
- }
-
- public Ingredient getOutput() {
- return outputIngredient;
- }
-
- public Ingredient[] getInputs() {
- return inputs;
- }
-
- @Override
- public List getSlots() {
- if (slots != null) return slots;
- slots = new ArrayList<>();
- for (int x = 0; x < 3; x++) {
- for (int y = 0; y < 3; y++) {
- Ingredient input = inputs[x + y * 3];
- if (input == null) continue;
- ItemStack item = input.getItemStack();
- if (item == null) continue;
- slots.add(new RecipeSlot(30 + x * GuiItemRecipe.SLOT_SPACING, 17 + y * GuiItemRecipe.SLOT_SPACING, item));
- }
- }
- slots.add(new RecipeSlot(124, 35, outputIngredient.getItemStack()));
- return slots;
- }
-
- public String getCraftText() {
- return extraText;
- }
-
- @Override
- public ResourceLocation getBackground() {
- return BACKGROUND;
- }
-
- @Override
- public void drawExtraInfo(GuiItemRecipe gui, int mouseX, int mouseY) {
- FontRenderer fontRenderer = Minecraft.getMinecraft().fontRendererObj;
-
- String craftingText = getCraftText();
- if (craftingText != null)
- Utils.drawStringCenteredScaledMaxWidth(craftingText, fontRenderer,
- gui.guiLeft + EXTRA_STRING_X, gui.guiTop + EXTRA_STRING_Y, false, 75, 0x404040
- );
- }
-
- @Override
- public JsonObject serialize() {
- JsonObject object = new JsonObject();
- object.addProperty("type", "crafting");
- object.addProperty("count", outputIngredient.getCount());
- object.addProperty("overrideOutputId", outputIngredient.getInternalItemId());
- for (int i = 0; i < 9; i++) {
- Ingredient ingredient = inputs[i];
- if (ingredient == null) continue;
- String[] x = {"1", "2", "3"};
- String[] y = {"A", "B", "C"};
- String name = x[i / 3] + y[i % 3];
- object.addProperty(name, ingredient.serialize());
- }
- if (extraText != null)
- object.addProperty("crafttext", extraText);
- return object;
- }
-
- public static CraftingRecipe parseCraftingRecipe(NEUManager manager, JsonObject recipe, JsonObject outputItem) {
- Ingredient[] craftMatrix = new Ingredient[9];
-
- String[] x = {"1", "2", "3"};
- String[] y = {"A", "B", "C"};
- for (int i = 0; i < 9; i++) {
- String name = y[i / 3] + x[i % 3];
- if (!recipe.has(name)) continue;
- String item = recipe.get(name).getAsString();
- if (item == null || item.isEmpty()) continue;
- craftMatrix[i] = new Ingredient(manager, item);
- }
- int resultCount = 1;
- if (recipe.has("count"))
- resultCount = recipe.get("count").getAsInt();
- String extra = null;
- if (outputItem.has("crafttext"))
- extra = outputItem.get("crafttext").getAsString();
- if (recipe.has("crafttext"))
- extra = recipe.get("crafttext").getAsString();
- String outputItemId = outputItem.get("internalname").getAsString();
- if (recipe.has("overrideOutputId"))
- outputItemId = recipe.get("overrideOutputId").getAsString();
- return new CraftingRecipe(manager, craftMatrix, new Ingredient(manager, outputItemId, resultCount), extra);
- }
+ public static final ResourceLocation BACKGROUND = new ResourceLocation("notenoughupdates","textures/gui/crafting_table_tall.png");
+
+ private static final int EXTRA_STRING_X = 132;
+ private static final int EXTRA_STRING_Y = 50;
+
+ private final NEUManager manager;
+ private final Ingredient[] inputs;
+ private final String extraText;
+ private final Ingredient outputIngredient;
+ private List slots;
+
+ public CraftingRecipe(NEUManager manager, Ingredient[] inputs, Ingredient output, String extra) {
+ this.manager = manager;
+ this.inputs = inputs;
+ this.outputIngredient = output;
+ this.extraText = extra;
+ if (inputs.length != 9)
+ throw new IllegalArgumentException("Cannot construct crafting recipe with non standard crafting grid size");
+ }
+
+ @Override
+ public Set getIngredients() {
+ Set ingredients = Sets.newHashSet(inputs);
+ ingredients.remove(null);
+ return ingredients;
+ }
+
+ @Override
+ public RecipeType getType() {
+ return RecipeType.CRAFTING;
+ }
+
+ @Override
+ public boolean hasVariableCost() {
+ return false;
+ }
+
+ @Override
+ public Set getOutputs() {
+ return Collections.singleton(getOutput());
+ }
+
+ public Ingredient getOutput() {
+ return outputIngredient;
+ }
+
+ public Ingredient[] getInputs() {
+ return inputs;
+ }
+
+
+ @Override
+ public List getSlots() {
+ if (slots != null) return slots;
+ slots = new ArrayList<>();
+ for (int x = 0; x < 3; x++) {
+ for (int y = 0; y < 3; y++) {
+ Ingredient input = inputs[x + y * 3];
+ if (input == null) continue;
+ ItemStack item = input.getItemStack();
+ if (item == null) continue;
+ slots.add(new RecipeSlot(30 + x * GuiItemRecipe.SLOT_SPACING, 48 + y * GuiItemRecipe.SLOT_SPACING, item));
+ }
+ }
+ slots.add(new RecipeSlot(124, 66, outputIngredient.getItemStack()));
+ return slots;
+ }
+
+ public String getCraftText() {
+ return extraText;
+ }
+
+ @Override
+ public ResourceLocation getBackground() {
+ return BACKGROUND;
+ }
+
+ @Override
+ public void drawExtraInfo(GuiItemRecipe gui, int mouseX, int mouseY) {
+ FontRenderer fontRenderer = Minecraft.getMinecraft().fontRendererObj;
+
+ String craftingText = getCraftText();
+ if (craftingText != null)
+ Utils.drawStringCenteredScaledMaxWidth(craftingText, fontRenderer,
+ gui.guiLeft + EXTRA_STRING_X, gui.guiTop + EXTRA_STRING_Y, false, 75, 0x404040);
+ }
+
+ @Override
+ public JsonObject serialize() {
+ JsonObject object = new JsonObject();
+ object.addProperty("type", "crafting");
+ object.addProperty("count", outputIngredient.getCount());
+ object.addProperty("overrideOutputId", outputIngredient.getInternalItemId());
+ for (int i = 0; i < 9; i++) {
+ Ingredient ingredient = inputs[i];
+ if (ingredient == null) continue;
+ String[] x = {"1", "2", "3"};
+ String[] y = {"A", "B", "C"};
+ String name = x[i / 3] + y[i % 3];
+ object.addProperty(name, ingredient.serialize());
+ }
+ if(extraText != null)
+ object.addProperty("crafttext", extraText);
+ return object;
+ }
+
+ public static CraftingRecipe parseCraftingRecipe(NEUManager manager, JsonObject recipe, JsonObject outputItem) {
+ Ingredient[] craftMatrix = new Ingredient[9];
+
+ String[] x = {"1", "2", "3"};
+ String[] y = {"A", "B", "C"};
+ for (int i = 0; i < 9; i++) {
+ String name = y[i / 3] + x[i % 3];
+ if (!recipe.has(name)) continue;
+ String item = recipe.get(name).getAsString();
+ if (item == null || item.isEmpty()) continue;
+ craftMatrix[i] = new Ingredient(manager, item);
+ }
+ int resultCount = 1;
+ if (recipe.has("count"))
+ resultCount = recipe.get("count").getAsInt();
+ String extra = null;
+ if (outputItem.has("crafttext"))
+ extra = outputItem.get("crafttext").getAsString();
+ if (recipe.has("crafttext"))
+ extra = recipe.get("crafttext").getAsString();
+ String outputItemId = outputItem.get("internalname").getAsString();
+ if (recipe.has("overrideOutputId"))
+ outputItemId = recipe.get("overrideOutputId").getAsString();
+ return new CraftingRecipe(manager, craftMatrix, new Ingredient(manager, outputItemId, resultCount), extra);
+ }
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/recipes/ForgeRecipe.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/ForgeRecipe.java
index c971d82a..7847b0b4 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/ForgeRecipe.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/ForgeRecipe.java
@@ -19,238 +19,212 @@ import java.util.*;
public class ForgeRecipe implements NeuRecipe {
- private static final ResourceLocation BACKGROUND =
- new ResourceLocation("notenoughupdates", "textures/gui/forge_recipe.png");
-
- private static final int SLOT_IMAGE_U = 176;
- private static final int SLOT_IMAGE_V = 0;
- private static final int SLOT_IMAGE_SIZE = 18;
- private static final int SLOT_PADDING = 1;
- private static final int EXTRA_INFO_MAX_WIDTH = 75;
- public static final int EXTRA_INFO_X = 132;
- public static final int EXTRA_INFO_Y = 25;
-
- public enum ForgeType {
- REFINING, ITEM_FORGING
- }
-
- private final NEUManager manager;
- private final List inputs;
- private final Ingredient output;
- private final int hotmLevel;
- private final int timeInSeconds; // TODO: quick forge
- private List slots;
-
- public ForgeRecipe(
- NEUManager manager,
- List inputs,
- Ingredient output,
- int durationInSeconds,
- int hotmLevel
- ) {
- this.manager = manager;
- this.inputs = inputs;
- this.output = output;
- this.hotmLevel = hotmLevel;
- this.timeInSeconds = durationInSeconds;
- }
-
- public List getInputs() {
- return inputs;
- }
-
- public Ingredient getOutput() {
- return output;
- }
-
- public int getHotmLevel() {
- return hotmLevel;
- }
-
- public int getTimeInSeconds() {
- return timeInSeconds;
- }
-
- @Override
- public ResourceLocation getBackground() {
- return BACKGROUND;
- }
-
- @Override
- public Set getIngredients() {
- return Sets.newHashSet(inputs);
- }
-
- @Override
- public boolean hasVariableCost() {
- return false;
- }
-
- @Override
- public Set getOutputs() {
- return Collections.singleton(output);
- }
-
- @Override
- public List getSlots() {
- if (slots != null) return slots;
- slots = new ArrayList<>();
- for (int i = 0; i < inputs.size(); i++) {
- Ingredient input = inputs.get(i);
- ItemStack itemStack = input.getItemStack();
- if (itemStack == null) continue;
- int[] slotCoordinates = getSlotCoordinates(i, inputs.size());
- slots.add(new RecipeSlot(slotCoordinates[0], slotCoordinates[1], itemStack));
- }
- slots.add(new RecipeSlot(124, 35, output.getItemStack()));
- return slots;
- }
-
- @Override
- public void drawExtraBackground(GuiItemRecipe gui, int mouseX, int mouseY) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(BACKGROUND);
- for (int i = 0; i < inputs.size(); i++) {
- int[] slotCoordinates = getSlotCoordinates(i, inputs.size());
- gui.drawTexturedModalRect(
- gui.guiLeft + slotCoordinates[0] - SLOT_PADDING, gui.guiTop + slotCoordinates[1] - SLOT_PADDING,
- SLOT_IMAGE_U, SLOT_IMAGE_V,
- SLOT_IMAGE_SIZE, SLOT_IMAGE_SIZE
- );
- }
- }
-
- @Override
- public void drawExtraInfo(GuiItemRecipe gui, int mouseX, int mouseY) {
- FontRenderer fontRenderer = Minecraft.getMinecraft().fontRendererObj;
- if (timeInSeconds > 0)
- Utils.drawStringCenteredScaledMaxWidth(
- formatDuration(timeInSeconds),
- fontRenderer,
- gui.guiLeft + EXTRA_INFO_X,
- gui.guiTop + EXTRA_INFO_Y,
- false,
- EXTRA_INFO_MAX_WIDTH,
- 0xff00ff
- );
- }
-
- @Override
- public void drawHoverInformation(GuiItemRecipe gui, int mouseX, int mouseY) {
- manager.hotm.getInformationOnCurrentProfile().ifPresent(hotmTree -> {
- if (timeInSeconds > 0 && gui.isWithinRect(
- mouseX, mouseY,
- gui.guiLeft + EXTRA_INFO_X - EXTRA_INFO_MAX_WIDTH / 2,
- gui.guiTop + EXTRA_INFO_Y - 8,
- EXTRA_INFO_MAX_WIDTH, 16
- )) {
- int qf = hotmTree.getLevel("forge_time");
- int reducedTime = getReducedTime(qf);
- if (qf > 0) {
-
- Utils.drawHoveringText(
- Arrays.asList(
- EnumChatFormatting.YELLOW + formatDuration(reducedTime) + " with Quick Forge (Level " + qf + ")"),
- mouseX,
- mouseY,
- gui.width,
- gui.height,
- 500,
- Minecraft.getMinecraft().fontRendererObj
- );
- }
- }
- });
- }
-
- public int getReducedTime(int quickForgeUpgradeLevel) {
- return HotmInformation.getQuickForgeMultiplier(quickForgeUpgradeLevel) * timeInSeconds / 1000;
- }
-
- @Override
- public JsonObject serialize() {
- JsonObject object = new JsonObject();
- JsonArray ingredients = new JsonArray();
- for (Ingredient input : inputs) {
- ingredients.add(new JsonPrimitive(input.serialize()));
- }
- object.addProperty("type", "forge");
- object.add("inputs", ingredients);
- object.addProperty("count", output.getCount());
- object.addProperty("overrideOutputId", output.getInternalItemId());
- if (hotmLevel >= 0)
- object.addProperty("hotmLevel", hotmLevel);
- if (timeInSeconds >= 0)
- object.addProperty("duration", timeInSeconds);
- return object;
- }
-
- static ForgeRecipe parseForgeRecipe(NEUManager manager, JsonObject recipe, JsonObject output) {
- List ingredients = new ArrayList<>();
- for (JsonElement element : recipe.getAsJsonArray("inputs")) {
- String ingredientString = element.getAsString();
- ingredients.add(new Ingredient(manager, ingredientString));
- }
- String internalItemId = output.get("internalname").getAsString();
- if (recipe.has("overrideOutputId"))
- internalItemId = recipe.get("overrideOutputId").getAsString();
- int resultCount = 1;
- if (recipe.has("count")) {
- resultCount = recipe.get("count").getAsInt();
- }
- int duration = -1;
- if (recipe.has("duration")) {
- duration = recipe.get("duration").getAsInt();
- }
- int hotmLevel = -1;
- if (recipe.has("hotmLevel")) {
- hotmLevel = recipe.get("hotmLevel").getAsInt();
- }
- return new ForgeRecipe(
- manager,
- ingredients,
- new Ingredient(manager, internalItemId, resultCount),
- duration,
- hotmLevel
- );
- }
-
- private static final int RECIPE_CENTER_X = 40;
- private static final int RECIPE_CENTER_Y = 34;
- private static final int SLOT_DISTANCE_FROM_CENTER = 22;
- private static final int RECIPE_FALLBACK_X = 20;
- private static final int RECIPE_FALLBACK_Y = 15;
-
- static int[] getSlotCoordinates(int slotNumber, int totalSlotCount) {
- if (totalSlotCount > 6) {
- return new int[]{
- RECIPE_FALLBACK_X + (slotNumber % 4) * GuiItemRecipe.SLOT_SPACING,
- RECIPE_FALLBACK_Y + (slotNumber / 4) * GuiItemRecipe.SLOT_SPACING,
- };
- }
- if (totalSlotCount == 1) {
- return new int[]{
- RECIPE_CENTER_X - GuiItemRecipe.SLOT_SIZE / 2,
- RECIPE_CENTER_Y - GuiItemRecipe.SLOT_SIZE / 2
- };
- }
- double rad = Math.PI * 2 * slotNumber / totalSlotCount;
- int x = (int) (Math.cos(rad) * SLOT_DISTANCE_FROM_CENTER);
- int y = (int) (Math.sin(rad) * SLOT_DISTANCE_FROM_CENTER);
- return new int[]{RECIPE_CENTER_X + x, RECIPE_CENTER_Y + y};
- }
-
- static String formatDuration(int seconds) {
- int minutes = seconds / 60;
- seconds %= 60;
- int hours = minutes / 60;
- minutes %= 60;
- int days = hours / 24;
- hours %= 24;
- StringBuilder sB = new StringBuilder();
- if (days != 0) sB.append(days).append("d ");
- if (hours != 0) sB.append(hours).append("h ");
- if (minutes != 0) sB.append(minutes).append("m ");
- if (seconds != 0) sB.append(seconds).append("s ");
- return sB.substring(0, sB.length() - 1);
- }
+ private static final ResourceLocation BACKGROUND = new ResourceLocation("notenoughupdates", "textures/gui/forge_recipe_tall.png");
+
+ private static final int SLOT_IMAGE_U = 176;
+ private static final int SLOT_IMAGE_V = 0;
+ private static final int SLOT_IMAGE_SIZE = 18;
+ private static final int SLOT_PADDING = 1;
+ private static final int EXTRA_INFO_MAX_WIDTH = 75;
+ public static final int EXTRA_INFO_X = 132;
+ public static final int EXTRA_INFO_Y = 55;
+
+ public enum ForgeType {
+ REFINING, ITEM_FORGING
+ }
+
+ private final NEUManager manager;
+ private final List inputs;
+ private final Ingredient output;
+ private final int hotmLevel;
+ private final int timeInSeconds; // TODO: quick forge
+ private List slots;
+
+ public ForgeRecipe(NEUManager manager, List inputs, Ingredient output, int durationInSeconds, int hotmLevel) {
+ this.manager = manager;
+ this.inputs = inputs;
+ this.output = output;
+ this.hotmLevel = hotmLevel;
+ this.timeInSeconds = durationInSeconds;
+ }
+
+ public List getInputs() {
+ return inputs;
+ }
+
+ public Ingredient getOutput() {
+ return output;
+ }
+
+ public int getHotmLevel() {
+ return hotmLevel;
+ }
+
+ public int getTimeInSeconds() {
+ return timeInSeconds;
+ }
+
+ @Override
+ public ResourceLocation getBackground() {
+ return BACKGROUND;
+ }
+
+ @Override
+ public RecipeType getType() {
+ return RecipeType.FORGE;
+ }
+
+ @Override
+ public Set getIngredients() {
+ return Sets.newHashSet(inputs);
+ }
+
+ @Override
+ public boolean hasVariableCost() {
+ return false;
+ }
+
+ @Override
+ public Set getOutputs() {
+ return Collections.singleton(output);
+ }
+
+ @Override
+ public List getSlots() {
+ if (slots != null) return slots;
+ slots = new ArrayList<>();
+ for (int i = 0; i < inputs.size(); i++) {
+ Ingredient input = inputs.get(i);
+ ItemStack itemStack = input.getItemStack();
+ if (itemStack == null) continue;
+ int[] slotCoordinates = getSlotCoordinates(i, inputs.size());
+ slots.add(new RecipeSlot(slotCoordinates[0], slotCoordinates[1], itemStack));
+ }
+ slots.add(new RecipeSlot(124, 66, output.getItemStack()));
+ return slots;
+ }
+
+ @Override
+ public void drawExtraBackground(GuiItemRecipe gui, int mouseX, int mouseY) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(BACKGROUND);
+ for (int i = 0; i < inputs.size(); i++) {
+ int[] slotCoordinates = getSlotCoordinates(i, inputs.size());
+ gui.drawTexturedModalRect(
+ gui.guiLeft + slotCoordinates[0] - SLOT_PADDING, gui.guiTop + slotCoordinates[1] - SLOT_PADDING,
+ SLOT_IMAGE_U, SLOT_IMAGE_V,
+ SLOT_IMAGE_SIZE, SLOT_IMAGE_SIZE);
+ }
+ }
+
+ @Override
+ public void drawExtraInfo(GuiItemRecipe gui, int mouseX, int mouseY) {
+ FontRenderer fontRenderer = Minecraft.getMinecraft().fontRendererObj;
+ if (timeInSeconds > 0)
+ Utils.drawStringCenteredScaledMaxWidth(formatDuration(timeInSeconds), fontRenderer, gui.guiLeft + EXTRA_INFO_X, gui.guiTop + EXTRA_INFO_Y, false, EXTRA_INFO_MAX_WIDTH, 0xff00ff);
+ }
+
+ @Override
+ public void drawHoverInformation(GuiItemRecipe gui, int mouseX, int mouseY) {
+ manager.hotm.getInformationOnCurrentProfile().ifPresent(hotmTree -> {
+ if (timeInSeconds > 0 && gui.isWithinRect(
+ mouseX, mouseY,
+ gui.guiLeft + EXTRA_INFO_X - EXTRA_INFO_MAX_WIDTH / 2,
+ gui.guiTop + EXTRA_INFO_Y - 8,
+ EXTRA_INFO_MAX_WIDTH, 16
+ )) {
+ int qf = hotmTree.getLevel("forge_time");
+ int reducedTime = getReducedTime(qf);
+ if (qf > 0) {
+
+ Utils.drawHoveringText(Arrays.asList(EnumChatFormatting.YELLOW + formatDuration(reducedTime) + " with Quick Forge (Level " + qf + ")"), mouseX, mouseY, gui.width, gui.height, 500, Minecraft.getMinecraft().fontRendererObj);
+ }
+ }
+ });
+ }
+
+ public int getReducedTime(int quickForgeUpgradeLevel) {
+ return HotmInformation.getQuickForgeMultiplier(quickForgeUpgradeLevel) * timeInSeconds / 1000;
+ }
+
+ @Override
+ public JsonObject serialize() {
+ JsonObject object = new JsonObject();
+ JsonArray ingredients = new JsonArray();
+ for (Ingredient input : inputs) {
+ ingredients.add(new JsonPrimitive(input.serialize()));
+ }
+ object.addProperty("type", "forge");
+ object.add("inputs", ingredients);
+ object.addProperty("count", output.getCount());
+ object.addProperty("overrideOutputId", output.getInternalItemId());
+ if (hotmLevel >= 0)
+ object.addProperty("hotmLevel", hotmLevel);
+ if (timeInSeconds >= 0)
+ object.addProperty("duration", timeInSeconds);
+ return object;
+ }
+
+ static ForgeRecipe parseForgeRecipe(NEUManager manager, JsonObject recipe, JsonObject output) {
+ List ingredients = new ArrayList<>();
+ for (JsonElement element : recipe.getAsJsonArray("inputs")) {
+ String ingredientString = element.getAsString();
+ ingredients.add(new Ingredient(manager, ingredientString));
+ }
+ String internalItemId = output.get("internalname").getAsString();
+ if (recipe.has("overrideOutputId"))
+ internalItemId = recipe.get("overrideOutputId").getAsString();
+ int resultCount = 1;
+ if (recipe.has("count")) {
+ resultCount = recipe.get("count").getAsInt();
+ }
+ int duration = -1;
+ if (recipe.has("duration")) {
+ duration = recipe.get("duration").getAsInt();
+ }
+ int hotmLevel = -1;
+ if (recipe.has("hotmLevel")) {
+ hotmLevel = recipe.get("hotmLevel").getAsInt();
+ }
+ return new ForgeRecipe(manager, ingredients, new Ingredient(manager, internalItemId, resultCount), duration, hotmLevel);
+ }
+
+ private static final int RECIPE_CENTER_X = 49;
+ private static final int RECIPE_CENTER_Y = 74;
+ private static final int SLOT_DISTANCE_FROM_CENTER = 30;
+ private static final int RECIPE_FALLBACK_X = 20;
+ private static final int RECIPE_FALLBACK_Y = 15;
+
+ static int[] getSlotCoordinates(int slotNumber, int totalSlotCount) {
+ if (totalSlotCount > 8) {
+ return new int[]{
+ RECIPE_FALLBACK_X + (slotNumber % 4) * GuiItemRecipe.SLOT_SPACING,
+ RECIPE_FALLBACK_Y + (slotNumber / 4) * GuiItemRecipe.SLOT_SPACING,
+ };
+ }
+ if (totalSlotCount == 1) {
+ return new int[]{
+ RECIPE_CENTER_X - GuiItemRecipe.SLOT_SIZE / 2,
+ RECIPE_CENTER_Y - GuiItemRecipe.SLOT_SIZE / 2
+ };
+ }
+ double rad = Math.PI * 2 * slotNumber / totalSlotCount;
+ int x = (int) (Math.cos(rad) * SLOT_DISTANCE_FROM_CENTER);
+ int y = (int) (Math.sin(rad) * SLOT_DISTANCE_FROM_CENTER);
+ return new int[]{RECIPE_CENTER_X + x - GuiItemRecipe.SLOT_SIZE / 2, RECIPE_CENTER_Y + y - GuiItemRecipe.SLOT_SIZE / 2};
+ }
+
+ static String formatDuration(int seconds) {
+ int minutes = seconds / 60;
+ seconds %= 60;
+ int hours = minutes / 60;
+ minutes %= 60;
+ int days = hours / 24;
+ hours %= 24;
+ StringBuilder sB = new StringBuilder();
+ if (days != 0) sB.append(days).append("d ");
+ if (hours != 0) sB.append(hours).append("h ");
+ if (minutes != 0) sB.append(minutes).append("m ");
+ if (seconds != 0) sB.append(seconds).append("s ");
+ return sB.substring(0, sB.length() - 1);
+ }
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/recipes/Ingredient.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/Ingredient.java
index 79b548da..c4928605 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/Ingredient.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/Ingredient.java
@@ -2,6 +2,7 @@ package io.github.moulberry.notenoughupdates.recipes;
import com.google.gson.JsonObject;
import io.github.moulberry.notenoughupdates.NEUManager;
+import io.github.moulberry.notenoughupdates.util.ItemUtils;
import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
@@ -75,9 +76,7 @@ public class Ingredient {
public ItemStack getItemStack() {
if (itemStack != null) return itemStack;
if (isCoins()) {
- itemStack = new ItemStack(Items.gold_nugget);
- itemStack.setStackDisplayName("\u00A7r\u00A76" + Utils.formatNumberWithDots(getCount()) + " Coins");
- return itemStack;
+ return ItemUtils.getCoinItemStack(count);
}
JsonObject itemInfo = manager.getItemInformation().get(internalItemId);
itemStack = manager.jsonToStack(itemInfo);
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/recipes/MobLootRecipe.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/MobLootRecipe.java
new file mode 100644
index 00000000..dcbf71da
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/MobLootRecipe.java
@@ -0,0 +1,309 @@
+package io.github.moulberry.notenoughupdates.recipes;
+
+import com.google.common.collect.Sets;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+import io.github.moulberry.notenoughupdates.NEUManager;
+import io.github.moulberry.notenoughupdates.miscfeatures.entityviewer.EntityViewer;
+import io.github.moulberry.notenoughupdates.miscgui.GuiItemRecipe;
+import io.github.moulberry.notenoughupdates.profileviewer.Panorama;
+import io.github.moulberry.notenoughupdates.util.ItemUtils;
+import io.github.moulberry.notenoughupdates.util.JsonUtils;
+import io.github.moulberry.notenoughupdates.util.Utils;
+import net.minecraft.client.Minecraft;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ResourceLocation;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class MobLootRecipe implements NeuRecipe {
+
+ private static final int MOB_POS_X = 38, MOB_POS_Y = 100;
+ private static final int SLOT_POS_X = 82, SLOT_POS_Y = 24;
+
+ public static class MobDrop {
+ public final Ingredient drop;
+ public final String chance;
+ public final List extra;
+
+ private ItemStack itemStack;
+
+ public MobDrop(Ingredient drop, String chance, List extra) {
+ this.drop = drop;
+ this.chance = chance;
+ this.extra = extra;
+ }
+
+ public ItemStack getItemStack() {
+ if (itemStack == null) {
+ itemStack = drop.getItemStack().copy();
+ List arrayList = new ArrayList<>(extra);
+ arrayList.add("§r§e§lDrop Chance: §6" + chance);
+ ItemUtils.appendLore(itemStack, arrayList);
+ }
+ return itemStack;
+ }
+ }
+
+ public static ResourceLocation BACKGROUND = new ResourceLocation(
+ "notenoughupdates",
+ "textures/gui/mob_loot_tall.png"
+ );
+ private final Ingredient mobIngredient;
+ private final List drops;
+ private final int coins;
+ private final int combatXp;
+ private final int xp;
+ private final String name;
+ private final String render;
+ private final int level;
+ private final List extra;
+ private EntityLivingBase entityLivingBase;
+
+ private final String panoName;
+
+ private ResourceLocation[] panos = null;
+
+ public MobLootRecipe(
+ Ingredient mobIngredient,
+ List drops,
+ int level,
+ int coins,
+ int xp,
+ int combatXp,
+ String name,
+ String render,
+ List extra,
+ String panoName
+ ) {
+ this.mobIngredient = mobIngredient;
+ this.drops = drops;
+ this.level = level;
+ this.coins = coins;
+ this.xp = xp;
+ this.extra = extra;
+ this.combatXp = combatXp;
+ this.name = name;
+ this.render = render;
+ this.panoName = panoName;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public List getDrops() {
+ return drops;
+ }
+
+ public int getCoins() {
+ return coins;
+ }
+
+ public int getCombatXp() {
+ return combatXp;
+ }
+
+ public Ingredient getMob() {
+ return mobIngredient;
+ }
+
+ public int getXp() {
+ return xp;
+ }
+
+ public String getRender() {
+ return render;
+ }
+
+ public synchronized EntityLivingBase getRenderEntity() {
+ if (entityLivingBase == null) {
+ if (render == null) return null;
+ if (render.startsWith("@")) {
+ entityLivingBase = EntityViewer.constructEntity(new ResourceLocation(render.substring(1)));
+ } else {
+ entityLivingBase = EntityViewer.constructEntity(render, Collections.emptyList());
+ }
+ }
+ return entityLivingBase;
+ }
+
+ @Override
+ public Set getIngredients() {
+ return Sets.newHashSet(mobIngredient);
+ }
+
+ @Override
+ public Set getOutputs() {
+ return Stream.concat(drops.stream().map(it -> it.drop), Stream.of(mobIngredient)).collect(Collectors.toSet());
+ }
+
+ @Override
+ public String getTitle() {
+ return getFullMobName();
+ }
+
+ public String getFullMobName() {
+ return (level > 0 ? "§8[§7Lv " + level + "§8] §c" : "§c") + name;
+ }
+
+ @Override
+ public List getSlots() {
+ List slots = new ArrayList<>();
+ BiConsumer addSlot = (sl, is) -> slots.add(
+ new RecipeSlot(
+ SLOT_POS_X + (sl % 5) * 16,
+ SLOT_POS_Y + (sl / 5) * 16,
+ is
+ ));
+ int i = 0;
+ for (; i < drops.size(); i++) {
+ MobDrop mobDrop = drops.get(i);
+ addSlot.accept(i, mobDrop.getItemStack());
+ }
+ return slots;
+ }
+
+ @Override
+ public RecipeType getType() {
+ return RecipeType.MOB_LOOT;
+ }
+
+ @Override
+ public boolean shouldUseForCraftCost() {
+ return false;
+ }
+
+ @Override
+ public boolean hasVariableCost() {
+ return true;
+ }
+
+ public static final int PANORAMA_POS_X = 13;
+ public static final int PANORAMA_POS_Y = 23;
+ public static final int PANORAMA_WIDTH = 50;
+ public static final int PANORAMA_HEIGHT = 80;
+
+ @Override
+ public void drawExtraBackground(GuiItemRecipe gui, int mouseX, int mouseY) {
+ if (panos == null) {
+ panos = Panorama.getPanoramasForLocation(panoName, "day");
+ }
+ Panorama.drawPanorama(
+ ((System.nanoTime() / 20000000000F) % 1) * 360,
+ gui.guiLeft + PANORAMA_POS_X,
+ gui.guiTop + PANORAMA_POS_Y,
+ PANORAMA_WIDTH,
+ PANORAMA_HEIGHT,
+ 0F,
+ 0F,
+ panos
+ );
+ if (getRenderEntity() != null)
+ EntityViewer.renderEntity(entityLivingBase, gui.guiLeft + MOB_POS_X, gui.guiTop + MOB_POS_Y, mouseX, mouseY);
+ }
+
+ @Override
+ public void drawHoverInformation(GuiItemRecipe gui, int mouseX, int mouseY) {
+ if (gui.isWithinRect(
+ mouseX,
+ mouseY,
+ gui.guiLeft + PANORAMA_POS_X,
+ gui.guiTop + PANORAMA_POS_Y,
+ PANORAMA_WIDTH,
+ PANORAMA_HEIGHT
+ )) {
+ List stuff = new ArrayList<>();
+ stuff.add(getFullMobName());
+ stuff.add("");
+ if (coins > 0)
+ stuff.add("§r§6Coins: " + coins);
+ if (xp > 0)
+ stuff.add("§r§aExperience: " + xp);
+ if (combatXp > 0)
+ stuff.add("§r§bCombat Experience: " + xp);
+ stuff.addAll(extra);
+ Utils.drawHoveringText(
+ stuff,
+ mouseX,
+ mouseY,
+ gui.width,
+ gui.height,
+ -1,
+ Minecraft.getMinecraft().fontRendererObj
+ );
+ }
+ }
+
+ @Override
+ public int[] getPageFlipPositionLeftTopCorner() {
+ return new int[]{14, 118};
+ }
+
+ @Override
+ public JsonObject serialize() {
+ JsonObject recipe = new JsonObject();
+ recipe.addProperty("level", level);
+ recipe.addProperty("coins", coins);
+ recipe.addProperty("xp", xp);
+ recipe.addProperty("combat_xp", combatXp);
+ recipe.addProperty("name", name);
+ recipe.addProperty("render", render);
+ recipe.addProperty("type", getType().getId());
+ recipe.addProperty("panorama", "unknown");
+ recipe.add("extra", JsonUtils.transformListToJsonArray(extra, JsonPrimitive::new));
+ recipe.add("drops", JsonUtils.transformListToJsonArray(drops, drop -> {
+ JsonObject dropObject = new JsonObject();
+ dropObject.addProperty("id", drop.drop.serialize());
+ dropObject.add("extra", JsonUtils.transformListToJsonArray(drop.extra, JsonPrimitive::new));
+ dropObject.addProperty("chance", drop.chance);
+ return dropObject;
+ }));
+ return recipe;
+ }
+
+ @Override
+ public ResourceLocation getBackground() {
+ return BACKGROUND;
+ }
+
+ public static MobLootRecipe parseRecipe(NEUManager manager, JsonObject recipe, JsonObject outputItemJson) {
+ List drops = new ArrayList<>();
+ for (JsonElement jsonElement : recipe.getAsJsonArray("drops")) {
+ if (jsonElement.isJsonPrimitive()) {
+ drops.add(new MobDrop(new Ingredient(manager, jsonElement.getAsString()), null, Collections.emptyList()));
+ } else {
+ JsonObject jsonObject = jsonElement.getAsJsonObject();
+ drops.add(
+ new MobDrop(
+ new Ingredient(manager, jsonObject.get("id").getAsString()),
+ jsonObject.has("chance") ? jsonObject.get("chance").getAsString() : null,
+ JsonUtils.getJsonArrayOrEmpty(jsonObject, "extra", JsonElement::getAsString)
+ ));
+ }
+ }
+
+ return new MobLootRecipe(
+ new Ingredient(manager, outputItemJson.get("internalname").getAsString(), 1),
+ drops,
+ recipe.has("level") ? recipe.get("level").getAsInt() : 0,
+ recipe.has("coins") ? recipe.get("coins").getAsInt() : 0,
+ recipe.has("xp") ? recipe.get("xp").getAsInt() : 0,
+ recipe.has("combat_xp") ? recipe.get("combat_xp").getAsInt() : 0,
+ recipe.get("name").getAsString(),
+ recipe.has("render") && !recipe.get("render").isJsonNull() ? recipe.get("render").getAsString() : null,
+ JsonUtils.getJsonArrayOrEmpty(recipe, "extra", JsonElement::getAsString),
+ recipe.has("panorama") ? recipe.get("panorama").getAsString() : "unknown"
+ );
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/recipes/NeuRecipe.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/NeuRecipe.java
index 3516f707..8202bb48 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/NeuRecipe.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/NeuRecipe.java
@@ -15,6 +15,12 @@ public interface NeuRecipe {
List getSlots();
+ RecipeType getType();
+
+ default String getTitle() {
+ return getType().getLabel();
+ }
+
default void drawExtraInfo(GuiItemRecipe gui, int mouseX, int mouseY) {
}
@@ -31,15 +37,12 @@ public interface NeuRecipe {
ResourceLocation getBackground();
static NeuRecipe parseRecipe(NEUManager manager, JsonObject recipe, JsonObject output) {
+ RecipeType recipeType = RecipeType.CRAFTING;
if (recipe.has("type")) {
- switch (recipe.get("type").getAsString().intern()) {
- case "forge":
- return ForgeRecipe.parseForgeRecipe(manager, recipe, output);
- case "trade":
- return VillagerTradeRecipe.parseStaticRecipe(manager, recipe);
- }
+ recipeType = RecipeType.getRecipeTypeForId(recipe.get("type").getAsString());
}
- return CraftingRecipe.parseCraftingRecipe(manager, recipe, output);
+ if (recipeType == null) return null;
+ return recipeType.createRecipe(manager, recipe, output);
}
default boolean shouldUseForCraftCost() {
@@ -49,4 +52,11 @@ public interface NeuRecipe {
default boolean isAvailable() {
return true;
}
+
+ /**
+ * @return an array of length two in the format [leftmost x, topmost y] of the page buttons
+ */
+ default int[] getPageFlipPositionLeftTopCorner() {
+ return new int[]{110, 90};
+ }
}
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 46aff6c4..e5028146 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeGenerator.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeGenerator.java
@@ -9,9 +9,11 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.inventory.GuiChest;
+import net.minecraft.init.Items;
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;
@@ -19,10 +21,10 @@ import net.minecraftforge.fml.common.gameevent.TickEvent;
import org.lwjgl.input.Keyboard;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
public class RecipeGenerator {
public static final String DURATION = "Duration: ";
@@ -81,7 +83,7 @@ public class RecipeGenerator {
" seconds (no QF) ."));
boolean saved = false;
try {
- saved = saveRecipe(recipe);
+ saved = saveRecipes(recipe.getOutput().getInternalItemId(), Collections.singletonList(recipe));
} catch (IOException e) {
}
if (!saved)
@@ -93,21 +95,152 @@ public class RecipeGenerator {
" Failed to save recipe. Does the item already exist?"));
}
}
+ if (saveRecipe) attemptToSaveBestiary(menu);
}
- public boolean saveRecipe(NeuRecipe recipe) throws IOException {
- JsonObject recipeJson = recipe.serialize();
- for (Ingredient i : recipe.getOutputs()) {
- if (i.isCoins()) continue;
- JsonObject outputJson = neu.manager.readJsonDefaultDir(i.getInternalItemId() + ".json");
- if (outputJson == null) return false;
- outputJson.addProperty("clickcommand", "viewrecipe");
- JsonArray array = new JsonArray();
- array.add(recipeJson);
- outputJson.add("recipes", array);
- neu.manager.writeJsonDefaultDir(outputJson, i.getInternalItemId() + ".json");
- neu.manager.loadItem(i.getInternalItemId());
+ private List getLore(ItemStack item) {
+ NBTTagList loreTag = item.getTagCompound().getCompoundTag("display").getTagList("Lore", 8);
+ List loreList = new ArrayList<>();
+ for (int i = 0; i < loreTag.tagCount(); i++) {
+ loreList.add(loreTag.getStringTagAt(i));
}
+ return loreList;
+ }
+
+ // §8[§7Lv1§8] §fZombie Villager
+ private static final Pattern MOB_DISPLAY_NAME_PATTERN = Pattern.compile("^§8\\[§7Lv(?\\d+)§8] (?.*)$");
+ // §7Coins per Kill: §61
+ // §7Combat Exp: §3120
+ // §8 ■ §7§5Skeleton Grunt Helmet §8(§a5%§8)
+ // §8 ■ §7§fRotten Flesh
+ // §8 ■ Dragon Essence §8x3-5
+ private static final Pattern LORE_PATTERN = Pattern.compile("^(?:" +
+ "§7Coins per Kill: §6(?[,\\d]+)|" +
+ "§7Combat Exp: §3(?[,\\d]+)|" +
+ "§7XP Orbs: §3(?[,\\d]+)|" +
+ "§8 ■ (?:§7)?(?(?:§.)?.+?)(?: §8\\(§a(?[\\d.<]+%)§8\\)| §8(?x.*))?|" +
+ "§7Kills: §a[,\\d]+|" +
+ "§.[a-zA-Z]+ Loot|" +
+ "§7Deaths: §a[,\\d]+|" +
+ " §8■ (?§c\\?\\?\\?)|" +
+ "" +
+ ")$");
+
+ private void attemptToSaveBestiary(IInventory menu) {
+ if (!menu.getDisplayName().getUnformattedText().contains("➜")) return;
+ ItemStack backArrow = menu.getStackInSlot(48);
+ if (backArrow == null || backArrow.getItem() != Items.arrow) return;
+ if (!getLore(backArrow).stream().anyMatch(it -> it.startsWith("§7To Bestiary ➜"))) return;
+ List recipes = new ArrayList<>();
+ String internalMobName =
+ menu.getDisplayName().getUnformattedText().split("➜")[1].toUpperCase(Locale.ROOT).trim() + "_MONSTER";
+ for (int i = 9; i < 44; i++) {
+ ItemStack mobStack = menu.getStackInSlot(i);
+ if (mobStack == null || mobStack.getItem() != Items.skull) continue;
+ Matcher matcher = MOB_DISPLAY_NAME_PATTERN.matcher(mobStack.getDisplayName());
+ if (!matcher.matches()) continue;
+ String name = matcher.group("name");
+ int level = parseIntIgnoringCommas(matcher.group("level"));
+ List mobLore = getLore(mobStack);
+ int coins = 0, xp = 0, combatXp = 0;
+ List drops = new ArrayList<>();
+ for (String loreLine : mobLore) {
+ Matcher loreMatcher = LORE_PATTERN.matcher(loreLine);
+ if (!loreMatcher.matches()) {
+ Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
+ "[WARNING] Unknown lore line: " + loreLine));
+ continue;
+ }
+ if (loreMatcher.group("coins") != null)
+ coins = parseIntIgnoringCommas(loreMatcher.group("coins"));
+ if (loreMatcher.group("combatxp") != null)
+ combatXp = parseIntIgnoringCommas(loreMatcher.group("combatxp"));
+ if (loreMatcher.group("xp") != null)
+ xp = parseIntIgnoringCommas(loreMatcher.group("xp"));
+ if (loreMatcher.group("dropName") != null) {
+ String dropName = loreMatcher.group("dropName");
+ List 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));
+ continue;
+ }
+ Ingredient item = new Ingredient(neu.manager, possibleItems.get(0).get("internalname").getAsString());
+ String chance = loreMatcher.group("dropChances") != null
+ ? loreMatcher.group("dropChances")
+ : loreMatcher.group("dropCount");
+ 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));
+
+ }
+ }
+ recipes.add(new MobLootRecipe(
+ new Ingredient(neu.manager, internalMobName, 1),
+ drops,
+ level,
+ coins,
+ xp,
+ combatXp,
+ name,
+ null,
+ new ArrayList<>(),
+ "unknown"
+ ));
+ }
+ boolean saved = false;
+ try {
+ saved = saveRecipes(internalMobName, recipes);
+ } catch (IOException e) {
+ }
+ 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
+ }
+
+ private int parseIntIgnoringCommas(String text) {
+ return Integer.parseInt(text.replace(",", ""));
+ }
+
+ /*{
+ id: "minecraft:skull",
+ Count: 1b,
+ tag: {
+ overrideMeta: 1b,
+ SkullOwner: {
+ Id: "2005daad-730b-363c-abae-e6f3830816fb",
+ Properties: {
+ textures: [{
+ Value: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTZjMGIzNmQ1M2ZmZjY5YTQ5YzdkNmYzOTMyZjJiMGZlOTQ4ZTAzMjIyNmQ1ZTgwNDVlYzU4NDA4YTM2ZTk1MSJ9fX0="
+ }]
+ }
+ },
+ display: {
+ Lore: ["§7Coins per Kill: §610", "§7Combat Exp: §340", "§7XP Orbs: §312", "", "§7Kills: §a990", "§7Deaths: §a2", "", "§fCommon Loot", "§8 ■ §7§fEnder Pearl §8x1-3", "", "§9Rare Loot", "§8 ■ §7§aEnchanted Ender Pearl §8(§a1%§8)", "", "§6Legendary Loot", "§8 ■ §7§7[Lvl 1] §aEnderman §8(§a0.02%§8)", "§8 ■ §7§7[Lvl 1] §fEnderman §8(§a0.05%§8)", "§8 ■ §7§5Ender Helmet §8(§a0.1%§8)", "§8 ■ §7§5Ender Boots §8(§a0.1%§8)", "§8 ■ §7§5Ender Leggings §8(§a0.1%§8)", "§8 ■ §7§5Ender Chestplate §8(§a0.1%§8)", "", "§dRNGesus Loot", " §8■ §c???"],
+ Name: "§8[§7Lv42§8] §fEnderman"
+ },
+ AttributeModifiers: []
+ },
+ Damage: 3s
+}*/
+ public boolean saveRecipes(String relevantItem, List recipes) throws IOException {
+ JsonObject outputJson = neu.manager.readJsonDefaultDir(relevantItem + ".json");
+ if (outputJson == null) return false;
+ outputJson.addProperty("clickcommand", "viewrecipe");
+ JsonArray array = new JsonArray();
+ for (NeuRecipe recipe : recipes) {
+ array.add(recipe.serialize());
+ }
+ outputJson.add("recipes", array);
+ neu.manager.writeJsonDefaultDir(outputJson, relevantItem + ".json");
+ neu.manager.loadItem(relevantItem);
return true;
}
@@ -149,7 +282,7 @@ public class RecipeGenerator {
);
}
- private static final Map durationSuffixLengthMap = new HashMap() {{
+ private static Map durationSuffixLengthMap = new HashMap() {{
put('d', 60 * 60 * 24);
put('h', 60 * 60);
put('m', 60);
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeType.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeType.java
new file mode 100644
index 00000000..cc8b50be
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeType.java
@@ -0,0 +1,59 @@
+package io.github.moulberry.notenoughupdates.recipes;
+
+import com.google.gson.JsonObject;
+import io.github.moulberry.notenoughupdates.NEUManager;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+
+public enum RecipeType {
+ CRAFTING("crafting", "Crafting", CraftingRecipe::parseCraftingRecipe, new ItemStack(Blocks.crafting_table)),
+ FORGE("forge", "Forging", ForgeRecipe::parseForgeRecipe, new ItemStack(Blocks.anvil)),
+ TRADE("trade", "Trading", VillagerTradeRecipe::parseStaticRecipe, new ItemStack(Items.emerald)),
+ MOB_LOOT("drops", "Mob Loot", MobLootRecipe::parseRecipe, new ItemStack(Items.diamond_sword));
+
+ private final String id;
+ private final String label;
+ private final RecipeFactory recipeFactory;
+ private final ItemStack icon;
+
+ RecipeType(String id, String label, RecipeFactory recipeFactory, ItemStack icon) {
+ this.id = id;
+ this.label = label;
+ this.recipeFactory = recipeFactory;
+ this.icon = icon;
+ icon.setStackDisplayName("neurecipe-" + id);
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public RecipeFactory getRecipeFactory() {
+ return recipeFactory;
+ }
+
+ public ItemStack getIcon() {
+ return icon;
+ }
+
+ public NeuRecipe createRecipe(NEUManager manager, JsonObject recipe, JsonObject outputItemJson) {
+ return recipeFactory.createRecipe(manager, recipe, outputItemJson);
+ }
+
+ public static RecipeType getRecipeTypeForId(String id) {
+ for (RecipeType value : values()) {
+ if (value.id.equals(id)) return value;
+ }
+ return null;
+ }
+
+ @FunctionalInterface
+ interface RecipeFactory {
+ NeuRecipe createRecipe(NEUManager manager, JsonObject recipe, JsonObject outputItemJson);
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/recipes/VillagerTradeRecipe.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/VillagerTradeRecipe.java
index 371d4f3c..2e53e153 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/VillagerTradeRecipe.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/VillagerTradeRecipe.java
@@ -21,136 +21,130 @@ import java.util.*;
public class VillagerTradeRecipe implements NeuRecipe {
- public static final int COST_SLOT_X = 51;
- public static final int COST_SLOT_Y = 34;
- public static final int RESULT_SLOT_Y = 35;
- public static final int RESULT_SLOT_X = 124;
-
- private static class Holder { // This holder object exists to defer initialization to first access
- private static final GameProfile DREAM_PROFILE =
- new GameProfile(UUID.fromString("ec70bcaf-702f-4bb8-b48d-276fa52a780c"), "Dream");
- private static final EntityLivingBase DEMO_DREAM = new AbstractClientPlayer(null, DREAM_PROFILE) {
- @Override
- protected NetworkPlayerInfo getPlayerInfo() {
- return new NetworkPlayerInfo(DREAM_PROFILE) {
- @Override
- public ResourceLocation getLocationSkin() {
- return new ResourceLocation("notenoughupdates", "dreamskin.png");
- }
- };
- }
- };
- private static final EntityLivingBase DEMO_VILLAGER = new EntityVillager(null);
-
- private static boolean isAprilFirst() {
- Calendar cal = Calendar.getInstance();
- return cal.get(Calendar.DAY_OF_MONTH) == 1 && cal.get(Calendar.MONTH) == Calendar.APRIL;
- }
-
- private static final EntityLivingBase DEMO_ENTITY = isAprilFirst() ? DEMO_DREAM : DEMO_VILLAGER;
-
- }
-
- private final static ResourceLocation BACKGROUND =
- new ResourceLocation("notenoughupdates", "textures/gui/villager_recipe.png");
-
- private final Ingredient result;
- private final Ingredient cost;
- private final int minCost, maxCost;
-
- public VillagerTradeRecipe(Ingredient result, Ingredient cost, int minCost, int maxCost) {
- this.result = result;
- this.cost = cost;
- this.minCost = minCost;
- this.maxCost = maxCost;
- }
-
- public VillagerTradeRecipe(Ingredient result, Ingredient cost) {
- this(result, cost, -1, -1);
- }
-
- public boolean hasVariableCost() {
- return minCost != -1 && maxCost != -1;
- }
-
- @Override
- public Set getIngredients() {
- return Sets.newHashSet(cost);
- }
-
- @Override
- public Set getOutputs() {
- return Sets.newHashSet(result);
- }
-
- @Override
- public List getSlots() {
- return Arrays.asList(
- new RecipeSlot(COST_SLOT_X, COST_SLOT_Y, cost.getItemStack()),
- new RecipeSlot(RESULT_SLOT_X, RESULT_SLOT_Y, result.getItemStack())
- );
- }
-
- @Override
- public boolean shouldUseForCraftCost() {
- return false;
- }
-
- @Override
- public boolean isAvailable() {
- return SBInfo.getInstance().getCurrentMode() == SBInfo.Gamemode.STRANDED ||
- NotEnoughUpdates.INSTANCE.config.hidden.dev;
- }
-
- @Override
- public void drawExtraInfo(GuiItemRecipe gui, int mouseX, int mouseY) {
- if (hasVariableCost()) {
- FontRenderer fontRenderer = Minecraft.getMinecraft().fontRendererObj;
- Utils.drawStringCenteredScaledMaxWidth(
- minCost + " - " + maxCost, fontRenderer,
- gui.guiLeft + 50, gui.guiTop + 60, false, 75, 0xff00ff
- );
-
- }
- }
-
- @Override
- public void drawExtraBackground(GuiItemRecipe gui, int mouseX, int mouseY) {
- GuiInventory.drawEntityOnScreen(
- gui.guiLeft + 90,
- gui.guiTop + 75,
- 30,
- gui.guiLeft - mouseX + 80,
- gui.guiTop + 60 - mouseY,
- Holder.DEMO_ENTITY
- );
- }
-
- @Override
- public JsonObject serialize() {
- JsonObject jsonObject = new JsonObject();
- jsonObject.addProperty("type", "trade");
- jsonObject.addProperty("result", result.serialize());
- jsonObject.addProperty("cost", cost.getInternalItemId());
- if (minCost > 0)
- jsonObject.addProperty("min", minCost);
- if (maxCost > 0)
- jsonObject.addProperty("max", maxCost);
- return jsonObject;
- }
-
- @Override
- public ResourceLocation getBackground() {
- return BACKGROUND;
- }
-
- public static VillagerTradeRecipe parseStaticRecipe(NEUManager manager, JsonObject recipe) {
- return new VillagerTradeRecipe(
- new Ingredient(manager, recipe.get("result").getAsString()),
- new Ingredient(manager, recipe.get("cost").getAsString()),
- recipe.has("min") ? recipe.get("min").getAsInt() : -1,
- recipe.has("max") ? recipe.get("max").getAsInt() : -1
- );
- }
+ public static final int COST_SLOT_X = 52;
+ public static final int COST_SLOT_Y = 66;
+ public static final int RESULT_SLOT_Y = 66;
+ public static final int RESULT_SLOT_X = 124;
+
+ private static class Holder { // This holder object exists to defer initialization to first access
+ private static final GameProfile DREAM_PROFILE = new GameProfile(UUID.fromString("ec70bcaf-702f-4bb8-b48d-276fa52a780c"), "Dream");
+ private static final EntityLivingBase DEMO_DREAM = new AbstractClientPlayer(null, DREAM_PROFILE) {
+ @Override
+ protected NetworkPlayerInfo getPlayerInfo() {
+ return new NetworkPlayerInfo(DREAM_PROFILE) {
+ @Override
+ public ResourceLocation getLocationSkin() {
+ return new ResourceLocation("notenoughupdates", "dreamskin.png");
+ }
+ };
+ }
+ };
+ private static final EntityLivingBase DEMO_VILLAGER = new EntityVillager(null);
+
+ private static boolean isAprilFirst() {
+ Calendar cal = Calendar.getInstance();
+ return cal.get(Calendar.DAY_OF_MONTH) == 1 && cal.get(Calendar.MONTH) == Calendar.APRIL;
+ }
+
+ private static final EntityLivingBase DEMO_ENTITY = isAprilFirst() ? DEMO_DREAM : DEMO_VILLAGER;
+
+ }
+
+ private final static ResourceLocation BACKGROUND = new ResourceLocation("notenoughupdates", "textures/gui/villager_recipe_tall.png");
+
+ private final Ingredient result;
+ private final Ingredient cost;
+ private final int minCost, maxCost;
+
+ public VillagerTradeRecipe(Ingredient result, Ingredient cost, int minCost, int maxCost) {
+ this.result = result;
+ this.cost = cost;
+ this.minCost = minCost;
+ this.maxCost = maxCost;
+ }
+
+ public VillagerTradeRecipe(Ingredient result, Ingredient cost) {
+ this(result, cost, -1, -1);
+ }
+
+ public boolean hasVariableCost() {
+ return minCost != -1 && maxCost != -1;
+ }
+
+ @Override
+ public RecipeType getType() {
+ return RecipeType.TRADE;
+ }
+
+ @Override
+ public Set getIngredients() {
+ return Sets.newHashSet(cost);
+ }
+
+ @Override
+ public Set getOutputs() {
+ return Sets.newHashSet(result);
+ }
+
+ @Override
+ public List getSlots() {
+ return Arrays.asList(
+ new RecipeSlot(COST_SLOT_X, COST_SLOT_Y, cost.getItemStack()),
+ new RecipeSlot(RESULT_SLOT_X, RESULT_SLOT_Y, result.getItemStack())
+ );
+ }
+
+ @Override
+ public boolean shouldUseForCraftCost() {
+ return false;
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return SBInfo.getInstance().getCurrentMode() == SBInfo.Gamemode.STRANDED || NotEnoughUpdates.INSTANCE.config.hidden.dev;
+ }
+
+ @Override
+ public void drawExtraInfo(GuiItemRecipe gui, int mouseX, int mouseY) {
+ if (hasVariableCost()) {
+ FontRenderer fontRenderer = Minecraft.getMinecraft().fontRendererObj;
+ Utils.drawStringCenteredScaledMaxWidth(
+ minCost + " - " + maxCost, fontRenderer,
+ gui.guiLeft + 50, gui.guiTop + 90, false, 75, 0xff00ff);
+
+ }
+ }
+
+ @Override
+ public void drawExtraBackground(GuiItemRecipe gui, int mouseX, int mouseY) {
+ GuiInventory.drawEntityOnScreen(gui.guiLeft + 90, gui.guiTop + 100, 30, gui.guiLeft - mouseX + 110, gui.guiTop + 60 - mouseY, Holder.DEMO_ENTITY);
+ }
+
+ @Override
+ public JsonObject serialize() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("type", "trade");
+ jsonObject.addProperty("result", result.serialize());
+ jsonObject.addProperty("cost", cost.getInternalItemId());
+ if (minCost > 0)
+ jsonObject.addProperty("min", minCost);
+ if (maxCost > 0)
+ jsonObject.addProperty("max", maxCost);
+ return jsonObject;
+ }
+
+ @Override
+ public ResourceLocation getBackground() {
+ return BACKGROUND;
+ }
+
+ public static VillagerTradeRecipe parseStaticRecipe(NEUManager manager, JsonObject recipe, JsonObject result) {
+ return new VillagerTradeRecipe(
+ new Ingredient(manager, recipe.get("result").getAsString()),
+ new Ingredient(manager, recipe.get("cost").getAsString()),
+ recipe.has("min") ? recipe.get("min").getAsInt() : -1,
+ recipe.has("max") ? recipe.get("max").getAsInt() : -1
+ );
+ }
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java
new file mode 100644
index 00000000..e3d90aaa
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java
@@ -0,0 +1,33 @@
+package io.github.moulberry.notenoughupdates.util;
+
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.nbt.NBTTagString;
+
+import java.util.List;
+
+public class ItemUtils {
+
+ public static ItemStack getCoinItemStack(int coinAmount) {
+ ItemStack itemStack = new ItemStack(Items.gold_nugget);
+ itemStack.setStackDisplayName("\u00A7r\u00A76" + Utils.formatNumberWithDots(coinAmount) + " Coins");
+ return itemStack;
+ }
+
+ public static void appendLore(ItemStack is, List moreLore) {
+ NBTTagCompound tagCompound = is.getTagCompound();
+ if (tagCompound == null) {
+ tagCompound = new NBTTagCompound();
+ }
+ NBTTagCompound display = tagCompound.getCompoundTag("display");
+ NBTTagList lore = display.getTagList("Lore", 8);
+ for (String s : moreLore) {
+ lore.appendTag(new NBTTagString(s));
+ }
+ display.setTag("Lore", lore);
+ tagCompound.setTag("display", display);
+ is.setTagCompound(tagCompound);
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/JsonUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/util/JsonUtils.java
new file mode 100644
index 00000000..916631b7
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/util/JsonUtils.java
@@ -0,0 +1,42 @@
+package io.github.moulberry.notenoughupdates.util;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+
+public class JsonUtils {
+ public static Stream getJsonArrayAsStream(JsonArray array) {
+ return StreamSupport.stream(array.spliterator(), false);
+ }
+
+ public static List transformJsonArrayToList(JsonArray array, Function super JsonElement, ? extends T> mapper) {
+ return getJsonArrayAsStream(array).map(mapper).collect(Collectors.toList());
+ }
+
+ public static List getJsonArrayOrEmpty(JsonObject rootObject, String name, Function super JsonElement, ? extends T> mapper) {
+ if (!rootObject.has(name)) {
+ return Collections.emptyList();
+ }
+ JsonElement jsonElement = rootObject.get(name);
+ if (jsonElement.isJsonArray()) {
+ return transformJsonArrayToList(jsonElement.getAsJsonArray(), mapper);
+ }
+ return Collections.emptyList();
+ }
+
+ public static JsonArray transformListToJsonArray(List things, Function super T, ? extends JsonElement> mapper) {
+ JsonArray array = new JsonArray();
+ for (T t : things) {
+ array.add(mapper.apply(t));
+ }
+ return array;
+ }
+
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/SkytilsCompat.java b/src/main/java/io/github/moulberry/notenoughupdates/util/SkytilsCompat.java
new file mode 100644
index 00000000..193f6133
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/util/SkytilsCompat.java
@@ -0,0 +1,82 @@
+package io.github.moulberry.notenoughupdates.util;
+
+import net.minecraft.item.ItemStack;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+
+public class SkytilsCompat {
+ // Defer static initialization
+ private static class Holder {
+ // Skytils is present in some capacity
+ static boolean isSkytilsPresent = false;
+ // All classes successfully loaded
+ static boolean isSkytilsFullyPresent = false;
+
+ static Class> skytilsClass = null;
+ static Method renderRarityMethod = null;
+ static Class> renderUtilClass = null;
+
+ static Object skytilsCompanionObject = null;
+
+ static Class> skytilsConfigClass = null;
+
+ static Object skytilsConfigObject = null;
+ static Method skytilsGetShowItemRarity = null;
+
+ static {
+ try {
+ skytilsClass = Class.forName("skytils.skytilsmod.Skytils");
+ isSkytilsPresent = true;
+ } catch (ClassNotFoundException ignored) {
+ }
+ try {
+ Class> skytilsCompanionClass = Class.forName("skytils.skytilsmod.Skytils$Companion");
+ skytilsConfigClass = Class.forName("skytils.skytilsmod.core.Config");
+ Field skytilsCompanionField = skytilsClass.getField("Companion");
+ skytilsCompanionObject = skytilsCompanionField.get(null);
+ Method skytilsGetConfigMethod = skytilsCompanionClass.getMethod("getConfig");
+ skytilsConfigObject = skytilsGetConfigMethod.invoke(skytilsCompanionObject);
+ skytilsGetShowItemRarity = skytilsConfigClass.getMethod("getShowItemRarity");
+ renderUtilClass = Class.forName("skytils.skytilsmod.utils.RenderUtil");
+ renderRarityMethod = renderUtilClass.getDeclaredMethod(
+ "renderRarity",
+ ItemStack.class,
+ Integer.TYPE,
+ Integer.TYPE
+ );
+ isSkytilsFullyPresent = true;
+ } catch (ClassNotFoundException | NoSuchMethodException | NoSuchFieldException | IllegalAccessException |
+ InvocationTargetException e) {
+ System.err.println("Failed to get Skytils class even tho Skytils mod is present. This is (probably) a NEU bug");
+ e.printStackTrace();
+ }
+ }
+
+ }
+
+ public static boolean isSkytilsFullyLoaded() {
+ return Holder.isSkytilsFullyPresent;
+ }
+
+ public static boolean isSkytilsPresent() {
+ return Holder.isSkytilsPresent;
+ }
+ public static void renderSkytilsRarity(ItemStack stack, int x, int y) {
+ renderSkytilsRarity(stack, x, y, false);
+ }
+
+ public static void renderSkytilsRarity(ItemStack stack, int x, int y, boolean force) {
+ if (Holder.isSkytilsFullyPresent) {
+ try {
+ if (force || (boolean) Holder.skytilsGetShowItemRarity.invoke(Holder.skytilsConfigObject))
+ Holder.renderRarityMethod.invoke(null, stack, x, y);
+ } catch (IllegalAccessException | InvocationTargetException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+}
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 31499f7f..5fac9208 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java
@@ -9,6 +9,7 @@ import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.miscfeatures.SlotLocking;
+import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.client.entity.EntityPlayerSP;
@@ -175,8 +176,13 @@ public class Utils {
}
public static void drawItemStackWithText(ItemStack stack, int x, int y, String text) {
- if (stack == null) return;
+ drawItemStackWithText(stack, x, y, text, false);
+ }
+ public static void drawItemStackWithText(ItemStack stack, int x, int y, String text, boolean skytilsRarity) {
+ if (stack == null) return;
+ if (skytilsRarity)
+ SkytilsCompat.renderSkytilsRarity(stack, x, y);
RenderItem itemRender = Minecraft.getMinecraft().getRenderItem();
disableCustomDungColours = true;
@@ -190,11 +196,13 @@ public class Utils {
}
public static void drawItemStack(ItemStack stack, int x, int y) {
- if (stack == null) return;
-
drawItemStackWithText(stack, x, y, null);
}
+ public static void drawItemStack(ItemStack stack, int x, int y, boolean skytilsRarity) {
+ drawItemStackWithText(stack, x, y, null, skytilsRarity);
+ }
+
private static final EnumChatFormatting[] rainbow = new EnumChatFormatting[]{
EnumChatFormatting.RED,
EnumChatFormatting.GOLD,
@@ -767,6 +775,9 @@ public class Utils {
public static ItemStack createItemStack(Item item, String displayname, String... lore) {
return createItemStack(item, displayname, 0, lore);
}
+ public static ItemStack createItemStack(Block item, String displayname, String... lore) {
+ return createItemStack(Item.getItemFromBlock(item), displayname, lore);
+ }
public static ItemStack createItemStack(Item item, String displayname, int damage, String... lore) {
ItemStack stack = new ItemStack(item, 1, damage);
diff --git a/src/main/resources/assets/notenoughupdates/dream.json b/src/main/resources/assets/notenoughupdates/dream.json
new file mode 100644
index 00000000..6f27e89e
--- /dev/null
+++ b/src/main/resources/assets/notenoughupdates/dream.json
@@ -0,0 +1,49 @@
+{
+ "entity": "Player",
+ "modifiers": [
+ {
+ "type": "playerdata",
+ "skin": "notenoughupdates:dreamskin.png"
+ },
+ {
+ "type": "riding",
+ "entity": "ArmorStand",
+ "modifiers": [
+ {
+ "type": "age",
+ "baby": true
+ },
+ {
+ "type": "riding",
+ "entity": "Zombie",
+ "modifiers": [
+ {
+ "type": "equipment",
+ "hand": "BOW",
+ "feet": "DIAMOND_BOOTS"
+ },
+ {
+ "type": "age",
+ "baby": true
+ },
+ {
+ "type": "riding",
+ "entity": "Sheep",
+ "modifiers": [
+ {
+ "type": "age",
+ "baby": true
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "equipment",
+ "hand": "DIAMOND_SWORD",
+ "feet": "DIAMOND_BOOTS"
+ }
+ ]
+}
diff --git a/src/main/resources/assets/notenoughupdates/textures/gui/crafting_table_tall.png b/src/main/resources/assets/notenoughupdates/textures/gui/crafting_table_tall.png
new file mode 100644
index 00000000..5a5fa825
Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/textures/gui/crafting_table_tall.png differ
diff --git a/src/main/resources/assets/notenoughupdates/textures/gui/entity_viewer.png b/src/main/resources/assets/notenoughupdates/textures/gui/entity_viewer.png
new file mode 100644
index 00000000..18085170
Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/textures/gui/entity_viewer.png differ
diff --git a/src/main/resources/assets/notenoughupdates/textures/gui/forge_recipe.png b/src/main/resources/assets/notenoughupdates/textures/gui/forge_recipe.png
deleted file mode 100644
index 2c3d2eb1..00000000
Binary files a/src/main/resources/assets/notenoughupdates/textures/gui/forge_recipe.png and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/textures/gui/forge_recipe_tall.png b/src/main/resources/assets/notenoughupdates/textures/gui/forge_recipe_tall.png
new file mode 100644
index 00000000..b07e5ca1
Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/textures/gui/forge_recipe_tall.png differ
diff --git a/src/main/resources/assets/notenoughupdates/textures/gui/mob_loot_tall.png b/src/main/resources/assets/notenoughupdates/textures/gui/mob_loot_tall.png
new file mode 100644
index 00000000..facd6d6c
Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/textures/gui/mob_loot_tall.png differ
diff --git a/src/main/resources/assets/notenoughupdates/textures/gui/tab.png b/src/main/resources/assets/notenoughupdates/textures/gui/tab.png
new file mode 100644
index 00000000..91d317ca
Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/textures/gui/tab.png differ
diff --git a/src/main/resources/assets/notenoughupdates/textures/gui/villager_recipe.png b/src/main/resources/assets/notenoughupdates/textures/gui/villager_recipe.png
deleted file mode 100644
index 42b6241c..00000000
Binary files a/src/main/resources/assets/notenoughupdates/textures/gui/villager_recipe.png and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/textures/gui/villager_recipe_tall.png b/src/main/resources/assets/notenoughupdates/textures/gui/villager_recipe_tall.png
new file mode 100644
index 00000000..ed982599
Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/textures/gui/villager_recipe_tall.png differ
diff --git a/src/main/resources/mixins.notenoughupdates.json b/src/main/resources/mixins.notenoughupdates.json
index a566ee2e..6c95e480 100644
--- a/src/main/resources/mixins.notenoughupdates.json
+++ b/src/main/resources/mixins.notenoughupdates.json
@@ -3,14 +3,18 @@
"refmap": "mixins.notenoughupdates.refmap.json",
"compatibilityLevel": "JAVA_8",
"mixins": [
+ "AccessorEntityAgeable",
+ "AccessorEntityArmorStand",
"MixinAbstractClientPlayer",
"MixinContainer",
"MixinEffectRenderer",
"MixinEntity",
"MixinEntityAgeable",
+ "MixinEntityHorse",
"MixinEntityPlayer",
"MixinEntityPlayerSP",
"MixinEntityRenderer",
+ "MixinEntitySkeleton",
"MixinGuiChest",
"MixinGuiContainer",
"MixinGuiIngame",
@@ -39,5 +43,8 @@
"MixinVboRenderList",
"MixinWorld",
"MixinWorldClient"
+ ],
+ "client": [
+ "AccessorMinecraft"
]
}
--
cgit
From 15c0c229b51eebeab59031fbda541a8c85047312 Mon Sep 17 00:00:00 2001
From: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com>
Date: Thu, 21 Apr 2022 15:52:41 +0000
Subject: fix wardrobe + blaze slayer and mining stats in pv (#115)
---
.../moulberry/notenoughupdates/NEUOverlay.java | 102 +++------------------
.../miscfeatures/PetInfoOverlay.java | 2 +-
.../options/seperateSections/CustomArmour.java | 4 +-
.../profileviewer/GuiProfileViewer.java | 29 +++++-
.../profileviewer/PlayerStats.java | 31 ++++++-
.../profileviewer/ProfileViewer.java | 19 +++-
.../resources/assets/notenoughupdates/pv_basic.png | Bin 5173 -> 2836 bytes
7 files changed, 89 insertions(+), 98 deletions(-)
(limited to 'src/main/resources')
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java
index 8d0955bb..f473a56f 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java
@@ -1871,9 +1871,7 @@ public class NEUOverlay extends Gui {
ContainerChest container = (ContainerChest) chest.inventorySlots;
IInventory lower = container.getLowerChestInventory();
String containerName = lower.getDisplayName().getUnformattedText();
- if (containerName.contains(guiName)) {
- wardrobeOpen = true;
- } else wardrobeOpen = false;
+ wardrobeOpen = containerName.contains(guiName);
}
if (guiScreen instanceof GuiInventory) {
wardrobeOpen = false;
@@ -1881,27 +1879,6 @@ public class NEUOverlay extends Gui {
return wardrobeOpen;
}
- private int wardrobePage = -1;
-
- private int getWardrobePage() {
- GuiScreen guiScreen = Minecraft.getMinecraft().currentScreen;
- if (guiScreen instanceof GuiChest) {
- if (isInNamedGui("Wardrobe")) {
- GuiChest chest = (GuiChest) Minecraft.getMinecraft().currentScreen;
- ContainerChest container = (ContainerChest) chest.inventorySlots;
- IInventory lower = container.getLowerChestInventory();
- String containerName = lower.getDisplayName().getUnformattedText();
- try {
- wardrobePage = Integer.parseInt(containerName.substring(10, 11));
- } catch (NumberFormatException e) {
- System.out.println(containerName.charAt(10));
- System.out.println("Did hypixel change the wardrobe string?");
- wardrobePage = -1;
- }
- } else wardrobePage = -1;
- }
- return wardrobePage;
- }
private ItemStack getChestSlotsAsItemStack(int slot) {
GuiScreen guiScreen = Minecraft.getMinecraft().currentScreen;
@@ -1913,61 +1890,13 @@ public class NEUOverlay extends Gui {
}
}
- private int selectedArmor = 9;
-
- private int getEquippedArmor() {
- if (isInNamedGui("Wardrobe")) {
- ItemStack nullTest1 = getChestSlotsAsItemStack(8);
- ItemStack nullTest2 = getChestSlotsAsItemStack(17);
- ItemStack nullTest3 = getChestSlotsAsItemStack(26);
- ItemStack nullTest4 = getChestSlotsAsItemStack(35);
- ItemStack nullTest5 = getChestSlotsAsItemStack(44);
- if (nullTest1 != null || nullTest2 != null || nullTest3 != null || nullTest4 != null || nullTest5 != null) {
- selectedArmor = 9;
- }
- for (int ii = 1; ii < 5; ii++) {
- if (ii == 1 || selectedArmor == 9) {
- if (getWardrobePage() == ii) {
- for (int i = 8; i < 54; i += 9) {
- ItemStack stack1 = getChestSlotsAsItemStack(i);
- if (stack1 != null) {
- String[] lore1 = NotEnoughUpdates.INSTANCE.manager.getLoreFromNBT(stack1.getTagCompound());
- for (String line : lore1) {
- //System.out.println(line);
- if (line.contains("to unequip this armor")) {
- selectedArmor = i;
- break;
- }
- }
- }
- }
- }
- }
- }
- }
- return selectedArmor;
- }
private ItemStack getWardrobeSlot(int armourSlot) {
- if (isInNamedGui("Wardrobe")) {
- if (getChestSlotsAsItemStack(getEquippedArmor() - armourSlot) != null && getEquippedArmor() != 9) {
- return getChestSlotsAsItemStack(getEquippedArmor() - armourSlot);
- } else return null;
+ if (isInNamedGui("Your Equipment")) {
+ return getChestSlotsAsItemStack(armourSlot);
} else return null;
}
- public boolean isWardrobeSystemOnMainServer() {
- JsonElement alphaWardrobeElement = Utils.getElement(Constants.DISABLE, "wardrobeFeature");
- if (alphaWardrobeElement == null || !alphaWardrobeElement.isJsonObject()) {
- return true;
- }
- JsonObject isWardrobe = alphaWardrobeElement.getAsJsonObject();
- if (isWardrobe.has("enableNewWardrob")) {
- return isWardrobe.get("enableNewWardrob").getAsBoolean();
- } else {
- return true;
- }
- }
public ItemStack slot1 = null;
public ItemStack slot2 = null;
@@ -2019,16 +1948,15 @@ public class NEUOverlay extends Gui {
if (NotEnoughUpdates.INSTANCE.config.customArmour.enableArmourHud &&
NotEnoughUpdates.INSTANCE.config.misc.hidePotionEffect
- && NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard() && isWardrobeSystemOnMainServer()) {
- if (getWardrobeSlot(1) != null) {
- slot1 = getWardrobeSlot(4);
- slot2 = getWardrobeSlot(3);
- slot3 = getWardrobeSlot(2);
- slot4 = getWardrobeSlot(1);
+ && NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard()) {
+ if (getWardrobeSlot(10) != null) {
+ slot1 = getWardrobeSlot(10);
+ slot2 = getWardrobeSlot(19);
+ slot3 = getWardrobeSlot(28);
+ slot4 = getWardrobeSlot(37);
}
if (guiScreen instanceof GuiInventory) {
renderingArmorHud = true;
- selectedArmor = 9;
List tooltipToDisplay = null;
if (NotEnoughUpdates.INSTANCE.config.customArmour.colourStyle == 0) {
@@ -2070,7 +1998,7 @@ public class NEUOverlay extends Gui {
tooltipToDisplay = Lists.newArrayList(
EnumChatFormatting.RED + "Warning",
- EnumChatFormatting.GREEN + "You need to open /wardrobe",
+ EnumChatFormatting.GREEN + "You need to open /equipment",
EnumChatFormatting.GREEN + "To cache your armour"
);
if (mouseX >= ((width - 208) / 2f) && mouseX < ((width - 208) / 2f) + 16) {
@@ -2078,9 +2006,9 @@ public class NEUOverlay extends Gui {
NotEnoughUpdates.INSTANCE.config.customArmour.sendWardrobeCommand) {
if (Minecraft.getMinecraft().thePlayer.inventory.getItemStack() == null) {
if (Mouse.getEventButtonState()) {
- if (ClientCommandHandler.instance.executeCommand(Minecraft.getMinecraft().thePlayer, "/wardrobe") ==
+ if (ClientCommandHandler.instance.executeCommand(Minecraft.getMinecraft().thePlayer, "/equipment") ==
0) {
- NotEnoughUpdates.INSTANCE.sendChatMessage("/wardrobe");
+ NotEnoughUpdates.INSTANCE.sendChatMessage("/equipment");
}
}
}
@@ -2098,9 +2026,9 @@ public class NEUOverlay extends Gui {
NotEnoughUpdates.INSTANCE.config.customArmour.sendWardrobeCommand) {
if (Minecraft.getMinecraft().thePlayer.inventory.getItemStack() == null) {
if (Mouse.getEventButtonState()) {
- if (ClientCommandHandler.instance.executeCommand(Minecraft.getMinecraft().thePlayer, "/wardrobe") ==
+ if (ClientCommandHandler.instance.executeCommand(Minecraft.getMinecraft().thePlayer, "/equipment") ==
0) {
- NotEnoughUpdates.INSTANCE.sendChatMessage("/wardrobe");
+ NotEnoughUpdates.INSTANCE.sendChatMessage("/equipment");
}
}
}
@@ -2172,7 +2100,7 @@ public class NEUOverlay extends Gui {
if (guiScreen instanceof GuiInventory) {
GL11.glTranslatef(0, 0, 401);
- if (!NotEnoughUpdates.INSTANCE.config.customArmour.enableArmourHud || !isWardrobeSystemOnMainServer()) {
+ if (!NotEnoughUpdates.INSTANCE.config.customArmour.enableArmourHud) {
if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 0) {
Minecraft.getMinecraft().getTextureManager().bindTexture(PET_DISPLAY);
}
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 281830c3..6203a36d 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java
@@ -812,7 +812,7 @@ public class PetInfoOverlay extends TextOverlay {
if (currentTime - lastPetSelect > 500) {
boolean foundDespawn = false;
for (String line : lore) {
- if (line.equals("\u00a77\u00a7cClick to despawn.")) {
+ if (line.startsWith("\u00a77\u00a7cClick to despawn")) {
config.selectedPet = petIndex;
foundDespawn = true;
break;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/CustomArmour.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/CustomArmour.java
index f1b2338f..edfd2276 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/CustomArmour.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/CustomArmour.java
@@ -17,8 +17,8 @@ public class CustomArmour {
@Expose
@ConfigOption(
- name = "Click To Open Wardrobe",
- desc = "Click on the hud to open /wardrobe"
+ name = "Click To Open equipment menu",
+ desc = "Click on the hud to open /equipment"
)
@ConfigEditorBoolean
public boolean sendWardrobeCommand = true;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java
index 691ccaae..597b6b4d 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java
@@ -7,6 +7,7 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.mojang.authlib.GameProfile;
+import io.github.moulberry.notenoughupdates.NEUOverlay;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.cosmetics.ShaderManager;
import io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField;
@@ -3325,6 +3326,10 @@ public class GuiProfileViewer extends GuiScreen {
Utils.getElementAsFloat(Utils.getElement(profileInfo, "slayer_bosses.enderman.boss_kills_tier_2"), 0);
float enderman_boss_kills_tier_3 =
Utils.getElementAsFloat(Utils.getElement(profileInfo, "slayer_bosses.enderman.boss_kills_tier_3"), 0);
+ float blaze_boss_kills_tier_2 =
+ Utils.getElementAsFloat(Utils.getElement(profileInfo, "slayer_bosses.blaze.boss_kills_tier_2"), 0);
+ float blaze_boss_kills_tier_3 =
+ Utils.getElementAsFloat(Utils.getElement(profileInfo, "slayer_bosses.blaze.boss_kills_tier_3"), 0);
Utils.renderAlignedString(
EnumChatFormatting.DARK_AQUA + "Revenant T3",
@@ -3390,6 +3395,20 @@ public class GuiProfileViewer extends GuiScreen {
guiTop + yStartBottom + yOffset * 3,
76
);
+ Utils.renderAlignedString(
+ EnumChatFormatting.DARK_AQUA + "Inferno T3",
+ EnumChatFormatting.WHITE.toString() + (int) blaze_boss_kills_tier_2,
+ guiLeft + xStart + xOffset * 2,
+ guiTop + yStartBottom + yOffset * 4,
+ 76
+ );
+ Utils.renderAlignedString(
+ EnumChatFormatting.DARK_AQUA + "Inferno T4",
+ EnumChatFormatting.WHITE.toString() + (int) blaze_boss_kills_tier_3,
+ guiLeft + xStart + xOffset * 2,
+ guiTop + yStartBottom + yOffset * 5,
+ 76
+ );
float pet_milestone_ores_mined =
Utils.getElementAsFloat(Utils.getElement(profileInfo, "stats.pet_milestone_ores_mined"), 0);
@@ -4972,7 +4991,7 @@ public class GuiProfileViewer extends GuiScreen {
Splitter splitter = Splitter.on(" ").omitEmptyStrings().limit(2);
for (int i = 0; i < PlayerStats.defaultStatNames.length; i++) {
String statName = PlayerStats.defaultStatNames[i];
- if (statName.equals("mining_fortune") || statName.equals("mining_speed")) continue;
+ //if (statName.equals("mining_fortune") || statName.equals("mining_speed")) continue;
String statNamePretty = PlayerStats.defaultStatNamesPretty[i];
int val = Math.round(stats.get(statName));
@@ -4989,7 +5008,7 @@ public class GuiProfileViewer extends GuiScreen {
statNamePretty,
EnumChatFormatting.WHITE.toString() + val,
guiLeft + 132,
- guiTop + 27 + 11f * i,
+ guiTop + 21 + 11f * i,
80
);
@@ -5038,8 +5057,8 @@ public class GuiProfileViewer extends GuiScreen {
continue;
}
- int yPosition = position % 7;
- int xPosition = position / 7;
+ int yPosition = position % 8;
+ int xPosition = position / 8;
String skillName = entry.getValue().getDisplayName();
@@ -5047,7 +5066,7 @@ public class GuiProfileViewer extends GuiScreen {
int levelFloored = (int) Math.floor(level);
int x = guiLeft + 237 + 86 * xPosition;
- int y = guiTop + 31 + 21 * yPosition;
+ int y = guiTop + 24 + 21 * yPosition;
Utils.renderAlignedString(skillName, EnumChatFormatting.WHITE.toString() + levelFloored, x + 14, y - 4, 60);
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PlayerStats.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PlayerStats.java
index 4a915111..6535a99a 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PlayerStats.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PlayerStats.java
@@ -33,6 +33,8 @@ public class PlayerStats {
public static final String SEA_CREATURE_CHANCE = "sea_creature_chance";
public static final String MAGIC_FIND = "magic_find";
public static final String PET_LUCK = "pet_luck";
+ public static final String MINING_FORTUNE = "mining_fortune";
+ public static final String MINING_SPEED = "mining_speed";
public static final String[] defaultStatNames = new String[]{
"health",
@@ -245,6 +247,23 @@ public class PlayerStats {
return 0;
}
}
+ private static float hotmFortune(JsonObject profile, JsonObject skillInfo) {
+ int miningLevelFortune =
+ (int) (4 * (float) Math.floor(Utils.getElementAsFloat(Utils.getElement(skillInfo, "level_skill_mining"), 0)));
+ int miningFortuneStat =
+ ((Utils.getElementAsInt(Utils.getElement(profile, "mining_core.nodes.mining_fortune"), 0)) * 5);
+ int miningFortune2Stat =
+ ((Utils.getElementAsInt(Utils.getElement(profile, "mining_core.nodes.mining_fortune_2"), 0)) * 5);
+ return miningFortuneStat + miningFortune2Stat + miningLevelFortune;
+ }
+
+ private static float hotmSpeed(JsonObject profile) {
+ int miningSpeedStat =
+ ((Utils.getElementAsInt(Utils.getElement(profile, "mining_core.nodes.mining_speed"), 0)) * 20);
+ int miningSpeed2Stat =
+ ((Utils.getElementAsInt(Utils.getElement(profile, "mining_core.nodes.mining_speed_2"), 0)) * 40);
+ return miningSpeedStat + miningSpeed2Stat;
+ }
public static Stats getPassiveBonuses(JsonObject skillInfo, JsonObject profile) {
Stats passiveBonuses = new Stats();
@@ -265,6 +284,15 @@ public class PlayerStats {
return passiveBonuses;
}
+ public static Stats getHOTMBonuses(JsonObject skillInfo, JsonObject profile) {
+ Stats hotmBonuses = new Stats();
+
+ hotmBonuses.addStat(MINING_FORTUNE, hotmFortune(profile, skillInfo));
+ hotmBonuses.addStat(MINING_SPEED, hotmSpeed(profile));
+
+ return hotmBonuses;
+ }
+
private static String getFullset(JsonArray armor, int ignore) {
String fullset = null;
for (int i = 0; i < armor.size(); i++) {
@@ -637,6 +665,7 @@ public class PlayerStats {
JsonArray talisman_bag = Utils.getElement(inventoryInfo, "talisman_bag").getAsJsonArray();
Stats passiveBonuses = getPassiveBonuses(skillInfo, profile);
+ Stats hotmBonuses = getHOTMBonuses(skillInfo, profile);
Stats armorBonuses = getItemBonuses(false, armor);
Stats talismanBonuses = getItemBonuses(true, inventory, talisman_bag);
@@ -651,7 +680,7 @@ public class PlayerStats {
Stats petBonus = getPetStatBonuses(petsInfo);
- stats = stats.add(passiveBonuses).add(armorBonuses).add(talismanBonuses).add(petBonus);
+ stats = stats.add(passiveBonuses).add(armorBonuses).add(talismanBonuses).add(petBonus).add(hotmBonuses);
stats.add(getSetBonuses(stats, inventoryInfo, collectionInfo, skillInfo, profile));
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 22656b1a..28cdf721 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java
@@ -70,6 +70,7 @@ public class ProfileViewer {
put("slayer_spider", Utils.createItemStack(Items.spider_eye, EnumChatFormatting.GOLD + "Tara Slayer"));
put("slayer_wolf", Utils.createItemStack(Items.bone, EnumChatFormatting.GOLD + "Sven Slayer"));
put("slayer_enderman", Utils.createItemStack(Items.ender_pearl, EnumChatFormatting.GOLD + "Ender Slayer"));
+ put("slayer_blaze", Utils.createItemStack(Items.blaze_rod, EnumChatFormatting.GOLD + "Blaze Slayer"));
}};
private static final ItemStack CAT_FARMING =
Utils.createItemStack(Items.golden_hoe, EnumChatFormatting.YELLOW + "Farming");
@@ -96,7 +97,7 @@ public class ProfileViewer {
));
put(CAT_FORAGING, Utils.createList("LOG", "LOG:1", "LOG:2", "LOG_2:1", "LOG_2", "LOG:3", null));
put(CAT_FISHING, Utils.createList("RAW_FISH", "RAW_FISH:1", "RAW_FISH:2", "RAW_FISH:3", "PRISMARINE_SHARD",
- "PRISMARINE_CRYSTALS", "CLAY_BALL", "WATER_LILY", "INK_SACK", "SPONGE"
+ "PRISMARINE_CRYSTALS", "CLAY_BALL", "WATER_LILY", "INK_SACK", "SPONGE", "MAGMA_FISH"
));
}};
@@ -110,7 +111,7 @@ public class ProfileViewer {
"MITHRIL", "HARD_STONE", null
));
put(CAT_COMBAT, Utils.createList("ZOMBIE", "SKELETON", "SPIDER", "CAVESPIDER", "CREEPER", "ENDERMAN",
- "GHAST", "SLIME", "BLAZE", "MAGMA_CUBE", "REVENANT", "TARANTULA", "VOIDLING"
+ "GHAST", "SLIME", "BLAZE", "MAGMA_CUBE", "REVENANT", "TARANTULA", "VOIDLING", "INFERNO"
));
put(CAT_FORAGING, Utils.createList("OAK", "SPRUCE", "BIRCH", "DARK_OAK", "ACACIA", "JUNGLE", "FLOWER"));
put(CAT_FISHING, Utils.createList("FISHING", null, null, null, null, null, "CLAY", null, null, null));
@@ -238,6 +239,11 @@ public class ProfileViewer {
);
put("INK_SACK", Utils.createItemStack(Items.dye, EnumChatFormatting.AQUA + "Ink Sack"));
put("SPONGE", Utils.createItemStack(Item.getItemFromBlock(Blocks.sponge), EnumChatFormatting.AQUA + "Sponge"));
+ put("MAGMA_FISH",
+ Utils.createSkull(EnumChatFormatting.AQUA + "Magmafish",
+ "5c53195c-5b98-3476-9731-c32647b22723",
+ "ewogICJ0aW1lc3RhbXAiIDogMTY0MjQ4ODA3MDY2NiwKICAicHJvZmlsZUlkIiA6ICIzNDkxZjJiOTdjMDE0MWE2OTM2YjFjMjJhMmEwMGZiNyIsCiAgInByb2ZpbGVOYW1lIiA6ICJKZXNzc3N1aGgiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjU2YjU5NTViMjk1NTIyYzk2ODk0ODE5NjBjMDFhOTkyY2ExYzc3NTRjZjRlZTMxM2M4ZGQwYzM1NmQzMzVmIgogICAgfQogIH0KfQ")
+ );
}};
private static final AtomicBoolean updatingResourceCollection = new AtomicBoolean(false);
private static JsonObject resourceCollection = null;
@@ -867,6 +873,8 @@ public class ProfileViewer {
float experience_slayer_wolf = Utils.getElementAsFloat(Utils.getElement(profileInfo, "slayer_bosses.wolf.xp"), 0);
float experience_slayer_enderman =
Utils.getElementAsFloat(Utils.getElement(profileInfo, "slayer_bosses.enderman.xp"), 0);
+ float experience_slayer_blaze =
+ Utils.getElementAsFloat(Utils.getElement(profileInfo, "slayer_bosses.blaze.xp"), 0);
float totalSkillXP = experience_skill_taming + experience_skill_mining + experience_skill_foraging
+ experience_skill_enchanting + experience_skill_carpentry + experience_skill_farming
@@ -897,6 +905,7 @@ public class ProfileViewer {
skillInfo.addProperty("experience_slayer_spider", experience_slayer_spider);
skillInfo.addProperty("experience_slayer_wolf", experience_slayer_wolf);
skillInfo.addProperty("experience_slayer_enderman", experience_slayer_enderman);
+ skillInfo.addProperty("experience_slayer_blaze", experience_slayer_blaze);
JsonArray levelingArray = Utils.getElement(leveling, "leveling_xp").getAsJsonArray();
int farmingCap = getCap(leveling, "farming") + (int) Utils.getElementAsFloat(
@@ -933,6 +942,9 @@ public class ProfileViewer {
Level level_slayer_enderman = getLevel(Utils.getElement(leveling, "slayer_xp.enderman").getAsJsonArray(),
experience_slayer_enderman, 9, true
);
+ Level level_slayer_blaze = getLevel(Utils.getElement(leveling, "slayer_xp.blaze").getAsJsonArray(),
+ experience_slayer_blaze, 9, true
+ );
skillInfo.addProperty("level_skill_taming", level_skill_taming.level);
skillInfo.addProperty("level_skill_mining", level_skill_mining.level);
@@ -951,6 +963,7 @@ public class ProfileViewer {
skillInfo.addProperty("level_slayer_spider", level_slayer_spider.level);
skillInfo.addProperty("level_slayer_wolf", level_slayer_wolf.level);
skillInfo.addProperty("level_slayer_enderman", level_slayer_enderman.level);
+ skillInfo.addProperty("level_slayer_blaze", level_slayer_blaze.level);
skillInfo.addProperty("maxed_skill_taming", level_skill_taming.maxed);
skillInfo.addProperty("maxed_skill_mining", level_skill_mining.maxed);
@@ -969,6 +982,7 @@ public class ProfileViewer {
skillInfo.addProperty("maxed_slayer_spider", level_slayer_spider.maxed);
skillInfo.addProperty("maxed_slayer_wolf", level_slayer_wolf.maxed);
skillInfo.addProperty("maxed_slayer_enderman", level_slayer_enderman.maxed);
+ skillInfo.addProperty("maxed_slayer_blaze", level_slayer_blaze.maxed);
skillInfo.addProperty("maxxp_skill_taming", level_skill_taming.maxXpForLevel);
skillInfo.addProperty("maxxp_skill_mining", level_skill_mining.maxXpForLevel);
@@ -987,6 +1001,7 @@ public class ProfileViewer {
skillInfo.addProperty("maxxp_slayer_spider", level_slayer_spider.maxXpForLevel);
skillInfo.addProperty("maxxp_slayer_wolf", level_slayer_wolf.maxXpForLevel);
skillInfo.addProperty("maxxp_slayer_enderman", level_slayer_enderman.maxXpForLevel);
+ skillInfo.addProperty("maxxp_slayer_blaze", level_slayer_blaze.maxXpForLevel);
return skillInfo;
}
diff --git a/src/main/resources/assets/notenoughupdates/pv_basic.png b/src/main/resources/assets/notenoughupdates/pv_basic.png
index 227bad5a..4d5236f5 100644
Binary files a/src/main/resources/assets/notenoughupdates/pv_basic.png and b/src/main/resources/assets/notenoughupdates/pv_basic.png differ
--
cgit
From 7243827ec602efa0d2386ab53a61472465e8555a Mon Sep 17 00:00:00 2001
From: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com>
Date: Sat, 30 Apr 2022 14:24:52 +0000
Subject: made it so "pane gui scale" doesnt effect armour/pet huds (#117)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* made it so "pane gui scale" doesnt effect armour/pet huds ( i did not know that was a feature)
this did NOT take me 20 minutes to make this commit on the right branch
* = Updated the syntax for the /sthw command, putting name after the coordinates (@My-Name-Is-Jeff)
* deez nuts
* move equipment tooltips to the left
* move tooltip when rendering
fixes some opengl shenanigans when using GlTranslate
* import static
* i think the number 27 is cooler than 21 but its needed here
* fix pet tooltip when equipment is not cached
* added master star support to the search overlay (no texture rn cos lazy)
* Added 6-10 stars to the auction search overlay
i am not using the web editor
* texture - jani
* ➓/➓ pr adding numbers to /neurename
* ➓/➓ pr adding numbers 2.1.md
* neuec support to attributes (THIS DID NOT TAKE OVER AN HOUR)
* 2.1.md 🙂
* Added flares to tools itemtab / fixed todo move option not showing / some fixes for my heart
* fix normal keybinds not working in CalendarOverlay
* 2.1.md 🙂
* cobble pro time keeper
* added MAXED_ATTRIBUTE_SHARD
* Update 2.1.md
Co-authored-by: Lulonaut
Co-authored-by: jani270
---
Update Notes/2.1.md | 7 +-
.../moulberry/notenoughupdates/NEUOverlay.java | 598 ++++++++++-----------
.../notenoughupdates/core/GuiElementTextField.java | 50 ++
.../listener/ItemTooltipListener.java | 38 +-
.../notenoughupdates/miscgui/CalendarOverlay.java | 2 +
.../notenoughupdates/miscgui/GuiEnchantColour.java | 28 +-
.../notenoughupdates/miscgui/GuiItemCustomize.java | 1 +
.../options/seperateSections/DungeonMapConfig.java | 2 +-
.../options/seperateSections/ItemOverlays.java | 2 +-
.../options/seperateSections/LocationEdit.java | 11 +-
.../options/seperateSections/Mining.java | 2 +-
.../options/seperateSections/PetOverlay.java | 2 +-
.../options/seperateSections/Toolbar.java | 2 +-
.../overlays/AuctionSearchOverlay.java | 43 +-
.../notenoughupdates/overlays/TimersOverlay.java | 2 +-
.../profileviewer/GuiProfileViewer.java | 2 +-
.../notenoughupdates/auc_search/master_star.png | Bin 0 -> 761 bytes
.../notenoughupdates/auc_search/star_board.png | Bin 4352 -> 639 bytes
18 files changed, 452 insertions(+), 340 deletions(-)
create mode 100644 src/main/resources/assets/notenoughupdates/auc_search/master_star.png
(limited to 'src/main/resources')
diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md
index aa8cd3f2..935ca4f1 100644
--- a/Update Notes/2.1.md
+++ b/Update Notes/2.1.md
@@ -49,7 +49,7 @@
- Added an option to turn off showing next click in chronomatron
- Turns off inv search mode after 2 minutes
- Made /neustats modlist show normal /neustats if under 15 mods
-- Added max enchant book to /neuec - Dokm
+- Added max enchant book and max attribute shard to /neuec - Dokm
- [Added bingo and Stranded profile icons to /pv](https://cdn.discordapp.com/attachments/832652653292027904/915844465372065842/unknown.png)
- Added an icon if neu doesn't know about a gamemode in /pv
- Fixed pet overlay not resetting pet when making new profile
@@ -80,6 +80,9 @@
- Added optional radius argument for neupackdev subcommands. - whalker
- Added tab completion to /neupackdev subcommands. - whalker
- Made it if you hold shift in the enchant solvers it overrides prevent missclicks
+- Added 6-10 stars to the auction search overlay
+- Added 6-10 stars to /neucustomize
+- Added support for attributes in neuec
- Added Heavy Pearls to todo overlay - cobble8
### **Bug Fixes:**
- Fix wiki pages freezing the entire game - nea89
@@ -108,7 +111,7 @@
- Added checks for chat messages for dungeon win overlay
- Fixed minion tiers crafted by coop members not showing up in /pv - Lulonaut
- Fixed crash in /pv when the player had a pet that is not saved in the repo - Lulonaut
-- Made it so you can close /et with your inventory keybind
+- Fixed some vanilla Minecraft keybinds not working in NEU GUIs
### **Other:**
- New icons was added in storage_icons.png
- Moved the help icon in /neucustomize over a little
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java
index f473a56f..d3efc06a 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java
@@ -1,63 +1,9 @@
package io.github.moulberry.notenoughupdates;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.ascending_overlay;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.close;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.descending_overlay;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.help;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.itemPaneTabArrow;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.item_haschild;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.item_mask;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.order_alphabetical;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.order_alphabetical_active;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.order_rarity;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.order_rarity_active;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.order_value;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.order_value_active;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.quickcommand_background;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.rightarrow;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.rightarrow_overlay;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.settings;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_accessory;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_accessory_active;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_all;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_all_active;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_armor;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_armor_active;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_mob;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_mob_active;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_pet;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_pet_active;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_tool;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_tool_active;
-
-import java.awt.Color;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.UUID;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
-
import com.google.common.collect.Lists;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
-import org.lwjgl.input.Keyboard;
-import org.lwjgl.input.Mouse;
-import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL14;
-import org.lwjgl.util.vector.Vector2f;
import io.github.moulberry.notenoughupdates.auction.CustomAHGui;
import io.github.moulberry.notenoughupdates.core.BackgroundBlur;
import io.github.moulberry.notenoughupdates.core.GuiScreenElementWrapper;
@@ -75,6 +21,7 @@ import io.github.moulberry.notenoughupdates.miscfeatures.SunTzu;
import io.github.moulberry.notenoughupdates.miscgui.GuiPriceGraph;
import io.github.moulberry.notenoughupdates.options.NEUConfigEditor;
import io.github.moulberry.notenoughupdates.util.Constants;
+import io.github.moulberry.notenoughupdates.util.GuiTextures;
import io.github.moulberry.notenoughupdates.util.LerpingFloat;
import io.github.moulberry.notenoughupdates.util.NotificationHandler;
import io.github.moulberry.notenoughupdates.util.SpecialColour;
@@ -115,6 +62,30 @@ import net.minecraft.util.Matrix4f;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.client.ClientCommandHandler;
+import org.lwjgl.input.Keyboard;
+import org.lwjgl.input.Mouse;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL14;
+import org.lwjgl.util.vector.Vector2f;
+
+import java.awt.*;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
public class NEUOverlay extends Gui {
private static final ResourceLocation SUPERGEHEIMNISVERMOGEN = new ResourceLocation(
@@ -170,17 +141,27 @@ public class NEUOverlay extends Gui {
private final String petRegex = ".*?;[0-5]$";
private final ResourceLocation[] sortIcons = new ResourceLocation[]{
- sort_all, sort_mob, sort_pet, sort_tool, sort_armor, sort_accessory
+ GuiTextures.sort_all,
+ GuiTextures.sort_mob,
+ GuiTextures.sort_pet,
+ GuiTextures.sort_tool,
+ GuiTextures.sort_armor,
+ GuiTextures.sort_accessory
};
private final ResourceLocation[] sortIconsActive = new ResourceLocation[]{
- sort_all_active, sort_mob_active, sort_pet_active, sort_tool_active, sort_armor_active, sort_accessory_active
+ GuiTextures.sort_all_active,
+ GuiTextures.sort_mob_active,
+ GuiTextures.sort_pet_active,
+ GuiTextures.sort_tool_active,
+ GuiTextures.sort_armor_active,
+ GuiTextures.sort_accessory_active
};
private final ResourceLocation[] orderIcons = new ResourceLocation[]{
- order_alphabetical, order_rarity, order_value
+ GuiTextures.order_alphabetical, GuiTextures.order_rarity, GuiTextures.order_value
};
private final ResourceLocation[] orderIconsActive = new ResourceLocation[]{
- order_alphabetical_active, order_rarity_active, order_value_active
+ GuiTextures.order_alphabetical_active, GuiTextures.order_rarity_active, GuiTextures.order_value_active
};
//Various constants used for GUI structure
@@ -449,13 +430,13 @@ public class NEUOverlay extends Gui {
if (!NotEnoughUpdates.INSTANCE.config.toolbar.enableSettingsButton) {
return;
}
- Minecraft.getMinecraft().getTextureManager().bindTexture(quickcommand_background);
+ Minecraft.getMinecraft().getTextureManager().bindTexture(GuiTextures.quickcommand_background);
GlStateManager.color(1, 1, 1, 1);
Utils.drawTexturedRect(x, y,
searchYSize + paddingUnscaled * 2, searchYSize + paddingUnscaled * 2, GL11.GL_NEAREST
);
- Minecraft.getMinecraft().getTextureManager().bindTexture(settings);
+ Minecraft.getMinecraft().getTextureManager().bindTexture(GuiTextures.settings);
GlStateManager.color(1f, 1f, 1f, 1f);
Utils.drawTexturedRect((int) x + paddingUnscaled, (int) y + paddingUnscaled,
searchYSize, searchYSize
@@ -507,13 +488,13 @@ public class NEUOverlay extends Gui {
return;
}
- Minecraft.getMinecraft().getTextureManager().bindTexture(quickcommand_background);
+ Minecraft.getMinecraft().getTextureManager().bindTexture(GuiTextures.quickcommand_background);
GlStateManager.color(1, 1, 1, 1);
Utils.drawTexturedRect(x, y,
searchYSize + paddingUnscaled * 2, searchYSize + paddingUnscaled * 2, GL11.GL_NEAREST
);
- Minecraft.getMinecraft().getTextureManager().bindTexture(help);
+ Minecraft.getMinecraft().getTextureManager().bindTexture(GuiTextures.help);
GlStateManager.color(1f, 1f, 1f, 1f);
Utils.drawTexturedRect((int) x + paddingUnscaled, (int) y + paddingUnscaled,
getSearchBarYSize(), getSearchBarYSize()
@@ -609,7 +590,7 @@ public class NEUOverlay extends Gui {
tag.setString("qc_id", quickCommandStrSplit[0].toLowerCase().trim());
render.setTagCompound(tag);
- Minecraft.getMinecraft().getTextureManager().bindTexture(quickcommand_background);
+ Minecraft.getMinecraft().getTextureManager().bindTexture(GuiTextures.quickcommand_background);
GlStateManager.color(1, 1, 1, 1);
Utils.drawTexturedRect(x, y,
bigItemSize + paddingUnscaled * 2, bigItemSize + paddingUnscaled * 2, GL11.GL_NEAREST
@@ -1378,7 +1359,8 @@ public class NEUOverlay extends Gui {
"DUNGEON BOW",
"DRILL",
"GAUNTLET",
- "LONGSWORD"
+ "LONGSWORD",
+ "DEPLOYABLE"
) >= 0;
} else if (getSortMode() == SORT_MODE_ARMOR) {
return checkItemType(
@@ -1679,12 +1661,12 @@ public class NEUOverlay extends Gui {
drawRect(leftSide - 1, top, leftSide - 1 + buttonXSize, top + ySize, fg.getRGB());
GlStateManager.color(1f, 1f, 1f, 1f);
- Minecraft.getMinecraft().getTextureManager().bindTexture(rightarrow);
+ Minecraft.getMinecraft().getTextureManager().bindTexture(GuiTextures.rightarrow);
Utils.drawTexturedRect(leftSide - 1 + leftPressed,
top + leftPressed,
buttonXSize, ySize, 1, 0, 0, 1
);
- Minecraft.getMinecraft().getTextureManager().bindTexture(rightarrow_overlay);
+ Minecraft.getMinecraft().getTextureManager().bindTexture(GuiTextures.rightarrow_overlay);
Utils.drawTexturedRect(leftSide - 1,
top,
buttonXSize, ySize, 1 - leftPressed, leftPressed, 1 - leftPressed, leftPressed
@@ -1698,12 +1680,12 @@ public class NEUOverlay extends Gui {
drawRect(rightSide + 1 - buttonXSize, top, rightSide + 1, top + ySize, fg.getRGB());
GlStateManager.color(1f, 1f, 1f, 1f);
- Minecraft.getMinecraft().getTextureManager().bindTexture(rightarrow);
+ Minecraft.getMinecraft().getTextureManager().bindTexture(GuiTextures.rightarrow);
Utils.drawTexturedRect(rightSide + 1 - buttonXSize + rightPressed,
top + rightPressed,
buttonXSize, ySize
);
- Minecraft.getMinecraft().getTextureManager().bindTexture(rightarrow_overlay);
+ Minecraft.getMinecraft().getTextureManager().bindTexture(GuiTextures.rightarrow_overlay);
Utils.drawTexturedRect(rightSide + 1 - buttonXSize,
top,
buttonXSize, ySize, 1 - rightPressed, rightPressed, 1 - rightPressed, rightPressed
@@ -1879,7 +1861,6 @@ public class NEUOverlay extends Gui {
return wardrobeOpen;
}
-
private ItemStack getChestSlotsAsItemStack(int slot) {
GuiScreen guiScreen = Minecraft.getMinecraft().currentScreen;
if (guiScreen instanceof GuiChest) {
@@ -1890,14 +1871,12 @@ public class NEUOverlay extends Gui {
}
}
-
private ItemStack getWardrobeSlot(int armourSlot) {
if (isInNamedGui("Your Equipment")) {
- return getChestSlotsAsItemStack(armourSlot);
+ return getChestSlotsAsItemStack(armourSlot);
} else return null;
}
-
public ItemStack slot1 = null;
public ItemStack slot2 = null;
public ItemStack slot3 = null;
@@ -1944,228 +1923,6 @@ public class NEUOverlay extends Gui {
Utils.drawTexturedRect((width - 64) / 2f, (height - 64) / 2f - 114, 64, 64, GL11.GL_LINEAR);
GlStateManager.bindTexture(0);
}
- GuiScreen guiScreen = Minecraft.getMinecraft().currentScreen;
-
- if (NotEnoughUpdates.INSTANCE.config.customArmour.enableArmourHud &&
- NotEnoughUpdates.INSTANCE.config.misc.hidePotionEffect
- && NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard()) {
- if (getWardrobeSlot(10) != null) {
- slot1 = getWardrobeSlot(10);
- slot2 = getWardrobeSlot(19);
- slot3 = getWardrobeSlot(28);
- slot4 = getWardrobeSlot(37);
- }
- if (guiScreen instanceof GuiInventory) {
- renderingArmorHud = true;
-
- List tooltipToDisplay = null;
- if (NotEnoughUpdates.INSTANCE.config.customArmour.colourStyle == 0) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(ARMOR_DISPLAY);
- }
- if (NotEnoughUpdates.INSTANCE.config.customArmour.colourStyle == 1) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(ARMOR_DISPLAY_GREY);
- }
- if (NotEnoughUpdates.INSTANCE.config.customArmour.colourStyle == 2) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(ARMOR_DISPLAY_DARK);
- }
- if (NotEnoughUpdates.INSTANCE.config.customArmour.colourStyle == 3) {
- if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 3 &&
- NotEnoughUpdates.INSTANCE.config.petOverlay.petInvDisplay && petSlot != null) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(ARMOR_DISPLAY_TRANSPARENT_PET);
- } else {
- Minecraft.getMinecraft().getTextureManager().bindTexture(ARMOR_DISPLAY_TRANSPARENT);
- }
- }
- if (NotEnoughUpdates.INSTANCE.config.customArmour.colourStyle == 4) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(ARMOR_DISPLAY_FSR);
- }
-
- GlStateManager.color(1, 1, 1, 1);
- GL11.glTranslatef(0, 0, 401);
- float yNumber = (float) (height - 167) / 2f;
- Utils.drawTexturedRect((float) ((width - 224.1) / 2f), yNumber, 31, 86, GL11.GL_NEAREST);
- GlStateManager.bindTexture(0);
-
- Utils.drawItemStack(slot1, (int) ((width - 208) / 2f), (int) ((height + 60) / 2f - 105));
- Utils.drawItemStack(slot2, (int) ((width - 208) / 2f), (int) ((height + 60) / 2f - 105) + 18);
- Utils.drawItemStack(slot3, (int) ((width - 208) / 2f), (int) ((height + 60) / 2f - 105) + 36);
- Utils.drawItemStack(slot4, (int) ((width - 208) / 2f), (int) ((height + 60) / 2f - 105) + 54);
- if (slot1 == null) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(QUESTION_MARK);
- GlStateManager.color(1, 1, 1, 1);
- Utils.drawTexturedRect(((width - 208) / 2f), ((height + 60) / 2f - 105), 16, 16, GL11.GL_NEAREST);
- GlStateManager.bindTexture(0);
-
- tooltipToDisplay = Lists.newArrayList(
- EnumChatFormatting.RED + "Warning",
- EnumChatFormatting.GREEN + "You need to open /equipment",
- EnumChatFormatting.GREEN + "To cache your armour"
- );
- if (mouseX >= ((width - 208) / 2f) && mouseX < ((width - 208) / 2f) + 16) {
- if (mouseY >= ((height + 60) / 2f - 105) && mouseY <= ((height + 60) / 2f - 105) + 70 &&
- NotEnoughUpdates.INSTANCE.config.customArmour.sendWardrobeCommand) {
- if (Minecraft.getMinecraft().thePlayer.inventory.getItemStack() == null) {
- if (Mouse.getEventButtonState()) {
- if (ClientCommandHandler.instance.executeCommand(Minecraft.getMinecraft().thePlayer, "/equipment") ==
- 0) {
- NotEnoughUpdates.INSTANCE.sendChatMessage("/equipment");
- }
- }
- }
- }
- if (mouseY >= ((height + 60) / 2f - 105) && mouseY <= ((height + 60) / 2f - 105) + 16) {
- Utils.drawHoveringText(tooltipToDisplay, mouseX, mouseY, width, height, -1, fr);
- GL11.glTranslatef(0, 0, -401);
- }
- }
-
- }
- if (slot1 != null && slot2 != null && slot3 != null && slot4 != null) {
- if (mouseX >= ((width - 208) / 2f) && mouseX < ((width - 208) / 2f) + 16) {
- if (mouseY >= ((height + 60) / 2f - 105) && mouseY <= ((height + 60) / 2f - 105) + 70 &&
- NotEnoughUpdates.INSTANCE.config.customArmour.sendWardrobeCommand) {
- if (Minecraft.getMinecraft().thePlayer.inventory.getItemStack() == null) {
- if (Mouse.getEventButtonState()) {
- if (ClientCommandHandler.instance.executeCommand(Minecraft.getMinecraft().thePlayer, "/equipment") ==
- 0) {
- NotEnoughUpdates.INSTANCE.sendChatMessage("/equipment");
- }
- }
- }
- }
- //top slot
- if (mouseY >= ((height + 60) / 2f - 105) && mouseY <= ((height + 60) / 2f - 105) + 16) {
- tooltipToDisplay = slot1.getTooltip(Minecraft.getMinecraft().thePlayer, false);
- Utils.drawHoveringText(tooltipToDisplay, mouseX, mouseY, width, height, -1, fr);
- tooltipToDisplay = null;
- GL11.glTranslatef(0, 0, -401);
- }
- if (mouseY >= ((height + 60) / 2f - 105) + 18 && mouseY <= ((height + 60) / 2f - 105) + 34) {
- tooltipToDisplay = slot2.getTooltip(Minecraft.getMinecraft().thePlayer, false);
- Utils.drawHoveringText(tooltipToDisplay, mouseX, mouseY, width, height, -1, fr);
- tooltipToDisplay = null;
- GL11.glTranslatef(0, 0, -401);
- }
- if (mouseY >= ((height + 60) / 2f - 105) + 36 && mouseY <= ((height + 60) / 2f - 105) + 52) {
- tooltipToDisplay = slot3.getTooltip(Minecraft.getMinecraft().thePlayer, false);
- Utils.drawHoveringText(tooltipToDisplay, mouseX, mouseY, width, height, -1, fr);
- tooltipToDisplay = null;
- GL11.glTranslatef(0, 0, -401);
- }
- if (mouseY >= ((height + 60) / 2f - 105) + 54 && mouseY <= ((height + 60) / 2f - 105) + 70) {
- tooltipToDisplay = slot4.getTooltip(Minecraft.getMinecraft().thePlayer, false);
- Utils.drawHoveringText(tooltipToDisplay, mouseX, mouseY, width, height, -1, fr);
- tooltipToDisplay = null;
- GL11.glTranslatef(0, 0, -401);
- }
- }
- GL11.glTranslatef(0, 0, -401);
- }
- }
- }
- if (PetInfoOverlay.getCurrentPet() != null) {
- if (NotEnoughUpdates.INSTANCE.config.petOverlay.petInvDisplay
- && (NotEnoughUpdates.INSTANCE.manager
- .jsonToStack(NotEnoughUpdates.INSTANCE.manager
- .getItemInformation()
- .get(PetInfoOverlay.getCurrentPet().petType + ";" + PetInfoOverlay.getCurrentPet().rarity.petId))
- .hasDisplayName()
- || NotEnoughUpdates.INSTANCE.manager
- .jsonToStack(NotEnoughUpdates.INSTANCE.manager
- .getItemInformation()
- .get(PetInfoOverlay.getCurrentPet().petType + ";" + (PetInfoOverlay.getCurrentPet().rarity.petId - 1)))
- .hasDisplayName())
- && NotEnoughUpdates.INSTANCE.config.misc.hidePotionEffect &&
- NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard()) {
- if (!NotEnoughUpdates.INSTANCE.manager
- .jsonToStack(
- NotEnoughUpdates.INSTANCE.manager
- .getItemInformation()
- .get(PetInfoOverlay.getCurrentPet().petType + ";" + PetInfoOverlay.getCurrentPet().rarity.petId))
- .hasDisplayName()) {
- petSlot = NotEnoughUpdates.INSTANCE.manager.jsonToStack(
- NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(
- PetInfoOverlay.getCurrentPet().petType + ";" + (PetInfoOverlay.getCurrentPet().rarity.petId - 1)));
- } else {
- petSlot = NotEnoughUpdates.INSTANCE.manager.jsonToStack(
- NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(
- PetInfoOverlay.getCurrentPet().petType + ";" + PetInfoOverlay.getCurrentPet().rarity.petId));
- }
- petSlot.getTagCompound().setBoolean("NEUPETINVDISPLAY", true);
- petSlot.getTagCompound().setBoolean(
- "NEUHIDEPETTOOLTIP",
- NotEnoughUpdates.INSTANCE.config.petOverlay.hidePetTooltip
- );
- ItemStack petInfo = petSlot;
-
- if (guiScreen instanceof GuiInventory) {
- GL11.glTranslatef(0, 0, 401);
- if (!NotEnoughUpdates.INSTANCE.config.customArmour.enableArmourHud) {
- if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 0) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(PET_DISPLAY);
- }
- if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 1) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(PET_DISPLAY_GREY);
- }
- if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 2) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(PET_DISPLAY_DARK);
- }
- if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 3) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(PET_DISPLAY_TRANSPARENT);
- }
- if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 4) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(PET_DISPLAY_FSR);
- }
- } else {
- if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 0) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(PET_ARMOR_DISPLAY);
- }
- if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 1) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(PET_ARMOR_DISPLAY_GREY);
- }
- if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 2) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(PET_ARMOR_DISPLAY_DARK);
- }
- if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 3) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(PET_ARMOR_DISPLAY_TRANSPARENT);
- }
- if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 4) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(PET_ARMOR_DISPLAY_FSR);
- }
- }
-
- GlStateManager.color(1, 1, 1, 1);
- float yNumber = (float) (height - 23) / 2f;
- Utils.drawTexturedRect((float) ((width - 224.1) / 2f), yNumber, 31, 32, GL11.GL_NEAREST);
- GlStateManager.bindTexture(0);
-
- Utils.drawItemStack(petInfo, (int) ((width - 208) / 2f), (int) ((height + 60) / 2f - 105) + 72);
- renderingPetHud = true;
-
- List tooltipToDisplay = null;
- if (petInfo != null) {
- if (mouseX >= ((width - 208) / 2f) && mouseX < ((width - 208) / 2f) + 16) {
- if (mouseY >= ((height + 60) / 2f - 105) + 72 && mouseY <= ((height + 60) / 2f - 105) + 88 &&
- NotEnoughUpdates.INSTANCE.config.petOverlay.sendPetsCommand) {
- if (Minecraft.getMinecraft().thePlayer.inventory.getItemStack() == null) {
- if (Mouse.getEventButtonState()) {
- if (ClientCommandHandler.instance.executeCommand(Minecraft.getMinecraft().thePlayer, "/pets") ==
- 0) {
- NotEnoughUpdates.INSTANCE.sendChatMessage("/pets");
- }
- }
- }
- tooltipToDisplay = petInfo.getTooltip(Minecraft.getMinecraft().thePlayer, false);
- Utils.drawHoveringText(tooltipToDisplay, mouseX, mouseY, width, height, -1, fr);
- tooltipToDisplay = null;
- GL11.glTranslatef(0, 0, -80);
- }
- }
-
- }
- }
- }
- }
SunTzu.setEnabled(textField.getText().toLowerCase().startsWith("potato"));
@@ -2239,7 +1996,7 @@ public class NEUOverlay extends Gui {
//Tab
if (NotEnoughUpdates.INSTANCE.config.itemlist.tabOpen) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(itemPaneTabArrow);
+ Minecraft.getMinecraft().getTextureManager().bindTexture(GuiTextures.itemPaneTabArrow);
GlStateManager.color(1f, 1f, 1f, 0.3f);
Utils.drawTexturedRect(width - itemPaneTabOffset.getValue() * 64 / 20f, height / 2f - 32, 64, 64);
GlStateManager.bindTexture(0);
@@ -2301,8 +2058,8 @@ public class NEUOverlay extends Gui {
Utils.drawTexturedRect(orderIconX, iconTop, scaledITEM_SIZE, scaledITEM_SIZE, 0, 1, 0, 1, GL11.GL_NEAREST);
Minecraft.getMinecraft().getTextureManager().bindTexture(getCompareAscending().get(i)
- ? ascending_overlay
- : descending_overlay);
+ ? GuiTextures.ascending_overlay
+ : GuiTextures.descending_overlay);
GlStateManager.color(1f, 1f, 1f, 1f);
Utils.drawTexturedRect(orderIconX, iconTop, scaledITEM_SIZE, scaledITEM_SIZE, 0, 1, 0, 1, GL11.GL_NEAREST);
GlStateManager.bindTexture(0);
@@ -2486,7 +2243,7 @@ public class NEUOverlay extends Gui {
activeInfoPane.render(width, height, bg, fg, Utils.peekGuiScale(), mouseX, mouseY);
GlStateManager.color(1f, 1f, 1f, 1f);
- Minecraft.getMinecraft().getTextureManager().bindTexture(close);
+ Minecraft.getMinecraft().getTextureManager().bindTexture(GuiTextures.close);
Utils.drawTexturedRect(rightSide - getBoxPadding() - 8, getBoxPadding() - 8, 16, 16);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
@@ -2532,7 +2289,7 @@ public class NEUOverlay extends Gui {
GlStateManager.enableAlpha();
GlStateManager.alphaFunc(516, 0.1F);
GlStateManager.disableLighting();
-
+ renderInfoHuds();
Utils.pushGuiScale(-1);
if (System.currentTimeMillis() - lastSearchMode > 120000 &&
@@ -2542,6 +2299,245 @@ public class NEUOverlay extends Gui {
}
}
+ void renderInfoHuds() {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+
+ Utils.resetGuiScale();
+ Utils.pushGuiScale(Minecraft.getMinecraft().gameSettings.guiScale);
+
+ int width = Utils.peekGuiScale().getScaledWidth();
+ int height = Utils.peekGuiScale().getScaledHeight();
+ int mouseX = Mouse.getX() * width / Minecraft.getMinecraft().displayWidth;
+ int mouseY = height - Mouse.getY() * height / Minecraft.getMinecraft().displayHeight - 1;
+ GuiScreen guiScreen = Minecraft.getMinecraft().currentScreen;
+
+ if (NotEnoughUpdates.INSTANCE.config.customArmour.enableArmourHud &&
+ NotEnoughUpdates.INSTANCE.config.misc.hidePotionEffect
+ && NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard()) {
+ if (getWardrobeSlot(10) != null) {
+ slot1 = getWardrobeSlot(10);
+ slot2 = getWardrobeSlot(19);
+ slot3 = getWardrobeSlot(28);
+ slot4 = getWardrobeSlot(37);
+ }
+ if (guiScreen instanceof GuiInventory) {
+ renderingArmorHud = true;
+
+ List tooltipToDisplay = null;
+ if (NotEnoughUpdates.INSTANCE.config.customArmour.colourStyle == 0) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(ARMOR_DISPLAY);
+ }
+ if (NotEnoughUpdates.INSTANCE.config.customArmour.colourStyle == 1) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(ARMOR_DISPLAY_GREY);
+ }
+ if (NotEnoughUpdates.INSTANCE.config.customArmour.colourStyle == 2) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(ARMOR_DISPLAY_DARK);
+ }
+ if (NotEnoughUpdates.INSTANCE.config.customArmour.colourStyle == 3) {
+ if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 3 &&
+ NotEnoughUpdates.INSTANCE.config.petOverlay.petInvDisplay && petSlot != null) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(ARMOR_DISPLAY_TRANSPARENT_PET);
+ } else {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(ARMOR_DISPLAY_TRANSPARENT);
+ }
+ }
+ if (NotEnoughUpdates.INSTANCE.config.customArmour.colourStyle == 4) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(ARMOR_DISPLAY_FSR);
+ }
+
+ GlStateManager.color(1, 1, 1, 1);
+ GL11.glTranslatef(0, 0, 401);
+ float yNumber = (float) (height - 167) / 2f;
+ Utils.drawTexturedRect((float) ((width - 224.1) / 2f), yNumber, 31, 86, GL11.GL_NEAREST);
+ GlStateManager.bindTexture(0);
+
+ Utils.drawItemStack(slot1, (int) ((width - 208) / 2f), (int) ((height + 60) / 2f - 105));
+ Utils.drawItemStack(slot2, (int) ((width - 208) / 2f), (int) ((height + 60) / 2f - 105) + 18);
+ Utils.drawItemStack(slot3, (int) ((width - 208) / 2f), (int) ((height + 60) / 2f - 105) + 36);
+ Utils.drawItemStack(slot4, (int) ((width - 208) / 2f), (int) ((height + 60) / 2f - 105) + 54);
+ if (slot1 == null) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(QUESTION_MARK);
+ GlStateManager.color(1, 1, 1, 1);
+ Utils.drawTexturedRect(((width - 208) / 2f), ((height + 60) / 2f - 105), 16, 16, GL11.GL_NEAREST);
+ GlStateManager.bindTexture(0);
+
+ tooltipToDisplay = Lists.newArrayList(
+ EnumChatFormatting.RED + "Warning",
+ EnumChatFormatting.GREEN + "You need to open /equipment",
+ EnumChatFormatting.GREEN + "To cache your armour"
+ );
+ if (mouseX >= ((width - 208) / 2f) && mouseX < ((width - 208) / 2f) + 16) {
+ if (mouseY >= ((height + 60) / 2f - 105) && mouseY <= ((height + 60) / 2f - 105) + 70 &&
+ NotEnoughUpdates.INSTANCE.config.customArmour.sendWardrobeCommand) {
+ if (Minecraft.getMinecraft().thePlayer.inventory.getItemStack() == null) {
+ if (Mouse.getEventButtonState()) {
+ if (ClientCommandHandler.instance.executeCommand(Minecraft.getMinecraft().thePlayer, "/equipment") ==
+ 0) {
+ NotEnoughUpdates.INSTANCE.sendChatMessage("/equipment");
+ }
+ }
+ }
+ }
+ if (mouseY >= ((height + 60) / 2f - 105) && mouseY <= ((height + 60) / 2f - 105) + 16) {
+ Utils.drawHoveringText(tooltipToDisplay, mouseX, mouseY, width, height, -1, fr);
+ }
+ }
+ GL11.glTranslatef(0, 0, -401);
+ }
+ if (slot1 != null && slot2 != null && slot3 != null && slot4 != null) {
+ if (mouseX >= ((width - 208) / 2f) && mouseX < ((width - 208) / 2f) + 16) {
+ if (mouseY >= ((height + 60) / 2f - 105) && mouseY <= ((height + 60) / 2f - 105) + 70 &&
+ NotEnoughUpdates.INSTANCE.config.customArmour.sendWardrobeCommand) {
+ if (Minecraft.getMinecraft().thePlayer.inventory.getItemStack() == null) {
+ if (Mouse.getEventButtonState()) {
+ if (ClientCommandHandler.instance.executeCommand(Minecraft.getMinecraft().thePlayer, "/equipment") ==
+ 0) {
+ NotEnoughUpdates.INSTANCE.sendChatMessage("/equipment");
+ }
+ }
+ }
+ }
+ //top slot
+ int tooltipXModifier = -175;
+ if (mouseY >= ((height + 60) / 2f - 105) && mouseY <= ((height + 60) / 2f - 105) + 16) {
+ tooltipToDisplay = slot1.getTooltip(Minecraft.getMinecraft().thePlayer, false);
+ if (shouldShowEquipmentTooltip(tooltipToDisplay)) {
+ Utils.drawHoveringText(tooltipToDisplay, mouseX + tooltipXModifier, mouseY, width, height, -1, fr);
+ }
+ }
+ if (mouseY >= ((height + 60) / 2f - 105) + 18 && mouseY <= ((height + 60) / 2f - 105) + 34) {
+ tooltipToDisplay = slot2.getTooltip(Minecraft.getMinecraft().thePlayer, false);
+ if (shouldShowEquipmentTooltip(tooltipToDisplay)) {
+ Utils.drawHoveringText(tooltipToDisplay, mouseX + tooltipXModifier, mouseY, width, height, -1, fr);
+ }
+ }
+ if (mouseY >= ((height + 60) / 2f - 105) + 36 && mouseY <= ((height + 60) / 2f - 105) + 52) {
+ tooltipToDisplay = slot3.getTooltip(Minecraft.getMinecraft().thePlayer, false);
+ if (shouldShowEquipmentTooltip(tooltipToDisplay)) {
+ Utils.drawHoveringText(tooltipToDisplay, mouseX + tooltipXModifier, mouseY, width, height, -1, fr);
+ }
+ }
+ if (mouseY >= ((height + 60) / 2f - 105) + 54 && mouseY <= ((height + 60) / 2f - 105) + 70) {
+ tooltipToDisplay = slot4.getTooltip(Minecraft.getMinecraft().thePlayer, false);
+ if (shouldShowEquipmentTooltip(tooltipToDisplay)) {
+ Utils.drawHoveringText(tooltipToDisplay, mouseX + tooltipXModifier, mouseY, width, height, -1, fr);
+ }
+ }
+ }
+ GL11.glTranslatef(0, 0, -401);
+ }
+ }
+ }
+ if (PetInfoOverlay.getCurrentPet() != null) {
+ if (NotEnoughUpdates.INSTANCE.config.petOverlay.petInvDisplay
+ && (NotEnoughUpdates.INSTANCE.manager
+ .jsonToStack(NotEnoughUpdates.INSTANCE.manager
+ .getItemInformation()
+ .get(PetInfoOverlay.getCurrentPet().petType + ";" + PetInfoOverlay.getCurrentPet().rarity.petId))
+ .hasDisplayName()
+ || NotEnoughUpdates.INSTANCE.manager
+ .jsonToStack(NotEnoughUpdates.INSTANCE.manager
+ .getItemInformation()
+ .get(PetInfoOverlay.getCurrentPet().petType + ";" + (PetInfoOverlay.getCurrentPet().rarity.petId - 1)))
+ .hasDisplayName())
+ && NotEnoughUpdates.INSTANCE.config.misc.hidePotionEffect &&
+ NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard()) {
+ if (!NotEnoughUpdates.INSTANCE.manager
+ .jsonToStack(
+ NotEnoughUpdates.INSTANCE.manager
+ .getItemInformation()
+ .get(PetInfoOverlay.getCurrentPet().petType + ";" + PetInfoOverlay.getCurrentPet().rarity.petId))
+ .hasDisplayName()) {
+ petSlot = NotEnoughUpdates.INSTANCE.manager.jsonToStack(
+ NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(
+ PetInfoOverlay.getCurrentPet().petType + ";" + (PetInfoOverlay.getCurrentPet().rarity.petId - 1)));
+ } else {
+ petSlot = NotEnoughUpdates.INSTANCE.manager.jsonToStack(
+ NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(
+ PetInfoOverlay.getCurrentPet().petType + ";" + PetInfoOverlay.getCurrentPet().rarity.petId));
+ }
+ if (petSlot == null) {
+ return;
+ }
+ petSlot.getTagCompound().setBoolean(
+ "NEUHIDEPETTOOLTIP",
+ NotEnoughUpdates.INSTANCE.config.petOverlay.hidePetTooltip
+ );
+ ItemStack petInfo = petSlot;
+
+ if (guiScreen instanceof GuiInventory) {
+ GL11.glTranslatef(0, 0, 401);
+ if (!NotEnoughUpdates.INSTANCE.config.customArmour.enableArmourHud) {
+ if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 0) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(PET_DISPLAY);
+ }
+ if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 1) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(PET_DISPLAY_GREY);
+ }
+ if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 2) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(PET_DISPLAY_DARK);
+ }
+ if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 3) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(PET_DISPLAY_TRANSPARENT);
+ }
+ if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 4) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(PET_DISPLAY_FSR);
+ }
+ } else {
+ if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 0) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(PET_ARMOR_DISPLAY);
+ }
+ if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 1) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(PET_ARMOR_DISPLAY_GREY);
+ }
+ if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 2) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(PET_ARMOR_DISPLAY_DARK);
+ }
+ if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 3) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(PET_ARMOR_DISPLAY_TRANSPARENT);
+ }
+ if (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 4) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(PET_ARMOR_DISPLAY_FSR);
+ }
+ }
+
+ GlStateManager.color(1, 1, 1, 1);
+ float yNumber = (float) (height - 23) / 2f;
+ Utils.drawTexturedRect((float) ((width - 224.1) / 2f), yNumber, 31, 32, GL11.GL_NEAREST);
+ GlStateManager.bindTexture(0);
+
+ Utils.drawItemStack(petInfo, (int) ((width - 208) / 2f), (int) ((height + 60) / 2f - 105) + 72);
+ renderingPetHud = true;
+
+ List tooltipToDisplay = null;
+ if (petInfo != null) {
+ if (mouseX >= ((width - 208) / 2f) && mouseX < ((width - 208) / 2f) + 16) {
+ if (mouseY >= ((height + 60) / 2f - 105) + 72 && mouseY <= ((height + 60) / 2f - 105) + 88 &&
+ NotEnoughUpdates.INSTANCE.config.petOverlay.sendPetsCommand) {
+ if (Minecraft.getMinecraft().thePlayer.inventory.getItemStack() == null) {
+ if (Mouse.getEventButtonState()) {
+ if (ClientCommandHandler.instance.executeCommand(Minecraft.getMinecraft().thePlayer, "/pets") ==
+ 0) {
+ NotEnoughUpdates.INSTANCE.sendChatMessage("/pets");
+ }
+ }
+ }
+ tooltipToDisplay = petInfo.getTooltip(Minecraft.getMinecraft().thePlayer, false);
+ Utils.drawHoveringText(tooltipToDisplay, mouseX - 200, mouseY, width, height, -1, fr);
+ GL11.glTranslatef(0, 0, -80);
+ }
+ }
+
+ }
+ }
+ }
+ }
+ }
+
+ private boolean shouldShowEquipmentTooltip(List toolTip) {
+ return !toolTip.get(0).equals("§o§7Empty Equipment Slot§r");
+ }
+
/**
* Used in SettingsInfoPane to redraw the items when a setting changes.
*/
@@ -2753,7 +2749,7 @@ public class NEUOverlay extends Gui {
return;
}
- Minecraft.getMinecraft().getTextureManager().bindTexture(item_mask);
+ Minecraft.getMinecraft().getTextureManager().bindTexture(GuiTextures.item_mask);
if (getFavourites().contains(json.get("internalname").getAsString())) {
if (NotEnoughUpdates.INSTANCE.config.itemlist.itemStyle == 0) {
GlStateManager.color(fgFavourite2.getRed() / 255f, fgFavourite2.getGreen() / 255f,
@@ -2835,7 +2831,7 @@ public class NEUOverlay extends Gui {
GlStateManager.translate(0, 0, 50);
if (searchedItemsSubgroup.containsKey(json.get("internalname").getAsString())) {
- Minecraft.getMinecraft().getTextureManager().bindTexture(item_haschild);
+ Minecraft.getMinecraft().getTextureManager().bindTexture(GuiTextures.item_haschild);
GlStateManager.color(1, 1, 1, 1);
Utils.drawTexturedRect(x - 1, y - 1, ITEM_SIZE + 2, ITEM_SIZE + 2, GL11.GL_NEAREST);
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementTextField.java b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementTextField.java
index 51a4654c..f3d038e9 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementTextField.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementTextField.java
@@ -36,6 +36,7 @@ public class GuiElementTextField {
private int y;
private String prependText = "";
+ private String masterStarUnicode = "";
private int customTextColour = 0xffffffff;
private final GuiTextField textField = new GuiTextField(0, Minecraft.getMinecraft().fontRendererObj,
@@ -395,6 +396,55 @@ public class GuiElementTextField {
textField.setCursorPosition(pos + 1);
}
}
+ } else {
+ for (int i = 0; i < 10; i++) {
+ if (typedChar == Integer.toString(i + 1).charAt(0)) {
+ int pos = textField.getCursorPosition() - 2;
+ if (pos >= 0 && pos < textField.getText().length()) {
+ if (textField.getText().charAt(pos) == '*') {
+ switch (i) {
+ case 0:
+ masterStarUnicode = "\u278A";
+ break;
+ case 1:
+ masterStarUnicode = "\u278B";
+ break;
+ case 2:
+ masterStarUnicode = "\u278C";
+ break;
+ case 3:
+ masterStarUnicode = "\u278D";
+ break;
+ case 4:
+ masterStarUnicode = "\u278E";
+ break;
+ case 5:
+ masterStarUnicode = "\u278F";
+ break;
+ case 6:
+ masterStarUnicode = "\u2790";
+ break;
+ case 7:
+ masterStarUnicode = "\u2791";
+ break;
+ case 8:
+ masterStarUnicode = "\u2792";
+ break;
+ case 9:
+ masterStarUnicode = "\u2793";
+ break;
+ }
+ String before = textField.getText().substring(0, pos);
+ String after = "";
+ if (pos + 2 < textField.getText().length()) {
+ after = textField.getText().substring(pos + 2);
+ }
+ textField.setText(before + masterStarUnicode + after);
+ textField.setCursorPosition(pos + 1);
+ }
+ }
+ }
+ }
}
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java b/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java
index a00e7e8a..ab4e9dca 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java
@@ -16,7 +16,6 @@ import io.github.moulberry.notenoughupdates.util.Constants;
import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.inventory.GuiChest;
-import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.inventory.ContainerChest;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
@@ -36,8 +35,15 @@ import java.awt.*;
import java.awt.datatransfer.StringSelection;
import java.text.DecimalFormat;
import java.text.NumberFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
-import java.util.*;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
@@ -90,10 +96,13 @@ public class ItemTooltipListener {
"enchantments",
10
);
+ boolean hasAttributes = event.itemStack.getTagCompound().getCompoundTag("ExtraAttributes").hasKey(
+ "attributes",
+ 10
+ );
Set enchantIds = new HashSet<>();
- if (hasEnchantments)
- enchantIds =
- event.itemStack.getTagCompound().getCompoundTag("ExtraAttributes").getCompoundTag("enchantments").getKeySet();
+ if (hasEnchantments) enchantIds = event.itemStack.getTagCompound().getCompoundTag("ExtraAttributes").getCompoundTag(
+ "enchantments").getKeySet();
JsonObject enchantsConst = Constants.ENCHANTS;
JsonArray allItemEnchs = null;
@@ -348,6 +357,8 @@ public class ItemTooltipListener {
}
}
}
+ }
+ if (hasEnchantments || hasAttributes) {
for (String op : NotEnoughUpdates.INSTANCE.config.hidden.enchantColours) {
List colourOps = GuiEnchantColour.splitter.splitToList(op);
String enchantName = GuiEnchantColour.getColourOpIndex(colourOps, 0);
@@ -388,9 +399,10 @@ public class ItemTooltipListener {
//9([a-zA-Z ]+?) ([0-9]+|(I|II|III|IV|V|VI|VII|VIII|IX|X))(,|$)
Pattern pattern;
try {
- pattern = Pattern.compile("(\\u00A79|\\u00A7(9|l)\\u00A7d\\u00A7l)(?" + enchantName + ") " +
- "(?[0-9]+|(I|II|III|IV|V|VI|VII|VIII|IX|X|XI|XII|XIII|XIV|XV|XVI|XVII|XVIII|XIX|XX))((\\u00A79)?,|( \\u00A78(?:,?[0-9]+)*)?$)");
- } catch (PatternSyntaxException e) {
+ pattern = Pattern.compile(
+ "(\\u00A7b|\\u00A79|\\u00A7(b|9|l)\\u00A7d\\u00A7l)(?" + enchantName + ") " +
+ "(?[0-9]+|(I|II|III|IV|V|VI|VII|VIII|IX|X|XI|XII|XIII|XIV|XV|XVI|XVII|XVIII|XIX|XX))((\\u00A79)?,|( \\u00A78(?:,?[0-9]+)*)?$)");
+ } catch (Exception e) {
continue;
}
Matcher matcher = pattern.matcher(line);
@@ -441,10 +453,15 @@ public class ItemTooltipListener {
if (!colourCode.equals("z")) {
line = line.replace("\u00A79" + enchantText, "\u00A7" + colourCode + extraMods + enchantText);
+ line = line.replace("\u00A7b" + enchantText, "\u00A7" + colourCode + extraMods + enchantText);
line = line.replace(
"\u00A79\u00A7d\u00A7l" + enchantText,
"\u00A7" + colourCode + extraMods + enchantText
);
+ line = line.replace(
+ "\u00A7b\u00A7d\u00A7l" + enchantText,
+ "\u00A7" + colourCode + extraMods + enchantText
+ );
line = line.replace(
"\u00A7l\u00A7d\u00A7l" + enchantText,
"\u00A7" + colourCode + extraMods + enchantText
@@ -781,7 +798,6 @@ public class ItemTooltipListener {
/**
* This method does the following:
- * Move the pet inventory display tooltip to the left to avoid conflicts
* Remove reforge stats for Legendary items from Hypixel if enabled
* Show NBT data when holding LCONTROL
*/
@@ -789,10 +805,6 @@ public class ItemTooltipListener {
public void onItemTooltip(ItemTooltipEvent event) {
if (!neu.isOnSkyblock()) return;
if (event.toolTip == null) return;
- //Render the pet inventory display tooltip to the left to avoid things from other mods rendering over the tooltip
- if (event.itemStack.getTagCompound() != null && event.itemStack.getTagCompound().getBoolean("NEUPETINVDISPLAY")) {
- GlStateManager.translate(-200, 0, 0);
- }
if (event.toolTip.size() > 2 && NotEnoughUpdates.INSTANCE.config.tooltipTweaks.hideDefaultReforgeStats) {
String secondLine = StringUtils.stripControlCodes(event.toolTip.get(1));
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/CalendarOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/CalendarOverlay.java
index a9cf44c4..06cf28e1 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/CalendarOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/CalendarOverlay.java
@@ -659,6 +659,8 @@ public class CalendarOverlay {
}
}
}
+ } else {
+ Minecraft.getMinecraft().dispatchKeypresses();
}
}
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiEnchantColour.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiEnchantColour.java
index bd4bd680..4e865b28 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiEnchantColour.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiEnchantColour.java
@@ -66,7 +66,9 @@ public class GuiEnchantColour extends GuiScreen {
private static final Pattern settingPattern = Pattern.compile(".*:[>=<]:[0-9]+:[a-zA-Z0-9]+(:[a-zA-Z0-9]+)?");
private ItemStack maxedBook;
+ private ItemStack maxedAttBook;
private int maxedBookFound = 0;
+ private int maxedAttBookFound = 0;
private List getEnchantColours() {
return NotEnoughUpdates.INSTANCE.config.hidden.enchantColours;
@@ -227,13 +229,37 @@ public class GuiEnchantColour extends GuiScreen {
if (maxedBookFound == 1) {
Utils.drawItemStack(maxedBook, guiLeft + xSize + 3, guiTopSidebar - 34);
}
+ if (maxedAttBookFound == 0) {
+ try {
+ if (NotEnoughUpdates.INSTANCE.manager.jsonToStack(
+ NotEnoughUpdates.INSTANCE.manager.getItemInformation().get("MAXED_ATTRIBUTE_SHARD")).hasDisplayName()) {
+ maxedAttBook = NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager
+ .getItemInformation()
+ .get("MAXED_ATTRIBUTE_SHARD"));
+ maxedAttBookFound = 1;
+ } else {
+ maxedAttBookFound = 2;
+ }
- if (mouseX >= guiLeft + xSize + 3 && mouseX < guiLeft + xSize + 19) {
+ } catch (Exception ignored) {
+ maxedAttBookFound = 2;
+ }
+ }
+ if (maxedAttBookFound == 1) {
+ Utils.drawItemStack(maxedAttBook, guiLeft + xSize + 3, guiTopSidebar - 52);
+ }
+
+ if (mouseX >= guiLeft + xSize + 3 && mouseX < guiLeft + xSize + 39) {
if (mouseY >= guiTopSidebar - 34 && mouseY <= guiTopSidebar - 18 && maxedBookFound == 1) {
tooltipToDisplay = maxedBook.getTooltip(Minecraft.getMinecraft().thePlayer, false);
Utils.drawHoveringText(tooltipToDisplay, mouseX, mouseY, width, height, -1, fr);
tooltipToDisplay = null;
}
+ if (mouseY >= guiTopSidebar - 52 && mouseY <= guiTopSidebar - 34 && maxedAttBookFound == 1) {
+ tooltipToDisplay = maxedAttBook.getTooltip(Minecraft.getMinecraft().thePlayer, false);
+ Utils.drawHoveringText(tooltipToDisplay, mouseX, mouseY, width, height, -1, fr);
+ tooltipToDisplay = null;
+ }
if (mouseY >= guiTopSidebar - 18 && mouseY <= guiTopSidebar - 2) {
tooltipToDisplay = Lists.newArrayList(
EnumChatFormatting.AQUA + "NEUEC Colouring Guide",
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemCustomize.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemCustomize.java
index 222a0f88..12d48991 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemCustomize.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemCustomize.java
@@ -199,6 +199,7 @@ public class GuiItemCustomize extends GuiScreen {
EnumChatFormatting.GREEN + "",
EnumChatFormatting.GREEN + "Type \"&&\" to use colour codes",
EnumChatFormatting.GREEN + "Type \"**\" for \u272A",
+ EnumChatFormatting.GREEN + "Type \"*1-9\" for \u278A-\u2792",
EnumChatFormatting.GREEN + "",
EnumChatFormatting.GREEN + "Available colour codes:",
Utils.chromaString("\u00B6z = Chroma"),
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/DungeonMapConfig.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/DungeonMapConfig.java
index d69eca82..03465db7 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/DungeonMapConfig.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/DungeonMapConfig.java
@@ -136,7 +136,7 @@ public class DungeonMapConfig {
@Expose
@ConfigOption(
name = "Position",
- desc = "The position of the map"
+ desc = "Change the position of the map"
)
public Position dmPosition = new Position(10, 10);
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ItemOverlays.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ItemOverlays.java
index 2fedf559..9298623b 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ItemOverlays.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ItemOverlays.java
@@ -242,7 +242,7 @@ public class ItemOverlays {
@Expose
@ConfigOption(
name = "Bonemerang Overlay Position",
- desc = "The position of the Bonemerang overlay."
+ desc = "Change the position of the Bonemerang overlay."
)
@ConfigEditorButton(
runnableId = 9,
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/LocationEdit.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/LocationEdit.java
index 385a3cc1..462fbd92 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/LocationEdit.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/LocationEdit.java
@@ -20,7 +20,7 @@ public class LocationEdit {
@Expose
@ConfigOption(
name = "Edit Pet Info Position",
- desc = "The position of the pet info overlay."
+ desc = "Change the position of the pet info overlay"
)
@ConfigEditorButton(
runnableId = 4,
@@ -37,13 +37,12 @@ public class LocationEdit {
runnableId = 5,
buttonText = "Edit"
)
- @ConfigAccordionId(id = 0)
public Position todoPosition = new Position(100, 0);
@Expose
@ConfigOption(
name = "Edit Bonemerang Overlay Position",
- desc = "The position of the Bonemerang overlay."
+ desc = "Change the position of the Bonemerang overlay"
)
@ConfigEditorButton(
runnableId = 9,
@@ -72,7 +71,7 @@ public class LocationEdit {
@Expose
@ConfigOption(
name = "Edit Toolbar Positions",
- desc = "Edit the position of the QuickCommands / Search Bar"
+ desc = "Change the position of the QuickCommands / Search Bar"
)
@ConfigAccordionId(id = 1)
@ConfigEditorButton(runnableId = 6, buttonText = "Edit")
@@ -109,7 +108,7 @@ public class LocationEdit {
@Expose
@ConfigOption(
name = "Edit Crystal Overlay Position",
- desc = "Change the position of the Crystal Hollows Overlay."
+ desc = "Change the position of the Crystal Hollows Overlay"
)
@ConfigEditorButton(
runnableId = 10,
@@ -121,7 +120,7 @@ public class LocationEdit {
@Expose
@ConfigOption(
name = "Edit Fuel Bar Position",
- desc = "Set the position of the drill fuel bar"
+ desc = "Change the position of the drill fuel bar"
)
@ConfigEditorButton(
runnableId = 2,
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Mining.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Mining.java
index 9ff88089..697cabf3 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Mining.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Mining.java
@@ -84,7 +84,7 @@ public class Mining {
@Expose
@ConfigOption(
name = "Edit Fuel Bar Position",
- desc = "Set the position of the drill fuel bar"
+ desc = "Change the position of the drill fuel bar"
)
@ConfigEditorButton(
runnableId = 2,
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/PetOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/PetOverlay.java
index 6f96e972..9cba8202 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/PetOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/PetOverlay.java
@@ -20,7 +20,7 @@ public class PetOverlay {
@Expose
@ConfigOption(
name = "Edit Pet Info Position",
- desc = "The position of the pet info."
+ desc = "Change the position of the pet info overlay"
)
@ConfigEditorButton(
runnableId = 4,
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Toolbar.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Toolbar.java
index ff1b94c5..741b57e5 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Toolbar.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Toolbar.java
@@ -7,7 +7,7 @@ public class Toolbar {
@Expose
@ConfigOption(
name = "Edit Toolbar Positions",
- desc = "Edit the position of the QuickCommands / Search Bar"
+ desc = "Change the position of the QuickCommands / Search Bar"
)
@ConfigEditorButton(runnableId = 6, buttonText = "Edit")
public boolean positionButton = true;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/AuctionSearchOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/AuctionSearchOverlay.java
index 7281eecf..36b37766 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/AuctionSearchOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/AuctionSearchOverlay.java
@@ -35,6 +35,7 @@ public class AuctionSearchOverlay {
private static final ResourceLocation SEARCH_OVERLAY_TEXTURE_TAB_COMPLETED = new ResourceLocation(
"notenoughupdates:auc_search/ah_search_overlay_tab_completed.png");
private static final ResourceLocation STAR = new ResourceLocation("notenoughupdates:auc_search/star.png");
+ private static final ResourceLocation MASTER_STAR = new ResourceLocation("notenoughupdates:auc_search/master_star.png");
private static final ResourceLocation STAR_BOARD = new ResourceLocation("notenoughupdates:auc_search/star_board.png");
private static final GuiElementTextField textField = new GuiElementTextField("", 200, 20, 0);
@@ -114,22 +115,26 @@ public class AuctionSearchOverlay {
Utils.drawTexturedRect(width / 2 - 100, topY - 1, 203, h, 0, 203 / 512f, 0, h / 256f, GL11.GL_NEAREST);
Minecraft.getMinecraft().getTextureManager().bindTexture(STAR_BOARD);
- Utils.drawTexturedRect(width / 2 + 105, topY + 27, 55, 13, GL11.GL_NEAREST);
+ Utils.drawTexturedRect(width / 2 + 105, topY + 27, 105, 13, GL11.GL_NEAREST);
Minecraft.getMinecraft().getTextureManager().bindTexture(STAR);
GlStateManager.color(1, 1, 1, 1);
- int stars = atLeast && selectedStars > 0 ? 5 : selectedStars;
+ int stars = atLeast && selectedStars > 0 ? 10 : selectedStars;
for (int i = 0; i < stars; i++) {
+ if (i >= 5) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(MASTER_STAR);
+ GlStateManager.color(1, 1, 1, 1);
+ }
if (i >= selectedStars) {
GlStateManager.color(1, 1, 1, 0.3f);
}
Utils.drawTexturedRect(width / 2 + 108 + 10 * i, topY + 29, 9, 10, GL11.GL_NEAREST);
}
- Gui.drawRect(width / 2 + 106, topY + 42, width / 2 + 115, topY + 51, 0xffffffff);
- Gui.drawRect(width / 2 + 107, topY + 43, width / 2 + 114, topY + 50, 0xff000000);
- if (atLeast) Gui.drawRect(width / 2 + 108, topY + 44, width / 2 + 113, topY + 49, 0xffffffff);
- Minecraft.getMinecraft().fontRendererObj.drawString("At Least?", width / 2 + 117, topY + 43, 0xffffff);
+ if (selectedStars < 6) Gui.drawRect(width / 2 + 106, topY + 42, width / 2 + 115, topY + 51, 0xffffffff);
+ if (selectedStars < 6) Gui.drawRect(width / 2 + 107, topY + 43, width / 2 + 114, topY + 50, 0xff000000);
+ if (atLeast && selectedStars < 6) Gui.drawRect(width / 2 + 108, topY + 44, width / 2 + 113, topY + 49, 0xffffffff);
+ if (selectedStars < 6) Minecraft.getMinecraft().fontRendererObj.drawString("At Least?", width / 2 + 117, topY + 43, 0xffffff);
Minecraft.getMinecraft().fontRendererObj.drawString("Enter Query:", width / 2 - 100, topY - 10, 0xdddddd, true);
@@ -507,10 +512,10 @@ public class AuctionSearchOverlay {
topY = height / 2 - h / 2 + 5;
}
- if (Mouse.getEventButtonState() && mouseX > width / 2 + 105 && mouseX < width / 2 + 105 + 55 &&
+ if (Mouse.getEventButtonState() && mouseX > width / 2 + 105 && mouseX < width / 2 + 105 + 105 &&
mouseY > topY + 27 && mouseY < topY + 40) {
- int starClicked = 5;
- for (int i = 1; i <= 5; i++) {
+ int starClicked = 10;
+ for (int i = 1; i <= 10; i++) {
if (mouseX < width / 2 + 108 + 10 * i) {
starClicked = i;
break;
@@ -584,9 +589,27 @@ public class AuctionSearchOverlay {
searchStringExtra = "";
if (essenceCosts != null && essenceCosts.has(str) && selectedStars > 0) {
for (int i = 0; i < selectedStars; i++) {
+ if (i > 4) break;
searchStringExtra += "\u272A";
}
- if (selectedStars < 5 && !atLeast) {
+ switch (selectedStars) {
+ case 6:
+ searchStringExtra += "\u278A";
+ break;
+ case 7:
+ searchStringExtra += "\u278B";
+ break;
+ case 8:
+ searchStringExtra += "\u278C";
+ break;
+ case 9:
+ searchStringExtra += "\u278D";
+ break;
+ case 10:
+ searchStringExtra += "\u278E";
+ break;
+ }
+ if (selectedStars < 6 && !atLeast) {
searchStringExtra += " ";
searchStringExtra += stack.getItem().getItemStackDisplayName(stack).substring(0, 1);
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/TimersOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/TimersOverlay.java
index 59a77ea3..d3f17fbf 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/TimersOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/TimersOverlay.java
@@ -535,7 +535,7 @@ public class TimersOverlay extends TextOverlay {
}
long midnightReset = (currentTime - 18000000) / 86400000 * 86400000 + 18000000; // 12am est
- long pearlsReset = midnightReset - 14400000 + 86400000; //8pm est
+ long pearlsReset = midnightReset - 14400000; //8pm est
long catacombsReset = currentTime / 86400000 * 86400000; // 7pm est
long timeDiffMidnightNow = midnightReset + 86400000 - currentTime;
long catacombsDiffNow = catacombsReset + 86400000 - currentTime;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java
index 06ba32ad..87712378 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java
@@ -5013,7 +5013,7 @@ public class GuiProfileViewer extends GuiScreen {
);
if (mouseX > guiLeft + 132 && mouseX < guiLeft + 212) {
- if (mouseY > guiTop + 27 + 11f * i && mouseY < guiTop + 37 + 11f * i) {
+ if (mouseY > guiTop + 21 + 11f * i && mouseY < guiTop + 37 + 11f * i) {
List split = splitter.splitToList(statNamePretty);
PlayerStats.Stats baseStats = PlayerStats.getBaseStats();
tooltipToDisplay = new ArrayList<>();
diff --git a/src/main/resources/assets/notenoughupdates/auc_search/master_star.png b/src/main/resources/assets/notenoughupdates/auc_search/master_star.png
new file mode 100644
index 00000000..210ecf49
Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/auc_search/master_star.png differ
diff --git a/src/main/resources/assets/notenoughupdates/auc_search/star_board.png b/src/main/resources/assets/notenoughupdates/auc_search/star_board.png
index 8251731f..0a42884d 100644
Binary files a/src/main/resources/assets/notenoughupdates/auc_search/star_board.png and b/src/main/resources/assets/notenoughupdates/auc_search/star_board.png differ
--
cgit
From ead065aa1303acc3f6834bcfceb77242702b5622 Mon Sep 17 00:00:00 2001
From: Roman / Nea
Date: Fri, 6 May 2022 15:36:49 +0200
Subject: Add screensaver cape and make shaders f3+t-able (#125)
---
.../notenoughupdates/NotEnoughUpdates.java | 2 +
.../notenoughupdates/cosmetics/CapeManager.java | 1 +
.../notenoughupdates/cosmetics/NEUCape.java | 59 ++++++++++++++++++++-
.../notenoughupdates/cosmetics/ShaderManager.java | 12 ++++-
.../assets/notenoughupdates/capes/screensaver.png | Bin 0 -> 31381 bytes
.../notenoughupdates/capes/screensaver_preview.png | Bin 0 -> 19453 bytes
.../shaders/capes/screensaver/screensaver.frag | 54 +++++++++++++++++++
.../shaders/capes/screensaver/screensaver.vert | 6 +++
8 files changed, 131 insertions(+), 3 deletions(-)
create mode 100644 src/main/resources/assets/notenoughupdates/capes/screensaver.png
create mode 100644 src/main/resources/assets/notenoughupdates/capes/screensaver_preview.png
create mode 100644 src/main/resources/assets/notenoughupdates/shaders/capes/screensaver/screensaver.frag
create mode 100644 src/main/resources/assets/notenoughupdates/shaders/capes/screensaver/screensaver.vert
(limited to 'src/main/resources')
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
index 6b2fd09e..6d4e0d02 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
@@ -7,6 +7,7 @@ import com.google.gson.JsonObject;
import io.github.moulberry.notenoughupdates.commands.Commands;
import io.github.moulberry.notenoughupdates.core.BackgroundBlur;
import io.github.moulberry.notenoughupdates.cosmetics.CapeManager;
+import io.github.moulberry.notenoughupdates.cosmetics.ShaderManager;
import io.github.moulberry.notenoughupdates.dungeons.DungeonMap;
import io.github.moulberry.notenoughupdates.listener.ChatListener;
import io.github.moulberry.notenoughupdates.listener.ItemTooltipListener;
@@ -241,6 +242,7 @@ public class NotEnoughUpdates {
IReloadableResourceManager manager = (IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager();
manager.registerReloadListener(CustomSkulls.getInstance());
manager.registerReloadListener(NPCRetexturing.getInstance());
+ manager.registerReloadListener(ShaderManager.getInstance());
manager.registerReloadListener(new ItemCustomizeManager.ReloadListener());
manager.registerReloadListener(new CustomBlockSounds.ReloaderListener());
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java
index 3f7476bd..18e62706 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java
@@ -67,6 +67,7 @@ public class CapeManager {
new CapeData("lava", false, false),
new CapeData("tunnel", false, false),
new CapeData("planets", false, false),
+ new CapeData("screensaver", false, false),
//Admins
new CapeData("nullzee", true, false),
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/NEUCape.java b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/NEUCape.java
index da9d1f68..a58587a8 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/NEUCape.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/NEUCape.java
@@ -18,13 +18,22 @@ import net.minecraftforge.client.event.RenderPlayerEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import org.lwjgl.BufferUtils;
import org.lwjgl.input.Keyboard;
-import org.lwjgl.opengl.*;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL15;
+import org.lwjgl.opengl.GL20;
+import org.lwjgl.opengl.GL30;
+import org.lwjgl.opengl.GL42;
+import org.lwjgl.opengl.GL43;
import org.lwjgl.util.vector.Vector2f;
import org.lwjgl.util.vector.Vector3f;
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+import java.util.TreeMap;
public class NEUCape {
private int currentFrame = 0;
@@ -43,6 +52,10 @@ public class NEUCape {
private final Random random = new Random();
private long eventMillis;
+ private float dvdPositionX = 100;
+ private float dvdPositionY = 100;
+ private float dvdVelocityX = -10;
+ private float dvdVelocityY = 10;
private float eventLength;
private float eventRandom;
@@ -101,6 +114,8 @@ public class NEUCape {
shaderName = "tunnel";
} else if (capeName.equalsIgnoreCase("planets")) {
shaderName = "planets";
+ } else if (capeName.equalsIgnoreCase("screensaver")) {
+ shaderName = "screensaver";
} else {
shaderName = "shiny_cape";
}
@@ -322,6 +337,9 @@ public class NEUCape {
Minecraft.getMinecraft().displayWidth,
Minecraft.getMinecraft().displayHeight
));
+ } else if (shaderName.equalsIgnoreCase("screensaver")) {
+ shaderManager.loadData(shaderId, "something", (int) ((System.currentTimeMillis() / 4) % 256));
+ shaderManager.loadData(shaderId, "dvdPosition", new Vector2f(dvdPositionX, dvdPositionY));
}
}
@@ -530,6 +548,19 @@ public class NEUCape {
private int crouchTicks = 0;
long startTime = 0;
+ public float deltaYComparedToLine(float x0, float y0, float x1, float y1) {
+ float m = (y1 - y0) / (x1 - x0);
+ float b = y0 - m * x0;
+ float lineAtX = dvdPositionX * m + b;
+ return dvdPositionY - lineAtX;
+ }
+
+ public float projectOntoLine(float x0, float y0, float x1, float y1, float x) {
+ float m = (y1 - y0) / (x1 - x0);
+ float b = y0 - m * x0;
+ return x * m + b;
+ }
+
private void updateCape(EntityPlayer player) {
Vector3f capeTranslation = updateFixedCapeNodes(player);
@@ -546,6 +577,30 @@ public class NEUCape {
eventMillis = currentTime;
eventLength = random.nextFloat() * 3000 + 3000;
}
+ } else if (shaderName.equals("screensaver")) {
+ dvdPositionX += dvdVelocityX;
+ dvdPositionY += dvdVelocityY;
+ float diskSizeX = 162 / 2F, diskSizeY = 78 / 2F;
+ // Left line
+ if (deltaYComparedToLine(0, 404, 47, 0) < 0) {
+ dvdVelocityX = 10;
+ dvdPositionX = projectOntoLine(404, 0, 0, 47, dvdPositionY);
+ }
+ // Bottom line
+ if (deltaYComparedToLine(0, 404 - diskSizeY, 292, 404 - diskSizeY) > 0) {
+ dvdVelocityY = -10;
+ dvdPositionY = 404 - diskSizeY;
+ }
+ // Top line
+ if (deltaYComparedToLine(47, 0, 246, 0) < 0) {
+ dvdVelocityY = 10;
+ dvdPositionY = 0;
+ }
+ // Right line
+ if (deltaYComparedToLine(246 - diskSizeX, 0, 293 - diskSizeX, 404) < 0) {
+ dvdVelocityX = -10;
+ dvdPositionX = projectOntoLine(0, 246 - diskSizeX, 404, 293 - diskSizeX, dvdPositionY);
+ }
}
double playerAngle = getPlayerRenderAngle(player, 0);
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java
index 4e934e10..02e8215c 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java
@@ -1,6 +1,8 @@
package io.github.moulberry.notenoughupdates.cosmetics;
import net.minecraft.client.Minecraft;
+import net.minecraft.client.resources.IResourceManager;
+import net.minecraft.client.resources.IResourceManagerReloadListener;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL43;
@@ -14,7 +16,7 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
-public class ShaderManager {
+public class ShaderManager implements IResourceManagerReloadListener {
private final ResourceLocation shaderLocation = new ResourceLocation("notenoughupdates:shaders");
private final HashMap shaderMap = new HashMap<>();
@@ -24,6 +26,14 @@ public class ShaderManager {
return INSTANCE;
}
+ @Override
+ public void onResourceManagerReload(IResourceManager iResourceManager) {
+ shaderMap.values().forEach(it -> {
+ GL20.glDeleteProgram(it.program);
+ });
+ shaderMap.clear();
+ }
+
public static class Shader {
public final int program;
diff --git a/src/main/resources/assets/notenoughupdates/capes/screensaver.png b/src/main/resources/assets/notenoughupdates/capes/screensaver.png
new file mode 100644
index 00000000..c6ce9e8c
Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/capes/screensaver.png differ
diff --git a/src/main/resources/assets/notenoughupdates/capes/screensaver_preview.png b/src/main/resources/assets/notenoughupdates/capes/screensaver_preview.png
new file mode 100644
index 00000000..a7d890f8
Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/capes/screensaver_preview.png differ
diff --git a/src/main/resources/assets/notenoughupdates/shaders/capes/screensaver/screensaver.frag b/src/main/resources/assets/notenoughupdates/shaders/capes/screensaver/screensaver.frag
new file mode 100644
index 00000000..8985e717
--- /dev/null
+++ b/src/main/resources/assets/notenoughupdates/shaders/capes/screensaver/screensaver.frag
@@ -0,0 +1,54 @@
+#version 130
+
+uniform sampler2D textureIn;
+uniform int something;
+uniform vec2 dvdPosition;
+
+//Algorithm by sam hocevar
+vec3 rgb2hsv(vec3 c) {
+ vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
+ vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));
+ vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));
+
+ float d = q.x - min(q.w, q.y);
+ float e = 1.0e-10;
+ return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
+}
+
+//Algorithm by hughsk
+vec3 hsv2rgb(vec3 c) {
+ vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
+ vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
+ return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
+}
+void main() {
+ vec2 diskUv = vec2(1, 634) / 1024;
+ vec2 diskSize = vec2(162, 78) / 1024;
+ float renderScale = 0.5;
+ vec2 renderSize = diskSize * renderScale;
+ vec2 positionTopLeft = dvdPosition / 1024;
+ vec2 positionBottomRight = positionTopLeft + renderSize;
+ vec4 texture = texture2D(textureIn, gl_TexCoord[0].st);
+ // vec4 texture = vec4(1.0, 0.0, 1.0, 1.0);
+ vec2 offset = gl_TexCoord[0].st - positionTopLeft;
+
+ if (0 <= offset.x && offset.x < renderSize.x && 0 <= offset.y && offset.y < renderSize.y) {
+ vec4 diskTexture = texture2D(textureIn, diskUv + offset / renderScale);
+ // vec4 diskTexture = vec4(1.0, 0.0, 0.0, 1.0);
+ if (diskTexture.w > 0.5) {
+ vec3 hehe = rgb2hsv(diskTexture.xyz);
+
+ float otherHue = float(something) / 255.0;
+ if (otherHue > 1){
+ hehe.x = 1;
+ } else if (otherHue < 0){
+ hehe.x = 0;
+ } else {
+ hehe.x = otherHue;
+ }
+
+ texture = vec4(hsv2rgb(hehe), 1.0);
+ }
+ }
+ gl_FragColor = texture;
+}
diff --git a/src/main/resources/assets/notenoughupdates/shaders/capes/screensaver/screensaver.vert b/src/main/resources/assets/notenoughupdates/shaders/capes/screensaver/screensaver.vert
new file mode 100644
index 00000000..d2bc8e19
--- /dev/null
+++ b/src/main/resources/assets/notenoughupdates/shaders/capes/screensaver/screensaver.vert
@@ -0,0 +1,6 @@
+#version 120
+
+void main() {
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
+ gl_TexCoord[0] = gl_MultiTexCoord0;
+}
--
cgit
From 1ca41f88d7729d9279df71cd186ff86f22e7d515 Mon Sep 17 00:00:00 2001
From: Roman / Nea
Date: Fri, 6 May 2022 16:13:36 +0200
Subject: Item Shop Recipes (#118)
* first draft of item shop PR
* add teleporter navigation because i can
* fix teleporter navigation because apparently i cant
* navigation gui basics
* :pushpin: and removed some unused shit and added myself to devtest command
* track / untrack + ery texture
Co-Authored-By: RayDeeUx <51521765+RayDeeUx@users.noreply.github.com>
* consoom the event
* fix crash in ItemShopRecipe.java + fetch repository
* i am so sorry jani
* on second thought, this entire thing was a bit untested
* more recipe stuff
* make navigation actually good
* make pins dissapear if you not a waypoint
* npc parsing
* save file
* different file saving
* remove message
* Warping... (to deez nuts)
* move shit around
Co-authored-by: jani270
Co-authored-by: RayDeeUx <51521765+RayDeeUx@users.noreply.github.com>
Co-authored-by: Lulonaut
---
.../moulberry/notenoughupdates/NEUManager.java | 329 ++++++++---------
.../moulberry/notenoughupdates/NEUOverlay.java | 36 +-
.../notenoughupdates/NotEnoughUpdates.java | 5 +
.../commands/dev/DevTestCommand.java | 26 +-
.../commands/repo/ReloadRepoCommand.java | 9 +-
.../commands/repo/RepoModeCommand.java | 17 +-
.../core/util/render/RenderUtils.java | 68 ++--
.../events/RepositoryReloadEvent.java | 21 ++
.../notenoughupdates/itemeditor/NEUItemEditor.java | 18 +-
.../notenoughupdates/listener/RenderListener.java | 149 +++++++-
.../notenoughupdates/miscfeatures/Navigation.java | 398 +++++++++++++++++++++
.../notenoughupdates/miscgui/GuiItemRecipe.java | 44 ++-
.../notenoughupdates/miscgui/GuiNavigation.java | 154 ++++++++
.../notenoughupdates/options/NEUConfig.java | 5 +
.../options/seperateSections/Misc.java | 35 +-
.../profileviewer/GuiProfileViewer.java | 7 +-
.../notenoughupdates/recipes/ItemShopRecipe.java | 189 ++++++++++
.../notenoughupdates/recipes/MobLootRecipe.java | 10 +-
.../notenoughupdates/recipes/NeuRecipe.java | 17 +
.../notenoughupdates/recipes/RecipeType.java | 3 +-
.../recipes/VillagerTradeRecipe.java | 2 +-
.../moulberry/notenoughupdates/util/Constants.java | 18 +-
.../moulberry/notenoughupdates/util/ItemUtils.java | 43 ++-
.../moulberry/notenoughupdates/util/JsonUtils.java | 29 +-
.../moulberry/notenoughupdates/util/Utils.java | 4 +-
.../textures/gui/forge_recipe_tall.png | Bin 9257 -> 2743 bytes
.../textures/gui/item_shop_recipe.png | Bin 0 -> 3177 bytes
.../notenoughupdates/textures/gui/navigation.png | Bin 0 -> 1028 bytes
.../textures/gui/villager_recipe_tall.png | Bin 9218 -> 2709 bytes
29 files changed, 1374 insertions(+), 262 deletions(-)
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/events/RepositoryReloadEvent.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/Navigation.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiNavigation.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/recipes/ItemShopRecipe.java
create mode 100644 src/main/resources/assets/notenoughupdates/textures/gui/item_shop_recipe.png
create mode 100644 src/main/resources/assets/notenoughupdates/textures/gui/navigation.png
(limited to 'src/main/resources')
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java
index 6572431b..c283464e 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java
@@ -1,14 +1,24 @@
package io.github.moulberry.notenoughupdates;
-import com.google.gson.*;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
import io.github.moulberry.notenoughupdates.auction.APIManager;
+import io.github.moulberry.notenoughupdates.events.RepositoryReloadEvent;
import io.github.moulberry.notenoughupdates.miscgui.GuiItemRecipe;
import io.github.moulberry.notenoughupdates.miscgui.KatSitterOverlay;
import io.github.moulberry.notenoughupdates.recipes.CraftingOverlay;
import io.github.moulberry.notenoughupdates.recipes.CraftingRecipe;
import io.github.moulberry.notenoughupdates.recipes.Ingredient;
import io.github.moulberry.notenoughupdates.recipes.NeuRecipe;
-import io.github.moulberry.notenoughupdates.util.*;
+import io.github.moulberry.notenoughupdates.util.Constants;
+import io.github.moulberry.notenoughupdates.util.HotmInformation;
+import io.github.moulberry.notenoughupdates.util.HypixelApi;
+import io.github.moulberry.notenoughupdates.util.SBInfo;
+import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.init.Blocks;
@@ -16,24 +26,49 @@ import net.minecraft.init.Items;
import net.minecraft.inventory.ContainerChest;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.*;
+import net.minecraft.nbt.CompressedStreamTools;
+import net.minecraft.nbt.JsonToNBT;
+import net.minecraft.nbt.NBTException;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.nbt.NBTTagString;
import net.minecraft.util.ResourceLocation;
-import net.minecraftforge.fml.common.ProgressManager;
import org.apache.commons.io.FileUtils;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
import javax.net.ssl.HttpsURLConnection;
-import javax.swing.JDialog;
-import javax.swing.JOptionPane;
-import java.io.*;
+import javax.swing.*;
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Base64;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.NavigableMap;
+import java.util.Optional;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
@@ -44,6 +79,7 @@ public class NEUManager {
public final APIManager auctionManager;
private final TreeMap itemMap = new TreeMap<>();
+ private boolean hasBeenLoadedBefore = false;
private final TreeMap>> titleWordMap = new TreeMap<>();
private final TreeMap>> loreWordMap = new TreeMap<>();
@@ -73,8 +109,6 @@ public class NEUManager {
private final Map itemstackCache = new HashMap<>();
- private final ExecutorService repoLoaderES = Executors.newSingleThreadExecutor();
-
private static String GIT_COMMITS_URL;
// TODO: private final Map
@@ -160,186 +194,102 @@ public class NEUManager {
}
}
- /**
- * Called when the game is first loaded. Compares the local repository to the github repository and handles the
- * downloading of new/updated files. This then calls the "loadItem" method for every item in the local repository.
- */
- public void loadItemInformation() {
- /*File repoFile = new File(configLocation, "repo2");
- repoFile.mkdirs();
-
- try(Git git = Git.init().setDirectory(repoFile).call()) {
- StoredConfig config = git.getRepository().getConfig();
- config.setString("branch", "master", "merge", "refs/heads/master");
- config.setString("branch", "master", "remote", "origin");
- config.setString("remote", "origin", "fetch", "+refs/heads/*:refs/remotes/origin/*");
- config.setString("remote", "origin", "url", "https://github.com/Moulberry/NotEnoughUpdates-REPO.git");
- config.save();
-
- git.remoteAdd().setName("origin").setUri(new URIish("https://github.com/Moulberry/NotEnoughUpdates-REPO.git")).call();
- PullResult result = git.pull().setRemote("origin").setTimeout(30000).call();
- System.out.println("successful pull: " + result.isSuccessful());
- } catch(Exception e) {
- e.printStackTrace();
- }*/
-
- /*if(repoFile.mkdirs()) {
- try {
- Git.cloneRepository()
- .setURI("https://github.com/Moulberry/NotEnoughUpdates-REPO.git")
- .setDirectory(repoFile)
- .call();
- } catch(Exception e) {
- e.printStackTrace();
- }
- } else {
-
- }*/
-
- repoLoaderES.submit(() -> {
+ public CompletableFuture fetchRepository() {
+ return CompletableFuture.supplyAsync(() -> {
JDialog dialog = null;
try {
- if (NotEnoughUpdates.INSTANCE.config.hidden.autoupdate) {
- JOptionPane pane = new JOptionPane("Getting items to download from remote repository.");
- dialog = pane.createDialog("NotEnoughUpdates Remote Sync");
- dialog.setModal(false);
- if (NotEnoughUpdates.INSTANCE.config.hidden.dev) dialog.setVisible(true);
-
- if (Display.isActive()) dialog.toFront();
-
- JsonObject currentCommitJSON = getJsonFromFile(new File(configLocation, "currentCommit.json"));
-
- latestRepoCommit = null;
- try (Reader inReader = new InputStreamReader(new URL(GIT_COMMITS_URL).openStream())) {
- JsonObject commits = gson.fromJson(inReader, JsonObject.class);
- latestRepoCommit = commits.get("sha").getAsString();
- } catch (Exception e) {
- e.printStackTrace();
- }
- if (latestRepoCommit == null || latestRepoCommit.isEmpty()) return;
+ JOptionPane pane = new JOptionPane("Getting items to download from remote repository.");
+ dialog = pane.createDialog("NotEnoughUpdates Remote Sync");
+ dialog.setModal(false);
+ if (NotEnoughUpdates.INSTANCE.config.hidden.dev) dialog.setVisible(true);
- if (new File(configLocation, "repo").exists() && new File(configLocation, "repo/items").exists()) {
- if (currentCommitJSON != null && currentCommitJSON.get("sha").getAsString().equals(latestRepoCommit)) {
- dialog.setVisible(false);
- return;
- }
+ if (Display.isActive()) dialog.toFront();
+
+ JsonObject currentCommitJSON = getJsonFromFile(new File(configLocation, "currentCommit.json"));
+
+ latestRepoCommit = null;
+ try (Reader inReader = new InputStreamReader(new URL(GIT_COMMITS_URL).openStream())) {
+ JsonObject commits = gson.fromJson(inReader, JsonObject.class);
+ latestRepoCommit = commits.get("sha").getAsString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ if (latestRepoCommit == null || latestRepoCommit.isEmpty()) return false;
+
+ if (new File(configLocation, "repo").exists() && new File(configLocation, "repo/items").exists()) {
+ if (currentCommitJSON != null && currentCommitJSON.get("sha").getAsString().equals(latestRepoCommit)) {
+ return false;
}
+ }
- if (Display.isActive()) dialog.toFront();
+ if (Display.isActive()) dialog.toFront();
- Utils.recursiveDelete(repoLocation);
- repoLocation.mkdirs();
+ Utils.recursiveDelete(repoLocation);
+ repoLocation.mkdirs();
- String dlUrl = neu.config.hidden.repoURL;
+ String dlUrl = neu.config.hidden.repoURL;
- pane.setMessage("Downloading NEU Master Archive. (DL# >20)");
- dialog.pack();
- if (NotEnoughUpdates.INSTANCE.config.hidden.dev) dialog.setVisible(true);
- if (Display.isActive()) dialog.toFront();
+ pane.setMessage("Downloading NEU Master Archive. (DL# >20)");
+ dialog.pack();
+ if (NotEnoughUpdates.INSTANCE.config.hidden.dev) dialog.setVisible(true);
+ if (Display.isActive()) dialog.toFront();
- File itemsZip = new File(repoLocation, "neu-items-master.zip");
- try {
- itemsZip.createNewFile();
- } catch (IOException e) {
- return;
- }
+ File itemsZip = new File(repoLocation, "neu-items-master.zip");
+ try {
+ itemsZip.createNewFile();
+ } catch (IOException e) {
+ return false;
+ }
- URL url = new URL(dlUrl);
- URLConnection urlConnection = url.openConnection();
- urlConnection.setConnectTimeout(15000);
- urlConnection.setReadTimeout(30000);
-
- try (InputStream is = urlConnection.getInputStream()) {
- FileUtils.copyInputStreamToFile(is, itemsZip);
- } catch (IOException e) {
- dialog.dispose();
- e.printStackTrace();
- System.err.println("Failed to download NEU Repo! Please report this issue to the mod creator");
- return;
- }
- /*try (
- BufferedInputStream inStream = new BufferedInputStream(urlConnection.getInputStream());
- FileOutputStream fileOutputStream = new FileOutputStream(itemsZip)
- ) {
- byte dataBuffer[] = new byte[1024];
- int bytesRead;
- while ((bytesRead = inStream.read(dataBuffer, 0, 1024)) != -1) {
- fileOutputStream.write(dataBuffer, 0, bytesRead);
- }
- } catch (IOException e) {
- dialog.dispose();
- return;
- }*/
-
- pane.setMessage("Unzipping NEU Master Archive.");
- dialog.pack();
- //dialog.setVisible(true);
- if (Display.isActive()) dialog.toFront();
-
- unzipIgnoreFirstFolder(itemsZip.getAbsolutePath(), repoLocation.getAbsolutePath());
-
- if (currentCommitJSON == null || !currentCommitJSON.get("sha").getAsString().equals(latestRepoCommit)) {
- JsonObject newCurrentCommitJSON = new JsonObject();
- newCurrentCommitJSON.addProperty("sha", latestRepoCommit);
- try {
- writeJson(newCurrentCommitJSON, new File(configLocation, "currentCommit.json"));
- } catch (IOException ignored) {
- }
- }
+ URL url = new URL(dlUrl);
+ URLConnection urlConnection = url.openConnection();
+ urlConnection.setConnectTimeout(15000);
+ urlConnection.setReadTimeout(30000);
+
+ try (InputStream is = urlConnection.getInputStream()) {
+ FileUtils.copyInputStreamToFile(is, itemsZip);
+ } catch (IOException e) {
+ dialog.dispose();
+ e.printStackTrace();
+ System.err.println("Failed to download NEU Repo! Please report this issue to the mod creator");
+ return false;
}
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (dialog != null) dialog.dispose();
- }
- File items = new File(repoLocation, "items");
- if (items.exists()) {
- File[] itemFiles = new File(repoLocation, "items").listFiles();
- if (itemFiles != null) {
- ProgressManager.ProgressBar bar = ProgressManager.push("Loading recipes", itemFiles.length);
- for (File f : itemFiles) {
- String internalname = f.getName().substring(0, f.getName().length() - 5);
- bar.step(internalname);
- synchronized (itemMap) {
- if (!itemMap.containsKey(internalname)) {
- loadItem(internalname);
- }
- }
+ pane.setMessage("Unzipping NEU Master Archive.");
+ dialog.pack();
+ //dialog.setVisible(true);
+ if (Display.isActive()) dialog.toFront();
+
+ unzipIgnoreFirstFolder(itemsZip.getAbsolutePath(), repoLocation.getAbsolutePath());
+
+ if (currentCommitJSON == null || !currentCommitJSON.get("sha").getAsString().equals(latestRepoCommit)) {
+ JsonObject newCurrentCommitJSON = new JsonObject();
+ newCurrentCommitJSON.addProperty("sha", latestRepoCommit);
+ try {
+ writeJson(newCurrentCommitJSON, new File(configLocation, "currentCommit.json"));
+ } catch (IOException ignored) {
}
- ProgressManager.pop(bar);
}
- }
-
- try {
- Constants.reload();
} catch (Exception e) {
e.printStackTrace();
+ } finally {
+ if (dialog != null) dialog.dispose();
}
+ return true;
});
+ }
- File items = new File(repoLocation, "items");
- if (items.exists()) {
- File[] itemFiles = new File(repoLocation, "items").listFiles();
- if (itemFiles != null) {
- ProgressManager.ProgressBar bar = ProgressManager.push("Loading items", itemFiles.length);
- for (File f : itemFiles) {
- String internalname = f.getName().substring(0, f.getName().length() - 5);
- bar.step(internalname);
- synchronized (itemMap) {
- if (!itemMap.containsKey(internalname)) {
- loadItem(internalname);
- }
- }
- }
- ProgressManager.pop(bar);
- }
- }
-
- try {
- Constants.reload();
- } catch (Exception e) {
- e.printStackTrace();
+ /**
+ * Called when the game is first loaded. Compares the local repository to the github repository and handles the
+ * downloading of new/updated files. This then calls the "loadItem" method for every item in the local repository.
+ */
+ public void loadItemInformation() {
+ if (NotEnoughUpdates.INSTANCE.config.hidden.autoupdate) {
+ fetchRepository().thenAccept(i -> {
+ reloadRepository();
+ });
+ } else {
+ reloadRepository();
}
}
@@ -436,6 +386,10 @@ public class NEUManager {
for (Ingredient input : recipe.getIngredients()) {
usagesMap.computeIfAbsent(input.getInternalItemId(), ignored -> new HashSet<>()).add(recipe);
}
+ for (Ingredient catalystItem : recipe.getCatalystItems()) {
+ recipesMap.computeIfAbsent(catalystItem.getInternalItemId(), ignored -> new HashSet<>()).add(recipe);
+ usagesMap.computeIfAbsent(catalystItem.getInternalItemId(), ignored -> new HashSet<>()).add(recipe);
+ }
}
public Set getRecipesFor(String internalName) {
@@ -1555,20 +1509,25 @@ public class NEUManager {
}
public void reloadRepository() {
- File items = new File(repoLocation, "items");
- if (items.exists()) {
- recipes.clear();
- recipesMap.clear();
- usagesMap.clear();
-
- File[] itemFiles = new File(repoLocation, "items").listFiles();
- if (itemFiles != null) {
- for (File f : itemFiles) {
- String internalname = f.getName().substring(0, f.getName().length() - 5);
- loadItem(internalname);
+ Minecraft.getMinecraft().addScheduledTask(() -> {
+ File items = new File(repoLocation, "items");
+ if (items.exists()) {
+ recipes.clear();
+ recipesMap.clear();
+ usagesMap.clear();
+
+ File[] itemFiles = new File(repoLocation, "items").listFiles();
+ if (itemFiles != null) {
+ for (File f : itemFiles) {
+ String internalname = f.getName().substring(0, f.getName().length() - 5);
+ loadItem(internalname);
+ }
}
}
- }
+
+ new RepositoryReloadEvent(repoLocation, !hasBeenLoadedBefore).post();
+ hasBeenLoadedBefore = true;
+ });
}
public ItemStack createItem(String internalname) {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java
index d3efc06a..99dce3bb 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java
@@ -87,6 +87,36 @@ import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.ascending_overlay;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.close;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.descending_overlay;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.help;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.itemPaneTabArrow;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.item_haschild;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.item_mask;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.order_alphabetical;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.order_alphabetical_active;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.order_rarity;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.order_rarity_active;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.order_value;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.order_value_active;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.quickcommand_background;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.rightarrow;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.rightarrow_overlay;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.settings;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_accessory;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_accessory_active;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_all;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_all_active;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_armor;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_armor_active;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_mob;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_mob_active;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_pet;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_pet_active;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_tool;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.sort_tool_active;
+
public class NEUOverlay extends Gui {
private static final ResourceLocation SUPERGEHEIMNISVERMOGEN = new ResourceLocation(
"notenoughupdates:supersecretassets/bald.png");
@@ -137,7 +167,7 @@ public class NEUOverlay extends Gui {
private final NEUManager manager;
- private final String mobRegex = ".*?((_MONSTER)|(_ANIMAL)|(_MINIBOSS)|(_BOSS)|(_SC))$";
+ private final String mobRegex = ".*?((_MONSTER)|(_NPC)|(_ANIMAL)|(_MINIBOSS)|(_BOSS)|(_SC))$";
private final String petRegex = ".*?;[0-5]$";
private final ResourceLocation[] sortIcons = new ResourceLocation[]{
@@ -211,7 +241,7 @@ public class NEUOverlay extends Gui {
private boolean redrawItems = false;
private boolean searchBarHasFocus = false;
- private final GuiTextField textField = new GuiTextField(0, null, 0, 0, 0, 0);
+ private static final GuiTextField textField = new GuiTextField(0, null, 0, 0, 0, 0);
private static final int COMPARE_MODE_ALPHABETICAL = 0;
private static final int COMPARE_MODE_RARITY = 1;
@@ -977,7 +1007,7 @@ public class NEUOverlay extends Gui {
return paddingUnscaled;
}
- public GuiTextField getTextField() {
+ public static GuiTextField getTextField() {
return textField;
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
index 6d4e0d02..d08968c3 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
@@ -26,6 +26,7 @@ import io.github.moulberry.notenoughupdates.miscfeatures.ItemCooldowns;
import io.github.moulberry.notenoughupdates.miscfeatures.ItemCustomizeManager;
import io.github.moulberry.notenoughupdates.miscfeatures.MiningStuff;
import io.github.moulberry.notenoughupdates.miscfeatures.NPCRetexturing;
+import io.github.moulberry.notenoughupdates.miscfeatures.Navigation;
import io.github.moulberry.notenoughupdates.miscfeatures.NullzeeSphere;
import io.github.moulberry.notenoughupdates.miscfeatures.PetInfoOverlay;
import io.github.moulberry.notenoughupdates.miscfeatures.SlotLocking;
@@ -42,6 +43,7 @@ import io.github.moulberry.notenoughupdates.overlays.FuelBar;
import io.github.moulberry.notenoughupdates.overlays.OverlayManager;
import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer;
import io.github.moulberry.notenoughupdates.recipes.RecipeGenerator;
+import io.github.moulberry.notenoughupdates.util.Constants;
import io.github.moulberry.notenoughupdates.util.SBInfo;
import io.github.moulberry.notenoughupdates.util.Utils;
import io.github.moulberry.notenoughupdates.util.XPInformation;
@@ -139,6 +141,7 @@ public class NotEnoughUpdates {
public NEUManager manager;
public NEUOverlay overlay;
public NEUConfig config;
+ public Navigation navigation = new Navigation(this);
public GuiScreen openGui = null;
public long lastOpenedGui = 0;
public Commands commands;
@@ -215,6 +218,7 @@ public class NotEnoughUpdates {
MinecraftForge.EVENT_BUS.register(new CalendarOverlay());
MinecraftForge.EVENT_BUS.register(SBInfo.getInstance());
MinecraftForge.EVENT_BUS.register(CustomItemEffects.INSTANCE);
+ MinecraftForge.EVENT_BUS.register(new Constants());
MinecraftForge.EVENT_BUS.register(new DungeonMap());
MinecraftForge.EVENT_BUS.register(new SunTzu());
MinecraftForge.EVENT_BUS.register(new MiningStuff());
@@ -237,6 +241,7 @@ public class NotEnoughUpdates {
MinecraftForge.EVENT_BUS.register(new ItemTooltipListener(this));
MinecraftForge.EVENT_BUS.register(new RenderListener(this));
MinecraftForge.EVENT_BUS.register(new OldAnimationChecker());
+ MinecraftForge.EVENT_BUS.register(navigation);
if (Minecraft.getMinecraft().getResourceManager() instanceof IReloadableResourceManager) {
IReloadableResourceManager manager = (IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager();
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 27944c92..478f4db7 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
@@ -1,4 +1,4 @@
- package io.github.moulberry.notenoughupdates.commands.dev;
+package io.github.moulberry.notenoughupdates.commands.dev;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
@@ -10,6 +10,7 @@ import io.github.moulberry.notenoughupdates.miscfeatures.customblockzones.Specia
import io.github.moulberry.notenoughupdates.miscgui.GuiPriceGraph;
import io.github.moulberry.notenoughupdates.util.SBInfo;
import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.GuiScreen;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommandSender;
import net.minecraft.util.BlockPos;
@@ -24,7 +25,18 @@ import java.util.List;
public class DevTestCommand extends ClientCommandBase {
private static final List DEV_TESTERS =
- Arrays.asList("moulberry", "lucycoconut", "ironm00n", "ariyio", "throwpo", "lrg89", "dediamondpro", "lulonaut", "craftyoldminer");
+ Arrays.asList(
+ "moulberry",
+ "lucycoconut",
+ "ironm00n",
+ "ariyio",
+ "throwpo",
+ "lrg89",
+ "dediamondpro",
+ "lulonaut",
+ "craftyoldminer",
+ "eisengolem"
+ );
private static final String[] DEV_FAIL_STRINGS = {
"No.",
@@ -132,6 +144,16 @@ public class DevTestCommand extends ClientCommandBase {
"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));
+ } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | ClassCastException e) {
+ e.printStackTrace();
+ Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("Failed to open this gui."));
+ }
+ }
if (args.length == 1 && args[0].equalsIgnoreCase("center")) {
double x = Math.floor(Minecraft.getMinecraft().thePlayer.posX) + 0.5f;
double z = Math.floor(Minecraft.getMinecraft().thePlayer.posZ) + 0.5f;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/repo/ReloadRepoCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/repo/ReloadRepoCommand.java
index e363b59f..c4ef8c2c 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/repo/ReloadRepoCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/repo/ReloadRepoCommand.java
@@ -3,7 +3,6 @@ package io.github.moulberry.notenoughupdates.commands.repo;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
import io.github.moulberry.notenoughupdates.options.NEUConfig;
-import io.github.moulberry.notenoughupdates.util.Constants;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommandSender;
@@ -20,9 +19,11 @@ public class ReloadRepoCommand extends ClientCommandBase {
@Override
public void processCommand(ICommandSender sender, String[] args) throws CommandException {
- NotEnoughUpdates.INSTANCE.manager.reloadRepository();
- Constants.reload();
-
+ if (args.length > 1 && args[0].equals("fetch")) {
+ NotEnoughUpdates.INSTANCE.manager.fetchRepository();
+ } else {
+ NotEnoughUpdates.INSTANCE.manager.reloadRepository();
+ }
NotEnoughUpdates.INSTANCE.newConfigFile();
if (NotEnoughUpdates.INSTANCE.getConfigFile().exists()) {
try (
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/repo/RepoModeCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/repo/RepoModeCommand.java
index a8f53460..46156a47 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/repo/RepoModeCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/repo/RepoModeCommand.java
@@ -5,7 +5,9 @@ import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
import net.minecraft.client.Minecraft;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommandSender;
+import net.minecraft.event.ClickEvent;
import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.ChatStyle;
public class RepoModeCommand extends ClientCommandBase {
@@ -33,10 +35,17 @@ public class RepoModeCommand extends ClientCommandBase {
githubBranch = args[3];
}
}
- NotEnoughUpdates.INSTANCE.config.hidden.repoURL = "https://github.com/" + githubUser + "/" + githubRepo + "/archive/" + githubBranch + ".zip";
- NotEnoughUpdates.INSTANCE.config.hidden.repoCommitsURL = "https://api.github.com/repos/" + githubUser + "/" + githubRepo + "/commits/" + githubBranch;
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("\u00a75Set NEU repo URL to " + NotEnoughUpdates.INSTANCE.config.hidden.repoURL +
- "\n\u00a75Set NEU repo commits URL to " + NotEnoughUpdates.INSTANCE.config.hidden.repoCommitsURL));
+ NotEnoughUpdates.INSTANCE.config.hidden.repoURL =
+ "https://github.com/" + githubUser + "/" + githubRepo + "/archive/" + githubBranch + ".zip";
+ NotEnoughUpdates.INSTANCE.config.hidden.repoCommitsURL =
+ "https://api.github.com/repos/" + githubUser + "/" + githubRepo + "/commits/" + githubBranch;
+ Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
+ "\u00a75Set NEU repo URL to " + NotEnoughUpdates.INSTANCE.config.hidden.repoURL +
+ "\n\u00a75Set NEU repo commits URL to " + NotEnoughUpdates.INSTANCE.config.hidden.repoCommitsURL));
+ Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("\u00a75Run <")
+ .appendSibling(new ChatComponentText("/neureloadrepo fetch").setChatStyle(new ChatStyle().setChatClickEvent(new ClickEvent(
+ ClickEvent.Action.SUGGEST_COMMAND, "/neureloadrepo fetch"))))
+ .appendSibling(new ChatComponentText("\u00a75> to redownload your repo.")));
} else {
Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("\u00a7cUsage:" +
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/RenderUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/RenderUtils.java
index d7fd7907..96e9729f 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/RenderUtils.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/RenderUtils.java
@@ -13,11 +13,20 @@ import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.entity.Entity;
-import net.minecraft.util.*;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.Vec3i;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL14;
import org.lwjgl.util.vector.Vector3f;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
public class RenderUtils {
public static void drawFloatingRectDark(int x, int y, int width, int height) {
drawFloatingRectDark(x, y, width, height, true);
@@ -345,11 +354,19 @@ public class RenderUtils {
}
}
- public static void renderWayPoint(String str, BlockPos loc, float partialTicks) {
+ public static void renderWayPoint(String str, Vec3i loc, float partialTicks) {
+ renderWayPoint(str, new Vector3f(loc.getX(), loc.getY(), loc.getZ()), partialTicks);
+ }
+
+ public static void renderWayPoint(List str, Vec3i loc, float partialTicks) {
renderWayPoint(str, new Vector3f(loc.getX(), loc.getY(), loc.getZ()), partialTicks);
}
public static void renderWayPoint(String str, Vector3f loc, float partialTicks) {
+ renderWayPoint(Arrays.asList(str), loc, partialTicks);
+ }
+
+ public static void renderWayPoint(List lines, Vector3f loc, float partialTicks) {
GlStateManager.alphaFunc(516, 0.1F);
GlStateManager.pushMatrix();
@@ -373,15 +390,9 @@ public class RenderUtils {
GlStateManager.translate(x, y, z);
GlStateManager.translate(0, viewer.getEyeHeight(), 0);
- renderNametag(str);
-
- GlStateManager.rotate(-Minecraft.getMinecraft().getRenderManager().playerViewY, 0.0F, 1.0F, 0.0F);
- GlStateManager.rotate(Minecraft.getMinecraft().getRenderManager().playerViewX, 1.0F, 0.0F, 0.0F);
- GlStateManager.translate(0, -0.25f, 0);
- GlStateManager.rotate(-Minecraft.getMinecraft().getRenderManager().playerViewX, 1.0F, 0.0F, 0.0F);
- GlStateManager.rotate(Minecraft.getMinecraft().getRenderManager().playerViewY, 0.0F, 1.0F, 0.0F);
-
- renderNametag(EnumChatFormatting.YELLOW.toString() + Math.round(dist) + "m");
+ lines = new ArrayList<>(lines);
+ lines.add(EnumChatFormatting.YELLOW.toString() + Math.round(dist) + "m");
+ renderNametag(lines);
GlStateManager.popMatrix();
@@ -389,6 +400,10 @@ public class RenderUtils {
}
public static void renderNametag(String str) {
+ renderNametag(Arrays.asList(str));
+ }
+
+ public static void renderNametag(List lines) {
FontRenderer fontrenderer = Minecraft.getMinecraft().fontRendererObj;
float f = 1.6F;
float f1 = 0.016666668F * f;
@@ -406,20 +421,23 @@ public class RenderUtils {
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
int i = 0;
- int j = fontrenderer.getStringWidth(str) / 2;
- GlStateManager.disableTexture2D();
- worldrenderer.begin(7, DefaultVertexFormats.POSITION_COLOR);
- worldrenderer.pos(-j - 1, -1 + i, 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
- worldrenderer.pos(-j - 1, 8 + i, 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
- worldrenderer.pos(j + 1, 8 + i, 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
- worldrenderer.pos(j + 1, -1 + i, 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
- tessellator.draw();
- GlStateManager.enableTexture2D();
- fontrenderer.drawString(str, -fontrenderer.getStringWidth(str) / 2, i, 553648127);
- GlStateManager.depthMask(true);
-
- fontrenderer.drawString(str, -fontrenderer.getStringWidth(str) / 2, i, -1);
-
+ for (String str : lines) {
+ int j = fontrenderer.getStringWidth(str) / 2;
+
+ GlStateManager.disableTexture2D();
+ worldrenderer.begin(7, DefaultVertexFormats.POSITION_COLOR);
+ worldrenderer.pos(-j - 1, -1 + i, 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
+ worldrenderer.pos(-j - 1, 8 + i, 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
+ worldrenderer.pos(j + 1, 8 + i, 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
+ worldrenderer.pos(j + 1, -1 + i, 0.0D).color(0.0F, 0.0F, 0.0F, 0.25F).endVertex();
+ tessellator.draw();
+ GlStateManager.enableTexture2D();
+ fontrenderer.drawString(str, -fontrenderer.getStringWidth(str) / 2, i, 553648127);
+ GlStateManager.depthMask(true);
+
+ fontrenderer.drawString(str, -fontrenderer.getStringWidth(str) / 2, i, -1);
+ GlStateManager.translate(0, 10f, 0);
+ }
GlStateManager.enableDepth();
GlStateManager.enableBlend();
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/events/RepositoryReloadEvent.java b/src/main/java/io/github/moulberry/notenoughupdates/events/RepositoryReloadEvent.java
new file mode 100644
index 00000000..b0ffc3e7
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/events/RepositoryReloadEvent.java
@@ -0,0 +1,21 @@
+package io.github.moulberry.notenoughupdates.events;
+
+import java.io.File;
+
+public class RepositoryReloadEvent extends NEUEvent {
+ private final File baseFile;
+ private boolean isFirstLoad;
+
+ public RepositoryReloadEvent(File baseFile, boolean isFirstLoad) {
+ this.baseFile = baseFile;
+ this.isFirstLoad = isFirstLoad;
+ }
+
+ public boolean isFirstLoad() {
+ return isFirstLoad;
+ }
+
+ public File getRepositoryRoot() {
+ return baseFile;
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/NEUItemEditor.java b/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/NEUItemEditor.java
index 0392c32f..9f256d65 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/NEUItemEditor.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/NEUItemEditor.java
@@ -14,7 +14,11 @@ import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.*;
+import net.minecraft.nbt.JsonToNBT;
+import net.minecraft.nbt.NBTException;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.nbt.NBTTagString;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
@@ -27,7 +31,11 @@ import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;
-import static io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField.*;
+import static io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField.COLOUR;
+import static io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField.FORCE_CAPS;
+import static io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField.MULTILINE;
+import static io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField.NO_SPACE;
+import static io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField.NUM_ONLY;
public class NEUItemEditor extends GuiScreen {
private final NEUManager manager;
@@ -52,6 +60,7 @@ public class NEUItemEditor extends GuiScreen {
private final Supplier clickcommand;
private final Supplier damage;
private NBTTagCompound nbttag;
+ private boolean hasChanges = false;
public NEUItemEditor(NEUManager manager, String internalname, JsonObject item) {
this.manager = manager;
@@ -295,6 +304,11 @@ public class NEUItemEditor extends GuiScreen {
@Override
protected void keyTyped(char typedChar, int keyCode) {
+ if (keyCode == Keyboard.KEY_ESCAPE && !hasChanges) {
+ Minecraft.getMinecraft().displayGuiScreen(null);
+ return;
+ }
+
for (GuiElement gui : options) {
gui.keyTyped(typedChar, keyCode);
}
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 54154955..6df2dd9a 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java
@@ -33,6 +33,7 @@ import io.github.moulberry.notenoughupdates.overlays.TextOverlay;
import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer;
import io.github.moulberry.notenoughupdates.util.NotificationHandler;
import io.github.moulberry.notenoughupdates.util.RequestFocusListener;
+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;
@@ -55,6 +56,7 @@ import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.StringUtils;
import net.minecraftforge.client.ClientCommandHandler;
import net.minecraftforge.client.event.GuiOpenEvent;
import net.minecraftforge.client.event.GuiScreenEvent;
@@ -74,16 +76,17 @@ import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
import java.text.NumberFormat;
import java.util.ConcurrentModificationException;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
+import java.util.TreeMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@@ -107,6 +110,10 @@ public class RenderListener {
private long buttonHoveredMillis = 0;
private int inventoryLoadedTicks = 0;
private String loadedInvName = "";
+ //NPC parsing
+ private String correctingItem;
+ private boolean typing;
+ private HashMap cachedDefinitions;
public RenderListener(NotEnoughUpdates neu) {
this.neu = neu;
@@ -1011,6 +1018,9 @@ public class RenderListener {
*/
@SubscribeEvent
public void onGuiScreenKeyboard(GuiScreenEvent.KeyboardInputEvent.Pre event) {
+ if (typing) {
+ event.setCanceled(true);
+ }
if (Keyboard.isKeyDown(Keyboard.KEY_B) && NotEnoughUpdates.INSTANCE.config.hidden.dev) {
if (Minecraft.getMinecraft().currentScreen instanceof GuiChest) {
GuiChest eventGui = (GuiChest) Minecraft.getMinecraft().currentScreen;
@@ -1094,7 +1104,7 @@ public class RenderListener {
try {
try (
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
- new FileOutputStream(file),
+ Files.newOutputStream(file.toPath()),
StandardCharsets.UTF_8
))
) {
@@ -1112,6 +1122,141 @@ public class RenderListener {
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) {
+ Minecraft mc = Minecraft.getMinecraft();
+
+ if (typing) {
+ typing = false;
+ cachedDefinitions.put(correctingItem, NEUOverlay.getTextField().getText());
+ NEUOverlay.getTextField().setText("");
+ }
+
+ if (Minecraft.getMinecraft().currentScreen instanceof GuiChest) {
+ GuiChest eventGui = (GuiChest) Minecraft.getMinecraft().currentScreen;
+ ContainerChest cc = (ContainerChest) eventGui.inventorySlots;
+ IInventory lower = cc.getLowerChestInventory();
+
+ try {
+ JsonObject newNPC = new JsonObject();
+ String displayname = lower.getDisplayName().getUnformattedText();
+ File file = new File(
+ Minecraft.getMinecraft().mcDataDir.getAbsolutePath(),
+ "config" + File.separator + "notenoughupdates" +
+ File.separator + "repo" + File.separator + "npc" + File.separator +
+ displayname.toUpperCase().replace(" ", "_") + ".json"
+ );
+ newNPC.add("itemid", new JsonPrimitive("minecraft:skull"));
+ newNPC.add("displayname", new JsonPrimitive("§9" + displayname + " (NPC)"));
+ newNPC.add("nbttag", new JsonPrimitive("TODO"));
+ newNPC.add("damage", new JsonPrimitive(3));
+
+ JsonArray newArray = new JsonArray();
+ newArray.add(new JsonPrimitive(""));
+ newNPC.add("lore", newArray);
+ newNPC.add("internalname", new JsonPrimitive(displayname.toUpperCase().replace(" ", "_") + "_NPC"));
+ newNPC.add("clickcommand", new JsonPrimitive("viewrecipe"));
+ newNPC.add("modver", new JsonPrimitive(NotEnoughUpdates.VERSION));
+ newNPC.add("infoType", new JsonPrimitive("WIKI_URL"));
+ JsonArray emptyInfoArray = new JsonArray();
+ emptyInfoArray.add(new JsonPrimitive("TODO"));
+ newNPC.add("info", emptyInfoArray);
+ newNPC.add("x", new JsonPrimitive((int) mc.thePlayer.posX));
+ newNPC.add("y", new JsonPrimitive((int) mc.thePlayer.posY + 2));
+ newNPC.add("z", new JsonPrimitive((int) mc.thePlayer.posZ));
+ newNPC.add("island", new JsonPrimitive(SBInfo.getInstance().getLocation()));
+
+ JsonArray recipesArray = new JsonArray();
+
+ TreeMap itemInformation = NotEnoughUpdates.INSTANCE.manager.getItemInformation();
+ for (int i = 0; i < 45; i++) {
+ ItemStack stack = lower.getStackInSlot(i);
+ if (stack == null) continue;
+ if (stack.getDisplayName().isEmpty() || stack.getDisplayName().equals(" ")) continue;
+
+ String internalname = NotEnoughUpdates.INSTANCE.manager.getInternalnameFromNBT(stack.getTagCompound());
+ if (internalname == null) continue;
+ JsonObject currentRecipe = new JsonObject();
+ currentRecipe.add("type", new JsonPrimitive("npc_shop"));
+ JsonArray costArray = new JsonArray();
+ boolean inCost = false;
+ for (String s : NotEnoughUpdates.INSTANCE.manager.getLoreFromNBT(stack.getTagCompound())) {
+ if (s.equals("§7Cost")) {
+ inCost = true;
+ continue;
+ } else if (s.equals("§eClick to trade!")) {
+ inCost = false;
+ }
+ if (!inCost) continue;
+ String entry = StringUtils.stripControlCodes(s);
+ if (entry.isEmpty()) continue;
+ int coinIndex = entry.indexOf(" Coins");
+ if (coinIndex != -1) {
+ String amountString = entry.substring(0, coinIndex).replace(",", "");
+ costArray.add(new JsonPrimitive("SKYBLOCK_COIN:" + amountString));
+ } else {
+ if (cachedDefinitions == null) {
+ cachedDefinitions = new HashMap<>();
+ }
+
+ String item;
+ int amountIndex = entry.lastIndexOf(" x");
+ String amountString;
+ if (amountIndex == -1) {
+ amountString = "1";
+ item = entry.replace(" ", "_").toUpperCase();
+ } else {
+ amountString = entry.substring(amountIndex);
+ item = entry.substring(0, amountIndex).replace(" ", "_").toUpperCase();
+ }
+ amountString = amountString.replace(",", "").replace("x", "").trim();
+ if (itemInformation.containsKey(item)) {
+ costArray.add(new JsonPrimitive(item + ":" + amountString));
+ } 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."));
+ NEUOverlay.getTextField().setText(item);
+ event.setCanceled(true);
+ typing = true;
+ correctingItem = item;
+ if (cachedDefinitions == null) {
+ cachedDefinitions = new HashMap<>();
+ }
+ return;
+ }
+ }
+ }
+ currentRecipe.add("cost", costArray);
+ currentRecipe.add("result", new JsonPrimitive(internalname));
+ recipesArray.add(currentRecipe);
+ newNPC.add("recipes", recipesArray);
+ }
+ Gson gson = new GsonBuilder().setPrettyPrinting().create();
+ System.out.println(gson.toJson(newNPC));
+ try {
+ //noinspection ResultOfMethodCallIgnored
+ file.createNewFile();
+ try (
+ BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
+ Files.newOutputStream(file.toPath()),
+ StandardCharsets.UTF_8
+ ))
+ ) {
+ writer.write(gson.toJson(newNPC));
+ Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
+ EnumChatFormatting.AQUA + "Parsed and saved: " + EnumChatFormatting.WHITE + displayname));
+ }
+ } catch (IOException ignored) {
+ Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
+ 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"));
+ }
+ }
}
if (AuctionBINWarning.getInstance().shouldShow()) {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/Navigation.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/Navigation.java
new file mode 100644
index 00000000..3419b8c4
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/Navigation.java
@@ -0,0 +1,398 @@
+package io.github.moulberry.notenoughupdates.miscfeatures;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
+import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils;
+import io.github.moulberry.notenoughupdates.events.RepositoryReloadEvent;
+import io.github.moulberry.notenoughupdates.listener.RenderListener;
+import io.github.moulberry.notenoughupdates.miscfeatures.customblockzones.LocationChangeEvent;
+import io.github.moulberry.notenoughupdates.miscgui.GuiNavigation;
+import io.github.moulberry.notenoughupdates.util.ItemUtils;
+import io.github.moulberry.notenoughupdates.util.JsonUtils;
+import io.github.moulberry.notenoughupdates.util.NotificationHandler;
+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.client.gui.inventory.GuiChest;
+import net.minecraft.inventory.ContainerChest;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.Vec3i;
+import net.minecraftforge.client.event.RenderWorldLastEvent;
+import net.minecraftforge.event.entity.EntityJoinWorldEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.gameevent.InputEvent;
+import net.minecraftforge.fml.common.gameevent.TickEvent;
+import org.lwjgl.input.Keyboard;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+public class Navigation {
+
+ private List teleporters = new ArrayList<>();
+ private Map areaNames = new HashMap<>();
+ private Map warps = new HashMap<>();
+ private Map waypoints = new HashMap<>();
+
+ public Map getWaypoints() {
+ return waypoints;
+ }
+
+ public static class WarpPoint {
+ public final BlockPos blockPos;
+ public final String warpName, modeName;
+
+ public WarpPoint(double x, double y, double z, String warpName, String modeName) {
+ this.blockPos = new BlockPos(x, y, z);
+ this.warpName = warpName;
+ this.modeName = modeName;
+ }
+ }
+
+ public static class Teleporter {
+ public final double x, y, z;
+ public final String from, to;
+
+ public Teleporter(double x, double y, double z, String from, String to) {
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ this.from = from;
+ this.to = to;
+ }
+ }
+
+ private NotEnoughUpdates neu;
+
+ public Navigation(NotEnoughUpdates notEnoughUpdates) {
+ neu = notEnoughUpdates;
+ }
+
+ /* JsonObject (x,y,z,island,displayname) */
+ private JsonObject currentlyTrackedWaypoint = null;
+ private BlockPos position = null;
+ private String island = null;
+ private String displayName = null;
+ private String internalname = null;
+ private String warpAgainTo = null;
+ private int lastInvHashcode = 0;
+ private Instant warpAgainTiming = null;
+
+ private Teleporter nextTeleporter = null;
+
+ public boolean isValidWaypoint(JsonObject object) {
+ return object.has("x")
+ && object.has("y")
+ && object.has("z")
+ && object.has("island")
+ && object.has("displayname")
+ && object.has("internalname");
+ }
+
+ public void trackWaypoint(String trackNow) {
+ if (trackNow == null) {
+ trackWaypoint((JsonObject) null);
+ } else {
+ JsonObject jsonObject = waypoints.get(trackNow);
+ if (jsonObject == null) {
+ showError(
+ "Could not track waypoint " + trackNow + ". This is likely due to an outdated or broken repository.",
+ true
+ );
+ return;
+ }
+ trackWaypoint(jsonObject);
+ }
+ }
+
+ public void trackWaypoint(JsonObject trackNow) {
+ if (trackNow != null && !isValidWaypoint(trackNow)) {
+ showError("Could not track waypoint. This is likely due to an outdated or broken repository.", true);
+ return;
+ }
+ if (!neu.config.hidden.hasOpenedWaypointMenu)
+ NotificationHandler.displayNotification(Arrays.asList(
+ "You just tracked a waypoint.",
+ "Press [N] to open the waypoint menu to untrack it",
+ "or to find other waypoints to track.",
+ "Press [X] to close this message."
+ ), true, false);
+ currentlyTrackedWaypoint = trackNow;
+ updateData();
+ }
+
+ @SubscribeEvent
+ public void onRepositoryReload(RepositoryReloadEvent event) {
+ JsonObject obj = Utils.getConstant("islands", neu.manager.gson);
+ List teleporters = JsonUtils.getJsonArrayOrEmpty(obj, "teleporters", jsonElement -> {
+ JsonObject teleporterObj = jsonElement.getAsJsonObject();
+ return new Teleporter(
+ teleporterObj.get("x").getAsDouble(),
+ teleporterObj.get("y").getAsDouble(),
+ teleporterObj.get("z").getAsDouble(),
+ teleporterObj.get("from").getAsString(),
+ teleporterObj.get("to").getAsString()
+ );
+ });
+ for (Teleporter teleporter : teleporters) {
+ if (teleporter.from.equals(teleporter.to)) {
+ showError("Found self referencing teleporter: " + teleporter.from, true);
+ }
+ }
+ this.teleporters = teleporters;
+ this.waypoints = NotEnoughUpdates.INSTANCE.manager
+ .getItemInformation().values().stream()
+ .filter(this::isValidWaypoint)
+ .collect(Collectors.toMap(it -> it.get("internalname").getAsString(), it -> it));
+ this.areaNames = JsonUtils.transformJsonObjectToMap(obj.getAsJsonObject("area_names"), JsonElement::getAsString);
+ this.warps = JsonUtils.getJsonArrayOrEmpty(obj, "island_warps", jsonElement -> {
+ JsonObject warpObject = jsonElement.getAsJsonObject();
+ return new WarpPoint(
+ warpObject.get("x").getAsDouble(),
+ warpObject.get("y").getAsDouble(),
+ warpObject.get("z").getAsDouble(),
+ warpObject.get("warp").getAsString(),
+ warpObject.get("mode").getAsString()
+ );
+ }).stream().collect(Collectors.toMap(it -> it.warpName, it -> it));
+ }
+
+ @SubscribeEvent
+ public void onKeybindPressed(InputEvent.KeyInputEvent event) {
+ if (!Keyboard.getEventKeyState()) return;
+ int key = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() + 256 : Keyboard.getEventKey();
+ if (neu.config.misc.keybindWaypoint == key) {
+ if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT)) {
+ if (currentlyTrackedWaypoint != null) {
+ useWarpCommand();
+ }
+ } else {
+ Minecraft.getMinecraft().displayGuiScreen(new GuiNavigation());
+ }
+ }
+ }
+
+ @SubscribeEvent
+ public void onGuiTick(TickEvent.ClientTickEvent event) {
+ if (event.phase != TickEvent.Phase.START) return;
+ if (Minecraft.getMinecraft().theWorld == null) return;
+ if (Minecraft.getMinecraft().thePlayer == null) return;
+
+ if (Minecraft.getMinecraft().currentScreen instanceof GuiChest && RenderListener.inventoryLoaded) {
+ GuiChest currentScreen = (GuiChest) Minecraft.getMinecraft().currentScreen;
+ ContainerChest container = (ContainerChest) currentScreen.inventorySlots;
+ if (container.getLowerChestInventory().getDisplayName().getUnformattedText().equals("Fast Travel")) {
+ int hashCode = container.getInventory().hashCode();
+ if (hashCode == lastInvHashcode) return;
+ lastInvHashcode = hashCode;
+ for (ItemStack stackInSlot : container.getInventory()) {
+ if (stackInSlot == null) continue;
+ List lore = ItemUtils.getLore(stackInSlot);
+ if (lore.isEmpty())
+ continue;
+ String warpLine = Utils.cleanColour(lore.get(0));
+ if (!warpLine.startsWith("/warp ")) continue;
+ String warpName = warpLine.substring(6);
+ boolean isUnlocked = !lore.contains("§cWarp not unlocked!");
+ neu.config.getProfileSpecific().unlockedWarpScrolls.put(warpName, isUnlocked);
+ }
+ }
+ }
+ }
+
+ public Map getWarps() {
+ return warps;
+ }
+
+ public WarpPoint getClosestWarp(String mode, Vec3i position, boolean checkAvailable) {
+ double minDistance = -1;
+ HashMap unlockedWarpScrolls = neu.config.getProfileSpecific().unlockedWarpScrolls;
+ WarpPoint minWarp = null;
+ for (WarpPoint value : warps.values()) {
+ if (value.modeName.equals(mode)) {
+ if (checkAvailable && !unlockedWarpScrolls.getOrDefault(value.warpName, false))
+ continue;
+ double distance = value.blockPos.distanceSq(position);
+ if (distance < minDistance || minWarp == null) {
+ minDistance = distance;
+ minWarp = value;
+ }
+ }
+ }
+ return minWarp;
+ }
+
+ public void useWarpCommand() {
+ EntityPlayerSP thePlayer = Minecraft.getMinecraft().thePlayer;
+ if (currentlyTrackedWaypoint == null || thePlayer == null) return;
+ WarpPoint closestWarp = getClosestWarp(island, position, true);
+ if (closestWarp == null) {
+ showError("Could not find an unlocked warp that could be used.", false);
+ return;
+ }
+
+ if (!island.equals(SBInfo.getInstance().mode)) {
+ warpAgainTiming = Instant.now();
+ warpAgainTo = closestWarp.warpName;
+ } else if (thePlayer.getDistanceSq(position) < closestWarp.blockPos.distanceSq(position)) {
+ showError("You are already on the same island and nearer than the closest unlocked warp scroll.", false);
+ return;
+ }
+ thePlayer.sendChatMessage("/warp " + closestWarp.warpName);
+ }
+
+ @SubscribeEvent
+ public void onTeleportDone(EntityJoinWorldEvent event) {
+ if (neu.config.misc.warpTwice
+ && event.entity == Minecraft.getMinecraft().thePlayer
+ && warpAgainTo != null
+ && warpAgainTiming != null
+ && warpAgainTiming.plusSeconds(1).isAfter(Instant.now())) {
+ warpAgainTiming = null;
+ String savedWarpAgain = warpAgainTo;
+ warpAgainTo = null;
+ Minecraft.getMinecraft().thePlayer.sendChatMessage("/warp " + savedWarpAgain);
+ }
+ }
+
+ public String getNameForAreaMode(String mode) {
+ return areaNames.get(mode);
+ }
+
+ public String getNameForAreaModeOrUnknown(String mode) {
+ return areaNames.getOrDefault(mode, "Unknown");
+ }
+
+ public void untrackWaypoint() {
+ trackWaypoint((JsonObject) null);
+ }
+
+ public JsonObject getTrackedWaypoint() {
+ return currentlyTrackedWaypoint;
+ }
+
+ public String getIsland() {
+ return island;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public BlockPos getPosition() {
+ return position;
+ }
+
+ public String getInternalname() {
+ return internalname;
+ }
+
+ private void updateData() {
+ if (currentlyTrackedWaypoint == null) {
+ position = null;
+ island = null;
+ displayName = null;
+ nextTeleporter = null;
+ internalname = null;
+ return;
+ }
+ position = new BlockPos(
+ currentlyTrackedWaypoint.get("x").getAsDouble(),
+ currentlyTrackedWaypoint.get("y").getAsDouble(),
+ currentlyTrackedWaypoint.get("z").getAsDouble()
+ );
+ internalname = currentlyTrackedWaypoint.get("internalname").getAsString();
+ island = currentlyTrackedWaypoint.get("island").getAsString();
+ displayName = currentlyTrackedWaypoint.get("displayname").getAsString();
+ recalculateNextTeleporter(SBInfo.getInstance().mode);
+ }
+
+ @SubscribeEvent
+ public void onLocationChange(LocationChangeEvent event) {
+ recalculateNextTeleporter(event.newLocation);
+ }
+
+ public Teleporter recalculateNextTeleporter(String from) {
+ String to = island;
+ if (from == null || to == null) return null;
+ List nextTeleporter = findNextTeleporter0(from, to, new HashSet<>());
+ if (nextTeleporter == null || nextTeleporter.isEmpty()) {
+ this.nextTeleporter = null;
+ } else {
+ this.nextTeleporter = nextTeleporter.get(0);
+ }
+ return this.nextTeleporter;
+ }
+
+ private List findNextTeleporter0(String from, String to, Set visited) {
+ if (from.equals(to)) return new ArrayList<>();
+ if (visited.contains(from)) return null;
+ visited.add(from);
+ int minPathLength = 0;
+ List minPath = null;
+ for (Teleporter teleporter : teleporters) {
+ if (!teleporter.from.equals(from)) continue;
+ List nextTeleporter0 = findNextTeleporter0(teleporter.to, to, visited);
+ if (nextTeleporter0 == null) continue;
+ if (minPath == null || nextTeleporter0.size() < minPathLength) {
+ minPathLength = nextTeleporter0.size();
+ nextTeleporter0.add(0, teleporter);
+ minPath = nextTeleporter0;
+ }
+ }
+ visited.remove(from);
+ return minPath;
+ }
+
+ 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));
+ if (log)
+ new RuntimeException("[NEU-Waypoint] " + message).printStackTrace();
+ }
+
+ @SubscribeEvent
+ public void onEvent(TickEvent.ClientTickEvent event) {
+ if (event.phase == TickEvent.Phase.END && currentlyTrackedWaypoint != null
+ && NotEnoughUpdates.INSTANCE.config.misc.untrackCloseWaypoints
+ && island.equals(SBInfo.getInstance().mode)) {
+ EntityPlayerSP thePlayer = Minecraft.getMinecraft().thePlayer;
+ if (thePlayer.getDistanceSq(position) < 16)
+ untrackWaypoint();
+ }
+ }
+
+ @SubscribeEvent
+ public void onRenderLast(RenderWorldLastEvent event) {
+ if (currentlyTrackedWaypoint != null) {
+ if (island.equals(SBInfo.getInstance().mode)) {
+ RenderUtils.renderWayPoint(displayName, position, event.partialTicks);
+ } else if (nextTeleporter != null) {
+ String to = nextTeleporter.to;
+ String toName = getNameForAreaModeOrUnknown(to);
+ RenderUtils.renderWayPoint(
+ Arrays.asList("Teleporter to " + toName, "(towards " + displayName + "§r)"),
+ new BlockPos(
+ nextTeleporter.x,
+ nextTeleporter.y,
+ nextTeleporter.z
+ ), event.partialTicks
+ );
+ }
+ }
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemRecipe.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemRecipe.java
index be9ce6c7..129e25e7 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemRecipe.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemRecipe.java
@@ -8,6 +8,7 @@ import io.github.moulberry.notenoughupdates.recipes.RecipeType;
import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.renderer.GlStateManager;
@@ -22,8 +23,11 @@ import org.lwjgl.opengl.GL11;
import java.awt.*;
import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
import java.util.List;
-import java.util.*;
+import java.util.Map;
public class GuiItemRecipe extends GuiScreen {
public static final ResourceLocation resourcePacksTexture = new ResourceLocation("textures/gui/resource_packs.png");
@@ -68,6 +72,13 @@ public class GuiItemRecipe extends GuiScreen {
}
}
+ @Override
+ public void initGui() {
+ this.guiLeft = (width - this.xSize) / 2;
+ this.guiTop = (height - this.ySize) / 2;
+ changeRecipe(0, 0);
+ }
+
public NeuRecipe getCurrentRecipe() {
List currentRecipes = getCurrentRecipeList();
currentIndex = MathHelper.clamp_int(currentIndex, 0, currentRecipes.size() - 1);
@@ -84,8 +95,8 @@ public class GuiItemRecipe extends GuiScreen {
}
public boolean isWithinRect(int x, int y, int topLeftX, int topLeftY, int width, int height) {
- return topLeftX <= x && x <= topLeftX + width
- && topLeftY <= y && y <= topLeftY + height;
+ return topLeftX <= x && x < topLeftX + width
+ && topLeftY <= y && y < topLeftY + height;
}
private ImmutableList getAllRenderedSlots() {
@@ -99,9 +110,6 @@ public class GuiItemRecipe extends GuiScreen {
drawDefaultBackground();
FontRenderer fontRendererObj = Minecraft.getMinecraft().fontRendererObj;
- this.guiLeft = (width - this.xSize) / 2;
- this.guiTop = (height - this.ySize) / 2;
-
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
NeuRecipe currentRecipe = getCurrentRecipe();
@@ -131,7 +139,7 @@ public class GuiItemRecipe extends GuiScreen {
);
currentRecipe.drawExtraInfo(this, mouseX, mouseY);
-
+ super.drawScreen(mouseX, mouseY, partialTicks);
for (RecipeSlot slot : slots) {
if (isWithinRect(mouseX, mouseY, slot.getX(this), slot.getY(this), SLOT_SIZE, SLOT_SIZE)) {
if (slot.getItemStack() == null) continue;
@@ -292,6 +300,18 @@ public class GuiItemRecipe extends GuiScreen {
}
}
+ public void changeRecipe(int tabIndex, int recipeIndex) {
+ buttonList.removeAll(getCurrentRecipe().getExtraButtons(this));
+ currentTab = tabIndex;
+ currentIndex = recipeIndex;
+ buttonList.addAll(getCurrentRecipe().getExtraButtons(this));
+ }
+
+ @Override
+ protected void actionPerformed(GuiButton p_actionPerformed_1_) throws IOException {
+ getCurrentRecipe().actionPerformed(p_actionPerformed_1_);
+ }
+
@Override
protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
super.mouseClicked(mouseX, mouseY, mouseButton);
@@ -310,7 +330,7 @@ public class GuiItemRecipe extends GuiScreen {
BUTTON_HEIGHT
) &&
currentIndex > 0) {
- currentIndex = currentIndex - 1;
+ changeRecipe(currentTab, currentIndex - 1);
Utils.playPressSound();
return;
}
@@ -324,7 +344,7 @@ public class GuiItemRecipe extends GuiScreen {
BUTTON_HEIGHT
) &&
currentIndex < getCurrentRecipeList().size()) {
- currentIndex = currentIndex + 1;
+ changeRecipe(currentTab, currentIndex + 1);
Utils.playPressSound();
return;
}
@@ -338,7 +358,7 @@ public class GuiItemRecipe extends GuiScreen {
TAB_SIZE_X,
TAB_SIZE_Y
)) {
- currentTab = i;
+ changeRecipe(i, currentIndex);
Utils.playPressSound();
return;
}
@@ -349,10 +369,14 @@ public class GuiItemRecipe extends GuiScreen {
ItemStack itemStack = slot.getItemStack();
if (mouseButton == 0) {
manager.displayGuiItemRecipe(manager.getInternalNameForItem(itemStack));
+ return;
} else if (mouseButton == 1) {
manager.displayGuiItemUsages(manager.getInternalNameForItem(itemStack));
+ return;
}
}
}
+
+ currentRecipe.mouseClicked(this, mouseX, mouseY, mouseButton);
}
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiNavigation.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiNavigation.java
new file mode 100644
index 00000000..d34988f6
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiNavigation.java
@@ -0,0 +1,154 @@
+package io.github.moulberry.notenoughupdates.miscgui;
+
+import com.google.gson.JsonObject;
+import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
+import io.github.moulberry.notenoughupdates.core.GuiElementTextField;
+import io.github.moulberry.notenoughupdates.util.Utils;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.util.ResourceLocation;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class GuiNavigation extends GuiScreen {
+
+ public static ResourceLocation BACKGROUND = new ResourceLocation(
+ "notenoughupdates",
+ "textures/gui/navigation.png"
+ );
+
+ public static final int PIN_POSITION_U = 182;
+ public static final int PIN_POSITION_V = 3;
+ public static final int TICK_POSITION_U = 182;
+ public static final int TICK_POSITION_V = 34;
+ public static final int ICON_SIZE = 26;
+
+ public static final int SEARCH_BAR_X = 14;
+ public static final int SEARCH_BAR_Y = 11;
+ public static final int SEARCH_BAR_WIDTH = 151;
+ public static final int SEARCH_BAR_HEIGHT = 24;
+
+ public static final int LIST_START_X = 14;
+ public static final int LIST_START_Y = 43;
+ public static final int LIST_OFFSET_Y = 28;
+ public static final int TEXT_OFFSET_X = 28;
+ public static final int LIST_COUNT = 6;
+
+ List searchResults = new ArrayList<>();
+
+ public int xSize = 176;
+ public int ySize = 222;
+ public int guiLeft, guiTop;
+
+ public GuiElementTextField textField = new GuiElementTextField("", SEARCH_BAR_WIDTH, SEARCH_BAR_HEIGHT, 0);
+
+ @Override
+ public void initGui() {
+ super.initGui();
+ NotEnoughUpdates.INSTANCE.config.hidden.hasOpenedWaypointMenu = true;
+ guiLeft = (width - xSize) / 2;
+ guiTop = (height - ySize) / 2;
+ }
+
+ @Override
+ public void drawScreen(int mouseX, int mouseY, float partialTicks) {
+ drawDefaultBackground();
+ Minecraft.getMinecraft().getTextureManager().bindTexture(BACKGROUND);
+ this.drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize);
+ textField.render(guiLeft + SEARCH_BAR_X, guiTop + SEARCH_BAR_Y);
+
+ refreshResults();
+ for (int i = 0; i < LIST_COUNT; i++) {
+ if (i < searchResults.size()) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(BACKGROUND);
+ String name = searchResults.get(i);
+ JsonObject json = NotEnoughUpdates.INSTANCE.navigation.getWaypoints().get(name);
+ boolean selected = name.equals(NotEnoughUpdates.INSTANCE.navigation.getInternalname());
+ int baseX = guiLeft + LIST_START_X;
+ int baseY = guiTop + LIST_START_Y + LIST_OFFSET_Y * i;
+
+ GlStateManager.color(1F, 1F, 1F);
+ drawTexturedModalRect(
+ baseX,
+ baseY,
+ selected ? TICK_POSITION_U : PIN_POSITION_U, selected ? TICK_POSITION_V : PIN_POSITION_V,
+ ICON_SIZE, ICON_SIZE
+ );
+ Utils.drawStringF(
+ json.get("displayname").getAsString(),
+ Minecraft.getMinecraft().fontRendererObj,
+ baseX + TEXT_OFFSET_X,
+ baseY + LIST_OFFSET_Y / 2F - Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT / 2F,
+ false,
+ 0x000000
+ );
+ }
+ }
+ }
+
+ private void refreshResults() {
+ String text = textField.getText().toLowerCase();
+ List results = NotEnoughUpdates.INSTANCE.navigation
+ .getWaypoints()
+ .values()
+ .stream()
+ .filter(it ->
+ it.get("internalname").getAsString().toLowerCase().contains(text)
+ || it.get("displayname").getAsString().toLowerCase().contains(text))
+ .map(it -> it.get("internalname").getAsString())
+ .sorted(Comparator.comparing(String::length)
+ .thenComparing(String.CASE_INSENSITIVE_ORDER))
+ .collect(Collectors.toList());
+
+ String internalname = NotEnoughUpdates.INSTANCE.navigation.getInternalname();
+ if (internalname != null) {
+ results.remove(internalname);
+ results.add(0, internalname);
+ }
+ searchResults = results;
+ }
+
+ @Override
+ protected void keyTyped(char p_keyTyped_1_, int p_keyTyped_2_) throws IOException {
+ super.keyTyped(p_keyTyped_1_, p_keyTyped_2_);
+ textField.keyTyped(p_keyTyped_1_, p_keyTyped_2_);
+ }
+
+ @Override
+ protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
+ super.mouseClicked(mouseX, mouseY, mouseButton);
+ if (Utils.isWithinRect(
+ mouseX,
+ mouseY,
+ guiLeft + SEARCH_BAR_X,
+ guiTop + SEARCH_BAR_Y,
+ SEARCH_BAR_WIDTH,
+ SEARCH_BAR_HEIGHT
+ )) {
+ textField.mouseClicked(mouseX, mouseY, mouseButton);
+ } else {
+ textField.setFocus(false);
+ }
+ for (int i = 0; i < LIST_COUNT; i++) {
+ if (i < searchResults.size()) {
+ int baseX = guiLeft + LIST_START_X;
+ int baseY = guiTop + LIST_START_Y + LIST_OFFSET_Y * i;
+ if (Utils.isWithinRect(mouseX, mouseY, baseX, baseY, ICON_SIZE, ICON_SIZE)) {
+ String thing = searchResults.get(i);
+ boolean selected = thing.equals(NotEnoughUpdates.INSTANCE.navigation.getInternalname());
+ if (selected) {
+ NotEnoughUpdates.INSTANCE.navigation.untrackWaypoint();
+ } else {
+ NotEnoughUpdates.INSTANCE.navigation.trackWaypoint(thing);
+ }
+ Utils.playPressSound();
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java
index 5c766254..2e31fbf3 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java
@@ -417,6 +417,9 @@ public class NEUConfig extends Config {
@Expose
public boolean npcRetextureOnSelf = false;
+ @Expose
+ public boolean hasOpenedWaypointMenu = false;
+
}
public static ArrayList createDefaultEnchantColours() {
@@ -511,6 +514,8 @@ public class NEUConfig extends Config {
@Expose
public long dailyMithrilPowerCompleted = 0L;
@Expose
+ public HashMap unlockedWarpScrolls = new HashMap<>();
+ @Expose
public long dailyHeavyPearlCompleted = 0L;
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Misc.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Misc.java
index 631ce545..a04a51f9 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Misc.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Misc.java
@@ -1,7 +1,15 @@
package io.github.moulberry.notenoughupdates.options.seperateSections;
import com.google.gson.annotations.Expose;
-import io.github.moulberry.notenoughupdates.core.config.annotations.*;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigAccordionId;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorAccordion;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorBoolean;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorButton;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorDropdown;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorKeybind;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorSlider;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigOption;
+import org.lwjgl.input.Keyboard;
public class Misc {
@Expose
@@ -163,4 +171,29 @@ public class Misc {
"Fandom"
})
public int wiki = 0;
+
+ @Expose
+ @ConfigOption(
+ name = "Waypoint Keybind",
+ desc = "Press this keybind to show waypoints to various NPCs"
+ )
+ @ConfigEditorKeybind(defaultKey = Keyboard.KEY_N)
+ public int keybindWaypoint = Keyboard.KEY_N;
+
+ @Expose
+ @ConfigOption(
+ name = "Untrack close Waypoints",
+ desc = "Automatically untrack waypoints once you get close to them."
+ )
+ @ConfigEditorBoolean
+ public boolean untrackCloseWaypoints = true;
+
+ @Expose
+ @ConfigOption(
+ name = "Warp twice",
+ desc = "Warp twice when using SHIFT+N to /warp to a waypoint."
+ )
+ @ConfigEditorBoolean
+ public boolean warpTwice = true;
+
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java
index 87712378..1729cfa7 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java
@@ -4835,12 +4835,7 @@ public class GuiProfileViewer extends GuiScreen {
if (profile.getUuid().equals("20934ef9488c465180a78f861586b4cf")) {
locationStr = "Ignoring DMs";
} else {
- if (location != null) {
- JsonObject misc = Constants.MISC;
- if (misc != null) {
- locationStr = Utils.getElementAsString(Utils.getElement(misc, "area_names." + location), "Unknown");
- }
- }
+ locationStr = NotEnoughUpdates.INSTANCE.navigation.getNameForAreaModeOrUnknown(location);
}
if (locationStr != null) {
statusStr += EnumChatFormatting.GRAY + " - " + EnumChatFormatting.GREEN + locationStr;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/recipes/ItemShopRecipe.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/ItemShopRecipe.java
new file mode 100644
index 00000000..778f156f
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/ItemShopRecipe.java
@@ -0,0 +1,189 @@
+package io.github.moulberry.notenoughupdates.recipes;
+
+import com.google.common.collect.Sets;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+import io.github.moulberry.notenoughupdates.NEUManager;
+import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
+import io.github.moulberry.notenoughupdates.miscgui.GuiItemRecipe;
+import io.github.moulberry.notenoughupdates.miscgui.GuiNavigation;
+import io.github.moulberry.notenoughupdates.util.JsonUtils;
+import io.github.moulberry.notenoughupdates.util.Utils;
+import net.minecraft.client.Minecraft;
+import net.minecraft.util.ResourceLocation;
+import org.lwjgl.input.Keyboard;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class ItemShopRecipe implements NeuRecipe {
+ public static ResourceLocation BACKGROUND = new ResourceLocation(
+ "notenoughupdates",
+ "textures/gui/item_shop_recipe.png"
+ );
+
+ private static final int SLOT_IMAGE_U = 176;
+ private static final int SLOT_IMAGE_V = 0;
+
+ private static final int SLOT_IMAGE_SIZE = 18;
+ public static final int RESULT_SLOT_Y = 66;
+ public static final int RESULT_SLOT_X = 124;
+
+ public static final int BUTTON_X = 130;
+ public static final int BUTTON_Y = 16;
+
+ private static final int COST_SLOT_X = 30;
+ private static final int COST_SLOT_SPACING = 6;
+ private static final int ROW_SPACING = 18;
+ private final List cost;
+ private final Ingredient result;
+ private boolean selected;
+
+ private final Ingredient npcIngredient;
+ private final boolean hasWaypoint;
+ private final JsonObject npcObject;
+
+ public ItemShopRecipe(Ingredient npcIngredient, List cost, Ingredient result, JsonObject npcObject) {
+ this.npcIngredient = npcIngredient;
+ this.cost = cost;
+ this.result = result;
+ this.npcObject = npcObject;
+ hasWaypoint = NotEnoughUpdates.INSTANCE.navigation.isValidWaypoint(npcObject);
+ }
+
+ @Override
+ public Set getCatalystItems() {
+ return Sets.newHashSet(npcIngredient);
+ }
+
+ @Override
+ public Set getIngredients() {
+ return new HashSet<>(cost);
+ }
+
+ @Override
+ public Set getOutputs() {
+ return Sets.newHashSet(result);
+ }
+
+ @Override
+ public List getSlots() {
+ List slots = new ArrayList<>();
+
+ int i = 0;
+ int colCount = cost.size() / 4;
+ int startX = COST_SLOT_X - 8 * (colCount - 1);
+ int rowSize = cost.size();
+ if (rowSize > 4) rowSize = 4;
+ int startY = RESULT_SLOT_Y + 8 - (SLOT_IMAGE_SIZE * rowSize + COST_SLOT_SPACING * (rowSize - 1)) / 2;
+ for (Ingredient ingredient : cost) {
+ slots.add(new RecipeSlot(
+ startX + (i / 4) * ROW_SPACING + 1,
+ startY + (i % 4) * (SLOT_IMAGE_SIZE + COST_SLOT_SPACING) + 1,
+ ingredient.getItemStack()
+ ));
+ i++;
+ }
+ slots.add(new RecipeSlot(RESULT_SLOT_X, RESULT_SLOT_Y, result.getItemStack()));
+ return slots;
+ }
+
+ @Override
+ public void drawExtraBackground(GuiItemRecipe gui, int mouseX, int mouseY) {
+ Minecraft.getMinecraft().getTextureManager().bindTexture(BACKGROUND);
+ int colCount = cost.size() / 4;
+ int startX = COST_SLOT_X - 8 * (colCount - 1);
+ int rowSize = cost.size();
+ if (rowSize > 4) rowSize = 4;
+ int startY = RESULT_SLOT_Y + 8 - (SLOT_IMAGE_SIZE * rowSize + COST_SLOT_SPACING * (rowSize - 1)) / 2;
+ for (int i = 0; i < cost.size(); i++) {
+ gui.drawTexturedModalRect(
+ gui.guiLeft + startX + (i / 4) * ROW_SPACING,
+ gui.guiTop + startY + (i % 4) * (SLOT_IMAGE_SIZE + COST_SLOT_SPACING),
+ SLOT_IMAGE_U, SLOT_IMAGE_V,
+ SLOT_IMAGE_SIZE, SLOT_IMAGE_SIZE
+ );
+ }
+ if (!hasWaypoint) return;
+ Minecraft.getMinecraft().getTextureManager().bindTexture(GuiNavigation.BACKGROUND);
+ selected = npcIngredient.getInternalItemId().equals(NotEnoughUpdates.INSTANCE.navigation.getInternalname());
+ gui.drawTexturedModalRect(
+ gui.guiLeft + BUTTON_X,
+ gui.guiTop + BUTTON_Y,
+ selected ? GuiNavigation.TICK_POSITION_U : GuiNavigation.PIN_POSITION_U,
+ selected ? GuiNavigation.TICK_POSITION_V : GuiNavigation.PIN_POSITION_V,
+ GuiNavigation.ICON_SIZE,
+ GuiNavigation.ICON_SIZE
+ );
+ }
+
+ @Override
+ public void mouseClicked(GuiItemRecipe gui, int mouseX, int mouseY, int mouseButton) {
+ if (hasWaypoint && Utils.isWithinRect(
+ mouseX - gui.guiLeft,
+ mouseY - gui.guiTop,
+ BUTTON_X,
+ BUTTON_Y,
+ GuiNavigation.ICON_SIZE,
+ GuiNavigation.ICON_SIZE
+ )) {
+ boolean shiftPressed = Keyboard.isKeyDown(Keyboard.KEY_RSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_LSHIFT);
+ if (selected && !shiftPressed) {
+ NotEnoughUpdates.INSTANCE.navigation.untrackWaypoint();
+ } else {
+ NotEnoughUpdates.INSTANCE.navigation.trackWaypoint(npcIngredient.getInternalItemId());
+ if (shiftPressed) {
+ NotEnoughUpdates.INSTANCE.navigation.useWarpCommand();
+ }
+ }
+ Utils.playPressSound();
+ selected = !selected;
+ }
+ }
+
+ @Override
+ public String getTitle() {
+ return npcObject.get("displayname").getAsString();
+ }
+
+ @Override
+ public RecipeType getType() {
+ return RecipeType.NPC_SHOP;
+ }
+
+ @Override
+ public boolean hasVariableCost() {
+ return false;
+ }
+
+ @Override
+ public JsonObject serialize() {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("type", "npc_shop");
+ jsonObject.addProperty("result", result.serialize());
+ jsonObject.add(
+ "cost",
+ JsonUtils.transformListToJsonArray(cost, costItem -> new JsonPrimitive(costItem.serialize()))
+ );
+ return jsonObject;
+ }
+
+ @Override
+ public ResourceLocation getBackground() {
+ return BACKGROUND;
+ }
+
+ public static NeuRecipe parseItemRecipe(NEUManager neuManager, JsonObject recipe, JsonObject outputItemJson) {
+ return new ItemShopRecipe(
+ new Ingredient(neuManager, outputItemJson.get("internalname").getAsString()),
+ JsonUtils.transformJsonArrayToList(
+ recipe.getAsJsonArray("cost"),
+ it -> new Ingredient(neuManager, it.getAsString())
+ ),
+ new Ingredient(neuManager, recipe.get("result").getAsString()),
+ outputItemJson
+ );
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/recipes/MobLootRecipe.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/MobLootRecipe.java
index dcbf71da..b98fbe10 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/MobLootRecipe.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/MobLootRecipe.java
@@ -1,7 +1,6 @@
package io.github.moulberry.notenoughupdates.recipes;
import com.google.common.collect.Sets;
-import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
@@ -14,7 +13,6 @@ import io.github.moulberry.notenoughupdates.util.JsonUtils;
import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.EntityLivingBase;
-import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
@@ -24,7 +22,6 @@ import java.util.List;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;
-import java.util.stream.Stream;
public class MobLootRecipe implements NeuRecipe {
@@ -143,9 +140,14 @@ public class MobLootRecipe implements NeuRecipe {
return Sets.newHashSet(mobIngredient);
}
+ @Override
+ public Set getCatalystItems() {
+ return Sets.newHashSet(mobIngredient);
+ }
+
@Override
public Set getOutputs() {
- return Stream.concat(drops.stream().map(it -> it.drop), Stream.of(mobIngredient)).collect(Collectors.toSet());
+ return drops.stream().map(it -> it.drop).collect(Collectors.toSet());
}
@Override
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/recipes/NeuRecipe.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/NeuRecipe.java
index 8202bb48..04945cc5 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/NeuRecipe.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/NeuRecipe.java
@@ -3,8 +3,11 @@ package io.github.moulberry.notenoughupdates.recipes;
import com.google.gson.JsonObject;
import io.github.moulberry.notenoughupdates.NEUManager;
import io.github.moulberry.notenoughupdates.miscgui.GuiItemRecipe;
+import net.minecraft.client.gui.GuiButton;
import net.minecraft.util.ResourceLocation;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Set;
@@ -30,10 +33,22 @@ public interface NeuRecipe {
default void drawHoverInformation(GuiItemRecipe gui, int mouseX, int mouseY) {
}
+ default void mouseClicked(GuiItemRecipe gui, int mouseX, int mouseY, int mouseButton) {}
+
+ default void handleKeyboardInput() {}
+
+ default Set getCatalystItems() {
+ return Collections.emptySet();
+ }
+
boolean hasVariableCost();
JsonObject serialize();
+ default List getExtraButtons(GuiItemRecipe guiItemRecipe) {
+ return new ArrayList<>();
+ }
+
ResourceLocation getBackground();
static NeuRecipe parseRecipe(NEUManager manager, JsonObject recipe, JsonObject output) {
@@ -59,4 +74,6 @@ public interface NeuRecipe {
default int[] getPageFlipPositionLeftTopCorner() {
return new int[]{110, 90};
}
+
+ default void actionPerformed(GuiButton button) {}
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeType.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeType.java
index cc8b50be..023b20eb 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeType.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeType.java
@@ -10,7 +10,8 @@ public enum RecipeType {
CRAFTING("crafting", "Crafting", CraftingRecipe::parseCraftingRecipe, new ItemStack(Blocks.crafting_table)),
FORGE("forge", "Forging", ForgeRecipe::parseForgeRecipe, new ItemStack(Blocks.anvil)),
TRADE("trade", "Trading", VillagerTradeRecipe::parseStaticRecipe, new ItemStack(Items.emerald)),
- MOB_LOOT("drops", "Mob Loot", MobLootRecipe::parseRecipe, new ItemStack(Items.diamond_sword));
+ MOB_LOOT("drops", "Mob Loot", MobLootRecipe::parseRecipe, new ItemStack(Items.diamond_sword)),
+ NPC_SHOP("npc_shop", "NPC Item Shop", ItemShopRecipe::parseItemRecipe, new ItemStack(Items.wheat_seeds));
private final String id;
private final String label;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/recipes/VillagerTradeRecipe.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/VillagerTradeRecipe.java
index 2e53e153..10eb96a5 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/VillagerTradeRecipe.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/VillagerTradeRecipe.java
@@ -125,7 +125,7 @@ public class VillagerTradeRecipe implements NeuRecipe {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("type", "trade");
jsonObject.addProperty("result", result.serialize());
- jsonObject.addProperty("cost", cost.getInternalItemId());
+ jsonObject.addProperty("cost", cost.serialize());
if (minCost > 0)
jsonObject.addProperty("min", minCost);
if (maxCost > 0)
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/Constants.java b/src/main/java/io/github/moulberry/notenoughupdates/util/Constants.java
index dab4844d..4c421f3e 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/util/Constants.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/util/Constants.java
@@ -1,6 +1,17 @@
package io.github.moulberry.notenoughupdates.util;
-import com.google.gson.*;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonPrimitive;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+import io.github.moulberry.notenoughupdates.events.RepositoryReloadEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import java.lang.reflect.Type;
import java.util.concurrent.locks.ReentrantLock;
@@ -42,7 +53,8 @@ public class Constants {
private static final ReentrantLock lock = new ReentrantLock();
- public static void reload() {
+ @SubscribeEvent
+ public void reload(RepositoryReloadEvent event) {
try {
lock.lock();
@@ -57,6 +69,8 @@ public class Constants {
ESSENCECOSTS = Utils.getConstant("essencecosts", gson);
FAIRYSOULS = Utils.getConstant("fairy_souls", gson);
REFORGESTONES = Utils.getConstant("reforgestones", gson);
+ } catch (Exception ex) {
+ ex.printStackTrace();
} finally {
lock.unlock();
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java
index e3d90aaa..729e68bd 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java
@@ -1,19 +1,39 @@
package io.github.moulberry.notenoughupdates.util;
-import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.nbt.NBTTagString;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
public class ItemUtils {
- public static ItemStack getCoinItemStack(int coinAmount) {
- ItemStack itemStack = new ItemStack(Items.gold_nugget);
- itemStack.setStackDisplayName("\u00A7r\u00A76" + Utils.formatNumberWithDots(coinAmount) + " Coins");
- return itemStack;
+ public static ItemStack getCoinItemStack(long coinAmount) {
+ String uuid = "2070f6cb-f5db-367a-acd0-64d39a7e5d1b";
+ String texture =
+ "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTM4MDcxNzIxY2M1YjRjZDQwNmNlNDMxYTEzZjg2MDgzYTg5NzNlMTA2NGQyZjg4OTc4Njk5MzBlZTZlNTIzNyJ9fX0=";
+ if (coinAmount >= 100000) {
+ uuid = "94fa2455-2881-31fe-bb4e-e3e24d58dbe3";
+ texture =
+ "eyJ0aW1lc3RhbXAiOjE2MzU5NTczOTM4MDMsInByb2ZpbGVJZCI6ImJiN2NjYTcxMDQzNDQ0MTI4ZDMwODllMTNiZGZhYjU5IiwicHJvZmlsZU5hbWUiOiJsYXVyZW5jaW8zMDMiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2M5Yjc3OTk5ZmVkM2EyNzU4YmZlYWYwNzkzZTUyMjgzODE3YmVhNjQwNDRiZjQzZWYyOTQzM2Y5NTRiYjUyZjYiLCJtZXRhZGF0YSI6eyJtb2RlbCI6InNsaW0ifX19fQo=";
+ }
+ if (coinAmount >= 10000000) {
+ uuid = "0af8df1f-098c-3b72-ac6b-65d65fd0b668";
+ texture =
+ "ewogICJ0aW1lc3RhbXAiIDogMTYzNTk1NzQ4ODQxNywKICAicHJvZmlsZUlkIiA6ICJmNThkZWJkNTlmNTA0MjIyOGY2MDIyMjExZDRjMTQwYyIsCiAgInByb2ZpbGVOYW1lIiA6ICJ1bnZlbnRpdmV0YWxlbnQiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2I5NTFmZWQ2YTdiMmNiYzIwMzY5MTZkZWM3YTQ2YzRhNTY0ODE1NjRkMTRmOTQ1YjZlYmMwMzM4Mjc2NmQzYiIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9";
+ }
+ ItemStack skull = Utils.createSkull(
+ "\u00A7r\u00A76" + Utils.formatNumberWithDots(coinAmount) + " Coins",
+ uuid,
+ texture
+ );
+ NBTTagCompound extraAttributes = skull.getTagCompound().getCompoundTag("ExtraAttributes");
+ extraAttributes.setString("id", "SKYBLOCK_COIN");
+ skull.getTagCompound().setTag("ExtraAttributes", extraAttributes);
+ return skull;
}
public static void appendLore(ItemStack is, List moreLore) {
@@ -30,4 +50,17 @@ public class ItemUtils {
tagCompound.setTag("display", display);
is.setTagCompound(tagCompound);
}
+
+ public static List getLore(ItemStack is) {
+ NBTTagCompound tagCompound = is.getTagCompound();
+ if (tagCompound == null) {
+ return Collections.emptyList();
+ }
+ NBTTagList tagList = tagCompound.getCompoundTag("display").getTagList("Lore", 8);
+ List list = new ArrayList<>();
+ for (int i = 0; i < tagList.tagCount(); i++) {
+ list.add(tagList.getStringTagAt(i));
+ }
+ return list;
+ }
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/JsonUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/util/JsonUtils.java
index 916631b7..b4193c88 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/util/JsonUtils.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/util/JsonUtils.java
@@ -5,7 +5,9 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -16,11 +18,18 @@ public class JsonUtils {
return StreamSupport.stream(array.spliterator(), false);
}
- public static List transformJsonArrayToList(JsonArray array, Function super JsonElement, ? extends T> mapper) {
+ public static List transformJsonArrayToList(
+ JsonArray array,
+ Function super JsonElement, ? extends T> mapper
+ ) {
return getJsonArrayAsStream(array).map(mapper).collect(Collectors.toList());
}
- public static List getJsonArrayOrEmpty(JsonObject rootObject, String name, Function super JsonElement, ? extends T> mapper) {
+ public static List getJsonArrayOrEmpty(
+ JsonObject rootObject,
+ String name,
+ Function super JsonElement, ? extends T> mapper
+ ) {
if (!rootObject.has(name)) {
return Collections.emptyList();
}
@@ -31,7 +40,10 @@ public class JsonUtils {
return Collections.emptyList();
}
- public static JsonArray transformListToJsonArray(List things, Function super T, ? extends JsonElement> mapper) {
+ public static JsonArray transformListToJsonArray(
+ List things,
+ Function super T, ? extends JsonElement> mapper
+ ) {
JsonArray array = new JsonArray();
for (T t : things) {
array.add(mapper.apply(t));
@@ -39,4 +51,15 @@ public class JsonUtils {
return array;
}
+ public static Map transformJsonObjectToMap(
+ JsonObject object,
+ Function super JsonElement, ? extends T> mapper
+ ) {
+ Map map = new HashMap<>();
+ for (Map.Entry entry : object.entrySet()) {
+ map.put(entry.getKey(), mapper.apply(entry.getValue()));
+ }
+ return map;
+ }
+
}
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 7b714cd0..e572a391 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java
@@ -1854,8 +1854,8 @@ public class Utils {
}
public static boolean isWithinRect(int x, int y, int left, int top, int width, int height) {
- return left <= x && x <= left + width &&
- top <= y && y <= top + height;
+ return left <= x && x < left + width &&
+ top <= y && y < top + height;
}
public static int getNumberOfStars(ItemStack stack) {
diff --git a/src/main/resources/assets/notenoughupdates/textures/gui/forge_recipe_tall.png b/src/main/resources/assets/notenoughupdates/textures/gui/forge_recipe_tall.png
index b07e5ca1..cdd8b0f1 100644
Binary files a/src/main/resources/assets/notenoughupdates/textures/gui/forge_recipe_tall.png and b/src/main/resources/assets/notenoughupdates/textures/gui/forge_recipe_tall.png differ
diff --git a/src/main/resources/assets/notenoughupdates/textures/gui/item_shop_recipe.png b/src/main/resources/assets/notenoughupdates/textures/gui/item_shop_recipe.png
new file mode 100644
index 00000000..e78c0f44
Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/textures/gui/item_shop_recipe.png differ
diff --git a/src/main/resources/assets/notenoughupdates/textures/gui/navigation.png b/src/main/resources/assets/notenoughupdates/textures/gui/navigation.png
new file mode 100644
index 00000000..b8eb26e4
Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/textures/gui/navigation.png differ
diff --git a/src/main/resources/assets/notenoughupdates/textures/gui/villager_recipe_tall.png b/src/main/resources/assets/notenoughupdates/textures/gui/villager_recipe_tall.png
index ed982599..8cb89bae 100644
Binary files a/src/main/resources/assets/notenoughupdates/textures/gui/villager_recipe_tall.png and b/src/main/resources/assets/notenoughupdates/textures/gui/villager_recipe_tall.png differ
--
cgit
From 470db06d91e1d90466e5fa1064eae4bb7318c5ad Mon Sep 17 00:00:00 2001
From: 2stinkysocks <54291521+2stinkysocks@users.noreply.github.com>
Date: Sat, 7 May 2022 07:29:16 -0700
Subject: Booster Cookie Warning (#128)
* add booster cookie warning
* requested changes
* i forgot to check if the feature is enabled
---
Update Notes/2.1.md | 1 +
.../notenoughupdates/NotEnoughUpdates.java | 2 +
.../notenoughupdates/listener/ChatListener.java | 3 +
.../miscfeatures/CookieWarning.java | 95 ++++++++++++++++++++++
.../mixins/AccessorGuiPlayerTabOverlay.java | 12 +++
.../options/seperateSections/Notifications.java | 21 +++++
src/main/resources/mixins.notenoughupdates.json | 1 +
7 files changed, 135 insertions(+)
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CookieWarning.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiPlayerTabOverlay.java
(limited to 'src/main/resources')
diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md
index 935ca4f1..2ea1bef0 100644
--- a/Update Notes/2.1.md
+++ b/Update Notes/2.1.md
@@ -84,6 +84,7 @@
- Added 6-10 stars to /neucustomize
- Added support for attributes in neuec
- Added Heavy Pearls to todo overlay - cobble8
+- Added Booster Cookie Warning - 2stinkysocks
### **Bug Fixes:**
- Fix wiki pages freezing the entire game - nea89
- Made titanium overlay and waypoints work with dwarven overlay off
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
index d08968c3..0de3fffe 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
@@ -14,6 +14,7 @@ import io.github.moulberry.notenoughupdates.listener.ItemTooltipListener;
import io.github.moulberry.notenoughupdates.listener.NEUEventListener;
import io.github.moulberry.notenoughupdates.listener.OldAnimationChecker;
import io.github.moulberry.notenoughupdates.listener.RenderListener;
+import io.github.moulberry.notenoughupdates.miscfeatures.CookieWarning;
import io.github.moulberry.notenoughupdates.miscfeatures.CrystalOverlay;
import io.github.moulberry.notenoughupdates.miscfeatures.CrystalWishingCompassSolver;
import io.github.moulberry.notenoughupdates.miscfeatures.CustomItemEffects;
@@ -241,6 +242,7 @@ public class NotEnoughUpdates {
MinecraftForge.EVENT_BUS.register(new ItemTooltipListener(this));
MinecraftForge.EVENT_BUS.register(new RenderListener(this));
MinecraftForge.EVENT_BUS.register(new OldAnimationChecker());
+ MinecraftForge.EVENT_BUS.register(new CookieWarning());
MinecraftForge.EVENT_BUS.register(navigation);
if (Minecraft.getMinecraft().getResourceManager() instanceof IReloadableResourceManager) {
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 060dcb80..6a5164a2 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java
@@ -2,6 +2,7 @@ package io.github.moulberry.notenoughupdates.listener;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.dungeons.DungeonWin;
+import io.github.moulberry.notenoughupdates.miscfeatures.CookieWarning;
import io.github.moulberry.notenoughupdates.miscfeatures.CrystalMetalDetectorSolver;
import io.github.moulberry.notenoughupdates.miscfeatures.StreamerMode;
import io.github.moulberry.notenoughupdates.overlays.OverlayManager;
@@ -186,6 +187,8 @@ public class ChatListener {
"Your Slayer Quest has been cancelled!"))) {
SlayerOverlay.slayerQuest = false;
SlayerOverlay.unloadOverlayTimer = System.currentTimeMillis();
+ } else if (unformatted.startsWith("You consumed a Booster Cookie!")) {
+ CookieWarning.resetNotification();
}
if (e.message.getFormattedText().contains(
EnumChatFormatting.YELLOW + "Visit the Auction House to collect your item!")) {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CookieWarning.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CookieWarning.java
new file mode 100644
index 00000000..41c2219a
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CookieWarning.java
@@ -0,0 +1,95 @@
+package io.github.moulberry.notenoughupdates.miscfeatures;
+
+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 net.minecraft.client.Minecraft;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.event.entity.EntityJoinWorldEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+
+public class CookieWarning {
+
+ private static boolean hasNotified;
+
+ public CookieWarning() {
+ hasNotified = false;
+ }
+
+ @SubscribeEvent
+ public void onJoinWorld(EntityJoinWorldEvent e) {
+ if(e.entity == Minecraft.getMinecraft().thePlayer) {
+ this.checkCookie();
+ }
+ }
+
+ public static void resetNotification() {
+ hasNotified = false;
+ }
+
+ /**
+ * Checks the tab list for a cookie timer, and sends a chat message if the timer is within the tolerance
+ */
+ private void checkCookie() {
+ if(!hasNotified && NotEnoughUpdates.INSTANCE.config.notifications.doBoosterNotif) {
+ String[] lines = ((AccessorGuiPlayerTabOverlay) Minecraft.getMinecraft().ingameGUI.getTabList()).getFooter().getUnformattedText().split("\n");
+ boolean hasCookie = true;
+ String timeLine = null; // the line that contains the cookie timer
+ for(int i = 0; i < lines.length; i++) {
+ if(lines[i].startsWith("Cookie Buff")) {
+ timeLine = lines[i+1]; // the line after the "Cookie Buff" line
+ }
+ if(lines[i].startsWith("Not active! Obtain booster cookies from the")) {
+ hasCookie = false;
+ }
+ }
+ if(!hasCookie) {
+ NotificationHandler.displayNotification(Lists.newArrayList(
+ "\u00a7cBooster Cookie Ran Out!",
+ "\u00a77Your Booster Cookie expired!",
+ "\u00a77",
+ "\u00a77Press X on your keyboard to close this notification"
+ ), true, true);
+ hasNotified = true;
+ return;
+ }
+ if(timeLine != null) {
+ String[] digits = timeLine.split(" ");
+ int minutes = 0;
+ try {
+ for(String digit : digits) {
+ if(digit.endsWith("y")) {
+ digit = digit.substring(0, digit.length() - 1);
+ minutes += Integer.parseInt(digit) * 525600;
+ } else if(digit.endsWith("d")) {
+ digit = digit.substring(0, digit.length() - 1);
+ minutes += Integer.parseInt(digit) * 1440;
+ } else if(digit.endsWith("h")) {
+ digit = digit.substring(0, digit.length() - 1);
+ minutes += Integer.parseInt(digit) * 60;
+ } else if(digit.endsWith("m")) {
+ digit = digit.substring(0, digit.length() - 1);
+ minutes += Integer.parseInt(digit);
+ } // ignore seconds
+ }
+ } 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."));
+ }
+ if(minutes < NotEnoughUpdates.INSTANCE.config.notifications.boosterCookieWarningMins) {
+ NotificationHandler.displayNotification(Lists.newArrayList(
+ "\u00a7cBooster Cookie Running Low!",
+ "\u00a77Your Booster Cookie will expire in " + timeLine,
+ "\u00a77",
+ "\u00a77Press X on your keyboard to close this notification"
+ ), true, true);
+ hasNotified = true;
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiPlayerTabOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiPlayerTabOverlay.java
new file mode 100644
index 00000000..530e3013
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiPlayerTabOverlay.java
@@ -0,0 +1,12 @@
+package io.github.moulberry.notenoughupdates.mixins;
+
+import net.minecraft.client.gui.GuiPlayerTabOverlay;
+import net.minecraft.util.IChatComponent;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+@Mixin(GuiPlayerTabOverlay.class)
+public interface AccessorGuiPlayerTabOverlay {
+ @Accessor("footer")
+ IChatComponent getFooter();
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Notifications.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Notifications.java
index fd934330..9007db88 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Notifications.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Notifications.java
@@ -2,6 +2,7 @@ package io.github.moulberry.notenoughupdates.options.seperateSections;
import com.google.gson.annotations.Expose;
import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorBoolean;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorSlider;
import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigOption;
public class Notifications {
@@ -29,4 +30,24 @@ public class Notifications {
)
@ConfigEditorBoolean
public boolean doOamNotif = true;
+
+ @Expose
+ @ConfigOption(
+ name = "Booster Cookie Warning",
+ desc = "Warning when a booster cookie is about to expire"
+ )
+ @ConfigEditorBoolean
+ public boolean doBoosterNotif = false;
+
+ @Expose
+ @ConfigOption(
+ name = "Booster Cookie Warning Minutes",
+ desc = "Change the minimum time required for the Booster Cookie warning to activate"
+ )
+ @ConfigEditorSlider(
+ minValue = 10,
+ maxValue = 5760,
+ minStep = 25
+ )
+ public int boosterCookieWarningMins = 1440;
}
diff --git a/src/main/resources/mixins.notenoughupdates.json b/src/main/resources/mixins.notenoughupdates.json
index 6c95e480..c6ba98b7 100644
--- a/src/main/resources/mixins.notenoughupdates.json
+++ b/src/main/resources/mixins.notenoughupdates.json
@@ -5,6 +5,7 @@
"mixins": [
"AccessorEntityAgeable",
"AccessorEntityArmorStand",
+ "AccessorGuiPlayerTabOverlay",
"MixinAbstractClientPlayer",
"MixinContainer",
"MixinEffectRenderer",
--
cgit
From f0621394b9b36f3ffb322ebd4838e040d7d48e9c Mon Sep 17 00:00:00 2001
From: jani270 <69345714+jani270@users.noreply.github.com>
Date: Sun, 15 May 2022 11:55:35 +0200
Subject: I love panoramas (#139)
* I love panoramas
* optimize file size
---
.../miscfeatures/CrystalWishingCompassSolver.java | 2 +-
.../panoramas/combat_2_day/panorama_0.jpg | Bin 30425 -> 0 bytes
.../panoramas/combat_2_day/panorama_1.jpg | Bin 18248 -> 0 bytes
.../panoramas/combat_2_day/panorama_2.jpg | Bin 14289 -> 0 bytes
.../panoramas/combat_2_day/panorama_3.jpg | Bin 19871 -> 0 bytes
.../panoramas/combat_2_day/panorama_4.jpg | Bin 18328 -> 0 bytes
.../panoramas/combat_2_day/panorama_5.jpg | Bin 8718 -> 0 bytes
.../panoramas/combat_2_night/panorama_0.jpg | Bin 14773 -> 0 bytes
.../panoramas/combat_2_night/panorama_1.jpg | Bin 11063 -> 0 bytes
.../panoramas/combat_2_night/panorama_2.jpg | Bin 5580 -> 0 bytes
.../panoramas/combat_2_night/panorama_3.jpg | Bin 17256 -> 0 bytes
.../panoramas/combat_2_night/panorama_4.jpg | Bin 12133 -> 0 bytes
.../panoramas/combat_2_night/panorama_5.jpg | Bin 4516 -> 0 bytes
.../panoramas/crimson_isle/panorama_0.jpg | Bin 0 -> 652486 bytes
.../panoramas/crimson_isle/panorama_1.jpg | Bin 0 -> 467208 bytes
.../panoramas/crimson_isle/panorama_2.jpg | Bin 0 -> 277432 bytes
.../panoramas/crimson_isle/panorama_3.jpg | Bin 0 -> 503887 bytes
.../panoramas/crimson_isle/panorama_4.jpg | Bin 0 -> 169662 bytes
.../panoramas/crimson_isle/panorama_5.jpg | Bin 0 -> 131721 bytes
19 files changed, 1 insertion(+), 1 deletion(-)
delete mode 100644 src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_0.jpg
delete mode 100644 src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_1.jpg
delete mode 100644 src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_2.jpg
delete mode 100644 src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_3.jpg
delete mode 100644 src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_4.jpg
delete mode 100644 src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_5.jpg
delete mode 100644 src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_0.jpg
delete mode 100644 src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_1.jpg
delete mode 100644 src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_2.jpg
delete mode 100644 src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_3.jpg
delete mode 100644 src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_4.jpg
delete mode 100644 src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_5.jpg
create mode 100644 src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_0.jpg
create mode 100644 src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_1.jpg
create mode 100644 src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_2.jpg
create mode 100644 src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_3.jpg
create mode 100644 src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_4.jpg
create mode 100644 src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_5.jpg
(limited to 'src/main/resources')
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 9686e97a..1bc26d50 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolver.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolver.java
@@ -773,7 +773,7 @@ public class CrystalWishingCompassSolver {
ChatComponentText chatMessage = new ChatComponentText(destinationMessage);
chatMessage.setChatStyle(Utils.createClickStyle(ClickEvent.Action.RUN_COMMAND,
skytilsCommand,
- EnumChatFormatting.YELLOW + "Set waypoint for wishing target\n"));
+ EnumChatFormatting.YELLOW + "Set waypoint for wishing target"));
mc.thePlayer.addChatMessage(chatMessage);
}
diff --git a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_0.jpg b/src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_0.jpg
deleted file mode 100644
index 0bfb0d2e..00000000
Binary files a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_0.jpg and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_1.jpg b/src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_1.jpg
deleted file mode 100644
index b4890bc5..00000000
Binary files a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_1.jpg and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_2.jpg b/src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_2.jpg
deleted file mode 100644
index ea7da9aa..00000000
Binary files a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_2.jpg and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_3.jpg b/src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_3.jpg
deleted file mode 100644
index 92013d1a..00000000
Binary files a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_3.jpg and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_4.jpg b/src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_4.jpg
deleted file mode 100644
index 2e3da992..00000000
Binary files a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_4.jpg and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_5.jpg b/src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_5.jpg
deleted file mode 100644
index 95398c35..00000000
Binary files a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_day/panorama_5.jpg and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_0.jpg b/src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_0.jpg
deleted file mode 100644
index 837a2928..00000000
Binary files a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_0.jpg and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_1.jpg b/src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_1.jpg
deleted file mode 100644
index 6f988421..00000000
Binary files a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_1.jpg and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_2.jpg b/src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_2.jpg
deleted file mode 100644
index 0c664062..00000000
Binary files a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_2.jpg and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_3.jpg b/src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_3.jpg
deleted file mode 100644
index 278d92f1..00000000
Binary files a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_3.jpg and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_4.jpg b/src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_4.jpg
deleted file mode 100644
index f9205c52..00000000
Binary files a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_4.jpg and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_5.jpg b/src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_5.jpg
deleted file mode 100644
index 5ca08bf9..00000000
Binary files a/src/main/resources/assets/notenoughupdates/panoramas/combat_2_night/panorama_5.jpg and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_0.jpg b/src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_0.jpg
new file mode 100644
index 00000000..efbef9ed
Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_0.jpg differ
diff --git a/src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_1.jpg b/src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_1.jpg
new file mode 100644
index 00000000..7f895802
Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_1.jpg differ
diff --git a/src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_2.jpg b/src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_2.jpg
new file mode 100644
index 00000000..db925a2f
Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_2.jpg differ
diff --git a/src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_3.jpg b/src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_3.jpg
new file mode 100644
index 00000000..7dbe0246
Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_3.jpg differ
diff --git a/src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_4.jpg b/src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_4.jpg
new file mode 100644
index 00000000..78b97952
Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_4.jpg differ
diff --git a/src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_5.jpg b/src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_5.jpg
new file mode 100644
index 00000000..e8f64665
Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/panoramas/crimson_isle/panorama_5.jpg differ
--
cgit
From 1076a433bb6bb57c4d9ab73342d8f8b21c9749fc Mon Sep 17 00:00:00 2001
From: jani270 <69345714+jani270@users.noreply.github.com>
Date: Tue, 17 May 2022 17:08:21 +0200
Subject: I cannot believe this (#140)
---
.../commands/help/HelpCommand.java | 2 +-
.../miscgui/GuiInvButtonEditor.java | 13 +-
.../notenoughupdates/invbuttons/presets.json | 923 +++++++++++----------
3 files changed, 473 insertions(+), 465 deletions(-)
(limited to 'src/main/resources')
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 f84b238d..c9f0ec27 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
@@ -46,7 +46,7 @@ public class HelpCommand extends ClientCommandBase {
"\u00a76/neureloadrepo \u00a7r\u00a77- Debug command with repo.",
"",
"\u00a76\u00a7lDev commands:",
- "\u00a76/neupackdev \u00a7r\u00a77- pack creator command - getnpc, getmob(s), getarmorstand(s), getall. Optional radius argument for all. "
+ "\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));
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiInvButtonEditor.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiInvButtonEditor.java
index 850d8328..83880846 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiInvButtonEditor.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiInvButtonEditor.java
@@ -118,8 +118,6 @@ public class GuiInvButtonEditor extends GuiScreen {
put("crypts", "skull:25d2f31ba162fe6272e831aed17f53213db6fa1c4cbe4fc827f3963cc98b9");
put("spiders den", "skull:c754318a3376f470e481dfcd6c83a59aa690ad4b4dd7577fdad1c2ef08d8aee6");
put("top of the nest", "skull:9d7e3b19ac4f3dee9c5677c135333b9d35a7f568b63d1ef4ada4b068b5a25");
- put("blazing fortress", "skull:c3687e25c632bce8aa61e0d64c24e694c3eea629ea944f4cf30dcfb4fbce071");
- put("blazing fortress magma boss", "skull:38957d5023c937c4c41aa2412d43410bda23cf79a9f6ab36b76fef2d7c429");
put("the end", "skull:7840b87d52271d2a755dedc82877e0ed3df67dcc42ea479ec146176b02779a5");
put("the end dragons nest", "skull:a1cd6d2d03f135e7c6b5d6cdae1b3a68743db4eb749faf7341e9fb347aa283b");
put("the park", "skull:a221f813dacee0fef8c59f76894dbb26415478d9ddfc44c2e708a6d3b7549b");
@@ -128,11 +126,18 @@ public class GuiInvButtonEditor extends GuiScreen {
put("gold mines", "skull:73bc965d579c3c6039f0a17eb7c2e6faf538c7a5de8e60ec7a719360d0a857a9");
put("deep caverns", "skull:569a1f114151b4521373f34bc14c2963a5011cdc25a6554c48c708cd96ebfc");
put("the barn", "skull:4d3a6bd98ac1833c664c4909ff8d2dc62ce887bdcf3cc5b3848651ae5af6b");
- put("mushroom desert", "skull:2116b9d8df346a25edd05f842e7a9345beaf16dca4118abf5a68c75bcaae10");
+ put("mushroom desert", "skull:6b20b23c1aa2be0270f016b4c90d6ee6b8330a17cfef87869d6ad60b2ffbf3b5");
put("dungeon hub", "skull:9b56895b9659896ad647f58599238af532d46db9c1b0389b8bbeb70999dab33d");
- put("dwarven mines", "skull:569a1f114151b4521373f34bc14c2963a5011cdc25a6554c48c708cd96ebfc");
+ put("dwarven mines", "skull:51539dddf9ed255ece6348193cd75012c82c93aec381f05572cecf7379711b3b");
put("hotm heart of the mountain", "skull:86f06eaa3004aeed09b3d5b45d976de584e691c0e9cade133635de93d23b9edb");
put("bazaar dude", "skull:c232e3820897429157619b0ee099fec0628f602fff12b695de54aef11d923ad7");
+ put("museum", "skull:438cf3f8e54afc3b3f91d20a49f324dca1486007fe545399055524c17941f4dc");
+ put("crystal hollows", "skull:21dbe30b027acbceb612563bd877cd7ebb719ea6ed1399027dcee58bb9049d4a");
+ put("dwarven forge", "skull:5cbd9f5ec1ed007259996491e69ff649a3106cf920227b1bb3a71ee7a89863f");
+ put("forgotton skull", "skull:6becc645f129c8bc2faa4d8145481fab11ad2ee75749d628dcd999aa94e7");
+ put("crystal nucleus", "skull:34d42f9c461cee1997b67bf3610c6411bf852b9e5db607bbf626527cfb42912c");
+ put("void sepulture", "skull:eb07594e2df273921a77c101d0bfdfa1115abed5b9b2029eb496ceba9bdbb4b3");
+ put("crimson isle", "skull:c3687e25c632bce8aa61e0d64c24e694c3eea629ea944f4cf30dcfb4fbce071");
}};
private static LinkedHashMap> presets = null;
diff --git a/src/main/resources/assets/notenoughupdates/invbuttons/presets.json b/src/main/resources/assets/notenoughupdates/invbuttons/presets.json
index e36f8021..d3065f30 100644
--- a/src/main/resources/assets/notenoughupdates/invbuttons/presets.json
+++ b/src/main/resources/assets/notenoughupdates/invbuttons/presets.json
@@ -1348,466 +1348,469 @@
],
"All Warps":[
{
- "x":87,
- "y":63,
- "playerInvOnly":true,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":"pets",
- "icon":"extra:pet_gold"
- },
- {
- "x":108,
- "y":63,
- "playerInvOnly":true,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":"/wardrobe",
- "icon":"extra:armor"
- },
- {
- "x":129,
- "y":63,
- "playerInvOnly":true,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":"/enderchest",
- "icon":"ENDER_CHEST"
- },
- {
- "x":150,
- "y":63,
- "playerInvOnly":true,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":"hotm",
- "icon":"skull:86f06eaa3004aeed09b3d5b45d976de584e691c0e9cade133635de93d23b9edb"
- },
- {
- "x":87,
- "y":5,
- "playerInvOnly":true,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":"",
- "icon":"GOLD_BLOCK"
- },
- {
- "x":108,
- "y":5,
- "playerInvOnly":true,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":129,
- "y":5,
- "playerInvOnly":true,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":150,
- "y":5,
- "playerInvOnly":true,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":"/pv",
- "icon":"PAINTING"
- },
- {
- "x":87,
- "y":25,
- "playerInvOnly":true,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":105,
- "y":25,
- "playerInvOnly":true,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":87,
- "y":43,
- "playerInvOnly":true,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":105,
- "y":43,
- "playerInvOnly":true,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":143,
- "y":35,
- "playerInvOnly":true,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":60,
- "y":8,
- "playerInvOnly":true,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":"",
- "icon":"extra:baubles_gold"
- },
- {
- "x":60,
- "y":60,
- "playerInvOnly":true,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":26,
- "y":8,
- "playerInvOnly":true,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":26,
- "y":60,
- "playerInvOnly":true,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":2,
- "y":2,
- "playerInvOnly":false,
- "anchorRight":true,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":"/ah",
- "icon":"GOLD_BLOCK"
- },
- {
- "x":2,
- "y":22,
- "playerInvOnly":false,
- "anchorRight":true,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":"/bz",
- "icon":"GOLD_BARDING"
- },
- {
- "x":2,
- "y":42,
- "playerInvOnly":false,
- "anchorRight":true,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":2,
- "y":62,
- "playerInvOnly":false,
- "anchorRight":true,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":2,
- "y":-84,
- "playerInvOnly":false,
- "anchorRight":true,
- "anchorBottom":true,
- "backgroundIndex":0,
- "command":"/warp home",
- "icon":"skull:c9c8881e42915a9d29bb61a16fb26d059913204d265df5b439b3d792acd56"
- },
- {
- "x":2,
- "y":-64,
- "playerInvOnly":false,
- "anchorRight":true,
- "anchorBottom":true,
- "backgroundIndex":0,
- "command":"/warp hub",
- "icon":"skull:d7cc6687423d0570d556ac53e0676cb563bbdd9717cd8269bdebed6f6d4e7bf8"
- },
- {
- "x":2,
- "y":-44,
- "playerInvOnly":false,
- "anchorRight":true,
- "anchorBottom":true,
- "backgroundIndex":0,
- "command":"/warp dungeon_hub",
- "icon":"skull:9b56895b9659896ad647f58599238af532d46db9c1b0389b8bbeb70999dab33d"
- },
- {
- "x":2,
- "y":-24,
- "playerInvOnly":false,
- "anchorRight":true,
- "anchorBottom":true,
- "backgroundIndex":0,
- "command":"/warp end",
- "icon":"skull:7840b87d52271d2a755dedc82877e0ed3df67dcc42ea479ec146176b02779a5"
- },
- {
- "x":4,
- "y":-19,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":25,
- "y":-19,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":46,
- "y":-19,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":67,
- "y":-19,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":88,
- "y":-19,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":109,
- "y":-19,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":130,
- "y":-19,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":151,
- "y":-19,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":-19,
- "y":2,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":-19,
- "y":22,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":-19,
- "y":42,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":-19,
- "y":62,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":false,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":-19,
- "y":-84,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":true,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":-19,
- "y":-64,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":true,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":-19,
- "y":-44,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":true,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":-19,
- "y":-24,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":true,
- "backgroundIndex":0,
- "command":""
- },
- {
- "x":4,
- "y":2,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":true,
- "backgroundIndex":0,
- "command":"/warp barn",
- "icon":"skull:4d3a6bd98ac1833c664c4909ff8d2dc62ce887bdcf3cc5b3848651ae5af6b"
- },
- {
- "x":25,
- "y":2,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":true,
- "backgroundIndex":0,
- "command":"/warp desert",
- "icon":"skull:2116b9d8df346a25edd05f842e7a9345beaf16dca4118abf5a68c75bcaae10"
- },
- {
- "x":46,
- "y":2,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":true,
- "backgroundIndex":0,
- "command":"/warp gold",
- "icon":"skull:73bc965d579c3c6039f0a17eb7c2e6faf538c7a5de8e60ec7a719360d0a857a9"
- },
- {
- "x":67,
- "y":2,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":true,
- "backgroundIndex":0,
- "command":"/warp deep",
- "icon":"skull:569a1f114151b4521373f34bc14c2963a5011cdc25a6554c48c708cd96ebfc"
- },
- {
- "x":88,
- "y":2,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":true,
- "backgroundIndex":0,
- "command":"/warp mines",
- "icon":"skull:c754318a3376f470e481dfcd6c83a59aa690ad4b4dd7577fdad1c2ef08d8aee6"
- },
- {
- "x":109,
- "y":2,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":true,
- "backgroundIndex":0,
- "command":"/warp park",
- "icon":"skull:a221f813dacee0fef8c59f76894dbb26415478d9ddfc44c2e708a6d3b7549b"
- },
- {
- "x":130,
- "y":2,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":true,
- "backgroundIndex":0,
- "command":"/warp spider",
- "icon":"skull:9d7e3b19ac4f3dee9c5677c135333b9d35a7f568b63d1ef4ada4b068b5a25"
- },
- {
- "x":151,
- "y":2,
- "playerInvOnly":false,
- "anchorRight":false,
- "anchorBottom":true,
- "backgroundIndex":0,
- "command":"/warp nether",
- "icon":"skull:38957d5023c937c4c41aa2412d43410bda23cf79a9f6ab36b76fef2d7c429"
+ "x": 87,
+ "y": 63,
+ "playerInvOnly": true,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": "pets",
+ "icon": "extra:pet_gold"
+ },
+ {
+ "x": 108,
+ "y": 63,
+ "playerInvOnly": true,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": "/wardrobe",
+ "icon": "extra:armor"
+ },
+ {
+ "x": 129,
+ "y": 63,
+ "playerInvOnly": true,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": "/enderchest",
+ "icon": "ENDER_CHEST"
+ },
+ {
+ "x": 150,
+ "y": 63,
+ "playerInvOnly": true,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": "hotm",
+ "icon": "skull:86f06eaa3004aeed09b3d5b45d976de584e691c0e9cade133635de93d23b9edb"
+ },
+ {
+ "x": 87,
+ "y": 5,
+ "playerInvOnly": true,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": "",
+ "icon": "GOLD_BLOCK"
+ },
+ {
+ "x": 108,
+ "y": 5,
+ "playerInvOnly": true,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": 129,
+ "y": 5,
+ "playerInvOnly": true,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": 150,
+ "y": 5,
+ "playerInvOnly": true,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": "/pv",
+ "icon": "PAINTING"
+ },
+ {
+ "x": 87,
+ "y": 25,
+ "playerInvOnly": true,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": 105,
+ "y": 25,
+ "playerInvOnly": true,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": 87,
+ "y": 43,
+ "playerInvOnly": true,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": 105,
+ "y": 43,
+ "playerInvOnly": true,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": 143,
+ "y": 35,
+ "playerInvOnly": true,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": 60,
+ "y": 8,
+ "playerInvOnly": true,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": "",
+ "icon": "extra:baubles_gold"
+ },
+ {
+ "x": 60,
+ "y": 60,
+ "playerInvOnly": true,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": 26,
+ "y": 8,
+ "playerInvOnly": true,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": 26,
+ "y": 60,
+ "playerInvOnly": true,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": 2,
+ "y": 2,
+ "playerInvOnly": false,
+ "anchorRight": true,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": "/ah",
+ "icon": "GOLD_BLOCK"
+ },
+ {
+ "x": 2,
+ "y": 22,
+ "playerInvOnly": false,
+ "anchorRight": true,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": "/bz",
+ "icon": "GOLD_BARDING"
+ },
+ {
+ "x": 2,
+ "y": 42,
+ "playerInvOnly": false,
+ "anchorRight": true,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": 2,
+ "y": 62,
+ "playerInvOnly": false,
+ "anchorRight": true,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": "warp museum",
+ "icon": "skull:438cf3f8e54afc3b3f91d20a49f324dca1486007fe545399055524c17941f4dc"
+ },
+ {
+ "x": 2,
+ "y": -84,
+ "playerInvOnly": false,
+ "anchorRight": true,
+ "anchorBottom": true,
+ "backgroundIndex": 0,
+ "command": "/warp home",
+ "icon": "skull:c9c8881e42915a9d29bb61a16fb26d059913204d265df5b439b3d792acd56"
+ },
+ {
+ "x": 2,
+ "y": -64,
+ "playerInvOnly": false,
+ "anchorRight": true,
+ "anchorBottom": true,
+ "backgroundIndex": 0,
+ "command": "/warp hub",
+ "icon": "skull:d7cc6687423d0570d556ac53e0676cb563bbdd9717cd8269bdebed6f6d4e7bf8"
+ },
+ {
+ "x": 2,
+ "y": -44,
+ "playerInvOnly": false,
+ "anchorRight": true,
+ "anchorBottom": true,
+ "backgroundIndex": 0,
+ "command": "/warp dungeon_hub",
+ "icon": "skull:9b56895b9659896ad647f58599238af532d46db9c1b0389b8bbeb70999dab33d"
+ },
+ {
+ "x": 2,
+ "y": -24,
+ "playerInvOnly": false,
+ "anchorRight": true,
+ "anchorBottom": true,
+ "backgroundIndex": 0,
+ "command": "/warp end",
+ "icon": "skull:7840b87d52271d2a755dedc82877e0ed3df67dcc42ea479ec146176b02779a5"
+ },
+ {
+ "x": 4,
+ "y": -19,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": 25,
+ "y": -19,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": 46,
+ "y": -19,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": 67,
+ "y": -19,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": 88,
+ "y": -19,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": 109,
+ "y": -19,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": 130,
+ "y": -19,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": 151,
+ "y": -19,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": -19,
+ "y": 2,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": -19,
+ "y": 22,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": -19,
+ "y": 42,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": -19,
+ "y": 62,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": false,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": -19,
+ "y": -84,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": true,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": -19,
+ "y": -64,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": true,
+ "backgroundIndex": 0,
+ "command": ""
+ },
+ {
+ "x": -19,
+ "y": -44,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": true,
+ "backgroundIndex": 0,
+ "command": "warp barn",
+ "icon": "skull:4d3a6bd98ac1833c664c4909ff8d2dc62ce887bdcf3cc5b3848651ae5af6b"
+ },
+ {
+ "x": -19,
+ "y": -24,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": true,
+ "backgroundIndex": 0,
+ "command": "warp desert",
+ "icon": "skull:51539dddf9ed255ece6348193cd75012c82c93aec381f05572cecf7379711b3b"
+ },
+ {
+ "x": 4,
+ "y": 2,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": true,
+ "backgroundIndex": 0,
+ "command": "/warp gold",
+ "icon": "skull:73bc965d579c3c6039f0a17eb7c2e6faf538c7a5de8e60ec7a719360d0a857a9"
+ },
+ {
+ "x": 25,
+ "y": 2,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": true,
+ "backgroundIndex": 0,
+ "command": "/warp deep",
+ "icon": "skull:569a1f114151b4521373f34bc14c2963a5011cdc25a6554c48c708cd96ebfc"
+ },
+ {
+ "x": 46,
+ "y": 2,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": true,
+ "backgroundIndex": 0,
+ "command": "/warp crystals",
+ "icon": "skull:21dbe30b027acbceb612563bd877cd7ebb719ea6ed1399027dcee58bb9049d4a"
+ },
+ {
+ "x": 67,
+ "y": 2,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": true,
+ "backgroundIndex": 0,
+ "command": "/warp forge",
+ "icon": "skull:5cbd9f5ec1ed007259996491e69ff649a3106cf920227b1bb3a71ee7a89863f"
+ },
+ {
+ "x": 88,
+ "y": 2,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": true,
+ "backgroundIndex": 0,
+ "command": "/warp mines",
+ "icon": "skull:6b20b23c1aa2be0270f016b4c90d6ee6b8330a17cfef87869d6ad60b2ffbf3b5"
+ },
+ {
+ "x": 109,
+ "y": 2,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": true,
+ "backgroundIndex": 0,
+ "command": "/warp park",
+ "icon": "skull:a221f813dacee0fef8c59f76894dbb26415478d9ddfc44c2e708a6d3b7549b"
+ },
+ {
+ "x": 130,
+ "y": 2,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": true,
+ "backgroundIndex": 0,
+ "command": "/warp spider",
+ "icon": "skull:9d7e3b19ac4f3dee9c5677c135333b9d35a7f568b63d1ef4ada4b068b5a25"
+ },
+ {
+ "x": 151,
+ "y": 2,
+ "playerInvOnly": false,
+ "anchorRight": false,
+ "anchorBottom": true,
+ "backgroundIndex": 0,
+ "command": "/warp nether",
+ "icon": "skull:c3687e25c632bce8aa61e0d64c24e694c3eea629ea944f4cf30dcfb4fbce071"
}
],
"More Buttons":[
--
cgit
From 73dbbed409a86328144f2c75f460426e7baa6ae1 Mon Sep 17 00:00:00 2001
From: Roman / Nea
Date: Thu, 2 Jun 2022 09:59:07 +0200
Subject: Loomerings (#152)
---
.github/CODEOWNERS | 1 +
.github/workflows/build.yml | 8 +-
CONTRIBUTING.md | 34 ++++++
README.md | 2 +
build.gradle.kts | 120 ++++++++++-----------
gradle.properties | 3 +-
gradle/wrapper/gradle-wrapper.properties | 2 +-
settings.gradle.kts | 32 +++---
.../notenoughupdates/listener/RenderListener.java | 42 ++++----
.../miscfeatures/AuctionSortModeWarning.java | 5 +-
.../notenoughupdates/miscfeatures/SlotLocking.java | 21 ++--
.../notenoughupdates/miscgui/GuiCustomEnchant.java | 3 +-
.../notenoughupdates/miscgui/KatSitterOverlay.java | 7 +-
.../notenoughupdates/miscgui/StorageOverlay.java | 12 +--
.../notenoughupdates/miscgui/TradeWindow.java | 4 +-
.../mixins/AccessorEntityAgeable.java | 6 +-
.../mixins/AccessorGuiContainer.java | 33 ++++++
.../mixins/AccessorGuiEditSign.java | 12 +++
.../notenoughupdates/mixins/MixinEntityPlayer.java | 2 +-
.../mixins/MixinEntityRenderer.java | 2 +-
.../notenoughupdates/mixins/MixinMinecraft.java | 2 +-
.../overlays/AuctionSearchOverlay.java | 5 +-
.../overlays/RancherBootOverlay.java | 3 +-
.../notenoughupdates/recipes/CraftingOverlay.java | 19 ++--
src/main/resources/mixins.notenoughupdates.json | 3 +
src/main/resources/notenoughupdates_at.cfg | 11 --
26 files changed, 241 insertions(+), 153 deletions(-)
create mode 100644 CONTRIBUTING.md
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiContainer.java
create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiEditSign.java
delete mode 100644 src/main/resources/notenoughupdates_at.cfg
(limited to 'src/main/resources')
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 2381ceb8..327c4e17 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1,2 +1,3 @@
/src/main/java/io/github/moulberry/notenoughupdates/recipes/* @romangraef
/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemRecipe.java @romangraef
+/*gradle* @romangraef
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 3b6d0cbd..630d8288 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -34,14 +34,14 @@ jobs:
./.github/workflows/send_webhook_update.sh
env:
STATUS: WORKING
- - name: Set up JDK 8
+ - name: Set up JDK 17
uses: actions/setup-java@v2
with:
- java-version: 8
- distribution: zulu
+ java-version: 17
+ distribution: temurin
cache: gradle
- name: Build with Gradle
- run: chmod +x ./gradlew && ./gradlew setupCIWorkspace build --no-daemon
+ run: chmod +x ./gradlew && ./gradlew clean test remapJar --no-daemon
- uses: actions/upload-artifact@v2
with:
path: build/libs/*-dep.jar
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 00000000..d2d14086
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,34 @@
+## Before you contribute
+
+ - Please check your feature / bug isn't already fixed in one of our pre-releases or on [the development branch](https://github.com/NotEnoughUpdates/NotEnoughUpdates/tree/master/).
+ - Consider joining our [Discord](https://discord.gg/moulberry) to check in on newest developments by other people, or to get help with problems you encounter.
+ - Please check that your feature idea complies with the [Hypixel Rules](https://hypixel.net/rules)
+ - Check that your feature idea isn't already done in other mods. (E.g. Dungeon Solver)
+
+## Setting up a development environment
+
+### Software prerequisites
+
+ - Install a Java Development Kit (You will need both version 8 and version 17) [Eclipse Temurin Download](https://adoptium.net/temurin/releases) for convenience, however any JDK will do.
+ - Install Git. [Windows download](https://git-scm.com/download/win)
+ - Install an IDE, such as [Jetbrains IntelliJ IDEA](https://www.jetbrains.com/idea/download).
+
+### Software configuration
+
+ - Clone the NEU repository using `git clone https://github.com/NotEnoughUpdates/NotEnoughUpdates`.
+ - Import that folder as a Gradle Project in your IDE (IntelliJ should autodetect it as gradle if you select the `NotEnoughUpdates` folder in the Open dialog)
+ - Set your project SDK to your 1.8 JDK. This can be done in the modules settings (CTRL+ALT+SHIFT+S) in IntelliJ.
+ - Set your gradle JVM to your 1.17 JDK. This can be done by searching for `gradle jvm` in the CTRL+SHIFT+A dialog in IntelliJ.
+ - Run the `genRuns` gradle task. In IntelliJ that can be done in the gradle tab on the right side of your IDE.
+ - Optionally, run the `genSources` gradle task.
+ - Run the `Minecraft Client` to make sure that everything works.
+
+
+## Logging into Hypixel in a development environment.
+
+Use [DevAuth](https://github.com/DJtheRedstoner/DevAuth). Download the `forge-legacy` version, and put it into the `run/mods` folder. Then follow the configuration instructions in the [DevAuth README](https://github.com/DJtheRedstoner/DevAuth#configuration-file)
+
+## Hot Reloading
+
+Hot Reloading is possible by first launching using the IntelliJ debugger with [DCEVM 1.8](https://dcevm.github.io/). Then running a regular build and confirming the reload prompt. This can cause issues (especially with commands), so restarting is sometimes still necessary.
+
diff --git a/README.md b/README.md
index 2b771bb9..f4b2c15d 100644
--- a/README.md
+++ b/README.md
@@ -36,6 +36,8 @@ NotEnoughUpdates (NEU) is a feature rich 1.8.9 Minecraft forge mod for Hypixel S
## Getting Started
+If you want to install NEU for development purposes, see [CONTRIBUTING](CONTRIBUTING.md)
+
**Installing Forge:**
1. Run normal Minecraft 1.8.9 and once it reaches the title screen wait about 5 seconds and close it.
diff --git a/build.gradle.kts b/build.gradle.kts
index b9374fc0..4ebdd218 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,24 +1,25 @@
-import net.minecraftforge.gradle.user.ReobfMappingType
import java.io.ByteArrayOutputStream
plugins {
+ idea
java
- id("net.minecraftforge.gradle.forge") version "6f5327738df"
- id("com.github.johnrengelman.shadow") version "6.1.0"
- id("org.spongepowered.mixin") version "d75e32e"
+ id("gg.essential.loom") version "0.10.0.+"
+ id("dev.architectury.architectury-pack200") version "0.1.3"
+ id("com.github.johnrengelman.shadow") version "7.1.2"
}
+
+// Build metadata
+
group = "io.github.moulberry"
val baseVersion = "2.1"
val buildExtra = mutableListOf()
val buildVersion = properties["BUILD_VERSION"] as? String
-if (buildVersion != null)
- buildExtra.add(buildVersion)
+if (buildVersion != null) buildExtra.add(buildVersion)
val githubCi = properties["GITHUB_ACTIONS"] as? String
-if (githubCi == "true")
- buildExtra.add("ci")
+if (githubCi == "true") buildExtra.add("ci")
val stdout = ByteArrayOutputStream()
val execResult = exec {
@@ -43,53 +44,58 @@ if (gitDiffStdout.toByteArray().isNotEmpty()) {
version = baseVersion + (if (buildExtra.isEmpty()) "" else buildExtra.joinToString(prefix = "+", separator = "."))
-// Toolchains:
-
-java {
- // Forge Gradle currently prevents using the toolchain: toolchain.languageVersion.set(JavaLanguageVersion.of(8))
- sourceCompatibility = JavaVersion.VERSION_1_8
- targetCompatibility = JavaVersion.VERSION_1_8
-}
-
-minecraft {
- version = "1.8.9-11.15.1.2318-1.8.9"
- runDir = "run"
- mappings = "stable_22"
- makeObfSourceJar = false
- clientJvmArgs.addAll(
- listOf(
- "-Dmixin.debug=true",
- "-Dasmhelper.verbose=true"
- )
- )
- clientRunArgs.addAll(
- listOf(
- "--tweakClass org.spongepowered.asm.launch.MixinTweaker",
- "--mixin mixins.notenoughupdates.json"
- )
- )
+// Minecraft configuration:
+loom {
+ launchConfigs {
+ "client" {
+ property("mixin.debug", "true")
+ property("asmhelper.verbose", "true")
+ arg("--tweakClass", "org.spongepowered.asm.launch.MixinTweaker")
+ arg("--mixin", "mixins.notenoughupdates.json")
+ }
+ }
+ runConfigs {
+ "server" {
+ isIdeConfigGenerated = false
+ }
+ }
+ forge {
+ pack200Provider.set(dev.architectury.pack200.java.Pack200Adapter())
+ mixinConfig("mixins.notenoughupdates.json")
+ }
+ mixin {
+ defaultRefmapName.set("mixins.notenoughupdates.refmap.json")
+ }
}
-mixin {
- add(sourceSets.main.get(), "mixins.notenoughupdates.refmap.json")
-}
// Dependencies:
-
repositories {
- mavenCentral()
- maven("https://repo.spongepowered.org/maven/")
+ mavenCentral()
+ mavenLocal()
+ maven("https://repo.spongepowered.org/maven/")
+ maven("https://jitpack.io")
}
dependencies {
- implementation("org.spongepowered:mixin:0.7.11-SNAPSHOT")
- annotationProcessor("org.spongepowered:mixin:0.7.11-SNAPSHOT")
- implementation("com.fasterxml.jackson.core:jackson-core:2.13.1")
- implementation("info.bliki.wiki:bliki-core:3.1.0")
+ minecraft("com.mojang:minecraft:1.8.9")
+ mappings("de.oceanlabs.mcp:mcp_stable:22-1.8.9")
+ forge("net.minecraftforge:forge:1.8.9-11.15.1.2318-1.8.9")
+
+ implementation("org.spongepowered:mixin:0.7.11-SNAPSHOT")
+ annotationProcessor("org.spongepowered:mixin:0.8.4-SNAPSHOT")
+ implementation("com.fasterxml.jackson.core:jackson-core:2.13.1")
+ implementation("info.bliki.wiki:bliki-core:3.1.0")
testImplementation("org.junit.jupiter:junit-jupiter:5.8.2")
+ // modImplementation("io.github.notenoughupdates:MoulConfig:0.0.1")
}
+
+java {
+ toolchain.languageVersion.set(JavaLanguageVersion.of(8))
+}
+
// Tasks:
tasks.withType(JavaCompile::class) {
@@ -97,7 +103,7 @@ tasks.withType(JavaCompile::class) {
}
tasks.named("test") {
- useJUnitPlatform()
+ useJUnitPlatform()
}
tasks.withType(Jar::class) {
@@ -108,18 +114,21 @@ tasks.withType(Jar::class) {
this["MixinConfigs"] = "mixins.notenoughupdates.json"
this["FMLCorePluginContainsFMLMod"] = "true"
this["ForceLoadAsMod"] = "true"
- this["FMLAT"] = "notenoughupdates_at.cfg"
}
}
-tasks.shadowJar {
+val remapJar by tasks.named("remapJar") {
archiveClassifier.set("dep")
+ from(tasks.shadowJar)
+}
+
+tasks.shadowJar {
+ archiveClassifier.set("dep-dev")
exclude(
- "module-info.class",
- "LICENSE.txt"
+ "module-info.class", "LICENSE.txt"
)
dependencies {
- include(dependency("org.spongepowered:mixin:0.7.11-SNAPSHOT"))
+ include(dependency("org.spongepowered:mixin:0.8.5"))
include(dependency("commons-io:commons-io"))
include(dependency("org.apache.commons:commons-lang3"))
@@ -137,23 +146,14 @@ tasks.shadowJar {
relocate("org.slf4j")
}
-tasks.build.get().dependsOn(tasks.shadowJar)
-
-reobf {
- create("shadowJar") {
- mappingType = ReobfMappingType.SEARGE
- }
-}
+tasks.assemble.get().dependsOn(remapJar)
tasks.processResources {
- from(sourceSets.main.get().resources.srcDirs)
filesMatching("mcmod.info") {
expand(
- "version" to project.version,
- "mcversion" to minecraft.version
+ "version" to project.version, "mcversion" to "1.8.9"
)
}
- rename("(.+_at.cfg)".toPattern(), "META-INF/$1")
}
sourceSets.main {
diff --git a/gradle.properties b/gradle.properties
index bf86fb71..87c0a7c6 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1 +1,2 @@
-org.gradle.jvmargs=-Xmx2G
\ No newline at end of file
+org.gradle.jvmargs=-Xmx2G
+loom.platform=forge
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index c1ff7937..eed1d25a 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 44138312..4df48664 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -1,17 +1,21 @@
pluginManagement {
repositories {
- mavenCentral()
- gradlePluginPortal()
- maven(url = "https://jitpack.io/")
- maven(url = "https://maven.minecraftforge.net/")
- maven(url = "https://repo.spongepowered.org/maven/")
- }
- resolutionStrategy {
- eachPlugin {
- when (requested.id.id) {
- "net.minecraftforge.gradle.forge" -> useModule("com.github.asbyth:ForgeGradle:${requested.version}")
- "org.spongepowered.mixin" -> useModule("com.github.LxGaming:MixinGradle:${requested.version}")
- }
- }
- }
+ mavenCentral()
+ gradlePluginPortal()
+ maven("https://oss.sonatype.org/content/repositories/snapshots")
+ maven("https://maven.architectury.dev/")
+ maven("https://maven.fabricmc.net")
+ maven(url = "https://jitpack.io/")
+ maven(url = "https://maven.minecraftforge.net/")
+ maven(url = "https://repo.spongepowered.org/maven/")
+ maven(url = "https://repo.sk1er.club/repository/maven-releases/")
+ maven(url = "https://maven.architectury.dev/")
+ }
+ resolutionStrategy {
+ eachPlugin {
+ when (requested.id.id) {
+ "gg.essential.loom" -> useModule("gg.essential:architectury-loom:${requested.version}")
+ }
+ }
+ }
}
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 fcba864c..610412ac 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java
@@ -26,6 +26,7 @@ import io.github.moulberry.notenoughupdates.miscgui.GuiInvButtonEditor;
import io.github.moulberry.notenoughupdates.miscgui.GuiItemRecipe;
import io.github.moulberry.notenoughupdates.miscgui.StorageOverlay;
import io.github.moulberry.notenoughupdates.miscgui.TradeWindow;
+import io.github.moulberry.notenoughupdates.mixins.AccessorGuiContainer;
import io.github.moulberry.notenoughupdates.options.NEUConfig;
import io.github.moulberry.notenoughupdates.overlays.AuctionSearchOverlay;
import io.github.moulberry.notenoughupdates.overlays.OverlayManager;
@@ -333,10 +334,10 @@ public class RenderListener {
if (event.gui instanceof GuiContainer) {
try {
- int xSize = ((GuiContainer) event.gui).xSize;
- int ySize = ((GuiContainer) event.gui).ySize;
- int guiLeft = ((GuiContainer) event.gui).guiLeft;
- int guiTop = ((GuiContainer) event.gui).guiTop;
+ int xSize = ((AccessorGuiContainer) event.gui).getXSize();
+ int ySize = ((AccessorGuiContainer) event.gui).getYSize();
+ int guiLeft = ((AccessorGuiContainer) event.gui).getGuiLeft();
+ int guiTop = ((AccessorGuiContainer) event.gui).getGuiTop();
hoverInv = event.getMouseX() > guiLeft && event.getMouseX() < guiLeft + xSize && event.getMouseY() > guiTop &&
event.getMouseY() < guiTop + ySize;
@@ -458,10 +459,10 @@ public class RenderListener {
GlStateManager.translate(0, 0, zOffset);
- int xSize = ((GuiContainer) event.gui).xSize;
- int ySize = ((GuiContainer) event.gui).ySize;
- int guiLeft = ((GuiContainer) event.gui).guiLeft;
- int guiTop = ((GuiContainer) event.gui).guiTop;
+ int xSize = ((AccessorGuiContainer) event.gui).getXSize();
+ int ySize = ((AccessorGuiContainer) event.gui).getYSize();
+ int guiLeft = ((AccessorGuiContainer) event.gui).getGuiLeft();
+ int guiTop = ((AccessorGuiContainer) event.gui).getGuiTop();
if (!NEUApi.disableInventoryButtons) {
for (NEUConfig.InventoryButton button : NotEnoughUpdates.INSTANCE.config.hidden.inventoryButtons) {
@@ -565,10 +566,10 @@ public class RenderListener {
if (!doInventoryButtons) return;
if (NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard() && NotificationHandler.shouldRenderOverlay(event.gui) &&
event.gui instanceof GuiContainer) {
- int xSize = ((GuiContainer) event.gui).xSize;
- int ySize = ((GuiContainer) event.gui).ySize;
- int guiLeft = ((GuiContainer) event.gui).guiLeft;
- int guiTop = ((GuiContainer) event.gui).guiTop;
+ int xSize = ((AccessorGuiContainer) event.gui).getXSize();
+ int ySize = ((AccessorGuiContainer) event.gui).getYSize();
+ int guiLeft = ((AccessorGuiContainer) event.gui).getGuiLeft();
+ int guiTop = ((AccessorGuiContainer) event.gui).getGuiTop();
if (!NEUApi.disableInventoryButtons) {
for (NEUConfig.InventoryButton button : NotEnoughUpdates.INSTANCE.config.hidden.inventoryButtons) {
@@ -644,9 +645,9 @@ public class RenderListener {
if (gui instanceof GuiChest && NotEnoughUpdates.INSTANCE.config.dungeons.profitDisplayLoc != 2) {
try {
- int xSize = ((GuiContainer) gui).xSize;
- int guiLeft = ((GuiContainer) gui).guiLeft;
- int guiTop = ((GuiContainer) gui).guiTop;
+ int xSize = ((AccessorGuiContainer) gui).getXSize();
+ int guiLeft = ((AccessorGuiContainer) gui).getGuiLeft();
+ int guiTop = ((AccessorGuiContainer) gui).getGuiTop();
GuiChest eventGui = (GuiChest) gui;
ContainerChest cc = (ContainerChest) eventGui.inventorySlots;
@@ -899,8 +900,7 @@ public class RenderListener {
GuiChest eventGui = (GuiChest) guiScreen;
ContainerChest cc = (ContainerChest) eventGui.inventorySlots;
containerName = cc.getLowerChestInventory().getDisplayName().getUnformattedText();
- if (containerName.contains(" Profile") && BetterContainers.profileViewerStackIndex != -1 &&
- eventGui.isMouseOverSlot(cc.inventorySlots.get(BetterContainers.profileViewerStackIndex), mouseX, mouseY) &&
+ if (containerName.contains(" Profile") && BetterContainers.profileViewerStackIndex != -1 && ((AccessorGuiContainer)eventGui).doIsMouseOverSlot(cc.inventorySlots.get(BetterContainers.profileViewerStackIndex), mouseX, mouseY) &&
Mouse.getEventButton() >= 0) {
event.setCanceled(true);
if (Mouse.getEventButtonState() && eventGui.inventorySlots.inventorySlots.get(22).getStack() != null &&
@@ -959,10 +959,10 @@ public class RenderListener {
if (!doInventoryButtons) return;
if (NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard() && NotificationHandler.shouldRenderOverlay(event.gui) &&
Mouse.getEventButton() >= 0 && event.gui instanceof GuiContainer) {
- int xSize = ((GuiContainer) event.gui).xSize;
- int ySize = ((GuiContainer) event.gui).ySize;
- int guiLeft = ((GuiContainer) event.gui).guiLeft;
- int guiTop = ((GuiContainer) event.gui).guiTop;
+ int xSize = ((AccessorGuiContainer) event.gui).getXSize();
+ int ySize = ((AccessorGuiContainer) event.gui).getYSize();
+ int guiLeft = ((AccessorGuiContainer) event.gui).getGuiLeft();
+ int guiTop = ((AccessorGuiContainer) event.gui).getGuiTop();
if (!NEUApi.disableInventoryButtons) {
for (NEUConfig.InventoryButton button : NotEnoughUpdates.INSTANCE.config.hidden.inventoryButtons) {
if (!button.isActive()) continue;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionSortModeWarning.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionSortModeWarning.java
index 4b526185..5137c90f 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionSortModeWarning.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionSortModeWarning.java
@@ -3,6 +3,7 @@ package io.github.moulberry.notenoughupdates.miscfeatures;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils;
import io.github.moulberry.notenoughupdates.core.util.render.TextRenderUtils;
+import io.github.moulberry.notenoughupdates.mixins.AccessorGuiContainer;
import io.github.moulberry.notenoughupdates.util.SBInfo;
import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
@@ -57,8 +58,8 @@ public class AuctionSortModeWarning {
String warningText = "\u00a7aSort: " + selectedColour + selectedSort;
int warningLength = Minecraft.getMinecraft().fontRendererObj.getStringWidth(warningText);
- int centerX = chest.guiLeft + chest.xSize / 2 + 9;
- int centerY = chest.guiTop + 26;
+ int centerX = ((AccessorGuiContainer)chest).getGuiLeft() + ((AccessorGuiContainer)chest).getXSize() / 2 + 9;
+ int centerY = ((AccessorGuiContainer)chest).getGuiTop() + 26;
RenderUtils.drawFloatingRectDark(centerX - warningLength / 2 - 4, centerY - 6,
warningLength + 8, 12, false
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SlotLocking.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SlotLocking.java
index 743625f5..9292c0d3 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SlotLocking.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SlotLocking.java
@@ -5,6 +5,7 @@ import com.google.gson.GsonBuilder;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.core.config.KeybindHelper;
import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils;
+import io.github.moulberry.notenoughupdates.mixins.AccessorGuiContainer;
import io.github.moulberry.notenoughupdates.util.SBInfo;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.ISound;
@@ -200,7 +201,7 @@ public class SlotLocking {
int mouseX = Mouse.getX() * scaledWidth / Minecraft.getMinecraft().displayWidth;
int mouseY = scaledHeight - Mouse.getY() * scaledHeight / Minecraft.getMinecraft().displayHeight - 1;
- Slot slot = container.getSlotAtPosition(mouseX, mouseY);
+ Slot slot = ((AccessorGuiContainer) container).doGetSlotAtPosition(mouseX, mouseY);
if (slot != null && slot.getSlotIndex() != 8 && slot.inventory == Minecraft.getMinecraft().thePlayer.inventory) {
int slotNum = slot.getSlotIndex();
if (slotNum >= 0 && slotNum <= 39) {
@@ -280,7 +281,7 @@ public class SlotLocking {
int mouseX = Mouse.getX() * scaledWidth / Minecraft.getMinecraft().displayWidth;
int mouseY = scaledHeight - Mouse.getY() * scaledHeight / Minecraft.getMinecraft().displayHeight - 1;
- Slot slot = container.getSlotAtPosition(mouseX, mouseY);
+ Slot slot = ((AccessorGuiContainer) container).doGetSlotAtPosition(mouseX, mouseY);
if (slot != null && slot.getSlotIndex() != 8 && slot.inventory == Minecraft.getMinecraft().thePlayer.inventory) {
int slotNum = slot.getSlotIndex();
if (slotNum >= 0 && slotNum <= 39) {
@@ -378,10 +379,10 @@ public class SlotLocking {
if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) {
return;
}
- GuiContainer container = (GuiContainer) Minecraft.getMinecraft().currentScreen;
+ AccessorGuiContainer container = (AccessorGuiContainer) Minecraft.getMinecraft().currentScreen;
- int x1 = container.guiLeft + pairingSlot.xDisplayPosition + 8;
- int y1 = container.guiTop + pairingSlot.yDisplayPosition + 8;
+ int x1 = container.getGuiLeft() + pairingSlot.xDisplayPosition + 8;
+ int y1 = container.getGuiTop() + pairingSlot.yDisplayPosition + 8;
int x2 = event.mouseX;
int y2 = event.mouseY;
@@ -514,7 +515,7 @@ public class SlotLocking {
return;
}
- boolean hoverOverSlot = container.isMouseOverSlot(slot, mouseX, mouseY);
+ boolean hoverOverSlot = ((AccessorGuiContainer) container).doIsMouseOverSlot(slot, mouseX, mouseY);
if (hoverOverSlot || slot.getSlotIndex() >= 9) {
Minecraft.getMinecraft().getTextureManager().bindTexture(BOUND);
@@ -545,8 +546,8 @@ public class SlotLocking {
);
}
} else if (pairingSlot != null && lockKeyHeld && slot.getSlotIndex() < 8) {
- int x1 = container.guiLeft + pairingSlot.xDisplayPosition;
- int y1 = container.guiTop + pairingSlot.yDisplayPosition;
+ int x1 = ((AccessorGuiContainer)container).getGuiLeft() + pairingSlot.xDisplayPosition;
+ int y1 = ((AccessorGuiContainer)container).getGuiTop() + pairingSlot.yDisplayPosition;
if (mouseX <= x1 || mouseX >= x1 + 16 ||
mouseY <= y1 || mouseY >= y1 + 16) {
@@ -634,8 +635,8 @@ public class SlotLocking {
int mouseX = Mouse.getX() * scaledWidth / Minecraft.getMinecraft().displayWidth;
int mouseY = scaledHeight - Mouse.getY() * scaledHeight / Minecraft.getMinecraft().displayHeight - 1;
- int x1 = container.guiLeft + pairingSlot.xDisplayPosition;
- int y1 = container.guiTop + pairingSlot.yDisplayPosition;
+ int x1 = ((AccessorGuiContainer)container).getGuiLeft() + pairingSlot.xDisplayPosition;
+ int y1 = ((AccessorGuiContainer)container).getGuiTop() + pairingSlot.yDisplayPosition;
if (mouseX <= x1 || mouseX >= x1 + 16 ||
mouseY <= y1 || mouseY >= y1 + 16) {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.java
index 25869452..42340259 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.java
@@ -9,6 +9,7 @@ import io.github.moulberry.notenoughupdates.core.GuiElementTextField;
import io.github.moulberry.notenoughupdates.core.util.lerp.LerpingFloat;
import io.github.moulberry.notenoughupdates.core.util.lerp.LerpingInteger;
import io.github.moulberry.notenoughupdates.miscfeatures.SlotLocking;
+import io.github.moulberry.notenoughupdates.mixins.AccessorGuiContainer;
import io.github.moulberry.notenoughupdates.options.NEUConfig;
import io.github.moulberry.notenoughupdates.util.Constants;
import io.github.moulberry.notenoughupdates.util.Utils;
@@ -945,7 +946,7 @@ public class GuiCustomEnchant extends Gui {
GlStateManager.pushMatrix();
GlStateManager.translate(guiLeft + 102 - 8, guiTop + 191 - (inventoryStartIndex / 9 * 18 + 89), 0);
Slot slot = cc.getSlot(inventoryStartIndex + i);
- chest.drawSlot(slot);
+ ((AccessorGuiContainer)chest).doDrawSlot(slot);
GlStateManager.popMatrix();
if (mouseX >= itemX && mouseX < itemX + 18 &&
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/KatSitterOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/KatSitterOverlay.java
index 107d4db2..5a763411 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/KatSitterOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/KatSitterOverlay.java
@@ -2,6 +2,7 @@ package io.github.moulberry.notenoughupdates.miscgui;
import com.google.gson.JsonObject;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
+import io.github.moulberry.notenoughupdates.mixins.AccessorGuiContainer;
import io.github.moulberry.notenoughupdates.util.Utils;
import io.github.moulberry.notenoughupdates.util.XPInformation;
import net.minecraft.client.Minecraft;
@@ -61,12 +62,12 @@ public class KatSitterOverlay {
int currentWidth = font.getStringWidth(currentText);
String upgradedText = "Upgraded pet level: " + upgradedLevel;
int upgradedWidth = font.getStringWidth(upgradedText);
- int left = gui.guiLeft - 30 - (upgradedLevel == null ? Math.max(upgradedWidth, currentWidth) : currentWidth);
+ int left = ((AccessorGuiContainer)gui).getGuiLeft() - 30 - (upgradedLevel == null ? Math.max(upgradedWidth, currentWidth) : currentWidth);
GlStateManager.disableLighting();
GlStateManager.color(1F, 1F, 1F, 1F);
- Utils.drawStringScaled(currentText, font, left, gui.guiTop + 25, false, 0xFFD700, 1F);
+ Utils.drawStringScaled(currentText, font, left, ((AccessorGuiContainer)gui).getGuiTop() + 25, false, 0xFFD700, 1F);
if (upgradedLevel != null)
- Utils.drawStringScaled(upgradedText, font, left, gui.guiTop + 45, false, 0xFFD700, 1F);
+ Utils.drawStringScaled(upgradedText, font, left, ((AccessorGuiContainer)gui).getGuiTop() + 45, false, 0xFFD700, 1F);
}
public String nextRarity(String currentRarity) {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/StorageOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/StorageOverlay.java
index ac3ddfb8..cb81589d 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/StorageOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/StorageOverlay.java
@@ -12,6 +12,7 @@ import io.github.moulberry.notenoughupdates.core.util.lerp.LerpingInteger;
import io.github.moulberry.notenoughupdates.miscfeatures.BetterContainers;
import io.github.moulberry.notenoughupdates.miscfeatures.SlotLocking;
import io.github.moulberry.notenoughupdates.miscfeatures.StorageManager;
+import io.github.moulberry.notenoughupdates.mixins.AccessorGuiContainer;
import io.github.moulberry.notenoughupdates.util.NotificationHandler;
import io.github.moulberry.notenoughupdates.util.SpecialColour;
import io.github.moulberry.notenoughupdates.util.Utils;
@@ -737,7 +738,7 @@ public class StorageOverlay extends GuiElement {
if (storageId == currentPage) {
Utils.hasEffectOverride = true;
GlStateManager.translate(storageX - 7, storageY - 17 - 18, 0);
- guiChest.drawSlot(containerChest.getSlot(k + 9));
+ ((AccessorGuiContainer)guiChest).doDrawSlot(containerChest.getSlot(k + 9));
GlStateManager.translate(-storageX + 7, -storageY + 17 + 18, 0);
Utils.hasEffectOverride = false;
} else {
@@ -752,7 +753,7 @@ public class StorageOverlay extends GuiElement {
} else if (storageId == currentPage) {
Utils.hasEffectOverride = true;
GlStateManager.translate(storageX - 7, storageY - 17 - 18, 0);
- guiChest.drawSlot(containerChest.getSlot(k + 9));
+ ((AccessorGuiContainer)guiChest).doDrawSlot(containerChest.getSlot(k + 9));
GlStateManager.translate(-storageX + 7, -storageY + 17 + 18, 0);
Utils.hasEffectOverride = false;
} else {
@@ -1268,7 +1269,7 @@ public class StorageOverlay extends GuiElement {
GlStateManager.pushMatrix();
GlStateManager.translate(181 - 8, storageViewSize + 18 - (inventoryStartIndex / 9 * 18 + 31), 0);
- guiChest.drawSlot(containerChest.inventorySlots.get(inventoryStartIndex + i));
+ ((AccessorGuiContainer)guiChest).doDrawSlot(containerChest.inventorySlots.get(inventoryStartIndex + i));
GlStateManager.popMatrix();
if (!searchBar.getText().isEmpty()) {
@@ -1302,7 +1303,7 @@ public class StorageOverlay extends GuiElement {
//Utils.drawItemStack(playerItems[i+9], itemX, itemY);
GlStateManager.pushMatrix();
GlStateManager.translate(181 - 8, storageViewSize + 18 - (inventoryStartIndex / 9 * 18 + 31), 0);
- guiChest.drawSlot(containerChest.inventorySlots.get(inventoryStartIndex + 9 + i));
+ ((AccessorGuiContainer)guiChest).doDrawSlot(containerChest.inventorySlots.get(inventoryStartIndex + 9 + i));
GlStateManager.popMatrix();
if (!searchBar.getText().isEmpty()) {
@@ -2183,8 +2184,7 @@ public class StorageOverlay extends GuiElement {
for (Slot slot : container.inventorySlots.inventorySlots) {
if (slot != null &&
- slot.inventory == Minecraft.getMinecraft().thePlayer.inventory &&
- container.isMouseOverSlot(slot, mouseX, mouseY)) {
+ slot.inventory == Minecraft.getMinecraft().thePlayer.inventory && ((AccessorGuiContainer)container).doIsMouseOverSlot(slot, mouseX, mouseY)) {
SlotLocking.getInstance().toggleLock(slot.getSlotIndex());
return true;
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TradeWindow.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TradeWindow.java
index 1c5bc2e3..1f47e6ee 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TradeWindow.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TradeWindow.java
@@ -4,6 +4,7 @@ import com.google.gson.JsonObject;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.core.config.KeybindHelper;
import io.github.moulberry.notenoughupdates.miscfeatures.SlotLocking;
+import io.github.moulberry.notenoughupdates.mixins.AccessorGuiContainer;
import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.ScaledResolution;
@@ -559,8 +560,7 @@ public class TradeWindow {
int y = 104 + 18 * (index / 9);
if (index < 9) y = 180;
- chest.drawSlot(new Slot(Minecraft.getMinecraft().thePlayer.inventory, index, guiLeft + x, guiTop + y));
- //Utils.drawItemStack(stack, guiLeft+x, guiTop+y);
+ ((AccessorGuiContainer)chest).doDrawSlot(new Slot(Minecraft.getMinecraft().thePlayer.inventory, index, guiLeft + x, guiTop + y));
int col = 0x80ffffff;
if (SlotLocking.getInstance().isSlotIndexLocked(index)) {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorEntityAgeable.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorEntityAgeable.java
index 9228f93d..e41c12eb 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorEntityAgeable.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorEntityAgeable.java
@@ -1,12 +1,14 @@
package io.github.moulberry.notenoughupdates.mixins;
import net.minecraft.entity.EntityAgeable;
+import net.minecraft.inventory.Slot;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
+import org.spongepowered.asm.mixin.gen.Invoker;
@Mixin(EntityAgeable.class)
public interface AccessorEntityAgeable {
- @Accessor(value = "growingAge")
- void setGrowingAgeDirect(int newValue);
+ @Accessor(value = "growingAge")
+ void setGrowingAgeDirect(int newValue);
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiContainer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiContainer.java
new file mode 100644
index 00000000..3966317b
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiContainer.java
@@ -0,0 +1,33 @@
+package io.github.moulberry.notenoughupdates.mixins;
+
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.inventory.Slot;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+import org.spongepowered.asm.mixin.gen.Invoker;
+
+@Mixin(GuiContainer.class)
+public interface AccessorGuiContainer {
+
+ @Invoker("getSlotAtPosition")
+ Slot doGetSlotAtPosition(int x, int y);
+
+ @Invoker("drawSlot")
+ void doDrawSlot(Slot slot);
+
+ @Invoker("isMouseOverSlot")
+ boolean doIsMouseOverSlot(Slot slot, int x, int y);
+
+ @Accessor("guiLeft")
+ int getGuiLeft();
+
+ @Accessor("guiTop")
+ int getGuiTop();
+
+ @Accessor("xSize")
+ int getXSize();
+
+ @Accessor("ySize")
+ int getYSize();
+
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiEditSign.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiEditSign.java
new file mode 100644
index 00000000..ea945d5d
--- /dev/null
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiEditSign.java
@@ -0,0 +1,12 @@
+package io.github.moulberry.notenoughupdates.mixins;
+
+import net.minecraft.client.gui.inventory.GuiEditSign;
+import net.minecraft.tileentity.TileEntitySign;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+@Mixin(GuiEditSign.class)
+public interface AccessorGuiEditSign {
+ @Accessor("tileSign")
+ TileEntitySign getTileSign();
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityPlayer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityPlayer.java
index e15d18eb..280e964e 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityPlayer.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityPlayer.java
@@ -8,7 +8,7 @@ import net.minecraft.scoreboard.ScorePlayerTeam;
import net.minecraft.scoreboard.Scoreboard;
import net.minecraft.util.BlockPos;
import net.minecraft.world.World;
-import org.spongepowered.asm.lib.Opcodes;
+import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityRenderer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityRenderer.java
index e98c3330..ab448660 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityRenderer.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityRenderer.java
@@ -9,7 +9,7 @@ import net.minecraft.client.settings.GameSettings;
import net.minecraft.entity.Entity;
import net.minecraftforge.client.ForgeHooksClient;
import org.lwjgl.util.vector.Vector3f;
-import org.spongepowered.asm.lib.Opcodes;
+import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinMinecraft.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinMinecraft.java
index b01e9609..8708afd8 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinMinecraft.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinMinecraft.java
@@ -2,7 +2,7 @@ package io.github.moulberry.notenoughupdates.mixins;
import io.github.moulberry.notenoughupdates.miscfeatures.SlotLocking;
import net.minecraft.client.Minecraft;
-import org.spongepowered.asm.lib.Opcodes;
+import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/AuctionSearchOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/AuctionSearchOverlay.java
index 36b37766..f36c0958 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/AuctionSearchOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/AuctionSearchOverlay.java
@@ -5,6 +5,7 @@ import com.google.gson.JsonObject;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.core.GuiElementTextField;
import io.github.moulberry.notenoughupdates.core.GuiScreenElementWrapper;
+import io.github.moulberry.notenoughupdates.mixins.AccessorGuiEditSign;
import io.github.moulberry.notenoughupdates.options.NEUConfigEditor;
import io.github.moulberry.notenoughupdates.util.Constants;
import io.github.moulberry.notenoughupdates.util.SBInfo;
@@ -86,7 +87,7 @@ public class AuctionSearchOverlay {
if (lastContainer == null) return false;
if (!lastContainer.equals("Auctions Browser") && !lastContainer.startsWith("Auctions: ")) return false;
- TileEntitySign tes = ((GuiEditSign) Minecraft.getMinecraft().currentScreen).tileSign;
+ TileEntitySign tes = ((AccessorGuiEditSign) Minecraft.getMinecraft().currentScreen).getTileSign();
if (tes == null) return false;
if (tes.getPos().getY() != 0) return false;
@@ -289,7 +290,7 @@ public class AuctionSearchOverlay {
}
}
- TileEntitySign tes = ((GuiEditSign) Minecraft.getMinecraft().currentScreen).tileSign;
+ TileEntitySign tes = ((AccessorGuiEditSign) Minecraft.getMinecraft().currentScreen).getTileSign();
String search = searchString.trim();
if (searchStringExtra != null && !searchStringExtra.isEmpty()) {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/RancherBootOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/RancherBootOverlay.java
index 94bd53a2..9661812f 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/RancherBootOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/RancherBootOverlay.java
@@ -2,6 +2,7 @@ package io.github.moulberry.notenoughupdates.overlays;
import io.github.moulberry.notenoughupdates.core.GuiElementTextField;
import io.github.moulberry.notenoughupdates.core.util.GuiElementSlider;
+import io.github.moulberry.notenoughupdates.mixins.AccessorGuiEditSign;
import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
@@ -31,7 +32,7 @@ public class RancherBootOverlay {
if (!(Minecraft.getMinecraft().currentScreen instanceof GuiEditSign)) return false;
- TileEntitySign tes = ((GuiEditSign) Minecraft.getMinecraft().currentScreen).tileSign;
+ TileEntitySign tes = ((AccessorGuiEditSign) Minecraft.getMinecraft().currentScreen).getTileSign();
if (tes == null) return false;
if (tes.getPos().getY() != 0) return false;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/recipes/CraftingOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/CraftingOverlay.java
index 9d305e1d..45675945 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/CraftingOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/CraftingOverlay.java
@@ -1,6 +1,7 @@
package io.github.moulberry.notenoughupdates.recipes;
import io.github.moulberry.notenoughupdates.NEUManager;
+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;
@@ -49,10 +50,10 @@ public class CraftingOverlay {
) {
forEachSlot(chest, (recipeIngredient, slot) -> {
if (Utils.isWithinRect(
- mouseX, mouseY,
- slot.xDisplayPosition + gui.guiLeft,
- slot.yDisplayPosition + gui.guiTop,
- 16, 16
+ mouseX, mouseY,
+ slot.xDisplayPosition + ((AccessorGuiContainer) gui).getGuiLeft(),
+ slot.yDisplayPosition + ((AccessorGuiContainer) gui).getGuiTop(),
+ 16, 16
))
block.accept(recipeIngredient, slot);
});
@@ -80,9 +81,9 @@ public class CraftingOverlay {
if (currentRecipe.getCraftText() != null) {
FontRenderer fontRenderer = Minecraft.getMinecraft().fontRendererObj;
fontRenderer.drawStringWithShadow(
- currentRecipe.getCraftText(),
- Utils.peekGuiScale().getScaledWidth() / 2f - fontRenderer.getStringWidth(currentRecipe.getCraftText()) / 2f,
- guiChest.guiTop - 15f, 0x808080
+ currentRecipe.getCraftText(),
+ Utils.peekGuiScale().getScaledWidth() / 2f - fontRenderer.getStringWidth(currentRecipe.getCraftText()) / 2f,
+ ((AccessorGuiContainer) guiChest).getGuiTop() - 15f, 0x808080
);
}
renderTooltip(guiChest, chest);
@@ -140,8 +141,8 @@ public class CraftingOverlay {
}
private void drawItemStack(GuiChest gui, Slot slot, ItemStack item) {
- int slotX = slot.xDisplayPosition + gui.guiLeft;
- int slotY = slot.yDisplayPosition + gui.guiTop;
+ int slotX = slot.xDisplayPosition + ((AccessorGuiContainer)gui).getGuiLeft();
+ int slotY = slot.yDisplayPosition + ((AccessorGuiContainer)gui).getGuiTop();
Gui.drawRect(slotX, slotY, slotX + 16, slotY + 16, 0x64ff0000);
if (item != null)
Utils.drawItemStack(item, slotX, slotY);
diff --git a/src/main/resources/mixins.notenoughupdates.json b/src/main/resources/mixins.notenoughupdates.json
index c6ba98b7..ab2c705e 100644
--- a/src/main/resources/mixins.notenoughupdates.json
+++ b/src/main/resources/mixins.notenoughupdates.json
@@ -1,6 +1,7 @@
{
"package": "io.github.moulberry.notenoughupdates.mixins",
"refmap": "mixins.notenoughupdates.refmap.json",
+ "minVersion": "0.7",
"compatibilityLevel": "JAVA_8",
"mixins": [
"AccessorEntityAgeable",
@@ -46,6 +47,8 @@
"MixinWorldClient"
],
"client": [
+ "AccessorGuiContainer",
+ "AccessorGuiEditSign",
"AccessorMinecraft"
]
}
diff --git a/src/main/resources/notenoughupdates_at.cfg b/src/main/resources/notenoughupdates_at.cfg
deleted file mode 100644
index c3fb5dbc..00000000
--- a/src/main/resources/notenoughupdates_at.cfg
+++ /dev/null
@@ -1,11 +0,0 @@
-public net.minecraft.client.gui.inventory.GuiContainer field_146999_f #xSize
-public net.minecraft.client.gui.inventory.GuiContainer field_147000_g #ySize
-public net.minecraft.client.gui.inventory.GuiContainer field_147003_i #guiLeft
-public net.minecraft.client.gui.inventory.GuiContainer field_147009_r #guiTop
-public net.minecraft.client.gui.inventory.GuiContainer func_146975_c(II)Lnet/minecraft/inventory/Slot; #guiTop
-public net.minecraft.client.gui.inventory.GuiEditSign field_146848_f #tileSign
-public net.minecraft.client.gui.inventory.GuiContainer func_146977_a(Lnet/minecraft/inventory/Slot;)V #drawSlot
-public net.minecraft.client.gui.inventory.GuiContainer func_146981_a(Lnet/minecraft/inventory/Slot;II)Z #isMouseOverSlot
-public net.minecraft.client.renderer.RenderGlobal field_72755_R #renderInfos
-public net.minecraft.client.renderer.RenderGlobal$ContainerLocalRenderInformation
-public net.minecraft.client.renderer.RenderGlobal$ContainerLocalRenderInformation field_178036_a #renderChunk
\ No newline at end of file
--
cgit
From ec8ec6bb6a6b82cd4369e61d0e3cd4539b9c8295 Mon Sep 17 00:00:00 2001
From: Lulonaut <67191924+Lulonaut@users.noreply.github.com>
Date: Thu, 9 Jun 2022 08:43:28 +0200
Subject: unused assets (#155)
---
.../notenoughupdates/util/GuiTextures.java | 29 +--------------------
.../assets/notenoughupdates/button20x.png | Bin 170 -> 0 bytes
.../assets/notenoughupdates/gamemodes.png | Bin 663 -> 0 bytes
.../resources/assets/notenoughupdates/logo_bg.png | Bin 21390 -> 0 bytes
.../resources/assets/notenoughupdates/logo_fg.png | Bin 5823 -> 0 bytes
.../resources/assets/notenoughupdates/next.png | Bin 3912 -> 0 bytes
.../resources/assets/notenoughupdates/next.xcf | Bin 8805 -> 0 bytes
.../resources/assets/notenoughupdates/nohup.out | 2 --
.../resources/assets/notenoughupdates/prev.png | Bin 4508 -> 0 bytes
.../resources/assets/notenoughupdates/prev.xcf | Bin 8371 -> 0 bytes
.../assets/notenoughupdates/prev_unhovered.png | Bin 4553 -> 0 bytes
.../resources/assets/notenoughupdates/pv_cata.png | Bin 5019 -> 0 bytes
.../assets/notenoughupdates/radial_circle_off.png | Bin 322 -> 0 bytes
.../assets/notenoughupdates/radial_circle_on.png | Bin 377 -> 0 bytes
.../assets/notenoughupdates/radial_square_off.png | Bin 257 -> 0 bytes
.../assets/notenoughupdates/radial_square_on.png | Bin 304 -> 0 bytes
.../assets/notenoughupdates/setting_border.png | Bin 411 -> 0 bytes
.../assets/notenoughupdates/slider_off.png | Bin 765 -> 0 bytes
.../assets/notenoughupdates/slider_on.png | Bin 767 -> 0 bytes
19 files changed, 1 insertion(+), 30 deletions(-)
delete mode 100644 src/main/resources/assets/notenoughupdates/button20x.png
delete mode 100644 src/main/resources/assets/notenoughupdates/gamemodes.png
delete mode 100644 src/main/resources/assets/notenoughupdates/logo_bg.png
delete mode 100644 src/main/resources/assets/notenoughupdates/logo_fg.png
delete mode 100644 src/main/resources/assets/notenoughupdates/next.png
delete mode 100644 src/main/resources/assets/notenoughupdates/next.xcf
delete mode 100644 src/main/resources/assets/notenoughupdates/nohup.out
delete mode 100644 src/main/resources/assets/notenoughupdates/prev.png
delete mode 100644 src/main/resources/assets/notenoughupdates/prev.xcf
delete mode 100644 src/main/resources/assets/notenoughupdates/prev_unhovered.png
delete mode 100644 src/main/resources/assets/notenoughupdates/pv_cata.png
delete mode 100644 src/main/resources/assets/notenoughupdates/radial_circle_off.png
delete mode 100644 src/main/resources/assets/notenoughupdates/radial_circle_on.png
delete mode 100644 src/main/resources/assets/notenoughupdates/radial_square_off.png
delete mode 100644 src/main/resources/assets/notenoughupdates/radial_square_on.png
delete mode 100644 src/main/resources/assets/notenoughupdates/setting_border.png
delete mode 100644 src/main/resources/assets/notenoughupdates/slider_off.png
delete mode 100644 src/main/resources/assets/notenoughupdates/slider_on.png
(limited to 'src/main/resources')
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/GuiTextures.java b/src/main/java/io/github/moulberry/notenoughupdates/util/GuiTextures.java
index 48a6915b..ba57537e 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/util/GuiTextures.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/util/GuiTextures.java
@@ -8,8 +8,6 @@ public class GuiTextures {
public static final ResourceLocation itemPaneTabArrow =
new ResourceLocation("notenoughupdates:item_pane_tab_arrow.png");
- //public static final ResourceLocation prev = new ResourceLocation("notenoughupdates:prev.png");
- //public static final ResourceLocation next = new ResourceLocation("notenoughupdates:next.png");
public static final ResourceLocation rightarrow_overlay =
new ResourceLocation("notenoughupdates:rightarrow_overlay.png");
public static final ResourceLocation rightarrow = new ResourceLocation("notenoughupdates:rightarrow.png");
@@ -19,8 +17,6 @@ public class GuiTextures {
public static final ResourceLocation off = new ResourceLocation("notenoughupdates:off.png");
public static final ResourceLocation on = new ResourceLocation("notenoughupdates:on.png");
public static final ResourceLocation help = new ResourceLocation("notenoughupdates:help.png");
- public static final ResourceLocation slider_off = new ResourceLocation("notenoughupdates:slider_off.png");
- public static final ResourceLocation slider_on = new ResourceLocation("notenoughupdates:slider_on.png");
public static final ResourceLocation slider_off_large = new ResourceLocation("notenoughupdates:slider_off_large.png");
public static final ResourceLocation slider_on_large = new ResourceLocation("notenoughupdates:slider_on_large.png");
public static final ResourceLocation slider_button = new ResourceLocation("notenoughupdates:slider_button.png");
@@ -34,36 +30,17 @@ public class GuiTextures {
public static final ResourceLocation item_mask = new ResourceLocation("notenoughupdates:item_mask.png");
public static final ResourceLocation item_haschild = new ResourceLocation("notenoughupdates:item_haschild.png");
+ public static final ResourceLocation button_white = new ResourceLocation("notenoughupdates:button_white.png");
public static final ResourceLocation button_tex = new ResourceLocation("notenoughupdates:button.png");
public static final ResourceLocation button_fsr =
new ResourceLocation("notenoughupdates:FSR_do_not_texture_this_please.png");
- public static final ResourceLocation setting_border = new ResourceLocation("notenoughupdates:setting_border.png");
-
- public static final ResourceLocation button_white = new ResourceLocation("notenoughupdates:button_white.png");
- public static final ResourceLocation colour_selector_dot =
- new ResourceLocation("notenoughupdates:colour_selector_dot.png");
- public static final ResourceLocation colour_selector_bar =
- new ResourceLocation("notenoughupdates:colour_selector_bar.png");
- public static final ResourceLocation colour_selector_bar_alpha =
- new ResourceLocation("notenoughupdates:colour_selector_bar_alpha.png");
- public static final ResourceLocation colour_selector_chroma =
- new ResourceLocation("notenoughupdates:colour_selector_chroma.png");
-
public static final ResourceLocation accessory_bag_overlay =
new ResourceLocation("notenoughupdates:accessory_bag_overlay.png");
public static final ResourceLocation quickcommand_background =
new ResourceLocation("notenoughupdates:quickcommand_background.png");
- public static final ResourceLocation gamemodes = new ResourceLocation("notenoughupdates:gamemodes.png");
- public static final ResourceLocation radial_square_off =
- new ResourceLocation("notenoughupdates:radial_square_off.png");
- public static final ResourceLocation radial_square_on = new ResourceLocation("notenoughupdates:radial_square_on.png");
- public static final ResourceLocation radial_circle_off =
- new ResourceLocation("notenoughupdates:radial_circle_off.png");
- public static final ResourceLocation radial_circle_on = new ResourceLocation("notenoughupdates:radial_circle_on.png");
-
public static final ResourceLocation dungeon_chest_worth =
new ResourceLocation("notenoughupdates:dungeon_chest_worth.png");
@@ -73,10 +50,6 @@ public class GuiTextures {
public static final ResourceLocation auction_view_buttons =
new ResourceLocation("notenoughupdates:auction_view_buttons.png");
- public static final ResourceLocation logo = new ResourceLocation("notenoughupdates:logo.png");
- public static final ResourceLocation logo_fg = new ResourceLocation("notenoughupdates:logo_fg.png");
- public static final ResourceLocation logo_bg = new ResourceLocation("notenoughupdates:logo_bg.png");
-
public static final ResourceLocation sort_all = new ResourceLocation("notenoughupdates:sort_all.png");
public static final ResourceLocation sort_mob = new ResourceLocation("notenoughupdates:sort_mob.png");
public static final ResourceLocation sort_pet = new ResourceLocation("notenoughupdates:sort_pet.png");
diff --git a/src/main/resources/assets/notenoughupdates/button20x.png b/src/main/resources/assets/notenoughupdates/button20x.png
deleted file mode 100644
index 8d723798..00000000
Binary files a/src/main/resources/assets/notenoughupdates/button20x.png and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/gamemodes.png b/src/main/resources/assets/notenoughupdates/gamemodes.png
deleted file mode 100644
index 8a1aa2fa..00000000
Binary files a/src/main/resources/assets/notenoughupdates/gamemodes.png and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/logo_bg.png b/src/main/resources/assets/notenoughupdates/logo_bg.png
deleted file mode 100644
index 188c3126..00000000
Binary files a/src/main/resources/assets/notenoughupdates/logo_bg.png and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/logo_fg.png b/src/main/resources/assets/notenoughupdates/logo_fg.png
deleted file mode 100644
index 1f170cbc..00000000
Binary files a/src/main/resources/assets/notenoughupdates/logo_fg.png and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/next.png b/src/main/resources/assets/notenoughupdates/next.png
deleted file mode 100644
index d215a7e8..00000000
Binary files a/src/main/resources/assets/notenoughupdates/next.png and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/next.xcf b/src/main/resources/assets/notenoughupdates/next.xcf
deleted file mode 100644
index f93cc5b9..00000000
Binary files a/src/main/resources/assets/notenoughupdates/next.xcf and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/nohup.out b/src/main/resources/assets/notenoughupdates/nohup.out
deleted file mode 100644
index 14abc1f2..00000000
--- a/src/main/resources/assets/notenoughupdates/nohup.out
+++ /dev/null
@@ -1,2 +0,0 @@
-using gegl copy
-using gegl copy
diff --git a/src/main/resources/assets/notenoughupdates/prev.png b/src/main/resources/assets/notenoughupdates/prev.png
deleted file mode 100644
index a4ec7743..00000000
Binary files a/src/main/resources/assets/notenoughupdates/prev.png and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/prev.xcf b/src/main/resources/assets/notenoughupdates/prev.xcf
deleted file mode 100644
index e9fecc61..00000000
Binary files a/src/main/resources/assets/notenoughupdates/prev.xcf and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/prev_unhovered.png b/src/main/resources/assets/notenoughupdates/prev_unhovered.png
deleted file mode 100644
index f4340fee..00000000
Binary files a/src/main/resources/assets/notenoughupdates/prev_unhovered.png and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/pv_cata.png b/src/main/resources/assets/notenoughupdates/pv_cata.png
deleted file mode 100644
index 46b676e1..00000000
Binary files a/src/main/resources/assets/notenoughupdates/pv_cata.png and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/radial_circle_off.png b/src/main/resources/assets/notenoughupdates/radial_circle_off.png
deleted file mode 100644
index 300cbcfb..00000000
Binary files a/src/main/resources/assets/notenoughupdates/radial_circle_off.png and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/radial_circle_on.png b/src/main/resources/assets/notenoughupdates/radial_circle_on.png
deleted file mode 100644
index 4d5cc862..00000000
Binary files a/src/main/resources/assets/notenoughupdates/radial_circle_on.png and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/radial_square_off.png b/src/main/resources/assets/notenoughupdates/radial_square_off.png
deleted file mode 100644
index 97fbf27e..00000000
Binary files a/src/main/resources/assets/notenoughupdates/radial_square_off.png and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/radial_square_on.png b/src/main/resources/assets/notenoughupdates/radial_square_on.png
deleted file mode 100644
index 5116df80..00000000
Binary files a/src/main/resources/assets/notenoughupdates/radial_square_on.png and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/setting_border.png b/src/main/resources/assets/notenoughupdates/setting_border.png
deleted file mode 100644
index e5dff747..00000000
Binary files a/src/main/resources/assets/notenoughupdates/setting_border.png and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/slider_off.png b/src/main/resources/assets/notenoughupdates/slider_off.png
deleted file mode 100644
index 0f514c41..00000000
Binary files a/src/main/resources/assets/notenoughupdates/slider_off.png and /dev/null differ
diff --git a/src/main/resources/assets/notenoughupdates/slider_on.png b/src/main/resources/assets/notenoughupdates/slider_on.png
deleted file mode 100644
index 8d2d6680..00000000
Binary files a/src/main/resources/assets/notenoughupdates/slider_on.png and /dev/null differ
--
cgit
From 50dc2122462642a0c3a00b3a3ae6389825dc04df Mon Sep 17 00:00:00 2001
From: IRONM00N <64110067+IRONM00N@users.noreply.github.com>
Date: Thu, 9 Jun 2022 18:04:22 -0400
Subject: Re-license project as LGPL (#157)
* add licence files & a few misc chores
* add license notices & run auto formatter
---
.github/workflows/build.yml | 6 +-
.github/workflows/send_webhook_update.sh | 19 +
.gitignore | 1 +
.idea/copyright/NotEnoughUpdates.xml | 7 +
.idea/copyright/profiles_settings.xml | 7 +
CONTRIBUTING.md | 36 +-
LICENSE | 60 -
LICENSE-GPLv3.md | 675 +
LICENSE.md | 157 +
README.md | 12 +-
Update Notes/2.0-Pre30.md | 9 +-
Update Notes/2.0-Pre31-Release.md | 13 +-
Update Notes/2.0-Pre31.md | 11 +-
Update Notes/2.1.md | 23 +-
build.gradle.kts | 21 +-
settings.gradle.kts | 21 +-
src/main/java/NotSkyblockAddonsInstallerFrame.java | 27 +-
.../moulberry/notenoughupdates/CustomItems.java | 19 +
.../notenoughupdates/ItemPriceInformation.java | 20 +-
.../github/moulberry/notenoughupdates/NEUApi.java | 20 +-
.../moulberry/notenoughupdates/NEUManager.java | 19 +
.../moulberry/notenoughupdates/NEUOverlay.java | 19 +
.../notenoughupdates/NEURepoResourcePack.java | 126 +-
.../notenoughupdates/NotEnoughUpdates.java | 19 +
.../notenoughupdates/auction/APIManager.java | 32 +-
.../notenoughupdates/auction/CustomAH.java | 19 +
.../notenoughupdates/auction/CustomAHGui.java | 19 +
.../commands/ClientCommandBase.java | 19 +
.../notenoughupdates/commands/Commands.java | 34 +-
.../commands/EntityViewerCommand.java | 121 +-
.../notenoughupdates/commands/ScreenCommand.java | 19 +
.../commands/dev/DevTestCommand.java | 19 +
.../notenoughupdates/commands/dev/DiagCommand.java | 22 +-
.../commands/dev/DungeonWinTestCommand.java | 19 +
.../commands/dev/NullzeeSphereCommand.java | 19 +
.../commands/dev/PackDevCommand.java | 87 +-
.../commands/dev/ReloadRepoCommand.java | 19 +
.../commands/dev/ResetRepoCommand.java | 19 +
.../commands/dev/StatsCommand.java | 19 +
.../commands/dungeon/DhCommand.java | 19 +
.../commands/dungeon/DnCommand.java | 19 +
.../commands/dungeon/JoinDungeonCommand.java | 19 +
.../commands/dungeon/MapCommand.java | 19 +
.../commands/help/FeaturesCommand.java | 19 +
.../commands/help/HelpCommand.java | 21 +-
.../commands/help/LinksCommand.java | 19 +
.../commands/help/SettingsCommand.java | 19 +
.../commands/help/StorageViewerWhyCommand.java | 19 +
.../notenoughupdates/commands/misc/AhCommand.java | 19 +
.../commands/misc/ButtonsCommand.java | 19 +
.../commands/misc/CalendarCommand.java | 19 +
.../commands/misc/CosmeticsCommand.java | 19 +
.../commands/misc/CustomizeCommand.java | 20 +-
.../commands/profile/CataCommand.java | 19 +
.../commands/profile/PeekCommand.java | 19 +
.../commands/profile/PvCommand.java | 19 +
.../commands/profile/ViewProfileCommand.java | 19 +
.../notenoughupdates/core/BackgroundBlur.java | 19 +
.../notenoughupdates/core/ChromaColour.java | 19 +
.../notenoughupdates/core/GlScissorStack.java | 19 +
.../notenoughupdates/core/GuiElement.java | 19 +
.../notenoughupdates/core/GuiElementBoolean.java | 19 +
.../notenoughupdates/core/GuiElementColour.java | 19 +
.../notenoughupdates/core/GuiElementTextField.java | 19 +
.../core/GuiScreenElementWrapper.java | 19 +
.../notenoughupdates/core/config/Config.java | 19 +
.../core/config/GuiPositionEditor.java | 19 +
.../core/config/KeybindHelper.java | 19 +
.../notenoughupdates/core/config/Position.java | 19 +
.../notenoughupdates/core/config/PositionNew.java | 19 +
.../core/config/annotations/Category.java | 19 +
.../core/config/annotations/ConfigAccordionId.java | 19 +
.../config/annotations/ConfigEditorAccordion.java | 19 +
.../config/annotations/ConfigEditorBoolean.java | 19 +
.../config/annotations/ConfigEditorButton.java | 19 +
.../config/annotations/ConfigEditorColour.java | 19 +
.../annotations/ConfigEditorDraggableList.java | 20 +
.../config/annotations/ConfigEditorDropdown.java | 19 +
.../core/config/annotations/ConfigEditorFSR.java | 19 +
.../config/annotations/ConfigEditorKeybind.java | 19 +
.../config/annotations/ConfigEditorSlider.java | 19 +
.../core/config/annotations/ConfigEditorText.java | 19 +
.../core/config/annotations/ConfigOption.java | 19 +
.../core/config/gui/GuiOptionEditor.java | 19 +
.../core/config/gui/GuiOptionEditorAccordion.java | 19 +
.../core/config/gui/GuiOptionEditorBoolean.java | 21 +-
.../core/config/gui/GuiOptionEditorButton.java | 19 +
.../core/config/gui/GuiOptionEditorColour.java | 19 +
.../config/gui/GuiOptionEditorDraggableList.java | 19 +
.../core/config/gui/GuiOptionEditorDropdown.java | 19 +
.../core/config/gui/GuiOptionEditorFSR.java | 19 +
.../core/config/gui/GuiOptionEditorKeybind.java | 19 +
.../core/config/gui/GuiOptionEditorSlider.java | 19 +
.../core/config/gui/GuiOptionEditorText.java | 19 +
.../core/config/gui/GuiPositionEditor.java | 19 +
.../core/config/struct/ConfigProcessor.java | 51 +-
.../core/util/GuiElementSlider.java | 27 +-
.../moulberry/notenoughupdates/core/util/Line.java | 53 +-
.../notenoughupdates/core/util/MiscUtils.java | 19 +
.../notenoughupdates/core/util/Splitters.java | 19 +
.../notenoughupdates/core/util/StringUtils.java | 19 +
.../notenoughupdates/core/util/Vec3Comparable.java | 37 +-
.../notenoughupdates/core/util/lerp/LerpUtils.java | 19 +
.../core/util/lerp/LerpingFloat.java | 19 +
.../core/util/lerp/LerpingInteger.java | 19 +
.../core/util/render/RenderUtils.java | 19 +
.../core/util/render/TextRenderUtils.java | 19 +
.../notenoughupdates/cosmetics/CapeManager.java | 19 +
.../notenoughupdates/cosmetics/CapeNode.java | 21 +-
.../notenoughupdates/cosmetics/GuiCosmetics.java | 19 +
.../notenoughupdates/cosmetics/NEUCape.java | 19 +
.../notenoughupdates/cosmetics/ShaderManager.java | 19 +
.../notenoughupdates/dungeons/DungeonBlocks.java | 19 +
.../notenoughupdates/dungeons/DungeonMap.java | 26 +-
.../notenoughupdates/dungeons/DungeonWin.java | 37 +-
.../dungeons/GuiDungeonMapEditor.java | 29 +-
.../notenoughupdates/events/NEUEvent.java | 19 +
.../events/OnBlockBreakSoundEffect.java | 20 +-
.../events/RepositoryReloadEvent.java | 19 +
.../notenoughupdates/infopanes/DevInfoPane.java | 19 +
.../infopanes/FlipperInfoPane.java | 19 +
.../notenoughupdates/infopanes/HTMLInfoPane.java | 30 +-
.../notenoughupdates/infopanes/InfoPane.java | 19 +
.../infopanes/ScrollableInfoPane.java | 19 +
.../notenoughupdates/infopanes/TextInfoPane.java | 19 +
.../notenoughupdates/itemeditor/GuiElement.java | 19 +
.../itemeditor/GuiElementButton.java | 19 +
.../itemeditor/GuiElementText.java | 19 +
.../itemeditor/GuiElementTextField.java | 19 +
.../notenoughupdates/itemeditor/NEUItemEditor.java | 19 +
.../notenoughupdates/listener/ChatListener.java | 35 +-
.../listener/ItemTooltipListener.java | 20 +-
.../listener/NEUEventListener.java | 19 +
.../listener/OldAnimationChecker.java | 19 +
.../notenoughupdates/listener/RenderListener.java | 31 +-
.../listener/ScoreboardLocationChangeListener.java | 19 +
.../notenoughupdates/mbgui/MBAnchorPoint.java | 19 +
.../notenoughupdates/mbgui/MBDeserializer.java | 19 +
.../notenoughupdates/mbgui/MBGuiElement.java | 19 +
.../notenoughupdates/mbgui/MBGuiGroup.java | 19 +
.../notenoughupdates/mbgui/MBGuiGroupAligned.java | 19 +
.../notenoughupdates/mbgui/MBGuiGroupFloating.java | 25 +-
.../miscfeatures/AuctionBINWarning.java | 19 +
.../miscfeatures/AuctionSortModeWarning.java | 24 +-
.../miscfeatures/BetterContainers.java | 19 +
.../miscfeatures/CookieWarning.java | 54 +-
.../miscfeatures/CrystalMetalDetectorSolver.java | 136 +-
.../miscfeatures/CrystalOverlay.java | 19 +
.../miscfeatures/CrystalWishingCompassSolver.java | 254 +-
.../miscfeatures/CustomItemEffects.java | 41 +-
.../miscfeatures/CustomSkulls.java | 38 +-
.../miscfeatures/DamageCommas.java | 19 +
.../miscfeatures/DwarvenMinesWaypoints.java | 19 +
.../miscfeatures/EnchantingSolvers.java | 25 +-
.../notenoughupdates/miscfeatures/FairySouls.java | 33 +-
.../miscfeatures/FishingHelper.java | 19 +
.../miscfeatures/ItemCooldowns.java | 19 +
.../miscfeatures/ItemCustomizeManager.java | 27 +-
.../miscfeatures/ItemRarityHalo.java | 25 +-
.../notenoughupdates/miscfeatures/MiningStuff.java | 19 +
.../miscfeatures/NPCRetexturing.java | 19 +
.../notenoughupdates/miscfeatures/Navigation.java | 19 +
.../miscfeatures/NullzeeSphere.java | 19 +
.../miscfeatures/PetInfoOverlay.java | 19 +
.../notenoughupdates/miscfeatures/SlotLocking.java | 35 +-
.../miscfeatures/StorageManager.java | 53 +-
.../miscfeatures/StreamerMode.java | 19 +
.../notenoughupdates/miscfeatures/SunTzu.java | 19 +
.../customblockzones/CrystalHollowsTextures.java | 19 +
.../customblockzones/CustomBiomes.java | 19 +
.../customblockzones/CustomBlockSounds.java | 20 +-
.../customblockzones/DwarvenMinesTextures.java | 19 +
.../customblockzones/IslandZoneSubdivider.java | 19 +
.../customblockzones/LocationChangeEvent.java | 19 +
.../customblockzones/SpecialBlockZone.java | 19 +
.../miscfeatures/entityviewer/AgeModifier.java | 55 +-
.../miscfeatures/entityviewer/ChargedModifier.java | 35 +-
.../miscfeatures/entityviewer/EntityViewer.java | 366 +-
.../entityviewer/EntityViewerModifier.java | 21 +-
.../entityviewer/EquipmentModifier.java | 19 +
.../miscfeatures/entityviewer/GUIClientPlayer.java | 71 +-
.../miscfeatures/entityviewer/HorseModifier.java | 19 +
.../entityviewer/InvisibleModifier.java | 29 +-
.../miscfeatures/entityviewer/NameModifier.java | 19 +
.../miscfeatures/entityviewer/RidingModifier.java | 33 +-
.../miscfeatures/entityviewer/SkinModifier.java | 87 +-
.../miscfeatures/entityviewer/WitherModifier.java | 61 +-
.../miscgui/AccessoryBagOverlay.java | 99 +-
.../notenoughupdates/miscgui/CalendarOverlay.java | 26 +-
.../notenoughupdates/miscgui/GuiCustomEnchant.java | 28 +-
.../notenoughupdates/miscgui/GuiEnchantColour.java | 25 +-
.../miscgui/GuiInvButtonEditor.java | 20 +-
.../notenoughupdates/miscgui/GuiItemCustomize.java | 19 +
.../notenoughupdates/miscgui/GuiItemRecipe.java | 19 +
.../notenoughupdates/miscgui/GuiNavigation.java | 19 +
.../notenoughupdates/miscgui/GuiPriceGraph.java | 50 +-
.../miscgui/InventoryStorageSelector.java | 19 +
.../notenoughupdates/miscgui/KatSitterOverlay.java | 36 +-
.../miscgui/NEUOverlayPlacements.java | 19 +
.../notenoughupdates/miscgui/StorageOverlay.java | 19 +
.../notenoughupdates/miscgui/TradeWindow.java | 26 +-
.../miscgui/tutorials/NeuConfigTutorial.java | 19 +
.../miscgui/tutorials/NeuTutorial.java | 19 +
.../miscgui/tutorials/TutorialBase.java | 19 +
.../mixins/AccessorEntityAgeable.java | 25 +-
.../mixins/AccessorEntityArmorStand.java | 23 +-
.../mixins/AccessorGuiContainer.java | 47 +-
.../mixins/AccessorGuiEditSign.java | 23 +-
.../mixins/AccessorGuiPlayerTabOverlay.java | 19 +
.../notenoughupdates/mixins/AccessorMinecraft.java | 23 +-
.../mixins/MixinAbstractClientPlayer.java | 19 +
.../notenoughupdates/mixins/MixinContainer.java | 19 +
.../mixins/MixinEffectRenderer.java | 19 +
.../notenoughupdates/mixins/MixinEntity.java | 19 +
.../mixins/MixinEntityAgeable.java | 20 +-
.../notenoughupdates/mixins/MixinEntityHorse.java | 31 +-
.../notenoughupdates/mixins/MixinEntityPlayer.java | 19 +
.../mixins/MixinEntityPlayerSP.java | 19 +
.../mixins/MixinEntityRenderer.java | 19 +
.../mixins/MixinEntitySkeleton.java | 31 +-
.../notenoughupdates/mixins/MixinGuiChest.java | 19 +
.../notenoughupdates/mixins/MixinGuiContainer.java | 26 +-
.../notenoughupdates/mixins/MixinGuiIngame.java | 19 +
.../notenoughupdates/mixins/MixinGuiInventory.java | 19 +
.../notenoughupdates/mixins/MixinGuiScreen.java | 19 +
.../mixins/MixinInventoryEffectRenderer.java | 19 +
.../mixins/MixinInventoryPlayer.java | 19 +
.../mixins/MixinItemCameraTransforms.java | 19 +
.../notenoughupdates/mixins/MixinItemRenderer.java | 19 +
.../notenoughupdates/mixins/MixinItemStack.java | 19 +
.../mixins/MixinLayerArmorBase.java | 19 +
.../mixins/MixinLayerCustomHead.java | 19 +
.../notenoughupdates/mixins/MixinMinecraft.java | 19 +
.../notenoughupdates/mixins/MixinMouseHelper.java | 19 +
.../mixins/MixinNetHandlerPlayClient.java | 37 +-
.../mixins/MixinPlayerControllerMP.java | 19 +
.../notenoughupdates/mixins/MixinRender.java | 19 +
.../notenoughupdates/mixins/MixinRenderFish.java | 21 +-
.../notenoughupdates/mixins/MixinRenderGlobal.java | 19 +
.../notenoughupdates/mixins/MixinRenderItem.java | 19 +
.../notenoughupdates/mixins/MixinRenderList.java | 19 +
.../mixins/MixinRendererLivingEntity.java | 19 +
.../mixins/MixinTextureManager.java | 19 +
.../mixins/MixinTileEntitySkullRenderer.java | 19 +
.../mixins/MixinTileEntitySpecialRenderer.java | 19 +
.../mixins/MixinVboRenderList.java | 19 +
.../notenoughupdates/mixins/MixinWorld.java | 21 +-
.../notenoughupdates/mixins/MixinWorldClient.java | 19 +
.../notenoughupdates/options/NEUConfig.java | 19 +
.../notenoughupdates/options/NEUConfigEditor.java | 19 +
.../options/customtypes/NEUDebugFlag.java | 21 +-
.../options/seperateSections/AHGraph.java | 26 +-
.../options/seperateSections/AHTweaks.java | 25 +-
.../options/seperateSections/AccessoryBag.java | 19 +
.../options/seperateSections/ApiData.java | 19 +
.../options/seperateSections/Calendar.java | 19 +
.../options/seperateSections/CustomArmour.java | 19 +
.../options/seperateSections/DungeonMapConfig.java | 19 +
.../options/seperateSections/Dungeons.java | 29 +-
.../options/seperateSections/Enchanting.java | 25 +-
.../options/seperateSections/Fishing.java | 19 +
.../options/seperateSections/ImprovedSBMenu.java | 19 +
.../options/seperateSections/InventoryButtons.java | 19 +
.../options/seperateSections/ItemOverlays.java | 29 +-
.../options/seperateSections/Itemlist.java | 25 +-
.../options/seperateSections/LocationEdit.java | 24 +-
.../options/seperateSections/Mining.java | 28 +-
.../options/seperateSections/Misc.java | 19 +
.../options/seperateSections/MiscOverlays.java | 35 +-
.../options/seperateSections/NeuAuctionHouse.java | 19 +
.../options/seperateSections/Notifications.java | 19 +
.../options/seperateSections/PetOverlay.java | 25 +-
.../options/seperateSections/ProfileViewer.java | 25 +-
.../options/seperateSections/SkillOverlays.java | 30 +-
.../options/seperateSections/SlayerOverlay.java | 26 +-
.../options/seperateSections/SlotLocking.java | 25 +-
.../options/seperateSections/StorageGUI.java | 29 +-
.../options/seperateSections/Toolbar.java | 27 +-
.../options/seperateSections/TooltipTweaks.java | 19 +
.../options/seperateSections/TradeMenu.java | 19 +
.../overlays/AuctionSearchOverlay.java | 35 +-
.../overlays/BonemerangOverlay.java | 25 +-
.../overlays/CombatSkillOverlay.java | 21 +-
.../overlays/CrystalHollowOverlay.java | 33 +-
.../notenoughupdates/overlays/FarmingOverlay.java | 19 +
.../overlays/FishingSkillOverlay.java | 21 +-
.../notenoughupdates/overlays/FuelBar.java | 19 +
.../notenoughupdates/overlays/MiningOverlay.java | 37 +-
.../overlays/MiningSkillOverlay.java | 21 +-
.../notenoughupdates/overlays/OverlayManager.java | 19 +
.../overlays/RancherBootOverlay.java | 19 +
.../notenoughupdates/overlays/SlayerOverlay.java | 25 +-
.../notenoughupdates/overlays/TextOverlay.java | 19 +
.../overlays/TextOverlayStyle.java | 19 +
.../notenoughupdates/overlays/TimersOverlay.java | 28 +-
.../notenoughupdates/profileviewer/BingoPage.java | 19 +
.../profileviewer/GuiProfileViewer.java | 19 +
.../notenoughupdates/profileviewer/Panorama.java | 20 +-
.../profileviewer/PlayerStats.java | 20 +
.../profileviewer/ProfileViewer.java | 35 +-
.../notenoughupdates/recipes/CraftingOverlay.java | 37 +-
.../notenoughupdates/recipes/CraftingRecipe.java | 282 +-
.../notenoughupdates/recipes/ForgeRecipe.java | 477 +-
.../notenoughupdates/recipes/Ingredient.java | 21 +-
.../notenoughupdates/recipes/ItemShopRecipe.java | 19 +
.../notenoughupdates/recipes/MobLootRecipe.java | 19 +
.../notenoughupdates/recipes/NeuRecipe.java | 19 +
.../notenoughupdates/recipes/RecipeGenerator.java | 19 +
.../notenoughupdates/recipes/RecipeSlot.java | 19 +
.../notenoughupdates/recipes/RecipeType.java | 19 +
.../recipes/VillagerTradeRecipe.java | 288 +-
.../notenoughupdates/util/AllowEmptyHTMLTag.java | 19 +
.../moulberry/notenoughupdates/util/Constants.java | 19 +
.../moulberry/notenoughupdates/util/Debouncer.java | 19 +
.../util/DiscordMarkdownBuilder.java | 19 +
.../notenoughupdates/util/GuiTextures.java | 19 +
.../notenoughupdates/util/HastebinUploader.java | 19 +
.../notenoughupdates/util/HotmInformation.java | 19 +
.../notenoughupdates/util/HypixelApi.java | 19 +
.../moulberry/notenoughupdates/util/ItemUtils.java | 19 +
.../moulberry/notenoughupdates/util/JsonUtils.java | 19 +
.../notenoughupdates/util/LerpingFloat.java | 19 +
.../notenoughupdates/util/NEUDebugLogger.java | 21 +-
.../notenoughupdates/util/NEUResourceManager.java | 19 +
.../notenoughupdates/util/NotificationHandler.java | 19 +
.../notenoughupdates/util/ProfileApiSyncer.java | 19 +
.../util/RequestFocusListener.java | 19 +
.../util/ReverseWorldRenderer.java | 28 +-
.../moulberry/notenoughupdates/util/SBInfo.java | 30 +-
.../notenoughupdates/util/SkytilsCompat.java | 23 +-
.../notenoughupdates/util/SpecialColour.java | 19 +
.../moulberry/notenoughupdates/util/TexLoc.java | 19 +
.../moulberry/notenoughupdates/util/Utils.java | 19 +
.../notenoughupdates/util/XPInformation.java | 19 +
.../resources/assets/notenoughupdates/dream.json | 88 +-
.../dungeon_map/borders/large/1.json | 4 +-
.../dungeon_map/borders/large/10.json | 4 +-
.../dungeon_map/borders/large/11.json | 4 +-
.../dungeon_map/borders/large/2.json | 4 +-
.../dungeon_map/borders/large/3.json | 4 +-
.../dungeon_map/borders/large/4.json | 4 +-
.../dungeon_map/borders/large/5.json | 4 +-
.../dungeon_map/borders/large/6.json | 4 +-
.../dungeon_map/borders/large/7.json | 4 +-
.../dungeon_map/borders/large/8.json | 4 +-
.../dungeon_map/borders/large/9.json | 4 +-
.../dungeon_map/borders/medium/1.json | 4 +-
.../dungeon_map/borders/medium/10.json | 4 +-
.../dungeon_map/borders/medium/11.json | 4 +-
.../dungeon_map/borders/medium/2.json | 4 +-
.../dungeon_map/borders/medium/3.json | 4 +-
.../dungeon_map/borders/medium/4.json | 4 +-
.../dungeon_map/borders/medium/5.json | 4 +-
.../dungeon_map/borders/medium/6.json | 4 +-
.../dungeon_map/borders/medium/7.json | 4 +-
.../dungeon_map/borders/medium/8.json | 4 +-
.../dungeon_map/borders/medium/9.json | 4 +-
.../dungeon_map/borders/small/1.json | 4 +-
.../dungeon_map/borders/small/10.json | 4 +-
.../dungeon_map/borders/small/11.json | 4 +-
.../dungeon_map/borders/small/2.json | 4 +-
.../dungeon_map/borders/small/3.json | 4 +-
.../dungeon_map/borders/small/4.json | 4 +-
.../dungeon_map/borders/small/5.json | 4 +-
.../dungeon_map/borders/small/6.json | 4 +-
.../dungeon_map/borders/small/7.json | 4 +-
.../dungeon_map/borders/small/8.json | 4 +-
.../dungeon_map/borders/small/9.json | 4 +-
.../notenoughupdates/dwarven_data/-10_-1.json | 9 +-
.../notenoughupdates/dwarven_data/-10_-2.json | 17 +-
.../notenoughupdates/dwarven_data/-10_-3.json | 15 +-
.../notenoughupdates/dwarven_data/-10_-4.json | 37 +-
.../notenoughupdates/dwarven_data/-10_-5.json | 13 +-
.../notenoughupdates/dwarven_data/-10_-6.json | 32 +-
.../notenoughupdates/dwarven_data/-10_-7.json | 8 +-
.../notenoughupdates/dwarven_data/-10_0.json | 28 +-
.../notenoughupdates/dwarven_data/-10_3.json | 102 +-
.../notenoughupdates/dwarven_data/-10_4.json | 96 +-
.../notenoughupdates/dwarven_data/-10_6.json | 220 +-
.../notenoughupdates/dwarven_data/-10_7.json | 245 +-
.../notenoughupdates/dwarven_data/-10_8.json | 90 +-
.../notenoughupdates/dwarven_data/-11_-3.json | 189 +-
.../notenoughupdates/dwarven_data/-11_-4.json | 21 +-
.../notenoughupdates/dwarven_data/-11_-5.json | 26 +-
.../notenoughupdates/dwarven_data/-11_-6.json | 12 +-
.../notenoughupdates/dwarven_data/-11_2.json | 24 +-
.../notenoughupdates/dwarven_data/-11_5.json | 30 +-
.../notenoughupdates/dwarven_data/-11_6.json | 86 +-
.../notenoughupdates/dwarven_data/-11_7.json | 16 +-
.../assets/notenoughupdates/dwarven_data/-1_0.json | 59 +-
.../assets/notenoughupdates/dwarven_data/-1_1.json | 67 +-
.../notenoughupdates/dwarven_data/-1_10.json | 52 +-
.../notenoughupdates/dwarven_data/-1_11.json | 68 +-
.../assets/notenoughupdates/dwarven_data/-1_3.json | 17 +-
.../assets/notenoughupdates/dwarven_data/-1_7.json | 25 +-
.../assets/notenoughupdates/dwarven_data/-1_8.json | 41 +-
.../assets/notenoughupdates/dwarven_data/-1_9.json | 42 +-
.../notenoughupdates/dwarven_data/-2_-2.json | 27 +-
.../notenoughupdates/dwarven_data/-2_-3.json | 109 +-
.../notenoughupdates/dwarven_data/-2_-4.json | 206 +-
.../notenoughupdates/dwarven_data/-2_-5.json | 173 +-
.../notenoughupdates/dwarven_data/-2_-7.json | 87 +-
.../assets/notenoughupdates/dwarven_data/-2_0.json | 62 +-
.../notenoughupdates/dwarven_data/-2_10.json | 60 +-
.../notenoughupdates/dwarven_data/-2_11.json | 18 +-
.../assets/notenoughupdates/dwarven_data/-2_3.json | 4 +-
.../assets/notenoughupdates/dwarven_data/-2_4.json | 194 +-
.../assets/notenoughupdates/dwarven_data/-2_6.json | 221 +-
.../assets/notenoughupdates/dwarven_data/-2_7.json | 11 +-
.../assets/notenoughupdates/dwarven_data/-2_8.json | 49 +-
.../assets/notenoughupdates/dwarven_data/-2_9.json | 48 +-
.../notenoughupdates/dwarven_data/-3_-3.json | 13 +-
.../notenoughupdates/dwarven_data/-3_-4.json | 34 +-
.../notenoughupdates/dwarven_data/-3_-5.json | 36 +-
.../assets/notenoughupdates/dwarven_data/-3_0.json | 84 +-
.../assets/notenoughupdates/dwarven_data/-3_1.json | 87 +-
.../notenoughupdates/dwarven_data/-3_11.json | 5 +-
.../assets/notenoughupdates/dwarven_data/-3_2.json | 7 +-
.../assets/notenoughupdates/dwarven_data/-3_4.json | 168 +-
.../assets/notenoughupdates/dwarven_data/-3_5.json | 72 +-
.../assets/notenoughupdates/dwarven_data/-3_6.json | 134 +-
.../assets/notenoughupdates/dwarven_data/-3_7.json | 5 +-
.../assets/notenoughupdates/dwarven_data/-3_8.json | 37 +-
.../assets/notenoughupdates/dwarven_data/-3_9.json | 25 +-
.../notenoughupdates/dwarven_data/-4_-1.json | 51 +-
.../notenoughupdates/dwarven_data/-4_-5.json | 21 +-
.../notenoughupdates/dwarven_data/-4_-6.json | 22 +-
.../assets/notenoughupdates/dwarven_data/-4_0.json | 103 +-
.../assets/notenoughupdates/dwarven_data/-4_1.json | 29 +-
.../notenoughupdates/dwarven_data/-4_10.json | 200 +-
.../notenoughupdates/dwarven_data/-4_11.json | 14 +-
.../assets/notenoughupdates/dwarven_data/-4_2.json | 22 +-
.../assets/notenoughupdates/dwarven_data/-4_3.json | 38 +-
.../assets/notenoughupdates/dwarven_data/-4_4.json | 12 +-
.../assets/notenoughupdates/dwarven_data/-4_5.json | 15 +-
.../assets/notenoughupdates/dwarven_data/-4_6.json | 26 +-
.../assets/notenoughupdates/dwarven_data/-4_7.json | 16 +-
.../assets/notenoughupdates/dwarven_data/-4_8.json | 77 +-
.../assets/notenoughupdates/dwarven_data/-4_9.json | 43 +-
.../notenoughupdates/dwarven_data/-5_-1.json | 57 +-
.../notenoughupdates/dwarven_data/-5_-2.json | 54 +-
.../notenoughupdates/dwarven_data/-5_-3.json | 51 +-
.../notenoughupdates/dwarven_data/-5_-4.json | 144 +-
.../notenoughupdates/dwarven_data/-5_-5.json | 7 +-
.../notenoughupdates/dwarven_data/-5_-6.json | 65 +-
.../assets/notenoughupdates/dwarven_data/-5_0.json | 103 +-
.../assets/notenoughupdates/dwarven_data/-5_1.json | 59 +-
.../notenoughupdates/dwarven_data/-5_10.json | 177 +-
.../assets/notenoughupdates/dwarven_data/-5_2.json | 41 +-
.../assets/notenoughupdates/dwarven_data/-5_4.json | 11 +-
.../assets/notenoughupdates/dwarven_data/-5_6.json | 5 +-
.../assets/notenoughupdates/dwarven_data/-5_7.json | 33 +-
.../assets/notenoughupdates/dwarven_data/-5_8.json | 184 +-
.../assets/notenoughupdates/dwarven_data/-5_9.json | 230 +-
.../notenoughupdates/dwarven_data/-6_-3.json | 23 +-
.../notenoughupdates/dwarven_data/-6_-4.json | 107 +-
.../notenoughupdates/dwarven_data/-6_-5.json | 103 +-
.../notenoughupdates/dwarven_data/-6_-6.json | 22 +-
.../assets/notenoughupdates/dwarven_data/-6_0.json | 36 +-
.../assets/notenoughupdates/dwarven_data/-6_1.json | 99 +-
.../assets/notenoughupdates/dwarven_data/-6_2.json | 20 +-
.../assets/notenoughupdates/dwarven_data/-6_4.json | 142 +-
.../assets/notenoughupdates/dwarven_data/-6_5.json | 179 +-
.../assets/notenoughupdates/dwarven_data/-6_6.json | 115 +-
.../assets/notenoughupdates/dwarven_data/-6_7.json | 137 +-
.../assets/notenoughupdates/dwarven_data/-6_8.json | 263 +-
.../assets/notenoughupdates/dwarven_data/-6_9.json | 257 +-
.../notenoughupdates/dwarven_data/-7_-1.json | 140 +-
.../notenoughupdates/dwarven_data/-7_-2.json | 150 +-
.../notenoughupdates/dwarven_data/-7_-3.json | 72 +-
.../notenoughupdates/dwarven_data/-7_-4.json | 62 +-
.../notenoughupdates/dwarven_data/-7_-5.json | 73 +-
.../notenoughupdates/dwarven_data/-7_-6.json | 37 +-
.../assets/notenoughupdates/dwarven_data/-7_0.json | 153 +-
.../assets/notenoughupdates/dwarven_data/-7_1.json | 168 +-
.../assets/notenoughupdates/dwarven_data/-7_2.json | 101 +-
.../assets/notenoughupdates/dwarven_data/-7_3.json | 123 +-
.../assets/notenoughupdates/dwarven_data/-7_4.json | 34 +-
.../assets/notenoughupdates/dwarven_data/-7_8.json | 218 +-
.../assets/notenoughupdates/dwarven_data/-7_9.json | 317 +-
.../notenoughupdates/dwarven_data/-8_-1.json | 32 +-
.../notenoughupdates/dwarven_data/-8_-2.json | 26 +-
.../notenoughupdates/dwarven_data/-8_-3.json | 35 +-
.../notenoughupdates/dwarven_data/-8_-4.json | 31 +-
.../notenoughupdates/dwarven_data/-8_-5.json | 22 +-
.../notenoughupdates/dwarven_data/-8_-6.json | 6 +-
.../assets/notenoughupdates/dwarven_data/-8_0.json | 62 +-
.../assets/notenoughupdates/dwarven_data/-8_1.json | 107 +-
.../assets/notenoughupdates/dwarven_data/-8_2.json | 111 +-
.../assets/notenoughupdates/dwarven_data/-8_3.json | 43 +-
.../assets/notenoughupdates/dwarven_data/-8_4.json | 83 +-
.../assets/notenoughupdates/dwarven_data/-8_5.json | 42 +-
.../assets/notenoughupdates/dwarven_data/-8_6.json | 32 +-
.../assets/notenoughupdates/dwarven_data/-8_7.json | 86 +-
.../assets/notenoughupdates/dwarven_data/-8_8.json | 266 +-
.../assets/notenoughupdates/dwarven_data/-8_9.json | 214 +-
.../notenoughupdates/dwarven_data/-9_-1.json | 21 +-
.../notenoughupdates/dwarven_data/-9_-2.json | 37 +-
.../notenoughupdates/dwarven_data/-9_-3.json | 32 +-
.../notenoughupdates/dwarven_data/-9_-4.json | 24 +-
.../notenoughupdates/dwarven_data/-9_-5.json | 50 +-
.../notenoughupdates/dwarven_data/-9_-6.json | 23 +-
.../assets/notenoughupdates/dwarven_data/-9_0.json | 30 +-
.../assets/notenoughupdates/dwarven_data/-9_2.json | 24 +-
.../assets/notenoughupdates/dwarven_data/-9_3.json | 7 +-
.../assets/notenoughupdates/dwarven_data/-9_4.json | 85 +-
.../assets/notenoughupdates/dwarven_data/-9_7.json | 293 +-
.../assets/notenoughupdates/dwarven_data/-9_8.json | 280 +-
.../assets/notenoughupdates/dwarven_data/-9_9.json | 75 +-
.../assets/notenoughupdates/dwarven_data/0_0.json | 73 +-
.../assets/notenoughupdates/dwarven_data/0_10.json | 60 +-
.../assets/notenoughupdates/dwarven_data/0_3.json | 22 +-
.../assets/notenoughupdates/dwarven_data/0_7.json | 32 +-
.../assets/notenoughupdates/dwarven_data/0_8.json | 46 +-
.../assets/notenoughupdates/dwarven_data/0_9.json | 53 +-
.../assets/notenoughupdates/dwarven_data/10_1.json | 203 +-
.../assets/notenoughupdates/dwarven_data/10_3.json | 216 +-
.../assets/notenoughupdates/dwarven_data/10_4.json | 48 +-
.../assets/notenoughupdates/dwarven_data/10_5.json | 97 +-
.../assets/notenoughupdates/dwarven_data/11_1.json | 73 +-
.../assets/notenoughupdates/dwarven_data/11_3.json | 61 +-
.../assets/notenoughupdates/dwarven_data/11_4.json | 18 +-
.../assets/notenoughupdates/dwarven_data/1_-1.json | 120 +-
.../assets/notenoughupdates/dwarven_data/1_-2.json | 37 +-
.../assets/notenoughupdates/dwarven_data/1_-3.json | 152 +-
.../assets/notenoughupdates/dwarven_data/1_0.json | 90 +-
.../assets/notenoughupdates/dwarven_data/1_10.json | 91 +-
.../assets/notenoughupdates/dwarven_data/1_7.json | 8 +-
.../assets/notenoughupdates/dwarven_data/1_8.json | 45 +-
.../assets/notenoughupdates/dwarven_data/1_9.json | 97 +-
.../assets/notenoughupdates/dwarven_data/2_-1.json | 19 +-
.../assets/notenoughupdates/dwarven_data/2_-2.json | 49 +-
.../assets/notenoughupdates/dwarven_data/2_-4.json | 72 +-
.../assets/notenoughupdates/dwarven_data/2_-5.json | 61 +-
.../assets/notenoughupdates/dwarven_data/2_-7.json | 41 +-
.../assets/notenoughupdates/dwarven_data/2_0.json | 88 +-
.../assets/notenoughupdates/dwarven_data/2_10.json | 279 +-
.../assets/notenoughupdates/dwarven_data/2_3.json | 4 +-
.../assets/notenoughupdates/dwarven_data/2_4.json | 146 +-
.../assets/notenoughupdates/dwarven_data/2_6.json | 133 +-
.../assets/notenoughupdates/dwarven_data/2_7.json | 4 +-
.../assets/notenoughupdates/dwarven_data/2_8.json | 104 +-
.../assets/notenoughupdates/dwarven_data/2_9.json | 266 +-
.../assets/notenoughupdates/dwarven_data/3_-1.json | 28 +-
.../notenoughupdates/dwarven_data/3_-10.json | 6 +-
.../assets/notenoughupdates/dwarven_data/3_-3.json | 31 +-
.../assets/notenoughupdates/dwarven_data/3_-4.json | 20 +-
.../assets/notenoughupdates/dwarven_data/3_-5.json | 35 +-
.../assets/notenoughupdates/dwarven_data/3_-6.json | 59 +-
.../assets/notenoughupdates/dwarven_data/3_0.json | 56 +-
.../assets/notenoughupdates/dwarven_data/3_11.json | 48 +-
.../assets/notenoughupdates/dwarven_data/3_3.json | 23 +-
.../assets/notenoughupdates/dwarven_data/3_4.json | 53 +-
.../assets/notenoughupdates/dwarven_data/3_5.json | 20 +-
.../assets/notenoughupdates/dwarven_data/3_6.json | 80 +-
.../assets/notenoughupdates/dwarven_data/3_7.json | 17 +-
.../assets/notenoughupdates/dwarven_data/4_-1.json | 50 +-
.../assets/notenoughupdates/dwarven_data/4_-2.json | 9 +-
.../assets/notenoughupdates/dwarven_data/4_-8.json | 70 +-
.../assets/notenoughupdates/dwarven_data/4_-9.json | 5 +-
.../assets/notenoughupdates/dwarven_data/4_0.json | 130 +-
.../assets/notenoughupdates/dwarven_data/4_6.json | 62 +-
.../assets/notenoughupdates/dwarven_data/5_-5.json | 8 +-
.../assets/notenoughupdates/dwarven_data/5_-6.json | 9 +-
.../assets/notenoughupdates/dwarven_data/5_-8.json | 103 +-
.../assets/notenoughupdates/dwarven_data/5_0.json | 11 +-
.../assets/notenoughupdates/dwarven_data/5_10.json | 162 +-
.../assets/notenoughupdates/dwarven_data/5_7.json | 228 +-
.../assets/notenoughupdates/dwarven_data/5_8.json | 158 +-
.../assets/notenoughupdates/dwarven_data/5_9.json | 198 +-
.../assets/notenoughupdates/dwarven_data/6_-3.json | 13 +-
.../assets/notenoughupdates/dwarven_data/6_0.json | 66 +-
.../assets/notenoughupdates/dwarven_data/6_1.json | 234 +-
.../assets/notenoughupdates/dwarven_data/6_2.json | 185 +-
.../assets/notenoughupdates/dwarven_data/6_3.json | 237 +-
.../assets/notenoughupdates/dwarven_data/6_5.json | 304 +-
.../assets/notenoughupdates/dwarven_data/6_6.json | 299 +-
.../assets/notenoughupdates/dwarven_data/7_-1.json | 5 +-
.../assets/notenoughupdates/dwarven_data/7_-2.json | 23 +-
.../assets/notenoughupdates/dwarven_data/7_-3.json | 29 +-
.../assets/notenoughupdates/dwarven_data/7_0.json | 25 +-
.../assets/notenoughupdates/dwarven_data/7_1.json | 116 +-
.../assets/notenoughupdates/dwarven_data/7_2.json | 67 +-
.../assets/notenoughupdates/dwarven_data/7_3.json | 136 +-
.../assets/notenoughupdates/dwarven_data/7_4.json | 123 +-
.../assets/notenoughupdates/dwarven_data/7_5.json | 121 +-
.../assets/notenoughupdates/dwarven_data/7_6.json | 180 +-
.../assets/notenoughupdates/dwarven_data/8_-1.json | 30 +-
.../assets/notenoughupdates/dwarven_data/8_-2.json | 51 +-
.../assets/notenoughupdates/dwarven_data/8_0.json | 22 +-
.../assets/notenoughupdates/dwarven_data/8_1.json | 145 +-
.../assets/notenoughupdates/dwarven_data/9_-1.json | 36 +-
.../assets/notenoughupdates/dwarven_data/9_1.json | 281 +-
.../assets/notenoughupdates/dwarven_data/9_2.json | 218 +-
.../assets/notenoughupdates/dwarven_data/9_5.json | 254 +-
.../assets/notenoughupdates/dwarven_data/9_6.json | 130 +-
.../assets/notenoughupdates/dwarven_data/all.json | 207 +-
.../dynamic_54/style1/dynamic_config.json | 4 +-
.../dynamic_54/style2/dynamic_config.json | 4 +-
.../dynamic_54/style3/dynamic_config.json | 4 +-
.../notenoughupdates/invbuttons/extraicons.json | 34 +-
.../notenoughupdates/invbuttons/presets.json | 5474 ++---
.../assets/notenoughupdates/official-wiki.css | 22623 ++++++++++++++++++-
.../notenoughupdates/shaders/program/blur.json | 100 +-
.../shaders/program/dungeonmap.json | 61 +-
.../shaders/program/grayscale.json | 42 +-
.../shaders/program/setrgbtoalpha.json | 42 +-
.../resources/assets/notenoughupdates/sounds.json | 1 -
.../sounds/gemstoneamberbreak.json | 4 +-
.../sounds/gemstoneamethystbreak.json | 4 +-
.../notenoughupdates/sounds/gemstonejadebreak.json | 4 +-
.../sounds/gemstonejasperbreak.json | 4 +-
.../notenoughupdates/sounds/gemstonerubybreak.json | 4 +-
.../sounds/gemstonesapphirebreak.json | 4 +-
.../sounds/gemstonetopazbreak.json | 4 +-
.../notenoughupdates/sounds/mithrilbreak.json | 4 +-
.../notenoughupdates/sounds/titaniumbreak.json | 4 +-
src/main/resources/mcmod.info | 30 +-
src/main/resources/mixins.notenoughupdates.json | 88 +-
.../core/util/Vec3ComparableTest.java | 19 +
.../CrystalMetalDetectorSolverTest.java | 123 +-
.../CrystalWishingCompassSolverTest.java | 247 +-
src/test/resources/log4j2-test.xml | 4 +-
623 files changed, 53710 insertions(+), 4716 deletions(-)
create mode 100644 .idea/copyright/NotEnoughUpdates.xml
create mode 100644 .idea/copyright/profiles_settings.xml
delete mode 100644 LICENSE
create mode 100644 LICENSE-GPLv3.md
create mode 100644 LICENSE.md
(limited to 'src/main/resources')
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 630d8288..0440aefb 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -6,14 +6,16 @@ on:
- '*'
paths-ignore:
- 'README.md'
- - 'LICENSE'
+ - 'LICENSE.md'
+ - 'LICENSE-GPLv3.md'
- '.gitignore'
pull_request:
branches:
- '*'
paths-ignore:
- 'README.md'
- - 'LICENSE'
+ - 'LICENSE.md'
+ - 'LICENSE-GPLv3.md'
- '.gitignore'
workflow_dispatch:
jobs:
diff --git a/.github/workflows/send_webhook_update.sh b/.github/workflows/send_webhook_update.sh
index 56852159..3ec20af3 100755
--- a/.github/workflows/send_webhook_update.sh
+++ b/.github/workflows/send_webhook_update.sh
@@ -1,4 +1,23 @@
#!/bin/bash
+#
+# 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 .
+#
+
set -x
COLOR_SUCCESS=8040199
diff --git a/.gitignore b/.gitignore
index a7b89d94..53814696 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,7 @@ out
*.iml
.idea/*
!.idea/codeStyles
+!.idea/copyright
# gradle
build
diff --git a/.idea/copyright/NotEnoughUpdates.xml b/.idea/copyright/NotEnoughUpdates.xml
new file mode 100644
index 00000000..ea087768
--- /dev/null
+++ b/.idea/copyright/NotEnoughUpdates.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml
new file mode 100644
index 00000000..8f73a5c0
--- /dev/null
+++ b/.idea/copyright/profiles_settings.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index d2d14086..6c163317 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,34 +1,32 @@
## Before you contribute
- - Please check your feature / bug isn't already fixed in one of our pre-releases or on [the development branch](https://github.com/NotEnoughUpdates/NotEnoughUpdates/tree/master/).
- - Consider joining our [Discord](https://discord.gg/moulberry) to check in on newest developments by other people, or to get help with problems you encounter.
- - Please check that your feature idea complies with the [Hypixel Rules](https://hypixel.net/rules)
- - Check that your feature idea isn't already done in other mods. (E.g. Dungeon Solver)
-
+- Please check your feature / bug isn't already fixed in one of our pre-releases or on [the development branch](https://github.com/NotEnoughUpdates/NotEnoughUpdates/tree/master/).
+- Consider joining our [Discord](https://discord.gg/moulberry) to check in on newest developments by other people, or to get help with problems you encounter.
+- Please check that your feature idea complies with the [Hypixel Rules](https://hypixel.net/rules)
+- Check that your feature idea isn't already done in other mods. (E.g. Dungeon Solver)
+
## Setting up a development environment
### Software prerequisites
- - Install a Java Development Kit (You will need both version 8 and version 17) [Eclipse Temurin Download](https://adoptium.net/temurin/releases) for convenience, however any JDK will do.
- - Install Git. [Windows download](https://git-scm.com/download/win)
- - Install an IDE, such as [Jetbrains IntelliJ IDEA](https://www.jetbrains.com/idea/download).
+- Install a Java Development Kit (You will need both version 8 and version 17) [Eclipse Temurin Download](https://adoptium.net/temurin/releases) for convenience, however any JDK will do.
+- Install Git. [Windows download](https://git-scm.com/download/win)
+- Install an IDE, such as [Jetbrains IntelliJ IDEA](https://www.jetbrains.com/idea/download).
### Software configuration
- - Clone the NEU repository using `git clone https://github.com/NotEnoughUpdates/NotEnoughUpdates`.
- - Import that folder as a Gradle Project in your IDE (IntelliJ should autodetect it as gradle if you select the `NotEnoughUpdates` folder in the Open dialog)
- - Set your project SDK to your 1.8 JDK. This can be done in the modules settings (CTRL+ALT+SHIFT+S) in IntelliJ.
- - Set your gradle JVM to your 1.17 JDK. This can be done by searching for `gradle jvm` in the CTRL+SHIFT+A dialog in IntelliJ.
- - Run the `genRuns` gradle task. In IntelliJ that can be done in the gradle tab on the right side of your IDE.
- - Optionally, run the `genSources` gradle task.
- - Run the `Minecraft Client` to make sure that everything works.
-
+- Clone the NEU repository using `git clone https://github.com/NotEnoughUpdates/NotEnoughUpdates`.
+- Import that folder as a Gradle Project in your IDE (IntelliJ should autodetect it as gradle if you select the `NotEnoughUpdates` folder in the Open dialog)
+- Set your project SDK to your 1.8 JDK. This can be done in the modules settings (CTRL+ALT+SHIFT+S) in IntelliJ.
+- Set your gradle JVM to your 1.17 JDK. This can be done by searching for `gradle jvm` in the CTRL+SHIFT+A dialog in IntelliJ.
+- Run the `genRuns` gradle task. In IntelliJ that can be done in the gradle tab on the right side of your IDE.
+- Optionally, run the `genSources` gradle task.
+- Run the `Minecraft Client` to make sure that everything works.
## Logging into Hypixel in a development environment.
-Use [DevAuth](https://github.com/DJtheRedstoner/DevAuth). Download the `forge-legacy` version, and put it into the `run/mods` folder. Then follow the configuration instructions in the [DevAuth README](https://github.com/DJtheRedstoner/DevAuth#configuration-file)
+Use [DevAuth](https://github.com/DJtheRedstoner/DevAuth). Download the `forge-legacy` version, and put it into the `run/mods` folder. Then follow the configuration instructions in the [DevAuth README](https://github.com/DJtheRedstoner/DevAuth#configuration-file)
## Hot Reloading
-Hot Reloading is possible by first launching using the IntelliJ debugger with [DCEVM 1.8](https://dcevm.github.io/). Then running a regular build and confirming the reload prompt. This can cause issues (especially with commands), so restarting is sometimes still necessary.
-
+Hot Reloading is possible by first launching using the IntelliJ debugger with [DCEVM 1.8](https://dcevm.github.io/). Then running a regular build and confirming the reload prompt. This can cause issues (especially with commands), so restarting is sometimes still necessary.
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 7ff2f90d..00000000
--- a/LICENSE
+++ /dev/null
@@ -1,60 +0,0 @@
-License
-
-THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-
-BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
-
-1. Definitions
-
- "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License.
- "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License.
- "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership.
- "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License.
- "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast.
- "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work.
- "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
- "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images.
- "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium.
-
-2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws.
-
-3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:
-
- to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections;
- to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified.";
- to Distribute and Publicly Perform the Work including as incorporated in Collections; and,
- to Distribute and Publicly Perform Adaptations.
-
-The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Section 4(d).
-
-4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:
-
- You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(c), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(c), as requested.
- You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works.
- If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and, (iv) consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4(c) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties.
-
- For the avoidance of doubt:
- Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License;
- Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License if Your exercise of such rights is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(b) and otherwise waives the right to collect royalties through any statutory or compulsory licensing scheme; and,
- Voluntary License Schemes. The Licensor reserves the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License that is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(c).
- Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise.
-
-5. Representations, Warranties and Disclaimer
-
-UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
-
-6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. Termination
-
- This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
- Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.
-
-8. Miscellaneous
-
- Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
- Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.
- If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
- No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.
- This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.
- The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law.
diff --git a/LICENSE-GPLv3.md b/LICENSE-GPLv3.md
new file mode 100644
index 00000000..f5a01711
--- /dev/null
+++ b/LICENSE-GPLv3.md
@@ -0,0 +1,675 @@
+### GNU GENERAL PUBLIC LICENSE
+
+Version 3, 29 June 2007
+
+Copyright (C) 2007 Free Software Foundation, Inc.
+
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+
+### Preamble
+
+The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom
+to share and change all versions of a program--to make sure it remains
+free software for all its users. We, the Free Software Foundation, use
+the GNU General Public License for most of our software; it applies
+also to any other work released this way by its authors. You can apply
+it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you
+have certain responsibilities if you distribute copies of the
+software, or if you modify it: responsibilities to respect the freedom
+of others.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the
+manufacturer can do so. This is fundamentally incompatible with the
+aim of protecting users' freedom to change the software. The
+systematic pattern of such abuse occurs in the area of products for
+individuals to use, which is precisely where it is most unacceptable.
+Therefore, we have designed this version of the GPL to prohibit the
+practice for those products. If such problems arise substantially in
+other domains, we stand ready to extend this provision to those
+domains in future versions of the GPL, as needed to protect the
+freedom of users.
+
+Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish
+to avoid the special danger that patents applied to a free program
+could make it effectively proprietary. To prevent this, the GPL
+assures that patents cannot be used to render the program non-free.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+### TERMS AND CONDITIONS
+
+#### 0. Definitions.
+
+"This License" refers to version 3 of the GNU General Public License.
+
+"Copyright" also means copyright-like laws that apply to other kinds
+of works, such as semiconductor masks.
+
+"The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of
+an exact copy. The resulting work is called a "modified version" of
+the earlier work or a work "based on" the earlier work.
+
+A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user
+through a computer network, with no transfer of a copy, is not
+conveying.
+
+An interactive user interface displays "Appropriate Legal Notices" to
+the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+#### 1. Source Code.
+
+The "source code" for a work means the preferred form of the work for
+making modifications to it. "Object code" means any non-source form of
+a work.
+
+A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+The Corresponding Source need not include anything that users can
+regenerate automatically from other parts of the Corresponding Source.
+
+The Corresponding Source for a work in source code form is that same
+work.
+
+#### 2. Basic Permissions.
+
+All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+You may make, run and propagate covered works that you do not convey,
+without conditions so long as your license otherwise remains in force.
+You may convey covered works to others for the sole purpose of having
+them make modifications exclusively for you, or provide you with
+facilities for running those works, provided that you comply with the
+terms of this License in conveying all material for which you do not
+control copyright. Those thus making or running the covered works for
+you must do so exclusively on your behalf, under your direction and
+control, on terms that prohibit them from making any copies of your
+copyrighted material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under the
+conditions stated below. Sublicensing is not allowed; section 10 makes
+it unnecessary.
+
+#### 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such
+circumvention is effected by exercising rights under this License with
+respect to the covered work, and you disclaim any intention to limit
+operation or modification of the work as a means of enforcing, against
+the work's users, your or third parties' legal rights to forbid
+circumvention of technological measures.
+
+#### 4. Conveying Verbatim Copies.
+
+You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+#### 5. Conveying Modified Source Versions.
+
+You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these
+conditions:
+
+- a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+- b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under
+ section 7. This requirement modifies the requirement in section 4
+ to "keep intact all notices".
+- c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+- d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+#### 6. Conveying Non-Source Forms.
+
+You may convey a covered work in object code form under the terms of
+sections 4 and 5, provided that you also convey the machine-readable
+Corresponding Source under the terms of this License, in one of these
+ways:
+
+- a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+- b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the Corresponding
+ Source from a network server at no charge.
+- c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+- d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+- e) Convey the object code using peer-to-peer transmission,
+ provided you inform other peers where the object code and
+ Corresponding Source of the work are being offered to the general
+ public at no charge under subsection 6d.
+
+A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal,
+family, or household purposes, or (2) anything designed or sold for
+incorporation into a dwelling. In determining whether a product is a
+consumer product, doubtful cases shall be resolved in favor of
+coverage. For a particular product received by a particular user,
+"normally used" refers to a typical or common use of that class of
+product, regardless of the status of the particular user or of the way
+in which the particular user actually uses, or expects or is expected
+to use, the product. A product is a consumer product regardless of
+whether the product has substantial commercial, industrial or
+non-consumer uses, unless such uses represent the only significant
+mode of use of the product.
+
+"Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to
+install and execute modified versions of a covered work in that User
+Product from a modified version of its Corresponding Source. The
+information must suffice to ensure that the continued functioning of
+the modified object code is in no case prevented or interfered with
+solely because modification has been made.
+
+If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or
+updates for a work that has been modified or installed by the
+recipient, or for the User Product in which it has been modified or
+installed. Access to a network may be denied when the modification
+itself materially and adversely affects the operation of the network
+or violates the rules and protocols for communication across the
+network.
+
+Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+#### 7. Additional Terms.
+
+"Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders
+of that material) supplement the terms of this License with terms:
+
+- a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+- b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+- c) Prohibiting misrepresentation of the origin of that material,
+ or requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+- d) Limiting the use for publicity purposes of names of licensors
+ or authors of the material; or
+- e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+- f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions
+ of it) with contractual assumptions of liability to the recipient,
+ for any liability that these contractual assumptions directly
+ impose on those licensors and authors.
+
+All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions; the
+above requirements apply either way.
+
+#### 8. Termination.
+
+You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+#### 9. Acceptance Not Required for Having Copies.
+
+You are not required to accept this License in order to receive or run
+a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+#### 10. Automatic Licensing of Downstream Recipients.
+
+Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+#### 11. Patents.
+
+A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+A contributor's "essential patent claims" are all patent claims owned
+or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+A patent license is "discriminatory" if it does not include within the
+scope of its coverage, prohibits the exercise of, or is conditioned on
+the non-exercise of one or more of the rights that are specifically
+granted under this License. You may not convey a covered work if you
+are a party to an arrangement with a third party that is in the
+business of distributing software, under which you make payment to the
+third party based on the extent of your activity of conveying the
+work, and under which the third party grants, to any of the parties
+who would receive the covered work from you, a discriminatory patent
+license (a) in connection with copies of the covered work conveyed by
+you (or copies made from those copies), or (b) primarily for and in
+connection with specific products or compilations that contain the
+covered work, unless you entered into that arrangement, or that patent
+license was granted, prior to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+#### 12. No Surrender of Others' Freedom.
+
+If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under
+this License and any other pertinent obligations, then as a
+consequence you may not convey it at all. For example, if you agree to
+terms that obligate you to collect a royalty for further conveying
+from those to whom you convey the Program, the only way you could
+satisfy both those terms and this License would be to refrain entirely
+from conveying the Program.
+
+#### 13. Use with the GNU Affero General Public License.
+
+Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+#### 14. Revised Versions of this License.
+
+The Free Software Foundation may publish revised and/or new versions
+of the GNU General Public License from time to time. Such new versions
+will be similar in spirit to the present version, but may differ in
+detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies that a certain numbered version of the GNU General Public
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that numbered version or
+of any later version published by the Free Software Foundation. If the
+Program does not specify a version number of the GNU General Public
+License, you may choose any version ever published by the Free
+Software Foundation.
+
+If the Program specifies that a proxy can decide which future versions
+of the GNU General Public License can be used, that proxy's public
+statement of acceptance of a version permanently authorizes you to
+choose that version for the Program.
+
+Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+#### 15. Disclaimer of Warranty.
+
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
+WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
+DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
+CORRECTION.
+
+#### 16. Limitation of Liability.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
+CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT
+NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
+LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM
+TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
+PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+#### 17. Interpretation of Sections 15 and 16.
+
+If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+END OF TERMS AND CONDITIONS
+
+### How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+To do so, attach the following notices to the program. It is safest to
+attach them to the start of each source file to most effectively state
+the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper
+mail.
+
+If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands \`show w' and \`show c' should show the
+appropriate parts of the General Public License. Of course, your
+program's commands might be different; for a GUI interface, you would
+use an "about box".
+
+You should also get your employer (if you work as a programmer) or
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. For more information on this, and how to apply and follow
+the GNU GPL, see .
+
+The GNU General Public License does not permit incorporating your
+program into proprietary programs. If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library. If this is what you want to do, use the
+GNU Lesser General Public License instead of this License. But first,
+please read .
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 00000000..6e75f84c
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,157 @@
+### GNU LESSER GENERAL PUBLIC LICENSE
+
+Version 3, 29 June 2007
+
+Copyright (C) 2007 Free Software Foundation, Inc.
+
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+
+This version of the GNU Lesser General Public License incorporates the
+terms and conditions of version 3 of the GNU General Public License,
+supplemented by the additional permissions listed below.
+
+#### 0. Additional Definitions.
+
+As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the
+GNU General Public License.
+
+"The Library" refers to a covered work governed by this License, other
+than an Application or a Combined Work as defined below.
+
+An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+#### 1. Exception to Section 3 of the GNU GPL.
+
+You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+#### 2. Conveying Modified Versions.
+
+If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+- a) under this License, provided that you make a good faith effort
+ to ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+- b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+#### 3. Object Code Incorporating Material from Library Header Files.
+
+The object code form of an Application may incorporate material from a
+header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+- a) Give prominent notice with each copy of the object code that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+- b) Accompany the object code with a copy of the GNU GPL and this
+ license document.
+
+#### 4. Combined Works.
+
+You may convey a Combined Work under terms of your choice that, taken
+together, effectively do not restrict modification of the portions of
+the Library contained in the Combined Work and reverse engineering for
+debugging such modifications, if you also do each of the following:
+
+- a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+- b) Accompany the Combined Work with a copy of the GNU GPL and this
+ license document.
+- c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+- d) Do one of the following:
+ - 0) Convey the Minimal Corresponding Source under the terms of
+ this License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+ - 1) Use a suitable shared library mechanism for linking with
+ the Library. A suitable mechanism is one that (a) uses at run
+ time a copy of the Library already present on the user's
+ computer system, and (b) will operate properly with a modified
+ version of the Library that is interface-compatible with the
+ Linked Version.
+- e) Provide Installation Information, but only if you would
+ otherwise be required to provide such information under section 6
+ of the GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the Application
+ with a modified version of the Linked Version. (If you use option
+ 4d0, the Installation Information must accompany the Minimal
+ Corresponding Source and Corresponding Application Code. If you
+ use option 4d1, you must provide the Installation Information in
+ the manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.)
+
+#### 5. Combined Libraries.
+
+You may place library facilities that are a work based on the Library
+side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+- a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities, conveyed under the terms of this License.
+- b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+#### 6. Revised Versions of the GNU Lesser General Public License.
+
+The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+as you received it specifies that a certain numbered version of the
+GNU Lesser General Public License "or any later version" applies to
+it, you have the option of following the terms and conditions either
+of that published version or of any later version published by the
+Free Software Foundation. If the Library as you received it does not
+specify a version number of the GNU Lesser General Public License, you
+may choose any version of the GNU Lesser General Public License ever
+published by the Free Software Foundation.
+
+If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/README.md b/README.md
index f4b2c15d..d5d92b31 100644
--- a/README.md
+++ b/README.md
@@ -11,16 +11,16 @@
-->
-
-
+
+
-
-
+
+
-
-
+
+
diff --git a/Update Notes/2.0-Pre30.md b/Update Notes/2.0-Pre30.md
index e036627b..99591f47 100644
--- a/Update Notes/2.0-Pre30.md
+++ b/Update Notes/2.0-Pre30.md
@@ -11,18 +11,19 @@
- Added Storage to PV (with correct sizes)
- Added Personal Vault to PV
- Added scroll lock to storage overlay
+
### **Fixed Features:**
- Todo list
- - Fixed fetchur display
- - Fixed godpot timer
+ - Fixed fetchur display
+ - Fixed godpot timer
- PV's wardrobe view not showing second page bottom row (not fully fixed could be better by dividing on every 4 and drawing per column instead of row but right now its always a full page)
- Made dwarven overlay work in crystal hollows (nopo)
- Added Gemstone powder to dwarven overlay (nopo)
- Made smooth aote work with aotv (thanks to 8k for letting me test his aotv) (nopo)
### **Bug Fixes**
-
+
- Arrow Key backpack option under storage gui not doing anything
- Fixed pets gui going away if you open /pets (nopo)
-- Fixed PV cit models dieing (nopo)
\ No newline at end of file
+- Fixed PV cit models dieing (nopo)
diff --git a/Update Notes/2.0-Pre31-Release.md b/Update Notes/2.0-Pre31-Release.md
index dec4e6a1..35306023 100644
--- a/Update Notes/2.0-Pre31-Release.md
+++ b/Update Notes/2.0-Pre31-Release.md
@@ -1,10 +1,11 @@
# These are the change notes for PRE31-Release
### **Major Changes**
-- None yet. Prob not gonna happen this is mainly for small things.
+- None yet. Prob not gonna happen this is mainly for small things.
### **Minor Changes:**
+
- Added a check to see if the storagegui is on before yelling at you for having fastrender on.
- Added toggle to disable showing the treecap cooldown in item durability. (Lulonaut)#
- Added text to inform the user to "/api new" when the /pv doesn't load.
@@ -16,6 +17,7 @@
- Added Tab auto completion to the AH search gui. (Lulonaut)
### **Bug Fixes**
+
- Fixed a nullpointer exception in dwarven textures (got some confirmation that it fixed it).
- Fixed neuec not parsing correctly.
- Fixed crashing when you copy text while in the neuec/neu buttons editor menu.
@@ -24,24 +26,21 @@
- Fixed golden goblin not having a icon.
- Fixed accessory bag overlay's reforge stat detection as hypixel broke it with their tooltip changes.
- Fixed NeuEC as hypixel broke it with their tooltip changes.
-- Fixed not being able to press repeat keys in chat.
+- Fixed not being able to press repeat keys in chat.
- Fixed gemstone gauntlet/Divan Drill not being recognised as mining tools.
- Fixed morph pets not being recognized by the extended pet info tooltip tweak.
- Fixed wrong commission max values for goblin in dwarven mines and the crystal hollows. (CraftyOldMiner)
- Fixed player right click menu command block text appearing on an inventory item. (DeDiamondPro)
-
-
### **Other**
+
- Enabled help button by default.
- Added SecondPfirsisch cape.
- Added Stormy_LH cape.
- Change cape order in /neucosmetics because ironmoon asked for it.
-
### **Notes for texturepack creators**
-
### **Previous change log**
-https://github.com/DoKM/NotEnoughUpdates/blob/master/Update%20Notes/2.0-Pre31.md
+https://github.com/DoKM/NotEnoughUpdates/blob/master/Update%20Notes/2.0-Pre31.md
diff --git a/Update Notes/2.0-Pre31.md b/Update Notes/2.0-Pre31.md
index 802ad7c4..ac85f45c 100644
--- a/Update Notes/2.0-Pre31.md
+++ b/Update Notes/2.0-Pre31.md
@@ -13,8 +13,8 @@
- Added mastermode support to /pv (basically done, just needs mastermode xp)
- Added support for the Golden Dragon Pet and added support for other weird pets that might get added.
-
### **New Features:**
+
- Added Ferocity, Magic find, Mining speed and mining fortune to Accessory bag (and ferocity and magic find to /pv).
- Update notifier for "Pre" version releases. (Ironm00n)
- Added toggle for etherwarp helper overlay text.
@@ -42,8 +42,8 @@
- Replaced the chat command when clicking on a player name with /pv (Toggleable)
- Added a link to a webpage containing neu's feature /neufeatures and it shows on the first time launch.
-
### **Bug Fixes**
+
- Fishing helper not showing "!" when the rod colours are disabled.
- Decimal point values not being counted in Accessory bag overlay.
- /pv not having the correct max minion tier. (Ironm00n)
@@ -67,15 +67,15 @@
- Fixed dwarven mines waypoints not working if dwarven mines overlay was disabled.
- Fixed being able to slot lock the 9th slot.
- Fixed NEUButtons overlapping with the Accessory Bag overlay by moving the overlapping icons to the right of the overlay. (should work pretty well, too lazy to test with custom button positions but should work fine.)
-- Stopped tooltip tweak rawcraftcost displaying if the cost was 0 (either due to the price being really low or api issue).
+- Stopped tooltip tweak rawcraftcost displaying if the cost was 0 (either due to the price being really low or api issue).
- Added a catch to the capemanger slow to catch duplicate players (https://hst.sh/enuvamecef) (idk how but hey its there now).
- Fix being able to hotkey slotlocked items in a chest gui.
- (Hopefully) Fix storage overlay nullpointer crash.
- Fix not being able to dye undyed leather armour.
- Some Storage Overlay fixes (DeDiamondPro)
-
### **Other**
+
- Code clean up by Ironm00n.
- Rename variables to be more consistent. (Ironm00n)
- Devpane changes. (? - DoKM) (Ironm00n)
@@ -106,6 +106,3 @@
- Added the edit button to the Storage gui texture (it was already on transparent but not on the others) please update your textures
- Added neu logo to the bottom right of the Storage gui textures (so people stop asking which mod adds the gui (Atleast try to make the amount less))
- Added ironman icon to pv (notenoughupdates/pv_ironman.png) (thanks ery for the icon)
-
-
-
diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md
index c8f97357..e3c16382 100644
--- a/Update Notes/2.1.md
+++ b/Update Notes/2.1.md
@@ -1,6 +1,7 @@
# These are the change notes for NEU 2.1 REL
### **Major Changes:**
+
- Added mining skill overlay
- Added fishing skill overlay
- Added combat skill overlay
@@ -10,14 +11,16 @@
- Added blocking clicks back to the enchanting minigames (because apparently, it's not bannable?)
- [Donpireso replied to a sba dev's email about some of sba features, and it seems to imply that blocking clicks in guis aren't bannable](https://cdn.discordapp.com/attachments/823769568933576764/906101631861526559/unknown.png)
- Fixed pet overlay not updating when going into /pets
-- [Added an armor overlay for the new armor slots](https://cdn.discordapp.com/attachments/832652653292027904/922399046528794634/unknown.png)
+- [Added an armor overlay for the new armor slots](https://cdn.discordapp.com/attachments/832652653292027904/922399046528794634/unknown.png)
- Added a pet overlay that shows your active pet in your inventory
- [Price graph for items on /ah and /bz](https://cdn.discordapp.com/attachments/896407218151366687/926968296929107999/unknown.png) - DeDiamondPro
- [Added bingo tab in /pv](https://cdn.discordapp.com/attachments/702456294874808330/951909539383500820/unknown.png) - Lulonaut
- Added wishing compass solver that shows target coordinates, structure, and integrates with Skytils waypoints - CraftyOldMiner
- Improved metal detector logic to solve using a single position in most cases using known locations based on Keeper coordinates - CraftyOldMiner
- Added support for official Hypixel wiki, can be toggled in /neu misc - DeDiamondPro
+
### **Minor Changes:**
+
- Add built-in recipes for forge crafts - nea89
- Add mob drop viewer in the recipe viewer - nea89
- Add Stranded Villager Trades to the item list - nea89
@@ -25,7 +28,7 @@
- Added a config option to hide Dwarven Mines waypoints when already at the location - Lulonaut
- Added some info panels to some settings in /neu
- Added Kat Level After Upgrade Estimator - nea89
-- Added /pv button in /neu
+- Added /pv button in /neu
- Added pitch and coins/m as options in farming skill overlay
- Make it so tab completion in ah search GUI goes down the items - Lulonaut
- Added a toggle for enchant glint in storage gui (ty ery for texture)
@@ -41,7 +44,7 @@
- Added /neurepomode to toggle item editing and dev mode, changing the item repo url and toggling autoupdating of the repo
- Changed "NEUAH is DISABLED! Enable in /neusettings." to /neu
- Changed misc overlays tab to todo overlays
-- Added a config option for npc retexturing
+- Added a config option for npc retexturing
- Added a config option for dirt wand overlay
- Added a config option for hoe of tilling
- Added an option to use short numbers (1.5mil) for price tooltips
@@ -57,7 +60,7 @@
- Added "Has Advanced Tab" to /neustats
- Added custom runes and crab hat system - jani
- Removed unused textures
-- Added total xp if player is above cata 50 in /pv - efefury
+- Added total xp if player is above cata 50 in /pv - efefury
- Added daily powder to todo overlay - efefury
- Added a way to include kismet feather to profit calculator - efefury
- Added custom sounds for crystal hollow gemstones - nea89
@@ -81,11 +84,13 @@
- Added tab completion to /neupackdev subcommands. - whalker
- Made it if you hold shift in the enchant solvers it overrides prevent missclicks
- Added 6-10 stars to the auction search overlay
-- Added 6-10 stars to /neucustomize
+- Added 6-10 stars to /neucustomize
- Added support for attributes in neuec
- Added Heavy Pearls to todo overlay - cobble8
- Added Booster Cookie Warning - 2stinkysocks
+
### **Bug Fixes:**
+
- Fix wiki pages freezing the entire game - nea89
- Made titanium overlay and waypoints work with dwarven overlay off
- "fixed" divan rarity in NEUAH (scuffed)
@@ -99,13 +104,13 @@
- Fixed api key autofill with dg copy chat feature
- Made missing enchants not show on an item if its not missing any enchants
- Fixed Mining overlay crash - Dokm
-- Fixed pet crash - Dokm
+- Fixed pet crash - Dokm
- Fixed fetchur for the 75th time
- [Made an error if you have new tab list off](https://cdn.discordapp.com/attachments/896407218151366687/913681097605398528/unknown.png)
- Fixed lava fishing with the fishing alert
- Fixed /locraw detection, [previously allowed chat messages to trigger it](https://github.com/NotEnoughUpdates/NotEnoughUpdates/issues/35) - IRONM00N
- Fixed experiment timer in todo overlay - efefury
-- Fixed replace click events with /pv working in other modes
+- Fixed replace click events with /pv working in other modes
- Fixed /neuec presets not applying the strikethrough attribute - Lulonaut
- Fixed what hypxiel broke in dungeons
- Fixed the dungeon map on f1 - Minikloon
@@ -114,7 +119,9 @@
- Fixed crash in /pv when the player had a pet that is not saved in the repo - Lulonaut
- Fixed some vanilla Minecraft keybinds not working in NEU GUIs
- Fixed crash with spamming remove enchant in /neuec
+
### **Other:**
+
- New icons was added in storage_icons.png
- Moved the help icon in /neucustomize over a little
- Added dg partner cape
@@ -123,5 +130,7 @@
- Code Cleanup - IRONM00N
- Renamed Keebler408 to CraftyOldMiner
- Added JUnit unit tests for metal detector and wishing compass solver
+
### **Previous change log**
+
https://github.com/NotEnoughUpdates/NotEnoughUpdates/blob/master/Update%20Notes/2.0-Pre31-Release.md
diff --git a/build.gradle.kts b/build.gradle.kts
index 4f178f58..9f3c1715 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,7 +1,26 @@
+/*
+ * 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 .
+ */
+
import java.io.ByteArrayOutputStream
plugins {
- idea
+ idea
java
id("gg.essential.loom") version "0.10.0.+"
id("dev.architectury.architectury-pack200") version "0.1.3"
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 4df48664..eb291fb5 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -1,5 +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 .
+ */
+
pluginManagement {
- repositories {
+ repositories {
mavenCentral()
gradlePluginPortal()
maven("https://oss.sonatype.org/content/repositories/snapshots")
diff --git a/src/main/java/NotSkyblockAddonsInstallerFrame.java b/src/main/java/NotSkyblockAddonsInstallerFrame.java
index e6543617..969e6c28 100644
--- a/src/main/java/NotSkyblockAddonsInstallerFrame.java
+++ b/src/main/java/NotSkyblockAddonsInstallerFrame.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
@@ -6,7 +25,13 @@ import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.io.StringWriter;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Files;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/CustomItems.java b/src/main/java/io/github/moulberry/notenoughupdates/CustomItems.java
index 28686073..06321b53 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/CustomItems.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/CustomItems.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates;
import com.google.gson.JsonArray;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java b/src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java
index 38b59ef3..e1a3b3ee 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates;
import com.google.gson.Gson;
@@ -100,7 +119,6 @@ public class ItemPriceInformation {
}
}
-
NumberFormat format = NumberFormat.getInstance(Locale.US);
boolean shortNumber = NotEnoughUpdates.INSTANCE.config.tooltipTweaks.shortNumberFormatPrices;
if (bazaarItem) {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUApi.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUApi.java
index feb18c66..6cdeb474 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NEUApi.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUApi.java
@@ -1,5 +1,23 @@
-package io.github.moulberry.notenoughupdates;
+/*
+ * 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 .
+ */
+package io.github.moulberry.notenoughupdates;
import net.minecraftforge.fml.relauncher.ReflectionHelper;
public class NEUApi {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java
index ea92a670..c4efeb15 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates;
import com.google.gson.Gson;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java
index b8651867..5b1d3c14 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates;
import com.google.common.collect.Lists;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEURepoResourcePack.java b/src/main/java/io/github/moulberry/notenoughupdates/NEURepoResourcePack.java
index 2a5cda92..bc279188 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NEURepoResourcePack.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NEURepoResourcePack.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates;
import com.google.gson.JsonObject;
@@ -7,69 +26,74 @@ import net.minecraft.client.resources.data.IMetadataSerializer;
import net.minecraft.util.ResourceLocation;
import java.awt.image.BufferedImage;
-import java.io.*;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
import java.util.HashSet;
import java.util.Set;
public class NEURepoResourcePack implements IResourcePack {
- File repoLocation;
- Set resourceDomains = new HashSet<>();
+ File repoLocation;
+ Set resourceDomains = new HashSet<>();
- public NEURepoResourcePack(File repoLocation, String domain) {
- this.repoLocation = repoLocation;
- resourceDomains.add(domain);
- }
+ public NEURepoResourcePack(File repoLocation, String domain) {
+ this.repoLocation = repoLocation;
+ resourceDomains.add(domain);
+ }
- public boolean loadRepoLocation() {
- if (repoLocation != null) return true;
- NotEnoughUpdates instance = NotEnoughUpdates.INSTANCE;
- if (instance == null) return false;
- NEUManager manager = instance.manager;
- if (manager == null) return false;
- repoLocation = manager.repoLocation;
- return repoLocation != null;
- }
+ public boolean loadRepoLocation() {
+ if (repoLocation != null) return true;
+ NotEnoughUpdates instance = NotEnoughUpdates.INSTANCE;
+ if (instance == null) return false;
+ NEUManager manager = instance.manager;
+ if (manager == null) return false;
+ repoLocation = manager.repoLocation;
+ return repoLocation != null;
+ }
- public File getFileForResource(ResourceLocation loc) {
- if (repoLocation == null) {
- if (!loadRepoLocation())
- return null;
- }
- if (!"neurepo".equals(loc.getResourceDomain())) {
- return null;
- }
- return new File(repoLocation, loc.getResourcePath());
- }
+ public File getFileForResource(ResourceLocation loc) {
+ if (repoLocation == null) {
+ if (!loadRepoLocation())
+ return null;
+ }
+ if (!"neurepo".equals(loc.getResourceDomain())) {
+ return null;
+ }
+ return new File(repoLocation, loc.getResourcePath());
+ }
- @Override
- public InputStream getInputStream(ResourceLocation resourceLocation) throws IOException {
- return new BufferedInputStream(new FileInputStream(getFileForResource(resourceLocation)));
- }
+ @Override
+ public InputStream getInputStream(ResourceLocation resourceLocation) throws IOException {
+ return new BufferedInputStream(new FileInputStream(getFileForResource(resourceLocation)));
+ }
- @Override
- public boolean resourceExists(ResourceLocation resourceLocation) {
- File file = getFileForResource(resourceLocation);
- return file != null && file.exists();
- }
+ @Override
+ public boolean resourceExists(ResourceLocation resourceLocation) {
+ File file = getFileForResource(resourceLocation);
+ return file != null && file.exists();
+ }
- @Override
- public Set getResourceDomains() {
- return resourceDomains;
- }
+ @Override
+ public Set getResourceDomains() {
+ return resourceDomains;
+ }
- @Override
- public T getPackMetadata(IMetadataSerializer iMetadataSerializer, String s) throws IOException {
- return iMetadataSerializer.parseMetadataSection(s, new JsonObject());
- }
+ @Override
+ public T getPackMetadata(IMetadataSerializer iMetadataSerializer, String s)
+ throws IOException {
+ return iMetadataSerializer.parseMetadataSection(s, new JsonObject());
+ }
- @Override
- public BufferedImage getPackImage() throws IOException {
- return null;
- }
+ @Override
+ public BufferedImage getPackImage() throws IOException {
+ return null;
+ }
- @Override
- public String getPackName() {
- return "NEU Repo Resources";
- }
+ @Override
+ public String getPackName() {
+ return "NEU Repo Resources";
+ }
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
index cac89e77..9f7a98b1 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates;
import com.google.common.collect.Sets;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/auction/APIManager.java b/src/main/java/io/github/moulberry/notenoughupdates/auction/APIManager.java
index 80d2bca9..d4b6bd05 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/auction/APIManager.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/auction/APIManager.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.auction;
import com.google.gson.JsonArray;
@@ -27,7 +46,16 @@ import net.minecraft.util.ResourceLocation;
import java.io.ByteArrayInputStream;
import java.io.IOException;
-import java.util.*;
+import java.util.Base64;
+import java.util.ConcurrentModificationException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.TreeMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.function.Consumer;
@@ -214,7 +242,7 @@ public class APIManager {
lastBazaarUpdate = currentTime - BAZAAR_UPDATE_INTERVAL + 60 * 1000; // Try again in 1 minute on failure
updateBazaar();
}
- if (currentTime - lastLowestBinUpdate > LOWEST_BIN_UPDATE_INTERVAL) {
+ if (currentTime - lastLowestBinUpdate > LOWEST_BIN_UPDATE_INTERVAL) {
lastLowestBinUpdate = currentTime - LOWEST_BIN_UPDATE_INTERVAL + 30 * 1000; // Try again in 30 seconds on failure
updateLowestBin();
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/auction/CustomAH.java b/src/main/java/io/github/moulberry/notenoughupdates/auction/CustomAH.java
index 4fae9ea5..b5d34ed7 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/auction/CustomAH.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/auction/CustomAH.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.auction;
import com.google.gson.JsonObject;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/auction/CustomAHGui.java b/src/main/java/io/github/moulberry/notenoughupdates/auction/CustomAHGui.java
index 9311040d..ca85ca1c 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/auction/CustomAHGui.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/auction/CustomAHGui.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.auction;
import net.minecraft.client.gui.GuiScreen;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/ClientCommandBase.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/ClientCommandBase.java
index 8ba87ecd..e0ae7a1a 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/ClientCommandBase.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/ClientCommandBase.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands;
import net.minecraft.command.CommandBase;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/Commands.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/Commands.java
index ea401eb7..86411f4f 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/Commands.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/Commands.java
@@ -1,11 +1,41 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands;
-import io.github.moulberry.notenoughupdates.commands.dev.*;
+import io.github.moulberry.notenoughupdates.commands.dev.DevTestCommand;
+import io.github.moulberry.notenoughupdates.commands.dev.DiagCommand;
+import io.github.moulberry.notenoughupdates.commands.dev.DungeonWinTestCommand;
+import io.github.moulberry.notenoughupdates.commands.dev.NullzeeSphereCommand;
+import io.github.moulberry.notenoughupdates.commands.dev.PackDevCommand;
+import io.github.moulberry.notenoughupdates.commands.dev.ReloadRepoCommand;
+import io.github.moulberry.notenoughupdates.commands.dev.ResetRepoCommand;
+import io.github.moulberry.notenoughupdates.commands.dev.StatsCommand;
import io.github.moulberry.notenoughupdates.commands.dungeon.DhCommand;
import io.github.moulberry.notenoughupdates.commands.dungeon.DnCommand;
import io.github.moulberry.notenoughupdates.commands.dungeon.JoinDungeonCommand;
import io.github.moulberry.notenoughupdates.commands.dungeon.MapCommand;
-import io.github.moulberry.notenoughupdates.commands.help.*;
+import io.github.moulberry.notenoughupdates.commands.help.FeaturesCommand;
+import io.github.moulberry.notenoughupdates.commands.help.HelpCommand;
+import io.github.moulberry.notenoughupdates.commands.help.LinksCommand;
+import io.github.moulberry.notenoughupdates.commands.help.SettingsCommand;
+import io.github.moulberry.notenoughupdates.commands.help.StorageViewerWhyCommand;
import io.github.moulberry.notenoughupdates.commands.misc.AhCommand;
import io.github.moulberry.notenoughupdates.commands.misc.CalendarCommand;
import io.github.moulberry.notenoughupdates.commands.misc.CosmeticsCommand;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/EntityViewerCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/EntityViewerCommand.java
index c7b1862e..e3738661 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/EntityViewerCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/EntityViewerCommand.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands;
import com.google.common.collect.Lists;
@@ -21,61 +40,61 @@ import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedDeque;
public class EntityViewerCommand extends ClientCommandBase {
- public EntityViewerCommand() {
- super("neushowentity");
- MinecraftForge.EVENT_BUS.register(this);
- }
+ public EntityViewerCommand() {
+ super("neushowentity");
+ MinecraftForge.EVENT_BUS.register(this);
+ }
- @Override
- public List getCommandAliases() {
- return Lists.newArrayList("neuentityviewer");
- }
+ @Override
+ public List getCommandAliases() {
+ return Lists.newArrayList("neuentityviewer");
+ }
- @Override
- public String getCommandUsage(ICommandSender sender) {
- return EnumChatFormatting.RED + "Use /neushowentity list";
- }
+ @Override
+ public String getCommandUsage(ICommandSender sender) {
+ return EnumChatFormatting.RED + "Use /neushowentity list";
+ }
- public void showUsage(ICommandSender sender) {
- sender.addChatMessage(new ChatComponentText(getCommandUsage(sender)));
- }
+ public void showUsage(ICommandSender sender) {
+ sender.addChatMessage(new ChatComponentText(getCommandUsage(sender)));
+ }
- private final Queue queuedGUIS = new ConcurrentLinkedDeque<>();
+ private final Queue queuedGUIS = new ConcurrentLinkedDeque<>();
- @SubscribeEvent
- public void onTick(TickEvent event) {
- if (Minecraft.getMinecraft().currentScreen == null) {
- EntityViewer poll = queuedGUIS.poll();
- if (poll == null) return;
- Minecraft.getMinecraft().displayGuiScreen(poll);
- }
- }
+ @SubscribeEvent
+ public void onTick(TickEvent event) {
+ if (Minecraft.getMinecraft().currentScreen == null) {
+ EntityViewer poll = queuedGUIS.poll();
+ if (poll == null) return;
+ Minecraft.getMinecraft().displayGuiScreen(poll);
+ }
+ }
- @Override
- public void processCommand(ICommandSender sender, String[] strings) throws CommandException {
- if (strings.length == 0) {
- showUsage(sender);
- return;
- }
- if (strings[0].equals("list")) {
- for (String label : EntityViewer.validEntities.keySet()) {
- sender.addChatMessage(new ChatComponentText(EnumChatFormatting.BLUE + " " + label)
- .setChatStyle(new ChatStyle().setChatClickEvent(
- new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/neuentityviewer " + label))));
- }
- return;
- }
- EntityLivingBase entityLivingBase;
- if (strings[0].startsWith("@")) {
- ResourceLocation resourceLocation = new ResourceLocation(strings[0].substring(1));
- entityLivingBase = EntityViewer.constructEntity(resourceLocation);
- } else {
- entityLivingBase = EntityViewer.constructEntity(strings[0], Arrays.copyOfRange(strings, 1, strings.length));
- }
- if (entityLivingBase == null) {
- sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Could not create that entity"));
- return;
- }
- queuedGUIS.add(new EntityViewer(strings[0], entityLivingBase));
- }
+ @Override
+ public void processCommand(ICommandSender sender, String[] strings) throws CommandException {
+ if (strings.length == 0) {
+ showUsage(sender);
+ return;
+ }
+ if (strings[0].equals("list")) {
+ for (String label : EntityViewer.validEntities.keySet()) {
+ sender.addChatMessage(new ChatComponentText(EnumChatFormatting.BLUE + " " + label)
+ .setChatStyle(new ChatStyle().setChatClickEvent(
+ new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/neuentityviewer " + label))));
+ }
+ return;
+ }
+ EntityLivingBase entityLivingBase;
+ if (strings[0].startsWith("@")) {
+ ResourceLocation resourceLocation = new ResourceLocation(strings[0].substring(1));
+ entityLivingBase = EntityViewer.constructEntity(resourceLocation);
+ } else {
+ entityLivingBase = EntityViewer.constructEntity(strings[0], Arrays.copyOfRange(strings, 1, strings.length));
+ }
+ if (entityLivingBase == null) {
+ sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Could not create that entity"));
+ return;
+ }
+ queuedGUIS.add(new EntityViewer(strings[0], entityLivingBase));
+ }
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/ScreenCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/ScreenCommand.java
index 29dd9d55..1b90e5df 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/ScreenCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/ScreenCommand.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
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 478f4db7..7cca9d3b 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
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.dev;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/DiagCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/DiagCommand.java
index dab99698..326c00b4 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/DiagCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/DiagCommand.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.dev;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
@@ -49,8 +68,7 @@ public class DiagCommand extends ClientCommandBase {
CrystalMetalDetectorSolver.setDebugDoNotUseCenter(true);
sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW +
"Center coordinates-based solutions disabled"));
- }
- else if (subCommand.equals("center=on")) {
+ } else if (subCommand.equals("center=on")) {
CrystalMetalDetectorSolver.setDebugDoNotUseCenter(false);
sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW +
"Center coordinates-based solutions enabled"));
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/DungeonWinTestCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/DungeonWinTestCommand.java
index 223e154a..be25e697 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/DungeonWinTestCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/DungeonWinTestCommand.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.dev;
import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/NullzeeSphereCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/NullzeeSphereCommand.java
index 64d64545..3a9ce90f 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/NullzeeSphereCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/NullzeeSphereCommand.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.dev;
import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
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 2b0e7240..e1504472 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
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.dev;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
@@ -25,51 +44,66 @@ import java.util.function.Supplier;
public class PackDevCommand extends ClientCommandBase {
static Minecraft mc = Minecraft.getMinecraft();
+
public PackDevCommand() {
super("neupackdev");
}
private static final HashMap> commands = new HashMap>() {{
- put("getnpc",
+ put(
+ "getnpc",
new Command<>(
"NPC",
() -> mc.theWorld.playerEntities,
true,
AbstractClientPlayer.class
- ));
- put("getnpcs",
+ )
+ );
+ put(
+ "getnpcs",
new Command<>(
"NPC",
() -> mc.theWorld.playerEntities,
false,
AbstractClientPlayer.class
- ));
- put("getmob",
+ )
+ );
+ put(
+ "getmob",
new Command<>(
"mob",
() -> mc.theWorld.loadedEntityList,
true,
EntityLiving.class
- ));
- put("getmobs",
+ )
+ );
+ put(
+ "getmobs",
new Command<>(
"mob",
() -> mc.theWorld.loadedEntityList,
false,
EntityLiving.class
- ));
- put("getarmorstand",
- new Command<>("armor stand",
+ )
+ );
+ put(
+ "getarmorstand",
+ new Command<>(
+ "armor stand",
() -> mc.theWorld.loadedEntityList,
true,
EntityArmorStand.class
- ));
- put("getarmorstands",
- new Command<>("armor stand",
+ )
+ );
+ put(
+ "getarmorstands",
+ new Command<>(
+ "armor stand",
() -> mc.theWorld.loadedEntityList,
false,
EntityArmorStand.class
- ));
+ )
+ );
}};
@Override
@@ -108,7 +142,7 @@ public class PackDevCommand extends ClientCommandBase {
StringBuilder output;
String subCommand = args[0].toLowerCase();
if (commands.containsKey(subCommand)) {
- Command,?> command = commands.get(subCommand);
+ Command, ?> command = commands.get(subCommand);
output = command.getData(dist);
} else if (subCommand.equals("getall")) {
output = getAll(dist);
@@ -184,7 +218,7 @@ public class PackDevCommand extends ClientCommandBase {
String heldItemString = heldItemTagCompound.toString();
NBTBase extraAttrTag = heldItemTagCompound.getTag("ExtraAttributes");
entityData
- .append(heldItemString != null ? heldItemString : "null")
+ .append(heldItemString != null ? heldItemString : "null")
.append("\nItem Tag Compound Extra Attributes: ")
.append(extraAttrTag != null ? extraAttrTag : "null");
} else {
@@ -201,12 +235,13 @@ public class PackDevCommand extends ClientCommandBase {
}
private static final String[] armorPieceTypes = {"Boots", "Leggings", "Chestplate", "Helmet"};
- public static StringBuilder armorDataBuilder (T entity) {
+
+ public static StringBuilder armorDataBuilder(T entity) {
StringBuilder armorData = new StringBuilder();
- for (int i=0; i < 4; i++) {
+ for (int i = 0; i < 4; i++) {
ItemStack currentArmor = entity.getCurrentArmor(0);
armorData.append(String.format("\n%s: ", armorPieceTypes[i]));
- if (currentArmor == null) {
+ if (currentArmor == null) {
armorData.append("null");
} else {
armorData.append(currentArmor.getTagCompound() != null ? currentArmor.getTagCompound().toString() : "null");
@@ -221,10 +256,12 @@ public class PackDevCommand extends ClientCommandBase {
Class clazz;
boolean single;
- Command(String typeFriendlyName,
- Supplier> entitySupplier,
- boolean single,
- Class clazz) {
+ Command(
+ String typeFriendlyName,
+ Supplier> entitySupplier,
+ boolean single,
+ Class clazz
+ ) {
this.typeFriendlyName = typeFriendlyName;
this.entitySupplier = entitySupplier;
this.single = single;
@@ -241,8 +278,8 @@ public class PackDevCommand extends ClientCommandBase {
continue;
}
T entityT = (T) entity;
- double entityDistanceSq = entity.getDistanceSq(mc.thePlayer.posX, mc.thePlayer.posY, mc.thePlayer.posZ);
- if (entityDistanceSq < distSq) {
+ double entityDistanceSq = entity.getDistanceSq(mc.thePlayer.posX, mc.thePlayer.posY, mc.thePlayer.posZ);
+ if (entityDistanceSq < distSq) {
if (single) {
distSq = entityDistanceSq;
closest = entityT;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/ReloadRepoCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/ReloadRepoCommand.java
index 40db245a..0bf57594 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/ReloadRepoCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/ReloadRepoCommand.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.dev;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/ResetRepoCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/ResetRepoCommand.java
index 9e8363fb..3f693898 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/ResetRepoCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/ResetRepoCommand.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.dev;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
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 c7b6e887..756afc88 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
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.dev;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/dungeon/DhCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/dungeon/DhCommand.java
index 89299a36..222862f9 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/dungeon/DhCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/dungeon/DhCommand.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.dungeon;
import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
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 8fbbceba..a5a7bcca 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
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.dungeon;
import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
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 874e81db..d69f86f3 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
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.dungeon;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
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 ae06a346..3789a09d 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
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.dungeon;
import com.google.gson.JsonElement;
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 593f2575..5f709c4f 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
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.help;
import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
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 c9f0ec27..ba49221e 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
@@ -1,15 +1,32 @@
+/*
+ * 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 .
+ */
+
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 net.minecraft.command.CommandException;
import net.minecraft.command.ICommandSender;
import net.minecraft.util.ChatComponentText;
import java.util.ArrayList;
-import java.util.List;
public class HelpCommand extends ClientCommandBase {
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 c81f44a8..cb8ba6ed 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
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.help;
import com.google.gson.JsonObject;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/help/SettingsCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/help/SettingsCommand.java
index 08350be9..9964b739 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/help/SettingsCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/help/SettingsCommand.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.help;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/help/StorageViewerWhyCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/help/StorageViewerWhyCommand.java
index 5d19d62c..820c6f2a 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/help/StorageViewerWhyCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/help/StorageViewerWhyCommand.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.help;
import com.google.common.collect.Lists;
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 69d114ca..1cd6bcce 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
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.misc;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/ButtonsCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/ButtonsCommand.java
index 63d5c327..55113462 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/ButtonsCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/ButtonsCommand.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.misc;
import io.github.moulberry.notenoughupdates.commands.ClientCommandBase;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/CalendarCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/CalendarCommand.java
index d3c472bd..58c13474 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/CalendarCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/CalendarCommand.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.misc;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
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 de772d65..f74b5813 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
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.misc;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/CustomizeCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/CustomizeCommand.java
index 6bce4f5a..cca6535e 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/CustomizeCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/CustomizeCommand.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.misc;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
@@ -9,7 +28,6 @@ import net.minecraft.command.ICommandSender;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ChatComponentText;
-import java.util.Arrays;
import java.util.Collections;
import java.util.List;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/profile/CataCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/profile/CataCommand.java
index ccf72d73..afc47418 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/profile/CataCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/profile/CataCommand.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.profile;
import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer;
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 d69139aa..3133edf5 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
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.profile;
import com.google.gson.JsonElement;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/profile/PvCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/profile/PvCommand.java
index 07394ffd..2d5c05f4 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/commands/profile/PvCommand.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/profile/PvCommand.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.profile;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
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 fe441ad6..e4ca497c 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
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.commands.profile;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/BackgroundBlur.java b/src/main/java/io/github/moulberry/notenoughupdates/core/BackgroundBlur.java
index c85841b3..fc2be97b 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/BackgroundBlur.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/BackgroundBlur.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/ChromaColour.java b/src/main/java/io/github/moulberry/notenoughupdates/core/ChromaColour.java
index 8f4dd87d..05a9a65e 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/ChromaColour.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/ChromaColour.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core;
import java.awt.*;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/GlScissorStack.java b/src/main/java/io/github/moulberry/notenoughupdates/core/GlScissorStack.java
index 7cc8893f..40b9fe7a 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/GlScissorStack.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/GlScissorStack.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core;
import net.minecraft.client.Minecraft;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElement.java b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElement.java
index c1c76675..2a684164 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElement.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElement.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core;
import net.minecraft.client.gui.Gui;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementBoolean.java b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementBoolean.java
index d5cbb3ad..b0586210 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementBoolean.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementBoolean.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core;
import io.github.moulberry.notenoughupdates.core.util.lerp.LerpUtils;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementColour.java b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementColour.java
index 48996c8d..1f655aaf 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementColour.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementColour.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core;
import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementTextField.java b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementTextField.java
index f3d038e9..45dc58cc 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementTextField.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementTextField.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core;
import io.github.moulberry.notenoughupdates.core.util.StringUtils;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiScreenElementWrapper.java b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiScreenElementWrapper.java
index c7c4517b..95ed8a5f 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiScreenElementWrapper.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiScreenElementWrapper.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core;
import net.minecraft.client.gui.GuiScreen;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/Config.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/Config.java
index 2a696a44..6bafb1fd 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/Config.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/Config.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config;
public class Config {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/GuiPositionEditor.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/GuiPositionEditor.java
index 9d0133cb..eac1e5cd 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/GuiPositionEditor.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/GuiPositionEditor.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config;
import net.minecraft.client.Minecraft;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/KeybindHelper.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/KeybindHelper.java
index 30226a22..d63f871c 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/KeybindHelper.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/KeybindHelper.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config;
import org.lwjgl.input.Keyboard;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/Position.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/Position.java
index cf946649..535c92bf 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/Position.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/Position.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config;
import com.google.gson.annotations.Expose;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/PositionNew.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/PositionNew.java
index 8f2b02d8..cf756c91 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/PositionNew.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/PositionNew.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config;
import com.google.gson.annotations.Expose;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/Category.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/Category.java
index b67d0383..e0a9585a 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/Category.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/Category.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.annotations;
import java.lang.annotation.ElementType;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigAccordionId.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigAccordionId.java
index 1c847851..b11f7651 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigAccordionId.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigAccordionId.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.annotations;
import java.lang.annotation.ElementType;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorAccordion.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorAccordion.java
index 11b798f9..7491a94f 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorAccordion.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorAccordion.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.annotations;
import java.lang.annotation.ElementType;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorBoolean.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorBoolean.java
index f625b318..8e6f652c 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorBoolean.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorBoolean.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.annotations;
import java.lang.annotation.ElementType;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorButton.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorButton.java
index 455df65f..a2c56dc0 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorButton.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorButton.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.annotations;
import java.lang.annotation.ElementType;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorColour.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorColour.java
index 6640ade9..824b2eec 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorColour.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorColour.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.annotations;
import java.lang.annotation.ElementType;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorDraggableList.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorDraggableList.java
index 61e923f5..d9707c9b 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorDraggableList.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorDraggableList.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.annotations;
import java.lang.annotation.ElementType;
@@ -9,5 +28,6 @@ import java.lang.annotation.Target;
@Target(ElementType.FIELD)
public @interface ConfigEditorDraggableList {
String[] exampleText();
+
boolean allowDeleting() default true;
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorDropdown.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorDropdown.java
index ac766e93..8d870643 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorDropdown.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorDropdown.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.annotations;
import java.lang.annotation.ElementType;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorFSR.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorFSR.java
index 217df0c5..ba45ae68 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorFSR.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorFSR.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.annotations;
import java.lang.annotation.ElementType;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorKeybind.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorKeybind.java
index 8d8de2eb..f1a3e329 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorKeybind.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorKeybind.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.annotations;
import java.lang.annotation.ElementType;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorSlider.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorSlider.java
index abab37f9..b8db25bc 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorSlider.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorSlider.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.annotations;
import java.lang.annotation.ElementType;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorText.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorText.java
index 1ff7e39e..b6b32fb2 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorText.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorText.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.annotations;
import java.lang.annotation.ElementType;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigOption.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigOption.java
index 2ee23dcf..d51294e7 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigOption.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigOption.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.annotations;
import java.lang.annotation.ElementType;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditor.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditor.java
index d62c7ec7..c3969e35 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditor.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditor.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.gui;
import io.github.moulberry.notenoughupdates.core.config.struct.ConfigProcessor;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorAccordion.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorAccordion.java
index 8877cd03..dc1173ef 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorAccordion.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorAccordion.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.gui;
import io.github.moulberry.notenoughupdates.core.config.struct.ConfigProcessor;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorBoolean.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorBoolean.java
index 8a3b2f14..d12ec8e7 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorBoolean.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorBoolean.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.gui;
import io.github.moulberry.notenoughupdates.core.GuiElementBoolean;
@@ -18,7 +37,7 @@ public class GuiOptionEditorBoolean extends GuiOptionEditor {
super(option);
this.config = config;
this.runnableId = runnableId;
- bool = new GuiElementBoolean(0, 0, (boolean) option.get(),10, (value) -> onUpdate(option, value));
+ bool = new GuiElementBoolean(0, 0, (boolean) option.get(), 10, (value) -> onUpdate(option, value));
}
@Override
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorButton.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorButton.java
index 76944efa..aef6318c 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorButton.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorButton.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.gui;
import io.github.moulberry.notenoughupdates.core.config.Config;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorColour.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorColour.java
index 80d2af42..ca4087b5 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorColour.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorColour.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.gui;
import io.github.moulberry.notenoughupdates.core.ChromaColour;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorDraggableList.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorDraggableList.java
index 4dbde24b..63a932b5 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorDraggableList.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorDraggableList.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.gui;
import io.github.moulberry.notenoughupdates.core.config.struct.ConfigProcessor;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorDropdown.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorDropdown.java
index a17737e3..af6af277 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorDropdown.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorDropdown.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.gui;
import io.github.moulberry.notenoughupdates.core.config.struct.ConfigProcessor;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorFSR.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorFSR.java
index b443b5f6..048e261e 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorFSR.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorFSR.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.gui;
import io.github.moulberry.notenoughupdates.core.config.Config;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorKeybind.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorKeybind.java
index 5ff961a7..6eb71d1e 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorKeybind.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorKeybind.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.gui;
import io.github.moulberry.notenoughupdates.core.config.KeybindHelper;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorSlider.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorSlider.java
index 45ae70d9..7fceb92d 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorSlider.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorSlider.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.gui;
import io.github.moulberry.notenoughupdates.core.GuiElementTextField;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorText.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorText.java
index 7acc074b..ad2fa4db 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorText.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorText.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.gui;
import io.github.moulberry.notenoughupdates.core.GuiElementTextField;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiPositionEditor.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiPositionEditor.java
index 80ec3811..ed45bab6 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiPositionEditor.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiPositionEditor.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.gui;
import io.github.moulberry.notenoughupdates.core.config.Position;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/struct/ConfigProcessor.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/struct/ConfigProcessor.java
index dddc14de..75862069 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/struct/ConfigProcessor.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/struct/ConfigProcessor.java
@@ -1,9 +1,50 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.config.struct;
import com.google.gson.annotations.Expose;
import io.github.moulberry.notenoughupdates.core.config.Config;
-import io.github.moulberry.notenoughupdates.core.config.annotations.*;
-import io.github.moulberry.notenoughupdates.core.config.gui.*;
+import io.github.moulberry.notenoughupdates.core.config.annotations.Category;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigAccordionId;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorAccordion;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorBoolean;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorButton;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorColour;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorDraggableList;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorDropdown;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorFSR;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorKeybind;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorSlider;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorText;
+import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigOption;
+import io.github.moulberry.notenoughupdates.core.config.gui.GuiOptionEditor;
+import io.github.moulberry.notenoughupdates.core.config.gui.GuiOptionEditorAccordion;
+import io.github.moulberry.notenoughupdates.core.config.gui.GuiOptionEditorBoolean;
+import io.github.moulberry.notenoughupdates.core.config.gui.GuiOptionEditorButton;
+import io.github.moulberry.notenoughupdates.core.config.gui.GuiOptionEditorColour;
+import io.github.moulberry.notenoughupdates.core.config.gui.GuiOptionEditorDraggableList;
+import io.github.moulberry.notenoughupdates.core.config.gui.GuiOptionEditorDropdown;
+import io.github.moulberry.notenoughupdates.core.config.gui.GuiOptionEditorFSR;
+import io.github.moulberry.notenoughupdates.core.config.gui.GuiOptionEditorKeybind;
+import io.github.moulberry.notenoughupdates.core.config.gui.GuiOptionEditorSlider;
+import io.github.moulberry.notenoughupdates.core.config.gui.GuiOptionEditorText;
import java.lang.reflect.Field;
import java.util.LinkedHashMap;
@@ -148,7 +189,11 @@ public class ConfigProcessor {
if (optionField.isAnnotationPresent(ConfigEditorDraggableList.class)) {
ConfigEditorDraggableList configEditorAnnotation =
optionField.getAnnotation(ConfigEditorDraggableList.class);
- editor = new GuiOptionEditorDraggableList(option, configEditorAnnotation.exampleText(), configEditorAnnotation.allowDeleting());
+ editor = new GuiOptionEditorDraggableList(
+ option,
+ configEditorAnnotation.exampleText(),
+ configEditorAnnotation.allowDeleting()
+ );
}
}
if (optionType.isAssignableFrom(String.class)) {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/GuiElementSlider.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/GuiElementSlider.java
index c2252a97..3e982f9d 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/util/GuiElementSlider.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/GuiElementSlider.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.util;
import io.github.moulberry.notenoughupdates.core.GuiElement;
@@ -10,7 +29,13 @@ import org.lwjgl.opengl.GL11;
import java.util.function.Consumer;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.*;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.slider_button_new;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.slider_off_cap;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.slider_off_notch;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.slider_off_segment;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.slider_on_cap;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.slider_on_notch;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.slider_on_segment;
public class GuiElementSlider extends GuiElement {
public int x;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/Line.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/Line.java
index fb134e85..a5744a26 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/util/Line.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/Line.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.util;
import net.minecraft.util.Vec3;
@@ -16,9 +35,11 @@ public class Line {
}
public Vec3 getMidpoint() {
- return new Vec3((point1.xCoord + point2.xCoord) / 2.0,
+ return new Vec3(
+ (point1.xCoord + point2.xCoord) / 2.0,
(point1.yCoord + point2.yCoord) / 2.0,
- (point1.zCoord + point2.zCoord) / 2.0);
+ (point1.zCoord + point2.zCoord) / 2.0
+ );
}
/**
@@ -27,8 +48,7 @@ public class Line {
*
* @return The intersection {@link Line} or {@code null} if no solution found
*/
- public Line getIntersectionLineSegment(Line other)
- {
+ public Line getIntersectionLineSegment(Line other) {
Vec3 p1 = this.point1;
Vec3 p2 = this.point2;
Vec3 p3 = other.point1;
@@ -61,14 +81,17 @@ public class Line {
double mub = (d1343 + d4321 * (mua)) / d4343;
Line resultSegment = new Line(
- new Vec3 (
- (float)(p1.xCoord + mua * p21.xCoord),
- (float)(p1.yCoord + mua * p21.yCoord),
- (float)(p1.zCoord + mua * p21.zCoord)),
- new Vec3 (
- (float)(p3.xCoord + mub * p43.xCoord),
- (float)(p3.yCoord + mub * p43.yCoord),
- (float)(p3.zCoord + mub * p43.zCoord)));
+ new Vec3(
+ (float) (p1.xCoord + mua * p21.xCoord),
+ (float) (p1.yCoord + mua * p21.yCoord),
+ (float) (p1.zCoord + mua * p21.zCoord)
+ ),
+ new Vec3(
+ (float) (p3.xCoord + mub * p43.xCoord),
+ (float) (p3.yCoord + mub * p43.yCoord),
+ (float) (p3.zCoord + mub * p43.zCoord)
+ )
+ );
return resultSegment;
}
@@ -82,9 +105,11 @@ public class Line {
}
public String toString() {
- return String.format("point1 = %s, point2 = %s, midpoint = %s",
+ return String.format(
+ "point1 = %s, point2 = %s, midpoint = %s",
point1 == null ? "NULL" : point1.toString(),
point2 == null ? "NULL" : point2.toString(),
- (point1 == null || point2 == null) ? "NULL" : getMidpoint());
+ (point1 == null || point2 == null) ? "NULL" : getMidpoint()
+ );
}
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/MiscUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/MiscUtils.java
index 03a9483b..41780140 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/util/MiscUtils.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/MiscUtils.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.util;
import net.minecraft.client.Minecraft;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/Splitters.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/Splitters.java
index 0bb858db..389991b4 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/util/Splitters.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/Splitters.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.util;
import com.google.common.base.Splitter;
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 b0deadd2..41f2742f 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
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.util;
import com.google.common.collect.Sets;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/Vec3Comparable.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/Vec3Comparable.java
index cd144c21..c9736b77 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/util/Vec3Comparable.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/Vec3Comparable.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.util;
import net.minecraft.util.BlockPos;
@@ -54,7 +73,7 @@ public class Vec3Comparable extends Vec3 implements Comparable {
}
@Override
- public Vec3Comparable add(Vec3 other) {
+ public Vec3Comparable add(Vec3 other) {
return new Vec3Comparable(super.add(other));
}
@@ -89,19 +108,19 @@ public class Vec3Comparable extends Vec3 implements Comparable {
}
@Override
- public boolean equals(Object other) {
- if (this == other) {
+ public boolean equals(Object other) {
+ if (this == other) {
return true;
- } else if (!(other instanceof Vec3Comparable)) {
+ } else if (!(other instanceof Vec3Comparable)) {
return false;
- } else {
+ } else {
Vec3Comparable vec3c = (Vec3Comparable) other;
return this.xCoord == vec3c.xCoord && this.yCoord == vec3c.yCoord && this.zCoord == vec3c.zCoord;
}
}
@Override
- public int hashCode() {
+ public int hashCode() {
long bits = 1L;
bits = 31L * bits + doubleToLongBits(xCoord);
bits = 31L * bits + doubleToLongBits(yCoord);
@@ -112,9 +131,9 @@ public class Vec3Comparable extends Vec3 implements Comparable {
public int compareTo(Vec3Comparable other) {
return this.yCoord == other.yCoord ?
(this.zCoord == other.zCoord ?
- (int)(this.xCoord - other.xCoord)
- : (int)(this.zCoord - other.zCoord))
- : (int)(this.yCoord - other.yCoord);
+ (int) (this.xCoord - other.xCoord)
+ : (int) (this.zCoord - other.zCoord))
+ : (int) (this.yCoord - other.yCoord);
}
public boolean signumEquals(Vec3 other) {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpUtils.java
index 7e401959..0e60ad92 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpUtils.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpUtils.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.util.lerp;
public class LerpUtils {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpingFloat.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpingFloat.java
index 3d9e7787..fb03140c 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpingFloat.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpingFloat.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.util.lerp;
public class LerpingFloat {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpingInteger.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpingInteger.java
index 024455fd..8462200f 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpingInteger.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpingInteger.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.util.lerp;
public class LerpingInteger {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/RenderUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/RenderUtils.java
index 96e9729f..e7ce29c3 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/RenderUtils.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/RenderUtils.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.util.render;
import io.github.moulberry.notenoughupdates.core.BackgroundBlur;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/TextRenderUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/TextRenderUtils.java
index ff7ac53a..cee38cea 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/TextRenderUtils.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/TextRenderUtils.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.core.util.render;
import io.github.moulberry.notenoughupdates.core.util.StringUtils;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java
index 18e62706..293535e7 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.cosmetics;
import com.google.common.collect.BiMap;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeNode.java b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeNode.java
index c32cc98f..9bf0313b 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeNode.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeNode.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.cosmetics;
import net.minecraft.client.renderer.Tessellator;
@@ -391,4 +410,4 @@ public class CapeNode {
.normal(otherSideNorm.x, otherSideNorm.y, otherSideNorm.z).endVertex();
tessellator.draw();
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/GuiCosmetics.java b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/GuiCosmetics.java
index 1b33decf..0e37bed3 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/GuiCosmetics.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/GuiCosmetics.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.cosmetics;
import com.google.gson.Gson;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/NEUCape.java b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/NEUCape.java
index a58587a8..d32abf64 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/NEUCape.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/NEUCape.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.cosmetics;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java
index 02e8215c..45db303b 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/ShaderManager.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.cosmetics;
import net.minecraft.client.Minecraft;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonBlocks.java b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonBlocks.java
index 0e7c59c7..7a2eb2b0 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonBlocks.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonBlocks.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.dungeons;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonMap.java b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonMap.java
index e132d287..2693341a 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonMap.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonMap.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.dungeons;
import com.google.common.collect.Iterables;
@@ -46,8 +65,13 @@ import java.awt.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
-import java.util.*;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
public class DungeonMap {
private static final ResourceLocation GREEN_CHECK = new ResourceLocation(
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java
index 66389beb..a56a5679 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.dungeons;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
@@ -14,7 +33,12 @@ import net.minecraftforge.client.event.ClientChatReceivedEvent;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL14;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.ConcurrentModificationException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@@ -200,11 +224,16 @@ public class DungeonWin {
displayWin();
} else {
if (unformatted.trim().length() > 0) {
- if (unformatted.contains("The Catacombs") || unformatted.contains("Master Mode Catacombs") || unformatted.contains("Team Score") || unformatted.contains("Defeated") || unformatted.contains("Total Damage")
- || unformatted.contains("Ally Healing") || unformatted.contains("Enemies Killed") || unformatted.contains("Deaths") || unformatted.contains("Secrets Found")) {
+ if (unformatted.contains("The Catacombs") || unformatted.contains("Master Mode Catacombs") ||
+ unformatted.contains("Team Score") || unformatted.contains("Defeated") || unformatted.contains(
+ "Total Damage")
+ || unformatted.contains("Ally Healing") || unformatted.contains("Enemies Killed") || unformatted.contains(
+ "Deaths") || unformatted.contains("Secrets Found")) {
text.add(e.message.getFormattedText().substring(6).trim());
} else {
- System.out.println("These messages would of showed on neu dungeon overlay but didnt, They are either bugged or i missed them: \"" + e.message.getFormattedText().substring(6).trim() + "\"");
+ System.out.println(
+ "These messages would of showed on neu dungeon overlay but didnt, They are either bugged or i missed them: \"" +
+ e.message.getFormattedText().substring(6).trim() + "\"");
}
}
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/GuiDungeonMapEditor.java b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/GuiDungeonMapEditor.java
index e59e0ea1..47e85023 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/GuiDungeonMapEditor.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/GuiDungeonMapEditor.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.dungeons;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
@@ -29,10 +48,16 @@ import org.lwjgl.opengl.GL11;
import java.awt.*;
import java.io.IOException;
import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
-import java.util.*;
+import java.util.Map;
-import static io.github.moulberry.notenoughupdates.util.GuiTextures.*;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.button_tex;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.slider_button;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.slider_off_large;
+import static io.github.moulberry.notenoughupdates.util.GuiTextures.slider_on_large;
public class GuiDungeonMapEditor extends GuiScreen {
public static final ResourceLocation BACKGROUND = new ResourceLocation(
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/events/NEUEvent.java b/src/main/java/io/github/moulberry/notenoughupdates/events/NEUEvent.java
index a2c82070..178431d0 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/events/NEUEvent.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/events/NEUEvent.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.events;
import net.minecraftforge.common.MinecraftForge;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/events/OnBlockBreakSoundEffect.java b/src/main/java/io/github/moulberry/notenoughupdates/events/OnBlockBreakSoundEffect.java
index aeffa7da..9a2516e1 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/events/OnBlockBreakSoundEffect.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/events/OnBlockBreakSoundEffect.java
@@ -1,6 +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 .
+ */
+
package io.github.moulberry.notenoughupdates.events;
-import net.minecraft.block.state.BlockState;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.audio.ISound;
import net.minecraft.util.BlockPos;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/events/RepositoryReloadEvent.java b/src/main/java/io/github/moulberry/notenoughupdates/events/RepositoryReloadEvent.java
index b0ffc3e7..bf6448a2 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/events/RepositoryReloadEvent.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/events/RepositoryReloadEvent.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.events;
import java.io.File;
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 945dd71c..a449919e 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/DevInfoPane.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/DevInfoPane.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.infopanes;
import com.google.gson.JsonObject;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/FlipperInfoPane.java b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/FlipperInfoPane.java
index 441bf735..4b6c73f4 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/FlipperInfoPane.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/FlipperInfoPane.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.infopanes;
import io.github.moulberry.notenoughupdates.NEUManager;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/HTMLInfoPane.java b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/HTMLInfoPane.java
index e4098f3e..03f55561 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/HTMLInfoPane.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/HTMLInfoPane.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.infopanes;
import info.bliki.htmlcleaner.TagNode;
@@ -26,7 +45,16 @@ import org.apache.commons.lang3.SystemUtils;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.CharsetEncoder;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/InfoPane.java b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/InfoPane.java
index 03cb64f6..5f73e57a 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/InfoPane.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/InfoPane.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.infopanes;
import io.github.moulberry.notenoughupdates.NEUManager;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/ScrollableInfoPane.java b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/ScrollableInfoPane.java
index 75b66770..9bc47fc5 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/ScrollableInfoPane.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/ScrollableInfoPane.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.infopanes;
import io.github.moulberry.notenoughupdates.NEUManager;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/TextInfoPane.java b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/TextInfoPane.java
index 77d47a3d..90bed1fa 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/TextInfoPane.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/TextInfoPane.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.infopanes;
import io.github.moulberry.notenoughupdates.NEUManager;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/GuiElement.java b/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/GuiElement.java
index 38ad2824..ab277078 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/GuiElement.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/GuiElement.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.itemeditor;
import net.minecraft.client.gui.Gui;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/GuiElementButton.java b/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/GuiElementButton.java
index 35b31490..54cba6b8 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/GuiElementButton.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/GuiElementButton.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.itemeditor;
import java.awt.*;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/GuiElementText.java b/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/GuiElementText.java
index 1e7a8c08..9f612fcf 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/GuiElementText.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/GuiElementText.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.itemeditor;
import net.minecraft.client.Minecraft;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/GuiElementTextField.java b/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/GuiElementTextField.java
index f37f2fa1..71c4d498 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/GuiElementTextField.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/GuiElementTextField.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.itemeditor;
import io.github.moulberry.notenoughupdates.util.Utils;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/NEUItemEditor.java b/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/NEUItemEditor.java
index 7e776bcd..ff0e5f13 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/NEUItemEditor.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/NEUItemEditor.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.itemeditor;
import com.google.gson.JsonArray;
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 e4f0b3da..408c8a6d 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.listener;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
@@ -24,7 +43,10 @@ import java.util.concurrent.atomic.AtomicBoolean;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import static io.github.moulberry.notenoughupdates.overlays.SlayerOverlay.*;
+import static io.github.moulberry.notenoughupdates.overlays.SlayerOverlay.RNGMeter;
+import static io.github.moulberry.notenoughupdates.overlays.SlayerOverlay.slayerXp;
+import static io.github.moulberry.notenoughupdates.overlays.SlayerOverlay.timeSinceLastBoss;
+import static io.github.moulberry.notenoughupdates.overlays.SlayerOverlay.timeSinceLastBoss2;
public class ChatListener {
private final NotEnoughUpdates neu;
@@ -124,7 +146,7 @@ public class ChatListener {
public void onGuiChat(ClientChatReceivedEvent e) {
if (e.type == 2) {
CrystalMetalDetectorSolver.process(e.message);
- TimersOverlay.processActionBar(e.message.getUnformattedText());
+ TimersOverlay.processActionBar(e.message.getUnformattedText());
e.message = processChatComponent(e.message);
return;
} else if (e.type == 0) {
@@ -145,10 +167,11 @@ public class ChatListener {
.substring("Your profile was changed to: ".length())
.split(" ")[0].trim());
} else if (unformatted.startsWith("Your new API key is ")) {
- NotEnoughUpdates.INSTANCE.config.apiData.apiKey = unformatted.substring("Your new API key is ".length()).substring(
- 0,
- 36
- );
+ NotEnoughUpdates.INSTANCE.config.apiData.apiKey =
+ unformatted.substring("Your new API key is ".length()).substring(
+ 0,
+ 36
+ );
Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
EnumChatFormatting.YELLOW + "[NEU] API Key automatically configured"));
} else if (unformatted.startsWith("Player List Info is now disabled!")) {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java b/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java
index ab4e9dca..fab02bf9 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.listener;
import com.google.gson.JsonArray;
@@ -46,7 +65,6 @@ import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import java.util.regex.PatternSyntaxException;
public class ItemTooltipListener {
private static final String petToolTipRegex =
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 d070fc2d..ec459ad0 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/listener/NEUEventListener.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/NEUEventListener.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.listener;
import com.google.gson.JsonObject;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/listener/OldAnimationChecker.java b/src/main/java/io/github/moulberry/notenoughupdates/listener/OldAnimationChecker.java
index e537b2b7..7858918b 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/listener/OldAnimationChecker.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/OldAnimationChecker.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.listener;
import com.google.common.collect.Lists;
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 610412ac..aedca6e3 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.listener;
import com.google.common.collect.Lists;
@@ -900,7 +919,12 @@ public class RenderListener {
GuiChest eventGui = (GuiChest) guiScreen;
ContainerChest cc = (ContainerChest) eventGui.inventorySlots;
containerName = cc.getLowerChestInventory().getDisplayName().getUnformattedText();
- if (containerName.contains(" Profile") && BetterContainers.profileViewerStackIndex != -1 && ((AccessorGuiContainer)eventGui).doIsMouseOverSlot(cc.inventorySlots.get(BetterContainers.profileViewerStackIndex), mouseX, mouseY) &&
+ if (containerName.contains(" Profile") && BetterContainers.profileViewerStackIndex != -1 &&
+ ((AccessorGuiContainer) eventGui).doIsMouseOverSlot(
+ cc.inventorySlots.get(BetterContainers.profileViewerStackIndex),
+ mouseX,
+ mouseY
+ ) &&
Mouse.getEventButton() >= 0) {
event.setCanceled(true);
if (Mouse.getEventButtonState() && eventGui.inventorySlots.inventorySlots.get(22).getStack() != null &&
@@ -1047,7 +1071,10 @@ public class RenderListener {
"config/notenoughupdates/repo/constants/essencecosts.json"
);
String fileContent;
- fileContent = new BufferedReader(new InputStreamReader(Files.newInputStream(file.toPath()), StandardCharsets.UTF_8))
+ fileContent = new BufferedReader(new InputStreamReader(
+ Files.newInputStream(file.toPath()),
+ StandardCharsets.UTF_8
+ ))
.lines()
.collect(Collectors.joining(System.lineSeparator()));
String id = null;
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 2f4ec33c..622b2088 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ScoreboardLocationChangeListener.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ScoreboardLocationChangeListener.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.listener;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBAnchorPoint.java b/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBAnchorPoint.java
index eaf41ba6..7193b47f 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBAnchorPoint.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBAnchorPoint.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.mbgui;
import org.lwjgl.util.vector.Vector2f;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBDeserializer.java b/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBDeserializer.java
index b9e858ef..5f530c00 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBDeserializer.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBDeserializer.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.mbgui;
import com.google.gson.JsonObject;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiElement.java b/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiElement.java
index ad836097..3e3ab1e3 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiElement.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiElement.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.mbgui;
public abstract class MBGuiElement {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiGroup.java b/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiGroup.java
index 4540b146..b183bd1e 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiGroup.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiGroup.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.mbgui;
import org.lwjgl.util.vector.Vector2f;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiGroupAligned.java b/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiGroupAligned.java
index eef4b5e5..5c0cd37e 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiGroupAligned.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiGroupAligned.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.mbgui;
import org.lwjgl.util.vector.Vector2f;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiGroupFloating.java b/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiGroupFloating.java
index 24697cc6..c57f0b74 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiGroupFloating.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiGroupFloating.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.mbgui;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
@@ -10,7 +29,11 @@ import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.gui.inventory.GuiContainer;
import org.lwjgl.util.vector.Vector2f;
-import java.util.*;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
public class MBGuiGroupFloating extends MBGuiGroup {
private GuiScreen lastScreen = null;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionBINWarning.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionBINWarning.java
index 3bae4715..c52f8968 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionBINWarning.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionBINWarning.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import com.google.gson.JsonObject;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionSortModeWarning.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionSortModeWarning.java
index 5137c90f..97e32749 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionSortModeWarning.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionSortModeWarning.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
@@ -58,8 +77,9 @@ public class AuctionSortModeWarning {
String warningText = "\u00a7aSort: " + selectedColour + selectedSort;
int warningLength = Minecraft.getMinecraft().fontRendererObj.getStringWidth(warningText);
- int centerX = ((AccessorGuiContainer)chest).getGuiLeft() + ((AccessorGuiContainer)chest).getXSize() / 2 + 9;
- int centerY = ((AccessorGuiContainer)chest).getGuiTop() + 26;
+ int centerX =
+ ((AccessorGuiContainer) chest).getGuiLeft() + ((AccessorGuiContainer) chest).getXSize() / 2 + 9;
+ int centerY = ((AccessorGuiContainer) chest).getGuiTop() + 26;
RenderUtils.drawFloatingRectDark(centerX - warningLength / 2 - 4, centerY - 6,
warningLength + 8, 12, false
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/BetterContainers.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/BetterContainers.java
index 811c30d2..e51496e3 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/BetterContainers.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/BetterContainers.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import com.google.gson.JsonObject;
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 0abd5216..2aec0fbe 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CookieWarning.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CookieWarning.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import com.google.common.collect.Lists;
@@ -20,7 +39,7 @@ public class CookieWarning {
@SubscribeEvent
public void onJoinWorld(EntityJoinWorldEvent e) {
- if(e.entity == Minecraft.getMinecraft().thePlayer) {
+ if (e.entity == Minecraft.getMinecraft().thePlayer) {
this.checkCookie();
}
}
@@ -33,24 +52,27 @@ public class CookieWarning {
* Checks the tab list for a cookie timer, and sends a chat message if the timer is within the tolerance
*/
private void checkCookie() {
- if(!hasNotified && NotEnoughUpdates.INSTANCE.config.notifications.doBoosterNotif) {
+ if (!hasNotified && NotEnoughUpdates.INSTANCE.config.notifications.doBoosterNotif) {
String[] lines = {};
try {
- lines = ((AccessorGuiPlayerTabOverlay) Minecraft.getMinecraft().ingameGUI.getTabList()).getFooter().getUnformattedText().split("\n");
- } catch(NullPointerException e) {
+ lines = ((AccessorGuiPlayerTabOverlay) Minecraft.getMinecraft().ingameGUI.getTabList())
+ .getFooter()
+ .getUnformattedText()
+ .split("\n");
+ } catch (NullPointerException e) {
return; // if the footer is null or somehow doesn't exist, stop
}
boolean hasCookie = true;
String timeLine = null; // the line that contains the cookie timer
- for(int i = 0; i < lines.length; i++) {
- if(lines[i].startsWith("Cookie Buff")) {
- timeLine = lines[i+1]; // the line after the "Cookie Buff" line
+ for (int i = 0; i < lines.length; i++) {
+ if (lines[i].startsWith("Cookie Buff")) {
+ timeLine = lines[i + 1]; // the line after the "Cookie Buff" line
}
- if(lines[i].startsWith("Not active! Obtain booster cookies from the")) {
+ if (lines[i].startsWith("Not active! Obtain booster cookies from the")) {
hasCookie = false;
}
}
- if(!hasCookie) {
+ if (!hasCookie) {
NotificationHandler.displayNotification(Lists.newArrayList(
"\u00a7cBooster Cookie Ran Out!",
"\u00a77Your Booster Cookie expired!",
@@ -60,21 +82,21 @@ public class CookieWarning {
hasNotified = true;
return;
}
- if(timeLine != null) {
+ if (timeLine != null) {
String[] digits = timeLine.split(" ");
int minutes = 0;
try {
- for(String digit : digits) {
- if(digit.endsWith("y")) {
+ for (String digit : digits) {
+ if (digit.endsWith("y")) {
digit = digit.substring(0, digit.length() - 1);
minutes += Integer.parseInt(digit) * 525600;
- } else if(digit.endsWith("d")) {
+ } else if (digit.endsWith("d")) {
digit = digit.substring(0, digit.length() - 1);
minutes += Integer.parseInt(digit) * 1440;
- } else if(digit.endsWith("h")) {
+ } else if (digit.endsWith("h")) {
digit = digit.substring(0, digit.length() - 1);
minutes += Integer.parseInt(digit) * 60;
- } else if(digit.endsWith("m")) {
+ } else if (digit.endsWith("m")) {
digit = digit.substring(0, digit.length() - 1);
minutes += Integer.parseInt(digit);
} // ignore seconds
@@ -85,7 +107,7 @@ public class CookieWarning {
EnumChatFormatting.RED +
"NEU ran into an issue when retrieving the Booster Cookie Timer. Check the logs for details."));
}
- if(minutes < NotEnoughUpdates.INSTANCE.config.notifications.boosterCookieWarningMins) {
+ if (minutes < NotEnoughUpdates.INSTANCE.config.notifications.boosterCookieWarningMins) {
NotificationHandler.displayNotification(Lists.newArrayList(
"\u00a7cBooster Cookie Running Low!",
"\u00a77Your Booster Cookie will expire in " + timeLine,
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 f43ebda2..167b6a2f 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolver.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolver.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
@@ -52,56 +71,56 @@ public class CrystalMetalDetectorSolver {
private static final String EMERALD_STRING = "emerald";
private static final String GOLD_STRING = "gold";
private static final HashMap keeperOffsets = new HashMap() {{
- put(DIAMOND_STRING, new Vec3i(33,0,3));
- put(LAPIS_STRING, new Vec3i(-33,0,-3));
- put(EMERALD_STRING, new Vec3i(-3,0,33));
- put(GOLD_STRING, new Vec3i(3,0,-33));
+ put(DIAMOND_STRING, new Vec3i(33, 0, 3));
+ put(LAPIS_STRING, new Vec3i(-33, 0, -3));
+ put(EMERALD_STRING, new Vec3i(-3, 0, 33));
+ put(GOLD_STRING, new Vec3i(3, 0, -33));
}};
// Chest offsets from center
private static final HashSet knownChestOffsets = new HashSet<>(Arrays.asList(
- -10171958951910L, // x=-38, y=-22, z=26
- 10718829084646L, // x=38, y=-22, z=-26
- -10721714765806L, // x=-40, y=-22, z=18
- -10996458455018L, // x=-41, y=-20, z=22
- -1100920913904L, // x=-5, y=-21, z=16
- 11268584898530L, // x=40, y=-22, z=-30
- -11271269253148L, // x=-42, y=-20, z=-28
- -11546281377832L, // x=-43, y=-22, z=-40
- 11818542038999L, // x=42, y=-19, z=-41
- 12093285728240L, // x=43, y=-21, z=-16
- -1409286164L, // x=-1, y=-22, z=-20
- 1922736062492L, // x=6, y=-21, z=28
- 2197613969419L, // x=7, y=-21, z=11
- 2197613969430L, // x=7, y=-21, z=22
- -3024999153708L, // x=-12, y=-21, z=-44
- 3571936395295L, // x=12, y=-22, z=31
- 3572003504106L, // x=12, y=-22, z=-22
- 3572003504135L, // x=12, y=-21, z=7
- 3572070612949L, // x=12, y=-21, z=-43
- -3574822076373L, // x=-14, y=-21, z=43
- -3574822076394L, // x=-14, y=-21, z=22
- -4399455797228L, // x=-17, y=-21, z=20
- -5224156626944L, // x=-20, y=-22, z=0
- 548346527764L, // x=1, y=-21, z=20
- 5496081743901L, // x=19, y=-22, z=29
- 5770959650816L, // x=20, y=-22, z=0
- 5771093868518L, // x=20, y=-21, z=-26
- -6048790347736L, // x=-23, y=-22, z=40
- 6320849682418L, // x=22, y=-21, z=-14
- -6323668254708L, // x=-24, y=-22, z=12
- 6595593371674L, // x=23, y=-22, z=26
- 6595660480473L, // x=23, y=-22, z=-39
- 6870471278619L, // x=24, y=-22, z=27
- 7145349185553L, // x=25, y=-22, z=17
- 8244995030996L, // x=29, y=-21, z=-44
- -8247679385612L, // x=-31, y=-21, z=-12
- -8247679385640L, // x=-31, y=-21, z=-40
- 8519872937959L, // x=30, y=-21, z=-25
- -8522557292584L, // x=-32, y=-21, z=-40
- -9622068920278L, // x=-36, y=-20, z=42
- -9896946827278L, // x=-37, y=-21, z=-14
- -9896946827286L // x=-37, y=-21, z=-22
+ -10171958951910L, // x=-38, y=-22, z=26
+ 10718829084646L, // x=38, y=-22, z=-26
+ -10721714765806L, // x=-40, y=-22, z=18
+ -10996458455018L, // x=-41, y=-20, z=22
+ -1100920913904L, // x=-5, y=-21, z=16
+ 11268584898530L, // x=40, y=-22, z=-30
+ -11271269253148L, // x=-42, y=-20, z=-28
+ -11546281377832L, // x=-43, y=-22, z=-40
+ 11818542038999L, // x=42, y=-19, z=-41
+ 12093285728240L, // x=43, y=-21, z=-16
+ -1409286164L, // x=-1, y=-22, z=-20
+ 1922736062492L, // x=6, y=-21, z=28
+ 2197613969419L, // x=7, y=-21, z=11
+ 2197613969430L, // x=7, y=-21, z=22
+ -3024999153708L, // x=-12, y=-21, z=-44
+ 3571936395295L, // x=12, y=-22, z=31
+ 3572003504106L, // x=12, y=-22, z=-22
+ 3572003504135L, // x=12, y=-21, z=7
+ 3572070612949L, // x=12, y=-21, z=-43
+ -3574822076373L, // x=-14, y=-21, z=43
+ -3574822076394L, // x=-14, y=-21, z=22
+ -4399455797228L, // x=-17, y=-21, z=20
+ -5224156626944L, // x=-20, y=-22, z=0
+ 548346527764L, // x=1, y=-21, z=20
+ 5496081743901L, // x=19, y=-22, z=29
+ 5770959650816L, // x=20, y=-22, z=0
+ 5771093868518L, // x=20, y=-21, z=-26
+ -6048790347736L, // x=-23, y=-22, z=40
+ 6320849682418L, // x=22, y=-21, z=-14
+ -6323668254708L, // x=-24, y=-22, z=12
+ 6595593371674L, // x=23, y=-22, z=26
+ 6595660480473L, // x=23, y=-22, z=-39
+ 6870471278619L, // x=24, y=-22, z=27
+ 7145349185553L, // x=25, y=-22, z=17
+ 8244995030996L, // x=29, y=-21, z=-44
+ -8247679385612L, // x=-31, y=-21, z=-12
+ -8247679385640L, // x=-31, y=-21, z=-40
+ 8519872937959L, // x=30, y=-21, z=-25
+ -8522557292584L, // x=-32, y=-21, z=-40
+ -9622068920278L, // x=-36, y=-20, z=42
+ -9896946827278L, // x=-37, y=-21, z=-14
+ -9896946827286L // x=-37, y=-21, z=-22
));
static Predicate treasureAllowedPredicate = CrystalMetalDetectorSolver::treasureAllowed;
@@ -153,9 +172,11 @@ public class CrystalMetalDetectorSolver {
mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "[NEU] Found solution."));
if (NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.contains(NEUDebugFlag.METAL) &&
(previousState == SolutionState.INVALID || previousState == SolutionState.FAILED)) {
- NEUDebugLogger.log(NEUDebugFlag.METAL,
+ NEUDebugLogger.log(
+ NEUDebugFlag.METAL,
EnumChatFormatting.AQUA + "Solution coordinates: " +
- EnumChatFormatting.WHITE + possibleBlocks.iterator().next().toString());
+ EnumChatFormatting.WHITE + possibleBlocks.iterator().next().toString()
+ );
}
break;
case INVALID:
@@ -184,9 +205,9 @@ public class CrystalMetalDetectorSolver {
}
static void findPossibleSolutions(double distToTreasure, Vec3Comparable playerPos, boolean centerNewlyDiscovered) {
- if (prevDistToTreasure == distToTreasure && prevPlayerPos.equals(playerPos) &&
- !evaluatedPlayerPositions.containsKey(playerPos)) {
- evaluatedPlayerPositions.put(playerPos, distToTreasure);
+ if (prevDistToTreasure == distToTreasure && prevPlayerPos.equals(playerPos) &&
+ !evaluatedPlayerPositions.containsKey(playerPos)) {
+ evaluatedPlayerPositions.put(playerPos, distToTreasure);
if (possibleBlocks.size() == 0) {
for (int zOffset = (int) Math.floor(-distToTreasure); zOffset <= Math.ceil(distToTreasure); zOffset++) {
for (int y = 65; y <= 75; y++) {
@@ -259,7 +280,7 @@ public class CrystalMetalDetectorSolver {
if (minesCenter != Vec3i.NULL_VECTOR) {
BlockPos relativeOffset = blockPos.subtract(minesCenter);
sb.append(", Relative: ");
- sb.append(relativeOffset.toString() );
+ sb.append(relativeOffset.toString());
sb.append(" (" + relativeOffset.toLong() + ")");
}
sb.append("\n");
@@ -296,7 +317,7 @@ public class CrystalMetalDetectorSolver {
if (chestFound) {
prevPlayerPos = null;
prevDistToTreasure = 0;
- if (possibleBlocks.size() == 1) {
+ if (possibleBlocks.size() == 1) {
openedChestPositions.add(possibleBlocks.iterator().next().getImmutable());
}
}
@@ -360,11 +381,11 @@ public class CrystalMetalDetectorSolver {
EntityArmorStand keeperEntity = keeperEntities.get(0);
String keeperName = keeperEntity.getCustomNameTag();
- NEUDebugLogger.log(NEUDebugFlag.METAL,"Locating center using Keeper: " +
+ NEUDebugLogger.log(NEUDebugFlag.METAL, "Locating center using Keeper: " +
EnumChatFormatting.WHITE + keeperEntity);
String keeperType = keeperName.substring(keeperName.indexOf(KEEPER_OF_STRING) + KEEPER_OF_STRING.length());
- minesCenter = keeperEntity.getPosition().add(keeperOffsets.get(keeperType.toLowerCase()));
- NEUDebugLogger.log(NEUDebugFlag.METAL,"Mines center: " +
+ 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."));
@@ -538,8 +559,7 @@ public class CrystalMetalDetectorSolver {
return;
}
- if (!NotEnoughUpdates.INSTANCE.config.mining.metalDetectorEnabled)
- {
+ if (!NotEnoughUpdates.INSTANCE.config.mining.metalDetectorEnabled) {
mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
"[NEU] Metal Detector Solver is not enabled."));
return;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalOverlay.java
index 2b095c42..c0653742 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalOverlay.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
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 1bc26d50..19cf9c09 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolver.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolver.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
@@ -74,6 +93,7 @@ public class CrystalWishingCompassSolver {
}
private static final CrystalWishingCompassSolver INSTANCE = new CrystalWishingCompassSolver();
+
public static CrystalWishingCompassSolver getInstance() {
return INSTANCE;
}
@@ -118,9 +138,11 @@ public class CrystalWishingCompassSolver {
public LongSupplier currentTimeMillis = System::currentTimeMillis;
public BooleanSupplier kingsScentPresent = this::isKingsScentPresent;
public BooleanSupplier keyInInventory = this::isKeyInInventory;
+
public interface CrystalEnumSetSupplier {
EnumSet getAsCrystalEnumSet();
}
+
public CrystalEnumSetSupplier foundCrystals = this::getFoundCrystals;
private SolverState solverState;
@@ -159,7 +181,7 @@ public class CrystalWishingCompassSolver {
}
private void resetForNewTarget() {
- NEUDebugLogger.log(NEUDebugFlag.WISHING,"Resetting for new target");
+ NEUDebugLogger.log(NEUDebugFlag.WISHING, "Resetting for new target");
solverState = SolverState.NOT_STARTED;
firstCompass = null;
secondCompass = null;
@@ -188,7 +210,7 @@ public class CrystalWishingCompassSolver {
event.entityPlayer != mc.thePlayer ||
(event.action != PlayerInteractEvent.Action.RIGHT_CLICK_AIR &&
event.action != PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK)
- ) {
+ ) {
return;
}
@@ -248,57 +270,57 @@ public class CrystalWishingCompassSolver {
public HandleCompassResult handleCompassUse(BlockPos playerPos) {
long lastCompassUsedMillis = 0;
switch (solverState) {
- case PROCESSING_SECOND_USE:
- if (secondCompass != null) {
- lastCompassUsedMillis = secondCompass.whenUsedMillis;
- }
- case PROCESSING_FIRST_USE:
- if (lastCompassUsedMillis == 0 && firstCompass != null) {
- lastCompassUsedMillis = firstCompass.whenUsedMillis;
- }
- if (lastCompassUsedMillis != 0 &&
- (currentTimeMillis.getAsLong() > lastCompassUsedMillis + ALL_PARTICLES_MAX_MILLIS)) {
- return HandleCompassResult.NO_PARTICLES_FOR_PREVIOUS_COMPASS;
- }
-
- return HandleCompassResult.STILL_PROCESSING_PRIOR_USE;
- case SOLVED:
- case FAILED_EXCEPTION:
- case FAILED_TIMEOUT_NO_REPEATING:
- case FAILED_TIMEOUT_NO_PARTICLES:
- case FAILED_INTERSECTION_CALCULATION:
- case FAILED_INVALID_SOLUTION:
+ case PROCESSING_SECOND_USE:
+ if (secondCompass != null) {
+ lastCompassUsedMillis = secondCompass.whenUsedMillis;
+ }
+ case PROCESSING_FIRST_USE:
+ if (lastCompassUsedMillis == 0 && firstCompass != null) {
+ lastCompassUsedMillis = firstCompass.whenUsedMillis;
+ }
+ if (lastCompassUsedMillis != 0 &&
+ (currentTimeMillis.getAsLong() > lastCompassUsedMillis + ALL_PARTICLES_MAX_MILLIS)) {
+ return HandleCompassResult.NO_PARTICLES_FOR_PREVIOUS_COMPASS;
+ }
+
+ return HandleCompassResult.STILL_PROCESSING_PRIOR_USE;
+ case SOLVED:
+ case FAILED_EXCEPTION:
+ case FAILED_TIMEOUT_NO_REPEATING:
+ case FAILED_TIMEOUT_NO_PARTICLES:
+ case FAILED_INTERSECTION_CALCULATION:
+ case FAILED_INVALID_SOLUTION:
+ resetForNewTarget();
+ // falls through, NOT_STARTED is the state when resetForNewTarget returns
+ case NOT_STARTED:
+ if (NUCLEUS_BB.isVecInside(new Vec3Comparable(playerPos.getX(), playerPos.getY(), playerPos.getZ()))) {
+ return HandleCompassResult.PLAYER_IN_NUCLEUS;
+ }
+
+ firstCompass = new Compass(playerPos, currentTimeMillis.getAsLong());
+ seenParticles.clear();
+ solverState = SolverState.PROCESSING_FIRST_USE;
+ possibleTargets = calculatePossibleTargets(playerPos);
+ return HandleCompassResult.SUCCESS;
+ case NEED_SECOND_COMPASS:
+ if (firstCompass.whereUsed.distanceSq(playerPos) < MINIMUM_DISTANCE_SQ_BETWEEN_COMPASSES) {
+ return HandleCompassResult.LOCATION_TOO_CLOSE;
+ }
+
+ HollowsZone firstCompassZone = getZoneForCoords(firstCompass.whereUsed);
+ HollowsZone playerZone = getZoneForCoords(playerPos);
+ if (!possibleTargets.equals(calculatePossibleTargets(playerPos)) ||
+ firstCompassZone != playerZone) {
resetForNewTarget();
- // falls through, NOT_STARTED is the state when resetForNewTarget returns
- case NOT_STARTED:
- if (NUCLEUS_BB.isVecInside(new Vec3Comparable(playerPos.getX(), playerPos.getY(), playerPos.getZ()))) {
- return HandleCompassResult.PLAYER_IN_NUCLEUS;
- }
-
- firstCompass = new Compass(playerPos, currentTimeMillis.getAsLong());
- seenParticles.clear();
- solverState = SolverState.PROCESSING_FIRST_USE;
- possibleTargets = calculatePossibleTargets(playerPos);
- return HandleCompassResult.SUCCESS;
- case NEED_SECOND_COMPASS:
- if (firstCompass.whereUsed.distanceSq(playerPos) < MINIMUM_DISTANCE_SQ_BETWEEN_COMPASSES) {
- return HandleCompassResult.LOCATION_TOO_CLOSE;
- }
-
- HollowsZone firstCompassZone = getZoneForCoords(firstCompass.whereUsed);
- HollowsZone playerZone = getZoneForCoords(playerPos);
- if (!possibleTargets.equals(calculatePossibleTargets(playerPos)) ||
- firstCompassZone != playerZone) {
- resetForNewTarget();
- return HandleCompassResult.POSSIBLE_TARGETS_CHANGED;
- }
-
- secondCompass = new Compass(playerPos, currentTimeMillis.getAsLong());
- solverState = SolverState.PROCESSING_SECOND_USE;
- return HandleCompassResult.SUCCESS;
- }
+ return HandleCompassResult.POSSIBLE_TARGETS_CHANGED;
+ }
+
+ secondCompass = new Compass(playerPos, currentTimeMillis.getAsLong());
+ solverState = SolverState.PROCESSING_SECOND_USE;
+ return HandleCompassResult.SUCCESS;
+ }
- throw new IllegalStateException("Unexpected compass state" );
+ throw new IllegalStateException("Unexpected compass state");
}
/*
@@ -338,7 +360,7 @@ public class CrystalWishingCompassSolver {
// Capture particle troubleshooting info for two minutes starting when the first compass is used.
// This list is reset each time the first compass is used from a NOT_STARTED state.
if (firstCompass != null && !solverState.equals(SolverState.SOLVED) &&
- System.currentTimeMillis() < firstCompass.whenUsedMillis + 2*60*1000) {
+ System.currentTimeMillis() < firstCompass.whenUsedMillis + 2 * 60 * 1000) {
seenParticles.add(new ParticleData(new Vec3Comparable(x, y, z), System.currentTimeMillis()));
}
@@ -376,9 +398,9 @@ public class CrystalWishingCompassSolver {
logDiagnosticData(false);
break;
case NEED_SECOND_COMPASS:
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW +
- "[NEU] Need another position to determine wishing compass target."));
- break;
+ mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW +
+ "[NEU] Need another position to determine wishing compass target."));
+ break;
}
}
} catch (Exception e) {
@@ -389,7 +411,6 @@ public class CrystalWishingCompassSolver {
}
/**
- *
* @param x Particle x coordinate
* @param y Particle y coordinate
* @param z Particle z coordinate
@@ -454,7 +475,8 @@ public class CrystalWishingCompassSolver {
getZoneForCoords(firstCompass.whereUsed),
foundCrystals.getAsCrystalEnumSet(),
possibleTargets,
- solution);
+ solution
+ );
// Adjust the Jungle Temple solution coordinates
if (solutionPossibleTargets.size() == 1 &&
@@ -466,9 +488,8 @@ public class CrystalWishingCompassSolver {
solverState = SolverState.SOLVED;
}
- private boolean isKeyInInventory()
- {
- for (ItemStack item : mc.thePlayer.inventory.mainInventory){
+ private boolean isKeyInInventory() {
+ for (ItemStack item : mc.thePlayer.inventory.mainInventory) {
if (item != null && item.getDisplayName().contains("Jungle Key")) {
return true;
}
@@ -476,12 +497,11 @@ public class CrystalWishingCompassSolver {
return false;
}
- private boolean isKingsScentPresent()
- {
+ private boolean isKingsScentPresent() {
return SBInfo.getInstance().footer.getUnformattedText().contains("King's Scent I");
}
- private EnumSet getFoundCrystals() {
+ private EnumSet getFoundCrystals() {
EnumSet foundCrystals = EnumSet.noneOf(Crystal.class);
NEUConfig.HiddenProfileSpecific perProfileConfig = NotEnoughUpdates.INSTANCE.config.getProfileSpecific();
if (perProfileConfig == null) return foundCrystals;
@@ -523,10 +543,11 @@ public class CrystalWishingCompassSolver {
// | Holdout | Deposits |
// |----------|------------|
static public EnumSet getSolutionTargets(
- HollowsZone compassUsedZone,
- EnumSet foundCrystals,
- EnumSet possibleTargets,
- Vec3Comparable solution) {
+ HollowsZone compassUsedZone,
+ EnumSet foundCrystals,
+ EnumSet possibleTargets,
+ Vec3Comparable solution
+ ) {
EnumSet solutionPossibleTargets;
solutionPossibleTargets = possibleTargets.clone();
@@ -541,28 +562,28 @@ public class CrystalWishingCompassSolver {
// Y=41/74 is the absolute min/max based on structure size if
// the center of the topaz crystal has to be in magma fields.
if (solutionPossibleTargets.contains(CompassTarget.BAL) &&
- solution.yCoord > 75) {
+ solution.yCoord > 75) {
solutionPossibleTargets.remove(CompassTarget.BAL);
}
// Y coordinates are 93-157 from 15 samples.
// Y=83/167 is the absolute min/max based on structure size
if (solutionPossibleTargets.contains(CompassTarget.GOBLIN_KING) &&
- solution.yCoord < 82 || solution.yCoord > 168) {
+ solution.yCoord < 82 || solution.yCoord > 168) {
solutionPossibleTargets.remove(CompassTarget.GOBLIN_KING);
}
// Y coordinates are 129-139 from 10 samples
// Y=126/139 is the absolute min/max based on structure size
if (solutionPossibleTargets.contains(CompassTarget.GOBLIN_QUEEN) &&
- (solution.yCoord < 125 || solution.yCoord > 140)) {
+ (solution.yCoord < 125 || solution.yCoord > 140)) {
solutionPossibleTargets.remove(CompassTarget.GOBLIN_QUEEN);
}
// Y coordinates are 72-80 from 10 samples
// Y=73/80 is the absolute min/max based on structure size
if (solutionPossibleTargets.contains(CompassTarget.JUNGLE_TEMPLE) &&
- (solution.yCoord < 72 || solution.yCoord > 81)) {
+ (solution.yCoord < 72 || solution.yCoord > 81)) {
solutionPossibleTargets.remove(CompassTarget.JUNGLE_TEMPLE);
}
@@ -576,7 +597,7 @@ public class CrystalWishingCompassSolver {
// Y coordinates are 122-129 from 8 samples
// Y=122/129 is the absolute min/max based on structure size
if (solutionPossibleTargets.contains(CompassTarget.PRECURSOR_CITY) &&
- (solution.yCoord < 121 || solution.yCoord > 130)) {
+ (solution.yCoord < 121 || solution.yCoord > 130)) {
solutionPossibleTargets.remove(CompassTarget.PRECURSOR_CITY);
}
@@ -584,26 +605,26 @@ public class CrystalWishingCompassSolver {
// Y=98/100 is the absolute min/max based on structure size,
// but 102 has been seen - possibly with earlier code that rounded up
if (solutionPossibleTargets.contains(CompassTarget.MINES_OF_DIVAN) &&
- (solution.yCoord < 97 || solution.yCoord > 102)) {
+ (solution.yCoord < 97 || solution.yCoord > 102)) {
solutionPossibleTargets.remove(CompassTarget.MINES_OF_DIVAN);
}
// Now filter by structure offset
if (solutionPossibleTargets.contains(CompassTarget.GOBLIN_KING) &&
(solution.xCoord > GOBLIN_HOLDOUT_BB.maxX + GOBLIN_KING_BB.maxX ||
- solution.zCoord < GOBLIN_HOLDOUT_BB.minZ - GOBLIN_KING_BB.maxZ)) {
+ solution.zCoord < GOBLIN_HOLDOUT_BB.minZ - GOBLIN_KING_BB.maxZ)) {
solutionPossibleTargets.remove(CompassTarget.GOBLIN_KING);
}
if (solutionPossibleTargets.contains(CompassTarget.GOBLIN_QUEEN) &&
(solution.xCoord > GOBLIN_HOLDOUT_BB.maxX + GOBLIN_QUEEN_BB.maxX ||
- solution.zCoord < GOBLIN_HOLDOUT_BB.minZ - GOBLIN_QUEEN_BB.maxZ)) {
+ solution.zCoord < GOBLIN_HOLDOUT_BB.minZ - GOBLIN_QUEEN_BB.maxZ)) {
solutionPossibleTargets.remove(CompassTarget.GOBLIN_QUEEN);
}
if (solutionPossibleTargets.contains(CompassTarget.JUNGLE_TEMPLE) &&
(solution.xCoord > JUNGLE_BB.maxX + JUNGLE_TEMPLE_BB.maxX ||
- solution.zCoord > JUNGLE_BB.maxZ + JUNGLE_TEMPLE_BB.maxZ)) {
+ solution.zCoord > JUNGLE_BB.maxZ + JUNGLE_TEMPLE_BB.maxZ)) {
solutionPossibleTargets.remove(CompassTarget.JUNGLE_TEMPLE);
}
@@ -677,38 +698,54 @@ public class CrystalWishingCompassSolver {
private String getFriendlyNameForCompassTarget(CompassTarget compassTarget) {
switch (compassTarget) {
- case BAL: return EnumChatFormatting.RED + "Bal";
- case ODAWA: return EnumChatFormatting.GREEN + "Odawa";
- case JUNGLE_TEMPLE: return EnumChatFormatting.AQUA + "the " +
- EnumChatFormatting.GREEN + "Jungle Temple";
- case GOBLIN_KING: return EnumChatFormatting.GOLD + "King Yolkar";
- case GOBLIN_QUEEN: return EnumChatFormatting.AQUA + "the " +
- EnumChatFormatting.YELLOW + "Goblin Queen";
- case PRECURSOR_CITY: return EnumChatFormatting.AQUA + "the " +
- EnumChatFormatting.WHITE + "Precursor City";
- case MINES_OF_DIVAN: return EnumChatFormatting.AQUA + "the " +
- EnumChatFormatting.BLUE + "Mines of Divan";
- default: return EnumChatFormatting.WHITE + "an undetermined location";
+ case BAL:
+ return EnumChatFormatting.RED + "Bal";
+ case ODAWA:
+ return EnumChatFormatting.GREEN + "Odawa";
+ case JUNGLE_TEMPLE:
+ return EnumChatFormatting.AQUA + "the " +
+ EnumChatFormatting.GREEN + "Jungle Temple";
+ case GOBLIN_KING:
+ return EnumChatFormatting.GOLD + "King Yolkar";
+ case GOBLIN_QUEEN:
+ return EnumChatFormatting.AQUA + "the " +
+ EnumChatFormatting.YELLOW + "Goblin Queen";
+ case PRECURSOR_CITY:
+ return EnumChatFormatting.AQUA + "the " +
+ EnumChatFormatting.WHITE + "Precursor City";
+ case MINES_OF_DIVAN:
+ return EnumChatFormatting.AQUA + "the " +
+ EnumChatFormatting.BLUE + "Mines of Divan";
+ default:
+ return EnumChatFormatting.WHITE + "an undetermined location";
}
}
private String getNameForCompassTarget(CompassTarget compassTarget) {
boolean useSkytilsNames = (NotEnoughUpdates.INSTANCE.config.mining.wishingCompassWaypointNames == 1);
switch (compassTarget) {
- case BAL: return useSkytilsNames ? "internal_bal" : "Bal";
- case ODAWA: return "Odawa";
- case JUNGLE_TEMPLE: return useSkytilsNames ? "internal_temple" : "Temple";
- case GOBLIN_KING: return useSkytilsNames ? "internal_king" : "King";
- case GOBLIN_QUEEN: return useSkytilsNames ? "internal_den" : "Queen";
- case PRECURSOR_CITY: return useSkytilsNames ? "internal_city" : "City";
- case MINES_OF_DIVAN: return useSkytilsNames ? "internal_mines" : "Mines";
- default: return "WishingTarget";
+ case BAL:
+ return useSkytilsNames ? "internal_bal" : "Bal";
+ case ODAWA:
+ return "Odawa";
+ case JUNGLE_TEMPLE:
+ return useSkytilsNames ? "internal_temple" : "Temple";
+ case GOBLIN_KING:
+ return useSkytilsNames ? "internal_king" : "King";
+ case GOBLIN_QUEEN:
+ return useSkytilsNames ? "internal_den" : "Queen";
+ case PRECURSOR_CITY:
+ return useSkytilsNames ? "internal_city" : "City";
+ case MINES_OF_DIVAN:
+ return useSkytilsNames ? "internal_mines" : "Mines";
+ default:
+ return "WishingTarget";
}
}
private String getSolutionCoordsText() {
return solution == null ? "" :
- String.format("%.0f %.0f %.0f", solution.xCoord, solution.yCoord, solution.zCoord);
+ String.format("%.0f %.0f %.0f", solution.xCoord, solution.yCoord, solution.zCoord);
}
private String getWishingCompassDestinationsMessage() {
@@ -759,21 +796,23 @@ public class CrystalWishingCompassSolver {
"WishingTarget";
String skytilsCommand = String.format("/sthw add %s %s", getSolutionCoordsText(), targetNameForSkytils);
if (NotEnoughUpdates.INSTANCE.config.mining.wishingCompassAutocreateKnownWaypoints &&
- solutionPossibleTargets.size() == 1) {
+ solutionPossibleTargets.size() == 1) {
mc.thePlayer.addChatMessage(new ChatComponentText(destinationMessage));
int commandResult = ClientCommandHandler.instance.executeCommand(mc.thePlayer, skytilsCommand);
- if (commandResult == 1)
- {
+ if (commandResult == 1) {
return;
}
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "[NEU] Failed to automatically run /sthw"));
+ mc.thePlayer.addChatMessage(new ChatComponentText(
+ EnumChatFormatting.RED + "[NEU] Failed to automatically run /sthw"));
}
destinationMessage += EnumChatFormatting.YELLOW + " [Add Skytils Waypoint]";
ChatComponentText chatMessage = new ChatComponentText(destinationMessage);
- chatMessage.setChatStyle(Utils.createClickStyle(ClickEvent.Action.RUN_COMMAND,
- skytilsCommand,
- EnumChatFormatting.YELLOW + "Set waypoint for wishing target"));
+ chatMessage.setChatStyle(Utils.createClickStyle(
+ ClickEvent.Action.RUN_COMMAND,
+ skytilsCommand,
+ EnumChatFormatting.YELLOW + "Set waypoint for wishing target"
+ ));
mc.thePlayer.addChatMessage(chatMessage);
}
@@ -878,8 +917,7 @@ public class CrystalWishingCompassSolver {
return;
}
- if (!NotEnoughUpdates.INSTANCE.config.mining.wishingCompassSolver)
- {
+ if (!NotEnoughUpdates.INSTANCE.config.mining.wishingCompassSolver) {
mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
"[NEU] Wishing Compass Solver is not enabled."));
return;
@@ -951,8 +989,8 @@ public class CrystalWishingCompassSolver {
public void processParticle(double x, double y, double z, long particleTimeMillis) {
if (compassState == CompassState.FAILED_TIMEOUT_NO_REPEATING ||
- compassState == CompassState.FAILED_TIMEOUT_NO_PARTICLES ||
- compassState == CompassState.COMPLETED) {
+ compassState == CompassState.FAILED_TIMEOUT_NO_PARTICLES ||
+ compassState == CompassState.COMPLETED) {
throw new UnsupportedOperationException("processParticle should not be called in a failed or completed state");
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CustomItemEffects.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CustomItemEffects.java
index e621cf78..ca9a92cb 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CustomItemEffects.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CustomItemEffects.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
@@ -11,7 +30,11 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.multiplayer.WorldClient;
-import net.minecraft.client.renderer.*;
+import net.minecraft.client.renderer.BlockRendererDispatcher;
+import net.minecraft.client.renderer.EntityRenderer;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.texture.TextureUtil;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
@@ -24,7 +47,13 @@ import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompressedStreamTools;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
-import net.minecraft.util.*;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.util.Vec3;
+import net.minecraft.util.Vec3i;
import net.minecraftforge.client.event.DrawBlockHighlightEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
@@ -36,8 +65,14 @@ import org.lwjgl.util.vector.Vector3f;
import java.awt.*;
import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
import java.util.List;
-import java.util.*;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CustomSkulls.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CustomSkulls.java
index 1157e73a..95ec0f7a 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CustomSkulls.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CustomSkulls.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import com.google.common.collect.Maps;
@@ -14,8 +33,17 @@ import net.minecraft.client.model.ModelSkeletonHead;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.WorldRenderer;
-import net.minecraft.client.renderer.block.model.*;
-import net.minecraft.client.renderer.texture.*;
+import net.minecraft.client.renderer.block.model.BakedQuad;
+import net.minecraft.client.renderer.block.model.BlockPart;
+import net.minecraft.client.renderer.block.model.BlockPartFace;
+import net.minecraft.client.renderer.block.model.FaceBakery;
+import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
+import net.minecraft.client.renderer.block.model.ModelBlock;
+import net.minecraft.client.renderer.texture.AbstractTexture;
+import net.minecraft.client.renderer.texture.IIconCreator;
+import net.minecraft.client.renderer.texture.TextureAtlasSprite;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.client.renderer.texture.TextureUtil;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.client.resources.IResourceManagerReloadListener;
@@ -31,7 +59,11 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
-import java.util.*;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
public class CustomSkulls implements IResourceManagerReloadListener {
private static final CustomSkulls INSTANCE = new CustomSkulls();
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/DamageCommas.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/DamageCommas.java
index 9c93b9c5..127edcde 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/DamageCommas.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/DamageCommas.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/DwarvenMinesWaypoints.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/DwarvenMinesWaypoints.java
index f7f9003c..c1c7dca1 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/DwarvenMinesWaypoints.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/DwarvenMinesWaypoints.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/EnchantingSolvers.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/EnchantingSolvers.java
index 83a68915..aaaa1e24 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/EnchantingSolvers.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/EnchantingSolvers.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
@@ -19,7 +38,11 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import org.lwjgl.input.Keyboard;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
public class EnchantingSolvers {
private static SolverType currentSolver = SolverType.NONE;
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 39ac1b22..a3717f32 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FairySouls.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FairySouls.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import com.google.common.reflect.TypeToken;
@@ -131,13 +150,14 @@ public class FairySouls {
int g2 = (color2 >> 8) & 0xff;
int b2 = color2 & 0xff;
- int r3 = r1 + (int)Math.round(factor * (r2-r1));
- int g3 = g1 + (int)Math.round(factor * (g2-g1));
- int b3 = b1 + (int)Math.round(factor * (b2-b1));
+ int r3 = r1 + (int) Math.round(factor * (r2 - r1));
+ int g3 = g1 + (int) Math.round(factor * (g2 - g1));
+ int b3 = b1 + (int) Math.round(factor * (b2 - b1));
return (r3 & 0xff) << 16 |
(g3 & 0xff) << 8 |
- (b3 & 0xff); }
+ (b3 & 0xff);
+ }
private double normalize(double value, double min, double max) {
return ((value - min) / (max - min));
@@ -151,7 +171,7 @@ public class FairySouls {
int closeColor = 0x772991; // 0xa839ce
int farColor = 0xCEB4D1;
- double farSoulDistSq = lastPlayerPos.distanceSq(closestMissingSouls.get(closestMissingSouls.size()-1));
+ double farSoulDistSq = lastPlayerPos.distanceSq(closestMissingSouls.get(closestMissingSouls.size() - 1));
for (BlockPos currentSoul : closestMissingSouls) {
double currentDistSq = lastPlayerPos.distanceSq(currentSoul);
double factor = normalize(currentDistSq, 0.0, farSoulDistSq);
@@ -405,7 +425,8 @@ public class FairySouls {
case "on":
case "enable":
if (!FairySouls.instance.trackSouls) {
- print(EnumChatFormatting.RED + "Fairy soul tracking is off, enable it using /neu before using this command");
+ print(
+ EnumChatFormatting.RED + "Fairy soul tracking is off, enable it using /neu before using this command");
return;
}
print(EnumChatFormatting.DARK_PURPLE + "Enabled fairy soul waypoints");
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FishingHelper.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FishingHelper.java
index 65092752..26e25a11 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FishingHelper.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FishingHelper.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/ItemCooldowns.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/ItemCooldowns.java
index 96522d34..f2b13abc 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/ItemCooldowns.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/ItemCooldowns.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/ItemCustomizeManager.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/ItemCustomizeManager.java
index 655364ef..e1b9d567 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/ItemCustomizeManager.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/ItemCustomizeManager.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import com.google.gson.Gson;
@@ -18,7 +37,13 @@ import org.lwjgl.opengl.GL14;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.function.Consumer;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/ItemRarityHalo.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/ItemRarityHalo.java
index 88c7261c..79dd18f1 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/ItemRarityHalo.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/ItemRarityHalo.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
@@ -5,7 +24,11 @@ import io.github.moulberry.notenoughupdates.util.NEUResourceManager;
import io.github.moulberry.notenoughupdates.util.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.ScaledResolution;
-import net.minecraft.client.renderer.*;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.client.renderer.OpenGlHelper;
+import net.minecraft.client.renderer.RenderHelper;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.client.renderer.texture.TextureUtil;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/MiningStuff.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/MiningStuff.java
index b56737e7..12e0301b 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/MiningStuff.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/MiningStuff.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/NPCRetexturing.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/NPCRetexturing.java
index 05d75c26..ad0dd66d 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/NPCRetexturing.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/NPCRetexturing.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import com.google.gson.Gson;
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 3419b8c4..9cc872b7 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/Navigation.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/Navigation.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import com.google.gson.JsonElement;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/NullzeeSphere.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/NullzeeSphere.java
index 927111b3..6302343e 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/NullzeeSphere.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/NullzeeSphere.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import io.github.moulberry.notenoughupdates.util.ReverseWorldRenderer;
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 056cf0a4..4cf076d8 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import com.google.common.collect.Lists;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SlotLocking.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SlotLocking.java
index 9292c0d3..3955c363 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SlotLocking.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SlotLocking.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import com.google.gson.Gson;
@@ -30,7 +49,13 @@ import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.vector.Vector2f;
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.function.Consumer;
@@ -546,8 +571,8 @@ public class SlotLocking {
);
}
} else if (pairingSlot != null && lockKeyHeld && slot.getSlotIndex() < 8) {
- int x1 = ((AccessorGuiContainer)container).getGuiLeft() + pairingSlot.xDisplayPosition;
- int y1 = ((AccessorGuiContainer)container).getGuiTop() + pairingSlot.yDisplayPosition;
+ int x1 = ((AccessorGuiContainer) container).getGuiLeft() + pairingSlot.xDisplayPosition;
+ int y1 = ((AccessorGuiContainer) container).getGuiTop() + pairingSlot.yDisplayPosition;
if (mouseX <= x1 || mouseX >= x1 + 16 ||
mouseY <= y1 || mouseY >= y1 + 16) {
@@ -635,8 +660,8 @@ public class SlotLocking {
int mouseX = Mouse.getX() * scaledWidth / Minecraft.getMinecraft().displayWidth;
int mouseY = scaledHeight - Mouse.getY() * scaledHeight / Minecraft.getMinecraft().displayHeight - 1;
- int x1 = ((AccessorGuiContainer)container).getGuiLeft() + pairingSlot.xDisplayPosition;
- int y1 = ((AccessorGuiContainer)container).getGuiTop() + pairingSlot.yDisplayPosition;
+ int x1 = ((AccessorGuiContainer) container).getGuiLeft() + pairingSlot.xDisplayPosition;
+ int y1 = ((AccessorGuiContainer) container).getGuiTop() + pairingSlot.yDisplayPosition;
if (mouseX <= x1 || mouseX >= x1 + 16 ||
mouseY <= y1 || mouseY >= y1 + 16) {
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/StorageManager.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/StorageManager.java
index 94aee789..680637f2 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/StorageManager.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/StorageManager.java
@@ -1,6 +1,35 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
-import com.google.gson.*;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonPrimitive;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import io.github.moulberry.notenoughupdates.miscgui.StorageOverlay;
import io.github.moulberry.notenoughupdates.util.SBInfo;
@@ -13,14 +42,32 @@ import net.minecraft.inventory.ContainerChest;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.*;
+import net.minecraft.nbt.JsonToNBT;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagByte;
+import net.minecraft.nbt.NBTTagByteArray;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagDouble;
+import net.minecraft.nbt.NBTTagFloat;
+import net.minecraft.nbt.NBTTagInt;
+import net.minecraft.nbt.NBTTagIntArray;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.nbt.NBTTagLong;
+import net.minecraft.nbt.NBTTagShort;
+import net.minecraft.nbt.NBTTagString;
import net.minecraft.network.play.client.C0EPacketClickWindow;
import net.minecraft.network.play.server.S2DPacketOpenWindow;
import net.minecraft.network.play.server.S2EPacketCloseWindow;
import net.minecraft.network.play.server.S2FPacketSetSlot;
import net.minecraft.network.play.server.S30PacketWindowItems;
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/StreamerMode.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/StreamerMode.java
index 064f41ca..a2951e56 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/StreamerMode.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/StreamerMode.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import io.github.moulberry.notenoughupdates.util.Utils;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SunTzu.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SunTzu.java
index 27cf42ac..9c2549b8 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SunTzu.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SunTzu.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures;
import io.github.moulberry.notenoughupdates.util.Utils;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/CrystalHollowsTextures.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/CrystalHollowsTextures.java
index 36858276..7d23d922 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/CrystalHollowsTextures.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/CrystalHollowsTextures.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures.customblockzones;
import net.minecraft.util.BlockPos;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/CustomBiomes.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/CustomBiomes.java
index 9a6f9cac..48a01187 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/CustomBiomes.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/CustomBiomes.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures.customblockzones;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/CustomBlockSounds.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/CustomBlockSounds.java
index dec011d3..2a3e9ec4 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/CustomBlockSounds.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/CustomBlockSounds.java
@@ -1,8 +1,26 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures.customblockzones;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
-import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.ISound;
import net.minecraft.client.audio.PositionedSoundRecord;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/DwarvenMinesTextures.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/DwarvenMinesTextures.java
index faf7eabe..1c6acc1d 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/DwarvenMinesTextures.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/DwarvenMinesTextures.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures.customblockzones;
import com.google.gson.JsonArray;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/IslandZoneSubdivider.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/IslandZoneSubdivider.java
index 8b00bc85..75ff566f 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/IslandZoneSubdivider.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/IslandZoneSubdivider.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures.customblockzones;
import net.minecraft.util.BlockPos;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/LocationChangeEvent.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/LocationChangeEvent.java
index c6f5e9c0..5a87af11 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/LocationChangeEvent.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/LocationChangeEvent.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures.customblockzones;
import net.minecraftforge.fml.common.eventhandler.Event;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/SpecialBlockZone.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/SpecialBlockZone.java
index f4e8f1fc..e88e2c25 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/SpecialBlockZone.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/customblockzones/SpecialBlockZone.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures.customblockzones;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/AgeModifier.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/AgeModifier.java
index 5884512f..963fa793 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/AgeModifier.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/AgeModifier.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures.entityviewer;
import com.google.gson.JsonObject;
@@ -9,22 +28,22 @@ import net.minecraft.entity.item.EntityArmorStand;
import net.minecraft.entity.monster.EntityZombie;
public class AgeModifier extends EntityViewerModifier {
- @Override
- public EntityLivingBase applyModifier(EntityLivingBase base, JsonObject info) {
- boolean baby = info.has("baby") && info.get("baby").getAsBoolean();
- if (base instanceof EntityAgeable) {
- ((AccessorEntityAgeable) base).setGrowingAgeDirect(baby ? -1 : 1);
- return base;
- }
- if (base instanceof EntityZombie) {
- ((EntityZombie) base).setChild(baby);
- return base;
- }
- if (base instanceof EntityArmorStand) {
- ((AccessorEntityArmorStand) base).setSmallDirect(baby);
- return base;
- }
- System.out.println("Cannot apply age to a non ageable entity: " + base);
- return null;
- }
+ @Override
+ public EntityLivingBase applyModifier(EntityLivingBase base, JsonObject info) {
+ boolean baby = info.has("baby") && info.get("baby").getAsBoolean();
+ if (base instanceof EntityAgeable) {
+ ((AccessorEntityAgeable) base).setGrowingAgeDirect(baby ? -1 : 1);
+ return base;
+ }
+ if (base instanceof EntityZombie) {
+ ((EntityZombie) base).setChild(baby);
+ return base;
+ }
+ if (base instanceof EntityArmorStand) {
+ ((AccessorEntityArmorStand) base).setSmallDirect(baby);
+ return base;
+ }
+ System.out.println("Cannot apply age to a non ageable entity: " + base);
+ return null;
+ }
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/ChargedModifier.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/ChargedModifier.java
index 17dce66d..5f452132 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/ChargedModifier.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/ChargedModifier.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures.entityviewer;
import com.google.gson.JsonObject;
@@ -6,12 +25,12 @@ import net.minecraft.entity.monster.EntityCreeper;
public class ChargedModifier extends EntityViewerModifier {
- @Override
- public EntityLivingBase applyModifier(EntityLivingBase base, JsonObject info) {
- if (base instanceof EntityCreeper) {
- base.getDataWatcher().updateObject(17, (byte) 1);
- return base;
- }
- return null;
- }
+ @Override
+ public EntityLivingBase applyModifier(EntityLivingBase base, JsonObject info) {
+ if (base instanceof EntityCreeper) {
+ base.getDataWatcher().updateObject(17, (byte) 1);
+ return base;
+ }
+ return null;
+ }
}
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EntityViewer.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EntityViewer.java
index 78d035ac..367d62d3 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EntityViewer.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EntityViewer.java
@@ -1,3 +1,22 @@
+/*
+ * 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 .
+ */
+
package io.github.moulberry.notenoughupdates.miscfeatures.entityviewer;
import com.google.gson.Gson;
@@ -14,166 +33,213 @@ import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.boss.EntityDragon;
import net.minecraft.entity.boss.EntityWither;
import net.minecraft.entity.item.EntityArmorStand;
-import net.minecraft.entity.monster.*;
-import net.minecraft.entity.passive.*;
+import net.minecraft.entity.monster.EntityBlaze;
+import net.minecraft.entity.monster.EntityCaveSpider;
+import net.minecraft.entity.monster.EntityCreeper;
+import net.minecraft.entity.monster.EntityEnderman;
+import net.minecraft.entity.monster.EntityEndermite;
+import net.minecraft.entity.monster.EntityGhast;
+import net.minecraft.entity.monster.EntityGuardian;
+import net.minecraft.entity.monster.EntityIronGolem;
+import net.minecraft.entity.monster.EntityMagmaCube;
+import net.minecraft.entity.monster.EntityPigZombie;
+import net.minecraft.entity.monster.EntitySilverfish;
+import net.minecraft.entity.monster.EntitySkeleton;
+import net.minecraft.entity.monster.EntitySlime;
+import net.minecraft.entity.monster.EntitySnowman;
+import net.minecraft.entity.monster.EntitySpider;
+import net.minecraft.entity.monster.EntityWitch;
+import net.minecraft.entity.monster.EntityZombie;
+import net.minecraft.entity.passive.EntityBat;
+import net.minecraft.entity.passive.EntityChicken;
+import net.minecraft.entity.passive.EntityCow;
+import net.minecraft.entity.passive.EntityHorse;
+import net.minecraft.entity.passive.EntityMooshroom;
+import net.minecraft.entity.passive.EntityOcelot;
+import net.minecraft.entity.passive.EntityPig;
+import net.minecraft.entity.passive.EntityRabbit;
+import net.minecraft.entity.passive.EntitySheep;
+import net.minecraft.entity.passive.EntitySquid;
+import net.minecraft.entity.passive.EntityVillager;
+import net.minecraft.entity.passive.EntityWolf;
import net.minecraft.util.ResourceLocation;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.StandardCharsets;
-import java.util.*;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
public class EntityViewer extends GuiScreen {
- public static Map> validEntities = new HashMap>() {{
- put("Zombie", () -> new EntityZombie(null));
- put("Chicken", () -> new EntityChicken(null));
- put("Slime", () -> new EntitySlime(null));
- put("Wolf", () -> new EntityWolf(null));
- put("Skeleton", () -> new EntitySkeleton(null));
- put("Creeper", () -> new EntityCreeper(null));
- put("Ocelot", () -> new EntityOcelot(null));
- put("Blaze", () -> new EntityBlaze(null));
- put("Rabbit", () -> new EntityRabbit(null));
- put("Sheep", () -> new EntitySheep(null));
- put("Horse", () -> new EntityHorse(null));
- put("Eisengolem", () -> new EntityIronGolem(null));
- put("Silverfish", () -> new EntitySilverfish(null));
- put("Witch", () -> new EntityWitch(null));
- put("Endermite", () -> new EntityEndermite(null));
- put("Snowman", () -> new EntitySnowman(null));
- put("Villager", () -> new EntityVillager(null));
- put("Guardian", () -> new EntityGuardian(null));
- put("ArmorStand", () -> new EntityArmorStand(null));
- put("Squid", () -> new EntitySquid(null));
- put("Bat", () -> new EntityBat(null));
- put("Spider", () -> new EntitySpider(null));
- put("CaveSpider", () -> new EntityCaveSpider(null));
- put("Pigman", () -> new EntityPigZombie(null));
- put("Ghast", () -> new EntityGhast(null));
- put("MagmaCube", () -> new EntityMagmaCube(null));
- put("Wither", () -> new EntityWither(null));
- put("Enderman", () -> new EntityEnderman(null));
- put("Mooshroom", ()-> new EntityMooshroom(null));
- put("WitherSkeleton", () -> {
- EntitySkeleton skeleton = new EntitySkeleton(null);
- skeleton.setSkeletonType(1);
- return skeleton;
- });
- put("Cow", () -> new EntityCow(null));
- put("Dragon", ()-> new EntityDragon(null));
- put("Player", () -> new GUIClientPlayer());
- put("Pig", () -> new EntityPig(null));
- }};
-
- public static Map