From 73fad7064fb47d9d79ccdb3bab5988df1b9eea6f Mon Sep 17 00:00:00 2001 From: CraftyOldMiner <85420839+CraftyOldMiner@users.noreply.github.com> Date: Mon, 7 Mar 2022 21:44:17 -0600 Subject: Wishing Compass Solver, Metal Detector Solver improvements, add /neudiag, other misc changes (#90) --- Update Notes/2.1.md | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 1a120dfb..f8130d92 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -13,6 +13,8 @@ - [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 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 ### **Minor Changes:** - Add built-in recipes for forge crafts - nea89 - Add Stranded Villager Trades to the item list - nea89 @@ -56,6 +58,8 @@ - Added custom sounds for crystal hollow gemstones - nea89 - Added custom biomes for crystal hollow areas - nopo - Added a config option to hide the reforge stats for Legendary items from Hypixel on reforge stones - Lulonaut +- Crystal Hollows crystal states are now updated when the Heart of the Mountain menu is opened - CraftyOldMiner +- Added /neudiag command to enable/disable debug logging and dump diagnostic data - CraftyOldMiner ### **Bug Fixes** - Fix wiki pages freezing the entire game - nea89 - Made titanium overlay and waypoints work with dwarven overlay off @@ -85,5 +89,6 @@ - Changed custom_enchant_gui.png to remove top right button - Added 4 new textures for the on/off switches in /neu - Code Cleanup - IRONM00N +- Renamed Keebler408 to CraftyOldMiner ### **Previous change log** https://github.com/NotEnoughUpdates/NotEnoughUpdates/blob/master/Update%20Notes/2.0-Pre31-Release.md -- cgit 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) --- Update Notes/2.1.md | 15 +- .../moulberry/notenoughupdates/NEUOverlay.java | 3 +- .../commands/profile/CataCommand.java | 2 +- .../annotations/ConfigEditorDraggableList.java | 1 + .../config/gui/GuiOptionEditorDraggableList.java | 25 +- .../core/config/struct/ConfigProcessor.java | 2 +- .../notenoughupdates/dungeons/DungeonMap.java | 41 +- .../notenoughupdates/dungeons/DungeonWin.java | 7 +- .../miscfeatures/AuctionBINWarning.java | 48 +- .../notenoughupdates/options/NEUConfig.java | 16 +- .../options/seperateSections/AHTweaks.java | 17 +- .../options/seperateSections/Misc.java | 10 +- .../options/seperateSections/ProfileViewer.java | 63 + .../notenoughupdates/overlays/FarmingOverlay.java | 15 +- .../notenoughupdates/profileviewer/BingoPage.java | 309 +++++ .../profileviewer/GuiProfileViewer.java | 1343 ++++++++++++-------- .../profileviewer/ProfileViewer.java | 377 +++--- .../notenoughupdates/util/HypixelApi.java | 9 +- .../moulberry/notenoughupdates/util/SBInfo.java | 2 +- .../notenoughupdates/invbuttons/presets.json | 3 +- .../assets/notenoughupdates/pv_bingo_tab.png | Bin 0 -> 2635 bytes 21 files changed, 1487 insertions(+), 821 deletions(-) create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BingoPage.java create mode 100644 src/main/resources/assets/notenoughupdates/pv_bingo_tab.png (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index f8130d92..9c9fc310 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -1,6 +1,6 @@ # These are the change notes for NEU 2.1 REL -### **Major Changes** +### **Major Changes:** - Added mining skill overlay - Added fishing skill overlay - Added combat skill overlay @@ -13,6 +13,7 @@ - [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 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 ### **Minor Changes:** @@ -58,9 +59,12 @@ - Added custom sounds for crystal hollow gemstones - nea89 - Added custom biomes for crystal hollow areas - nopo - Added a config option to hide the reforge stats for Legendary items from Hypixel on reforge stones - Lulonaut +- Added an option to alert you if you put something for too much onto ah (default 50%) +- Lowest bin alert triggers if lowest bin isnt found +- Made the order of the tabs in /pv changeable - Lulonaut - Crystal Hollows crystal states are now updated when the Heart of the Mountain menu is opened - CraftyOldMiner - Added /neudiag command to enable/disable debug logging and dump diagnostic data - CraftyOldMiner -### **Bug Fixes** +### **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) @@ -82,7 +86,12 @@ - Fixed experiment timer in todo overlay - efefury - Fixed replace click events with /pv working in other modes - Fixed /neuec presets not applying the strikethrough attribute - Lulonaut -### **Other** +- Fixed what hypxiel broke in dungeons +- Fixed the dungeon map on f1 - Minikloon +- 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 +### **Other:** - New icons was added in storage_icons.png - Moved the help icon in /neucustomize over a little - Added dg partner cape diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java index d9566f0d..5ad02f94 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java @@ -1361,7 +1361,8 @@ public class NEUOverlay extends Gui { "DUNGEON SWORD", "DUNGEON BOW", "DRILL", - "GAUNTLET" + "GAUNTLET", + "LONGSWORD" ) >= 0; } else if (getSortMode() == SORT_MODE_ARMOR) { return checkItemType( 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 09253e50..ccf72d73 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 @@ -11,7 +11,7 @@ public class CataCommand extends ViewProfileCommand { @Override public void processCommand(ICommandSender sender, String[] args) { - GuiProfileViewer.currentPage = GuiProfileViewer.ProfileViewerPage.DUNG; + GuiProfileViewer.currentPage = GuiProfileViewer.ProfileViewerPage.DUNGEON; super.processCommand(sender, args); } } 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 e171e0ae..5063d543 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 @@ -9,4 +9,5 @@ import java.lang.annotation.Target; @Target(ElementType.FIELD) public @interface ConfigEditorDraggableList { String[] exampleText(); + boolean allowRemovingElements() default true; } 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 08a1024f..df373dbf 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 @@ -24,6 +24,7 @@ public class GuiOptionEditorDraggableList extends GuiOptionEditor { private static final ResourceLocation DELETE = new ResourceLocation("notenoughupdates:core/delete.png"); private final String[] exampleText; + private final boolean allowRemovingElements; private final List activeText; private int currentDragging = -1; private int dragStartIndex = -1; @@ -35,9 +36,14 @@ public class GuiOptionEditorDraggableList extends GuiOptionEditor { private boolean dropdownOpen = false; - public GuiOptionEditorDraggableList(ConfigProcessor.ProcessedOption option, String[] exampleText) { + public GuiOptionEditorDraggableList( + ConfigProcessor.ProcessedOption option, + String[] exampleText, + boolean allowRemovingElements + ) { super(option); + this.allowRemovingElements = allowRemovingElements; this.exampleText = exampleText; this.activeText = (List) option.get(); } @@ -77,8 +83,11 @@ public class GuiOptionEditorDraggableList extends GuiOptionEditor { float greenBlue = LerpUtils.clampZeroOne((250 + trashHoverTime - currentTime) / 250f); GlStateManager.color(1, greenBlue, greenBlue, 1); } - Minecraft.getMinecraft().getTextureManager().bindTexture(DELETE); - Utils.drawTexturedRect(x + width / 6 + 27, y + 45 - 7 - 13, 11, 14, GL11.GL_NEAREST); + + if (allowRemovingElements) { + Minecraft.getMinecraft().getTextureManager().bindTexture(DELETE); + Utils.drawTexturedRect(x + width / 6 + 27, y + 45 - 7 - 13, 11, 14, GL11.GL_NEAREST); + } Gui.drawRect(x + 5, y + 45, x + width - 5, y + height - 5, 0xffdddddd); Gui.drawRect(x + 6, y + 46, x + width - 6, y + height - 6, 0xff000000); @@ -206,7 +215,9 @@ public class GuiOptionEditorDraggableList extends GuiOptionEditor { dragStartIndex >= 0 && Mouse.getEventButton() == 0 && mouseX >= x + width / 6 + 27 - 3 && mouseX <= x + width / 6 + 27 + 11 + 3 && mouseY >= y + 45 - 7 - 13 - 3 && mouseY <= y + 45 - 7 - 13 + 14 + 3) { - activeText.remove(dragStartIndex); + if (allowRemovingElements) { + activeText.remove(dragStartIndex); + } currentDragging = -1; dragStartIndex = -1; return false; @@ -215,13 +226,13 @@ public class GuiOptionEditorDraggableList extends GuiOptionEditor { if (!Mouse.isButtonDown(0) || dropdownOpen) { currentDragging = -1; dragStartIndex = -1; - if (trashHoverTime > 0) trashHoverTime = -System.currentTimeMillis(); + if (trashHoverTime > 0 && allowRemovingElements) trashHoverTime = -System.currentTimeMillis(); } else if (currentDragging >= 0 && mouseX >= x + width / 6 + 27 - 3 && mouseX <= x + width / 6 + 27 + 11 + 3 && mouseY >= y + 45 - 7 - 13 - 3 && mouseY <= y + 45 - 7 - 13 + 14 + 3) { - if (trashHoverTime < 0) trashHoverTime = System.currentTimeMillis(); + if (trashHoverTime < 0 && allowRemovingElements) trashHoverTime = System.currentTimeMillis(); } else { - if (trashHoverTime > 0) trashHoverTime = -System.currentTimeMillis(); + if (trashHoverTime > 0 && allowRemovingElements) trashHoverTime = -System.currentTimeMillis(); } if (Mouse.getEventButtonState()) { 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 b5aa6ba8..3eb8a2d1 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 @@ -147,7 +147,7 @@ public class ConfigProcessor { if (optionField.isAnnotationPresent(ConfigEditorDraggableList.class)) { ConfigEditorDraggableList configEditorAnnotation = optionField.getAnnotation(ConfigEditorDraggableList.class); - editor = new GuiOptionEditorDraggableList(option, configEditorAnnotation.exampleText()); + editor = new GuiOptionEditorDraggableList(option, configEditorAnnotation.exampleText(), configEditorAnnotation.allowRemovingElements()); } } if (optionType.isAssignableFrom(String.class)) { 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 592f5b19..e132d287 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonMap.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonMap.java @@ -578,8 +578,8 @@ public class DungeonMap { GlStateManager.rotate(-rotation + 180, 0, 0, 1); if (NotEnoughUpdates.INSTANCE.config.dungeonMap.dmCenterPlayer && playerPos != null) { - float x = playerPos.getRenderX(); - float y = playerPos.getRenderY(); + float x = playerPos.getRenderX(0); + float y = playerPos.getRenderY(0); x -= minRoomX * (renderRoomSize + renderConnSize); y -= minRoomY * (renderRoomSize + renderConnSize); @@ -648,8 +648,8 @@ public class DungeonMap { for (Map.Entry entry : playerMarkerMapPositions.entrySet()) { String name = entry.getKey(); MapPosition pos = entry.getValue(); - float x = pos.getRenderX(); - float y = pos.getRenderY(); + float x = pos.getRenderX(0); + float y = pos.getRenderY(0); float angle = pos.rotation; boolean doInterp = NotEnoughUpdates.INSTANCE.config.dungeonMap.dmPlayerInterp; @@ -657,19 +657,8 @@ public class DungeonMap { MapPosition entityPos = playerEntityMapPositions.get(name); angle = entityPos.rotation; - float deltaX = entityPos.getRenderX() - pos.getRenderX(); - float deltaY = entityPos.getRenderY() - pos.getRenderY(); - - /*if(deltaX > (renderRoomSize + renderConnSize)/2) { - deltaX -= (renderRoomSize + renderConnSize); - } else if(deltaX < -(renderRoomSize + renderConnSize)/2) { - deltaX += (renderRoomSize + renderConnSize); - } - if(deltaY > (renderRoomSize + renderConnSize)/2) { - deltaY -= (renderRoomSize + renderConnSize); - } else if(deltaY < -(renderRoomSize + renderConnSize)/2) { - deltaY += (renderRoomSize + renderConnSize); - }*/ + float deltaX = entityPos.getRenderX(9) - pos.getRenderX(0); + float deltaY = entityPos.getRenderY(9) - pos.getRenderY(0); x += deltaX; y += deltaY; @@ -689,8 +678,8 @@ public class DungeonMap { if (doInterp && playerMarkerMapPositionsLast.containsKey(name)) { MapPosition last = playerMarkerMapPositionsLast.get(name); - float xLast = last.getRenderX(); - float yLast = last.getRenderY(); + float xLast = last.getRenderX(0); + float yLast = last.getRenderY(0); float distSq = (x - xLast) * (x - xLast) + (y - yLast) * (y - yLast); if (distSq < renderRoomSize * renderRoomSize / 4f) { @@ -1087,12 +1076,12 @@ public class DungeonMap { this.connOffsetY = connOffsetY; } - public float getRenderX() { - return roomOffsetX * getRenderRoomSize() + connOffsetX * getRenderConnSize(); + public float getRenderX(int blockOffset) { + return (roomOffsetX + blockOffset) * getRenderRoomSize() + connOffsetX * getRenderConnSize(); } - public float getRenderY() { - return roomOffsetY * getRenderRoomSize() + connOffsetY * getRenderConnSize(); + public float getRenderY(int blockOffset) { + return (roomOffsetY + blockOffset) * getRenderRoomSize() + connOffsetY * getRenderConnSize(); } @Override @@ -1153,7 +1142,7 @@ public class DungeonMap { String line = ScorePlayerTeam.formatPlayerName(scoreplayerteam1, score.getPlayerName()); line = Utils.cleanColour(line); - if (line.contains("(F1)") || line.contains("(E0)") || line.contains("(M1)")) { + if (line.contains("(F1)") || line.contains("(E)") || line.contains("(M1)")) { isFloorOne = true; break; } @@ -1425,8 +1414,8 @@ public class DungeonMap { for (Map.Entry entry : playerMarkerMapPositionsLast.entrySet()) { HashMap deltaDists = new HashMap<>(); for (int i = 0; i < positions.size(); i++) { - float dx = entry.getValue().getRenderX() - positions.get(i).getRenderX(); - float dy = entry.getValue().getRenderY() - positions.get(i).getRenderY(); + float dx = entry.getValue().getRenderX(0) - positions.get(i).getRenderX(0); + float dy = entry.getValue().getRenderY(0) - positions.get(i).getRenderY(0); deltaDists.put(i, dx * dx + dy * dy); } distanceMap.put(entry.getKey(), deltaDists); 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 976dfcf8..66389beb 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java @@ -200,7 +200,12 @@ public class DungeonWin { displayWin(); } else { if (unformatted.trim().length() > 0) { - text.add(e.message.getFormattedText().substring(6).trim()); + 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() + "\""); + } } } } else { 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 c76a22b4..c7bcc0e1 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionBINWarning.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionBINWarning.java @@ -37,6 +37,7 @@ public class AuctionBINWarning extends GuiElement { private String sellingName; private int sellingPrice; private int lowestPrice; + private int sellStackAmount; private boolean shouldPerformCheck() { if (!NotEnoughUpdates.INSTANCE.config.ahTweaks.enableBINWarning || @@ -83,6 +84,7 @@ public class AuctionBINWarning extends GuiElement { ItemStack sellStack = chest.inventorySlots.getSlot(13).getStack(); String internalname = NotEnoughUpdates.INSTANCE.manager.getInternalNameForItem(sellStack); + sellStackAmount = sellStack.stackSize; if (internalname == null) { return false; @@ -105,13 +107,17 @@ public class AuctionBINWarning extends GuiElement { lowestPrice = (int) NotEnoughUpdates.INSTANCE.manager.auctionManager.getItemAvgBin(internalname); } - //TODO: Add option for warning if lowest price does not exist - - float factor = 1 - NotEnoughUpdates.INSTANCE.config.ahTweaks.warningThreshold / 100; - if (factor < 0) factor = 0; - if (factor > 1) factor = 1; - - if (sellingPrice > 0 && lowestPrice > 0 && sellingPrice < lowestPrice * factor) { + float undercutFactor = 1 - NotEnoughUpdates.INSTANCE.config.ahTweaks.warningThreshold / 100; + if (undercutFactor < 0) undercutFactor = 0; + if (undercutFactor > 1) undercutFactor = 1; + float overcutFactor = 1 + NotEnoughUpdates.INSTANCE.config.ahTweaks.overcutWarningThreshold / 100; + if (overcutFactor < 0) overcutFactor = 0; + + if ( + (sellingPrice > 0 && lowestPrice > 0 && + ((sellingPrice > sellStackAmount * lowestPrice * overcutFactor) || + sellingPrice < sellStackAmount * lowestPrice * undercutFactor)) + || lowestPrice == -1) { showWarning = true; return true; } else { @@ -155,10 +161,10 @@ public class AuctionBINWarning extends GuiElement { ); String lowestPriceStr; - if (lowestPrice > 999) { - lowestPriceStr = Utils.shortNumberFormat(lowestPrice, 0); + if (lowestPrice * sellStackAmount > 999) { + lowestPriceStr = Utils.shortNumberFormat(lowestPrice * sellStackAmount, 0); } else { - lowestPriceStr = "" + lowestPrice; + lowestPriceStr = "" + lowestPrice * sellStackAmount; } String sellingPriceStr; @@ -174,7 +180,9 @@ public class AuctionBINWarning extends GuiElement { width / 2, height / 2 - 45 + 25, false, 170, 0xffffffff ); TextRenderUtils.drawStringCenteredScaledMaxWidth( - "has a lowest BIN of \u00a76" + lowestPriceStr + "\u00a7r coins", + (lowestPrice > 0 + ? "has a lowest BIN of \u00a76" + lowestPriceStr + "\u00a7r coins" + : "\u00a7cWarning: No lowest BIN found!"), Minecraft.getMinecraft().fontRendererObj, width / 2, height / 2 - 45 + 34, @@ -183,8 +191,15 @@ public class AuctionBINWarning extends GuiElement { 0xffa0a0a0 ); - int buyPercentage = 100 - sellingPrice * 100 / lowestPrice; - if (buyPercentage <= 0) buyPercentage = 1; + boolean isALoss = false; + int buyPercentage = 0; + if (sellingPrice > lowestPrice * sellStackAmount) { + buyPercentage = sellingPrice * 100 / (lowestPrice * sellStackAmount) - 100; + isALoss = false; + } else if (sellingPrice < lowestPrice * sellStackAmount) { + buyPercentage = 100 - sellingPrice * 100 / (lowestPrice * sellStackAmount); + isALoss = true; + } TextRenderUtils.drawStringCenteredScaledMaxWidth( "Continue selling it for", @@ -196,7 +211,10 @@ public class AuctionBINWarning extends GuiElement { 0xffa0a0a0 ); TextRenderUtils.drawStringCenteredScaledMaxWidth( - "\u00a76" + sellingPriceStr + "\u00a7r coins? (\u00a7c-" + buyPercentage + "%\u00a7r)", + "\u00a76" + sellingPriceStr + "\u00a7r coins?" + + ((lowestPrice > 0 && buyPercentage > 0) + ? "(\u00a7" + (isALoss ? "c-" : "a+") + buyPercentage + "%\u00a7r)" + : ""), Minecraft.getMinecraft().fontRendererObj, width / 2, height / 2 - 45 + 59, @@ -218,7 +236,7 @@ public class AuctionBINWarning extends GuiElement { 0xff00ff00 ); TextRenderUtils.drawStringCenteredScaledMaxWidth( - EnumChatFormatting.RED + "[n]o", + EnumChatFormatting.RED + "[N]o", Minecraft.getMinecraft().fontRendererObj, width / 2 + 23, height / 2 + 31, 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 1d03a2d1..25c47fce 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java @@ -12,20 +12,20 @@ import io.github.moulberry.notenoughupdates.miscgui.GuiEnchantColour; import io.github.moulberry.notenoughupdates.miscgui.GuiInvButtonEditor; import io.github.moulberry.notenoughupdates.miscgui.NEUOverlayPlacements; import io.github.moulberry.notenoughupdates.options.customtypes.NEUDebugFlag; -import io.github.moulberry.notenoughupdates.options.seperateSections.AccessoryBag; import io.github.moulberry.notenoughupdates.options.seperateSections.AHGraph; import io.github.moulberry.notenoughupdates.options.seperateSections.AHTweaks; +import io.github.moulberry.notenoughupdates.options.seperateSections.AccessoryBag; import io.github.moulberry.notenoughupdates.options.seperateSections.ApiKey; import io.github.moulberry.notenoughupdates.options.seperateSections.Calendar; import io.github.moulberry.notenoughupdates.options.seperateSections.CustomArmour; -import io.github.moulberry.notenoughupdates.options.seperateSections.Dungeons; import io.github.moulberry.notenoughupdates.options.seperateSections.DungeonMapConfig; +import io.github.moulberry.notenoughupdates.options.seperateSections.Dungeons; import io.github.moulberry.notenoughupdates.options.seperateSections.Enchanting; import io.github.moulberry.notenoughupdates.options.seperateSections.Fishing; import io.github.moulberry.notenoughupdates.options.seperateSections.ImprovedSBMenu; import io.github.moulberry.notenoughupdates.options.seperateSections.InventoryButtons; -import io.github.moulberry.notenoughupdates.options.seperateSections.Itemlist; import io.github.moulberry.notenoughupdates.options.seperateSections.ItemOverlays; +import io.github.moulberry.notenoughupdates.options.seperateSections.Itemlist; import io.github.moulberry.notenoughupdates.options.seperateSections.LocationEdit; import io.github.moulberry.notenoughupdates.options.seperateSections.Mining; import io.github.moulberry.notenoughupdates.options.seperateSections.Misc; @@ -33,9 +33,10 @@ import io.github.moulberry.notenoughupdates.options.seperateSections.MiscOverlay import io.github.moulberry.notenoughupdates.options.seperateSections.NeuAuctionHouse; import io.github.moulberry.notenoughupdates.options.seperateSections.Notifications; import io.github.moulberry.notenoughupdates.options.seperateSections.PetOverlay; +import io.github.moulberry.notenoughupdates.options.seperateSections.ProfileViewer; +import io.github.moulberry.notenoughupdates.options.seperateSections.SkillOverlays; import io.github.moulberry.notenoughupdates.options.seperateSections.SlayerOverlay; import io.github.moulberry.notenoughupdates.options.seperateSections.SlotLocking; -import io.github.moulberry.notenoughupdates.options.seperateSections.SkillOverlays; import io.github.moulberry.notenoughupdates.options.seperateSections.StorageGUI; import io.github.moulberry.notenoughupdates.options.seperateSections.Toolbar; import io.github.moulberry.notenoughupdates.options.seperateSections.TooltipTweaks; @@ -325,6 +326,13 @@ public class NEUConfig extends Config { ) public AccessoryBag accessoryBag = new AccessoryBag(); + @Expose + @Category( + name = "Profile Viewer", + desc = "Profile Viewer" + ) + public ProfileViewer profileViewer = new ProfileViewer(); + @Expose @Category( name = "Api Key", diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHTweaks.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHTweaks.java index 0d21a96f..63c4fe8d 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHTweaks.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHTweaks.java @@ -66,8 +66,8 @@ public class AHTweaks { @Expose @ConfigOption( - name = "Warning Threshold", - desc = "Threshold for BIN warning\nExample: 10% means warn if sell price is 10% lower than lowestbin" + name = "Undercut Warning Threshold", + desc = "Threshold for BIN warning\nExample: 10% means warn if sell price is 10% lower than lowest bin" ) @ConfigEditorSlider( minValue = 0.0f, @@ -77,6 +77,19 @@ public class AHTweaks { @ConfigAccordionId(id = 1) public float warningThreshold = 10f; + @Expose + @ConfigOption( + name = "Overcut Warning Threshold", + desc = "Threshold for BIN warning\nExample: 50% means warn if sell price is 50% higher than lowest bin" + ) + @ConfigEditorSlider( + minValue = 0.0f, + maxValue = 100.0f, + minStep = 5f + ) + @ConfigAccordionId(id = 1) + public float overcutWarningThreshold = 50f; + @ConfigOption( name = "Sort Warning", desc = "" 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 058b13d8..e872bfc0 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,13 @@ 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.ConfigEditorSlider; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigOption; public class Misc { @Expose @@ -141,4 +147,4 @@ public class Misc { @ConfigEditorBoolean public boolean disableNPCRetexturing = false; -} \ No newline at end of file +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java new file mode 100644 index 00000000..2e1d0619 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java @@ -0,0 +1,63 @@ +package io.github.moulberry.notenoughupdates.options.seperateSections; + +import com.google.gson.annotations.Expose; +import io.github.moulberry.notenoughupdates.core.config.annotations.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ProfileViewer { + + @ConfigOption( + name = "Profile Viewer info", + desc = + "The Profile Viewer requires you to have an \u00A72api key\u00A77 set (if you don't have one set do \u00A72/api new\u00A77)\n" + ) + @ConfigEditorFSR( + runnableId = 12, + buttonText = "" + ) + public boolean pvInfo = false; + + @Expose + @ConfigOption( + name = "Open Profile Viewer", + desc = "Brings up the profile viewer (/pv)\n" + + "Shows stats and networth of players" + ) + @ConfigEditorButton( + runnableId = 13, + buttonText = "Open" + ) + public boolean openPV = true; + + @Expose + @ConfigOption( + name = "Page layout", + desc = "\u00a7rSelect the order of the pages at the top of the Profile Viewer\n" + + "\u00a7eDrag text to rearrange" + ) + @ConfigEditorDraggableList( + exampleText = { + "\u00a7eBasic Info", + "\u00a7eDungeons", + "\u00a7eExtra Info", + "\u00a7eInventories", + "\u00a7eCollections", + "\u00a7ePets", + "\u00a7eMining", + "\u00a7eBingo", + }, + allowRemovingElements = false + ) + public List pageLayout = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7)); + + @Expose + @ConfigOption( + name = "Always show bingo tab", + desc = "Always show bingo tab or only show it when the bingo profile is selected" + ) + @ConfigEditorBoolean + public boolean alwaysShowBingoTab = false; +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/FarmingOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/FarmingOverlay.java index f2c7e396..bbab59cb 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/FarmingOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/FarmingOverlay.java @@ -175,18 +175,17 @@ public class FarmingOverlay extends TextOverlay { } if (!NotEnoughUpdates.INSTANCE.config.skillOverlays.useBZPrice || internalname != null && (internalname.equals( - "TREECAPITATOR_AXE")) - || internalname != null && (internalname.equals("JUNGLE_AXE"))) { - if (internalname != null && internalname.startsWith("THEORETICAL_HOE_WARTS") || - (internalname != null && internalname.equals("COCO_CHOPPER"))) { + "TREECAPITATOR_AXE")) || internalname != null && (internalname.equals("JUNGLE_AXE"))) { + if ((internalname != null && internalname.equals("COCO_CHOPPER"))) { Coins = 3; } else if (internalname != null && internalname.startsWith("THEORETICAL_HOE_POTATO") || - (internalname != null && internalname.startsWith("THEORETICAL_HOE_CARROT")) - || (internalname != null && internalname.equals("CACTUS_KNIFE")) || + (internalname != null && internalname.startsWith("THEORETICAL_HOE_CARROT")) || + (internalname != null && internalname.equals("CACTUS_KNIFE")) || (internalname != null && internalname.startsWith("THEORETICAL_HOE_WHEAT"))) { Coins = 1; - } else if (internalname != null && internalname.startsWith("THEORETICAL_HOE_CANE") || - (internalname != null && internalname.equals("TREECAPITATOR_AXE")) + } else if (internalname != null && internalname.startsWith("THEORETICAL_HOE_CANE") + || (internalname != null && internalname.equals("TREECAPITATOR_AXE")) + || (internalname != null && internalname.startsWith("THEORETICAL_HOE_WARTS")) || (internalname != null && internalname.equals("JUNGLE_AXE"))) { Coins = 2; } else if ((internalname != null && internalname.equals("PUMPKIN_DICER")) || diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BingoPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BingoPage.java new file mode 100644 index 00000000..60d1e513 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BingoPage.java @@ -0,0 +1,309 @@ +package io.github.moulberry.notenoughupdates.profileviewer; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.util.Utils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class BingoPage { + private static final ResourceLocation BINGO_GUI_TEXTURE = new ResourceLocation("notenoughupdates:pv_bingo_tab.png"); + private static long lastResourceRequest; + private static List bingoGoals = null; + private static int currentEventId; + + public static void renderPage(int mouseX, int mouseY) { + processBingoResources(); + JsonObject bingoInfo = GuiProfileViewer.getProfile().getBingoInformation(); + + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + int width = scaledResolution.getScaledWidth(); + int height = scaledResolution.getScaledHeight(); + + int guiLeft = GuiProfileViewer.getGuiLeft(); + int guiTop = GuiProfileViewer.getGuiTop(); + //check if the player has created a bingo profile for the current event + if (bingoInfo == null) { + showMissingDataMessage(guiLeft, guiTop); + return; + } + + JsonArray events = bingoInfo.get("events").getAsJsonArray(); + JsonObject lastEvent = events.get(events.size() - 1).getAsJsonObject(); + int lastParticipatedId = lastEvent.get("key").getAsInt(); + if (currentEventId != lastParticipatedId) { + showMissingDataMessage(guiLeft, guiTop); + return; + } + + List completedGoals = jsonArrayToStringList(lastEvent.get("completed_goals").getAsJsonArray()); + Minecraft.getMinecraft().getTextureManager().bindTexture(BINGO_GUI_TEXTURE); + Utils.drawTexturedRect(guiLeft, guiTop, 431, 202, GL11.GL_NEAREST); + + GlStateManager.color(1, 1, 1, 1); + GlStateManager.disableLighting(); + + int row = 0; + int col = 0; + int initialY = guiTop + 46; + int initialX = guiLeft + 231; + int xAdjustment = 0; + int yAdjustment = 0; + for (JsonObject bingoGoal : bingoGoals) { + boolean dye = false; + boolean completed = false; + boolean communityGoal = false; + Item material; + if (bingoGoal.has("tiers")) { + if (isCommunityGoalFinished(bingoGoal)) { + material = Item.getItemFromBlock(Blocks.emerald_block); + } else { + material = Item.getItemFromBlock(Blocks.iron_block); + } + RenderHelper.enableGUIStandardItemLighting(); + completed = true; + communityGoal = true; + yAdjustment = -1; + xAdjustment = -1; + } else { + if (completedGoals.contains(bingoGoal.get("id").getAsString())) { + material = Items.dye; + xAdjustment = -1; + dye = true; + completed = true; + } else { + material = Items.paper; + } + } + + ItemStack itemStack = new ItemStack(material); + if (dye) { + itemStack.setItemDamage(10); + } + int x = col == 0 ? initialX + xAdjustment : initialX + (24 * col) + xAdjustment; + int y = row == 0 ? initialY + yAdjustment : initialY + (24 * row) + yAdjustment; + + Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI(itemStack, x, y); + if (mouseX >= x && mouseX < x + 24) { + if (mouseY >= y && mouseY <= y + 24) { + Utils.drawHoveringText( + getTooltip(bingoGoal, completed, communityGoal), + mouseX, + mouseY, + width, + height, + -1, + Minecraft.getMinecraft().fontRendererObj + ); + } + } + col++; + if (col == 5) { + col = 0; + row++; + } + } + + String totalPointsString = + EnumChatFormatting.AQUA + "Collected Points: " + EnumChatFormatting.WHITE + lastEvent.get("points").getAsInt(); + int totalGoals = completedGoals.size(); + String personalGoalsString; + if (totalGoals == 20) { + personalGoalsString = EnumChatFormatting.AQUA + "Personal Goals: " + EnumChatFormatting.GOLD + "20/20"; + } else { + personalGoalsString = + EnumChatFormatting.AQUA + "Personal Goals: " + EnumChatFormatting.WHITE + completedGoals.size() + + EnumChatFormatting.GOLD + "/" + EnumChatFormatting.WHITE + 20; + } + Utils.drawStringF(totalPointsString, Minecraft.getMinecraft().fontRendererObj, + guiLeft + 22, guiTop + 19, true, 0 + ); + Utils.drawStringF(personalGoalsString, Minecraft.getMinecraft().fontRendererObj, + guiLeft + 22, guiTop + 31, true, 0 + ); + + GlStateManager.enableLighting(); + } + + private static boolean isCommunityGoalFinished(JsonObject goal) { + JsonArray tiers = goal.get("tiers").getAsJsonArray(); + int totalTiers = tiers.size(); + long progress = goal.get("progress").getAsLong(); + int finalTier = 0; + for (JsonElement tier : tiers) { + long currentTier = tier.getAsLong(); + if (progress < currentTier) { + break; + } + finalTier++; + } + return finalTier == totalTiers; + } + + private static String generateProgressIndicator(double progress, double goal) { + int totalFields = 20; + int filled; + double percentage = progress / goal * 100; + if (percentage >= 100) { + filled = 20; + } else { + filled = (int) Math.round((percentage / 100) * 20); + } + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(EnumChatFormatting.DARK_GREEN); + for (int i = 0; i < totalFields; i++) { + stringBuilder.append("-"); + if (i > filled) { + stringBuilder.append(EnumChatFormatting.GRAY); + } + } + + return stringBuilder.toString(); + } + + private static List getTooltip(JsonObject goal, boolean completed, boolean communityGoal) { + List tooltip = new ArrayList<>(); + if (communityGoal) { + //get current tier + JsonArray tiers = goal.get("tiers").getAsJsonArray(); + int totalTiers = tiers.size(); + double progress = goal.get("progress").getAsLong(); + int finalTier = 0; + for (JsonElement tier : tiers) { + double currentTier = tier.getAsLong(); + if (progress < currentTier) { + break; + } + finalTier++; + } + double nextTier = finalTier < totalTiers ? tiers.get(totalTiers - 1).getAsLong() : tiers + .get(finalTier - 1) + .getAsLong(); + int progressToNextTier = (int) Math.round(progress / nextTier * 100); + if (progressToNextTier > 100) progressToNextTier = 100; + String progressBar = generateProgressIndicator(progress, nextTier); + String name = goal.get("name").getAsString(); + int nextTierNum = finalTier < totalTiers ? finalTier + 1 : totalTiers; + + String nextTierString = Utils.shortNumberFormat(nextTier, 0); + String progressString = Utils.shortNumberFormat(progress, 0); + tooltip.add(EnumChatFormatting.GREEN + name + " " + finalTier); + tooltip.add(EnumChatFormatting.DARK_GRAY + "Community Goal"); + tooltip.add(""); + tooltip.add( + EnumChatFormatting.GRAY + "Progress to " + name + " " + nextTierNum + ": " + EnumChatFormatting.YELLOW + + progressToNextTier + EnumChatFormatting.GOLD + "%"); + tooltip.add(progressBar + EnumChatFormatting.YELLOW + " " + progressString + EnumChatFormatting.GOLD + "/" + + EnumChatFormatting.YELLOW + nextTierString); + tooltip.add(""); + tooltip.add(EnumChatFormatting.GRAY + "Contribution Rewards"); + tooltip.add( + "Top " + EnumChatFormatting.YELLOW + "1%" + EnumChatFormatting.DARK_GRAY + " - " + EnumChatFormatting.GOLD + + "15 Bingo Points"); + tooltip.add( + "Top " + EnumChatFormatting.YELLOW + "5%" + EnumChatFormatting.DARK_GRAY + " - " + EnumChatFormatting.GOLD + + "12 Bingo Points"); + tooltip.add( + "Top " + EnumChatFormatting.YELLOW + "10%" + EnumChatFormatting.DARK_GRAY + " - " + EnumChatFormatting.GOLD + + "9 Bingo Points"); + tooltip.add( + "Top " + EnumChatFormatting.YELLOW + "25%" + EnumChatFormatting.DARK_GRAY + " - " + EnumChatFormatting.GOLD + + "7 Bingo Points"); + tooltip.add( + "All Contributors" + EnumChatFormatting.DARK_GRAY + " - " + EnumChatFormatting.GOLD + "4 Bingo Points"); + + tooltip.add(""); + tooltip.add(EnumChatFormatting.DARK_GRAY.toString() + EnumChatFormatting.ITALIC + "Community Goals are"); + tooltip.add( + EnumChatFormatting.DARK_GRAY.toString() + EnumChatFormatting.ITALIC + "collaborative - anyone with a"); + tooltip.add( + EnumChatFormatting.DARK_GRAY.toString() + EnumChatFormatting.ITALIC + "Bingo profile can help to reach"); + tooltip.add(EnumChatFormatting.DARK_GRAY.toString() + EnumChatFormatting.ITALIC + "the goal!"); + tooltip.add(""); + tooltip.add(EnumChatFormatting.DARK_GRAY.toString() + EnumChatFormatting.ITALIC + "The more you contribute"); + tooltip.add(EnumChatFormatting.DARK_GRAY.toString() + EnumChatFormatting.ITALIC + + "towards the goal, the more you"); + tooltip.add(EnumChatFormatting.DARK_GRAY.toString() + EnumChatFormatting.ITALIC + "will be rewarded"); + + if (finalTier == totalTiers) { + tooltip.add(""); + tooltip.add(EnumChatFormatting.GREEN + "GOAL REACHED"); + } + } else { + tooltip.add(EnumChatFormatting.GREEN + goal.get("name").getAsString()); + tooltip.add(EnumChatFormatting.DARK_GRAY + "Personal Goal"); + tooltip.add(""); + tooltip.add(goal.get("lore").getAsString()); + tooltip.add(""); + tooltip.add(EnumChatFormatting.GRAY + "Reward"); + tooltip.add(EnumChatFormatting.GOLD + "1 Bingo Point"); + if (completed) { + tooltip.add(""); + tooltip.add(EnumChatFormatting.GREEN + "GOAL REACHED"); + } else { + tooltip.add(""); + tooltip.add(EnumChatFormatting.RED + "You have not reached this goal!"); + } + } + return tooltip; + } + + private static void showMissingDataMessage(int guiLeft, int guiTop) { + String message = EnumChatFormatting.RED + "No Bingo data for current event!"; + Utils.drawStringCentered(message, Minecraft.getMinecraft().fontRendererObj, + guiLeft + 431 / 2f, guiTop + 101, true, 0 + ); + } + + private static List jsonArrayToStringList(JsonArray completedGoals) { + List list = new ArrayList<>(); + for (JsonElement completedGoal : completedGoals) { + list.add(completedGoal.getAsString()); + } + return list; + } + + private static List jsonArrayToJsonObjectList(JsonArray goals) { + List list = new ArrayList<>(); + for (JsonElement goal : goals) { + list.add(goal.getAsJsonObject()); + } + + return list; + } + + private static void processBingoResources() { + long currentTime = System.currentTimeMillis(); + + //renew every 2 minutes + if (currentTime - lastResourceRequest < 120 * 1000 && bingoGoals != null) return; + lastResourceRequest = currentTime; + + HashMap args = new HashMap<>(); + NotEnoughUpdates.INSTANCE.manager.hypixelApi.getHypixelApiAsync( + NotEnoughUpdates.INSTANCE.config.apiKey.apiKey, + "resources/skyblock/bingo", + args + ).thenAccept(jsonObject -> { + if (jsonObject.has("success") && jsonObject.get("success").getAsBoolean()) { + bingoGoals = jsonArrayToJsonObjectList(jsonObject.get("goals").getAsJsonArray()); + currentEventId = jsonObject.get("id").getAsInt(); + } + }); + } +} 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 44ea686d..898f9e11 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java @@ -31,7 +31,12 @@ import net.minecraft.init.Blocks; import net.minecraft.init.Items; 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.NBTTagByteArray; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.Matrix4f; import net.minecraft.util.ResourceLocation; @@ -51,8 +56,21 @@ import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Base64; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; -import java.util.*; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.TimeZone; +import java.util.TreeMap; +import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; @@ -61,8 +79,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class GuiProfileViewer extends GuiScreen { - private static final ResourceLocation CHEST_GUI_TEXTURE = - new ResourceLocation("textures/gui/container/generic_54.png"); public static final ResourceLocation pv_basic = new ResourceLocation("notenoughupdates:pv_basic.png"); public static final ResourceLocation pv_dung = new ResourceLocation("notenoughupdates:pv_dung.png"); public static final ResourceLocation pv_extra = new ResourceLocation("notenoughupdates:pv_extra.png"); @@ -80,45 +96,170 @@ public class GuiProfileViewer extends GuiScreen { public static final ResourceLocation resource_packs = new ResourceLocation("minecraft:textures/gui/resource_packs.png"); public static final ResourceLocation icons = new ResourceLocation("textures/gui/icons.png"); - + public static final HashMap> PET_STAT_BOOSTS = + new HashMap>() {{ + put("PET_ITEM_BIG_TEETH_COMMON", new HashMap() {{ + put("CRIT_CHANCE", 5f); + }}); + put("PET_ITEM_HARDENED_SCALES_UNCOMMON", new HashMap() {{ + put("DEFENCE", 25f); + }}); + put("PET_ITEM_LUCKY_CLOVER", new HashMap() {{ + put("MAGIC_FIND", 7f); + }}); + put("PET_ITEM_SHARPENED_CLAWS_UNCOMMON", new HashMap() {{ + put("CRIT_DAMAGE", 15f); + }}); + }}; + public static final HashMap> PET_STAT_BOOSTS_MULT = + new HashMap>() {{ + put("PET_ITEM_IRON_CLAWS_COMMON", new HashMap() {{ + put("CRIT_DAMAGE", 1.4f); + put("CRIT_CHANCE", 1.4f); + }}); + put("PET_ITEM_TEXTBOOK", new HashMap() {{ + put("INTELLIGENCE", 2f); + }}); + }}; + private static final ResourceLocation CHEST_GUI_TEXTURE = + new ResourceLocation("textures/gui/container/generic_54.png"); private static final NumberFormat numberFormat = NumberFormat.getInstance(Locale.US); - - private final ProfileViewer.Profile profile; + private static final ItemStack DEADBUSH = new ItemStack(Item.getItemFromBlock(Blocks.deadbush)); + private static final ItemStack iron_pick = new ItemStack(Items.iron_pickaxe); + private static final ItemStack[] BOSS_HEADS = new ItemStack[7]; + private static final String[] dungSkillsName = {"Healer", "Mage", "Berserk", "Archer", "Tank"}; + private static final ItemStack[] dungSkillsStack = { + new ItemStack(Items.potionitem, 1, 16389), + new ItemStack(Items.blaze_rod), + new ItemStack(Items.iron_sword), + new ItemStack(Items.bow), + new ItemStack(Items.leather_chestplate) + }; + private static final String[] bossFloorArr = {"Bonzo", "Scarf", "Professor", "Thorn", "Livid", "Sadan", "Necron"}; + private static final String[] bossFloorHeads = { + "12716ecbf5b8da00b05f316ec6af61e8bd02805b21eb8e440151468dc656549c", + "7de7bbbdf22bfe17980d4e20687e386f11d59ee1db6f8b4762391b79a5ac532d", + "9971cee8b833a62fc2a612f3503437fdf93cad692d216b8cf90bbb0538c47dd8", + "8b6a72138d69fbbd2fea3fa251cabd87152e4f1c97e5f986bf685571db3cc0", + "c1007c5b7114abec734206d4fc613da4f3a0e99f71ff949cedadc99079135a0b", + "fa06cb0c471c1c9bc169af270cd466ea701946776056e472ecdaeb49f0f4a4dc", + "a435164c05cea299a3f016bbbed05706ebb720dac912ce4351c2296626aecd9a" + }; + private static final LinkedHashMap dungeonsModeIcons = new LinkedHashMap() {{ + put( + "catacombs", + Utils.editItemStackInfo(NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager + .getItemInformation() + .get("DUNGEON_STONE")), EnumChatFormatting.GRAY + "Normal Mode", true) + ); + put( + "master_catacombs", + Utils.editItemStackInfo(NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager + .getItemInformation() + .get("MASTER_SKULL_TIER_7")), EnumChatFormatting.GRAY + "Master Mode", true) + ); + }}; + private static final LinkedHashMap invNameToDisplayMap = new LinkedHashMap() {{ + put( + "inv_contents", + Utils.createItemStack(Item.getItemFromBlock(Blocks.chest), EnumChatFormatting.GRAY + "Inventory") + ); + put( + "ender_chest_contents", + Utils.createItemStack(Item.getItemFromBlock(Blocks.ender_chest), EnumChatFormatting.GRAY + "Ender Chest") + ); + // put("backpack_contents", Utils.createItemStack(Item.getItemFromBlock(Blocks.dropper), EnumChatFormatting.GRAY+"Backpacks")); + put( + "backpack_contents", + Utils.editItemStackInfo(NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager + .getItemInformation() + .get("JUMBO_BACKPACK")), EnumChatFormatting.GRAY + "Backpacks", true) + ); + put( + "personal_vault_contents", + Utils.editItemStackInfo(NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager + .getItemInformation() + .get("IRON_CHEST")), EnumChatFormatting.GRAY + "Personal vault", true) + ); + put("talisman_bag", Utils.createItemStack(Items.golden_apple, EnumChatFormatting.GRAY + "Accessory Bag")); + put("wardrobe_contents", Utils.createItemStack(Items.leather_chestplate, EnumChatFormatting.GRAY + "Wardrobe")); + put("fishing_bag", Utils.createItemStack(Items.fish, EnumChatFormatting.GRAY + "Fishing Bag")); + put("potion_bag", Utils.createItemStack(Items.potionitem, EnumChatFormatting.GRAY + "Potion Bag")); + }}; + private static final Pattern DAMAGE_PATTERN = Pattern.compile("^Damage: \\+([0-9]+)"); + private static final Pattern STRENGTH_PATTERN = Pattern.compile("^Strength: \\+([0-9]+)"); + private static final Pattern FISHSPEED_PATTERN = Pattern.compile("^Increases fishing speed by \\+([0-9]+)"); + private static final char[] c = new char[]{'k', 'm', 'b', 't'}; + private static final ExecutorService profileLoader = Executors.newFixedThreadPool(1); public static ProfileViewerPage currentPage = ProfileViewerPage.BASIC; + public static HashMap MINION_RARITY_TO_NUM = new HashMap() {{ + put("COMMON", "0"); + put("UNCOMMON", "1"); + put("RARE", "2"); + put("EPIC", "3"); + put("LEGENDARY", "4"); + put("MYTHIC", "5"); + }}; + private static int floorTime = 7; + private static int guiLeft; + private static int guiTop; + private static ProfileViewer.Profile profile = null; + private final GuiElementTextField playerNameTextField; + private final HashMap levelObjCatas = new HashMap<>(); + private final HashMap levelObjhotms = new HashMap<>(); + private final HashMap> levelObjClasseses = new HashMap<>(); + private final GuiElementTextField dungeonLevelTextField = new GuiElementTextField("", GuiElementTextField.SCALE_TEXT); + private final String[] romans = new String[]{ + "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", + "XII", "XIII", "XIV", "XV", "XVI", "XVII", "XIX", "XX" + }; + private final int COLLS_XCOUNT = 5; + private final int COLLS_YCOUNT = 4; + private final float COLLS_XPADDING = (190 - COLLS_XCOUNT * 20) / (float) (COLLS_XCOUNT + 1); + private final float COLLS_YPADDING = (202 - COLLS_YCOUNT * 20) / (float) (COLLS_YCOUNT + 1); + private final ItemStack fillerStack = new ItemStack(Item.getItemFromBlock(Blocks.stained_glass_pane), 1, 15); + private final GuiElementTextField inventoryTextField = new GuiElementTextField("", GuiElementTextField.SCALE_TEXT); + private final HashMap panoramasMap = new HashMap<>(); + Shader blurShaderHorz = null; + Framebuffer blurOutputHorz = null; + Shader blurShaderVert = null; + Framebuffer blurOutputVert = null; private int sizeX; private int sizeY; - private int guiLeft; - private int guiTop; - private float backgroundRotation = 0; - private long currentTime = 0; private long lastTime = 0; private long startTime = 0; - private List tooltipToDisplay = null; - private String profileId = null; private boolean profileDropdownSelected = false; - - public enum ProfileViewerPage { - LOADING(null), - INVALID_NAME(null), - NO_SKYBLOCK(null), - BASIC(new ItemStack(Items.paper)), - DUNG(new ItemStack(Item.getItemFromBlock(Blocks.deadbush))), - EXTRA(new ItemStack(Items.book)), - INVS(new ItemStack(Item.getItemFromBlock(Blocks.ender_chest))), - COLS(new ItemStack(Items.painting)), - PETS(new ItemStack(Items.bone)), - MINING(new ItemStack(Items.iron_pickaxe)); - - public final ItemStack stack; - - ProfileViewerPage(ItemStack stack) { - this.stack = stack; - } - } + private ItemStack selectedCollectionCategory = null; + private int floorLevelTo = -1; + private long floorLevelToXP = -1; + private boolean onMasterMode = false; + private int selectedPet = -1; + private int petsPage = 0; + private List sortedPets = null; + private List sortedPetsStack = null; + private ItemStack[] bestWeapons = null; + private ItemStack[] bestRods = null; + private ItemStack[] armorItems = null; + private HashMap inventoryItems = new HashMap<>(); + private String selectedInventory = "inv_contents"; + private int currentInventoryIndex = 0; + private int arrowCount = -1; + private int greenCandyCount = -1; + private int purpleCandyCount = -1; + private EntityOtherPlayerMP entityPlayer = null; + private ResourceLocation playerLocationSkin = null; + private ResourceLocation playerLocationCape = null; + private String skinType = null; + private TreeMap> topKills = null; + private TreeMap> topDeaths = null; + private int backgroundClickedX = -1; + private boolean loadingProfile = false; + private double lastBgBlurFactor = -1; + private boolean showBingoPage; public GuiProfileViewer(ProfileViewer.Profile profile) { this.profile = profile; @@ -137,7 +278,173 @@ public class GuiProfileViewer extends GuiScreen { } } - private final GuiElementTextField playerNameTextField; + private static JsonObject getPetInfo(String pet_name, String rarity) { + JsonObject petInfo = new JsonObject(); + + if (Constants.PETS.has("custom_pet_leveling") && + Constants.PETS.getAsJsonObject("custom_pet_leveling").has(pet_name)) { + JsonObject pet = Constants.PETS.getAsJsonObject("custom_pet_leveling").getAsJsonObject(pet_name); + if (pet.has("type") && pet.has("pet_levels")) { + int type = pet.get("type").getAsInt(); + switch (type) { + case 1: + JsonArray defaultLevels = Constants.PETS.getAsJsonArray("pet_levels"); + defaultLevels.addAll(pet.getAsJsonArray("pet_levels")); + petInfo.add("pet_levels", Constants.PETS.getAsJsonArray("pet_levels")); + break; + case 2: + petInfo.add("pet_levels", pet.getAsJsonArray("pet_levels")); + break; + default: + petInfo.add("pet_levels", Constants.PETS.getAsJsonArray("pet_levels")); + break; + } + } else { + petInfo.add("pet_levels", Constants.PETS.getAsJsonArray("pet_levels")); + } + if (pet.has("max_level")) { + petInfo.add("max_level", pet.get("max_level")); + } else { + petInfo.add("max_level", new JsonPrimitive(100)); + } + + if (pet.has("pet_rarity_offset")) { + petInfo.add("offset", pet.get("pet_rarity_offset")); + } else { + petInfo.add("offset", Constants.PETS.getAsJsonObject("pet_rarity_offset").get(rarity)); + } + + } else { + //System.out.println("Default Path"); + petInfo.add("offset", Constants.PETS.getAsJsonObject("pet_rarity_offset").get(rarity)); + petInfo.add("max_level", new JsonPrimitive(100)); + petInfo.add("pet_levels", Constants.PETS.getAsJsonArray("pet_levels")); + } + + return petInfo; + + } + + public static PetLevel getPetLevel(String pet_name, String rarity, float exp) { + JsonObject petInfo = getPetInfo(pet_name, rarity); + int offset = petInfo.get("offset").getAsInt(); + int maxPetLevel = petInfo.get("max_level").getAsInt(); + JsonArray levels = petInfo.getAsJsonArray("pet_levels"); + + float xpTotal = 0; + float level = 1; + float currentLevelRequirement = 0; + float currentLevelProgress = 0; + + boolean addLevel = true; + + for (int i = offset; i < offset + maxPetLevel - 1; i++) { + if (addLevel) { + currentLevelRequirement = levels.get(i).getAsFloat(); + xpTotal += currentLevelRequirement; + if (xpTotal > exp) { + currentLevelProgress = (exp - (xpTotal - currentLevelRequirement)); + addLevel = false; + } else { + level += 1; + } + } else { + + xpTotal += levels.get(i).getAsFloat(); + + } + } + + level += currentLevelProgress / currentLevelRequirement; + if (level <= 0) { + level = 1; + } else if (level > maxPetLevel) { + level = maxPetLevel; + } + PetLevel levelObj = new PetLevel(); + levelObj.level = level; + levelObj.currentLevelRequirement = currentLevelRequirement; + levelObj.maxXP = xpTotal; + levelObj.levelPercentage = currentLevelProgress / currentLevelRequirement; + levelObj.levelXp = currentLevelProgress; + levelObj.totalXp = exp; + return levelObj; + } + + public static String shortNumberFormat(double n, int iteration) { + if (n < 1000) { + if (n % 1 == 0) { + return Integer.toString((int) n); + } else { + return String.format("%.2f", n); + } + } + + double d = ((long) n / 100) / 10.0; + boolean isRound = (d * 10) % 10 == 0; + return (d < 1000 ? + ((d > 99.9 || isRound || (!isRound && d > 9.99) ? + (int) d * 10 / 10 : d + "" + ) + "" + c[iteration]) + : shortNumberFormat(d, iteration + 1)); + } + + public static void drawEntityOnScreen( + int posX, + int posY, + int scale, + float mouseX, + float mouseY, + EntityLivingBase ent + ) { + GlStateManager.enableColorMaterial(); + GlStateManager.pushMatrix(); + GlStateManager.translate((float) posX, (float) posY, 50.0F); + GlStateManager.scale((float) (-scale), (float) scale, (float) scale); + GlStateManager.rotate(180.0F, 0.0F, 0.0F, 1.0F); + float renderYawOffset = ent.renderYawOffset; + float f1 = ent.rotationYaw; + float f2 = ent.rotationPitch; + float f3 = ent.prevRotationYawHead; + float f4 = ent.rotationYawHead; + GlStateManager.rotate(135.0F, 0.0F, 1.0F, 0.0F); + RenderHelper.enableStandardItemLighting(); + GlStateManager.rotate(-135.0F, 0.0F, 1.0F, 0.0F); + GlStateManager.rotate(25, 1.0F, 0.0F, 0.0F); + ent.renderYawOffset = (float) Math.atan(mouseX / 40.0F) * 20.0F; + ent.rotationYaw = (float) Math.atan(mouseX / 40.0F) * 40.0F; + ent.rotationPitch = -((float) Math.atan(mouseY / 40.0F)) * 20.0F; + ent.rotationYawHead = ent.rotationYaw; + ent.prevRotationYawHead = ent.rotationYaw; + RenderManager rendermanager = Minecraft.getMinecraft().getRenderManager(); + rendermanager.setPlayerViewY(180.0F); + rendermanager.setRenderShadow(false); + rendermanager.renderEntityWithPosYaw(ent, 0.0D, 0.0D, 0.0D, 0.0F, 1.0F); + + ent.renderYawOffset = renderYawOffset; + ent.rotationYaw = f1; + ent.rotationPitch = f2; + ent.prevRotationYawHead = f3; + ent.rotationYawHead = f4; + GlStateManager.popMatrix(); + RenderHelper.disableStandardItemLighting(); + GlStateManager.disableRescaleNormal(); + GlStateManager.setActiveTexture(OpenGlHelper.lightmapTexUnit); + GlStateManager.disableTexture2D(); + GlStateManager.setActiveTexture(OpenGlHelper.defaultTexUnit); + } + + public static int getGuiLeft() { + return guiLeft; + } + + public static int getGuiTop() { + return guiTop; + } + + public static ProfileViewer.Profile getProfile() { + return profile; + } @Override public void drawScreen(int mouseX, int mouseY, float partialTicks) { @@ -159,7 +466,7 @@ public class GuiProfileViewer extends GuiScreen { { //this is just to cache the guild info if (profile != null) { - JsonObject guildinfo = profile.getGuildInfo(null); + profile.getGuildInfo(null); } } @@ -168,6 +475,22 @@ public class GuiProfileViewer extends GuiScreen { this.guiLeft = (this.width - this.sizeX) / 2; this.guiTop = (this.height - this.sizeY) / 2; + boolean bingo = false; + JsonObject currProfileInfo = profile.getProfileInformation(profileId); + if (NotEnoughUpdates.INSTANCE.config.profileViewer.alwaysShowBingoTab) { + showBingoPage = true; + } else { + if (currProfileInfo != null && currProfileInfo.has("game_mode") && + currProfileInfo.get("game_mode").getAsString().equals("bingo")) { + showBingoPage = true; + } else { + showBingoPage = false; + } + } + + if (!showBingoPage && currentPage == ProfileViewerPage.BINGO) + currentPage = ProfileViewerPage.BASIC; + super.drawScreen(mouseX, mouseY, partialTicks); drawDefaultBackground(); @@ -199,7 +522,6 @@ public class GuiProfileViewer extends GuiScreen { ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); if (profile != null) { - JsonObject currProfileInfo = profile.getProfileInformation(profileId); //Render Profile chooser button renderBlurredBackground(width, height, guiLeft + 2, guiTop + sizeY + 3 + 2, 100 - 4, 20 - 4); Minecraft.getMinecraft().getTextureManager().bindTexture(pv_dropdown); @@ -345,16 +667,16 @@ public class GuiProfileViewer extends GuiScreen { case BASIC: drawBasicPage(mouseX, mouseY, partialTicks); break; - case DUNG: + case DUNGEON: drawDungPage(mouseX, mouseY, partialTicks); break; case EXTRA: drawExtraPage(mouseX, mouseY, partialTicks); break; - case INVS: + case INVENTORIES: drawInvsPage(mouseX, mouseY, partialTicks); break; - case COLS: + case COLLECTIONS: drawColsPage(mouseX, mouseY, partialTicks); break; case PETS: @@ -363,6 +685,9 @@ public class GuiProfileViewer extends GuiScreen { case MINING: drawMiningPage(mouseX, mouseY, partialTicks); break; + case BINGO: + BingoPage.renderPage(mouseX, mouseY); + break; case LOADING: String str = EnumChatFormatting.YELLOW + "Loading player profiles."; long currentTimeMod = System.currentTimeMillis() % 1000; @@ -540,9 +865,11 @@ public class GuiProfileViewer extends GuiScreen { private void renderTabs(boolean renderPressed) { int ignoredTabs = 0; - for (int i = 0; i < ProfileViewerPage.values().length; i++) { - ProfileViewerPage page = ProfileViewerPage.values()[i]; - if (page.stack == null) { + List configList = NotEnoughUpdates.INSTANCE.config.profileViewer.pageLayout; + for (int i = 0; i < configList.size(); i++) { + ProfileViewerPage page = ProfileViewerPage.getById(configList.get(i)); + if (page == null) continue; + if (page.stack == null || (page == ProfileViewerPage.BINGO && !showBingoPage)) { ignoredTabs++; continue; } @@ -598,9 +925,10 @@ public class GuiProfileViewer extends GuiScreen { protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { if (currentPage != ProfileViewerPage.LOADING && currentPage != ProfileViewerPage.INVALID_NAME) { int ignoredTabs = 0; - for (int i = 0; i < ProfileViewerPage.values().length; i++) { - ProfileViewerPage page = ProfileViewerPage.values()[i]; - if (page.stack == null) { + List configList = NotEnoughUpdates.INSTANCE.config.profileViewer.pageLayout; + for (int i = 0; i < configList.size(); i++) { + ProfileViewerPage page = ProfileViewerPage.getById(configList.get(i)); + if (page.stack == null || (page == ProfileViewerPage.BINGO && !showBingoPage)) { ignoredTabs++; continue; } @@ -620,10 +948,10 @@ public class GuiProfileViewer extends GuiScreen { } } switch (currentPage) { - case DUNG: + case DUNGEON: mouseClickedDung(mouseX, mouseY, mouseButton); break; - case INVS: + case INVENTORIES: inventoryTextField.setSize(88, 20); if (mouseX > guiLeft + 19 && mouseX < guiLeft + 19 + 88) { if (mouseY > guiTop + sizeY - 26 - 20 && mouseY < guiTop + sizeY - 26) { @@ -729,14 +1057,14 @@ public class GuiProfileViewer extends GuiScreen { protected void keyTyped(char typedChar, int keyCode) throws IOException { super.keyTyped(typedChar, keyCode); switch (currentPage) { - case INVS: + case INVENTORIES: keyTypedInvs(typedChar, keyCode); inventoryTextField.keyTyped(typedChar, keyCode); break; - case COLS: + case COLLECTIONS: keyTypedCols(typedChar, keyCode); break; - case DUNG: + case DUNGEON: keyTypedDung(typedChar, keyCode); break; } @@ -757,10 +1085,10 @@ public class GuiProfileViewer extends GuiScreen { super.mouseReleased(mouseX, mouseY, mouseButton); switch (currentPage) { - case INVS: + case INVENTORIES: mouseReleasedInvs(mouseX, mouseY, mouseButton); break; - case COLS: + case COLLECTIONS: mouseReleasedCols(mouseX, mouseY, mouseButton); break; case PETS: @@ -799,10 +1127,8 @@ public class GuiProfileViewer extends GuiScreen { if (mouseX >= guiLeft - 29 && mouseX <= guiLeft) { if (mouseY >= guiTop && mouseY <= guiTop + 28) { onMasterMode = false; - return; } else if (mouseY + 28 >= guiTop && mouseY <= guiTop + 28 * 2) { onMasterMode = true; - return; } } } @@ -941,8 +1267,6 @@ public class GuiProfileViewer extends GuiScreen { } } - private ItemStack selectedCollectionCategory = null; - private void mouseReleasedCols(int mouseX, int mouseY, int mouseButton) { int collectionCatSize = ProfileViewer.getCollectionCatToCollectionMap().size(); int collectionCatYSize = (int) (162f / (collectionCatSize - 1 + 0.0000001f)); @@ -954,43 +1278,11 @@ public class GuiProfileViewer extends GuiScreen { selectedCollectionCategory = stack; Utils.playPressSound(); return; - } - } - yIndex++; - } - } - - private static final ItemStack DEADBUSH = new ItemStack(Item.getItemFromBlock(Blocks.deadbush)); - private static final ItemStack iron_pick = new ItemStack(Items.iron_pickaxe); - private static final ItemStack[] BOSS_HEADS = new ItemStack[7]; - - private final HashMap levelObjCatas = new HashMap<>(); - private final HashMap levelObjhotms = new HashMap<>(); - private final HashMap> levelObjClasseses = new HashMap<>(); - - private final GuiElementTextField dungeonLevelTextField = new GuiElementTextField("", GuiElementTextField.SCALE_TEXT); - - private static final String[] dungSkillsName = {"Healer", "Mage", "Berserk", "Archer", "Tank"}; - private static final ItemStack[] dungSkillsStack = { - new ItemStack(Items.potionitem, 1, 16389), - new ItemStack(Items.blaze_rod), - new ItemStack(Items.iron_sword), - new ItemStack(Items.bow), - new ItemStack(Items.leather_chestplate) - }; - private static final String[] bossFloorArr = {"Bonzo", "Scarf", "Professor", "Thorn", "Livid", "Sadan", "Necron"}; - private static final String[] bossFloorHeads = { - "12716ecbf5b8da00b05f316ec6af61e8bd02805b21eb8e440151468dc656549c", - "7de7bbbdf22bfe17980d4e20687e386f11d59ee1db6f8b4762391b79a5ac532d", - "9971cee8b833a62fc2a612f3503437fdf93cad692d216b8cf90bbb0538c47dd8", - "8b6a72138d69fbbd2fea3fa251cabd87152e4f1c97e5f986bf685571db3cc0", - "c1007c5b7114abec734206d4fc613da4f3a0e99f71ff949cedadc99079135a0b", - "fa06cb0c471c1c9bc169af270cd466ea701946776056e472ecdaeb49f0f4a4dc", - "a435164c05cea299a3f016bbbed05706ebb720dac912ce4351c2296626aecd9a" - }; - private static int floorTime = 7; - private int floorLevelTo = -1; - private int floorLevelToXP = -1; + } + } + yIndex++; + } + } private void calculateFloorLevelXP() { JsonObject leveling = Constants.LEVELING; @@ -1016,27 +1308,12 @@ public class GuiProfileViewer extends GuiScreen { if (remaining < 0) { remaining = 0; } - floorLevelToXP = (int) remaining; + floorLevelToXP = (long) remaining; } catch (Exception e) { dungeonLevelTextField.setCustomBorderColour(0xffff0000); } } - private static final LinkedHashMap dungeonsModeIcons = new LinkedHashMap() {{ - put( - "catacombs", - Utils.editItemStackInfo(NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager - .getItemInformation() - .get("DUNGEON_STONE")), EnumChatFormatting.GRAY + "Normal Mode", true) - ); - put( - "master_catacombs", - Utils.editItemStackInfo(NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager - .getItemInformation() - .get("MASTER_SKULL_TIER_7")), EnumChatFormatting.GRAY + "Master Mode", true) - ); - }}; - private void drawDungPage(int mouseX, int mouseY, float partialTicks) { Minecraft.getMinecraft().getTextureManager().bindTexture(pv_dung); Utils.drawTexturedRect(guiLeft, guiTop, sizeX, sizeY, GL11.GL_NEAREST); @@ -1067,7 +1344,7 @@ public class GuiProfileViewer extends GuiScreen { "dungeons.dungeon_types.catacombs.experience" ), 0); levelObjCata = ProfileViewer.getLevel(Utils.getElement(leveling, "catacombs").getAsJsonArray(), - cataXp, 50, false + cataXp, 99, false ); levelObjCata.totalXp = cataXp; levelObjCatas.put(profileId, levelObjCata); @@ -1570,8 +1847,6 @@ public class GuiProfileViewer extends GuiScreen { //drawSideButton(2, dungeonsModeIcons.get("catacombs"), false); } - private boolean onMasterMode = false; - //TODO: improve this shit private void drawSideButtons() { // GlStateManager.pushMatrix(); @@ -1688,150 +1963,14 @@ public class GuiProfileViewer extends GuiScreen { GL11.glTranslatef(-(x), -(y - 6f), 0); } - public static class PetLevel { - public float level; - public float currentLevelRequirement; - public float maxXP; - public float levelPercentage; - public float levelXp; - public float totalXp; - } - - private static JsonObject getPetInfo(String pet_name, String rarity) { - JsonObject petInfo = new JsonObject(); - //System.out.println(pet_name); - //System.out.println(rarity); - - if (Constants.PETS.has("custom_pet_leveling") && - Constants.PETS.getAsJsonObject("custom_pet_leveling").has(pet_name)) { - JsonObject pet = Constants.PETS.getAsJsonObject("custom_pet_leveling").getAsJsonObject(pet_name); - if (pet.has("type") && pet.has("pet_levels")) { - int type = pet.get("type").getAsInt(); - switch (type) { - case 1: - JsonArray defaultLevels = Constants.PETS.getAsJsonArray("pet_levels"); - defaultLevels.addAll(pet.getAsJsonArray("pet_levels")); - petInfo.add("pet_levels", Constants.PETS.getAsJsonArray("pet_levels")); - break; - case 2: - petInfo.add("pet_levels", pet.getAsJsonArray("pet_levels")); - break; - default: - petInfo.add("pet_levels", Constants.PETS.getAsJsonArray("pet_levels")); - break; - } - } else { - petInfo.add("pet_levels", Constants.PETS.getAsJsonArray("pet_levels")); - } - if (pet.has("max_level")) { - petInfo.add("max_level", pet.get("max_level")); - } else { - petInfo.add("max_level", new JsonPrimitive(100)); - } - - if (pet.has("pet_rarity_offset")) { - petInfo.add("offset", pet.get("pet_rarity_offset")); - } else { - petInfo.add("offset", Constants.PETS.getAsJsonObject("pet_rarity_offset").get(rarity)); - } - - } else { - //System.out.println("Default Path"); - petInfo.add("offset", Constants.PETS.getAsJsonObject("pet_rarity_offset").get(rarity)); - petInfo.add("max_level", new JsonPrimitive(100)); - petInfo.add("pet_levels", Constants.PETS.getAsJsonArray("pet_levels")); - } - - return petInfo; - - } - - public static PetLevel getPetLevel(String pet_name, String rarity, float exp) { - JsonObject petInfo = getPetInfo(pet_name, rarity); - int offset = petInfo.get("offset").getAsInt(); - int maxPetLevel = petInfo.get("max_level").getAsInt(); - JsonArray levels = petInfo.getAsJsonArray("pet_levels"); - - float xpTotal = 0; - float level = 1; - float currentLevelRequirement = 0; - float currentLevelProgress = 0; - - boolean addLevel = true; - - for (int i = offset; i < offset + maxPetLevel - 1; i++) { - if (addLevel) { - currentLevelRequirement = levels.get(i).getAsFloat(); - xpTotal += currentLevelRequirement; - if (xpTotal > exp) { - currentLevelProgress = (exp - (xpTotal - currentLevelRequirement)); - addLevel = false; - } else { - level += 1; - } - } else { - - xpTotal += levels.get(i).getAsFloat(); - - } - } - - level += currentLevelProgress / currentLevelRequirement; - if (level <= 0) { - level = 1; - } else if (level > maxPetLevel) { - level = maxPetLevel; - } - PetLevel levelObj = new PetLevel(); - levelObj.level = level; - levelObj.currentLevelRequirement = currentLevelRequirement; - levelObj.maxXP = xpTotal; - levelObj.levelPercentage = currentLevelProgress / currentLevelRequirement; - levelObj.levelXp = currentLevelProgress; - levelObj.totalXp = exp; - return levelObj; + private ItemStack getQuestionmarkSkull() { + return Utils.createSkull( + EnumChatFormatting.RED + "Unknown Pet", + "Unknown Pet", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmM4ZWExZjUxZjI1M2ZmNTE0MmNhMTFhZTQ1MTkzYTRhZDhjM2FiNWU5YzZlZWM4YmE3YTRmY2I3YmFjNDAifX19" + ); } - public static final HashMap> PET_STAT_BOOSTS = - new HashMap>() {{ - put("PET_ITEM_BIG_TEETH_COMMON", new HashMap() {{ - put("CRIT_CHANCE", 5f); - }}); - put("PET_ITEM_HARDENED_SCALES_UNCOMMON", new HashMap() {{ - put("DEFENCE", 25f); - }}); - put("PET_ITEM_LUCKY_CLOVER", new HashMap() {{ - put("MAGIC_FIND", 7f); - }}); - put("PET_ITEM_SHARPENED_CLAWS_UNCOMMON", new HashMap() {{ - put("CRIT_DAMAGE", 15f); - }}); - }}; - - public static final HashMap> PET_STAT_BOOSTS_MULT = - new HashMap>() {{ - put("PET_ITEM_IRON_CLAWS_COMMON", new HashMap() {{ - put("CRIT_DAMAGE", 1.4f); - put("CRIT_CHANCE", 1.4f); - }}); - put("PET_ITEM_TEXTBOOK", new HashMap() {{ - put("INTELLIGENCE", 2f); - }}); - }}; - - private int selectedPet = -1; - private int petsPage = 0; - private List sortedPets = null; - private List sortedPetsStack = null; - public static HashMap MINION_RARITY_TO_NUM = new HashMap() {{ - put("COMMON", "0"); - put("UNCOMMON", "1"); - put("RARE", "2"); - put("EPIC", "3"); - put("LEGENDARY", "4"); - put("MYTHIC", "5"); - }}; - private void drawPetsPage(int mouseX, int mouseY, float partialTicks) { JsonObject petsInfo = profile.getPetsInfo(profileId); if (petsInfo == null) return; @@ -1908,121 +2047,148 @@ public class GuiProfileViewer extends GuiScreen { pet.addProperty("maxXP", maxXP); JsonObject petItem = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(petname + ";" + tierNum); - if (petItem == null) continue; - - ItemStack stack = NotEnoughUpdates.INSTANCE.manager.jsonToStack(petItem, false, false); - HashMap replacements = - NotEnoughUpdates.INSTANCE.manager.getLoreReplacements(petname, tier, (int) Math.floor(level)); - - if (heldItem != null) { - HashMap petStatBoots = PET_STAT_BOOSTS.get(heldItem); - HashMap petStatBootsMult = PET_STAT_BOOSTS_MULT.get(heldItem); - if (petStatBoots != null) { - for (Map.Entry entryBoost : petStatBoots.entrySet()) { - try { - float value = Float.parseFloat(replacements.get(entryBoost.getKey())); - replacements.put(entryBoost.getKey(), String.valueOf((int) Math.floor(value + entryBoost.getValue()))); - } catch (Exception ignored) { + ItemStack stack; + if (petItem == null) { + stack = getQuestionmarkSkull(); + HashMap replacements = new HashMap<>(); + NBTTagCompound display = new NBTTagCompound(); + if (stack.getTagCompound() != null && stack.getTagCompound().hasKey("display")) { + display = stack.getTagCompound().getCompoundTag("display"); + } + NBTTagList lore = new NBTTagList(); + lore.appendTag(new NBTTagString(EnumChatFormatting.RED + "This pet is not saved in the repository")); + lore.appendTag(new NBTTagString("")); + lore.appendTag(new NBTTagString( + EnumChatFormatting.RED + "If you expected it to be there please send a message in")); + lore.appendTag(new NBTTagString(EnumChatFormatting.RED.toString() + + EnumChatFormatting.BOLD + "#neu-support " + EnumChatFormatting.RESET + EnumChatFormatting.RED + "on " + + EnumChatFormatting.BOLD + "discord.gg/moulberry")); + + display.setTag("Lore", lore); + NBTTagCompound tag = stack.getTagCompound() != null ? stack.getTagCompound() : new NBTTagCompound(); + tag.setTag("display", display); + stack.setTagCompound(tag); + } else { + stack = NotEnoughUpdates.INSTANCE.manager.jsonToStack(petItem, false, false); + HashMap replacements = + NotEnoughUpdates.INSTANCE.manager.getLoreReplacements(petname, tier, (int) Math.floor(level)); + + if (heldItem != null) { + HashMap petStatBoots = PET_STAT_BOOSTS.get(heldItem); + HashMap petStatBootsMult = PET_STAT_BOOSTS_MULT.get(heldItem); + if (petStatBoots != null) { + for (Map.Entry entryBoost : petStatBoots.entrySet()) { + try { + float value = Float.parseFloat(replacements.get(entryBoost.getKey())); + replacements.put( + entryBoost.getKey(), + String.valueOf((int) Math.floor(value + entryBoost.getValue())) + ); + } catch (Exception ignored) { + } } - } - } - if (petStatBootsMult != null) { - for (Map.Entry entryBoost : petStatBootsMult.entrySet()) { - try { - float value = Float.parseFloat(replacements.get(entryBoost.getKey())); - replacements.put(entryBoost.getKey(), String.valueOf((int) Math.floor(value * entryBoost.getValue()))); - } catch (Exception ignored) { + } + if (petStatBootsMult != null) { + for (Map.Entry entryBoost : petStatBootsMult.entrySet()) { + try { + float value = Float.parseFloat(replacements.get(entryBoost.getKey())); + replacements.put( + entryBoost.getKey(), + String.valueOf((int) Math.floor(value * entryBoost.getValue())) + ); + } catch (Exception ignored) { + } } } } - } - NBTTagCompound tag = stack.getTagCompound() == null ? new NBTTagCompound() : stack.getTagCompound(); - if (tag.hasKey("display", 10)) { - NBTTagCompound display = tag.getCompoundTag("display"); - if (display.hasKey("Lore", 9)) { - NBTTagList newLore = new NBTTagList(); - NBTTagList lore = display.getTagList("Lore", 8); - HashMap blankLocations = new HashMap<>(); - for (int j = 0; j < lore.tagCount(); j++) { - String line = lore.getStringTagAt(j); - if (line.trim().isEmpty()) { - blankLocations.put(blankLocations.size(), j); - } - for (Map.Entry replacement : replacements.entrySet()) { - line = line.replace("{" + replacement.getKey() + "}", replacement.getValue()); + NBTTagCompound tag = stack.getTagCompound() == null ? new NBTTagCompound() : stack.getTagCompound(); + if (tag.hasKey("display", 10)) { + NBTTagCompound display = tag.getCompoundTag("display"); + if (display.hasKey("Lore", 9)) { + NBTTagList newLore = new NBTTagList(); + NBTTagList lore = display.getTagList("Lore", 8); + HashMap blankLocations = new HashMap<>(); + for (int j = 0; j < lore.tagCount(); j++) { + String line = lore.getStringTagAt(j); + if (line.trim().isEmpty()) { + blankLocations.put(blankLocations.size(), j); + } + for (Map.Entry replacement : replacements.entrySet()) { + line = line.replace("{" + replacement.getKey() + "}", replacement.getValue()); + } + newLore.appendTag(new NBTTagString(line)); } - newLore.appendTag(new NBTTagString(line)); - } - Integer secondLastBlank = blankLocations.get(blankLocations.size() - 2); - if (skin != null) { - JsonObject petSkin = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get("PET_SKIN_" + skin); - if (petSkin != null) { - try { - NBTTagCompound nbt = JsonToNBT.getTagFromJson(petSkin.get("nbttag").getAsString()); - tag.setTag("SkullOwner", nbt.getTag("SkullOwner")); - String name = petSkin.get("displayname").getAsString(); - if (name != null) { - name = Utils.cleanColour(name); - newLore.set(0, new NBTTagString(newLore.get(0).toString().replace("\"", "") + ", " + name)); + Integer secondLastBlank = blankLocations.get(blankLocations.size() - 2); + if (skin != null) { + JsonObject petSkin = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get("PET_SKIN_" + skin); + if (petSkin != null) { + try { + NBTTagCompound nbt = JsonToNBT.getTagFromJson(petSkin.get("nbttag").getAsString()); + tag.setTag("SkullOwner", nbt.getTag("SkullOwner")); + String name = petSkin.get("displayname").getAsString(); + if (name != null) { + name = Utils.cleanColour(name); + newLore.set(0, new NBTTagString(newLore.get(0).toString().replace("\"", "") + ", " + name)); + } + } catch (NBTException e) { + e.printStackTrace(); } - } catch (NBTException e) { - e.printStackTrace(); } } - } - for (int i = 0; i < newLore.tagCount(); i++) { - String cleaned = Utils.cleanColour(newLore.get(i).toString()); - if (cleaned.equals("\"Right-click to add this pet to\"")) { - newLore.removeTag(i + 1); - newLore.removeTag(i); - secondLastBlank = i - 1; - break; + for (int i = 0; i < newLore.tagCount(); i++) { + String cleaned = Utils.cleanColour(newLore.get(i).toString()); + if (cleaned.equals("\"Right-click to add this pet to\"")) { + newLore.removeTag(i + 1); + newLore.removeTag(i); + secondLastBlank = i - 1; + break; + } } - } - NBTTagList temp = new NBTTagList(); - for (int i = 0; i < newLore.tagCount(); i++) { - temp.appendTag(newLore.get(i)); - if (secondLastBlank != null && i == secondLastBlank) { - if (heldItem != null) { - temp.appendTag(new NBTTagString( - EnumChatFormatting.GOLD + "Held Item: " + heldItemJson.get("displayname").getAsString())); - int blanks = 0; - JsonArray heldItemLore = heldItemJson.get("lore").getAsJsonArray(); - for (int k = 0; k < heldItemLore.size(); k++) { - String heldItemLine = heldItemLore.get(k).getAsString(); - if (heldItemLine.trim().isEmpty()) { - blanks++; - } else if (blanks == 2) { - temp.appendTag(new NBTTagString(heldItemLine)); - } else if (blanks > 2) { - break; + NBTTagList temp = new NBTTagList(); + for (int i = 0; i < newLore.tagCount(); i++) { + temp.appendTag(newLore.get(i)); + if (secondLastBlank != null && i == secondLastBlank) { + if (heldItem != null) { + temp.appendTag(new NBTTagString( + EnumChatFormatting.GOLD + "Held Item: " + heldItemJson.get("displayname").getAsString())); + int blanks = 0; + JsonArray heldItemLore = heldItemJson.get("lore").getAsJsonArray(); + for (int k = 0; k < heldItemLore.size(); k++) { + String heldItemLine = heldItemLore.get(k).getAsString(); + if (heldItemLine.trim().isEmpty()) { + blanks++; + } else if (blanks == 2) { + temp.appendTag(new NBTTagString(heldItemLine)); + } else if (blanks > 2) { + break; + } } + temp.appendTag(new NBTTagString()); } - temp.appendTag(new NBTTagString()); - } - if (candy != 0) { - temp.appendTag(new NBTTagString(EnumChatFormatting.GREEN + "(" + candy + "/10) Pet Candy Used")); - temp.appendTag(new NBTTagString()); + if (candy != 0) { + temp.appendTag(new NBTTagString(EnumChatFormatting.GREEN + "(" + candy + "/10) Pet Candy Used")); + temp.appendTag(new NBTTagString()); + } + temp.removeTag(temp.tagCount() - 1); } - temp.removeTag(temp.tagCount() - 1); } + newLore = temp; + display.setTag("Lore", newLore); } - newLore = temp; - display.setTag("Lore", newLore); - } - if (display.hasKey("Name", 8)) { - String displayName = display.getString("Name"); - for (Map.Entry replacement : replacements.entrySet()) { - displayName = displayName.replace("{" + replacement.getKey() + "}", replacement.getValue()); + if (display.hasKey("Name", 8)) { + String displayName = display.getString("Name"); + for (Map.Entry replacement : replacements.entrySet()) { + displayName = displayName.replace("{" + replacement.getKey() + "}", replacement.getValue()); + } + display.setTag("Name", new NBTTagString(displayName)); } - display.setTag("Name", new NBTTagString(displayName)); + tag.setTag("display", display); } - tag.setTag("display", display); - } - stack.setTagCompound(tag); + stack.setTagCompound(tag); + } sortedPetsStack.add(stack); } } @@ -2113,7 +2279,12 @@ public class GuiProfileViewer extends GuiScreen { } if (selectedPet >= 0) { - ItemStack petStack = sortedPetsStack.get(selectedPet); + ItemStack petStack; + if (sortedPetsStack.size() <= selectedPet) { + petStack = getQuestionmarkSkull(); + } else { + petStack = sortedPetsStack.get(selectedPet); + } String display = petStack.getDisplayName(); JsonObject pet = sortedPets.get(selectedPet); @@ -2198,16 +2369,6 @@ public class GuiProfileViewer extends GuiScreen { } } - private final String[] romans = new String[]{ - "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", - "XII", "XIII", "XIV", "XV", "XVI", "XVII", "XIX", "XX" - }; - - private final int COLLS_XCOUNT = 5; - private final int COLLS_YCOUNT = 4; - private final float COLLS_XPADDING = (190 - COLLS_XCOUNT * 20) / (float) (COLLS_XCOUNT + 1); - private final float COLLS_YPADDING = (202 - COLLS_YCOUNT * 20) / (float) (COLLS_YCOUNT + 1); - private void drawColsPage(int mouseX, int mouseY, float partialTicks) { Minecraft.getMinecraft().getTextureManager().bindTexture(pv_cols); Utils.drawTexturedRect(guiLeft, guiTop, sizeX, sizeY, GL11.GL_NEAREST); @@ -2434,34 +2595,6 @@ public class GuiProfileViewer extends GuiScreen { //190 } - private static final LinkedHashMap invNameToDisplayMap = new LinkedHashMap() {{ - put( - "inv_contents", - Utils.createItemStack(Item.getItemFromBlock(Blocks.chest), EnumChatFormatting.GRAY + "Inventory") - ); - put( - "ender_chest_contents", - Utils.createItemStack(Item.getItemFromBlock(Blocks.ender_chest), EnumChatFormatting.GRAY + "Ender Chest") - ); - // put("backpack_contents", Utils.createItemStack(Item.getItemFromBlock(Blocks.dropper), EnumChatFormatting.GRAY+"Backpacks")); - put( - "backpack_contents", - Utils.editItemStackInfo(NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager - .getItemInformation() - .get("JUMBO_BACKPACK")), EnumChatFormatting.GRAY + "Backpacks", true) - ); - put( - "personal_vault_contents", - Utils.editItemStackInfo(NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager - .getItemInformation() - .get("IRON_CHEST")), EnumChatFormatting.GRAY + "Personal vault", true) - ); - put("talisman_bag", Utils.createItemStack(Items.golden_apple, EnumChatFormatting.GRAY + "Accessory Bag")); - put("wardrobe_contents", Utils.createItemStack(Items.leather_chestplate, EnumChatFormatting.GRAY + "Wardrobe")); - put("fishing_bag", Utils.createItemStack(Items.fish, EnumChatFormatting.GRAY + "Fishing Bag")); - put("potion_bag", Utils.createItemStack(Items.potionitem, EnumChatFormatting.GRAY + "Potion Bag")); - }}; - public int countItemsInInventory( String internalname, JsonObject inventoryInfo, @@ -2487,10 +2620,6 @@ public class GuiProfileViewer extends GuiScreen { return count; } - private static final Pattern DAMAGE_PATTERN = Pattern.compile("^Damage: \\+([0-9]+)"); - private static final Pattern STRENGTH_PATTERN = Pattern.compile("^Strength: \\+([0-9]+)"); - private static final Pattern FISHSPEED_PATTERN = Pattern.compile("^Increases fishing speed by \\+([0-9]+)"); - private ItemStack[] findBestItems( JsonObject inventoryInfo, int numItems, @@ -2568,8 +2697,6 @@ public class GuiProfileViewer extends GuiScreen { return 0; } - private final ItemStack fillerStack = new ItemStack(Item.getItemFromBlock(Blocks.stained_glass_pane), 1, 15); - public ItemStack[][][] getItemsForInventory(JsonObject inventoryInfo, String invName) { if (inventoryItems.containsKey(invName)) return inventoryItems.get(invName); @@ -2681,20 +2808,6 @@ public class GuiProfileViewer extends GuiScreen { return inventories; } - private ItemStack[] bestWeapons = null; - private ItemStack[] bestRods = null; - private ItemStack[] armorItems = null; - private HashMap inventoryItems = new HashMap<>(); - private String selectedInventory = "inv_contents"; - private int currentInventoryIndex = 0; - private int arrowCount = -1; - private int greenCandyCount = -1; - private int purpleCandyCount = -1; - private final GuiElementTextField inventoryTextField = new GuiElementTextField("", GuiElementTextField.SCALE_TEXT); - private ItemStack lastBackpack; - private int lastBackpackX; - private int lastBackpackY; - private void drawInvsPage(int mouseX, int mouseY, float partialTicks) { Minecraft.getMinecraft().getTextureManager().bindTexture(pv_invs); Utils.drawTexturedRect(guiLeft, guiTop, sizeX, sizeY, GL11.GL_NEAREST); @@ -2973,13 +3086,6 @@ public class GuiProfileViewer extends GuiScreen { return entityPlayer; } - private EntityOtherPlayerMP entityPlayer = null; - private ResourceLocation playerLocationSkin = null; - private ResourceLocation playerLocationCape = null; - private String skinType = null; - - private final HashMap panoramasMap = new HashMap<>(); - public ResourceLocation[] getPanoramasForLocation(String location, String identifier) { if (panoramasMap.containsKey(location + identifier)) return panoramasMap.get(location + identifier); try { @@ -3012,9 +3118,6 @@ public class GuiProfileViewer extends GuiScreen { } } - private TreeMap> topKills = null; - private TreeMap> topDeaths = null; - private void drawExtraPage(int mouseX, int mouseY, float partialTicks) { FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; @@ -3686,7 +3789,17 @@ public class GuiProfileViewer extends GuiScreen { (int) (guiTop + yStartTop + 138), mouseX, mouseY, - () -> Lists.newArrayList( + () -> miningSpeed != 50 && miningSpeed != 0 ? Lists.newArrayList( + "Mining Speed", + EnumChatFormatting.GRAY + "Level " + miningSpeed + EnumChatFormatting.DARK_GRAY + "/50", + "", + EnumChatFormatting.GRAY + "Grants " + EnumChatFormatting.GREEN + "+" + miningSpeedStat + + EnumChatFormatting.GOLD + " ⸕ Mining", + EnumChatFormatting.GOLD + "Speed" + EnumChatFormatting.GRAY + ".", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.DARK_GREEN + "" + (int) Math.pow(miningSpeed + 2, 3) + " Mithril Powder" + ) : Lists.newArrayList( "Mining Speed", EnumChatFormatting.GRAY + "Level " + miningSpeed + EnumChatFormatting.DARK_GRAY + "/50", "", @@ -3701,7 +3814,17 @@ public class GuiProfileViewer extends GuiScreen { miningFortune, (int) (guiLeft + xStart + 255), (int) (guiTop + yStartTop + 114), mouseX, mouseY, - () -> Lists.newArrayList( + () -> miningFortune != 0 && miningFortune != 50 ? Lists.newArrayList( + "Mining Fortune", + EnumChatFormatting.GRAY + "Level " + miningFortune + EnumChatFormatting.DARK_GRAY + "/50", + "", + EnumChatFormatting.GRAY + "Grants " + EnumChatFormatting.GREEN + "+" + miningFortuneStat + + EnumChatFormatting.GOLD + " ☘ Mining", + EnumChatFormatting.GOLD + "Fortune" + EnumChatFormatting.GRAY + ".", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.DARK_GREEN + "" + (int) Math.pow(miningFortune + 2, 3.05) + " Mithril Powder" + ) : Lists.newArrayList( "Mining Fortune", EnumChatFormatting.GRAY + "Level " + miningFortune + EnumChatFormatting.DARK_GRAY + "/50", "", @@ -3716,7 +3839,19 @@ public class GuiProfileViewer extends GuiScreen { tittyInsane, (int) (guiLeft + xStart + 231), (int) (guiTop + yStartTop + 114), mouseX, mouseY, - () -> Lists.newArrayList( + () -> tittyInsane != 0 && tittyInsane != 50 ? Lists.newArrayList( + "Titanium Insanium", + EnumChatFormatting.GRAY + "Level " + tittyInsane + EnumChatFormatting.DARK_GRAY + "/50", + "", + EnumChatFormatting.GRAY + "When mining Mithril Ore, you", + EnumChatFormatting.GRAY + "have a " + EnumChatFormatting.GREEN + tittyInsaneStat + "% " + + EnumChatFormatting.GRAY + "chance to", + EnumChatFormatting.GRAY + "convert the block into Titanium", + EnumChatFormatting.GRAY + "Ore.", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.DARK_GREEN + "" + (int) Math.pow(tittyInsane + 2, 3.1) + " Mithril Powder" + ) : Lists.newArrayList( "Titanium Insanium", EnumChatFormatting.GRAY + "Level " + tittyInsane + EnumChatFormatting.DARK_GRAY + "/50", "", @@ -3771,7 +3906,17 @@ public class GuiProfileViewer extends GuiScreen { luckofcave, (int) (guiLeft + xStart + 207), (int) (guiTop + yStartTop + 90), mouseX, mouseY, - () -> Lists.newArrayList( + () -> luckofcave != 0 && luckofcave != 45 ? Lists.newArrayList( + "Luck of the Cave", + "§7Level " + luckofcave + EnumChatFormatting.DARK_GRAY + "/45", + "", + "§7Increases the chance for you to", + "§7trigger rare occurrences im", + "§2Dwarven Mines " + EnumChatFormatting.GRAY + "by " + EnumChatFormatting.GREEN + luckofcaveStat + "%§7.", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.DARK_GREEN + "" + (int) Math.pow(luckofcave + 2, 3.07) + " Mithril Powder" + ) : Lists.newArrayList( "Luck of the Cave", "§7Level " + luckofcave + EnumChatFormatting.DARK_GRAY + "/45", "", @@ -3786,7 +3931,18 @@ public class GuiProfileViewer extends GuiScreen { dailyPowder, (int) (guiLeft + xStart + 255), (int) (guiTop + yStartTop + 90), mouseX, mouseY, - () -> Lists.newArrayList( + () -> dailyPowder != 0 && dailyPowder != 100 ? Lists.newArrayList( + "Daily Powder", + EnumChatFormatting.GRAY + "Level " + dailyPowder + EnumChatFormatting.DARK_GRAY + "/100", + "", + EnumChatFormatting.GRAY + "Gains " + EnumChatFormatting.GREEN + dailyPowderStat + " Powder" + + EnumChatFormatting.GRAY + " from the", + EnumChatFormatting.GRAY + "first ore you mine every day.", + EnumChatFormatting.GRAY + "Works for all Powder types.", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.DARK_GREEN + "" + (200 + ((dailyPowder) * 18)) + " Mithril Powder" + ) : Lists.newArrayList( "Daily Powder", EnumChatFormatting.GRAY + "Level " + dailyPowder + EnumChatFormatting.DARK_GRAY + "/100", "", @@ -3803,7 +3959,18 @@ public class GuiProfileViewer extends GuiScreen { effMiner, (int) (guiLeft + xStart + 255), (int) (guiTop + yStartTop + 66), mouseX, mouseY, - () -> Lists.newArrayList( + () -> effMiner != 0 && effMiner != 100 ? Lists.newArrayList( + "Efficient Miner", + EnumChatFormatting.GRAY + "Level " + effMiner + EnumChatFormatting.DARK_GRAY + "/100", + "", + EnumChatFormatting.GRAY + "When mining ores, you have a", + EnumChatFormatting.GREEN + "" + effMinerStat + "%" + EnumChatFormatting.GRAY + " chance to mine " + + EnumChatFormatting.GREEN + Math.round(finalEffMinerStat2), + EnumChatFormatting.GRAY + "adjacent ores.", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.DARK_GREEN + "" + (int) Math.pow(effMiner + 2, 2.6) + " Mithril Powder" + ) : Lists.newArrayList( "Efficient Miner", EnumChatFormatting.GRAY + "Level " + effMiner + EnumChatFormatting.DARK_GRAY + "/100", "", @@ -3824,7 +3991,10 @@ public class GuiProfileViewer extends GuiScreen { case 0: return Lists.newArrayList( EnumChatFormatting.RED + "Peak of the Mountain", - EnumChatFormatting.GRAY + "Level " + potm + EnumChatFormatting.DARK_GRAY + "/5" + EnumChatFormatting.GRAY + "Level " + potm + EnumChatFormatting.DARK_GRAY + "/5", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.DARK_GREEN + "50000 Mithril Powder" ); case 1: return Lists.newArrayList( @@ -3832,7 +4002,10 @@ public class GuiProfileViewer extends GuiScreen { EnumChatFormatting.GRAY + "Level " + potm + EnumChatFormatting.DARK_GRAY + "/5", "", "§7§8+§c1 Pickaxe Ability Level", - "§7§8+§51 Token of the Mountain" + "§7§8+§51 Token of the Mountain", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.DARK_GREEN + "50000 Mithril Powder" ); case 2: return Lists.newArrayList( @@ -3841,7 +4014,10 @@ public class GuiProfileViewer extends GuiScreen { "", "§7§8+§c1 Pickaxe Ability Level", "§7§8+§51 Token of the Mountain", - "§7§8+§a1 Forge Slot" + "§7§8+§a1 Forge Slot", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.DARK_GREEN + "75000 Mithril Powder" ); case 3: return Lists.newArrayList( @@ -3851,7 +4027,10 @@ public class GuiProfileViewer extends GuiScreen { "§7§8+§c1 Pickaxe Ability Level", "§7§8+§51 Token of the Mountain", "§7§8+§a1 Forge Slot", - "§7§8+§a1 Commission Slot" + "§7§8+§a1 Commission Slot", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.DARK_GREEN + "100000 Mithril Powder" ); case 4: return Lists.newArrayList( @@ -3863,7 +4042,10 @@ public class GuiProfileViewer extends GuiScreen { "§7§8+§a1 Forge Slot", "§7§8+§a1 Commission Slot", "§7§8+§21 Mithril Powder §7when", - "§7mining §fMithril" + "§7mining §fMithril", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.DARK_GREEN + "125000 Mithril Powder" ); case 5: return Lists.newArrayList( @@ -3890,7 +4072,19 @@ public class GuiProfileViewer extends GuiScreen { mole, (int) (guiLeft + xStart + 255), (int) (guiTop + yStartTop + 18), mouseX, mouseY, - () -> Lists.newArrayList( + () -> mole != 0 && mole != 190 ? Lists.newArrayList( + "Mole", + EnumChatFormatting.GRAY + "Level " + mole + EnumChatFormatting.DARK_GRAY + "/190", + "", + EnumChatFormatting.GRAY + "When mining hard stone, you have", + EnumChatFormatting.GRAY + "a " + EnumChatFormatting.GREEN + finalOutput + "% " + EnumChatFormatting.GRAY + + "chance to mine " + EnumChatFormatting.GREEN, + EnumChatFormatting.GREEN + "" + Math.round(moleStat) + EnumChatFormatting.GRAY + " adjacent hard stone block" + + (moleStat == 1.0 ? "." : "s."), + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.LIGHT_PURPLE + "" + (int) Math.pow(mole + 2, 2.2) + " Gemstone Powder" + ) : Lists.newArrayList( "Mole", EnumChatFormatting.GRAY + "Level " + mole + EnumChatFormatting.DARK_GRAY + "/190", "", @@ -3907,7 +4101,17 @@ public class GuiProfileViewer extends GuiScreen { powderBuff, (int) (guiLeft + xStart + 255), (int) (guiTop + yStartTop - 6), mouseX, mouseY, - () -> Lists.newArrayList( + () -> powderBuff != 0 && powderBuff != 50 ? Lists.newArrayList( + "Powder Buff", + EnumChatFormatting.GRAY + "Level " + powderBuff + EnumChatFormatting.DARK_GRAY + "/50", + "", + EnumChatFormatting.GRAY + "Gain " + EnumChatFormatting.GREEN + powderBuff + "% " + EnumChatFormatting.GRAY + + "more Mithril", + EnumChatFormatting.GRAY + "Powder and Gemstone Powder§7.", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.LIGHT_PURPLE + "" + (int) Math.pow(powderBuff + 2, 3.2) + " Gemstone Powder" + ) : Lists.newArrayList( "Powder Buff", EnumChatFormatting.GRAY + "Level " + powderBuff + EnumChatFormatting.DARK_GRAY + "/50", "", @@ -3960,7 +4164,16 @@ public class GuiProfileViewer extends GuiScreen { seasonMine, (int) (guiLeft + xStart + 231), (int) (guiTop + yStartTop + 66), mouseX, mouseY, - () -> Lists.newArrayList( + () -> seasonMine != 0 && seasonMine != 100 ? Lists.newArrayList( + "Seasoned Mineman", + "§7Level " + seasonMine + "§8/100", + "", + "§7Increases your Mining", + "§7experience gain by " + EnumChatFormatting.GREEN + seasonMineStat + "%§7.", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.DARK_GREEN + "" + (int) Math.pow(seasonMine + 2, 2.3) + " Mithril Powder" + ) : Lists.newArrayList( "Seasoned Mineman", "§7Level " + seasonMine + "§8/100", "", @@ -3986,7 +4199,7 @@ public class GuiProfileViewer extends GuiScreen { lonesomeMiner, (int) (guiLeft + xStart + 207), (int) (guiTop + yStartTop + 18), mouseX, mouseY, - () -> Lists.newArrayList( + () -> lonesomeMiner != 0 && lonesomeMiner != 45 ? Lists.newArrayList( "Lonesome Miner", "§7Level " + lonesomeMiner + EnumChatFormatting.DARK_GRAY + "/45", "", @@ -3994,7 +4207,18 @@ public class GuiProfileViewer extends GuiScreen { "§9Chance, §9☠ Crit Damage, §a❈", "§aDefense, and §c❤ Health", "§c§7statistics gain by " + EnumChatFormatting.GREEN + lonesomeMinerStat + "%§7", - "§7while in the Crystal Hollows." + "§7while in the Crystal Hollows.", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.LIGHT_PURPLE + "" + (int) Math.pow(lonesomeMiner + 2, 3.07) + " Gemstone Powder" + ) : Lists.newArrayList( + "Lonesome Miner", + "§7Level " + lonesomeMiner + EnumChatFormatting.DARK_GRAY + "/45", + "", + "§7Increases §c❁ Strength, §9☣ Crit", + "§9Chance, §9☠ Crit Damage, §a❈", + "§aDefense, and §c❤ Health", + "§c§7statistics gain by " + EnumChatFormatting.GREEN + lonesomeMinerStat + "%§7" ), 45 ); @@ -4003,7 +4227,16 @@ public class GuiProfileViewer extends GuiScreen { professional, (int) (guiLeft + xStart + 231), (int) (guiTop + yStartTop + 18), mouseX, mouseY, - () -> Lists.newArrayList( + () -> professional != 0 && professional != 140 ? Lists.newArrayList( + "Professional", + "§7Level " + professional + EnumChatFormatting.DARK_GRAY + "/140", + "", + "§7Gain §a+" + professionalStat + "§6 ⸕ Mining", + "§6Speed§7 when mining Gemstones.", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.LIGHT_PURPLE + "" + (int) Math.pow(professional + 2, 2.3) + " Gemstone Powder" + ) : Lists.newArrayList( "Professional", "§7Level " + professional + EnumChatFormatting.DARK_GRAY + "/140", "", @@ -4017,7 +4250,16 @@ public class GuiProfileViewer extends GuiScreen { miningSpeed2, (int) (guiLeft + xStart + 207), (int) (guiTop + yStartTop - 6), mouseX, mouseY, - () -> Lists.newArrayList( + () -> miningSpeed2 != 0 && miningSpeed2 != 50 ? Lists.newArrayList( + "Mining Speed 2", + "§7Level " + miningSpeed2 + EnumChatFormatting.DARK_GRAY + "/50", + "", + "§7Grants " + EnumChatFormatting.GREEN + "+" + miningSpeed2Stat + EnumChatFormatting.GOLD + " ⸕ Mining", + "§6Speed§7.", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.LIGHT_PURPLE + "" + (int) Math.pow(miningSpeed2 + 2, 3.2) + " Gemstone Powder" + ) : Lists.newArrayList( "Mining Speed 2", "§7Level " + miningSpeed2 + EnumChatFormatting.DARK_GRAY + "/50", "", @@ -4031,7 +4273,16 @@ public class GuiProfileViewer extends GuiScreen { quickForge, (int) (guiLeft + xStart + 279), (int) (guiTop + yStartTop + 114), mouseX, mouseY, - () -> Lists.newArrayList( + () -> quickForge != 0 && quickForge != 20 ? Lists.newArrayList( + "Quick Forge", + "§7Level " + quickForge + EnumChatFormatting.DARK_GRAY + "/20", + "", + "§7Decreases the time it takes to", + "§7forge by §a" + (quickForgeStat < 20 ? quickForgeStat : 30) + "%§7.", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.DARK_GREEN + "" + (int) Math.pow(quickForge + 2, 4) + " Mithril Powder" + ) : Lists.newArrayList( "Quick Forge", "§7Level " + quickForge + EnumChatFormatting.DARK_GRAY + "/20", "", @@ -4045,7 +4296,16 @@ public class GuiProfileViewer extends GuiScreen { fortunate, (int) (guiLeft + xStart + 279), (int) (guiTop + yStartTop + 18), mouseX, mouseY, - () -> Lists.newArrayList( + () -> fortunate != 0 && fortunate != 20 ? Lists.newArrayList( + "Fortunate", + "§7Level " + fortunate + EnumChatFormatting.DARK_GRAY + "/20", + "", + "§7Gain " + EnumChatFormatting.GREEN + "+" + fortunateStat + " §6☘ Mining", + "§6Fortune§7 when mining Gemstone.", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.DARK_GREEN + "" + (int) Math.pow(fortunate + 2, 3.05) + " Mithril Powder" + ) : Lists.newArrayList( "Fortunate", "§7Level " + fortunate + EnumChatFormatting.DARK_GRAY + "/20", "", @@ -4059,7 +4319,16 @@ public class GuiProfileViewer extends GuiScreen { greatExplorer, (int) (guiLeft + xStart + 303), (int) (guiTop + yStartTop + 18), mouseX, mouseY, - () -> Lists.newArrayList( + () -> greatExplorer != 0 && greatExplorer != 20 ? Lists.newArrayList( + "Great Explorer", + "§7Level " + greatExplorer + EnumChatFormatting.DARK_GRAY + "/20", + "", + "§7Grants " + EnumChatFormatting.GREEN + "+" + greatExplorerStat + "% " + EnumChatFormatting.GRAY + "chance to", + "§7find treasure.", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.LIGHT_PURPLE + "" + (int) Math.pow(greatExplorer + 2, 4) + " Gemstone Powder" + ) : Lists.newArrayList( "Great Explorer", "§7Level " + greatExplorer + EnumChatFormatting.DARK_GRAY + "/20", "", @@ -4073,7 +4342,15 @@ public class GuiProfileViewer extends GuiScreen { miningFortune2, (int) (guiLeft + xStart + 303), (int) (guiTop + yStartTop - 6), mouseX, mouseY, - () -> Lists.newArrayList( + () -> miningFortune2 != 0 && miningFortune2 != 50 ? Lists.newArrayList( + "Mining Fortune 2", + "§7Level " + miningFortune2 + EnumChatFormatting.DARK_GRAY + "/50", + "", + "§7Grants §a+§a" + miningFortune2Stat + "§7 §6☘ Mining", "§6Fortune§7.", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.LIGHT_PURPLE + "" + (int) Math.pow(miningFortune2 + 2, 3.2) + " Gemstone Powder" + ) : Lists.newArrayList( "Mining Fortune 2", "§7Level " + miningFortune2 + EnumChatFormatting.DARK_GRAY + "/50", "", @@ -4086,7 +4363,17 @@ public class GuiProfileViewer extends GuiScreen { orbit, (int) (guiLeft + xStart + 279), (int) (guiTop + yStartTop + 66), mouseX, mouseY, - () -> Lists.newArrayList( + () -> orbit != 0 && orbit != 80 ? Lists.newArrayList( + "Orbiter", + "§7Level " + orbit + EnumChatFormatting.DARK_GRAY + "/80", + "", + "§7When mining ores, you have a", + EnumChatFormatting.GREEN + "" + orbitStat + "%" + EnumChatFormatting.GRAY + " chance to get a random", + "§7amount of experience orbs.", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.DARK_GREEN + "" + (int) ((orbit + 1) * 70) + " Mithril Powder" + ) : Lists.newArrayList( "Orbiter", "§7Level " + orbit + EnumChatFormatting.DARK_GRAY + "/80", "", @@ -4142,7 +4429,18 @@ public class GuiProfileViewer extends GuiScreen { crystallized, (int) (guiLeft + xStart + 303), (int) (guiTop + yStartTop + 90), mouseX, mouseY, - () -> Lists.newArrayList( + () -> crystallized != 0 && crystallized != 30 ? Lists.newArrayList( + "Crystallized", + "§7Level " + crystallized + EnumChatFormatting.DARK_GRAY + "/30", + "", + "§7Grants §a+§a" + crystallizedStat + "§7 §6⸕ Mining", + "§6Speed §7and a §a" + crystallizedStat + "%§7 §7chance", + "§7to deal §a+1 §7extra damage near", + "§7§5Fallen Stars§7.", + "", + EnumChatFormatting.GRAY + "Cost", + EnumChatFormatting.DARK_GREEN + "" + (int) Math.pow(crystallized + 2, 2.4) + " Mithril Powder" + ) : Lists.newArrayList( "Crystallized", "§7Level " + crystallized + EnumChatFormatting.DARK_GRAY + "/30", "", @@ -4351,31 +4649,6 @@ public class GuiProfileViewer extends GuiScreen { return null; } - private int backgroundClickedX = -1; - - private static final char[] c = new char[]{'k', 'm', 'b', 't'}; - - public static String shortNumberFormat(double n, int iteration) { - if (n < 1000) { - if (n % 1 == 0) { - return Integer.toString((int) n); - } else { - return String.format("%.2f", n); - } - } - - double d = ((long) n / 100) / 10.0; - boolean isRound = (d * 10) % 10 == 0; - return (d < 1000 ? - ((d > 99.9 || isRound || (!isRound && d > 9.99) ? - (int) d * 10 / 10 : d + "" - ) + "" + c[iteration]) - : shortNumberFormat(d, iteration + 1)); - } - - private boolean loadingProfile = false; - private static final ExecutorService profileLoader = Executors.newFixedThreadPool(1); - private void drawBasicPage(int mouseX, int mouseY, float partialTicks) { FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; @@ -4909,89 +5182,6 @@ public class GuiProfileViewer extends GuiScreen { } } - private static final ResourceLocation shadowTextures = new ResourceLocation("textures/misc/shadow.png"); - - public static void drawEntityOnScreen( - int posX, - int posY, - int scale, - float mouseX, - float mouseY, - EntityLivingBase ent - ) { - GlStateManager.enableColorMaterial(); - GlStateManager.pushMatrix(); - GlStateManager.translate((float) posX, (float) posY, 50.0F); - GlStateManager.scale((float) (-scale), (float) scale, (float) scale); - GlStateManager.rotate(180.0F, 0.0F, 0.0F, 1.0F); - float renderYawOffset = ent.renderYawOffset; - float f1 = ent.rotationYaw; - float f2 = ent.rotationPitch; - float f3 = ent.prevRotationYawHead; - float f4 = ent.rotationYawHead; - GlStateManager.rotate(135.0F, 0.0F, 1.0F, 0.0F); - RenderHelper.enableStandardItemLighting(); - GlStateManager.rotate(-135.0F, 0.0F, 1.0F, 0.0F); - GlStateManager.rotate(25, 1.0F, 0.0F, 0.0F); - ent.renderYawOffset = (float) Math.atan(mouseX / 40.0F) * 20.0F; - ent.rotationYaw = (float) Math.atan(mouseX / 40.0F) * 40.0F; - ent.rotationPitch = -((float) Math.atan(mouseY / 40.0F)) * 20.0F; - ent.rotationYawHead = ent.rotationYaw; - ent.prevRotationYawHead = ent.rotationYaw; - RenderManager rendermanager = Minecraft.getMinecraft().getRenderManager(); - rendermanager.setPlayerViewY(180.0F); - rendermanager.setRenderShadow(false); - rendermanager.renderEntityWithPosYaw(ent, 0.0D, 0.0D, 0.0D, 0.0F, 1.0F); - - /*{ - GlStateManager.enableBlend(); - GlStateManager.blendFunc(770, 771); - rendermanager.renderEngine.bindTexture(shadowTextures); - GlStateManager.depthMask(false); - float f = 0.5f; - - if (ent instanceof EntityLiving) { - EntityLiving entityliving = (EntityLiving)ent; - f *= entityliving.getRenderSizeModifier(); - - if (entityliving.isChild()) - { - f *= 0.5F; - } - } - - /*Tessellator tessellator = Tessellator.getInstance(); - WorldRenderer worldrenderer = tessellator.getWorldRenderer(); - worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR); - - GlStateManager.color(1, 1, 1, 0.5f); - Utils.drawTexturedRect(-0.5f*tl.x, -0.5f*tl.x, 1*tl.x, 1*tl.x); - - /*for (BlockPos blockpos : BlockPos.getAllInBoxMutable(new BlockPos(i, k, i1), new BlockPos(j, l, j1))) { - Block block = world.getBlockState(blockpos.down()).getBlock(); - - if (block.getRenderType() != -1 && world.getLightFromNeighbors(blockpos) > 3) { - this.func_180549_a(block, x, y, z, blockpos, shadowAlpha, f, d2, d3, d4); - } - } - - GlStateManager.disableBlend(); - GlStateManager.depthMask(true); - }*/ - - ent.renderYawOffset = renderYawOffset; - ent.rotationYaw = f1; - ent.rotationPitch = f2; - ent.prevRotationYawHead = f3; - ent.rotationYawHead = f4; - GlStateManager.popMatrix(); - RenderHelper.disableStandardItemLighting(); - GlStateManager.disableRescaleNormal(); - GlStateManager.setActiveTexture(OpenGlHelper.lightmapTexUnit); - GlStateManager.disableTexture2D(); - GlStateManager.setActiveTexture(OpenGlHelper.defaultTexUnit); - } - public void resetCache() { bestWeapons = null; bestRods = null; @@ -5011,11 +5201,6 @@ public class GuiProfileViewer extends GuiScreen { selectedPet = -1; } - Shader blurShaderHorz = null; - Framebuffer blurOutputHorz = null; - Shader blurShaderVert = null; - Framebuffer blurOutputVert = null; - /** * Creates a projection matrix that projects from our coordinate space [0->width; 0->height] to OpenGL coordinate * space [-1 -> 1; 1 -> -1] (Note: flipped y-axis). @@ -5036,14 +5221,6 @@ public class GuiProfileViewer extends GuiScreen { return projMatrix; } - /** - * Renders whatever is currently in the Minecraft framebuffer to our two framebuffers, applying a horizontal - * and vertical blur separately in order to significantly save computation time. - * This is only possible if framebuffers are supported by the system, so this method will exit prematurely - * if framebuffers are not available. (Apple machines, for example, have poor framebuffer support). - */ - private double lastBgBlurFactor = -1; - private void blurBackground() { if (!OpenGlHelper.isFramebufferEnabled()) return; @@ -5124,4 +5301,44 @@ public class GuiProfileViewer extends GuiScreen { //Utils.setScreen(width, height, f); blurOutputVert.unbindFramebufferTexture(); } + + public enum ProfileViewerPage { + LOADING(-1, null), + INVALID_NAME(-1, null), + NO_SKYBLOCK(-1, null), + BASIC(0, new ItemStack(Items.paper)), + DUNGEON(1, new ItemStack(Item.getItemFromBlock(Blocks.deadbush))), + EXTRA(2, new ItemStack(Items.book)), + INVENTORIES(3, new ItemStack(Item.getItemFromBlock(Blocks.ender_chest))), + COLLECTIONS(4, new ItemStack(Items.painting)), + PETS(5, new ItemStack(Items.bone)), + MINING(6, new ItemStack(Items.iron_pickaxe)), + BINGO(7, new ItemStack(Items.filled_map)); + + public final ItemStack stack; + public final int id; + + ProfileViewerPage(int id, ItemStack stack) { + this.id = id; + this.stack = stack; + } + + public static ProfileViewerPage getById(int id) { + for (ProfileViewerPage page : values()) { + if (page.id == id) { + return page; + } + } + return null; + } + } + + public static class PetLevel { + public float level; + public float currentLevelRequirement; + public float maxXP; + public float levelPercentage; + public float levelXp; + public float totalXp; + } } 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 674f08af..b8f8554e 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java @@ -27,12 +27,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class ProfileViewer { - private final NEUManager manager; - - public ProfileViewer(NEUManager manager) { - this.manager = manager; - } - private static final HashMap petRarityToNumMap = new HashMap() {{ put("COMMON", "0"); put("UNCOMMON", "1"); @@ -41,7 +35,6 @@ public class ProfileViewer { put("LEGENDARY", "4"); put("MYTHIC", "5"); }}; - private static final LinkedHashMap skillToSkillDisplayMap = new LinkedHashMap() {{ put("skill_taming", Utils.createItemStack(Items.spawn_egg, EnumChatFormatting.LIGHT_PURPLE + "Taming")); @@ -72,7 +65,6 @@ public class ProfileViewer { put("slayer_wolf", Utils.createItemStack(Items.bone, EnumChatFormatting.GOLD + "Sven Slayer")); put("slayer_enderman", Utils.createItemStack(Items.ender_pearl, EnumChatFormatting.GOLD + "Ender Slayer")); }}; - private static final ItemStack CAT_FARMING = Utils.createItemStack(Items.golden_hoe, EnumChatFormatting.YELLOW + "Farming"); private static final ItemStack CAT_MINING = @@ -83,7 +75,6 @@ public class ProfileViewer { Utils.createItemStack(Item.getItemFromBlock(Blocks.sapling), EnumChatFormatting.DARK_GREEN + "Foraging"); private static final ItemStack CAT_FISHING = Utils.createItemStack(Items.fishing_rod, EnumChatFormatting.AQUA + "Fishing"); - private static final LinkedHashMap> collectionCatToCollectionMap = new LinkedHashMap>() {{ put(CAT_FARMING, Utils.createList("WHEAT", "CARROT_ITEM", "POTATO_ITEM", "PUMPKIN", "MELON", "SEEDS", @@ -103,7 +94,6 @@ public class ProfileViewer { )); }}; - private static final LinkedHashMap> collectionCatToMinionMap = new LinkedHashMap>() {{ put(CAT_FARMING, Utils.createList("WHEAT", "CARROT", "POTATO", "PUMPKIN", "MELON", null, "MUSHROOM", @@ -120,7 +110,6 @@ public class ProfileViewer { put(CAT_FISHING, Utils.createList("FISHING", null, null, null, null, null, "CLAY", null, null, null)); }}; - private static final LinkedHashMap collectionToCollectionDisplayMap = new LinkedHashMap() {{ /* FARMING COLLECTIONS */ @@ -244,6 +233,17 @@ 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")); }}; + private static final AtomicBoolean updatingResourceCollection = new AtomicBoolean(false); + private static JsonObject resourceCollection = null; + private final NEUManager manager; + private final HashMap nameToHypixelProfile = new HashMap<>(); + private final HashMap uuidToHypixelProfile = new HashMap<>(); + private final HashMap uuidToProfileMap = new HashMap<>(); + private final HashMap nameToUuid = new HashMap<>(); + + public ProfileViewer(NEUManager manager) { + this.manager = manager; + } public static LinkedHashMap> getCollectionCatToMinionMap() { return collectionCatToMinionMap; @@ -261,13 +261,6 @@ public class ProfileViewer { return Collections.unmodifiableMap(skillToSkillDisplayMap); } - public static class Level { - public float level = 0; - public float maxXpForLevel = 0; - public boolean maxed = false; - public double totalXp; - } - public static Level getLevel(JsonArray levelingArray, float xp, int levelCap, boolean cumulative) { Level levelObj = new Level(); for (int level = 0; level < levelingArray.size(); level++) { @@ -299,14 +292,135 @@ public class ProfileViewer { return levelObj; } - public class Profile { - private final String uuid; - private String latestProfile = null; + public static JsonObject getResourceCollectionInformation() { + if (resourceCollection != null) return resourceCollection; + if (updatingResourceCollection.get()) return null; - private JsonArray playerInformation = null; - private JsonObject guildInformation = null; - private JsonObject basicInfo = null; + updatingResourceCollection.set(true); + + HashMap args = new HashMap<>(); + NotEnoughUpdates.INSTANCE.manager.hypixelApi.getHypixelApiAsync( + NotEnoughUpdates.INSTANCE.config.apiKey.apiKey, + "resources/skyblock/collections", + args, + jsonObject -> { + updatingResourceCollection.set(false); + if (jsonObject != null && jsonObject.has("success") && jsonObject.get("success").getAsBoolean()) { + resourceCollection = jsonObject.get("collections").getAsJsonObject(); + } + }, + () -> updatingResourceCollection.set(false) + ); + + return null; + } + + public void getHypixelProfile(String name, Consumer callback) { + String nameF = name.toLowerCase(); + HashMap args = new HashMap<>(); + args.put("name", "" + nameF); + manager.hypixelApi.getHypixelApiAsync(NotEnoughUpdates.INSTANCE.config.apiKey.apiKey, "player", + args, jsonObject -> { + if (jsonObject != null && jsonObject.has("success") && jsonObject.get("success").getAsBoolean() + && jsonObject.get("player").isJsonObject()) { + nameToUuid.put(nameF, jsonObject.get("player").getAsJsonObject().get("uuid").getAsString()); + uuidToHypixelProfile.put( + jsonObject.get("player").getAsJsonObject().get("uuid").getAsString(), + jsonObject.get("player").getAsJsonObject() + ); + if (callback != null) callback.accept(jsonObject); + } else { + if (callback != null) callback.accept(null); + } + } + ); + } + + public void putNameUuid(String name, String uuid) { + nameToUuid.put(name, uuid); + } + + public void getPlayerUUID(String name, Consumer uuidCallback) { + String nameF = name.toLowerCase(); + if (nameToUuid.containsKey(nameF)) { + uuidCallback.accept(nameToUuid.get(nameF)); + return; + } + + manager.hypixelApi.getApiAsync("https://api.mojang.com/users/profiles/minecraft/" + nameF, + (jsonObject) -> { + if (jsonObject.has("id") && jsonObject.get("id").isJsonPrimitive() && + ((JsonPrimitive) jsonObject.get("id")).isString()) { + String uuid = jsonObject.get("id").getAsString(); + nameToUuid.put(nameF, uuid); + uuidCallback.accept(uuid); + return; + } + uuidCallback.accept(null); + }, () -> uuidCallback.accept(null) + ); + } + + public void getProfileByName(String name, Consumer callback) { + String nameF = name.toLowerCase(); + + if (nameToUuid.containsKey(nameF) && nameToUuid.get(nameF) == null) { + callback.accept(null); + return; + } + + getPlayerUUID(nameF, (uuid) -> { + if (uuid == null) { + getHypixelProfile(nameF, jsonObject -> { + if (jsonObject != null) { + callback.accept(getProfileReset(nameToUuid.get(nameF), ignored -> { + })); + } else { + callback.accept(null); + nameToUuid.put(nameF, null); + } + }); + } else { + if (!uuidToHypixelProfile.containsKey(uuid)) { + getHypixelProfile(nameF, jsonObject -> { + }); + } + callback.accept(getProfileReset(uuid, ignored -> { + })); + } + }); + + return; + } + + public Profile getProfileRaw(String uuid) { + return uuidToProfileMap.get(uuid); + } + + public Profile getProfile(String uuid, Consumer callback) { + Profile profile = uuidToProfileMap.computeIfAbsent(uuid, k -> new Profile(uuid)); + if (profile.playerInformation != null) { + callback.accept(profile); + } else { + profile.getPlayerInformation(() -> callback.accept(profile)); + } + return profile; + } + + public Profile getProfileReset(String uuid, Consumer callback) { + if (uuidToProfileMap.containsKey(uuid)) uuidToProfileMap.get(uuid).resetCache(); + return getProfile(uuid, callback); + } + public static class Level { + public float level = 0; + public float maxXpForLevel = 0; + public boolean maxed = false; + public double totalXp; + } + + public class Profile { + private final String uuid; private final HashMap profileMap = new HashMap<>(); private final HashMap petsInfoMap = new HashMap<>(); private final HashMap> coopProfileMap = new HashMap<>(); @@ -314,27 +428,37 @@ public class ProfileViewer { private final HashMap inventoryInfoMap = new HashMap<>(); private final HashMap collectionInfoMap = new HashMap<>(); private final List profileIds = new ArrayList<>(); - private JsonObject playerStatus = null; private final HashMap stats = new HashMap<>(); private final HashMap passiveStats = new HashMap<>(); private final HashMap networth = new HashMap<>(); - - public Profile(String uuid) { - this.uuid = uuid; - } - private final AtomicBoolean updatingPlayerInfoState = new AtomicBoolean(false); - private long lastPlayerInfoState = 0; private final AtomicBoolean updatingPlayerStatusState = new AtomicBoolean(false); private final AtomicBoolean updatingGuildInfoState = new AtomicBoolean(false); - private long lastGuildInfoState = 0; private final AtomicBoolean updatingGuildStatusState = new AtomicBoolean(false); + private final AtomicBoolean updatingBingoInfo = new AtomicBoolean(false); + private final Pattern COLL_TIER_PATTERN = Pattern.compile("_(-?[0-9]+)"); + private String latestProfile = null; + private JsonArray playerInformation = null; + private JsonObject guildInformation = null; + private JsonObject basicInfo = null; + private JsonObject playerStatus = null; + private JsonObject bingoInformation = null; + private long lastPlayerInfoState = 0; + private long lastStatusInfoState = 0; + private long lastGuildInfoState = 0; + private long lastBingoInfoState = 0; + + public Profile(String uuid) { + this.uuid = uuid; + } public JsonObject getPlayerStatus() { if (playerStatus != null) return playerStatus; if (updatingPlayerStatusState.get()) return null; - updatingPlayerStatusState.set(true); + long currentTime = System.currentTimeMillis(); + if (currentTime - lastStatusInfoState < 15 * 1000) return null; + lastStatusInfoState = currentTime; HashMap args = new HashMap<>(); args.put("uuid", "" + uuid); @@ -352,6 +476,33 @@ public class ProfileViewer { return null; } + public JsonObject getBingoInformation() { + if (bingoInformation != null) return bingoInformation; + if (updatingBingoInfo.get()) return null; + + long currentTime = System.currentTimeMillis(); + if (currentTime - lastBingoInfoState < 15 * 1000) return null; + lastBingoInfoState = currentTime; + + HashMap args = new HashMap<>(); + args.put("uuid", "" + uuid); + NotEnoughUpdates.INSTANCE.manager.hypixelApi.getHypixelApiAsync( + NotEnoughUpdates.INSTANCE.config.apiKey.apiKey, + "skyblock/bingo", + args, + jsonObject -> { + if (jsonObject == null) return; + updatingBingoInfo.set(false); + if (jsonObject.has("success") && jsonObject.get("success").getAsBoolean()) { + bingoInformation = jsonObject; + } else { + bingoInformation = null; + } + }, () -> updatingBingoInfo.set(false) + ); + return null; + } + public long getNetWorth(String profileId) { if (profileId == null) profileId = latestProfile; if (networth.get(profileId) != null) return networth.get(profileId); @@ -442,11 +593,6 @@ public class ProfileViewer { } if (networth == 0) return -1; - //System.out.println(profileId); - //for (Map.Entry entry : mostExpensiveInternal.entrySet()) { - //System.out.println(entry.getKey() + ":" + entry.getValue()); - //} - networth = (int) (networth * 1.3f); JsonObject petsInfo = getPetsInfo(profileId); @@ -554,9 +700,9 @@ public class ProfileViewer { long currentTime = System.currentTimeMillis(); - if (currentTime - lastGuildInfoState < 15 * 1000 && updatingGuildInfoState.get()) return null; - + if (currentTime - lastGuildInfoState < 15 * 1000) return null; lastGuildInfoState = currentTime; + updatingGuildInfoState.set(true); HashMap args = new HashMap<>(); @@ -1054,8 +1200,6 @@ public class ProfileViewer { return null; } - private final Pattern COLL_TIER_PATTERN = Pattern.compile("_(-?[0-9]+)"); - public JsonObject getCollectionInfo(String profileId) { JsonObject profileInfo = getProfileInformation(profileId); if (profileInfo == null) return null; @@ -1064,8 +1208,12 @@ public class ProfileViewer { if (profileId == null) profileId = latestProfile; if (collectionInfoMap.containsKey(profileId)) return collectionInfoMap.get(profileId); + List coopMembers = getCoopProfileInformation(profileId); JsonElement unlocked_coll_tiers_element = Utils.getElement(profileInfo, "unlocked_coll_tiers"); JsonElement crafted_generators_element = Utils.getElement(profileInfo, "crafted_generators"); + JsonObject fakeMember = new JsonObject(); + fakeMember.add("crafted_generators", crafted_generators_element); + coopMembers.add(coopMembers.size(), fakeMember); JsonElement collectionInfoElement = Utils.getElement(profileInfo, "collection"); if (unlocked_coll_tiers_element == null || collectionInfoElement == null) { @@ -1116,17 +1264,15 @@ public class ProfileViewer { } } } - - if (crafted_generators_element != null && crafted_generators_element.isJsonArray()) { - JsonArray crafted_generators = crafted_generators_element.getAsJsonArray(); - for (int i = 0; i < crafted_generators.size(); i++) { - String unlocked = crafted_generators.get(i).getAsString(); - + for (JsonObject current_member_info : coopMembers) { + if (!current_member_info.has("crafted_generators") || !current_member_info.get("crafted_generators").isJsonArray()) continue; + JsonArray crafted_generators = Utils.getElement(current_member_info, "crafted_generators").getAsJsonArray(); + for (int j = 0; j < crafted_generators.size(); j++) { + String unlocked = crafted_generators.get(j).getAsString(); Matcher matcher = COLL_TIER_PATTERN.matcher(unlocked); - if (matcher.find()) { - String tier_str = matcher.group(1); - int tier = Integer.parseInt(tier_str); + String tierString = matcher.group(1); + int tier = Integer.parseInt(tierString); String coll = unlocked.substring(0, unlocked.length() - (matcher.group().length())); if (!minionTiers.has(coll) || minionTiers.get(coll).getAsInt() < tier) { minionTiers.addProperty(coll, tier); @@ -1221,133 +1367,4 @@ public class ProfileViewer { return null; } } - - private final HashMap nameToHypixelProfile = new HashMap<>(); - private final HashMap uuidToHypixelProfile = new HashMap<>(); - private final HashMap uuidToProfileMap = new HashMap<>(); - - public void getHypixelProfile(String name, Consumer callback) { - String nameF = name.toLowerCase(); - HashMap args = new HashMap<>(); - args.put("name", "" + nameF); - manager.hypixelApi.getHypixelApiAsync(NotEnoughUpdates.INSTANCE.config.apiKey.apiKey, "player", - args, jsonObject -> { - if (jsonObject != null && jsonObject.has("success") && jsonObject.get("success").getAsBoolean() - && jsonObject.get("player").isJsonObject()) { - nameToUuid.put(nameF, jsonObject.get("player").getAsJsonObject().get("uuid").getAsString()); - uuidToHypixelProfile.put( - jsonObject.get("player").getAsJsonObject().get("uuid").getAsString(), - jsonObject.get("player").getAsJsonObject() - ); - if (callback != null) callback.accept(jsonObject); - } else { - if (callback != null) callback.accept(null); - } - } - ); - } - - private final HashMap nameToUuid = new HashMap<>(); - - public void putNameUuid(String name, String uuid) { - nameToUuid.put(name, uuid); - } - - public void getPlayerUUID(String name, Consumer uuidCallback) { - String nameF = name.toLowerCase(); - if (nameToUuid.containsKey(nameF)) { - uuidCallback.accept(nameToUuid.get(nameF)); - return; - } - - manager.hypixelApi.getApiAsync("https://api.mojang.com/users/profiles/minecraft/" + nameF, - (jsonObject) -> { - if (jsonObject.has("id") && jsonObject.get("id").isJsonPrimitive() && - ((JsonPrimitive) jsonObject.get("id")).isString()) { - String uuid = jsonObject.get("id").getAsString(); - nameToUuid.put(nameF, uuid); - uuidCallback.accept(uuid); - return; - } - uuidCallback.accept(null); - }, () -> uuidCallback.accept(null) - ); - } - - public void getProfileByName(String name, Consumer callback) { - String nameF = name.toLowerCase(); - - if (nameToUuid.containsKey(nameF) && nameToUuid.get(nameF) == null) { - callback.accept(null); - return; - } - - getPlayerUUID(nameF, (uuid) -> { - if (uuid == null) { - getHypixelProfile(nameF, jsonObject -> { - if (jsonObject != null) { - callback.accept(getProfileReset(nameToUuid.get(nameF), ignored -> { - })); - } else { - callback.accept(null); - nameToUuid.put(nameF, null); - } - }); - } else { - if (!uuidToHypixelProfile.containsKey(uuid)) { - getHypixelProfile(nameF, jsonObject -> { - }); - } - callback.accept(getProfileReset(uuid, ignored -> { - })); - } - }); - - return; - } - - public Profile getProfileRaw(String uuid) { - return uuidToProfileMap.get(uuid); - } - - public Profile getProfile(String uuid, Consumer callback) { - Profile profile = uuidToProfileMap.computeIfAbsent(uuid, k -> new Profile(uuid)); - if (profile.playerInformation != null) { - callback.accept(profile); - } else { - profile.getPlayerInformation(() -> callback.accept(profile)); - } - return profile; - } - - public Profile getProfileReset(String uuid, Consumer callback) { - if (uuidToProfileMap.containsKey(uuid)) uuidToProfileMap.get(uuid).resetCache(); - return getProfile(uuid, callback); - } - - private static JsonObject resourceCollection = null; - private static final AtomicBoolean updatingResourceCollection = new AtomicBoolean(false); - - public static JsonObject getResourceCollectionInformation() { - if (resourceCollection != null) return resourceCollection; - if (updatingResourceCollection.get()) return null; - - updatingResourceCollection.set(true); - - HashMap args = new HashMap<>(); - NotEnoughUpdates.INSTANCE.manager.hypixelApi.getHypixelApiAsync( - NotEnoughUpdates.INSTANCE.config.apiKey.apiKey, - "resources/skyblock/collections", - args, - jsonObject -> { - updatingResourceCollection.set(false); - if (jsonObject != null && jsonObject.has("success") && jsonObject.get("success").getAsBoolean()) { - resourceCollection = jsonObject.get("collections").getAsJsonObject(); - } - }, - () -> updatingResourceCollection.set(false) - ); - - return null; - } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/HypixelApi.java b/src/main/java/io/github/moulberry/notenoughupdates/util/HypixelApi.java index 2628eb7d..37de9ed8 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/HypixelApi.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/HypixelApi.java @@ -21,15 +21,14 @@ import java.util.function.Consumer; import java.util.zip.GZIPInputStream; public class HypixelApi { + private static final int FAILS_BEFORE_SWITCH = 3; private final Gson gson = new Gson(); private final ExecutorService es = Executors.newFixedThreadPool(3); - - private static final int FAILS_BEFORE_SWITCH = 3; - private int currentUrl = 0; - private long lastPrimaryUrl = 0; private final String[] myApiURLs = {"https://moulberry.codes/"}; //, "http://moulberry.codes/", "http://51.79.51.21/"};//, "http://51.75.78.252/" }; private final Integer[] myApiSuccesses = {0, 0, 0, 0}; + private int currentUrl = 0; + private long lastPrimaryUrl = 0; public CompletableFuture getHypixelApiAsync(String apiKey, String method, HashMap args) { return getApiAsync(generateApiUrl(apiKey, method, args)); @@ -167,7 +166,7 @@ public class HypixelApi { public String generateApiUrl(String apiKey, String method, HashMap args) { if (apiKey != null) - args.put("key", apiKey.trim().replace("-", "")); + args.put("key", apiKey.trim()); StringBuilder url = new StringBuilder("https://api.hypixel.net/" + method); boolean first = true; for (Map.Entry entry : args.entrySet()) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java b/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java index 4bf1d6aa..5b7bd055 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java @@ -293,7 +293,7 @@ public class SBInfo { String cleanLine = Utils.cleanColour(line); - if (cleanLine.contains("Dungeon") && cleanLine.contains("Cleared:") && cleanLine.contains("%")) { + if (cleanLine.contains("Cleared:") && cleanLine.contains("%")) { tempIsInDungeon = true; } 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 'Update Notes/2.1.md') 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 5e7a8a02fe836c1e635faf067fbe8913549bc0e0 Mon Sep 17 00:00:00 2001 From: Walker Selby Date: Sun, 27 Mar 2022 12:13:08 -0500 Subject: Add NBT Data to Profile Viewer Tabs and XP Bars (#94) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixed what hypxiel broke in dungeons * Added Longswords to Tools Tab (Itemlist) * Set max cata level to 70 * ups * why is it now E * YEP the cap is 99 not 70 * long cata xp BatChest + remove crash check because hypixel profile is null and i havent fixed that yet * Added checks for chat messages for dungeon win overlay - i think ive got them all but 4Shrug * Added an option to alert you if you put something for too much onto ah (default 50%) + Lowest bin alert triggers if lowest bin isnt found * IMPORTANT * fix dungeon page in /pv * show minions from coop in /pv * (BREAKING CHANGE) remove whitespace in changelog * fix crash with minion check * initial draft * tooltip * important changes * progress related things progress bar for community goals total collected points and personal goals display * only show bingo tab on Bingo profiles * make goals display gold when completed * Added MM7 button to dungeon preset * wart go not stonks * fix percents and added stack size * use code nopo in fortnite shop — Today at 17:29 The capitalisation * config option for always showing bingo page * 🙂 * movble pv tabs * 2.1.md 🙂 * oops * der Kabel * import * Added powder amount to level up perk * Made it only show if the perk isnt maxed / level 0 * fix /pv crash when pet is not in repo * 2.1.md 🙂 * web editor my beloved * Add NBT Data to Profile Viewer Tabs and XP Bars Add NBT Data Support for Resources in Tabs Add NBT Data Support for Resources in XP Bars Optimize renderTabs function Optimize mouseClicked Function Optimize ProfileViewerPage Enum * Update Style Co-authored-by: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> * Update GuiProfileViewer Rebased on pvbingo Updated formatting with IntelliJ reformatting tool (hopefully that matches now, let me know if you want me to try again but I think I did it right) * dungeons and pv bingo tab (#93) * add custom skull loading back (#96) * Refactor Hollows solvers, add tests, add Vec3Comparable, fix bugs (#95) * Rebase on master * Fix conflicts and rebase on master Add changes to change log * Oops Co-authored-by: nopo Co-authored-by: jani270 Co-authored-by: Lulonaut Co-authored-by: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> Co-authored-by: Lulonaut <67191924+Lulonaut@users.noreply.github.com> Co-authored-by: CraftyOldMiner <85420839+CraftyOldMiner@users.noreply.github.com> --- Update Notes/2.1.md | 3 + build.gradle.kts | 5 - .../notenoughupdates/NotEnoughUpdates.java | 148 ++- .../notenoughupdates/commands/dev/DiagCommand.java | 27 +- .../annotations/ConfigEditorDraggableList.java | 2 +- .../config/gui/GuiOptionEditorDraggableList.java | 16 +- .../core/config/struct/ConfigProcessor.java | 2 +- .../notenoughupdates/core/util/Vec3Comparable.java | 129 --- .../miscfeatures/AuctionBINWarning.java | 30 +- .../miscfeatures/CrystalMetalDetectorSolver.java | 450 +++----- .../miscfeatures/CrystalWishingCompassSolver.java | 942 +++------------ .../options/seperateSections/Mining.java | 54 +- .../options/seperateSections/Misc.java | 1 + .../options/seperateSections/ProfileViewer.java | 2 +- .../notenoughupdates/profileviewer/BingoPage.java | 16 +- .../profileviewer/GuiProfileViewer.java | 82 +- .../notenoughupdates/util/NEUDebugLogger.java | 10 +- .../moulberry/notenoughupdates/util/SBInfo.java | 14 +- .../core/util/Vec3ComparableTest.java | 193 ---- .../CrystalMetalDetectorSolverTest.java | 204 ---- .../CrystalWishingCompassSolverTest.java | 1206 -------------------- src/test/resources/log4j2-test.xml | 16 - 22 files changed, 525 insertions(+), 3027 deletions(-) delete mode 100644 src/main/java/io/github/moulberry/notenoughupdates/core/util/Vec3Comparable.java delete mode 100644 src/test/java/io/github/moulberry/notenoughupdates/core/util/Vec3ComparableTest.java delete mode 100644 src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolverTest.java delete mode 100644 src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolverTest.java delete mode 100644 src/test/resources/log4j2-test.xml (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 1344905e..9b67fb75 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -65,6 +65,9 @@ - Made the order of the tabs in /pv changeable - Lulonaut - Crystal Hollows crystal states are now updated when the Heart of the Mountain menu is opened - CraftyOldMiner - Added /neudiag command to enable/disable debug logging and dump diagnostic data - CraftyOldMiner +- Added NBT data to Profile Viewer HOTM tree icons - whalker +- Added NBT data to Profile Viewer Tab Icons - whalker +- Added NBT data to Profile Viewer XP Bar Icons - whalker ### **Bug Fixes:** - Fix wiki pages freezing the entire game - nea89 - Made titanium overlay and waypoints work with dwarven overlay off diff --git a/build.gradle.kts b/build.gradle.kts index e134387e..e47b0f67 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -67,7 +67,6 @@ 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") } @@ -77,10 +76,6 @@ tasks.withType(JavaCompile::class) { options.encoding = "UTF-8" } -tasks.named("test") { - useJUnitPlatform() -} - tasks.withType(Jar::class) { archiveBaseName.set("NotEnoughUpdates") manifest.attributes.run { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index 951e7335..0ed68e06 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -1,5 +1,17 @@ package io.github.moulberry.notenoughupdates; +import java.awt.Color; +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.Set; + import com.google.common.collect.Sets; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -12,9 +24,22 @@ import io.github.moulberry.notenoughupdates.listener.ChatListener; import io.github.moulberry.notenoughupdates.listener.ItemTooltipListener; import io.github.moulberry.notenoughupdates.listener.NEUEventListener; import io.github.moulberry.notenoughupdates.listener.RenderListener; -import io.github.moulberry.notenoughupdates.miscfeatures.*; +import io.github.moulberry.notenoughupdates.miscfeatures.CrystalOverlay; +import io.github.moulberry.notenoughupdates.miscfeatures.CrystalWishingCompassSolver; +import io.github.moulberry.notenoughupdates.miscfeatures.CustomItemEffects; +import io.github.moulberry.notenoughupdates.miscfeatures.DwarvenMinesWaypoints; +import io.github.moulberry.notenoughupdates.miscfeatures.EnchantingSolvers; +import io.github.moulberry.notenoughupdates.miscfeatures.FairySouls; +import io.github.moulberry.notenoughupdates.miscfeatures.FishingHelper; +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.NullzeeSphere; +import io.github.moulberry.notenoughupdates.miscfeatures.PetInfoOverlay; +import io.github.moulberry.notenoughupdates.miscfeatures.SlotLocking; +import io.github.moulberry.notenoughupdates.miscfeatures.StorageManager; +import io.github.moulberry.notenoughupdates.miscfeatures.SunTzu; import io.github.moulberry.notenoughupdates.miscfeatures.customblockzones.CustomBiomes; -import io.github.moulberry.notenoughupdates.miscfeatures.customblockzones.CustomBlockSounds; import io.github.moulberry.notenoughupdates.miscfeatures.customblockzones.DwarvenMinesTextures; import io.github.moulberry.notenoughupdates.miscgui.CalendarOverlay; import io.github.moulberry.notenoughupdates.miscgui.InventoryStorageSelector; @@ -28,14 +53,17 @@ import io.github.moulberry.notenoughupdates.util.Utils; import io.github.moulberry.notenoughupdates.util.XPInformation; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.resources.IReloadableResourceManager; import net.minecraft.client.settings.KeyBinding; import net.minecraft.event.ClickEvent; import net.minecraft.scoreboard.ScoreObjective; import net.minecraft.scoreboard.Scoreboard; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.biome.*; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.biome.BiomeGenHell; +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.registry.ClientRegistry; import net.minecraftforge.fml.common.Mod; @@ -44,12 +72,6 @@ import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; -import java.awt.*; -import java.io.*; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Set; - @Mod(modid = NotEnoughUpdates.MODID, version = NotEnoughUpdates.VERSION, clientSideOnly = true) public class NotEnoughUpdates { public static final String MODID = "notenoughupdates"; @@ -57,6 +79,60 @@ public class NotEnoughUpdates { public static final String PRE_VERSION = "0.0"; public static final int VERSION_ID = 20100; public static final int PRE_VERSION_ID = 0; + + public static NotEnoughUpdates INSTANCE = null; + + public NEUManager manager; + public NEUOverlay overlay; + public NEUConfig config; + + private File configFile; + + public File getConfigFile() { + return this.configFile; + } + + public void newConfigFile() { + this.configFile = new File(NotEnoughUpdates.INSTANCE.getNeuDir(), "configNew.json"); + } + + private static final long CHAT_MSG_COOLDOWN = 200; + private long lastChatMessage = 0; + private long secondLastChatMessage = 0; + private String currChatMessage = null; + + //Stolen from Biscut and used for detecting whether in skyblock + private static final Set SKYBLOCK_IN_ALL_LANGUAGES = + Sets.newHashSet("SKYBLOCK", "\u7A7A\u5C9B\u751F\u5B58", "\u7A7A\u5CF6\u751F\u5B58"); + + public GuiScreen openGui = null; + public long lastOpenedGui = 0; + + public Commands commands; + + public static HashMap petRarityToColourMap = new HashMap() {{ + put("UNKNOWN", EnumChatFormatting.RED.toString()); + put("COMMON", EnumChatFormatting.WHITE.toString()); + put("UNCOMMON", EnumChatFormatting.GREEN.toString()); + put("RARE", EnumChatFormatting.BLUE.toString()); + put("EPIC", EnumChatFormatting.DARK_PURPLE.toString()); + put("LEGENDARY", EnumChatFormatting.GOLD.toString()); + put("MYTHIC", EnumChatFormatting.LIGHT_PURPLE.toString()); + }}; + + public static ProfileViewer profileViewer; + + public boolean packDevEnabled = false; + + private final Gson gson = new GsonBuilder().setPrettyPrinting().excludeFieldsWithoutExposeAnnotation().create(); + private File neuDir; + + public File getNeuDir() { + return this.neuDir; + } + + public Color[][] colourMap = null; + /** * Registers the biomes for the crystal hollows here so optifine knows they exists */ @@ -90,48 +166,6 @@ public class NotEnoughUpdates { .setBiomeName("NeuCrystalHollowsCrystalNucleus") .setFillerBlockMetadata(5470985) .setTemperatureRainfall(0.95F, 0.9F); - private static final long CHAT_MSG_COOLDOWN = 200; - //Stolen from Biscut and used for detecting whether in skyblock - private static final Set SKYBLOCK_IN_ALL_LANGUAGES = - Sets.newHashSet("SKYBLOCK", "\u7A7A\u5C9B\u751F\u5B58", "\u7A7A\u5CF6\u751F\u5B58"); - public static NotEnoughUpdates INSTANCE = null; - public static HashMap petRarityToColourMap = new HashMap() {{ - put("UNKNOWN", EnumChatFormatting.RED.toString()); - put("COMMON", EnumChatFormatting.WHITE.toString()); - put("UNCOMMON", EnumChatFormatting.GREEN.toString()); - put("RARE", EnumChatFormatting.BLUE.toString()); - put("EPIC", EnumChatFormatting.DARK_PURPLE.toString()); - put("LEGENDARY", EnumChatFormatting.GOLD.toString()); - put("MYTHIC", EnumChatFormatting.LIGHT_PURPLE.toString()); - }}; - public static ProfileViewer profileViewer; - private final Gson gson = new GsonBuilder().setPrettyPrinting().excludeFieldsWithoutExposeAnnotation().create(); - public NEUManager manager; - public NEUOverlay overlay; - public NEUConfig config; - public GuiScreen openGui = null; - public long lastOpenedGui = 0; - public Commands commands; - public boolean packDevEnabled = false; - public Color[][] colourMap = null; - private File configFile; - private long lastChatMessage = 0; - private long secondLastChatMessage = 0; - private String currChatMessage = null; - private File neuDir; - private boolean hasSkyblockScoreboard; - - public File getConfigFile() { - return this.configFile; - } - - public void newConfigFile() { - this.configFile = new File(NotEnoughUpdates.INSTANCE.getNeuDir(), "configNew.json"); - } - - public File getNeuDir() { - return this.neuDir; - } /** * Instantiates NEUIo, NEUManager and NEUOverlay instances. Registers keybinds and adds a shutdown hook to clear tmp folder. @@ -215,14 +249,6 @@ public class NotEnoughUpdates { MinecraftForge.EVENT_BUS.register(new CrystalOverlay()); MinecraftForge.EVENT_BUS.register(new ItemCooldowns()); - if (Minecraft.getMinecraft().getResourceManager() instanceof IReloadableResourceManager) { - IReloadableResourceManager manager = (IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager(); - manager.registerReloadListener(CustomSkulls.getInstance()); - manager.registerReloadListener(NPCRetexturing.getInstance()); - manager.registerReloadListener(new ItemCustomizeManager.ReloadListener()); - manager.registerReloadListener(new CustomBlockSounds.ReloaderListener()); - } - this.commands = new Commands(); BackgroundBlur.registerListener(); @@ -384,6 +410,8 @@ public class NotEnoughUpdates { return hasSkyblockScoreboard(); } + private boolean hasSkyblockScoreboard; + public boolean hasSkyblockScoreboard() { return hasSkyblockScoreboard; } 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..88264538 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 @@ -17,10 +17,8 @@ public class DiagCommand extends ClientCommandBase { private static final String USAGE_TEXT = EnumChatFormatting.WHITE + "Usage: /neudiag \n\n" + - "/neudiag metal Metal Detector Solver diagnostics\n" + - " Show current solution diags\n" + - " center= Disable / enable using center\n" + - "/neudiag wishing Wishing Compass Solver diagnostics\n" + + "/neudiag metal Metal Detector Solver diagnostics\n" + + "/neudiag wishing Wishing Compass Solver diagnostics\n" + "/neudiag debug\n" + " Show current flags\n" + " Enable/disable flag\n"; @@ -39,26 +37,7 @@ public class DiagCommand extends ClientCommandBase { String command = args[0].toLowerCase(); switch (command) { case "metal": - if (args.length == 1) { - CrystalMetalDetectorSolver.logDiagnosticData(true); - return; - } - - String subCommand = args[1].toLowerCase(); - if (subCommand.equals("center=off")) { - CrystalMetalDetectorSolver.setDebugDoNotUseCenter(true); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + - "Center coordinates-based solutions disabled")); - } - else if (subCommand.equals("center=on")) { - CrystalMetalDetectorSolver.setDebugDoNotUseCenter(false); - sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + - "Center coordinates-based solutions enabled")); - } else { - showUsage(sender); - return; - } - + CrystalMetalDetectorSolver.logDiagnosticData(true); break; case "wishing": CrystalWishingCompassSolver.getInstance().logDiagnosticData(true); 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 5063d543..61e923f5 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 @@ -9,5 +9,5 @@ import java.lang.annotation.Target; @Target(ElementType.FIELD) public @interface ConfigEditorDraggableList { String[] exampleText(); - boolean allowRemovingElements() default true; + boolean allowDeleting() default true; } 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 df373dbf..4dbde24b 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 @@ -24,7 +24,7 @@ public class GuiOptionEditorDraggableList extends GuiOptionEditor { private static final ResourceLocation DELETE = new ResourceLocation("notenoughupdates:core/delete.png"); private final String[] exampleText; - private final boolean allowRemovingElements; + private final boolean enableDeleting; private final List activeText; private int currentDragging = -1; private int dragStartIndex = -1; @@ -39,11 +39,11 @@ public class GuiOptionEditorDraggableList extends GuiOptionEditor { public GuiOptionEditorDraggableList( ConfigProcessor.ProcessedOption option, String[] exampleText, - boolean allowRemovingElements + boolean disableDeleting ) { super(option); - this.allowRemovingElements = allowRemovingElements; + this.enableDeleting = disableDeleting; this.exampleText = exampleText; this.activeText = (List) option.get(); } @@ -84,7 +84,7 @@ public class GuiOptionEditorDraggableList extends GuiOptionEditor { GlStateManager.color(1, greenBlue, greenBlue, 1); } - if (allowRemovingElements) { + if (enableDeleting) { Minecraft.getMinecraft().getTextureManager().bindTexture(DELETE); Utils.drawTexturedRect(x + width / 6 + 27, y + 45 - 7 - 13, 11, 14, GL11.GL_NEAREST); } @@ -215,7 +215,7 @@ public class GuiOptionEditorDraggableList extends GuiOptionEditor { dragStartIndex >= 0 && Mouse.getEventButton() == 0 && mouseX >= x + width / 6 + 27 - 3 && mouseX <= x + width / 6 + 27 + 11 + 3 && mouseY >= y + 45 - 7 - 13 - 3 && mouseY <= y + 45 - 7 - 13 + 14 + 3) { - if (allowRemovingElements) { + if (enableDeleting) { activeText.remove(dragStartIndex); } currentDragging = -1; @@ -226,13 +226,13 @@ public class GuiOptionEditorDraggableList extends GuiOptionEditor { if (!Mouse.isButtonDown(0) || dropdownOpen) { currentDragging = -1; dragStartIndex = -1; - if (trashHoverTime > 0 && allowRemovingElements) trashHoverTime = -System.currentTimeMillis(); + if (trashHoverTime > 0 && enableDeleting) trashHoverTime = -System.currentTimeMillis(); } else if (currentDragging >= 0 && mouseX >= x + width / 6 + 27 - 3 && mouseX <= x + width / 6 + 27 + 11 + 3 && mouseY >= y + 45 - 7 - 13 - 3 && mouseY <= y + 45 - 7 - 13 + 14 + 3) { - if (trashHoverTime < 0 && allowRemovingElements) trashHoverTime = System.currentTimeMillis(); + if (trashHoverTime < 0 && enableDeleting) trashHoverTime = System.currentTimeMillis(); } else { - if (trashHoverTime > 0 && allowRemovingElements) trashHoverTime = -System.currentTimeMillis(); + if (trashHoverTime > 0 && enableDeleting) trashHoverTime = -System.currentTimeMillis(); } if (Mouse.getEventButtonState()) { 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 3eb8a2d1..0d06980a 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 @@ -147,7 +147,7 @@ public class ConfigProcessor { if (optionField.isAnnotationPresent(ConfigEditorDraggableList.class)) { ConfigEditorDraggableList configEditorAnnotation = optionField.getAnnotation(ConfigEditorDraggableList.class); - editor = new GuiOptionEditorDraggableList(option, configEditorAnnotation.exampleText(), configEditorAnnotation.allowRemovingElements()); + 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/Vec3Comparable.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/Vec3Comparable.java deleted file mode 100644 index cd144c21..00000000 --- a/src/main/java/io/github/moulberry/notenoughupdates/core/util/Vec3Comparable.java +++ /dev/null @@ -1,129 +0,0 @@ -package io.github.moulberry.notenoughupdates.core.util; - -import net.minecraft.util.BlockPos; -import net.minecraft.util.Vec3; -import net.minecraft.util.Vec3i; - -public class Vec3Comparable extends Vec3 implements Comparable { - public static final Vec3Comparable NULL_VECTOR = new Vec3Comparable(0.0, 0.0, 0.0); - - public Vec3Comparable(double x, double y, double z) { - super(x, y, z); - } - - public Vec3Comparable(Vec3i sourceVec) { - super(sourceVec); - } - - public Vec3Comparable(Vec3 source) { - super(source.xCoord, source.yCoord, source.zCoord); - } - - public Vec3Comparable(BlockPos source) { - - super(source.getX(), source.getY(), source.getZ()); - } - - public Vec3Comparable(Vec3Comparable source) { - super(source.xCoord, source.yCoord, source.zCoord); - } - - @Override - public Vec3Comparable subtractReverse(Vec3 vec) { - return new Vec3Comparable(super.subtractReverse(vec)); - } - - @Override - public Vec3Comparable normalize() { - return new Vec3Comparable(super.normalize()); - } - - @Override - public Vec3Comparable crossProduct(Vec3 vec) { - return new Vec3Comparable(super.crossProduct(vec)); - } - - @Override - public Vec3Comparable subtract(Vec3 vec) { - return new Vec3Comparable(super.subtract(vec)); - } - - @Override - public Vec3Comparable subtract(double x, double y, double z) { - return new Vec3Comparable(super.subtract(x, y, z)); - } - - @Override - public Vec3Comparable add(Vec3 other) { - return new Vec3Comparable(super.add(other)); - } - - @Override - public Vec3Comparable addVector(double x, double y, double z) { - return new Vec3Comparable(super.addVector(x, y, z)); - } - - @Override - public Vec3Comparable getIntermediateWithXValue(Vec3 vec, double x) { - return new Vec3Comparable(super.getIntermediateWithXValue(vec, x)); - } - - @Override - public Vec3Comparable getIntermediateWithYValue(Vec3 vec, double y) { - return new Vec3Comparable(super.getIntermediateWithYValue(vec, y)); - } - - @Override - public Vec3Comparable getIntermediateWithZValue(Vec3 vec, double z) { - return new Vec3Comparable(super.getIntermediateWithZValue(vec, z)); - } - - @Override - public Vec3Comparable rotatePitch(float pitch) { - return new Vec3Comparable(super.rotatePitch(pitch)); - } - - @Override - public Vec3Comparable rotateYaw(float yaw) { - return new Vec3Comparable(super.rotateYaw(yaw)); - } - - @Override - public boolean equals(Object other) { - if (this == other) { - return true; - } else if (!(other instanceof Vec3Comparable)) { - return false; - } else { - Vec3Comparable vec3c = (Vec3Comparable) other; - return this.xCoord == vec3c.xCoord && this.yCoord == vec3c.yCoord && this.zCoord == vec3c.zCoord; - } - } - - @Override - public int hashCode() { - long bits = 1L; - bits = 31L * bits + doubleToLongBits(xCoord); - bits = 31L * bits + doubleToLongBits(yCoord); - bits = 31L * bits + doubleToLongBits(zCoord); - return (int) (bits ^ (bits >> 32)); - } - - 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); - } - - public boolean signumEquals(Vec3 other) { - return Math.signum(xCoord) == Math.signum(other.xCoord) && - Math.signum(yCoord) == Math.signum(other.yCoord) && - Math.signum(zCoord) == Math.signum(other.zCoord); - } - - private static long doubleToLongBits(double d) { - return d == 0.0 ? 0L : Double.doubleToLongBits(d); - } -} 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 c7bcc0e1..a787ca99 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionBINWarning.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionBINWarning.java @@ -37,7 +37,9 @@ public class AuctionBINWarning extends GuiElement { private String sellingName; private int sellingPrice; private int lowestPrice; + private int buyPercentage; private int sellStackAmount; + private boolean isALoss = true; private boolean shouldPerformCheck() { if (!NotEnoughUpdates.INSTANCE.config.ahTweaks.enableBINWarning || @@ -110,14 +112,13 @@ public class AuctionBINWarning extends GuiElement { float undercutFactor = 1 - NotEnoughUpdates.INSTANCE.config.ahTweaks.warningThreshold / 100; if (undercutFactor < 0) undercutFactor = 0; if (undercutFactor > 1) undercutFactor = 1; - float overcutFactor = 1 + NotEnoughUpdates.INSTANCE.config.ahTweaks.overcutWarningThreshold / 100; + float overcutFactor = 1 - NotEnoughUpdates.INSTANCE.config.ahTweaks.overcutWarningThreshold / 100; if (overcutFactor < 0) overcutFactor = 0; + if (overcutFactor > 1) overcutFactor = 1; - if ( - (sellingPrice > 0 && lowestPrice > 0 && - ((sellingPrice > sellStackAmount * lowestPrice * overcutFactor) || - sellingPrice < sellStackAmount * lowestPrice * undercutFactor)) - || lowestPrice == -1) { + if ((sellingPrice > 0 && lowestPrice > 0 && sellingPrice < sellStackAmount * lowestPrice * undercutFactor) + || (sellingPrice > 0 && lowestPrice > 0 && sellingPrice > sellStackAmount * lowestPrice * (overcutFactor + 1)) + || lowestPrice == -1) { showWarning = true; return true; } else { @@ -180,9 +181,7 @@ public class AuctionBINWarning extends GuiElement { width / 2, height / 2 - 45 + 25, false, 170, 0xffffffff ); TextRenderUtils.drawStringCenteredScaledMaxWidth( - (lowestPrice > 0 - ? "has a lowest BIN of \u00a76" + lowestPriceStr + "\u00a7r coins" - : "\u00a7cWarning: No lowest BIN found!"), + (lowestPrice > 0 ? "has a lowest BIN of \u00a76" + lowestPriceStr + "\u00a7r coins" : "\u00a7cWarning: No lowest BIN found!"), Minecraft.getMinecraft().fontRendererObj, width / 2, height / 2 - 45 + 34, @@ -191,16 +190,16 @@ public class AuctionBINWarning extends GuiElement { 0xffa0a0a0 ); - boolean isALoss = false; - int buyPercentage = 0; if (sellingPrice > lowestPrice * sellStackAmount) { - buyPercentage = sellingPrice * 100 / (lowestPrice * sellStackAmount) - 100; + buyPercentage = sellingPrice * 100 / (lowestPrice * sellStackAmount); isALoss = false; } else if (sellingPrice < lowestPrice * sellStackAmount) { - buyPercentage = 100 - sellingPrice * 100 / (lowestPrice * sellStackAmount); + buyPercentage = 100 - sellingPrice * 100 / (lowestPrice * sellStackAmount); + if (buyPercentage <= 0) buyPercentage = 1; isALoss = true; } + TextRenderUtils.drawStringCenteredScaledMaxWidth( "Continue selling it for", Minecraft.getMinecraft().fontRendererObj, @@ -211,10 +210,7 @@ public class AuctionBINWarning extends GuiElement { 0xffa0a0a0 ); TextRenderUtils.drawStringCenteredScaledMaxWidth( - "\u00a76" + sellingPriceStr + "\u00a7r coins?" + - ((lowestPrice > 0 && buyPercentage > 0) - ? "(\u00a7" + (isALoss ? "c-" : "a+") + buyPercentage + "%\u00a7r)" - : ""), + "\u00a76" + sellingPriceStr + "\u00a7r coins?" + (lowestPrice > 0 ? "(\u00a7" + (isALoss ? "c-" : "a+") + buyPercentage + "%\u00a7r)" : ""), Minecraft.getMinecraft().fontRendererObj, width / 2, height / 2 - 45 + 59, 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..27c334ad 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolver.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolver.java @@ -1,7 +1,6 @@ package io.github.moulberry.notenoughupdates.miscfeatures; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import io.github.moulberry.notenoughupdates.core.util.Vec3Comparable; import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils; import io.github.moulberry.notenoughupdates.options.customtypes.NEUDebugFlag; import io.github.moulberry.notenoughupdates.util.NEUDebugLogger; @@ -12,6 +11,7 @@ import net.minecraft.util.BlockPos; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IChatComponent; +import net.minecraft.util.Vec3; import net.minecraft.util.Vec3i; import java.util.Arrays; @@ -22,35 +22,25 @@ import java.util.List; import java.util.stream.Collectors; public class CrystalMetalDetectorSolver { - enum SolutionState { - NOT_STARTED, - MULTIPLE, - MULTIPLE_KNOWN, - FOUND, - FOUND_KNOWN, - FAILED, - INVALID, - } - private static final Minecraft mc = Minecraft.getMinecraft(); - private static Vec3Comparable prevPlayerPos; - private static double prevDistToTreasure; + private static BlockPos prevPlayerPos; + private static double prevDistToTreasure = 0; private static HashSet possibleBlocks = new HashSet<>(); - private static final HashMap evaluatedPlayerPositions = new HashMap<>(); - private static boolean chestRecentlyFound; - private static long chestLastFoundMillis; + private static final HashMap evaluatedPlayerPositions = new HashMap<>(); + private static BlockPos blockPosIfLastSolutionInvalid; + private static Boolean chestRecentlyFound = false; + private static long chestLastFoundMillis = 0; private static final HashSet openedChestPositions = new HashSet<>(); // Keeper and Mines of Divan center location info private static Vec3i minesCenter; - private static boolean debugDoNotUseCenter = false; - private static boolean visitKeeperMessagePrinted; - private static final String KEEPER_OF_STRING = "Keeper of "; - private static final String DIAMOND_STRING = "diamond"; - private static final String LAPIS_STRING = "lapis"; - private static final String EMERALD_STRING = "emerald"; - private static final String GOLD_STRING = "gold"; + private static boolean visitKeeperMessagePrinted = false; + private static String KEEPER_OF_STRING = "Keeper of "; + private static String DIAMOND_STRING = "diamond"; + private static String LAPIS_STRING = "lapis"; + private static String EMERALD_STRING = "emerald"; + private static 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)); @@ -104,14 +94,6 @@ public class CrystalMetalDetectorSolver { -9896946827286L // x=-37, y=-21, z=-22 )); - static Predicate treasureAllowedPredicate = CrystalMetalDetectorSolver::treasureAllowed; - static SolutionState currentState = SolutionState.NOT_STARTED; - static SolutionState previousState = SolutionState.NOT_STARTED; - - public interface Predicate { - boolean check(BlockPos blockPos); - } - public static void process(IChatComponent message) { if (SBInfo.getInstance().getLocation() == null || !NotEnoughUpdates.INSTANCE.config.mining.metalDetectorEnabled || @@ -120,7 +102,7 @@ public class CrystalMetalDetectorSolver { return; } - boolean centerNewlyDiscovered = locateMinesCenterIfNeeded(); + locateMinesCenterIfNeeded(); double distToTreasure = Double.parseDouble(message .getUnformattedText() @@ -140,64 +122,20 @@ public class CrystalMetalDetectorSolver { chestRecentlyFound = false; } - SolutionState originalState = currentState; - int originalCount = possibleBlocks.size(); - Vec3Comparable adjustedPlayerPos = getPlayerPosAdjustedForEyeHeight(); - findPossibleSolutions(distToTreasure, adjustedPlayerPos, centerNewlyDiscovered); - if (currentState != originalState || originalCount != possibleBlocks.size()) { - switch (currentState) { - case FOUND_KNOWN: - NEUDebugLogger.log(NEUDebugFlag.METAL, "Known location identified."); - // falls through - case FOUND: - 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, - EnumChatFormatting.AQUA + "Solution coordinates: " + - EnumChatFormatting.WHITE + possibleBlocks.iterator().next().toString()); - } - break; - case INVALID: - mc.thePlayer.addChatMessage(new ChatComponentText( - EnumChatFormatting.RED + "[NEU] Previous solution is invalid.")); - logDiagnosticData(false); - resetSolution(false); - break; - case FAILED: - mc.thePlayer.addChatMessage(new ChatComponentText( - EnumChatFormatting.RED + "[NEU] Failed to find a solution.")); - logDiagnosticData(false); - resetSolution(false); - break; - case MULTIPLE_KNOWN: - NEUDebugLogger.log(NEUDebugFlag.METAL, "Multiple known locations identified:"); - // falls through - case MULTIPLE: - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + - "[NEU] Need another position to find solution. Possible blocks: " + possibleBlocks.size())); - break; - default: - throw new IllegalStateException("Metal detector is in invalid state"); - } - } - } - - 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(mc.thePlayer.getPosition()) && + !evaluatedPlayerPositions.keySet().contains(mc.thePlayer.getPosition())) { if (possibleBlocks.size() == 0) { + evaluatedPlayerPositions.put(mc.thePlayer.getPosition(), distToTreasure); for (int zOffset = (int) Math.floor(-distToTreasure); zOffset <= Math.ceil(distToTreasure); zOffset++) { for (int y = 65; y <= 75; y++) { double calculatedDist = 0; int xOffset = 0; while (calculatedDist < distToTreasure) { - BlockPos pos = new BlockPos(Math.floor(playerPos.xCoord) + xOffset, - y, Math.floor(playerPos.zCoord) + zOffset - ); - calculatedDist = playerPos.distanceTo(new Vec3Comparable(pos).addVector(0D, 1D, 0D)); - if (round(calculatedDist, 1) == distToTreasure && treasureAllowedPredicate.check(pos)) { + BlockPos pos = new BlockPos(Math.floor(mc.thePlayer.posX) + xOffset, + y, Math.floor(mc.thePlayer.posZ) + zOffset); + calculatedDist = getPlayerPos().distanceTo(new Vec3(pos).addVector(0D, 1D, 0D)); + if (round(calculatedDist, 1) == distToTreasure && treasureAllowed(pos)) { possibleBlocks.add(pos); } xOffset++; @@ -205,11 +143,10 @@ public class CrystalMetalDetectorSolver { xOffset = 0; calculatedDist = 0; while (calculatedDist < distToTreasure) { - BlockPos pos = new BlockPos(Math.floor(playerPos.xCoord) - xOffset, - y, Math.floor(playerPos.zCoord) + zOffset - ); - calculatedDist = playerPos.distanceTo(new Vec3Comparable(pos).addVector(0D, 1D, 0D)); - if (round(calculatedDist, 1) == distToTreasure && treasureAllowedPredicate.check(pos)) { + BlockPos pos = new BlockPos(Math.floor(mc.thePlayer.posX) - xOffset, + y, Math.floor(mc.thePlayer.posZ) + zOffset); + calculatedDist = getPlayerPos().distanceTo(new Vec3(pos).addVector(0D, 1D, 0D)); + if (round(calculatedDist, 1) == distToTreasure && treasureAllowed(pos)) { possibleBlocks.add(pos); } xOffset++; @@ -217,33 +154,48 @@ public class CrystalMetalDetectorSolver { } } - updateSolutionState(); + checkAndDisplaySolutionState(); } else if (possibleBlocks.size() != 1) { + evaluatedPlayerPositions.put(mc.thePlayer.getPosition().getImmutable(), distToTreasure); HashSet temp = new HashSet<>(); for (BlockPos pos : possibleBlocks) { - if (round(playerPos.distanceTo(new Vec3Comparable(pos).addVector(0D, 1D, 0D)), 1) == distToTreasure) { + if (round(getPlayerPos().distanceTo(new Vec3(pos).addVector(0D, 1D, 0D)), 1) == distToTreasure) { temp.add(pos); } } possibleBlocks = temp; - updateSolutionState(); + checkAndDisplaySolutionState(); } else { BlockPos pos = possibleBlocks.iterator().next(); - if (Math.abs(distToTreasure - (playerPos.distanceTo(new Vec3Comparable(pos)))) > 5) { - currentState = SolutionState.INVALID; + if (Math.abs(distToTreasure - (getPlayerPos().distanceTo(new Vec3(pos)))) > 5) { + mc.thePlayer.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "[NEU] Previous solution is invalid.")); + blockPosIfLastSolutionInvalid = pos.getImmutable(); + logDiagnosticData(false); + resetSolution(false); } } - } else if (centerNewlyDiscovered && possibleBlocks.size() > 1) { - updateSolutionState(); } - prevPlayerPos = playerPos; + prevPlayerPos = mc.thePlayer.getPosition().getImmutable(); prevDistToTreasure = distToTreasure; } - public static void setDebugDoNotUseCenter(boolean val) { - debugDoNotUseCenter = val; + private static void checkForSingleKnownLocationMatch() { + if (minesCenter == BlockPos.NULL_VECTOR || possibleBlocks.size() < 2) { + return; + } + + HashSet temp = possibleBlocks.stream() + .filter(block -> knownChestOffsets.contains(block.subtract(minesCenter).toLong())) + .collect(Collectors.toCollection(HashSet::new)); + if (temp.size() == 1) { + possibleBlocks = temp; + NEUDebugLogger.log(NEUDebugFlag.METAL, "Known location identified."); + } else if (temp.size() > 1) { + NEUDebugLogger.log(NEUDebugFlag.METAL, temp.size() + " known locations identified:"); + } } private static String getFriendlyBlockPositions(Collection positions) { @@ -254,13 +206,10 @@ public class CrystalMetalDetectorSolver { StringBuilder sb = new StringBuilder(); sb.append("\n"); for (BlockPos blockPos : positions) { - sb.append("Absolute: "); - sb.append(blockPos.toString()); + sb.append("Absolute: " + blockPos.toString()); if (minesCenter != Vec3i.NULL_VECTOR) { BlockPos relativeOffset = blockPos.subtract(minesCenter); - sb.append(", Relative: "); - sb.append(relativeOffset.toString() ); - sb.append(" (" + relativeOffset.toLong() + ")"); + sb.append(", Relative: " + relativeOffset.toString() + " (" + relativeOffset.toLong() + ")"); } sb.append("\n"); } @@ -268,23 +217,22 @@ public class CrystalMetalDetectorSolver { return sb.toString(); } - private static String getFriendlyEvaluatedPositions() { - if (!NEUDebugLogger.isFlagEnabled(NEUDebugFlag.METAL) || evaluatedPlayerPositions.size() == 0) { + private static String getFriendlyEvaluatedPositions(HashMap positions) { + if (!NEUDebugLogger.isFlagEnabled(NEUDebugFlag.METAL) || positions.size() == 0) { return ""; } StringBuilder sb = new StringBuilder(); sb.append("\n"); - for (Vec3Comparable vec : evaluatedPlayerPositions.keySet()) { - sb.append("Absolute: " + vec.toString()); + for (BlockPos blockPos : positions.keySet()) { + sb.append("Absolute: " + blockPos.toString()); if (minesCenter != Vec3i.NULL_VECTOR) { - BlockPos positionBlockPos = new BlockPos(vec); - BlockPos relativeOffset = positionBlockPos.subtract(minesCenter); + BlockPos relativeOffset = blockPos.subtract(minesCenter); sb.append(", Relative: " + relativeOffset.toString() + " (" + relativeOffset.toLong() + ")"); } sb.append(" Distance: "); - sb.append(evaluatedPlayerPositions.get(vec)); + sb.append(positions.get(blockPos)); sb.append("\n"); } @@ -292,8 +240,101 @@ public class CrystalMetalDetectorSolver { return sb.toString(); } + public static void logDiagnosticData(boolean outputAlways) { + if (SBInfo.getInstance().getLocation() == null) { + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + + "[NEU] This command is not available outside SkyBlock")); + return; + } + + if (!NotEnoughUpdates.INSTANCE.config.mining.metalDetectorEnabled) + { + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + + "[NEU] Metal Detector Solver is not enabled.")); + return; + } + + if (!outputAlways && !NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.contains(NEUDebugFlag.METAL)) { + return; + } + + boolean originalDebugFlag = !NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.add(NEUDebugFlag.METAL); + + StringBuilder diagsMessage = new StringBuilder(); + + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("Mines Center: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append((minesCenter == Vec3i.NULL_VECTOR) ? "" : minesCenter.toString()); + diagsMessage.append("\n"); + + diagsMessage.append("\n"); + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("Previous Player Position: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append((prevPlayerPos == null) ? "" : prevPlayerPos.toString()); + diagsMessage.append("\n"); + + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("Previous Distance To Treasure: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append((prevDistToTreasure == 0) ? "" : prevDistToTreasure); + diagsMessage.append("\n"); + + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("Last Solution Invalid Position: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append((blockPosIfLastSolutionInvalid == null) ? "" : blockPosIfLastSolutionInvalid.toString()); + diagsMessage.append("\n"); + + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("Current Possible Blocks: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append(possibleBlocks.size()); + diagsMessage.append(getFriendlyBlockPositions(possibleBlocks)); + diagsMessage.append("\n"); + + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("Evaluated player positions: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append(evaluatedPlayerPositions.size()); + diagsMessage.append(getFriendlyEvaluatedPositions(evaluatedPlayerPositions)); + diagsMessage.append("\n"); + + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("Chest locations not on known list:\n"); + diagsMessage.append(EnumChatFormatting.WHITE); + if (minesCenter != Vec3i.NULL_VECTOR) { + HashSet locationsNotOnKnownList = openedChestPositions + .stream() + .filter(block -> !knownChestOffsets.contains(block.subtract(minesCenter).toLong())) + .map(block -> block.subtract(minesCenter)) + .collect(Collectors.toCollection(HashSet::new)); + if (locationsNotOnKnownList.size() > 0) { + for (BlockPos blockPos : locationsNotOnKnownList) { + diagsMessage.append(String.format( + "%dL,\t\t// x=%d, y=%d, z=%d", + blockPos.toLong(), + blockPos.getX(), + blockPos.getY(), + blockPos.getZ() + )); + } + } + } else { + diagsMessage.append(""); + } + + NEUDebugLogger.log(NEUDebugFlag.METAL, diagsMessage.toString()); + + if (!originalDebugFlag) { + NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.remove(NEUDebugFlag.METAL); + } + } + public static void resetSolution(Boolean chestFound) { if (chestFound) { + blockPosIfLastSolutionInvalid = null; prevPlayerPos = null; prevDistToTreasure = 0; if (possibleBlocks.size() == 1) { @@ -304,18 +345,15 @@ public class CrystalMetalDetectorSolver { chestRecentlyFound = chestFound; possibleBlocks.clear(); evaluatedPlayerPositions.clear(); - previousState = currentState; - currentState = SolutionState.NOT_STARTED; } public static void initWorld() { minesCenter = Vec3i.NULL_VECTOR; visitKeeperMessagePrinted = false; + blockPosIfLastSolutionInvalid = null; openedChestPositions.clear(); - chestLastFoundMillis = 0; prevDistToTreasure = 0; prevPlayerPos = null; - currentState = SolutionState.NOT_STARTED; resetSolution(false); } @@ -339,14 +377,15 @@ public class CrystalMetalDetectorSolver { } } - private static boolean locateMinesCenterIfNeeded() { + private static void locateMinesCenterIfNeeded() { if (minesCenter != Vec3i.NULL_VECTOR) { - return false; + return; } List keeperEntities = mc.theWorld.getEntities(EntityArmorStand.class, (entity) -> { if (!entity.hasCustomName()) return false; - return entity.getCustomNameTag().contains(KEEPER_OF_STRING); + if (entity.getCustomNameTag().contains(KEEPER_OF_STRING)) return true; + return false; }); if (keeperEntities.size() == 0) { @@ -355,7 +394,7 @@ public class CrystalMetalDetectorSolver { "[NEU] Approach a Keeper while holding the metal detector to enable faster treasure hunting.")); visitKeeperMessagePrinted = true; } - return false; + return; } EntityArmorStand keeperEntity = keeperEntities.get(0); @@ -368,11 +407,6 @@ public class CrystalMetalDetectorSolver { EnumChatFormatting.WHITE + minesCenter.toString()); mc.thePlayer.addChatMessage(new ChatComponentText( EnumChatFormatting.YELLOW + "[NEU] Faster treasure hunting is now enabled based on Keeper location.")); - return true; - } - - public static void setMinesCenter(BlockPos center) { - minesCenter = center; } private static double round(double value, int precision) { @@ -380,174 +414,42 @@ public class CrystalMetalDetectorSolver { return (double) Math.round(value * scale) / scale; } - private static void updateSolutionState() { - previousState = currentState; - + private static void checkAndDisplaySolutionState() { if (possibleBlocks.size() == 0) { - currentState = SolutionState.FAILED; - return; - } - - if (possibleBlocks.size() == 1) { - currentState = SolutionState.FOUND; + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "[NEU] Failed to find a solution.")); + logDiagnosticData(false); + resetSolution(false); return; } - // Narrow solutions using known locations if the mines center is known - if (minesCenter.equals(BlockPos.NULL_VECTOR) || debugDoNotUseCenter) { - currentState = SolutionState.MULTIPLE; - return; - } - - HashSet temp = - possibleBlocks.stream() - .filter(block -> knownChestOffsets.contains(block.subtract(minesCenter).toLong())) - .collect(Collectors.toCollection(HashSet::new)); - if (temp.size() == 0) { - currentState = SolutionState.MULTIPLE; - return; - } - - if (temp.size() == 1) { - possibleBlocks = temp; - currentState = SolutionState.FOUND_KNOWN; - return; - - } - - currentState = SolutionState.MULTIPLE_KNOWN; - } - - public static BlockPos getSolution() { - if (CrystalMetalDetectorSolver.possibleBlocks.size() != 1) { - return BlockPos.ORIGIN; + checkForSingleKnownLocationMatch(); + if (possibleBlocks.size() > 1) { + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + + "[NEU] Need another position to find solution. Possible blocks: " + possibleBlocks.size())); + } else { + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "[NEU] Found solution.")); } - - return CrystalMetalDetectorSolver.possibleBlocks.stream().iterator().next(); } - private static Vec3Comparable getPlayerPosAdjustedForEyeHeight() { - return new Vec3Comparable( + private static Vec3 getPlayerPos() { + return new Vec3( mc.thePlayer.posX, mc.thePlayer.posY + (mc.thePlayer.getEyeHeight() - mc.thePlayer.getDefaultEyeHeight()), mc.thePlayer.posZ ); } - static boolean isKnownOffset(BlockPos pos) { - return knownChestOffsets.contains(pos.subtract(minesCenter).toLong()); - } - - static boolean isAllowedBlockType(BlockPos pos) { - return mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:gold_block") || + private static boolean treasureAllowed(BlockPos pos) { + boolean airAbove = mc.theWorld. + getBlockState(pos.add(0, 1, 0)).getBlock().getRegistryName().equals("minecraft:air"); + boolean allowedBlockType = mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:gold_block") || mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:prismarine") || mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:chest") || mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:stained_glass") || mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:stained_glass_pane") || mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:wool") || mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:stained_hardened_clay"); - } - - static boolean isAirAbove(BlockPos pos) { - return mc.theWorld. - getBlockState(pos.add(0, 1, 0)).getBlock().getRegistryName().equals("minecraft:air"); - } - - private static boolean treasureAllowed(BlockPos pos) { - boolean airAbove = isAirAbove(pos); - boolean allowedBlockType = isAllowedBlockType(pos); - return isKnownOffset(pos) || (airAbove && allowedBlockType); - } - - static private String getDiagnosticMessage() { - StringBuilder diagsMessage = new StringBuilder(); - - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Mines Center: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append((minesCenter.equals(Vec3i.NULL_VECTOR)) ? "" : minesCenter.toString()); - diagsMessage.append("\n"); - - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Current Solution State: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(currentState.name()); - diagsMessage.append("\n"); - - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Previous Solution State: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(previousState.name()); - diagsMessage.append("\n"); - - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Previous Player Position: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append((prevPlayerPos == null) ? "" : prevPlayerPos.toString()); - diagsMessage.append("\n"); - - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Previous Distance To Treasure: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append((prevDistToTreasure == 0) ? "" : prevDistToTreasure); - diagsMessage.append("\n"); - - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Current Possible Blocks: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(possibleBlocks.size()); - diagsMessage.append(getFriendlyBlockPositions(possibleBlocks)); - diagsMessage.append("\n"); - - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Evaluated player positions: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(evaluatedPlayerPositions.size()); - diagsMessage.append(getFriendlyEvaluatedPositions()); - diagsMessage.append("\n"); - - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Chest locations not on known list:\n"); - diagsMessage.append(EnumChatFormatting.WHITE); - if (minesCenter != Vec3i.NULL_VECTOR) { - HashSet locationsNotOnKnownList = openedChestPositions - .stream() - .filter(block -> !knownChestOffsets.contains(block.subtract(minesCenter).toLong())) - .map(block -> block.subtract(minesCenter)) - .collect(Collectors.toCollection(HashSet::new)); - if (locationsNotOnKnownList.size() > 0) { - for (BlockPos blockPos : locationsNotOnKnownList) { - diagsMessage.append(String.format( - "%dL,\t\t// x=%d, y=%d, z=%d", - blockPos.toLong(), - blockPos.getX(), - blockPos.getY(), - blockPos.getZ() - )); - } - } - } else { - diagsMessage.append(""); - } - - return diagsMessage.toString(); - } - - public static void logDiagnosticData(boolean outputAlways) { - if (!SBInfo.getInstance().checkForSkyblockLocation()) { - return; - } - - if (!NotEnoughUpdates.INSTANCE.config.mining.metalDetectorEnabled) - { - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + - "[NEU] Metal Detector Solver is not enabled.")); - return; - } - - boolean metalDebugFlagSet = NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.contains(NEUDebugFlag.METAL); - if (outputAlways || metalDebugFlagSet) { - NEUDebugLogger.logAlways(getDiagnosticMessage()); - } + boolean knownOffset = knownChestOffsets.contains(pos.subtract(minesCenter).toLong()); + return airAbove & (knownOffset | allowedBlockType); } } 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 9a950e7f..25f39c3a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolver.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolver.java @@ -2,67 +2,27 @@ package io.github.moulberry.notenoughupdates.miscfeatures; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.core.util.Line; -import io.github.moulberry.notenoughupdates.core.util.Vec3Comparable; -import io.github.moulberry.notenoughupdates.options.NEUConfig; import io.github.moulberry.notenoughupdates.options.customtypes.NEUDebugFlag; import io.github.moulberry.notenoughupdates.util.NEUDebugLogger; import io.github.moulberry.notenoughupdates.util.SBInfo; -import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.event.ClickEvent; +import net.minecraft.event.HoverEvent; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChatStyle; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.Vec3i; -import net.minecraftforge.client.ClientCommandHandler; +import net.minecraft.util.Vec3; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.function.BooleanSupplier; -import java.util.function.LongSupplier; - public class CrystalWishingCompassSolver { - enum SolverState { - NOT_STARTED, - PROCESSING_FIRST_USE, - NEED_SECOND_COMPASS, - PROCESSING_SECOND_USE, - SOLVED, - FAILED_EXCEPTION, - FAILED_TIMEOUT_NO_REPEATING, - FAILED_TIMEOUT_NO_PARTICLES, - FAILED_INTERSECTION_CALCULATION, - FAILED_INVALID_SOLUTION, - } - - enum CompassTarget { - GOBLIN_QUEEN, - GOBLIN_KING, - BAL, - JUNGLE_TEMPLE, - ODAWA, - PRECURSOR_CITY, - MINES_OF_DIVAN, - CRYSTAL_NUCLEUS, - } - - enum Crystal { - AMBER, - AMETHYST, - JADE, - SAPPHIRE, - TOPAZ, - } - private static final CrystalWishingCompassSolver INSTANCE = new CrystalWishingCompassSolver(); public static CrystalWishingCompassSolver getInstance() { return INSTANCE; @@ -71,72 +31,40 @@ public class CrystalWishingCompassSolver { private static final Minecraft mc = Minecraft.getMinecraft(); private static boolean isSkytilsPresent = false; - // NOTE: There is a small set of breakable blocks above the nucleus at Y > 181. While this zone is reported - // as the Crystal Nucleus by Hypixel, for wishing compass purposes it is in the appropriate quadrant. - private static final AxisAlignedBB NUCLEUS_BB = new AxisAlignedBB(462, 63, 461, 564, 181, 565); - private static final AxisAlignedBB HOLLOWS_BB = new AxisAlignedBB(201, 30, 201, 824, 189, 824); - private static final AxisAlignedBB PRECURSOR_REMNANTS_BB = new AxisAlignedBB(513, 64, 513, 824, 189, 824); - private static final AxisAlignedBB MITHRIL_DEPOSITS_BB = new AxisAlignedBB(513, 64, 201, 824, 189, 512); - private static final AxisAlignedBB GOBLIN_HOLDOUT_BB = new AxisAlignedBB(201, 64, 513, 512, 189, 824); - private static final AxisAlignedBB JUNGLE_BB = new AxisAlignedBB(201, 64, 201, 512, 189, 512); - private static final AxisAlignedBB MAGMA_FIELDS_BB = new AxisAlignedBB(201, 30, 201, 824, 63, 824); - private static final double MAX_DISTANCE_BETWEEN_PARTICLES = 0.6; - private static final double MAX_DISTANCE_FROM_USE_TO_FIRST_PARTICLE = 9.0; - - // 64.0 is an arbitrary value but seems to work well - private static final double MINIMUM_DISTANCE_SQ_BETWEEN_COMPASSES = 64.0; - - // All particles typically arrive in < 3500, so 5000 should be enough buffer - public static final long ALL_PARTICLES_MAX_MILLIS = 5000L; - - 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; - private Compass firstCompass; - private Compass secondCompass; - private Line solutionIntersectionLine; - private EnumSet possibleTargets; - private Vec3Comparable solution; - private Vec3Comparable originalSolution; - private EnumSet solutionPossibleTargets; - - public SolverState getSolverState() { - return solverState; - } - - public Vec3i getSolutionCoords() { - return new Vec3i(solution.xCoord, solution.yCoord, solution.zCoord); - } - - public EnumSet getPossibleTargets() { - return possibleTargets; + // Crystal Nucleus unbreakable blocks, area coordinates reported by Hypixel server are slightly different + private static final AxisAlignedBB NUCLEUS_BB = new AxisAlignedBB(463, 63, 460, 563, 181, 564); + private static final double MAX_COMPASS_PARTICLE_SPREAD = 16; + + private static BlockPos prevPlayerPos; + private long compassUsedMillis = 0; + private Vec3 firstParticle = null; + private Vec3 lastParticle = null; + private double lastParticleDistanceFromFirst = 0; + private Line firstCompassLine = null; + private Line secondCompassLine = null; + private Vec3 solution = null; + private Line solutionIntersectionLine = null; + + private void resetForNewCompass() { + compassUsedMillis = 0; + firstParticle = null; + lastParticle = null; + lastParticleDistanceFromFirst = 0; } private void resetForNewTarget() { NEUDebugLogger.log(NEUDebugFlag.WISHING,"Resetting for new target"); - solverState = SolverState.NOT_STARTED; - firstCompass = null; - secondCompass = null; + resetForNewCompass(); + firstCompassLine = null; + secondCompassLine = null; solutionIntersectionLine = null; - possibleTargets = null; + prevPlayerPos = null; solution = null; - originalSolution = null; - solutionPossibleTargets = null; - } - - public void initWorld() { - resetForNewTarget(); } @SubscribeEvent public void onWorldLoad(WorldEvent.Unload event) { - initWorld(); + resetForNewTarget(); isSkytilsPresent = Loader.isModLoaded("skytils"); } @@ -162,101 +90,28 @@ public class CrystalWishingCompassSolver { return; } - BlockPos playerPos = mc.thePlayer.getPosition().getImmutable(); - try { - HandleCompassResult result = handleCompassUse(playerPos); - switch (result) { - case SUCCESS: - return; - case STILL_PROCESSING_PRIOR_USE: - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + - "[NEU] Wait a little longer before using the wishing compass again.")); - event.setCanceled(true); - break; - case LOCATION_TOO_CLOSE: - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + - "[NEU] Move a little further before using the wishing compass again.")); - event.setCanceled(true); - break; - case POSSIBLE_TARGETS_CHANGED: - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + - "[NEU] Possible wishing compass targets have changed. Solver has been reset.")); - event.setCanceled(true); - break; - case NO_PARTICLES_FOR_PREVIOUS_COMPASS: - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + - "[NEU] No particles detected for prior compass use. Need another position to solve.")); - break; - case PLAYER_IN_NUCLEUS: - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + - "[NEU] Wishing compass must be used outside the nucleus for accurate results.")); - event.setCanceled(true); - break; - default: - throw new IllegalStateException("Unexpected wishing compass solver state: \n" + getDiagnosticMessage()); + if (isSolved()) { + resetForNewTarget(); + } + + // 64.0 is an arbitrary value but seems to work well + if (prevPlayerPos != null && prevPlayerPos.distanceSq(mc.thePlayer.getPosition()) < 64.0) { + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + + "[NEU] Move a little further before using the wishing compass again.")); + event.setCanceled(true); + return; } + + prevPlayerPos = mc.thePlayer.getPosition().getImmutable(); + compassUsedMillis = System.currentTimeMillis(); } catch (Exception e) { mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "[NEU] Error processing wishing compass action - see log for details")); e.printStackTrace(); - event.setCanceled(true); - solverState = SolverState.FAILED_EXCEPTION; } } - 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: - 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()); - 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; - } - - if (!possibleTargets.equals(calculatePossibleTargets(playerPos))) { - resetForNewTarget(); - 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" ); - } - /* * Processes particles if the wishing compass was used within the last 5 seconds. * @@ -287,701 +142,188 @@ public class CrystalWishingCompassSolver { ) { if (!NotEnoughUpdates.INSTANCE.config.mining.wishingCompassSolver || particleType != EnumParticleTypes.VILLAGER_HAPPY || - !SBInfo.getInstance().getLocation().equals("crystal_hollows")) { + !SBInfo.getInstance().getLocation().equals("crystal_hollows") || + isSolved() || + System.currentTimeMillis() - compassUsedMillis > 5000) { return; } try { - SolverState originalSolverState = solverState; - solveUsingParticle(x, y, z, currentTimeMillis.getAsLong()); - if (solverState != originalSolverState) { - switch (solverState) { - case SOLVED: - showSolution(); - break; - case FAILED_EXCEPTION: - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + - "[NEU] Unable to determine wishing compass target.")); - logDiagnosticData(false); - break; - case FAILED_TIMEOUT_NO_REPEATING: - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + - "[NEU] Timed out waiting for repeat set of compass particles.")); - logDiagnosticData(false); - break; - case FAILED_TIMEOUT_NO_PARTICLES: - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + - "[NEU] Timed out waiting for compass particles.")); - logDiagnosticData(false); - break; - case FAILED_INTERSECTION_CALCULATION: - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + - "[NEU] Unable to determine intersection of wishing compasses.")); - logDiagnosticData(false); - break; - case FAILED_INVALID_SOLUTION: - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + - "[NEU] Failed to find solution.")); - logDiagnosticData(false); - break; - case NEED_SECOND_COMPASS: - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + - "[NEU] Need another position to determine wishing compass target.")); - break; - } - } - } catch (Exception e) { - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + - "[NEU] Exception while calculating wishing compass solution - see log for details")); - e.printStackTrace(); - } - } - - /** - * - * @param x Particle x coordinate - * @param y Particle y coordinate - * @param z Particle z coordinate - */ - public void solveUsingParticle(double x, double y, double z, long currentTimeMillis) { - Compass currentCompass; - switch (solverState) { - case PROCESSING_FIRST_USE: - currentCompass = firstCompass; - break; - case PROCESSING_SECOND_USE: - currentCompass = secondCompass; - break; - default: - return; - } - - currentCompass.processParticle(x, y, z, currentTimeMillis); - switch (currentCompass.compassState) { - case FAILED_TIMEOUT_NO_PARTICLES: - solverState = SolverState.FAILED_TIMEOUT_NO_PARTICLES; + Vec3 particleVec = new Vec3(x, y, z); + if (firstParticle == null) { + firstParticle = particleVec; return; - case FAILED_TIMEOUT_NO_REPEATING: - solverState = SolverState.FAILED_TIMEOUT_NO_REPEATING; - return; - case WAITING_FOR_FIRST_PARTICLE: - case COMPUTING_LAST_PARTICLE: - return; - case COMPLETED: - if (solverState == SolverState.NEED_SECOND_COMPASS) { - return; - } - if (solverState == SolverState.PROCESSING_FIRST_USE) { - solverState = SolverState.NEED_SECOND_COMPASS; - return; - } - break; - } - - // First and Second compasses have completed - solutionIntersectionLine = firstCompass.line.getIntersectionLineSegment(secondCompass.line); - - if (solutionIntersectionLine == null) { - solverState = SolverState.FAILED_INTERSECTION_CALCULATION; - return; - } - - solution = new Vec3Comparable(solutionIntersectionLine.getMidpoint()); - - Vec3Comparable firstDirection = firstCompass.getDirection(); - Vec3Comparable firstSolutionDirection = firstCompass.getDirectionTo(solution); - Vec3Comparable secondDirection = secondCompass.getDirection(); - Vec3Comparable secondSolutionDirection = secondCompass.getDirectionTo(solution); - if (!firstDirection.signumEquals(firstSolutionDirection) || - !secondDirection.signumEquals(secondSolutionDirection) || - !HOLLOWS_BB.isVecInside(solution)) { - solverState = SolverState.FAILED_INVALID_SOLUTION; - return; - } - - solutionPossibleTargets = getSolutionTargets(possibleTargets, solution); - - // Adjust the Jungle Temple solution coordinates - if (solutionPossibleTargets.size() == 1 && - solutionPossibleTargets.contains(CompassTarget.JUNGLE_TEMPLE)) { - originalSolution = solution; - solution = solution.addVector(-57, 36, -21); - } - - solverState = SolverState.SOLVED; - } - - private boolean isKeyInInventory() - { - for (ItemStack item : mc.thePlayer.inventory.mainInventory){ - if (item != null && item.getDisplayName().contains("Jungle Key")) { - return true; } - } - return false; - } - - private boolean isKingsScentPresent() - { - return SBInfo.getInstance().footer.getUnformattedText().contains("King's Scent I"); - } - - private EnumSet getFoundCrystals() { - EnumSet foundCrystals = EnumSet.noneOf(Crystal.class); - NEUConfig.HiddenProfileSpecific perProfileConfig = NotEnoughUpdates.INSTANCE.config.getProfileSpecific(); - if (perProfileConfig == null) return foundCrystals; - HashMap crystals = perProfileConfig.crystals; - for (String crystalName : crystals.keySet()) { - Integer crystalState = crystals.get(crystalName); - if (crystalState != null && crystalState > 0) { - foundCrystals.add(Crystal.valueOf(crystalName.toUpperCase())); - } - } - - return foundCrystals; - } - - // Returns candidates based on seen Y coordinates and quadrants that - // are not adjacent to the solution's quadrant. If the solution is - // the nucleus then a copy of the original possible targets is - // returned. - // - // NOTE: Adjacent quadrant filtering could be improved based on - // structure sizes in the future to only allow a certain - // distance into the adjacent quadrant. - // - // |----------|------------| - // | Jungle | Mithril | - // | | Deposits | - // |----------|----------- | - // | Goblin | Precursor | - // | Holdout | Deposits | - // |----------|------------| - static public EnumSet getSolutionTargets( - EnumSet possibleTargets, - Vec3Comparable solution) { - EnumSet solutionPossibleTargets; - solutionPossibleTargets = possibleTargets.clone(); - - if (NUCLEUS_BB.isVecInside(solution)) { - return solutionPossibleTargets; - } - - solutionPossibleTargets.remove(CompassTarget.CRYSTAL_NUCLEUS); - - // Eliminate non-adjacent zones first - if (MITHRIL_DEPOSITS_BB.isVecInside(solution)) { - solutionPossibleTargets.remove(CompassTarget.GOBLIN_KING); - solutionPossibleTargets.remove(CompassTarget.GOBLIN_QUEEN); - } else if (PRECURSOR_REMNANTS_BB.isVecInside(solution)) { - solutionPossibleTargets.remove(CompassTarget.ODAWA); - solutionPossibleTargets.remove(CompassTarget.JUNGLE_TEMPLE); - } else if (GOBLIN_HOLDOUT_BB.isVecInside(solution)) { - solutionPossibleTargets.remove(CompassTarget.MINES_OF_DIVAN); - } else if (JUNGLE_BB.isVecInside(solution)) { - solutionPossibleTargets.remove(CompassTarget.PRECURSOR_CITY); - } - // If there's only 1 possible target then don't remove based - // on Y coordinates since assumptions about Y coordinates could - // be wrong. - if (solutionPossibleTargets.size() > 1) { - // Y coordinates are 43-70 from 11 samples - if (solutionPossibleTargets.contains(CompassTarget.BAL) && - solution.yCoord > 72) { - solutionPossibleTargets.remove(CompassTarget.BAL); + double distanceFromFirst = particleVec.distanceTo(firstParticle); + if (distanceFromFirst > MAX_COMPASS_PARTICLE_SPREAD) { + return; } - // Y coordinates are 93-157 from 10 samples, may be able to filter - // more based on the offset of the King within the structure - if (solutionPossibleTargets.contains(CompassTarget.GOBLIN_KING) && - solution.yCoord < 64) { - solutionPossibleTargets.remove(CompassTarget.GOBLIN_KING); + if (distanceFromFirst >= lastParticleDistanceFromFirst) { + lastParticleDistanceFromFirst = distanceFromFirst; + lastParticle = particleVec; + return; } - // Y coordinates are 129-139 from 10 samples - if (solutionPossibleTargets.contains(CompassTarget.GOBLIN_QUEEN) && - (solution.yCoord < 127 || solution.yCoord > 141)) { - solutionPossibleTargets.remove(CompassTarget.GOBLIN_QUEEN); + // We get here when the second repetition of particles begins. + // Since the second repetition overlaps with the last few particles + // of the first repetition, the last particle we capture isn't truly the last. + // But that's OK since subsequent particles will be on the same line. + Line line = new Line(firstParticle, lastParticle); + if (firstCompassLine == null) { + firstCompassLine = line; + resetForNewCompass(); + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + + "[NEU] Need another position to determine wishing compass target.")); + return; } - // Y coordinates are 72-80 from 10 samples - if (solutionPossibleTargets.contains(CompassTarget.JUNGLE_TEMPLE) && - (solution.yCoord < 70 || solution.yCoord > 82)) { - solutionPossibleTargets.remove(CompassTarget.JUNGLE_TEMPLE); + secondCompassLine = line; + solutionIntersectionLine = firstCompassLine.getIntersectionLineSegment(secondCompassLine); + if (solutionIntersectionLine == null) { + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + + "[NEU] Unable to determine wishing compass target.")); + logDiagnosticData(false); + return; } - // Y coordinates are 110-128 from 3 samples, not enough data to use - if (solutionPossibleTargets.contains(CompassTarget.ODAWA) && - solution.yCoord < 64) { - solutionPossibleTargets.remove(CompassTarget.ODAWA); - } + solution = solutionIntersectionLine.getMidpoint(); - // Y coordinates are 122-129 from 8 samples - if (solutionPossibleTargets.contains(CompassTarget.PRECURSOR_CITY) && - (solution.yCoord < 119 || solution.yCoord > 132)) { - solutionPossibleTargets.remove(CompassTarget.PRECURSOR_CITY); + if (solution.distanceTo(firstParticle) < 8) { + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + + "[NEU] WARNING: Solution is likely incorrect.")); + logDiagnosticData(false); + return; } - // Y coordinates are 98-102 from 15 samples - if (solutionPossibleTargets.contains(CompassTarget.MINES_OF_DIVAN) && - (solution.yCoord < 96 || solution.yCoord > 104)) { - solutionPossibleTargets.remove(CompassTarget.MINES_OF_DIVAN); - } + showSolution(); + } catch (Exception e) { + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + + "[NEU] Exception while calculating wishing compass solution - see log for details")); + e.printStackTrace(); } - - return solutionPossibleTargets; } - private EnumSet calculatePossibleTargets(BlockPos playerPos) { - boolean targetsBasedOnZoneWithoutCrystal = false; - EnumSet candidateTargets = EnumSet.allOf(CompassTarget.class); - EnumSet foundCrystals = this.foundCrystals.getAsCrystalEnumSet(); - Vec3Comparable playerPosVec = new Vec3Comparable(playerPos); - - // If the current zone's crystal hasn't been found then remove all non-nucleus candidates other - // than the ones in the current zone. The one exception is that the king is kept when in the jungle - // since the compass can point to the king if odawa is missing (which often happens). - // The nucleus is kept since it can be returned if the structure for the current zone is missing. - if (GOBLIN_HOLDOUT_BB.isVecInside(playerPosVec) && !foundCrystals.contains(Crystal.AMBER)) { - candidateTargets.clear(); - candidateTargets.add(CompassTarget.CRYSTAL_NUCLEUS); - candidateTargets.add(CompassTarget.GOBLIN_KING); - candidateTargets.add(CompassTarget.GOBLIN_QUEEN); - targetsBasedOnZoneWithoutCrystal = true; - } - - if (JUNGLE_BB.isVecInside(playerPosVec) && !foundCrystals.contains(Crystal.AMETHYST)) { - candidateTargets.clear(); - candidateTargets.add(CompassTarget.CRYSTAL_NUCLEUS); - candidateTargets.add(CompassTarget.ODAWA); - candidateTargets.add(CompassTarget.JUNGLE_TEMPLE); - if (!keyInInventory.getAsBoolean() && !kingsScentPresent.getAsBoolean()) { - // If Odawa is missing then the king may be returned - candidateTargets.add(CompassTarget.GOBLIN_KING); - } - targetsBasedOnZoneWithoutCrystal = true; - } - - if (MITHRIL_DEPOSITS_BB.isVecInside(playerPosVec) && !foundCrystals.contains(Crystal.JADE)) { - candidateTargets.clear(); - candidateTargets.add(CompassTarget.CRYSTAL_NUCLEUS); - candidateTargets.add(CompassTarget.MINES_OF_DIVAN); - targetsBasedOnZoneWithoutCrystal = true; - } - - if (PRECURSOR_REMNANTS_BB.isVecInside(playerPosVec) && !foundCrystals.contains(Crystal.SAPPHIRE)) { - candidateTargets.clear(); - candidateTargets.add(CompassTarget.CRYSTAL_NUCLEUS); - candidateTargets.add(CompassTarget.PRECURSOR_CITY); - targetsBasedOnZoneWithoutCrystal = true; - } - - if (MAGMA_FIELDS_BB.isVecInside(playerPosVec) && !foundCrystals.contains(Crystal.TOPAZ)) { - candidateTargets.clear(); - candidateTargets.add(CompassTarget.CRYSTAL_NUCLEUS); - candidateTargets.add(CompassTarget.BAL); - targetsBasedOnZoneWithoutCrystal = true; - } - - if (!targetsBasedOnZoneWithoutCrystal) { - // Filter out crystal-based targets outside the current zone - if (foundCrystals.contains(Crystal.AMBER)) { - candidateTargets.remove(CompassTarget.GOBLIN_KING); - candidateTargets.remove(CompassTarget.GOBLIN_QUEEN); - } - - if (foundCrystals.contains(Crystal.AMETHYST)) { - candidateTargets.remove(CompassTarget.ODAWA); - candidateTargets.remove(CompassTarget.JUNGLE_TEMPLE); - } - - if (foundCrystals.contains(Crystal.JADE)) { - candidateTargets.remove(CompassTarget.MINES_OF_DIVAN); - } - - if (foundCrystals.contains(Crystal.TOPAZ)) { - candidateTargets.remove(CompassTarget.BAL); - } - - if (foundCrystals.contains(Crystal.SAPPHIRE)) { - candidateTargets.remove(CompassTarget.PRECURSOR_CITY); - } - } - - candidateTargets.remove(kingsScentPresent.getAsBoolean() ? CompassTarget.GOBLIN_KING : CompassTarget.GOBLIN_QUEEN); - candidateTargets.remove(keyInInventory.getAsBoolean() ? CompassTarget.ODAWA : CompassTarget.JUNGLE_TEMPLE); - - return candidateTargets; + private boolean isSolved() { + return solution != null; } - 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"; - } - } + private void showSolution() { + if (solution == null) return; + String description = "[NEU] Wishing compass target: "; + String coordsText = String.format("%.0f %.0f %.0f", + solution.xCoord, + solution.yCoord, + solution.zCoord); - private String getNameForCompassTarget(CompassTarget compassTarget) { - boolean useSkytilsNames = (NotEnoughUpdates.INSTANCE.config.mining.wishingCompassWaypointNameType == 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"; + if (NUCLEUS_BB.isVecInside(solution)) { + description += "Crystal Nucleus (" + coordsText + ")"; + } else { + description += coordsText; } - } - private String getSolutionCoordsText() { - return solution == null ? "" : - String.format("%.0f %.0f %.0f", solution.xCoord, solution.yCoord, solution.zCoord); - } + ChatComponentText message = new ChatComponentText(EnumChatFormatting.YELLOW + description); - private String getWishingCompassDestinationsMessage() { - StringBuilder sb = new StringBuilder(); - sb.append(EnumChatFormatting.YELLOW); - sb.append("[NEU] "); - sb.append(EnumChatFormatting.AQUA); - sb.append("Wishing compass points to "); - int index = 1; - for (CompassTarget target : solutionPossibleTargets) { - if (index > 1) { - sb.append(EnumChatFormatting.AQUA); - if (index == solutionPossibleTargets.size()) { - sb.append(" or "); - } else { - sb.append(", "); - } - } - sb.append(getFriendlyNameForCompassTarget(target)); - index++; + if (isSkytilsPresent) { + ChatStyle clickEvent = new ChatStyle().setChatClickEvent( + new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/sthw add WishingTarget " + coordsText)); + clickEvent.setChatHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ChatComponentText( + EnumChatFormatting.YELLOW + + "Add Skytils hollows waypoint"))); + message.setChatStyle(clickEvent); } - sb.append(EnumChatFormatting.AQUA); - sb.append(" ("); - sb.append(getSolutionCoordsText()); - sb.append(")"); - return sb.toString(); + Minecraft.getMinecraft().thePlayer.addChatMessage(message); } - private void showSolution() { - if (solution == null) return; - - if (NUCLEUS_BB.isVecInside(solution)) { - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "[NEU] " + - EnumChatFormatting.AQUA + "Wishing compass target is the Crystal Nucleus")); + public void logDiagnosticData(boolean outputAlways) { + if (SBInfo.getInstance().getLocation() == null) { + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + + "[NEU] This command is not available outside SkyBlock")); return; } - String destinationMessage = getWishingCompassDestinationsMessage(); - - if (!isSkytilsPresent) { - mc.thePlayer.addChatMessage(new ChatComponentText(destinationMessage)); + if (!NotEnoughUpdates.INSTANCE.config.mining.wishingCompassSolver) + { + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + + "[NEU] Wishing Compass Solver is not enabled.")); return; } - String targetNameForSkytils = solutionPossibleTargets.size() == 1 ? - getNameForCompassTarget(solutionPossibleTargets.iterator().next()) : - "WishingTarget"; - String skytilsCommand = String.format("/sthw add %s %s", targetNameForSkytils, getSolutionCoordsText()); - if (NotEnoughUpdates.INSTANCE.config.mining.wishingCompassAutocreateKnownWaypoints && - solutionPossibleTargets.size() == 1) { - mc.thePlayer.addChatMessage(new ChatComponentText(destinationMessage)); - int commandResult = ClientCommandHandler.instance.executeCommand(mc.thePlayer, skytilsCommand); - if (commandResult == 1) - { - return; - } - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "[NEU] Failed to automatically run /sthw")); + if (!outputAlways && !NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.contains(NEUDebugFlag.WISHING)) { + return; } - 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\n")); - mc.thePlayer.addChatMessage(chatMessage); - } + boolean originalDebugFlag = !NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.add(NEUDebugFlag.WISHING); - private String getDiagnosticMessage() { StringBuilder diagsMessage = new StringBuilder(); + diagsMessage.append("\n"); diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Solver State: "); + diagsMessage.append("Skytils Present: "); diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(solverState.name()); + diagsMessage.append(isSkytilsPresent); diagsMessage.append("\n"); - if (firstCompass == null) { - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("First Compass: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(""); - diagsMessage.append("\n"); - } else { - firstCompass.appendCompassDiagnostics(diagsMessage, "First Compass"); - } - - if (secondCompass == null) { - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Second Compass: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(""); - diagsMessage.append("\n"); - } else { - secondCompass.appendCompassDiagnostics(diagsMessage, "Second Compass"); - } - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Intersection Line: "); + diagsMessage.append("Compass Used Millis: "); diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append((solutionIntersectionLine == null) ? "" : solutionIntersectionLine); + diagsMessage.append(compassUsedMillis); diagsMessage.append("\n"); diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Jungle Key in Inventory: "); + diagsMessage.append("Compass Used Position: "); diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(isKeyInInventory()); + diagsMessage.append((prevPlayerPos == null) ? "" : prevPlayerPos.toString()); diagsMessage.append("\n"); diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("King's Scent Present: "); + diagsMessage.append("First Particle: "); diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(isKingsScentPresent()); + diagsMessage.append((firstParticle == null) ? "" : firstParticle.toString()); diagsMessage.append("\n"); diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("First Compass Targets: "); + diagsMessage.append("Last Particle: "); diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(possibleTargets == null ? "" : possibleTargets.toString()); + diagsMessage.append((lastParticle == null) ? "" : lastParticle.toString()); diagsMessage.append("\n"); diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Current Calculated Targets: "); + diagsMessage.append("Last Particle Distance From First: "); diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(calculatePossibleTargets(mc.thePlayer.getPosition())); + diagsMessage.append(lastParticleDistanceFromFirst); diagsMessage.append("\n"); diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Found Crystals: "); + diagsMessage.append("First Compass Line: "); diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(getFoundCrystals()); + diagsMessage.append((firstCompassLine == null) ? "" : firstCompassLine.toString()); diagsMessage.append("\n"); - if (originalSolution != null) { - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Original Solution: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(originalSolution); - diagsMessage.append("\n"); - } - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Solution: "); + diagsMessage.append("Second Compass Line: "); diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append((solution == null) ? "" : solution.toString()); + diagsMessage.append((secondCompassLine == null) ? "" : secondCompassLine.toString()); diagsMessage.append("\n"); diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Solution Targets: "); + diagsMessage.append("Intersection Line: "); diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append((solutionPossibleTargets == null) ? "" : solutionPossibleTargets.toString()); + diagsMessage.append((secondCompassLine == null) ? "" : solutionIntersectionLine); diagsMessage.append("\n"); - return diagsMessage.toString(); - } - - public void logDiagnosticData(boolean outputAlways) { - if (!SBInfo.getInstance().checkForSkyblockLocation()) { - return; - } - - if (!NotEnoughUpdates.INSTANCE.config.mining.wishingCompassSolver) - { - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + - "[NEU] Wishing Compass Solver is not enabled.")); - return; - } - - boolean wishingDebugFlagSet = NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.contains(NEUDebugFlag.WISHING); - if (outputAlways || wishingDebugFlagSet) { - NEUDebugLogger.logAlways(getDiagnosticMessage()); - } - } - - enum CompassState { - WAITING_FOR_FIRST_PARTICLE, - COMPUTING_LAST_PARTICLE, - COMPLETED, - FAILED_TIMEOUT_NO_REPEATING, - FAILED_TIMEOUT_NO_PARTICLES, - } - - enum HandleCompassResult { - SUCCESS, - LOCATION_TOO_CLOSE, - STILL_PROCESSING_PRIOR_USE, - POSSIBLE_TARGETS_CHANGED, - NO_PARTICLES_FOR_PREVIOUS_COMPASS, - PLAYER_IN_NUCLEUS - } - - static class Compass { - public CompassState compassState; - public Line line = null; - - private final BlockPos whereUsed; - private final long whenUsedMillis; - private Vec3Comparable firstParticle = null; - private Vec3Comparable previousParticle = null; - private Vec3Comparable lastParticle = null; - private final ArrayList processedParticles; - - Compass(BlockPos whereUsed, long whenUsedMillis) { - this.whereUsed = whereUsed; - this.whenUsedMillis = whenUsedMillis; - compassState = CompassState.WAITING_FOR_FIRST_PARTICLE; - processedParticles = new ArrayList<>(); - } - - public Vec3Comparable getDirection() { - if (firstParticle == null || lastParticle == null) { - return null; - } - - return new Vec3Comparable(firstParticle.subtractReverse(lastParticle).normalize()); - } - - public Vec3Comparable getDirectionTo(Vec3Comparable target) { - if (firstParticle == null || target == null) { - return null; - } - - return new Vec3Comparable(firstParticle.subtractReverse(target).normalize()); - } - - public double particleSpread() { - if (firstParticle == null || lastParticle == null) { - return 0.0; - } - return firstParticle.distanceTo(lastParticle); - } - - 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) { - throw new UnsupportedOperationException("processParticle should not be called in a failed or completed state"); - } - - if (particleTimeMillis - this.whenUsedMillis > ALL_PARTICLES_MAX_MILLIS) { - // Assume we have failed if we're still trying to process particles - compassState = CompassState.FAILED_TIMEOUT_NO_REPEATING; - return; - } - - Vec3Comparable currentParticle = new Vec3Comparable(x, y, z); - if (compassState == CompassState.WAITING_FOR_FIRST_PARTICLE) { - if (currentParticle.distanceTo(new Vec3Comparable(whereUsed)) < MAX_DISTANCE_FROM_USE_TO_FIRST_PARTICLE) { - processedParticles.add(new ProcessedParticle(currentParticle, particleTimeMillis)); - firstParticle = currentParticle; - previousParticle = currentParticle; - compassState = CompassState.COMPUTING_LAST_PARTICLE; - } - return; - } - - // State is COMPUTING_LAST_PARTICLE, keep updating the previousParticle until - // the first particle in the second sequence is seen. - if (currentParticle.distanceTo(previousParticle) <= MAX_DISTANCE_BETWEEN_PARTICLES) { - processedParticles.add(new ProcessedParticle(currentParticle, particleTimeMillis)); - previousParticle = currentParticle; - return; - } - - if (currentParticle.distanceTo(firstParticle) > MAX_DISTANCE_BETWEEN_PARTICLES) { - return; - } - - // It's a repeating particle - processedParticles.add(new ProcessedParticle(currentParticle, particleTimeMillis)); - lastParticle = previousParticle; - line = new Line(firstParticle, lastParticle); - compassState = CompassState.COMPLETED; - } - - public void appendCompassDiagnostics(StringBuilder diagsMessage, String compassName) { - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Compass State: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(compassState.name()); - diagsMessage.append("\n"); - - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append(compassName); - diagsMessage.append(" Used Millis: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(whenUsedMillis); - diagsMessage.append("\n"); - - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append(compassName); - diagsMessage.append(" Used Position: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append((whereUsed == null) ? "" : whereUsed.toString()); - diagsMessage.append("\n"); - - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append(compassName); - diagsMessage.append(" All Seen Particles: \n"); - diagsMessage.append(EnumChatFormatting.WHITE); - for (ProcessedParticle particle : processedParticles) { - diagsMessage.append(particle.toString()); - diagsMessage.append("\n"); - } - - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append(compassName); - diagsMessage.append(" Particle Spread: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(particleSpread()); - diagsMessage.append("\n"); - - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append(compassName); - diagsMessage.append(" Compass Line: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append((line == null) ? "" : line.toString()); - diagsMessage.append("\n"); - } - - static class ProcessedParticle { - Vec3Comparable coords; - long particleTimeMillis; + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("Solution: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append((solution == null) ? "" : solution.toString()); + diagsMessage.append("\n"); - ProcessedParticle(Vec3Comparable coords, long particleTimeMillis) { - this.coords = coords; - this.particleTimeMillis = particleTimeMillis; - } + NEUDebugLogger.log(NEUDebugFlag.WISHING, diagsMessage.toString()); - @Override - public String toString() { - return coords.toString() + " " + particleTimeMillis; - } + if (!originalDebugFlag) { + NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.remove(NEUDebugFlag.WISHING); } } } 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 f793baf0..6cfb8c04 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 @@ -641,42 +641,6 @@ public class Mining { @ConfigAccordionId(id = 6) public int crystalHollowNoneColor = 12; - @ConfigOption( - name = "Wishing Compass Solver", - desc = "" - ) - @ConfigEditorAccordion(id = 7) - public boolean wishingCompassSolverAccordion = false; - - @Expose - @ConfigOption( - name = "Enable Solver", - desc = "Show wishing compass target coordinates based on two samples" - ) - @ConfigAccordionId(id = 7) - @ConfigEditorBoolean - public boolean wishingCompassSolver = true; - - @Expose - @ConfigOption( - name = "Skytils Waypoints", - desc = "Automatically create Skytils waypoints for well-known targets" - ) - @ConfigAccordionId(id = 7) - @ConfigEditorBoolean - public boolean wishingCompassAutocreateKnownWaypoints = false; - - @Expose - @ConfigOption( - name = "Waypoint Type", - desc = "Skytils Waypoint name type. Skytils Built-in will be overwritten by Skytils when the waypoint is nearby." - ) - @ConfigAccordionId(id = 7) - @ConfigEditorDropdown( - values = {"NEU", "Skytils"} - ) - public int wishingCompassWaypointNameType = 0; - @Expose @ConfigOption( name = "Puzzler Solver", @@ -701,11 +665,19 @@ public class Mining { @ConfigEditorBoolean public boolean titaniumAlertMustBeVisible = false; + @Expose + @ConfigOption( + name = "Wishing Compass Solver", + desc = "Show wishing compass target coordinates based on two samples" + ) + @ConfigEditorBoolean + public boolean wishingCompassSolver = true; + @ConfigOption( name = "Custom Textures", desc = "" ) - @ConfigEditorAccordion(id = 8) + @ConfigEditorAccordion(id = 7) public boolean texturesAccordion = false; @Expose @@ -713,7 +685,7 @@ public class Mining { name = "Dwarven Mines Textures", desc = "Allows texture packs to retexture blocks in the Dwarven Mines. If you don't have a texture pack that does this, you should leave this off" ) - @ConfigAccordionId(id = 8) + @ConfigAccordionId(id = 7) @ConfigEditorBoolean public boolean dwarvenTextures = false; @Expose @@ -721,7 +693,7 @@ public class Mining { name = "Crystal Hollows Textures", desc = "Allows texture packs to retexture blocks in the Crystal Hollows. If you don't have a texture pack that does this, you should leave this off" ) - @ConfigAccordionId(id = 8) + @ConfigAccordionId(id = 7) @ConfigEditorBoolean public boolean crystalHollowTextures = false; @@ -730,7 +702,7 @@ public class Mining { name = "Replace Gemstone sounds", desc = "Replace the break sounds of crystals in the Crystal Hollows. Requires a texture pack with this feature" ) - @ConfigAccordionId(id = 8) + @ConfigAccordionId(id = 7) @ConfigEditorBoolean public boolean gemstoneSounds = false; @@ -739,7 +711,7 @@ public class Mining { name = "Replace Mithril sounds", desc = "Replace the break sounds of mithril and titanium in the Dwarven mines. Requires a texture pack with this feature" ) - @ConfigAccordionId(id = 8) + @ConfigAccordionId(id = 7) @ConfigEditorBoolean public boolean mithrilSounds = false; 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 dafbe202..48410404 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 @@ -107,6 +107,7 @@ public class Misc { @Expose @ConfigOption( + name = "Edit Enchant Colours", desc = "Change the colours of certain skyblock enchants (/neuec)" ) diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java index 2e1d0619..04fe6e6b 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java @@ -49,7 +49,7 @@ public class ProfileViewer { "\u00a7eMining", "\u00a7eBingo", }, - allowRemovingElements = false + allowDeleting = false ) public List pageLayout = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7)); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BingoPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BingoPage.java index 60d1e513..6108901c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BingoPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BingoPage.java @@ -298,12 +298,14 @@ public class BingoPage { NotEnoughUpdates.INSTANCE.manager.hypixelApi.getHypixelApiAsync( NotEnoughUpdates.INSTANCE.config.apiKey.apiKey, "resources/skyblock/bingo", - args - ).thenAccept(jsonObject -> { - if (jsonObject.has("success") && jsonObject.get("success").getAsBoolean()) { - bingoGoals = jsonArrayToJsonObjectList(jsonObject.get("goals").getAsJsonArray()); - currentEventId = jsonObject.get("id").getAsInt(); - } - }); + args, + jsonObject -> { + if (jsonObject.has("success") && jsonObject.get("success").getAsBoolean()) { + bingoGoals = jsonArrayToJsonObjectList(jsonObject.get("goals").getAsJsonArray()); + currentEventId = jsonObject.get("id").getAsInt(); + } + }, + () -> {} + ); } } 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 898f9e11..11c10ea0 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java @@ -67,6 +67,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.TimeZone; import java.util.TreeMap; @@ -1956,6 +1957,12 @@ public class GuiProfileViewer extends GuiScreen { } } + NBTTagCompound nbt = new NBTTagCompound(); //Adding NBT Data for Custom Resource Packs + NBTTagCompound display = new NBTTagCompound(); + display.setString("Name", skillName); + nbt.setTag("display", display); + stack.setTagCompound(nbt); + GL11.glTranslatef((x), (y - 6f), 0); GL11.glScalef(0.7f, 0.7f, 1); Utils.drawItemStackLinear(stack, 0, 0); @@ -1964,11 +1971,32 @@ public class GuiProfileViewer extends GuiScreen { } private ItemStack getQuestionmarkSkull() { - return Utils.createSkull( - EnumChatFormatting.RED + "Unknown Pet", - "Unknown Pet", - "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmM4ZWExZjUxZjI1M2ZmNTE0MmNhMTFhZTQ1MTkzYTRhZDhjM2FiNWU5YzZlZWM4YmE3YTRmY2I3YmFjNDAifX19" - ); + String textureLink = "bc8ea1f51f253ff5142ca11ae45193a4ad8c3ab5e9c6eec8ba7a4fcb7bac40"; + + String b64Decoded = + "{\"textures\":{\"SKIN\":{\"url\":\"http://textures.minecraft.net/texture/" + textureLink + "\"}}}"; + String b64Encoded = new String(Base64.getEncoder().encode(b64Decoded.getBytes())); + + ItemStack stack = new ItemStack(Items.skull, 1, 3); + NBTTagCompound nbt = new NBTTagCompound(); + NBTTagCompound skullOwner = new NBTTagCompound(); + NBTTagCompound properties = new NBTTagCompound(); + NBTTagList textures = new NBTTagList(); + NBTTagCompound textures_0 = new NBTTagCompound(); + + String uuid = UUID.nameUUIDFromBytes(b64Encoded.getBytes()).toString(); + skullOwner.setString("Id", uuid); + skullOwner.setString("Name", uuid); + + textures_0.setString("Value", b64Encoded); + textures.appendTag(textures_0); + + properties.setTag("textures", textures); + skullOwner.setTag("Properties", properties); + nbt.setTag("SkullOwner", skullOwner); + stack.setTagCompound(nbt); + stack.setStackDisplayName(EnumChatFormatting.RED + "Unknown Pet"); + return stack; } private void drawPetsPage(int mouseX, int mouseY, float partialTicks) { @@ -5303,24 +5331,37 @@ public class GuiProfileViewer extends GuiScreen { } public enum ProfileViewerPage { - LOADING(-1, null), - INVALID_NAME(-1, null), - NO_SKYBLOCK(-1, null), - BASIC(0, new ItemStack(Items.paper)), - DUNGEON(1, new ItemStack(Item.getItemFromBlock(Blocks.deadbush))), - EXTRA(2, new ItemStack(Items.book)), - INVENTORIES(3, new ItemStack(Item.getItemFromBlock(Blocks.ender_chest))), - COLLECTIONS(4, new ItemStack(Items.painting)), - PETS(5, new ItemStack(Items.bone)), - MINING(6, new ItemStack(Items.iron_pickaxe)), - BINGO(7, new ItemStack(Items.filled_map)); + LOADING(), + INVALID_NAME(), + NO_SKYBLOCK(), + BASIC(0, Items.paper, "Your Skills"), + DUNGEON(1, Item.getItemFromBlock(Blocks.deadbush), "Dungeoneering"), + EXTRA(2, Items.book, "Profile Stats"), + INVENTORIES(3, Item.getItemFromBlock(Blocks.ender_chest), "Storage"), + COLLECTIONS(4, Items.painting, "Collections"), + PETS(5, Items.bone, "Pets"), + MINING(6, Items.iron_pickaxe, "Heart of the Mountain"), + BINGO(7, Items.filled_map, "Bingo"); public final ItemStack stack; public final int id; - ProfileViewerPage(int id, ItemStack stack) { + ProfileViewerPage() { + this(-1, null, null); + } + + ProfileViewerPage(int id, Item item, String name) { this.id = id; - this.stack = stack; + if (item == null) { + stack = null; + } else { + stack = new ItemStack(item); + NBTTagCompound nbt = new NBTTagCompound(); //Adding NBT Data for Custom Resource Packs + NBTTagCompound display = new NBTTagCompound(); + display.setString("Name", name); + nbt.setTag("display", display); + stack.setTagCompound(nbt); + } } public static ProfileViewerPage getById(int id) { @@ -5331,6 +5372,11 @@ public class GuiProfileViewer extends GuiScreen { } return null; } + + public Optional getItem() { + return Optional.ofNullable(stack); + } + } public static class PetLevel { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/NEUDebugLogger.java b/src/main/java/io/github/moulberry/notenoughupdates/util/NEUDebugLogger.java index 827a3e97..d662a872 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/NEUDebugLogger.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/NEUDebugLogger.java @@ -13,8 +13,6 @@ import java.util.function.Consumer; public class NEUDebugLogger { private static final Minecraft mc = Minecraft.getMinecraft(); public static Consumer logMethod = NEUDebugLogger::chatLogger; - // Used to prevent accessing NEUConfig in unit tests - public static boolean allFlagsEnabled = false; private static void chatLogger(String message) { mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "[NEU DEBUG] " + message)); @@ -25,13 +23,7 @@ public class NEUDebugLogger { } public static void log(NEUDebugFlag flag, String message) { - if (logMethod != null && (allFlagsEnabled || isFlagEnabled(flag))) { - logAlways(message); - } - } - - public static void logAlways(String message) { - if (logMethod != null) { + if (logMethod != null && isFlagEnabled(flag)) { logMethod.accept(message); } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java b/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java index a557eb12..5b7bd055 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java @@ -18,8 +18,6 @@ import net.minecraft.scoreboard.Score; import net.minecraft.scoreboard.ScoreObjective; import net.minecraft.scoreboard.ScorePlayerTeam; import net.minecraft.scoreboard.Scoreboard; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IChatComponent; import net.minecraftforge.client.event.ClientChatReceivedEvent; import net.minecraftforge.client.event.GuiOpenEvent; @@ -59,7 +57,7 @@ public class SBInfo { public String slayer = ""; public boolean stranded = false; - public String mode = null; + public String mode = ""; public Date currentTimeDate = null; @@ -122,16 +120,6 @@ public class SBInfo { } } - public boolean checkForSkyblockLocation() { - if (!NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard() || getLocation() == null) { - Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + - "[NEU] This command is not available outside SkyBlock")); - return false; - } - - return true; - } - private static final Pattern PROFILE_PATTERN = Pattern.compile("(?(♲ Ironman)|(☀ Stranded)|()) *Profile: (?[^ ]+)"); diff --git a/src/test/java/io/github/moulberry/notenoughupdates/core/util/Vec3ComparableTest.java b/src/test/java/io/github/moulberry/notenoughupdates/core/util/Vec3ComparableTest.java deleted file mode 100644 index c0b451e3..00000000 --- a/src/test/java/io/github/moulberry/notenoughupdates/core/util/Vec3ComparableTest.java +++ /dev/null @@ -1,193 +0,0 @@ -package io.github.moulberry.notenoughupdates.core.util; - -import net.minecraft.util.BlockPos; -import net.minecraft.util.Vec3; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class Vec3ComparableTest { - @Test - void equals_false_when_null() { - // Arrange - Vec3Comparable vec3c = new Vec3Comparable(1.0, 2.0, 3.0); - - // Act - boolean areEqual = vec3c.equals(null); - - // Assert - assertFalse(areEqual); - } - - @Test - void equals_true_when_same_object() { - // Arrange - Vec3Comparable vec3c = new Vec3Comparable(1.0, 2.0, 3.0); - - // Act - boolean areEqual = vec3c.equals(vec3c); - - // Assert - assertTrue(areEqual); - } - - @Test - void equals_true_when_same_value() { - // Arrange - Vec3Comparable vec3c1 = new Vec3Comparable(1.0, 2.0, 3.0); - Vec3Comparable vec3c2 = new Vec3Comparable(1.0, 2.0, 3.0); - - // Act - boolean areEqual = vec3c1.equals(vec3c2); - - // Assert - assertTrue(areEqual); - } - - @Test - void equals_false_when_vec3_equals() { - // Arrange - Vec3Comparable vec3c1 = new Vec3Comparable(1.0, 2.0, 3.0); - Vec3 vec3c2 = new Vec3(1.0, 2.0, 3.0); - - // Act - boolean areEqual = vec3c1.equals(vec3c2); - - // Assert - assertFalse(areEqual); - } - - @Test - void equals_false_when_different_object_type() { - // Arrange - Vec3Comparable vec3c1 = new Vec3Comparable(1.0, 2.0, 3.0); - BlockPos blockPos = new BlockPos(1.0, 2.0, 3.0); - - // Act - boolean areEqual = vec3c1.equals(blockPos); - - // Assert - assertFalse(areEqual); - } - - @Test - void equals_false_when_different_value() { - // Arrange - Vec3Comparable vec3c1 = new Vec3Comparable(1.0, 2.0, 3.0); - Vec3Comparable vec3c2 = new Vec3Comparable(3.0, 2.0, 1.0); - - // Act - boolean areEqual = vec3c1.equals(vec3c2); - - // Assert - assertFalse(areEqual); - } - - @Test - void hashCode_same_when_same_value() { - // Arrange - Vec3Comparable vec3c1 = new Vec3Comparable(1.0, 2.0, 3.0); - Vec3Comparable vec3c2 = new Vec3Comparable(1.0, 2.0, 3.0); - - // Act - double vec3c1Hash = vec3c1.hashCode(); - double vec3c2Hash = vec3c2.hashCode(); - - // Assert - assertEquals(vec3c1Hash, vec3c2Hash); - } - - @Test - void hashCode_different_when_different_value() { - // Arrange - Vec3Comparable vec3c1 = new Vec3Comparable(1.0, 2.0, 3.0); - Vec3Comparable vec3c2 = new Vec3Comparable(3.0, 2.0, 1.0); - - // Act - double vec3c1Hash = vec3c1.hashCode(); - double vec3c2Hash = vec3c2.hashCode(); - - // Assert - assertNotEquals(vec3c1Hash, vec3c2Hash); - } - - @Test - void compareTo_zero_when_equal() { - // Arrange - Vec3Comparable vec3c1 = new Vec3Comparable(1.0, 2.0, 3.0); - Vec3Comparable vec3c2 = new Vec3Comparable(1.0, 2.0, 3.0); - - // Act - int result = vec3c1.compareTo(vec3c2); - - // Assert - assertEquals(0, result); - } - - @Test - void compareTo_negative_when_lower() { - // Arrange - Vec3Comparable vec3c1 = new Vec3Comparable(0.0, 2.0, 3.0); - Vec3Comparable vec3c2 = new Vec3Comparable(1.0, 2.0, 3.0); - - // Act - int result = vec3c1.compareTo(vec3c2); - - // Assert - assertTrue(result < 0); - } - - @Test - void compareTo_positive_when_x_y_or_z_is_higher() { - // Arrange - Vec3Comparable vec3c1x = new Vec3Comparable(2.0, 2.0, 3.0); - Vec3Comparable vec3c2x = new Vec3Comparable(1.0, 2.0, 3.0); - Vec3Comparable vec3c1y = new Vec3Comparable(1.0, 3.0, 3.0); - Vec3Comparable vec3c2y = new Vec3Comparable(1.0, 2.0, 3.0); - Vec3Comparable vec3c1z = new Vec3Comparable(1.0, 2.0, 4.0); - Vec3Comparable vec3c2z = new Vec3Comparable(1.0, 2.0, 3.0); - - // Act - int resultX = vec3c1x.compareTo(vec3c2x); - int resultY = vec3c1y.compareTo(vec3c2y); - int resultZ = vec3c1z.compareTo(vec3c2z); - - // Assert - assertTrue(resultX > 0); - assertTrue(resultY > 0); - assertTrue(resultZ > 0); - } - - @Test - void compareTo_throws_on_null() { - // Arrange - Vec3Comparable vec3c = new Vec3Comparable(1.0, 2.0, 3.0); - - // Act & Assert - Assertions.assertThrows(NullPointerException.class, () -> { - vec3c.compareTo(null); - }); - } - - @Test - void signumEquals_is_true_when_all_signums_match() { - Vec3Comparable first = new Vec3Comparable(-1.0, 1.0, 0); - Vec3 second = new Vec3(-1.0, 1.0, 0); - Assertions.assertTrue(first.signumEquals(second)); - } - - @Test - void signumEquals_is_false_when_any_signum_differs() { - Vec3Comparable first = new Vec3Comparable(-1.0, 1.0, 0); - Vec3 second = new Vec3(-1.0, 1.0, 1.0); - Vec3 third = new Vec3(-1.0, -1.0, 0); - Vec3 fourth = new Vec3(1.0, 1.0, 1.0); - Assertions.assertFalse(first.signumEquals(second)); - Assertions.assertFalse(first.signumEquals(third)); - Assertions.assertFalse(first.signumEquals(fourth)); - } -} diff --git a/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolverTest.java b/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolverTest.java deleted file mode 100644 index 58233410..00000000 --- a/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolverTest.java +++ /dev/null @@ -1,204 +0,0 @@ -package io.github.moulberry.notenoughupdates.miscfeatures; - -import io.github.moulberry.notenoughupdates.core.util.Vec3Comparable; -import io.github.moulberry.notenoughupdates.miscfeatures.CrystalMetalDetectorSolver.SolutionState; -import io.github.moulberry.notenoughupdates.util.NEUDebugLogger; -import net.minecraft.util.BlockPos; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.Assertions; - -import java.util.ArrayList; - -class CrystalMetalDetectorSolverTest { - class Location { - double distance; - Vec3Comparable playerPosition; - SolutionState expectedState; - boolean centerKnown; - - public Location(double distance, - Vec3Comparable playerPosition, - SolutionState expectedState, - boolean centerKnown) { - this.distance = distance; - this.playerPosition = playerPosition; - this.expectedState = expectedState; - this.centerKnown = centerKnown; - } - } - - class Solution { - ArrayList locations = new ArrayList<>(); - BlockPos center = BlockPos.ORIGIN; - BlockPos expectedSolution = BlockPos.ORIGIN; - } - - @BeforeEach - void setUp() { - CrystalMetalDetectorSolver.initWorld(); - CrystalMetalDetectorSolver.treasureAllowedPredicate = blockPos -> true; - NEUDebugLogger.logMethod = CrystalMetalDetectorSolverTest::neuDebugLog; - NEUDebugLogger.allFlagsEnabled = true; - } - - private void findPossibleSolutionsTwice(Location loc, boolean centerNewlyDiscovered) { - // Each location has to be received twice to be valid - CrystalMetalDetectorSolver.findPossibleSolutions(loc.distance, loc.playerPosition, centerNewlyDiscovered); - CrystalMetalDetectorSolver.findPossibleSolutions(loc.distance, loc.playerPosition, false); - } - - private void checkSolution(Solution solution) { - boolean centerSet = false; - int index = 0; - for (Location loc : solution.locations) { - if (loc.centerKnown && !centerSet && !solution.center.equals(BlockPos.ORIGIN)) { - CrystalMetalDetectorSolver.setMinesCenter(solution.center); - centerSet = true; - findPossibleSolutionsTwice(loc, true); - } else { - findPossibleSolutionsTwice(loc, false); - } - Assertions.assertEquals(loc.expectedState, - CrystalMetalDetectorSolver.currentState, - "Location index " + index); - index++; - } - - Assertions.assertEquals(solution.expectedSolution, CrystalMetalDetectorSolver.getSolution()); - } - - @Test - void findPossibleSolutions_single_location_sample_is_ignored() { - Location location = new Location(37.3, - new Vec3Comparable(779.1057116115207, 70.5, 502.2997937667801), - SolutionState.MULTIPLE, - false); - - CrystalMetalDetectorSolver.findPossibleSolutions(location.distance, location.playerPosition, false); - Assertions.assertEquals(SolutionState.NOT_STARTED, CrystalMetalDetectorSolver.previousState, - "Previous state"); - Assertions.assertEquals(SolutionState.NOT_STARTED, CrystalMetalDetectorSolver.currentState, - "Current state"); - } - - @Test - void findPossibleSolutions_currentState_becomes_previousState() { - Location location = new Location(37.3, - new Vec3Comparable(779.1057116115207, 70.5, 502.2997937667801), - SolutionState.MULTIPLE, - false); - - findPossibleSolutionsTwice(location, false); - Assertions.assertEquals(SolutionState.NOT_STARTED, CrystalMetalDetectorSolver.previousState, - "Previous state"); - Assertions.assertEquals(location.expectedState, CrystalMetalDetectorSolver.currentState, - "Current state"); - } - - @Test - void findPossibleSolutions_state_is_invalid_when_solution_and_distance_mismatch() { - Solution solution = new Solution(); - solution.center = new BlockPos(736, 88, 547); - solution.expectedSolution = new BlockPos(722, 67, 590); - solution.locations.add(new Location(67.5, - new Vec3Comparable(757.8235166144441, 68.0, 532.8037800566217), - SolutionState.FOUND_KNOWN, - true)); - // slightly different player position with invalid distance - solution.locations.add(new Location(4.0, - new Vec3Comparable(757.8235166144441, 69.0, 532.8037800566217), - SolutionState.INVALID, - true)); - checkSolution(solution); - } - - @Test - void findPossibleSolutions_state_is_failed_when_second_location_eliminates_all_blocks() { - Solution solution = new Solution(); - solution.center = new BlockPos(736, 88, 547); - solution.locations.add(new Location(29.4, - new Vec3Comparable(721.5979761606153, 68.0, 590.9056839507032), - SolutionState.MULTIPLE_KNOWN, - true)); - solution.locations.add(new Location(4.0, // actual distance should be 38.2 - new Vec3Comparable(711.858759313838, 67.0, 590.3583935310772), - SolutionState.FAILED, - true)); - checkSolution(solution); - } - - @Test - void findPossibleSolutions_state_is_found_known_when_center_found_after_location() { - Solution solution = new Solution(); - solution.center = new BlockPos(736, 88, 547); - solution.locations.add(new Location(67.5, - new Vec3Comparable(757.8235166144441, 68.0, 532.8037800566217), - SolutionState.MULTIPLE, - false)); - checkSolution(solution); - - solution.locations.get(0).centerKnown = true; - solution.locations.get(0).expectedState = SolutionState.FOUND_KNOWN; - solution.expectedSolution = new BlockPos(722, 67, 590); - checkSolution(solution); - } - - @Test - void findPossibleSolutions_state_is_found_when_single_known_location() { - Solution solution = new Solution(); - solution.center = new BlockPos(736, 88, 547); - solution.expectedSolution = new BlockPos(722, 67, 590); - solution.locations.add(new Location(67.5, - new Vec3Comparable(757.8235166144441, 68.0, 532.8037800566217), - SolutionState.FOUND_KNOWN, - true)); - checkSolution(solution); - } - - @Test - void findPossibleSolutions_states_are_correct_using_multiple_locations_with_unknown_center() { - Solution solution = new Solution(); - solution.locations.add(new Location(37.3, - new Vec3Comparable(779.1057116115207, 70.5, 502.2997937667801), - SolutionState.MULTIPLE, - false)); - solution.locations.add(new Location(34.8, - new Vec3Comparable(782.6999999880791, 71.0, 508.69999998807907), - SolutionState.FOUND, - false)); - solution.expectedSolution = new BlockPos(758, 67, 533); - - checkSolution(solution); - } - - @Test - void findPossibleSolutions_states_are_correct_when_multiple_known_locations_found() { - Solution solution = new Solution(); - - // First, validate that the solution doesn't work without the center - solution.locations.add(new Location(29.4, - new Vec3Comparable(721.5979761606153, 68.0, 590.9056839507032), - SolutionState.MULTIPLE, - false)); - solution.locations.add(new Location(38.2, - new Vec3Comparable(711.858759313838, 67.0, 590.3583935310772), - SolutionState.MULTIPLE, - false)); - checkSolution(solution); - - // Now validate that the solution works with the center - CrystalMetalDetectorSolver.resetSolution(false); - solution.locations.get(0).expectedState = SolutionState.MULTIPLE_KNOWN; - solution.locations.get(0).centerKnown = true; - solution.locations.get(1).expectedState = SolutionState.FOUND_KNOWN; - solution.locations.get(1).centerKnown = true; - solution.expectedSolution = new BlockPos(748, 66, 578); - solution.center = new BlockPos(736, 88, 547); - checkSolution(solution); - } - - private static void neuDebugLog(String message) { - System.out.println(message); - } -} diff --git a/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolverTest.java b/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolverTest.java deleted file mode 100644 index ed39a505..00000000 --- a/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolverTest.java +++ /dev/null @@ -1,1206 +0,0 @@ -package io.github.moulberry.notenoughupdates.miscfeatures; - -import io.github.moulberry.notenoughupdates.core.util.Vec3Comparable; -import io.github.moulberry.notenoughupdates.miscfeatures.CrystalWishingCompassSolver.CompassTarget; -import io.github.moulberry.notenoughupdates.miscfeatures.CrystalWishingCompassSolver.HandleCompassResult; -import io.github.moulberry.notenoughupdates.miscfeatures.CrystalWishingCompassSolver.SolverState; -import io.github.moulberry.notenoughupdates.util.NEUDebugLogger; -import net.minecraft.util.BlockPos; -import net.minecraft.util.Vec3; -import net.minecraft.util.Vec3i; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.EnumSet; - -import static io.github.moulberry.notenoughupdates.miscfeatures.CrystalWishingCompassSolver.*; - -class CrystalWishingCompassSolverTest { - private static final CrystalWishingCompassSolver solver = getInstance(); - long systemTimeMillis; - private final long DELAY_AFTER_FIRST_COMPASS_LAST_PARTICLE = 500L; - - private final CompassUse minesOfDivanCompassUse1 = new CompassUse( - 1647528732979L, - new BlockPos(754, 137, 239), - new ArrayList<>(Arrays.asList( - new ParticleSpawn(new Vec3Comparable(754.358459, 138.536407, 239.200928), 137), - new ParticleSpawn(new Vec3Comparable(754.315735, 138.444351, 239.690521), 45), - new ParticleSpawn(new Vec3Comparable(754.272278, 138.352051, 240.180008), 51), - new ParticleSpawn(new Vec3Comparable(754.228760, 138.259750, 240.669479), 49), - new ParticleSpawn(new Vec3Comparable(754.185303, 138.167435, 241.158966), 57), - new ParticleSpawn(new Vec3Comparable(754.141846, 138.075134, 241.648438), 50), - new ParticleSpawn(new Vec3Comparable(754.098328, 137.982819, 242.137909), 51), - new ParticleSpawn(new Vec3Comparable(754.054871, 137.890518, 242.627396), 57), - new ParticleSpawn(new Vec3Comparable(754.011353, 137.798203, 243.116867), 44), - new ParticleSpawn(new Vec3Comparable(753.967896, 137.705887, 243.606354), 59), - new ParticleSpawn(new Vec3Comparable(753.924438, 137.613586, 244.095825), 35), - new ParticleSpawn(new Vec3Comparable(753.880920, 137.521271, 244.585297), 48), - new ParticleSpawn(new Vec3Comparable(753.837463, 137.428970, 245.074783), 70), - new ParticleSpawn(new Vec3Comparable(753.793945, 137.336655, 245.564255), 33), - new ParticleSpawn(new Vec3Comparable(753.750488, 137.244354, 246.053741), 55), - new ParticleSpawn(new Vec3Comparable(753.707031, 137.152039, 246.543213), 42), - new ParticleSpawn(new Vec3Comparable(753.663513, 137.059738, 247.032700), 56), - new ParticleSpawn(new Vec3Comparable(753.620056, 136.967422, 247.522171), 48), - new ParticleSpawn(new Vec3Comparable(753.576538, 136.875122, 248.011642), 56), - new ParticleSpawn(new Vec3Comparable(754.333618, 138.527710, 239.197800), 55) - )), - HandleCompassResult.SUCCESS, - SolverState.NEED_SECOND_COMPASS); - - private final CompassUse minesOfDivanCompassUse2 = new CompassUse( - DELAY_AFTER_FIRST_COMPASS_LAST_PARTICLE, - new BlockPos(760, 134, 266), - new ArrayList<>(Arrays.asList( - new ParticleSpawn(new Vec3Comparable(759.686951, 135.524994, 266.190704), 129), - new ParticleSpawn(new Vec3Comparable(759.625183, 135.427887, 266.677277), 69), - new ParticleSpawn(new Vec3Comparable(759.561707, 135.330704, 267.163635), 31), - new ParticleSpawn(new Vec3Comparable(759.498230, 135.233536, 267.649963), 115), - new ParticleSpawn(new Vec3Comparable(759.434753, 135.136368, 268.136322), 0), - new ParticleSpawn(new Vec3Comparable(759.371277, 135.039200, 268.622650), 46), - new ParticleSpawn(new Vec3Comparable(759.307800, 134.942017, 269.109009), 49), - new ParticleSpawn(new Vec3Comparable(759.244324, 134.844849, 269.595337), 59), - new ParticleSpawn(new Vec3Comparable(759.180847, 134.747681, 270.081696), 45), - new ParticleSpawn(new Vec3Comparable(759.117371, 134.650513, 270.568024), 39), - new ParticleSpawn(new Vec3Comparable(759.053894, 134.553329, 271.054352), 67), - new ParticleSpawn(new Vec3Comparable(758.990356, 134.456161, 271.540710), 49), - new ParticleSpawn(new Vec3Comparable(758.926880, 134.358994, 272.027039), 32), - new ParticleSpawn(new Vec3Comparable(758.863403, 134.261826, 272.513397), 61), - new ParticleSpawn(new Vec3Comparable(758.799927, 134.164642, 272.999725), 44), - new ParticleSpawn(new Vec3Comparable(758.736450, 134.067474, 273.486084), 48), - new ParticleSpawn(new Vec3Comparable(758.672974, 133.970306, 273.972412), 57), - new ParticleSpawn(new Vec3Comparable(758.609497, 133.873138, 274.458740), 55), - new ParticleSpawn(new Vec3Comparable(758.546021, 133.775955, 274.945099), 59), - new ParticleSpawn(new Vec3Comparable(758.482544, 133.678787, 275.431427), 38), - new ParticleSpawn(new Vec3Comparable(759.636658, 135.522827, 266.186371), 0) - )), - HandleCompassResult.SUCCESS, - SolverState.SOLVED); - - Vec3i minesOfDivanSolution = new Vec3i(735, 98, 451); - - private final CompassUse goblinHoldoutCompassUse1 = new CompassUse( - 1647776326763L, - new BlockPos(454, 87, 776), - new ArrayList<>(Arrays.asList( - new ParticleSpawn(new Vec3Comparable(454.171722, 88.616852, 775.807190), 188), - new ParticleSpawn(new Vec3Comparable(454.010315, 88.613464, 775.333984), 44), - new ParticleSpawn(new Vec3Comparable(453.849243, 88.610069, 774.860657), 61), - new ParticleSpawn(new Vec3Comparable(453.688141, 88.606674, 774.387329), 51), - new ParticleSpawn(new Vec3Comparable(453.527069, 88.603271, 773.914001), 40), - new ParticleSpawn(new Vec3Comparable(453.365997, 88.599876, 773.440674), 57), - new ParticleSpawn(new Vec3Comparable(453.204926, 88.596481, 772.967346), 45), - new ParticleSpawn(new Vec3Comparable(453.043854, 88.593086, 772.494019), 49), - new ParticleSpawn(new Vec3Comparable(452.882782, 88.589691, 772.020691), 46), - new ParticleSpawn(new Vec3Comparable(452.721710, 88.586288, 771.547302), 65), - new ParticleSpawn(new Vec3Comparable(452.560638, 88.582893, 771.073975), 43), - new ParticleSpawn(new Vec3Comparable(452.399567, 88.579498, 770.600647), 50), - new ParticleSpawn(new Vec3Comparable(452.238495, 88.576103, 770.127319), 48), - new ParticleSpawn(new Vec3Comparable(452.077423, 88.572701, 769.653992), 47), - new ParticleSpawn(new Vec3Comparable(451.916351, 88.569305, 769.180664), 60), - new ParticleSpawn(new Vec3Comparable(451.755280, 88.565910, 768.707336), 40), - new ParticleSpawn(new Vec3Comparable(451.594208, 88.562515, 768.234009), 69), - new ParticleSpawn(new Vec3Comparable(451.433136, 88.559120, 767.760681), 40), - new ParticleSpawn(new Vec3Comparable(451.272064, 88.555717, 767.287354), 42), - new ParticleSpawn(new Vec3Comparable(454.183441, 88.616600, 775.803040), 54) - )), - HandleCompassResult.SUCCESS, - SolverState.NEED_SECOND_COMPASS); - - private final CompassUse goblinHoldoutCompassUse2 = new CompassUse( - DELAY_AFTER_FIRST_COMPASS_LAST_PARTICLE, - new BlockPos(439, 85, 777), - new ArrayList<>(Arrays.asList( - new ParticleSpawn(new Vec3Comparable(439.068848, 86.624870, 776.043701), 136), - new ParticleSpawn(new Vec3Comparable(438.936066, 86.625786, 775.561646), 46), - new ParticleSpawn(new Vec3Comparable(438.804352, 86.626595, 775.079346), 65), - new ParticleSpawn(new Vec3Comparable(438.672699, 86.627396, 774.596985), 40), - new ParticleSpawn(new Vec3Comparable(438.541016, 86.628197, 774.114624), 51), - new ParticleSpawn(new Vec3Comparable(438.409332, 86.628998, 773.632263), 50), - new ParticleSpawn(new Vec3Comparable(438.277679, 86.629799, 773.149902), 50), - new ParticleSpawn(new Vec3Comparable(438.145996, 86.630608, 772.667603), 56), - new ParticleSpawn(new Vec3Comparable(438.014343, 86.631409, 772.185242), 40), - new ParticleSpawn(new Vec3Comparable(437.882660, 86.632210, 771.702881), 65), - new ParticleSpawn(new Vec3Comparable(437.751007, 86.633011, 771.220520), 45), - new ParticleSpawn(new Vec3Comparable(437.619324, 86.633812, 770.738159), 42), - new ParticleSpawn(new Vec3Comparable(437.487671, 86.634613, 770.255798), 60), - new ParticleSpawn(new Vec3Comparable(437.355988, 86.635414, 769.773499), 51), - new ParticleSpawn(new Vec3Comparable(437.224335, 86.636215, 769.291138), 44), - new ParticleSpawn(new Vec3Comparable(437.092651, 86.637024, 768.808777), 56), - new ParticleSpawn(new Vec3Comparable(436.960999, 86.637825, 768.326416), 56), - new ParticleSpawn(new Vec3Comparable(436.829315, 86.638626, 767.844055), 40), - new ParticleSpawn(new Vec3Comparable(436.697632, 86.639427, 767.361694), 50), - new ParticleSpawn(new Vec3Comparable(436.565979, 86.640228, 766.879395), 46), - new ParticleSpawn(new Vec3Comparable(439.108551, 86.620811, 776.031067), 0) - )), - HandleCompassResult.SUCCESS, - SolverState.SOLVED); - - Vec3i goblinHoldoutKingSolution = new Vec3i(377, 87, 550); - Vec3i goblinHoldoutQueenSolution = new Vec3i(322, 139, 769); - - private final CompassUse precursorCityCompassUse1 = new CompassUse( - 1647744920365L, - new BlockPos(570, 120, 565), - new ArrayList<>(Arrays.asList( - new ParticleSpawn(new Vec3Comparable(570.428955, 121.630745, 565.674500), 192), - new ParticleSpawn(new Vec3Comparable(570.572998, 121.642563, 566.153137), 52), - new ParticleSpawn(new Vec3Comparable(570.714233, 121.654442, 566.632629), 45), - new ParticleSpawn(new Vec3Comparable(570.855286, 121.666321, 567.112183), 51), - new ParticleSpawn(new Vec3Comparable(570.996338, 121.678200, 567.591736), 0), - new ParticleSpawn(new Vec3Comparable(571.137390, 121.690079, 568.071289), 111), - new ParticleSpawn(new Vec3Comparable(571.278442, 121.701958, 568.550781), 38), - new ParticleSpawn(new Vec3Comparable(571.419495, 121.713844, 569.030334), 51), - new ParticleSpawn(new Vec3Comparable(571.560547, 121.725723, 569.509888), 49), - new ParticleSpawn(new Vec3Comparable(571.701599, 121.737602, 569.989441), 0), - new ParticleSpawn(new Vec3Comparable(571.842651, 121.749481, 570.468994), 101), - new ParticleSpawn(new Vec3Comparable(571.983704, 121.761360, 570.948547), 53), - new ParticleSpawn(new Vec3Comparable(572.124756, 121.773239, 571.428101), 47), - new ParticleSpawn(new Vec3Comparable(572.265747, 121.785118, 571.907654), 49), - new ParticleSpawn(new Vec3Comparable(572.406799, 121.796997, 572.387207), 49), - new ParticleSpawn(new Vec3Comparable(572.547852, 121.808876, 572.866699), 51), - new ParticleSpawn(new Vec3Comparable(572.688904, 121.820755, 573.346252), 57), - new ParticleSpawn(new Vec3Comparable(572.829956, 121.832634, 573.825806), 42), - new ParticleSpawn(new Vec3Comparable(572.971008, 121.844513, 574.305359), 50), - new ParticleSpawn(new Vec3Comparable(573.112061, 121.856392, 574.784912), 52), - new ParticleSpawn(new Vec3Comparable(570.372192, 121.631874, 565.694946), 0) - )), - HandleCompassResult.SUCCESS, - SolverState.NEED_SECOND_COMPASS); - - private final CompassUse precursorCityCompassUse2 = new CompassUse( - DELAY_AFTER_FIRST_COMPASS_LAST_PARTICLE, - new BlockPos(591, 136, 579), - new ArrayList<>(Arrays.asList( - new ParticleSpawn(new Vec3Comparable(590.847961, 137.589584, 579.776672), 192), - new ParticleSpawn(new Vec3Comparable(590.918945, 137.528259, 580.267761), 50), - new ParticleSpawn(new Vec3Comparable(590.985229, 137.465118, 580.759338), 56), - new ParticleSpawn(new Vec3Comparable(591.051147, 137.401855, 581.250916), 47), - new ParticleSpawn(new Vec3Comparable(591.117126, 137.338593, 581.742493), 47), - new ParticleSpawn(new Vec3Comparable(591.183044, 137.275330, 582.234070), 49), - new ParticleSpawn(new Vec3Comparable(591.249023, 137.212067, 582.725647), 60), - new ParticleSpawn(new Vec3Comparable(591.314941, 137.148804, 583.217224), 55), - new ParticleSpawn(new Vec3Comparable(591.380920, 137.085541, 583.708801), 47), - new ParticleSpawn(new Vec3Comparable(591.446838, 137.022263, 584.200378), 50), - new ParticleSpawn(new Vec3Comparable(591.512817, 136.959000, 584.691956), 39), - new ParticleSpawn(new Vec3Comparable(591.578735, 136.895737, 585.183533), 53), - new ParticleSpawn(new Vec3Comparable(591.644714, 136.832474, 585.675110), 53), - new ParticleSpawn(new Vec3Comparable(591.710632, 136.769211, 586.166687), 45), - new ParticleSpawn(new Vec3Comparable(591.776611, 136.705948, 586.658264), 79), - new ParticleSpawn(new Vec3Comparable(591.842529, 136.642685, 587.149841), 20), - new ParticleSpawn(new Vec3Comparable(591.908508, 136.579407, 587.641418), 62), - new ParticleSpawn(new Vec3Comparable(591.974426, 136.516144, 588.132996), 48), - new ParticleSpawn(new Vec3Comparable(592.040344, 136.452881, 588.624573), 40), - new ParticleSpawn(new Vec3Comparable(592.106323, 136.389618, 589.116150), 51), - new ParticleSpawn(new Vec3Comparable(590.766357, 137.556885, 579.791565), 0) - )), - HandleCompassResult.SUCCESS, - SolverState.SOLVED); - - Vec3i precursorCitySolution = new Vec3i(604, 124, 681); - - private final CompassUse jungleCompassUse1 = new CompassUse( - 1647744980313L, - new BlockPos(454, 122, 459), - new ArrayList<>(Arrays.asList( - new ParticleSpawn(new Vec3Comparable(453.954895, 122.958122, 458.687866), 141), - new ParticleSpawn(new Vec3Comparable(453.515991, 122.760010, 458.553314), 59), - new ParticleSpawn(new Vec3Comparable(453.078156, 122.560112, 458.417877), 41), - new ParticleSpawn(new Vec3Comparable(452.640381, 122.360123, 458.282349), 50), - new ParticleSpawn(new Vec3Comparable(452.202606, 122.160133, 458.146851), 66), - new ParticleSpawn(new Vec3Comparable(451.764832, 121.960136, 458.011353), 35), - new ParticleSpawn(new Vec3Comparable(451.327057, 121.760147, 457.875854), 49), - new ParticleSpawn(new Vec3Comparable(450.889313, 121.560150, 457.740356), 50), - new ParticleSpawn(new Vec3Comparable(450.451538, 121.360161, 457.604858), 49), - new ParticleSpawn(new Vec3Comparable(450.013763, 121.160172, 457.469330), 51), - new ParticleSpawn(new Vec3Comparable(449.575989, 120.960175, 457.333832), 59), - new ParticleSpawn(new Vec3Comparable(449.138214, 120.760185, 457.198334), 41), - new ParticleSpawn(new Vec3Comparable(448.700439, 120.560196, 457.062836), 55), - new ParticleSpawn(new Vec3Comparable(448.262695, 120.360199, 456.927338), 50), - new ParticleSpawn(new Vec3Comparable(447.824921, 120.160210, 456.791840), 49), - new ParticleSpawn(new Vec3Comparable(447.387146, 119.960213, 456.656311), 53), - new ParticleSpawn(new Vec3Comparable(446.949371, 119.760223, 456.520813), 43), - new ParticleSpawn(new Vec3Comparable(446.511597, 119.560234, 456.385315), 51), - new ParticleSpawn(new Vec3Comparable(446.073853, 119.360237, 456.249817), 49), - new ParticleSpawn(new Vec3Comparable(445.636078, 119.160248, 456.114319), 56), - new ParticleSpawn(new Vec3Comparable(453.975647, 122.920158, 458.668488), 0) - )), - HandleCompassResult.SUCCESS, - SolverState.NEED_SECOND_COMPASS); - - private final CompassUse jungleCompassUse2 = new CompassUse( - DELAY_AFTER_FIRST_COMPASS_LAST_PARTICLE, - new BlockPos(438, 126, 468), - new ArrayList<>(Arrays.asList( - new ParticleSpawn(new Vec3Comparable(437.701721, 127.395279, 467.455048), 139), - new ParticleSpawn(new Vec3Comparable(437.297852, 127.161415, 467.275604), 35), - new ParticleSpawn(new Vec3Comparable(436.895813, 126.927208, 467.092529), 68), - new ParticleSpawn(new Vec3Comparable(436.493896, 126.692986, 466.909241), 41), - new ParticleSpawn(new Vec3Comparable(436.091980, 126.458763, 466.725952), 54), - new ParticleSpawn(new Vec3Comparable(435.690033, 126.224533, 466.542664), 39), - new ParticleSpawn(new Vec3Comparable(435.288116, 125.990311, 466.359375), 52), - new ParticleSpawn(new Vec3Comparable(434.886200, 125.756088, 466.176086), 66), - new ParticleSpawn(new Vec3Comparable(434.484283, 125.521866, 465.992767), 40), - new ParticleSpawn(new Vec3Comparable(434.082367, 125.287636, 465.809479), 41), - new ParticleSpawn(new Vec3Comparable(433.680420, 125.053413, 465.626190), 50), - new ParticleSpawn(new Vec3Comparable(433.278503, 124.819191, 465.442902), 59), - new ParticleSpawn(new Vec3Comparable(432.876587, 124.584969, 465.259613), 54), - new ParticleSpawn(new Vec3Comparable(432.474670, 124.350746, 465.076294), 38), - new ParticleSpawn(new Vec3Comparable(432.072723, 124.116516, 464.893005), 63), - new ParticleSpawn(new Vec3Comparable(431.670807, 123.882294, 464.709717), 36), - new ParticleSpawn(new Vec3Comparable(431.268890, 123.648071, 464.526428), 64), - new ParticleSpawn(new Vec3Comparable(430.866974, 123.413849, 464.343140), 48), - new ParticleSpawn(new Vec3Comparable(430.465057, 123.179619, 464.159821), 53), - new ParticleSpawn(new Vec3Comparable(430.063110, 122.945396, 463.976532), 46), - new ParticleSpawn(new Vec3Comparable(437.732666, 127.385803, 467.381592), 1) - )), - HandleCompassResult.SUCCESS, - SolverState.SOLVED); - - Vec3i jungleSolution = new Vec3i(343, 72, 424); - Vec3i jungleSolutionTempleDoor = new Vec3i( - jungleSolution.getX() - 57, - jungleSolution.getY() + 36, - jungleSolution.getZ() -21); - - private final CompassUse magmaCompassUse1 = new CompassUse( - 1647745029814L, - new BlockPos(462, 58, 550), - new ArrayList<>(Arrays.asList( - new ParticleSpawn(new Vec3Comparable(462.226898, 59.614380, 550.032654), 160), - new ParticleSpawn(new Vec3Comparable(462.693848, 59.609089, 549.853943), 47), - new ParticleSpawn(new Vec3Comparable(463.160706, 59.603809, 549.674988), 48), - new ParticleSpawn(new Vec3Comparable(463.627533, 59.598526, 549.496033), 136), - new ParticleSpawn(new Vec3Comparable(464.094391, 59.593246, 549.317017), 0), - new ParticleSpawn(new Vec3Comparable(464.561218, 59.587963, 549.138062), 0), - new ParticleSpawn(new Vec3Comparable(465.028076, 59.582684, 548.959106), 53), - new ParticleSpawn(new Vec3Comparable(465.494904, 59.577400, 548.780090), 48), - new ParticleSpawn(new Vec3Comparable(465.961761, 59.572117, 548.601135), 55), - new ParticleSpawn(new Vec3Comparable(466.428589, 59.566837, 548.422180), 47), - new ParticleSpawn(new Vec3Comparable(466.895416, 59.561554, 548.243164), 46), - new ParticleSpawn(new Vec3Comparable(467.362274, 59.556274, 548.064209), 53), - new ParticleSpawn(new Vec3Comparable(467.829102, 59.550991, 547.885254), 50), - new ParticleSpawn(new Vec3Comparable(468.295959, 59.545712, 547.706238), 54), - new ParticleSpawn(new Vec3Comparable(468.762787, 59.540428, 547.527283), 52), - new ParticleSpawn(new Vec3Comparable(469.229645, 59.535145, 547.348328), 105), - new ParticleSpawn(new Vec3Comparable(469.696472, 59.529865, 547.169312), 1), - new ParticleSpawn(new Vec3Comparable(470.163300, 59.524582, 546.990356), 51), - new ParticleSpawn(new Vec3Comparable(470.630157, 59.519302, 546.811401), 40), - new ParticleSpawn(new Vec3Comparable(471.096985, 59.514019, 546.632385), 49), - new ParticleSpawn(new Vec3Comparable(462.221954, 59.614719, 550.019165), 0) - )), - HandleCompassResult.SUCCESS, - SolverState.NEED_SECOND_COMPASS); - - private final CompassUse magmaCompassUse2 = new CompassUse( - DELAY_AFTER_FIRST_COMPASS_LAST_PARTICLE, - new BlockPos(449, 53, 556), - new ArrayList<>(Arrays.asList( - new ParticleSpawn(new Vec3Comparable(449.120911, 54.624340, 556.108948), 204), - new ParticleSpawn(new Vec3Comparable(449.587433, 54.627399, 555.929138), 102), - new ParticleSpawn(new Vec3Comparable(450.053741, 54.630432, 555.748657), 0), - new ParticleSpawn(new Vec3Comparable(450.520020, 54.633465, 555.568237), 62), - new ParticleSpawn(new Vec3Comparable(450.986298, 54.636497, 555.387756), 38), - new ParticleSpawn(new Vec3Comparable(451.452606, 54.639530, 555.207275), 48), - new ParticleSpawn(new Vec3Comparable(451.918884, 54.642563, 555.026794), 63), - new ParticleSpawn(new Vec3Comparable(452.385162, 54.645596, 554.846375), 52), - new ParticleSpawn(new Vec3Comparable(452.851471, 54.648628, 554.665894), 35), - new ParticleSpawn(new Vec3Comparable(453.317749, 54.651661, 554.485413), 53), - new ParticleSpawn(new Vec3Comparable(453.784027, 54.654694, 554.304993), 54), - new ParticleSpawn(new Vec3Comparable(454.250305, 54.657726, 554.124512), 50), - new ParticleSpawn(new Vec3Comparable(454.716614, 54.660759, 553.944031), 55), - new ParticleSpawn(new Vec3Comparable(455.182892, 54.663792, 553.763550), 49), - new ParticleSpawn(new Vec3Comparable(455.649170, 54.666824, 553.583130), 41), - new ParticleSpawn(new Vec3Comparable(456.115479, 54.669857, 553.402649), 48), - new ParticleSpawn(new Vec3Comparable(456.581757, 54.672890, 553.222168), 54), - new ParticleSpawn(new Vec3Comparable(457.048035, 54.675922, 553.041687), 45), - new ParticleSpawn(new Vec3Comparable(457.514313, 54.678959, 552.861267), 55), - new ParticleSpawn(new Vec3Comparable(449.110443, 54.623035, 556.079163), 49) - )), - HandleCompassResult.SUCCESS, - SolverState.SOLVED); - - Vec3i magmaSolution = new Vec3i(737, 56, 444); - - Vec3Comparable kingMinesOrNucleusCoordsInRemnants = new Vec3Comparable(604, 100, 681); - Vec3Comparable odawaSolution = new Vec3Comparable(349, 110, 390); - - private final CompassUse nucleusCompass = new CompassUse( - 1647745029814L, - new BlockPos(512, 106, 512), - null, - HandleCompassResult.PLAYER_IN_NUCLEUS, - SolverState.NOT_STARTED); - - private void resetSolverState() { - solver.initWorld(); - systemTimeMillis = 0; - solver.currentTimeMillis = () -> (systemTimeMillis); - // These must be overridden for all test cases or an exception will be thrown when - // data that is only present when running in the context of Minecraft is accessed. - solver.keyInInventory = () -> false; - solver.kingsScentPresent = () -> false; - solver.foundCrystals = () -> EnumSet.noneOf(Crystal.class); - } - - @BeforeEach - void setUp() { - NEUDebugLogger.logMethod = CrystalWishingCompassSolverTest::neuDebugLog; - NEUDebugLogger.allFlagsEnabled = true; - resetSolverState(); - } - - private void checkSolution(Solution solution) { - int index = 0; - for (CompassUse compassUse : solution.compassUses) { - systemTimeMillis += compassUse.timeIncrementMillis; - HandleCompassResult handleCompassResult = solver.handleCompassUse(compassUse.playerPos); - Assertions.assertEquals(compassUse.expectedHandleCompassUseResult, - handleCompassResult, - "CompassUse index " + index); - - for (ParticleSpawn particle : compassUse.particles) { - systemTimeMillis += particle.timeIncrementMillis; - solver.solveUsingParticle( - particle.spawnLocation.xCoord, - particle.spawnLocation.yCoord, - particle.spawnLocation.zCoord, - systemTimeMillis); - } - - Assertions.assertEquals(compassUse.expectedSolverState, - solver.getSolverState(), - "CompassUse index " + index); - if (compassUse.expectedSolverState == SolverState.SOLVED) { - Assertions.assertEquals(solution.expectedSolutionCoords, - solver.getSolutionCoords()); - } - - index++; - } - } - - @Test - void first_compass_without_particles_sets_solver_state_to_processing_first_use() { - // Arrange - CompassUse compassUse = new CompassUse(minesOfDivanCompassUse1); - compassUse.particles.clear(); - compassUse.expectedSolverState = SolverState.PROCESSING_FIRST_USE; - - Solution solution = new Solution( - new ArrayList<>(Collections.singletonList(compassUse)), - Vec3i.NULL_VECTOR); - - // Act & Assert - checkSolution(solution); - } - - @Test - void new_compass_resets_processing_first_use_state_after_timeout() { - // Arrange - CompassUse processingFirstUseCompassUse = new CompassUse(minesOfDivanCompassUse1); - processingFirstUseCompassUse.particles.clear(); - processingFirstUseCompassUse.expectedSolverState = SolverState.PROCESSING_FIRST_USE; - Solution processingFirstUseSolution = new Solution( - new ArrayList<>(Collections.singletonList(processingFirstUseCompassUse)), - Vec3i.NULL_VECTOR); - checkSolution(processingFirstUseSolution); - Assertions.assertEquals(SolverState.PROCESSING_FIRST_USE, solver.getSolverState()); - - CompassUse resetStateCompassUse = new CompassUse(jungleCompassUse1); - resetStateCompassUse.timeIncrementMillis = ALL_PARTICLES_MAX_MILLIS + 1; - resetStateCompassUse.expectedHandleCompassUseResult = HandleCompassResult.NO_PARTICLES_FOR_PREVIOUS_COMPASS; - resetStateCompassUse.expectedSolverState = SolverState.FAILED_TIMEOUT_NO_REPEATING; - Solution goodSolution = new Solution( - new ArrayList<>(Collections.singletonList(resetStateCompassUse)), - Vec3i.NULL_VECTOR); - - // Act & Assert - checkSolution(goodSolution); - } - - @Test - void first_compass_with_repeating_particles_sets_state_to_need_second_compass() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Collections.singletonList(minesOfDivanCompassUse1)), - Vec3i.NULL_VECTOR); - - // Act & Assert - checkSolution(solution); - } - - @Test - void first_compass_in_nucleus_sets_state_to_player_in_nucleus() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Collections.singletonList(nucleusCompass)), - Vec3i.NULL_VECTOR); - - // Act & Assert - checkSolution(solution); - } - - @Test - void use_while_handling_previous_returns_still_processing_first_use() { - // Arrange - CompassUse compassUse1 = new CompassUse( - 1647528732979L, - new BlockPos(754, 137, 239), - new ArrayList<>(Collections.singletonList( - new ParticleSpawn(new Vec3Comparable(754.358459, 138.536407, 239.200928), 137) - )), - HandleCompassResult.SUCCESS, - SolverState.PROCESSING_FIRST_USE); - - // STILL_PROCESSING_FIRST_USE is expected instead of LOCATION_TOO_CLOSE since the solver - // isn't ready for the second compass use, which includes the location check - CompassUse compassUse2 = new CompassUse(compassUse1); - compassUse2.expectedHandleCompassUseResult = HandleCompassResult.STILL_PROCESSING_PRIOR_USE; - compassUse2.timeIncrementMillis = 500; - - Solution solution = new Solution( - new ArrayList<>(Arrays.asList(compassUse1, compassUse2)), - Vec3i.NULL_VECTOR); - - // Act & Assert - checkSolution(solution); - } - - @Test - void missing_repeating_particles_sets_state_to_failed_timeout_no_repeating() { - CompassUse compassUse = new CompassUse(minesOfDivanCompassUse1); - compassUse.particles.remove(compassUse.particles.size()-1); - compassUse.particles.get(compassUse.particles.size()-1).timeIncrementMillis += ALL_PARTICLES_MAX_MILLIS; - compassUse.expectedSolverState = SolverState.FAILED_TIMEOUT_NO_REPEATING; - - Solution solution = new Solution( - new ArrayList<>(Collections.singletonList(compassUse)), - Vec3i.NULL_VECTOR); - - // Act & Assert - checkSolution(solution); - } - - @Test - void compasses_too_close_returns_location_too_close_and_solver_state_is_still_need_second_compass() { - // Arrange - CompassUse secondCompassUse = new CompassUse( - DELAY_AFTER_FIRST_COMPASS_LAST_PARTICLE, - minesOfDivanCompassUse1.playerPos.add(2, 2, 2), - null, - HandleCompassResult.LOCATION_TOO_CLOSE, - SolverState.NEED_SECOND_COMPASS - ); - - Solution solution = new Solution( - new ArrayList<>(Arrays.asList(minesOfDivanCompassUse1, secondCompassUse)), - Vec3i.NULL_VECTOR); - - // Act & Assert - checkSolution(solution); - } - - @Test - void second_compass_sets_solver_state_to_processing_second_use() { - // Arrange - CompassUse secondCompassUse = new CompassUse(minesOfDivanCompassUse2); - secondCompassUse.expectedSolverState = SolverState.PROCESSING_SECOND_USE; - secondCompassUse.particles.clear(); - - // Arrange - Solution solution = new Solution( - new ArrayList<>(Arrays.asList(minesOfDivanCompassUse1, minesOfDivanCompassUse2)), - minesOfDivanSolution - ); - - // Act & Assert - checkSolution(solution); - } - - @Test - void second_compass_with_repeating_particles_sets_state_to_solved() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Arrays.asList(minesOfDivanCompassUse1, minesOfDivanCompassUse2)), - minesOfDivanSolution - ); - - // Act & Assert - checkSolution(solution); - } - - @Test - void particles_from_first_compass_are_ignored_by_second_compass() { - // Arrange - CompassUse compassUse2 = new CompassUse(minesOfDivanCompassUse2); - compassUse2.particles.add(0, minesOfDivanCompassUse1.particles.get(0)); - Solution solution = new Solution( - new ArrayList<>(Arrays.asList(minesOfDivanCompassUse1, compassUse2)), - minesOfDivanSolution - ); - - // Act & Assert - checkSolution(solution); - } - - private void execInvalidParticlesInvalidSolution() { - // Arrange - CompassUse compassUse2 = new CompassUse(minesOfDivanCompassUse2); - - // reverse the direction of the particles, moving the repeat particle - // to "new" end - compassUse2.particles.remove(compassUse2.particles.size()-1); - Collections.reverse(compassUse2.particles); - // add a new repeat particle - compassUse2.particles.add(new ParticleSpawn(compassUse2.particles.get(0))); - - // Adjust the player position - compassUse2.playerPos = new BlockPos(compassUse2.particles.get(0).spawnLocation); - compassUse2.expectedSolverState = SolverState.FAILED_INVALID_SOLUTION; - Solution solution = new Solution( - new ArrayList<>(Arrays.asList(minesOfDivanCompassUse1, compassUse2)), - Vec3i.NULL_VECTOR); - - // Act & Assert - checkSolution(solution); - } - - @Test - void second_compass_with_inverted_particles_sets_state_to_invalid_solution() { - // Arrange, Act, and Assert - execInvalidParticlesInvalidSolution(); - } - - @Test - void solution_outside_hollows_sets_state_to_invalid_solution() { - // Arrange - CompassUse compassUse1 = new CompassUse(minesOfDivanCompassUse1); - CompassUse compassUse2 = new CompassUse(minesOfDivanCompassUse2); - Vec3 offset = new Vec3(0.0, 200.0, 0.0); - - compassUse1.playerPos = compassUse1.playerPos.add(offset.xCoord, offset.yCoord, offset.zCoord); - for (ParticleSpawn particle : compassUse1.particles) { - particle.spawnLocation = particle.spawnLocation.add(offset); - } - - compassUse2.playerPos = compassUse2.playerPos.add(offset.xCoord, offset.yCoord, offset.zCoord); - for (ParticleSpawn particle : compassUse2.particles) { - particle.spawnLocation = particle.spawnLocation.add(offset); - } - compassUse2.expectedSolverState = SolverState.FAILED_INVALID_SOLUTION; - - Solution solution = new Solution( - new ArrayList<>(Arrays.asList(compassUse1, compassUse2)), - Vec3i.NULL_VECTOR); - - // Act & Assert - checkSolution(solution); - } - - @Test - void second_solution_can_be_solved_after_state_is_solved() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Arrays.asList(minesOfDivanCompassUse1, minesOfDivanCompassUse2)), - minesOfDivanSolution - ); - checkSolution(solution); - - Solution solution2 = new Solution( - new ArrayList<>(Arrays.asList(precursorCityCompassUse1, precursorCityCompassUse2)), - precursorCitySolution - ); - - // Act & Assert - checkSolution(solution2); - } - - @Test - void second_solution_can_be_solved_after_state_is_failed() { - // Arrange - execInvalidParticlesInvalidSolution(); - Assertions.assertEquals(solver.getSolverState(), SolverState.FAILED_INVALID_SOLUTION); - - Solution solution2 = new Solution( - new ArrayList<>(Arrays.asList(precursorCityCompassUse1, precursorCityCompassUse2)), - precursorCitySolution - ); - - // Act & Assert - checkSolution(solution2); - } - - @Test - void distant_particles_are_ignored() { - // Arrange - CompassUse compassUse = new CompassUse(minesOfDivanCompassUse1); - compassUse.particles.get(2).spawnLocation.addVector(100.0, 100.0, 100.0); - Solution solution = new Solution( - new ArrayList<>(Collections.singletonList(minesOfDivanCompassUse1)), - Vec3i.NULL_VECTOR); - - // Act & Assert - checkSolution(solution); - } - - @Test - void possible_targets_includes_queen_and_excludes_king_when_kings_scent_is_present() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Collections.singletonList(goblinHoldoutCompassUse1)), - Vec3i.NULL_VECTOR); - solver.kingsScentPresent = () -> true; - - // Act - checkSolution(solution); - EnumSet targets = solver.getPossibleTargets(); - - // Assert - Assertions.assertTrue(targets.contains(CompassTarget.GOBLIN_QUEEN)); - Assertions.assertFalse(targets.contains(CompassTarget.GOBLIN_KING)); - } - - @Test - void possible_targets_excludes_king_and_includes_queen_when_kings_scent_is_not_present() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Collections.singletonList(goblinHoldoutCompassUse1)), - Vec3i.NULL_VECTOR); - solver.kingsScentPresent = () -> false; - - // Act - checkSolution(solution); - EnumSet targets = solver.getPossibleTargets(); - - // Assert - Assertions.assertFalse(targets.contains(CompassTarget.GOBLIN_QUEEN)); - Assertions.assertTrue(targets.contains(CompassTarget.GOBLIN_KING)); - } - - @Test - void possible_targets_excludes_odawa_and_includes_temple_when_key_in_inventory() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Collections.singletonList(jungleCompassUse1)), - Vec3i.NULL_VECTOR); - solver.keyInInventory = () -> true; - - // Act - checkSolution(solution); - EnumSet targets = solver.getPossibleTargets(); - - // Assert - Assertions.assertFalse(targets.contains(CompassTarget.ODAWA)); - Assertions.assertTrue(targets.contains(CompassTarget.JUNGLE_TEMPLE)); - } - - @Test - void possible_targets_includes_odawa_and_excludes_temple_when_key_not_in_inventory() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Collections.singletonList(jungleCompassUse1)), - Vec3i.NULL_VECTOR); - solver.keyInInventory = () -> false; - - // Act - checkSolution(solution); - EnumSet targets = solver.getPossibleTargets(); - - // Assert - Assertions.assertTrue(targets.contains(CompassTarget.ODAWA)); - Assertions.assertFalse(targets.contains(CompassTarget.JUNGLE_TEMPLE)); - } - - @Test - void possible_targets_only_contains_city_and_nucleus_when_in_remnants_without_sapphire_crystal() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Collections.singletonList(precursorCityCompassUse1)), - Vec3i.NULL_VECTOR); - - // Act - checkSolution(solution); - EnumSet targets = solver.getPossibleTargets(); - - // Assert - Assertions.assertTrue(targets.contains(CompassTarget.PRECURSOR_CITY)); - Assertions.assertTrue(targets.contains(CompassTarget.CRYSTAL_NUCLEUS)); - Assertions.assertEquals(2, targets.size()); - } - - @Test - void possible_targets_only_contains_mines_and_nucleus_when_in_deposits_without_jade_crystal() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Collections.singletonList(minesOfDivanCompassUse1)), - Vec3i.NULL_VECTOR); - - // Act - checkSolution(solution); - EnumSet targets = solver.getPossibleTargets(); - - // Assert - Assertions.assertTrue(targets.contains(CompassTarget.MINES_OF_DIVAN)); - Assertions.assertTrue(targets.contains(CompassTarget.CRYSTAL_NUCLEUS)); - Assertions.assertEquals(2, targets.size()); - } - - @Test - void possible_targets_only_contains_king_or_queen_and_nucleus_when_in_holdout_without_crystal() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Collections.singletonList(goblinHoldoutCompassUse1)), - Vec3i.NULL_VECTOR); - - // Act - checkSolution(solution); - EnumSet targets = solver.getPossibleTargets(); - - // Assert - Assertions.assertTrue(targets.contains(CompassTarget.GOBLIN_KING) || - targets.contains(CompassTarget.GOBLIN_QUEEN)); - Assertions.assertTrue(targets.contains(CompassTarget.CRYSTAL_NUCLEUS)); - Assertions.assertEquals(2, targets.size()); - } - - @Test - void possible_targets_only_contains_king_and_odawa_and_nucleus_when_in_jungle_without_crystal_or_key() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Collections.singletonList(jungleCompassUse1)), - Vec3i.NULL_VECTOR); - - // Act - checkSolution(solution); - EnumSet targets = solver.getPossibleTargets(); - - // Assert - Assertions.assertTrue(targets.contains(CompassTarget.GOBLIN_KING)); - Assertions.assertTrue(targets.contains(CompassTarget.ODAWA)); - Assertions.assertTrue(targets.contains(CompassTarget.CRYSTAL_NUCLEUS)); - Assertions.assertEquals(3, targets.size()); - } - - @Test - void possible_targets_only_contains_bal_and_nucleus_when_in_magma_fields_without_crystal() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Collections.singletonList(magmaCompassUse1)), - Vec3i.NULL_VECTOR); - - // Act - checkSolution(solution); - EnumSet targets = solver.getPossibleTargets(); - - // Assert - Assertions.assertTrue(targets.contains(CompassTarget.BAL)); - Assertions.assertTrue(targets.contains(CompassTarget.CRYSTAL_NUCLEUS)); - Assertions.assertEquals(2, targets.size()); - } - - private void CheckExcludedTargetsForCrystals( - CompassUse compassUseToExecute, - ArrayList excludedTargets, - EnumSet foundCrystals) { - // Arrange - EnumSet targets; - Solution solution = new Solution( - new ArrayList<>(Collections.singletonList(compassUseToExecute)), - Vec3i.NULL_VECTOR); - - // Act - checkSolution(solution); - targets = solver.getPossibleTargets(); - boolean targetFound = false; - for (CompassTarget target : excludedTargets) { - if (targets.contains(target)) { - targetFound = true; - break; - } - } - Assertions.assertTrue(targetFound); - - resetSolverState(); - solver.foundCrystals = () -> foundCrystals; - checkSolution(solution); - targets = solver.getPossibleTargets(); - - // Assert - for (CompassTarget target : excludedTargets) { - Assertions.assertFalse(targets.contains(target)); - } - } - - @Test - void possible_targets_excludes_king_and_queen_when_amber_crystal_found() { - ArrayList excludedTargets = new ArrayList<>(Arrays.asList( - CompassTarget.GOBLIN_KING, - CompassTarget.GOBLIN_QUEEN - )); - CheckExcludedTargetsForCrystals(goblinHoldoutCompassUse1, excludedTargets, EnumSet.of(Crystal.AMBER)); - } - - @Test - void possible_targets_excludes_odawa_and_temple_when_amethyst_crystal_found() { - ArrayList excludedTargets = new ArrayList<>(Arrays.asList( - CompassTarget.ODAWA, - CompassTarget.JUNGLE_TEMPLE)); - CheckExcludedTargetsForCrystals(jungleCompassUse1, excludedTargets, EnumSet.of(Crystal.AMETHYST)); - } - - @Test - void possible_targets_excludes_mines_when_jade_crystal_found() { - ArrayList excludedTargets = new ArrayList<>(Collections.singletonList( - CompassTarget.MINES_OF_DIVAN)); - CheckExcludedTargetsForCrystals(minesOfDivanCompassUse1, excludedTargets, EnumSet.of(Crystal.JADE)); - } - - @Test - void possible_targets_excludes_city_when_sapphire_crystal_found() { - ArrayList excludedTargets = new ArrayList<>(Collections.singletonList( - CompassTarget.PRECURSOR_CITY)); - CheckExcludedTargetsForCrystals(precursorCityCompassUse1, excludedTargets, EnumSet.of(Crystal.SAPPHIRE)); - } - - @Test - void possible_targets_excludes_bal_when_topaz_crystal_found() { - ArrayList excludedTargets = new ArrayList<>(Collections.singletonList( - CompassTarget.BAL)); - CheckExcludedTargetsForCrystals(magmaCompassUse1, excludedTargets, EnumSet.of(Crystal.TOPAZ)); - } - - @Test - void solver_resets_when_possible_targets_change_based_on_found_crystals() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Collections.singletonList(minesOfDivanCompassUse1)), - Vec3i.NULL_VECTOR); - - // Act - checkSolution(solution); - systemTimeMillis += minesOfDivanCompassUse2.timeIncrementMillis; - solver.foundCrystals = () -> EnumSet.of(Crystal.JADE); - HandleCompassResult handleCompassResult = solver.handleCompassUse(minesOfDivanCompassUse2.playerPos); - - // Assert - Assertions.assertEquals(HandleCompassResult.POSSIBLE_TARGETS_CHANGED, handleCompassResult); - Assertions.assertEquals(SolverState.NOT_STARTED, solver.getSolverState()); - } - - @Test - void solver_resets_when_possible_targets_change_based_on_location() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Collections.singletonList(minesOfDivanCompassUse1)), - Vec3i.NULL_VECTOR); - - // Act - checkSolution(solution); - systemTimeMillis += minesOfDivanCompassUse2.timeIncrementMillis; - BlockPos newLocation = minesOfDivanCompassUse2.playerPos.add(-400, 0 ,0); - HandleCompassResult handleCompassResult = solver.handleCompassUse(newLocation); - - // Assert - Assertions.assertEquals(HandleCompassResult.POSSIBLE_TARGETS_CHANGED, handleCompassResult); - Assertions.assertEquals(SolverState.NOT_STARTED, solver.getSolverState()); - } - - @Test - void mines_of_divan_solution_is_solved() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Arrays.asList(minesOfDivanCompassUse1, minesOfDivanCompassUse2)), - minesOfDivanSolution - ); - - // Act & Assert - checkSolution(solution); - } - - @Test - void jungle_temple_solution_with_key_in_inventory_is_solved() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Arrays.asList(jungleCompassUse1, jungleCompassUse2)), - jungleSolutionTempleDoor - ); - solver.keyInInventory = () -> true; - - // Act & Assert - checkSolution(solution); - } - - @Test - void jungle_temple_solution_is_solved() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Arrays.asList(jungleCompassUse1, jungleCompassUse2)), - jungleSolution - ); - - // Act & Assert - checkSolution(solution); - } - - @Test - void precursor_city_solution_is_solved() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Arrays.asList(precursorCityCompassUse1, precursorCityCompassUse2)), - precursorCitySolution - ); - - // Act & Assert - checkSolution(solution); - } - - @Test - void goblin_king_solution_is_solved() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Arrays.asList(goblinHoldoutCompassUse1, goblinHoldoutCompassUse2)), - goblinHoldoutKingSolution - ); - - // Act & Assert - checkSolution(solution); - } - - @Test - void bal_solution_is_solved() { - // Arrange - Solution solution = new Solution( - new ArrayList<>(Arrays.asList(magmaCompassUse1, magmaCompassUse2)), - magmaSolution - ); - - // Act & Assert - checkSolution(solution); - } - - EnumSet GetSolutionTargetsHelper( - EnumSet possibleTargets, - Vec3Comparable solutionCoords, - int expectedSolutionCount) { - EnumSet solutionTargets = - CrystalWishingCompassSolver.getSolutionTargets(possibleTargets, solutionCoords); - Assertions.assertEquals(expectedSolutionCount, solutionTargets.size()); - return solutionTargets; - } - - @Test - void solutionPossibleTargets_removes_nucleus_when_coords_not_in_nucleus() { - // Arrange & Act - EnumSet solutionTargets = GetSolutionTargetsHelper( - EnumSet.allOf(CompassTarget.class), - new Vec3Comparable(minesOfDivanSolution), - 2); - - //Assert - Assertions.assertFalse(solutionTargets.contains(CompassTarget.CRYSTAL_NUCLEUS)); - } - - @Test - void solutionPossibleTargets_includes_adjacent_zones() { - // Arrange & Act - EnumSet solutionTargets = GetSolutionTargetsHelper( - EnumSet.allOf(CompassTarget.class), - kingMinesOrNucleusCoordsInRemnants, - 2); - - //Assert - Assertions.assertTrue(solutionTargets.contains(CompassTarget.GOBLIN_KING)); - Assertions.assertTrue(solutionTargets.contains(CompassTarget.MINES_OF_DIVAN)); - } - - @Test - void solutionPossibleTargets_skips_y_filtering_when_single_possible_target() { - // Arrange & Act - EnumSet solutionTargets = GetSolutionTargetsHelper( - EnumSet.of(CompassTarget.GOBLIN_QUEEN), - new Vec3Comparable(goblinHoldoutKingSolution), // Coords not valid for queen - 1); - - //Assert - Assertions.assertTrue(solutionTargets.contains(CompassTarget.GOBLIN_QUEEN)); - } - - @Test - void solutionPossibleTargets_still_filters_non_adjacent_when_single_possible_target() { - // Arrange, Act and Assert - GetSolutionTargetsHelper( - EnumSet.of(CompassTarget.ODAWA), - kingMinesOrNucleusCoordsInRemnants, - 0); - } - - @Test - void solutionPossibleTargets_includes_king_based_on_y_coordinate() { - // Arrange & Act - EnumSet possibleTargets = EnumSet.allOf(CompassTarget.class); - possibleTargets.remove(CompassTarget.ODAWA); - EnumSet solutionTargets = GetSolutionTargetsHelper( - possibleTargets, - new Vec3Comparable(goblinHoldoutKingSolution), - 1); - - //Assert - Assertions.assertTrue(solutionTargets.contains(CompassTarget.GOBLIN_KING)); - } - - @Test - void solutionPossibleTargets_includes_odawa_based_on_y_coordinate() { - // Arrange & Act - // Arrange & Act - EnumSet possibleTargets = EnumSet.allOf(CompassTarget.class); - possibleTargets.remove(CompassTarget.GOBLIN_KING); - EnumSet solutionTargets = GetSolutionTargetsHelper( - possibleTargets, - new Vec3Comparable(odawaSolution), - 1); - - //Assert - Assertions.assertTrue(solutionTargets.contains(CompassTarget.ODAWA)); - } - - @Test - void solutionPossibleTargets_includes_mines_based_on_y_coordinate() { - // Arrange & Act - EnumSet possibleTargets = EnumSet.allOf(CompassTarget.class); - possibleTargets.remove(CompassTarget.ODAWA); - EnumSet solutionTargets = GetSolutionTargetsHelper( - possibleTargets, - new Vec3Comparable(minesOfDivanSolution), - 1); - - //Assert - Assertions.assertTrue(solutionTargets.contains(CompassTarget.MINES_OF_DIVAN)); - } - - @Test - void solutionPossibleTargets_includes_temple_based_on_y_coordinate() { - // Arrange & Act - EnumSet possibleTargets = EnumSet.allOf(CompassTarget.class); - possibleTargets.remove(CompassTarget.BAL); - possibleTargets.remove(CompassTarget.ODAWA); - possibleTargets.remove(CompassTarget.GOBLIN_KING); - EnumSet solutionTargets = GetSolutionTargetsHelper( - possibleTargets, - new Vec3Comparable(jungleSolution), - 1); - - //Assert - Assertions.assertTrue(solutionTargets.contains(CompassTarget.JUNGLE_TEMPLE)); - } - - @Test - void solutionPossibleTargets_includes_queen_based_on_y_coordinate() { - // Arrange & Act - EnumSet possibleTargets = EnumSet.allOf(CompassTarget.class); - possibleTargets.remove(CompassTarget.GOBLIN_KING); - possibleTargets.remove(CompassTarget.ODAWA); - EnumSet solutionTargets = GetSolutionTargetsHelper( - possibleTargets, - new Vec3Comparable(goblinHoldoutQueenSolution), - 1); - - //Assert - Assertions.assertTrue(solutionTargets.contains(CompassTarget.GOBLIN_QUEEN)); - } - - @Test - void solutionPossibleTargets_includes_city_based_on_y_coordinate() { - // Arrange & Act - EnumSet possibleTargets = EnumSet.allOf(CompassTarget.class); - possibleTargets.remove(CompassTarget.GOBLIN_KING); - EnumSet solutionTargets = GetSolutionTargetsHelper( - possibleTargets, - new Vec3Comparable(precursorCitySolution), - 1); - - //Assert - Assertions.assertTrue(solutionTargets.contains(CompassTarget.PRECURSOR_CITY)); - } - - @Test - void solutionPossibleTargets_includes_bal_based_on_y_coordinate() { - // Arrange & Act - EnumSet solutionTargets = GetSolutionTargetsHelper( - EnumSet.allOf(CompassTarget.class), - new Vec3Comparable(magmaSolution), - 1); - - //Assert - Assertions.assertTrue(solutionTargets.contains(CompassTarget.BAL)); - } - - // Represents a particle spawn, including: - // - Milliseconds to increment the "system time" prior to spawn. - // - The particle spawn location. - static class ParticleSpawn { - long timeIncrementMillis; - Vec3Comparable spawnLocation; - - ParticleSpawn(Vec3Comparable spawnLocation, long timeIncrementMillis) { - this.timeIncrementMillis = timeIncrementMillis; - this.spawnLocation = spawnLocation; - } - - ParticleSpawn(ParticleSpawn source) { - timeIncrementMillis = source.timeIncrementMillis; - spawnLocation = new Vec3Comparable(source.spawnLocation); - } - } - - // Represents a use of the wishing compass, including: - // - Milliseconds to increment the "system time" prior to use. - // - The player's position when the compass is used. - // - The resulting set of particles - // - The expected state of the wishing compass solver after this compass is used - static class CompassUse { - long timeIncrementMillis; - BlockPos playerPos; - ArrayList particles; - HandleCompassResult expectedHandleCompassUseResult; - SolverState expectedSolverState; - - CompassUse(long timeIncrementMillis, - BlockPos playerPos, - ArrayList particles, - HandleCompassResult expectedHandleCompassUseResult, - SolverState expectedState) { - this.timeIncrementMillis = timeIncrementMillis; - this.playerPos = playerPos; - this.particles = particles != null ? particles : new ArrayList<>(); - this.expectedHandleCompassUseResult = expectedHandleCompassUseResult; - this.expectedSolverState = expectedState; - } - - CompassUse(CompassUse source) { - this.timeIncrementMillis = source.timeIncrementMillis; - this.playerPos = new BlockPos(source.playerPos); - this.particles = new ArrayList<>(source.particles); - this.expectedHandleCompassUseResult = source.expectedHandleCompassUseResult; - this.expectedSolverState = source.expectedSolverState; - } - } - - static class Solution { - ArrayList compassUses; - Vec3i expectedSolutionCoords; - - Solution(ArrayList compassUses, Vec3i expectedSolutionCoords) { - this.compassUses = compassUses; - this.expectedSolutionCoords = new Vec3i(expectedSolutionCoords.getX(), expectedSolutionCoords.getY(), expectedSolutionCoords.getZ()); - } - } - - private static void neuDebugLog(String message) { - System.out.println(message); - } -} diff --git a/src/test/resources/log4j2-test.xml b/src/test/resources/log4j2-test.xml deleted file mode 100644 index 25209eae..00000000 --- a/src/test/resources/log4j2-test.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - -- cgit From 4afcd516ffc58d55da24c5f4db14db7922f61121 Mon Sep 17 00:00:00 2001 From: Walker Selby Date: Sun, 27 Mar 2022 14:21:41 -0500 Subject: Blaze slayer (#102) --- Update Notes/2.1.md | 1 + .../moulberry/notenoughupdates/listener/ChatListener.java | 2 +- .../moulberry/notenoughupdates/overlays/SlayerOverlay.java | 10 +++++++--- .../java/io/github/moulberry/notenoughupdates/util/SBInfo.java | 2 ++ 4 files changed, 11 insertions(+), 4 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 9b67fb75..98672187 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -68,6 +68,7 @@ - Added NBT data to Profile Viewer HOTM tree icons - whalker - Added NBT data to Profile Viewer Tab Icons - whalker - Added NBT data to Profile Viewer XP Bar Icons - whalker +- Added Blaze Slayer information - whalker ### **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/listener/ChatListener.java b/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java index ebb537dc..d40a39f1 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java @@ -27,7 +27,7 @@ import static io.github.moulberry.notenoughupdates.overlays.SlayerOverlay.*; public class ChatListener { private final NotEnoughUpdates neu; private static final Pattern SLAYER_XP = Pattern.compile( - " (Spider|Zombie|Wolf|Enderman) Slayer LVL (\\d) - (?:Next LVL in ([\\d,]+) XP!|LVL MAXED OUT!)"); + " (Spider|Zombie|Wolf|Enderman|Blaze) Slayer LVL (\\d) - (?:Next LVL in ([\\d,]+) XP!|LVL MAXED OUT!)"); AtomicBoolean missingRecipe = new AtomicBoolean(false); public ChatListener(NotEnoughUpdates neu) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/SlayerOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/SlayerOverlay.java index 89fce0f2..e2b22b82 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/SlayerOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/SlayerOverlay.java @@ -66,6 +66,9 @@ public class SlayerOverlay extends TextOverlay { case "Enderman": if (!locrawLocation.equals("combat_3")) return false; break; + case "Blaze": + if (!locrawLocation.equals("crimson_isle")) return false; + break; default: //A new slayer would need an update (see SBInfo) return false; @@ -97,10 +100,11 @@ public class SlayerOverlay extends TextOverlay { slayerIntXP = 0; isSlayerNine = false; } - //System.out.println(slayerEXP); + if (SBInfo.getInstance().slayer.equals("Tarantula") || SBInfo.getInstance().slayer.equals("Revenant")) { useSmallXpNext = true; - } else if (SBInfo.getInstance().slayer.equals("Sven") || SBInfo.getInstance().slayer.equals("Enderman")) { + } else if (SBInfo.getInstance().slayer.equals("Sven") || SBInfo.getInstance().slayer.equals("Enderman") || + SBInfo.getInstance().slayer.equals("Blaze")) { useSmallXpNext = false; } switch (slayerLVL) { @@ -185,7 +189,7 @@ public class SlayerOverlay extends TextOverlay { HashMap lineMap = new HashMap<>(); NumberFormat format = NumberFormat.getIntegerInstance(); - //System.out.println(SBInfo.getInstance().isSlain); + overlayStrings = new ArrayList<>(); lineMap.put( 0, diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java b/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java index 5b7bd055..95a3539a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java @@ -311,6 +311,8 @@ public class SBInfo { slayer = "Sven"; } else if (line.contains("Voidgloom Seraph")) { slayer = "Enderman"; + } else if (line.contains("Inferno Demonlord")) { + slayer = "Blaze"; } if (lines.contains("Slayer Quest") && SlayerOverlay.unloadOverlayTimer == -1 || lines.contains("Slayer Quest") && System.currentTimeMillis() - SlayerOverlay.unloadOverlayTimer > 500) { -- cgit From f237ae4cecdfa5c00ee83bd0176a591a2b174913 Mon Sep 17 00:00:00 2001 From: CraftyOldMiner <85420839+CraftyOldMiner@users.noreply.github.com> Date: Sun, 27 Mar 2022 23:07:57 -0500 Subject: Restore metal detector and wishing compass changes that were nuked by #94 (#104) --- Update Notes/2.1.md | 3 +- build.gradle.kts | 5 + .../notenoughupdates/commands/dev/DiagCommand.java | 27 +- .../notenoughupdates/core/util/Vec3Comparable.java | 129 +++ .../miscfeatures/CrystalMetalDetectorSolver.java | 450 +++++--- .../miscfeatures/CrystalWishingCompassSolver.java | 942 ++++++++++++--- .../options/seperateSections/Mining.java | 54 +- .../notenoughupdates/util/NEUDebugLogger.java | 10 +- .../moulberry/notenoughupdates/util/SBInfo.java | 14 +- .../core/util/Vec3ComparableTest.java | 193 ++++ .../CrystalMetalDetectorSolverTest.java | 204 ++++ .../CrystalWishingCompassSolverTest.java | 1206 ++++++++++++++++++++ src/test/resources/log4j2-test.xml | 16 + 13 files changed, 2916 insertions(+), 337 deletions(-) create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/core/util/Vec3Comparable.java create mode 100644 src/test/java/io/github/moulberry/notenoughupdates/core/util/Vec3ComparableTest.java create mode 100644 src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolverTest.java create mode 100644 src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolverTest.java create mode 100644 src/test/resources/log4j2-test.xml (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 98672187..4e8e7bf8 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -14,7 +14,7 @@ - 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 using two samples - CraftyOldMiner +- 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:** @@ -104,5 +104,6 @@ - Added 4 new textures for the on/off switches in /neu - 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 e47b0f67..e134387e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -67,6 +67,7 @@ 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") } @@ -76,6 +77,10 @@ tasks.withType(JavaCompile::class) { options.encoding = "UTF-8" } +tasks.named("test") { + useJUnitPlatform() +} + tasks.withType(Jar::class) { archiveBaseName.set("NotEnoughUpdates") manifest.attributes.run { 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 88264538..dab99698 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 @@ -17,8 +17,10 @@ public class DiagCommand extends ClientCommandBase { private static final String USAGE_TEXT = EnumChatFormatting.WHITE + "Usage: /neudiag \n\n" + - "/neudiag metal Metal Detector Solver diagnostics\n" + - "/neudiag wishing Wishing Compass Solver diagnostics\n" + + "/neudiag metal Metal Detector Solver diagnostics\n" + + " Show current solution diags\n" + + " center= Disable / enable using center\n" + + "/neudiag wishing Wishing Compass Solver diagnostics\n" + "/neudiag debug\n" + " Show current flags\n" + " Enable/disable flag\n"; @@ -37,7 +39,26 @@ public class DiagCommand extends ClientCommandBase { String command = args[0].toLowerCase(); switch (command) { case "metal": - CrystalMetalDetectorSolver.logDiagnosticData(true); + if (args.length == 1) { + CrystalMetalDetectorSolver.logDiagnosticData(true); + return; + } + + String subCommand = args[1].toLowerCase(); + if (subCommand.equals("center=off")) { + CrystalMetalDetectorSolver.setDebugDoNotUseCenter(true); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + + "Center coordinates-based solutions disabled")); + } + else if (subCommand.equals("center=on")) { + CrystalMetalDetectorSolver.setDebugDoNotUseCenter(false); + sender.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + + "Center coordinates-based solutions enabled")); + } else { + showUsage(sender); + return; + } + break; case "wishing": CrystalWishingCompassSolver.getInstance().logDiagnosticData(true); 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 new file mode 100644 index 00000000..cd144c21 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/Vec3Comparable.java @@ -0,0 +1,129 @@ +package io.github.moulberry.notenoughupdates.core.util; + +import net.minecraft.util.BlockPos; +import net.minecraft.util.Vec3; +import net.minecraft.util.Vec3i; + +public class Vec3Comparable extends Vec3 implements Comparable { + public static final Vec3Comparable NULL_VECTOR = new Vec3Comparable(0.0, 0.0, 0.0); + + public Vec3Comparable(double x, double y, double z) { + super(x, y, z); + } + + public Vec3Comparable(Vec3i sourceVec) { + super(sourceVec); + } + + public Vec3Comparable(Vec3 source) { + super(source.xCoord, source.yCoord, source.zCoord); + } + + public Vec3Comparable(BlockPos source) { + + super(source.getX(), source.getY(), source.getZ()); + } + + public Vec3Comparable(Vec3Comparable source) { + super(source.xCoord, source.yCoord, source.zCoord); + } + + @Override + public Vec3Comparable subtractReverse(Vec3 vec) { + return new Vec3Comparable(super.subtractReverse(vec)); + } + + @Override + public Vec3Comparable normalize() { + return new Vec3Comparable(super.normalize()); + } + + @Override + public Vec3Comparable crossProduct(Vec3 vec) { + return new Vec3Comparable(super.crossProduct(vec)); + } + + @Override + public Vec3Comparable subtract(Vec3 vec) { + return new Vec3Comparable(super.subtract(vec)); + } + + @Override + public Vec3Comparable subtract(double x, double y, double z) { + return new Vec3Comparable(super.subtract(x, y, z)); + } + + @Override + public Vec3Comparable add(Vec3 other) { + return new Vec3Comparable(super.add(other)); + } + + @Override + public Vec3Comparable addVector(double x, double y, double z) { + return new Vec3Comparable(super.addVector(x, y, z)); + } + + @Override + public Vec3Comparable getIntermediateWithXValue(Vec3 vec, double x) { + return new Vec3Comparable(super.getIntermediateWithXValue(vec, x)); + } + + @Override + public Vec3Comparable getIntermediateWithYValue(Vec3 vec, double y) { + return new Vec3Comparable(super.getIntermediateWithYValue(vec, y)); + } + + @Override + public Vec3Comparable getIntermediateWithZValue(Vec3 vec, double z) { + return new Vec3Comparable(super.getIntermediateWithZValue(vec, z)); + } + + @Override + public Vec3Comparable rotatePitch(float pitch) { + return new Vec3Comparable(super.rotatePitch(pitch)); + } + + @Override + public Vec3Comparable rotateYaw(float yaw) { + return new Vec3Comparable(super.rotateYaw(yaw)); + } + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } else if (!(other instanceof Vec3Comparable)) { + return false; + } else { + Vec3Comparable vec3c = (Vec3Comparable) other; + return this.xCoord == vec3c.xCoord && this.yCoord == vec3c.yCoord && this.zCoord == vec3c.zCoord; + } + } + + @Override + public int hashCode() { + long bits = 1L; + bits = 31L * bits + doubleToLongBits(xCoord); + bits = 31L * bits + doubleToLongBits(yCoord); + bits = 31L * bits + doubleToLongBits(zCoord); + return (int) (bits ^ (bits >> 32)); + } + + 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); + } + + public boolean signumEquals(Vec3 other) { + return Math.signum(xCoord) == Math.signum(other.xCoord) && + Math.signum(yCoord) == Math.signum(other.yCoord) && + Math.signum(zCoord) == Math.signum(other.zCoord); + } + + private static long doubleToLongBits(double d) { + return d == 0.0 ? 0L : Double.doubleToLongBits(d); + } +} 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 27c334ad..f43ebda2 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolver.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolver.java @@ -1,6 +1,7 @@ package io.github.moulberry.notenoughupdates.miscfeatures; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.core.util.Vec3Comparable; import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils; import io.github.moulberry.notenoughupdates.options.customtypes.NEUDebugFlag; import io.github.moulberry.notenoughupdates.util.NEUDebugLogger; @@ -11,7 +12,6 @@ import net.minecraft.util.BlockPos; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IChatComponent; -import net.minecraft.util.Vec3; import net.minecraft.util.Vec3i; import java.util.Arrays; @@ -22,25 +22,35 @@ import java.util.List; import java.util.stream.Collectors; public class CrystalMetalDetectorSolver { + enum SolutionState { + NOT_STARTED, + MULTIPLE, + MULTIPLE_KNOWN, + FOUND, + FOUND_KNOWN, + FAILED, + INVALID, + } + private static final Minecraft mc = Minecraft.getMinecraft(); - private static BlockPos prevPlayerPos; - private static double prevDistToTreasure = 0; + private static Vec3Comparable prevPlayerPos; + private static double prevDistToTreasure; private static HashSet possibleBlocks = new HashSet<>(); - private static final HashMap evaluatedPlayerPositions = new HashMap<>(); - private static BlockPos blockPosIfLastSolutionInvalid; - private static Boolean chestRecentlyFound = false; - private static long chestLastFoundMillis = 0; + private static final HashMap evaluatedPlayerPositions = new HashMap<>(); + private static boolean chestRecentlyFound; + private static long chestLastFoundMillis; private static final HashSet openedChestPositions = new HashSet<>(); // Keeper and Mines of Divan center location info private static Vec3i minesCenter; - private static boolean visitKeeperMessagePrinted = false; - private static String KEEPER_OF_STRING = "Keeper of "; - private static String DIAMOND_STRING = "diamond"; - private static String LAPIS_STRING = "lapis"; - private static String EMERALD_STRING = "emerald"; - private static String GOLD_STRING = "gold"; + private static boolean debugDoNotUseCenter = false; + private static boolean visitKeeperMessagePrinted; + private static final String KEEPER_OF_STRING = "Keeper of "; + private static final String DIAMOND_STRING = "diamond"; + private static final String LAPIS_STRING = "lapis"; + 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)); @@ -94,6 +104,14 @@ public class CrystalMetalDetectorSolver { -9896946827286L // x=-37, y=-21, z=-22 )); + static Predicate treasureAllowedPredicate = CrystalMetalDetectorSolver::treasureAllowed; + static SolutionState currentState = SolutionState.NOT_STARTED; + static SolutionState previousState = SolutionState.NOT_STARTED; + + public interface Predicate { + boolean check(BlockPos blockPos); + } + public static void process(IChatComponent message) { if (SBInfo.getInstance().getLocation() == null || !NotEnoughUpdates.INSTANCE.config.mining.metalDetectorEnabled || @@ -102,7 +120,7 @@ public class CrystalMetalDetectorSolver { return; } - locateMinesCenterIfNeeded(); + boolean centerNewlyDiscovered = locateMinesCenterIfNeeded(); double distToTreasure = Double.parseDouble(message .getUnformattedText() @@ -122,20 +140,64 @@ public class CrystalMetalDetectorSolver { chestRecentlyFound = false; } - if (prevDistToTreasure == distToTreasure && - prevPlayerPos.equals(mc.thePlayer.getPosition()) && - !evaluatedPlayerPositions.keySet().contains(mc.thePlayer.getPosition())) { + SolutionState originalState = currentState; + int originalCount = possibleBlocks.size(); + Vec3Comparable adjustedPlayerPos = getPlayerPosAdjustedForEyeHeight(); + findPossibleSolutions(distToTreasure, adjustedPlayerPos, centerNewlyDiscovered); + if (currentState != originalState || originalCount != possibleBlocks.size()) { + switch (currentState) { + case FOUND_KNOWN: + NEUDebugLogger.log(NEUDebugFlag.METAL, "Known location identified."); + // falls through + case FOUND: + 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, + EnumChatFormatting.AQUA + "Solution coordinates: " + + EnumChatFormatting.WHITE + possibleBlocks.iterator().next().toString()); + } + break; + case INVALID: + mc.thePlayer.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "[NEU] Previous solution is invalid.")); + logDiagnosticData(false); + resetSolution(false); + break; + case FAILED: + mc.thePlayer.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "[NEU] Failed to find a solution.")); + logDiagnosticData(false); + resetSolution(false); + break; + case MULTIPLE_KNOWN: + NEUDebugLogger.log(NEUDebugFlag.METAL, "Multiple known locations identified:"); + // falls through + case MULTIPLE: + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + + "[NEU] Need another position to find solution. Possible blocks: " + possibleBlocks.size())); + break; + default: + throw new IllegalStateException("Metal detector is in invalid state"); + } + } + } + + static void findPossibleSolutions(double distToTreasure, Vec3Comparable playerPos, boolean centerNewlyDiscovered) { + if (prevDistToTreasure == distToTreasure && prevPlayerPos.equals(playerPos) && + !evaluatedPlayerPositions.containsKey(playerPos)) { + evaluatedPlayerPositions.put(playerPos, distToTreasure); if (possibleBlocks.size() == 0) { - evaluatedPlayerPositions.put(mc.thePlayer.getPosition(), distToTreasure); for (int zOffset = (int) Math.floor(-distToTreasure); zOffset <= Math.ceil(distToTreasure); zOffset++) { for (int y = 65; y <= 75; y++) { double calculatedDist = 0; int xOffset = 0; while (calculatedDist < distToTreasure) { - BlockPos pos = new BlockPos(Math.floor(mc.thePlayer.posX) + xOffset, - y, Math.floor(mc.thePlayer.posZ) + zOffset); - calculatedDist = getPlayerPos().distanceTo(new Vec3(pos).addVector(0D, 1D, 0D)); - if (round(calculatedDist, 1) == distToTreasure && treasureAllowed(pos)) { + BlockPos pos = new BlockPos(Math.floor(playerPos.xCoord) + xOffset, + y, Math.floor(playerPos.zCoord) + zOffset + ); + calculatedDist = playerPos.distanceTo(new Vec3Comparable(pos).addVector(0D, 1D, 0D)); + if (round(calculatedDist, 1) == distToTreasure && treasureAllowedPredicate.check(pos)) { possibleBlocks.add(pos); } xOffset++; @@ -143,10 +205,11 @@ public class CrystalMetalDetectorSolver { xOffset = 0; calculatedDist = 0; while (calculatedDist < distToTreasure) { - BlockPos pos = new BlockPos(Math.floor(mc.thePlayer.posX) - xOffset, - y, Math.floor(mc.thePlayer.posZ) + zOffset); - calculatedDist = getPlayerPos().distanceTo(new Vec3(pos).addVector(0D, 1D, 0D)); - if (round(calculatedDist, 1) == distToTreasure && treasureAllowed(pos)) { + BlockPos pos = new BlockPos(Math.floor(playerPos.xCoord) - xOffset, + y, Math.floor(playerPos.zCoord) + zOffset + ); + calculatedDist = playerPos.distanceTo(new Vec3Comparable(pos).addVector(0D, 1D, 0D)); + if (round(calculatedDist, 1) == distToTreasure && treasureAllowedPredicate.check(pos)) { possibleBlocks.add(pos); } xOffset++; @@ -154,48 +217,33 @@ public class CrystalMetalDetectorSolver { } } - checkAndDisplaySolutionState(); + updateSolutionState(); } else if (possibleBlocks.size() != 1) { - evaluatedPlayerPositions.put(mc.thePlayer.getPosition().getImmutable(), distToTreasure); HashSet temp = new HashSet<>(); for (BlockPos pos : possibleBlocks) { - if (round(getPlayerPos().distanceTo(new Vec3(pos).addVector(0D, 1D, 0D)), 1) == distToTreasure) { + if (round(playerPos.distanceTo(new Vec3Comparable(pos).addVector(0D, 1D, 0D)), 1) == distToTreasure) { temp.add(pos); } } possibleBlocks = temp; - checkAndDisplaySolutionState(); + updateSolutionState(); } else { BlockPos pos = possibleBlocks.iterator().next(); - if (Math.abs(distToTreasure - (getPlayerPos().distanceTo(new Vec3(pos)))) > 5) { - mc.thePlayer.addChatMessage(new ChatComponentText( - EnumChatFormatting.RED + "[NEU] Previous solution is invalid.")); - blockPosIfLastSolutionInvalid = pos.getImmutable(); - logDiagnosticData(false); - resetSolution(false); + if (Math.abs(distToTreasure - (playerPos.distanceTo(new Vec3Comparable(pos)))) > 5) { + currentState = SolutionState.INVALID; } } + } else if (centerNewlyDiscovered && possibleBlocks.size() > 1) { + updateSolutionState(); } - prevPlayerPos = mc.thePlayer.getPosition().getImmutable(); + prevPlayerPos = playerPos; prevDistToTreasure = distToTreasure; } - private static void checkForSingleKnownLocationMatch() { - if (minesCenter == BlockPos.NULL_VECTOR || possibleBlocks.size() < 2) { - return; - } - - HashSet temp = possibleBlocks.stream() - .filter(block -> knownChestOffsets.contains(block.subtract(minesCenter).toLong())) - .collect(Collectors.toCollection(HashSet::new)); - if (temp.size() == 1) { - possibleBlocks = temp; - NEUDebugLogger.log(NEUDebugFlag.METAL, "Known location identified."); - } else if (temp.size() > 1) { - NEUDebugLogger.log(NEUDebugFlag.METAL, temp.size() + " known locations identified:"); - } + public static void setDebugDoNotUseCenter(boolean val) { + debugDoNotUseCenter = val; } private static String getFriendlyBlockPositions(Collection positions) { @@ -206,10 +254,13 @@ public class CrystalMetalDetectorSolver { StringBuilder sb = new StringBuilder(); sb.append("\n"); for (BlockPos blockPos : positions) { - sb.append("Absolute: " + blockPos.toString()); + sb.append("Absolute: "); + sb.append(blockPos.toString()); if (minesCenter != Vec3i.NULL_VECTOR) { BlockPos relativeOffset = blockPos.subtract(minesCenter); - sb.append(", Relative: " + relativeOffset.toString() + " (" + relativeOffset.toLong() + ")"); + sb.append(", Relative: "); + sb.append(relativeOffset.toString() ); + sb.append(" (" + relativeOffset.toLong() + ")"); } sb.append("\n"); } @@ -217,22 +268,23 @@ public class CrystalMetalDetectorSolver { return sb.toString(); } - private static String getFriendlyEvaluatedPositions(HashMap positions) { - if (!NEUDebugLogger.isFlagEnabled(NEUDebugFlag.METAL) || positions.size() == 0) { + private static String getFriendlyEvaluatedPositions() { + if (!NEUDebugLogger.isFlagEnabled(NEUDebugFlag.METAL) || evaluatedPlayerPositions.size() == 0) { return ""; } StringBuilder sb = new StringBuilder(); sb.append("\n"); - for (BlockPos blockPos : positions.keySet()) { - sb.append("Absolute: " + blockPos.toString()); + for (Vec3Comparable vec : evaluatedPlayerPositions.keySet()) { + sb.append("Absolute: " + vec.toString()); if (minesCenter != Vec3i.NULL_VECTOR) { - BlockPos relativeOffset = blockPos.subtract(minesCenter); + BlockPos positionBlockPos = new BlockPos(vec); + BlockPos relativeOffset = positionBlockPos.subtract(minesCenter); sb.append(", Relative: " + relativeOffset.toString() + " (" + relativeOffset.toLong() + ")"); } sb.append(" Distance: "); - sb.append(positions.get(blockPos)); + sb.append(evaluatedPlayerPositions.get(vec)); sb.append("\n"); } @@ -240,101 +292,8 @@ public class CrystalMetalDetectorSolver { return sb.toString(); } - public static void logDiagnosticData(boolean outputAlways) { - if (SBInfo.getInstance().getLocation() == null) { - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + - "[NEU] This command is not available outside SkyBlock")); - return; - } - - if (!NotEnoughUpdates.INSTANCE.config.mining.metalDetectorEnabled) - { - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + - "[NEU] Metal Detector Solver is not enabled.")); - return; - } - - if (!outputAlways && !NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.contains(NEUDebugFlag.METAL)) { - return; - } - - boolean originalDebugFlag = !NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.add(NEUDebugFlag.METAL); - - StringBuilder diagsMessage = new StringBuilder(); - - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Mines Center: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append((minesCenter == Vec3i.NULL_VECTOR) ? "" : minesCenter.toString()); - diagsMessage.append("\n"); - - diagsMessage.append("\n"); - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Previous Player Position: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append((prevPlayerPos == null) ? "" : prevPlayerPos.toString()); - diagsMessage.append("\n"); - - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Previous Distance To Treasure: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append((prevDistToTreasure == 0) ? "" : prevDistToTreasure); - diagsMessage.append("\n"); - - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Last Solution Invalid Position: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append((blockPosIfLastSolutionInvalid == null) ? "" : blockPosIfLastSolutionInvalid.toString()); - diagsMessage.append("\n"); - - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Current Possible Blocks: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(possibleBlocks.size()); - diagsMessage.append(getFriendlyBlockPositions(possibleBlocks)); - diagsMessage.append("\n"); - - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Evaluated player positions: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(evaluatedPlayerPositions.size()); - diagsMessage.append(getFriendlyEvaluatedPositions(evaluatedPlayerPositions)); - diagsMessage.append("\n"); - - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Chest locations not on known list:\n"); - diagsMessage.append(EnumChatFormatting.WHITE); - if (minesCenter != Vec3i.NULL_VECTOR) { - HashSet locationsNotOnKnownList = openedChestPositions - .stream() - .filter(block -> !knownChestOffsets.contains(block.subtract(minesCenter).toLong())) - .map(block -> block.subtract(minesCenter)) - .collect(Collectors.toCollection(HashSet::new)); - if (locationsNotOnKnownList.size() > 0) { - for (BlockPos blockPos : locationsNotOnKnownList) { - diagsMessage.append(String.format( - "%dL,\t\t// x=%d, y=%d, z=%d", - blockPos.toLong(), - blockPos.getX(), - blockPos.getY(), - blockPos.getZ() - )); - } - } - } else { - diagsMessage.append(""); - } - - NEUDebugLogger.log(NEUDebugFlag.METAL, diagsMessage.toString()); - - if (!originalDebugFlag) { - NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.remove(NEUDebugFlag.METAL); - } - } - public static void resetSolution(Boolean chestFound) { if (chestFound) { - blockPosIfLastSolutionInvalid = null; prevPlayerPos = null; prevDistToTreasure = 0; if (possibleBlocks.size() == 1) { @@ -345,15 +304,18 @@ public class CrystalMetalDetectorSolver { chestRecentlyFound = chestFound; possibleBlocks.clear(); evaluatedPlayerPositions.clear(); + previousState = currentState; + currentState = SolutionState.NOT_STARTED; } public static void initWorld() { minesCenter = Vec3i.NULL_VECTOR; visitKeeperMessagePrinted = false; - blockPosIfLastSolutionInvalid = null; openedChestPositions.clear(); + chestLastFoundMillis = 0; prevDistToTreasure = 0; prevPlayerPos = null; + currentState = SolutionState.NOT_STARTED; resetSolution(false); } @@ -377,15 +339,14 @@ public class CrystalMetalDetectorSolver { } } - private static void locateMinesCenterIfNeeded() { + private static boolean locateMinesCenterIfNeeded() { if (minesCenter != Vec3i.NULL_VECTOR) { - return; + return false; } List keeperEntities = mc.theWorld.getEntities(EntityArmorStand.class, (entity) -> { if (!entity.hasCustomName()) return false; - if (entity.getCustomNameTag().contains(KEEPER_OF_STRING)) return true; - return false; + return entity.getCustomNameTag().contains(KEEPER_OF_STRING); }); if (keeperEntities.size() == 0) { @@ -394,7 +355,7 @@ public class CrystalMetalDetectorSolver { "[NEU] Approach a Keeper while holding the metal detector to enable faster treasure hunting.")); visitKeeperMessagePrinted = true; } - return; + return false; } EntityArmorStand keeperEntity = keeperEntities.get(0); @@ -407,6 +368,11 @@ public class CrystalMetalDetectorSolver { EnumChatFormatting.WHITE + minesCenter.toString()); mc.thePlayer.addChatMessage(new ChatComponentText( EnumChatFormatting.YELLOW + "[NEU] Faster treasure hunting is now enabled based on Keeper location.")); + return true; + } + + public static void setMinesCenter(BlockPos center) { + minesCenter = center; } private static double round(double value, int precision) { @@ -414,42 +380,174 @@ public class CrystalMetalDetectorSolver { return (double) Math.round(value * scale) / scale; } - private static void checkAndDisplaySolutionState() { + private static void updateSolutionState() { + previousState = currentState; + if (possibleBlocks.size() == 0) { - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "[NEU] Failed to find a solution.")); - logDiagnosticData(false); - resetSolution(false); + currentState = SolutionState.FAILED; return; } - checkForSingleKnownLocationMatch(); - if (possibleBlocks.size() > 1) { - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + - "[NEU] Need another position to find solution. Possible blocks: " + possibleBlocks.size())); - } else { - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "[NEU] Found solution.")); + if (possibleBlocks.size() == 1) { + currentState = SolutionState.FOUND; + return; } + + // Narrow solutions using known locations if the mines center is known + if (minesCenter.equals(BlockPos.NULL_VECTOR) || debugDoNotUseCenter) { + currentState = SolutionState.MULTIPLE; + return; + } + + HashSet temp = + possibleBlocks.stream() + .filter(block -> knownChestOffsets.contains(block.subtract(minesCenter).toLong())) + .collect(Collectors.toCollection(HashSet::new)); + if (temp.size() == 0) { + currentState = SolutionState.MULTIPLE; + return; + } + + if (temp.size() == 1) { + possibleBlocks = temp; + currentState = SolutionState.FOUND_KNOWN; + return; + + } + + currentState = SolutionState.MULTIPLE_KNOWN; + } + + public static BlockPos getSolution() { + if (CrystalMetalDetectorSolver.possibleBlocks.size() != 1) { + return BlockPos.ORIGIN; + } + + return CrystalMetalDetectorSolver.possibleBlocks.stream().iterator().next(); } - private static Vec3 getPlayerPos() { - return new Vec3( + private static Vec3Comparable getPlayerPosAdjustedForEyeHeight() { + return new Vec3Comparable( mc.thePlayer.posX, mc.thePlayer.posY + (mc.thePlayer.getEyeHeight() - mc.thePlayer.getDefaultEyeHeight()), mc.thePlayer.posZ ); } - private static boolean treasureAllowed(BlockPos pos) { - boolean airAbove = mc.theWorld. - getBlockState(pos.add(0, 1, 0)).getBlock().getRegistryName().equals("minecraft:air"); - boolean allowedBlockType = mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:gold_block") || + static boolean isKnownOffset(BlockPos pos) { + return knownChestOffsets.contains(pos.subtract(minesCenter).toLong()); + } + + static boolean isAllowedBlockType(BlockPos pos) { + return mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:gold_block") || mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:prismarine") || mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:chest") || mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:stained_glass") || mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:stained_glass_pane") || mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:wool") || mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:stained_hardened_clay"); - boolean knownOffset = knownChestOffsets.contains(pos.subtract(minesCenter).toLong()); - return airAbove & (knownOffset | allowedBlockType); + } + + static boolean isAirAbove(BlockPos pos) { + return mc.theWorld. + getBlockState(pos.add(0, 1, 0)).getBlock().getRegistryName().equals("minecraft:air"); + } + + private static boolean treasureAllowed(BlockPos pos) { + boolean airAbove = isAirAbove(pos); + boolean allowedBlockType = isAllowedBlockType(pos); + return isKnownOffset(pos) || (airAbove && allowedBlockType); + } + + static private String getDiagnosticMessage() { + StringBuilder diagsMessage = new StringBuilder(); + + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("Mines Center: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append((minesCenter.equals(Vec3i.NULL_VECTOR)) ? "" : minesCenter.toString()); + diagsMessage.append("\n"); + + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("Current Solution State: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append(currentState.name()); + diagsMessage.append("\n"); + + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("Previous Solution State: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append(previousState.name()); + diagsMessage.append("\n"); + + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("Previous Player Position: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append((prevPlayerPos == null) ? "" : prevPlayerPos.toString()); + diagsMessage.append("\n"); + + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("Previous Distance To Treasure: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append((prevDistToTreasure == 0) ? "" : prevDistToTreasure); + diagsMessage.append("\n"); + + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("Current Possible Blocks: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append(possibleBlocks.size()); + diagsMessage.append(getFriendlyBlockPositions(possibleBlocks)); + diagsMessage.append("\n"); + + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("Evaluated player positions: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append(evaluatedPlayerPositions.size()); + diagsMessage.append(getFriendlyEvaluatedPositions()); + diagsMessage.append("\n"); + + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("Chest locations not on known list:\n"); + diagsMessage.append(EnumChatFormatting.WHITE); + if (minesCenter != Vec3i.NULL_VECTOR) { + HashSet locationsNotOnKnownList = openedChestPositions + .stream() + .filter(block -> !knownChestOffsets.contains(block.subtract(minesCenter).toLong())) + .map(block -> block.subtract(minesCenter)) + .collect(Collectors.toCollection(HashSet::new)); + if (locationsNotOnKnownList.size() > 0) { + for (BlockPos blockPos : locationsNotOnKnownList) { + diagsMessage.append(String.format( + "%dL,\t\t// x=%d, y=%d, z=%d", + blockPos.toLong(), + blockPos.getX(), + blockPos.getY(), + blockPos.getZ() + )); + } + } + } else { + diagsMessage.append(""); + } + + return diagsMessage.toString(); + } + + public static void logDiagnosticData(boolean outputAlways) { + if (!SBInfo.getInstance().checkForSkyblockLocation()) { + return; + } + + if (!NotEnoughUpdates.INSTANCE.config.mining.metalDetectorEnabled) + { + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + + "[NEU] Metal Detector Solver is not enabled.")); + return; + } + + boolean metalDebugFlagSet = NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.contains(NEUDebugFlag.METAL); + if (outputAlways || metalDebugFlagSet) { + NEUDebugLogger.logAlways(getDiagnosticMessage()); + } } } 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 25f39c3a..9a950e7f 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolver.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolver.java @@ -2,27 +2,67 @@ package io.github.moulberry.notenoughupdates.miscfeatures; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.core.util.Line; +import io.github.moulberry.notenoughupdates.core.util.Vec3Comparable; +import io.github.moulberry.notenoughupdates.options.NEUConfig; import io.github.moulberry.notenoughupdates.options.customtypes.NEUDebugFlag; import io.github.moulberry.notenoughupdates.util.NEUDebugLogger; import io.github.moulberry.notenoughupdates.util.SBInfo; +import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.event.ClickEvent; -import net.minecraft.event.HoverEvent; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.ChatComponentText; -import net.minecraft.util.ChatStyle; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.Vec3; +import net.minecraft.util.Vec3i; +import net.minecraftforge.client.ClientCommandHandler; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.function.BooleanSupplier; +import java.util.function.LongSupplier; + public class CrystalWishingCompassSolver { + enum SolverState { + NOT_STARTED, + PROCESSING_FIRST_USE, + NEED_SECOND_COMPASS, + PROCESSING_SECOND_USE, + SOLVED, + FAILED_EXCEPTION, + FAILED_TIMEOUT_NO_REPEATING, + FAILED_TIMEOUT_NO_PARTICLES, + FAILED_INTERSECTION_CALCULATION, + FAILED_INVALID_SOLUTION, + } + + enum CompassTarget { + GOBLIN_QUEEN, + GOBLIN_KING, + BAL, + JUNGLE_TEMPLE, + ODAWA, + PRECURSOR_CITY, + MINES_OF_DIVAN, + CRYSTAL_NUCLEUS, + } + + enum Crystal { + AMBER, + AMETHYST, + JADE, + SAPPHIRE, + TOPAZ, + } + private static final CrystalWishingCompassSolver INSTANCE = new CrystalWishingCompassSolver(); public static CrystalWishingCompassSolver getInstance() { return INSTANCE; @@ -31,40 +71,72 @@ public class CrystalWishingCompassSolver { private static final Minecraft mc = Minecraft.getMinecraft(); private static boolean isSkytilsPresent = false; - // Crystal Nucleus unbreakable blocks, area coordinates reported by Hypixel server are slightly different - private static final AxisAlignedBB NUCLEUS_BB = new AxisAlignedBB(463, 63, 460, 563, 181, 564); - private static final double MAX_COMPASS_PARTICLE_SPREAD = 16; - - private static BlockPos prevPlayerPos; - private long compassUsedMillis = 0; - private Vec3 firstParticle = null; - private Vec3 lastParticle = null; - private double lastParticleDistanceFromFirst = 0; - private Line firstCompassLine = null; - private Line secondCompassLine = null; - private Vec3 solution = null; - private Line solutionIntersectionLine = null; - - private void resetForNewCompass() { - compassUsedMillis = 0; - firstParticle = null; - lastParticle = null; - lastParticleDistanceFromFirst = 0; + // NOTE: There is a small set of breakable blocks above the nucleus at Y > 181. While this zone is reported + // as the Crystal Nucleus by Hypixel, for wishing compass purposes it is in the appropriate quadrant. + private static final AxisAlignedBB NUCLEUS_BB = new AxisAlignedBB(462, 63, 461, 564, 181, 565); + private static final AxisAlignedBB HOLLOWS_BB = new AxisAlignedBB(201, 30, 201, 824, 189, 824); + private static final AxisAlignedBB PRECURSOR_REMNANTS_BB = new AxisAlignedBB(513, 64, 513, 824, 189, 824); + private static final AxisAlignedBB MITHRIL_DEPOSITS_BB = new AxisAlignedBB(513, 64, 201, 824, 189, 512); + private static final AxisAlignedBB GOBLIN_HOLDOUT_BB = new AxisAlignedBB(201, 64, 513, 512, 189, 824); + private static final AxisAlignedBB JUNGLE_BB = new AxisAlignedBB(201, 64, 201, 512, 189, 512); + private static final AxisAlignedBB MAGMA_FIELDS_BB = new AxisAlignedBB(201, 30, 201, 824, 63, 824); + private static final double MAX_DISTANCE_BETWEEN_PARTICLES = 0.6; + private static final double MAX_DISTANCE_FROM_USE_TO_FIRST_PARTICLE = 9.0; + + // 64.0 is an arbitrary value but seems to work well + private static final double MINIMUM_DISTANCE_SQ_BETWEEN_COMPASSES = 64.0; + + // All particles typically arrive in < 3500, so 5000 should be enough buffer + public static final long ALL_PARTICLES_MAX_MILLIS = 5000L; + + 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; + private Compass firstCompass; + private Compass secondCompass; + private Line solutionIntersectionLine; + private EnumSet possibleTargets; + private Vec3Comparable solution; + private Vec3Comparable originalSolution; + private EnumSet solutionPossibleTargets; + + public SolverState getSolverState() { + return solverState; + } + + public Vec3i getSolutionCoords() { + return new Vec3i(solution.xCoord, solution.yCoord, solution.zCoord); + } + + public EnumSet getPossibleTargets() { + return possibleTargets; } private void resetForNewTarget() { NEUDebugLogger.log(NEUDebugFlag.WISHING,"Resetting for new target"); - resetForNewCompass(); - firstCompassLine = null; - secondCompassLine = null; + solverState = SolverState.NOT_STARTED; + firstCompass = null; + secondCompass = null; solutionIntersectionLine = null; - prevPlayerPos = null; + possibleTargets = null; solution = null; + originalSolution = null; + solutionPossibleTargets = null; + } + + public void initWorld() { + resetForNewTarget(); } @SubscribeEvent public void onWorldLoad(WorldEvent.Unload event) { - resetForNewTarget(); + initWorld(); isSkytilsPresent = Loader.isModLoaded("skytils"); } @@ -90,28 +162,101 @@ public class CrystalWishingCompassSolver { return; } - try { - if (isSolved()) { - resetForNewTarget(); - } + BlockPos playerPos = mc.thePlayer.getPosition().getImmutable(); - // 64.0 is an arbitrary value but seems to work well - if (prevPlayerPos != null && prevPlayerPos.distanceSq(mc.thePlayer.getPosition()) < 64.0) { - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + - "[NEU] Move a little further before using the wishing compass again.")); - event.setCanceled(true); - return; + try { + HandleCompassResult result = handleCompassUse(playerPos); + switch (result) { + case SUCCESS: + return; + case STILL_PROCESSING_PRIOR_USE: + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + + "[NEU] Wait a little longer before using the wishing compass again.")); + event.setCanceled(true); + break; + case LOCATION_TOO_CLOSE: + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + + "[NEU] Move a little further before using the wishing compass again.")); + event.setCanceled(true); + break; + case POSSIBLE_TARGETS_CHANGED: + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + + "[NEU] Possible wishing compass targets have changed. Solver has been reset.")); + event.setCanceled(true); + break; + case NO_PARTICLES_FOR_PREVIOUS_COMPASS: + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + + "[NEU] No particles detected for prior compass use. Need another position to solve.")); + break; + case PLAYER_IN_NUCLEUS: + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + + "[NEU] Wishing compass must be used outside the nucleus for accurate results.")); + event.setCanceled(true); + break; + default: + throw new IllegalStateException("Unexpected wishing compass solver state: \n" + getDiagnosticMessage()); } - - prevPlayerPos = mc.thePlayer.getPosition().getImmutable(); - compassUsedMillis = System.currentTimeMillis(); } catch (Exception e) { mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "[NEU] Error processing wishing compass action - see log for details")); e.printStackTrace(); + event.setCanceled(true); + solverState = SolverState.FAILED_EXCEPTION; } } + 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: + 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()); + 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; + } + + if (!possibleTargets.equals(calculatePossibleTargets(playerPos))) { + resetForNewTarget(); + 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" ); + } + /* * Processes particles if the wishing compass was used within the last 5 seconds. * @@ -142,188 +287,701 @@ public class CrystalWishingCompassSolver { ) { if (!NotEnoughUpdates.INSTANCE.config.mining.wishingCompassSolver || particleType != EnumParticleTypes.VILLAGER_HAPPY || - !SBInfo.getInstance().getLocation().equals("crystal_hollows") || - isSolved() || - System.currentTimeMillis() - compassUsedMillis > 5000) { + !SBInfo.getInstance().getLocation().equals("crystal_hollows")) { return; } try { - Vec3 particleVec = new Vec3(x, y, z); - if (firstParticle == null) { - firstParticle = particleVec; - return; + SolverState originalSolverState = solverState; + solveUsingParticle(x, y, z, currentTimeMillis.getAsLong()); + if (solverState != originalSolverState) { + switch (solverState) { + case SOLVED: + showSolution(); + break; + case FAILED_EXCEPTION: + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + + "[NEU] Unable to determine wishing compass target.")); + logDiagnosticData(false); + break; + case FAILED_TIMEOUT_NO_REPEATING: + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + + "[NEU] Timed out waiting for repeat set of compass particles.")); + logDiagnosticData(false); + break; + case FAILED_TIMEOUT_NO_PARTICLES: + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + + "[NEU] Timed out waiting for compass particles.")); + logDiagnosticData(false); + break; + case FAILED_INTERSECTION_CALCULATION: + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + + "[NEU] Unable to determine intersection of wishing compasses.")); + logDiagnosticData(false); + break; + case FAILED_INVALID_SOLUTION: + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + + "[NEU] Failed to find solution.")); + logDiagnosticData(false); + break; + case NEED_SECOND_COMPASS: + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + + "[NEU] Need another position to determine wishing compass target.")); + break; + } } + } catch (Exception e) { + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + + "[NEU] Exception while calculating wishing compass solution - see log for details")); + e.printStackTrace(); + } + } - double distanceFromFirst = particleVec.distanceTo(firstParticle); - if (distanceFromFirst > MAX_COMPASS_PARTICLE_SPREAD) { + /** + * + * @param x Particle x coordinate + * @param y Particle y coordinate + * @param z Particle z coordinate + */ + public void solveUsingParticle(double x, double y, double z, long currentTimeMillis) { + Compass currentCompass; + switch (solverState) { + case PROCESSING_FIRST_USE: + currentCompass = firstCompass; + break; + case PROCESSING_SECOND_USE: + currentCompass = secondCompass; + break; + default: return; - } + } - if (distanceFromFirst >= lastParticleDistanceFromFirst) { - lastParticleDistanceFromFirst = distanceFromFirst; - lastParticle = particleVec; + currentCompass.processParticle(x, y, z, currentTimeMillis); + switch (currentCompass.compassState) { + case FAILED_TIMEOUT_NO_PARTICLES: + solverState = SolverState.FAILED_TIMEOUT_NO_PARTICLES; + return; + case FAILED_TIMEOUT_NO_REPEATING: + solverState = SolverState.FAILED_TIMEOUT_NO_REPEATING; + return; + case WAITING_FOR_FIRST_PARTICLE: + case COMPUTING_LAST_PARTICLE: return; + case COMPLETED: + if (solverState == SolverState.NEED_SECOND_COMPASS) { + return; + } + if (solverState == SolverState.PROCESSING_FIRST_USE) { + solverState = SolverState.NEED_SECOND_COMPASS; + return; + } + break; + } + + // First and Second compasses have completed + solutionIntersectionLine = firstCompass.line.getIntersectionLineSegment(secondCompass.line); + + if (solutionIntersectionLine == null) { + solverState = SolverState.FAILED_INTERSECTION_CALCULATION; + return; + } + + solution = new Vec3Comparable(solutionIntersectionLine.getMidpoint()); + + Vec3Comparable firstDirection = firstCompass.getDirection(); + Vec3Comparable firstSolutionDirection = firstCompass.getDirectionTo(solution); + Vec3Comparable secondDirection = secondCompass.getDirection(); + Vec3Comparable secondSolutionDirection = secondCompass.getDirectionTo(solution); + if (!firstDirection.signumEquals(firstSolutionDirection) || + !secondDirection.signumEquals(secondSolutionDirection) || + !HOLLOWS_BB.isVecInside(solution)) { + solverState = SolverState.FAILED_INVALID_SOLUTION; + return; + } + + solutionPossibleTargets = getSolutionTargets(possibleTargets, solution); + + // Adjust the Jungle Temple solution coordinates + if (solutionPossibleTargets.size() == 1 && + solutionPossibleTargets.contains(CompassTarget.JUNGLE_TEMPLE)) { + originalSolution = solution; + solution = solution.addVector(-57, 36, -21); + } + + solverState = SolverState.SOLVED; + } + + private boolean isKeyInInventory() + { + for (ItemStack item : mc.thePlayer.inventory.mainInventory){ + if (item != null && item.getDisplayName().contains("Jungle Key")) { + return true; } + } + return false; + } - // We get here when the second repetition of particles begins. - // Since the second repetition overlaps with the last few particles - // of the first repetition, the last particle we capture isn't truly the last. - // But that's OK since subsequent particles will be on the same line. - Line line = new Line(firstParticle, lastParticle); - if (firstCompassLine == null) { - firstCompassLine = line; - resetForNewCompass(); - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + - "[NEU] Need another position to determine wishing compass target.")); - return; + private boolean isKingsScentPresent() + { + return SBInfo.getInstance().footer.getUnformattedText().contains("King's Scent I"); + } + + private EnumSet getFoundCrystals() { + EnumSet foundCrystals = EnumSet.noneOf(Crystal.class); + NEUConfig.HiddenProfileSpecific perProfileConfig = NotEnoughUpdates.INSTANCE.config.getProfileSpecific(); + if (perProfileConfig == null) return foundCrystals; + HashMap crystals = perProfileConfig.crystals; + for (String crystalName : crystals.keySet()) { + Integer crystalState = crystals.get(crystalName); + if (crystalState != null && crystalState > 0) { + foundCrystals.add(Crystal.valueOf(crystalName.toUpperCase())); } + } - secondCompassLine = line; - solutionIntersectionLine = firstCompassLine.getIntersectionLineSegment(secondCompassLine); - if (solutionIntersectionLine == null) { - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + - "[NEU] Unable to determine wishing compass target.")); - logDiagnosticData(false); - return; + return foundCrystals; + } + + // Returns candidates based on seen Y coordinates and quadrants that + // are not adjacent to the solution's quadrant. If the solution is + // the nucleus then a copy of the original possible targets is + // returned. + // + // NOTE: Adjacent quadrant filtering could be improved based on + // structure sizes in the future to only allow a certain + // distance into the adjacent quadrant. + // + // |----------|------------| + // | Jungle | Mithril | + // | | Deposits | + // |----------|----------- | + // | Goblin | Precursor | + // | Holdout | Deposits | + // |----------|------------| + static public EnumSet getSolutionTargets( + EnumSet possibleTargets, + Vec3Comparable solution) { + EnumSet solutionPossibleTargets; + solutionPossibleTargets = possibleTargets.clone(); + + if (NUCLEUS_BB.isVecInside(solution)) { + return solutionPossibleTargets; + } + + solutionPossibleTargets.remove(CompassTarget.CRYSTAL_NUCLEUS); + + // Eliminate non-adjacent zones first + if (MITHRIL_DEPOSITS_BB.isVecInside(solution)) { + solutionPossibleTargets.remove(CompassTarget.GOBLIN_KING); + solutionPossibleTargets.remove(CompassTarget.GOBLIN_QUEEN); + } else if (PRECURSOR_REMNANTS_BB.isVecInside(solution)) { + solutionPossibleTargets.remove(CompassTarget.ODAWA); + solutionPossibleTargets.remove(CompassTarget.JUNGLE_TEMPLE); + } else if (GOBLIN_HOLDOUT_BB.isVecInside(solution)) { + solutionPossibleTargets.remove(CompassTarget.MINES_OF_DIVAN); + } else if (JUNGLE_BB.isVecInside(solution)) { + solutionPossibleTargets.remove(CompassTarget.PRECURSOR_CITY); + } + + // If there's only 1 possible target then don't remove based + // on Y coordinates since assumptions about Y coordinates could + // be wrong. + if (solutionPossibleTargets.size() > 1) { + // Y coordinates are 43-70 from 11 samples + if (solutionPossibleTargets.contains(CompassTarget.BAL) && + solution.yCoord > 72) { + solutionPossibleTargets.remove(CompassTarget.BAL); } - solution = solutionIntersectionLine.getMidpoint(); + // Y coordinates are 93-157 from 10 samples, may be able to filter + // more based on the offset of the King within the structure + if (solutionPossibleTargets.contains(CompassTarget.GOBLIN_KING) && + solution.yCoord < 64) { + solutionPossibleTargets.remove(CompassTarget.GOBLIN_KING); + } - if (solution.distanceTo(firstParticle) < 8) { - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + - "[NEU] WARNING: Solution is likely incorrect.")); - logDiagnosticData(false); - return; + // Y coordinates are 129-139 from 10 samples + if (solutionPossibleTargets.contains(CompassTarget.GOBLIN_QUEEN) && + (solution.yCoord < 127 || solution.yCoord > 141)) { + solutionPossibleTargets.remove(CompassTarget.GOBLIN_QUEEN); } - showSolution(); - } catch (Exception e) { - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + - "[NEU] Exception while calculating wishing compass solution - see log for details")); - e.printStackTrace(); + // Y coordinates are 72-80 from 10 samples + if (solutionPossibleTargets.contains(CompassTarget.JUNGLE_TEMPLE) && + (solution.yCoord < 70 || solution.yCoord > 82)) { + solutionPossibleTargets.remove(CompassTarget.JUNGLE_TEMPLE); + } + + // Y coordinates are 110-128 from 3 samples, not enough data to use + if (solutionPossibleTargets.contains(CompassTarget.ODAWA) && + solution.yCoord < 64) { + solutionPossibleTargets.remove(CompassTarget.ODAWA); + } + + // Y coordinates are 122-129 from 8 samples + if (solutionPossibleTargets.contains(CompassTarget.PRECURSOR_CITY) && + (solution.yCoord < 119 || solution.yCoord > 132)) { + solutionPossibleTargets.remove(CompassTarget.PRECURSOR_CITY); + } + + // Y coordinates are 98-102 from 15 samples + if (solutionPossibleTargets.contains(CompassTarget.MINES_OF_DIVAN) && + (solution.yCoord < 96 || solution.yCoord > 104)) { + solutionPossibleTargets.remove(CompassTarget.MINES_OF_DIVAN); + } } + + return solutionPossibleTargets; } - private boolean isSolved() { - return solution != null; + private EnumSet calculatePossibleTargets(BlockPos playerPos) { + boolean targetsBasedOnZoneWithoutCrystal = false; + EnumSet candidateTargets = EnumSet.allOf(CompassTarget.class); + EnumSet foundCrystals = this.foundCrystals.getAsCrystalEnumSet(); + Vec3Comparable playerPosVec = new Vec3Comparable(playerPos); + + // If the current zone's crystal hasn't been found then remove all non-nucleus candidates other + // than the ones in the current zone. The one exception is that the king is kept when in the jungle + // since the compass can point to the king if odawa is missing (which often happens). + // The nucleus is kept since it can be returned if the structure for the current zone is missing. + if (GOBLIN_HOLDOUT_BB.isVecInside(playerPosVec) && !foundCrystals.contains(Crystal.AMBER)) { + candidateTargets.clear(); + candidateTargets.add(CompassTarget.CRYSTAL_NUCLEUS); + candidateTargets.add(CompassTarget.GOBLIN_KING); + candidateTargets.add(CompassTarget.GOBLIN_QUEEN); + targetsBasedOnZoneWithoutCrystal = true; + } + + if (JUNGLE_BB.isVecInside(playerPosVec) && !foundCrystals.contains(Crystal.AMETHYST)) { + candidateTargets.clear(); + candidateTargets.add(CompassTarget.CRYSTAL_NUCLEUS); + candidateTargets.add(CompassTarget.ODAWA); + candidateTargets.add(CompassTarget.JUNGLE_TEMPLE); + if (!keyInInventory.getAsBoolean() && !kingsScentPresent.getAsBoolean()) { + // If Odawa is missing then the king may be returned + candidateTargets.add(CompassTarget.GOBLIN_KING); + } + targetsBasedOnZoneWithoutCrystal = true; + } + + if (MITHRIL_DEPOSITS_BB.isVecInside(playerPosVec) && !foundCrystals.contains(Crystal.JADE)) { + candidateTargets.clear(); + candidateTargets.add(CompassTarget.CRYSTAL_NUCLEUS); + candidateTargets.add(CompassTarget.MINES_OF_DIVAN); + targetsBasedOnZoneWithoutCrystal = true; + } + + if (PRECURSOR_REMNANTS_BB.isVecInside(playerPosVec) && !foundCrystals.contains(Crystal.SAPPHIRE)) { + candidateTargets.clear(); + candidateTargets.add(CompassTarget.CRYSTAL_NUCLEUS); + candidateTargets.add(CompassTarget.PRECURSOR_CITY); + targetsBasedOnZoneWithoutCrystal = true; + } + + if (MAGMA_FIELDS_BB.isVecInside(playerPosVec) && !foundCrystals.contains(Crystal.TOPAZ)) { + candidateTargets.clear(); + candidateTargets.add(CompassTarget.CRYSTAL_NUCLEUS); + candidateTargets.add(CompassTarget.BAL); + targetsBasedOnZoneWithoutCrystal = true; + } + + if (!targetsBasedOnZoneWithoutCrystal) { + // Filter out crystal-based targets outside the current zone + if (foundCrystals.contains(Crystal.AMBER)) { + candidateTargets.remove(CompassTarget.GOBLIN_KING); + candidateTargets.remove(CompassTarget.GOBLIN_QUEEN); + } + + if (foundCrystals.contains(Crystal.AMETHYST)) { + candidateTargets.remove(CompassTarget.ODAWA); + candidateTargets.remove(CompassTarget.JUNGLE_TEMPLE); + } + + if (foundCrystals.contains(Crystal.JADE)) { + candidateTargets.remove(CompassTarget.MINES_OF_DIVAN); + } + + if (foundCrystals.contains(Crystal.TOPAZ)) { + candidateTargets.remove(CompassTarget.BAL); + } + + if (foundCrystals.contains(Crystal.SAPPHIRE)) { + candidateTargets.remove(CompassTarget.PRECURSOR_CITY); + } + } + + candidateTargets.remove(kingsScentPresent.getAsBoolean() ? CompassTarget.GOBLIN_KING : CompassTarget.GOBLIN_QUEEN); + candidateTargets.remove(keyInInventory.getAsBoolean() ? CompassTarget.ODAWA : CompassTarget.JUNGLE_TEMPLE); + + return candidateTargets; } - private void showSolution() { - if (solution == null) return; - String description = "[NEU] Wishing compass target: "; - String coordsText = String.format("%.0f %.0f %.0f", - solution.xCoord, - solution.yCoord, - solution.zCoord); + 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"; + } + } - if (NUCLEUS_BB.isVecInside(solution)) { - description += "Crystal Nucleus (" + coordsText + ")"; - } else { - description += coordsText; + private String getNameForCompassTarget(CompassTarget compassTarget) { + boolean useSkytilsNames = (NotEnoughUpdates.INSTANCE.config.mining.wishingCompassWaypointNameType == 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"; } + } - ChatComponentText message = new ChatComponentText(EnumChatFormatting.YELLOW + description); + private String getSolutionCoordsText() { + return solution == null ? "" : + String.format("%.0f %.0f %.0f", solution.xCoord, solution.yCoord, solution.zCoord); + } - if (isSkytilsPresent) { - ChatStyle clickEvent = new ChatStyle().setChatClickEvent( - new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/sthw add WishingTarget " + coordsText)); - clickEvent.setChatHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ChatComponentText( - EnumChatFormatting.YELLOW + - "Add Skytils hollows waypoint"))); - message.setChatStyle(clickEvent); + private String getWishingCompassDestinationsMessage() { + StringBuilder sb = new StringBuilder(); + sb.append(EnumChatFormatting.YELLOW); + sb.append("[NEU] "); + sb.append(EnumChatFormatting.AQUA); + sb.append("Wishing compass points to "); + int index = 1; + for (CompassTarget target : solutionPossibleTargets) { + if (index > 1) { + sb.append(EnumChatFormatting.AQUA); + if (index == solutionPossibleTargets.size()) { + sb.append(" or "); + } else { + sb.append(", "); + } + } + sb.append(getFriendlyNameForCompassTarget(target)); + index++; } - Minecraft.getMinecraft().thePlayer.addChatMessage(message); + sb.append(EnumChatFormatting.AQUA); + sb.append(" ("); + sb.append(getSolutionCoordsText()); + sb.append(")"); + return sb.toString(); } - public void logDiagnosticData(boolean outputAlways) { - if (SBInfo.getInstance().getLocation() == null) { - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + - "[NEU] This command is not available outside SkyBlock")); + private void showSolution() { + if (solution == null) return; + + if (NUCLEUS_BB.isVecInside(solution)) { + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "[NEU] " + + EnumChatFormatting.AQUA + "Wishing compass target is the Crystal Nucleus")); return; } - if (!NotEnoughUpdates.INSTANCE.config.mining.wishingCompassSolver) - { - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + - "[NEU] Wishing Compass Solver is not enabled.")); + String destinationMessage = getWishingCompassDestinationsMessage(); + + if (!isSkytilsPresent) { + mc.thePlayer.addChatMessage(new ChatComponentText(destinationMessage)); return; } - if (!outputAlways && !NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.contains(NEUDebugFlag.WISHING)) { - return; + String targetNameForSkytils = solutionPossibleTargets.size() == 1 ? + getNameForCompassTarget(solutionPossibleTargets.iterator().next()) : + "WishingTarget"; + String skytilsCommand = String.format("/sthw add %s %s", targetNameForSkytils, getSolutionCoordsText()); + if (NotEnoughUpdates.INSTANCE.config.mining.wishingCompassAutocreateKnownWaypoints && + solutionPossibleTargets.size() == 1) { + mc.thePlayer.addChatMessage(new ChatComponentText(destinationMessage)); + int commandResult = ClientCommandHandler.instance.executeCommand(mc.thePlayer, skytilsCommand); + if (commandResult == 1) + { + return; + } + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "[NEU] Failed to automatically run /sthw")); } - boolean originalDebugFlag = !NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.add(NEUDebugFlag.WISHING); + 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\n")); + mc.thePlayer.addChatMessage(chatMessage); + } + private String getDiagnosticMessage() { StringBuilder diagsMessage = new StringBuilder(); - diagsMessage.append("\n"); diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Skytils Present: "); + diagsMessage.append("Solver State: "); diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(isSkytilsPresent); + diagsMessage.append(solverState.name()); diagsMessage.append("\n"); - diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Compass Used Millis: "); - diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(compassUsedMillis); - diagsMessage.append("\n"); + if (firstCompass == null) { + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("First Compass: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append(""); + diagsMessage.append("\n"); + } else { + firstCompass.appendCompassDiagnostics(diagsMessage, "First Compass"); + } + + if (secondCompass == null) { + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("Second Compass: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append(""); + diagsMessage.append("\n"); + } else { + secondCompass.appendCompassDiagnostics(diagsMessage, "Second Compass"); + } diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Compass Used Position: "); + diagsMessage.append("Intersection Line: "); diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append((prevPlayerPos == null) ? "" : prevPlayerPos.toString()); + diagsMessage.append((solutionIntersectionLine == null) ? "" : solutionIntersectionLine); diagsMessage.append("\n"); diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("First Particle: "); + diagsMessage.append("Jungle Key in Inventory: "); diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append((firstParticle == null) ? "" : firstParticle.toString()); + diagsMessage.append(isKeyInInventory()); diagsMessage.append("\n"); diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Last Particle: "); + diagsMessage.append("King's Scent Present: "); diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append((lastParticle == null) ? "" : lastParticle.toString()); + diagsMessage.append(isKingsScentPresent()); diagsMessage.append("\n"); diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Last Particle Distance From First: "); + diagsMessage.append("First Compass Targets: "); diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append(lastParticleDistanceFromFirst); + diagsMessage.append(possibleTargets == null ? "" : possibleTargets.toString()); diagsMessage.append("\n"); diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("First Compass Line: "); + diagsMessage.append("Current Calculated Targets: "); diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append((firstCompassLine == null) ? "" : firstCompassLine.toString()); + diagsMessage.append(calculatePossibleTargets(mc.thePlayer.getPosition())); diagsMessage.append("\n"); diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Second Compass Line: "); + diagsMessage.append("Found Crystals: "); diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append((secondCompassLine == null) ? "" : secondCompassLine.toString()); + diagsMessage.append(getFoundCrystals()); diagsMessage.append("\n"); + if (originalSolution != null) { + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("Original Solution: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append(originalSolution); + diagsMessage.append("\n"); + } + diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Intersection Line: "); + diagsMessage.append("Solution: "); diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append((secondCompassLine == null) ? "" : solutionIntersectionLine); + diagsMessage.append((solution == null) ? "" : solution.toString()); diagsMessage.append("\n"); diagsMessage.append(EnumChatFormatting.AQUA); - diagsMessage.append("Solution: "); + diagsMessage.append("Solution Targets: "); diagsMessage.append(EnumChatFormatting.WHITE); - diagsMessage.append((solution == null) ? "" : solution.toString()); + diagsMessage.append((solutionPossibleTargets == null) ? "" : solutionPossibleTargets.toString()); diagsMessage.append("\n"); - NEUDebugLogger.log(NEUDebugFlag.WISHING, diagsMessage.toString()); + return diagsMessage.toString(); + } + + public void logDiagnosticData(boolean outputAlways) { + if (!SBInfo.getInstance().checkForSkyblockLocation()) { + return; + } - if (!originalDebugFlag) { - NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.remove(NEUDebugFlag.WISHING); + if (!NotEnoughUpdates.INSTANCE.config.mining.wishingCompassSolver) + { + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + + "[NEU] Wishing Compass Solver is not enabled.")); + return; + } + + boolean wishingDebugFlagSet = NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.contains(NEUDebugFlag.WISHING); + if (outputAlways || wishingDebugFlagSet) { + NEUDebugLogger.logAlways(getDiagnosticMessage()); + } + } + + enum CompassState { + WAITING_FOR_FIRST_PARTICLE, + COMPUTING_LAST_PARTICLE, + COMPLETED, + FAILED_TIMEOUT_NO_REPEATING, + FAILED_TIMEOUT_NO_PARTICLES, + } + + enum HandleCompassResult { + SUCCESS, + LOCATION_TOO_CLOSE, + STILL_PROCESSING_PRIOR_USE, + POSSIBLE_TARGETS_CHANGED, + NO_PARTICLES_FOR_PREVIOUS_COMPASS, + PLAYER_IN_NUCLEUS + } + + static class Compass { + public CompassState compassState; + public Line line = null; + + private final BlockPos whereUsed; + private final long whenUsedMillis; + private Vec3Comparable firstParticle = null; + private Vec3Comparable previousParticle = null; + private Vec3Comparable lastParticle = null; + private final ArrayList processedParticles; + + Compass(BlockPos whereUsed, long whenUsedMillis) { + this.whereUsed = whereUsed; + this.whenUsedMillis = whenUsedMillis; + compassState = CompassState.WAITING_FOR_FIRST_PARTICLE; + processedParticles = new ArrayList<>(); + } + + public Vec3Comparable getDirection() { + if (firstParticle == null || lastParticle == null) { + return null; + } + + return new Vec3Comparable(firstParticle.subtractReverse(lastParticle).normalize()); + } + + public Vec3Comparable getDirectionTo(Vec3Comparable target) { + if (firstParticle == null || target == null) { + return null; + } + + return new Vec3Comparable(firstParticle.subtractReverse(target).normalize()); + } + + public double particleSpread() { + if (firstParticle == null || lastParticle == null) { + return 0.0; + } + return firstParticle.distanceTo(lastParticle); + } + + 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) { + throw new UnsupportedOperationException("processParticle should not be called in a failed or completed state"); + } + + if (particleTimeMillis - this.whenUsedMillis > ALL_PARTICLES_MAX_MILLIS) { + // Assume we have failed if we're still trying to process particles + compassState = CompassState.FAILED_TIMEOUT_NO_REPEATING; + return; + } + + Vec3Comparable currentParticle = new Vec3Comparable(x, y, z); + if (compassState == CompassState.WAITING_FOR_FIRST_PARTICLE) { + if (currentParticle.distanceTo(new Vec3Comparable(whereUsed)) < MAX_DISTANCE_FROM_USE_TO_FIRST_PARTICLE) { + processedParticles.add(new ProcessedParticle(currentParticle, particleTimeMillis)); + firstParticle = currentParticle; + previousParticle = currentParticle; + compassState = CompassState.COMPUTING_LAST_PARTICLE; + } + return; + } + + // State is COMPUTING_LAST_PARTICLE, keep updating the previousParticle until + // the first particle in the second sequence is seen. + if (currentParticle.distanceTo(previousParticle) <= MAX_DISTANCE_BETWEEN_PARTICLES) { + processedParticles.add(new ProcessedParticle(currentParticle, particleTimeMillis)); + previousParticle = currentParticle; + return; + } + + if (currentParticle.distanceTo(firstParticle) > MAX_DISTANCE_BETWEEN_PARTICLES) { + return; + } + + // It's a repeating particle + processedParticles.add(new ProcessedParticle(currentParticle, particleTimeMillis)); + lastParticle = previousParticle; + line = new Line(firstParticle, lastParticle); + compassState = CompassState.COMPLETED; + } + + public void appendCompassDiagnostics(StringBuilder diagsMessage, String compassName) { + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append("Compass State: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append(compassState.name()); + diagsMessage.append("\n"); + + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append(compassName); + diagsMessage.append(" Used Millis: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append(whenUsedMillis); + diagsMessage.append("\n"); + + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append(compassName); + diagsMessage.append(" Used Position: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append((whereUsed == null) ? "" : whereUsed.toString()); + diagsMessage.append("\n"); + + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append(compassName); + diagsMessage.append(" All Seen Particles: \n"); + diagsMessage.append(EnumChatFormatting.WHITE); + for (ProcessedParticle particle : processedParticles) { + diagsMessage.append(particle.toString()); + diagsMessage.append("\n"); + } + + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append(compassName); + diagsMessage.append(" Particle Spread: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append(particleSpread()); + diagsMessage.append("\n"); + + diagsMessage.append(EnumChatFormatting.AQUA); + diagsMessage.append(compassName); + diagsMessage.append(" Compass Line: "); + diagsMessage.append(EnumChatFormatting.WHITE); + diagsMessage.append((line == null) ? "" : line.toString()); + diagsMessage.append("\n"); + } + + static class ProcessedParticle { + Vec3Comparable coords; + long particleTimeMillis; + + ProcessedParticle(Vec3Comparable coords, long particleTimeMillis) { + this.coords = coords; + this.particleTimeMillis = particleTimeMillis; + } + + @Override + public String toString() { + return coords.toString() + " " + particleTimeMillis; + } } } } 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 6cfb8c04..f793baf0 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 @@ -641,6 +641,42 @@ public class Mining { @ConfigAccordionId(id = 6) public int crystalHollowNoneColor = 12; + @ConfigOption( + name = "Wishing Compass Solver", + desc = "" + ) + @ConfigEditorAccordion(id = 7) + public boolean wishingCompassSolverAccordion = false; + + @Expose + @ConfigOption( + name = "Enable Solver", + desc = "Show wishing compass target coordinates based on two samples" + ) + @ConfigAccordionId(id = 7) + @ConfigEditorBoolean + public boolean wishingCompassSolver = true; + + @Expose + @ConfigOption( + name = "Skytils Waypoints", + desc = "Automatically create Skytils waypoints for well-known targets" + ) + @ConfigAccordionId(id = 7) + @ConfigEditorBoolean + public boolean wishingCompassAutocreateKnownWaypoints = false; + + @Expose + @ConfigOption( + name = "Waypoint Type", + desc = "Skytils Waypoint name type. Skytils Built-in will be overwritten by Skytils when the waypoint is nearby." + ) + @ConfigAccordionId(id = 7) + @ConfigEditorDropdown( + values = {"NEU", "Skytils"} + ) + public int wishingCompassWaypointNameType = 0; + @Expose @ConfigOption( name = "Puzzler Solver", @@ -665,19 +701,11 @@ public class Mining { @ConfigEditorBoolean public boolean titaniumAlertMustBeVisible = false; - @Expose - @ConfigOption( - name = "Wishing Compass Solver", - desc = "Show wishing compass target coordinates based on two samples" - ) - @ConfigEditorBoolean - public boolean wishingCompassSolver = true; - @ConfigOption( name = "Custom Textures", desc = "" ) - @ConfigEditorAccordion(id = 7) + @ConfigEditorAccordion(id = 8) public boolean texturesAccordion = false; @Expose @@ -685,7 +713,7 @@ public class Mining { name = "Dwarven Mines Textures", desc = "Allows texture packs to retexture blocks in the Dwarven Mines. If you don't have a texture pack that does this, you should leave this off" ) - @ConfigAccordionId(id = 7) + @ConfigAccordionId(id = 8) @ConfigEditorBoolean public boolean dwarvenTextures = false; @Expose @@ -693,7 +721,7 @@ public class Mining { name = "Crystal Hollows Textures", desc = "Allows texture packs to retexture blocks in the Crystal Hollows. If you don't have a texture pack that does this, you should leave this off" ) - @ConfigAccordionId(id = 7) + @ConfigAccordionId(id = 8) @ConfigEditorBoolean public boolean crystalHollowTextures = false; @@ -702,7 +730,7 @@ public class Mining { name = "Replace Gemstone sounds", desc = "Replace the break sounds of crystals in the Crystal Hollows. Requires a texture pack with this feature" ) - @ConfigAccordionId(id = 7) + @ConfigAccordionId(id = 8) @ConfigEditorBoolean public boolean gemstoneSounds = false; @@ -711,7 +739,7 @@ public class Mining { name = "Replace Mithril sounds", desc = "Replace the break sounds of mithril and titanium in the Dwarven mines. Requires a texture pack with this feature" ) - @ConfigAccordionId(id = 7) + @ConfigAccordionId(id = 8) @ConfigEditorBoolean public boolean mithrilSounds = false; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/NEUDebugLogger.java b/src/main/java/io/github/moulberry/notenoughupdates/util/NEUDebugLogger.java index d662a872..827a3e97 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/NEUDebugLogger.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/NEUDebugLogger.java @@ -13,6 +13,8 @@ import java.util.function.Consumer; public class NEUDebugLogger { private static final Minecraft mc = Minecraft.getMinecraft(); public static Consumer logMethod = NEUDebugLogger::chatLogger; + // Used to prevent accessing NEUConfig in unit tests + public static boolean allFlagsEnabled = false; private static void chatLogger(String message) { mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "[NEU DEBUG] " + message)); @@ -23,7 +25,13 @@ public class NEUDebugLogger { } public static void log(NEUDebugFlag flag, String message) { - if (logMethod != null && isFlagEnabled(flag)) { + if (logMethod != null && (allFlagsEnabled || isFlagEnabled(flag))) { + logAlways(message); + } + } + + public static void logAlways(String message) { + if (logMethod != null) { logMethod.accept(message); } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java b/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java index 95a3539a..f1e40671 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java @@ -18,6 +18,8 @@ import net.minecraft.scoreboard.Score; import net.minecraft.scoreboard.ScoreObjective; import net.minecraft.scoreboard.ScorePlayerTeam; import net.minecraft.scoreboard.Scoreboard; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IChatComponent; import net.minecraftforge.client.event.ClientChatReceivedEvent; import net.minecraftforge.client.event.GuiOpenEvent; @@ -57,7 +59,7 @@ public class SBInfo { public String slayer = ""; public boolean stranded = false; - public String mode = ""; + public String mode = null; public Date currentTimeDate = null; @@ -120,6 +122,16 @@ public class SBInfo { } } + public boolean checkForSkyblockLocation() { + if (!NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard() || getLocation() == null) { + Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + + "[NEU] This command is not available outside SkyBlock")); + return false; + } + + return true; + } + private static final Pattern PROFILE_PATTERN = Pattern.compile("(?(♲ Ironman)|(☀ Stranded)|()) *Profile: (?[^ ]+)"); diff --git a/src/test/java/io/github/moulberry/notenoughupdates/core/util/Vec3ComparableTest.java b/src/test/java/io/github/moulberry/notenoughupdates/core/util/Vec3ComparableTest.java new file mode 100644 index 00000000..c0b451e3 --- /dev/null +++ b/src/test/java/io/github/moulberry/notenoughupdates/core/util/Vec3ComparableTest.java @@ -0,0 +1,193 @@ +package io.github.moulberry.notenoughupdates.core.util; + +import net.minecraft.util.BlockPos; +import net.minecraft.util.Vec3; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class Vec3ComparableTest { + @Test + void equals_false_when_null() { + // Arrange + Vec3Comparable vec3c = new Vec3Comparable(1.0, 2.0, 3.0); + + // Act + boolean areEqual = vec3c.equals(null); + + // Assert + assertFalse(areEqual); + } + + @Test + void equals_true_when_same_object() { + // Arrange + Vec3Comparable vec3c = new Vec3Comparable(1.0, 2.0, 3.0); + + // Act + boolean areEqual = vec3c.equals(vec3c); + + // Assert + assertTrue(areEqual); + } + + @Test + void equals_true_when_same_value() { + // Arrange + Vec3Comparable vec3c1 = new Vec3Comparable(1.0, 2.0, 3.0); + Vec3Comparable vec3c2 = new Vec3Comparable(1.0, 2.0, 3.0); + + // Act + boolean areEqual = vec3c1.equals(vec3c2); + + // Assert + assertTrue(areEqual); + } + + @Test + void equals_false_when_vec3_equals() { + // Arrange + Vec3Comparable vec3c1 = new Vec3Comparable(1.0, 2.0, 3.0); + Vec3 vec3c2 = new Vec3(1.0, 2.0, 3.0); + + // Act + boolean areEqual = vec3c1.equals(vec3c2); + + // Assert + assertFalse(areEqual); + } + + @Test + void equals_false_when_different_object_type() { + // Arrange + Vec3Comparable vec3c1 = new Vec3Comparable(1.0, 2.0, 3.0); + BlockPos blockPos = new BlockPos(1.0, 2.0, 3.0); + + // Act + boolean areEqual = vec3c1.equals(blockPos); + + // Assert + assertFalse(areEqual); + } + + @Test + void equals_false_when_different_value() { + // Arrange + Vec3Comparable vec3c1 = new Vec3Comparable(1.0, 2.0, 3.0); + Vec3Comparable vec3c2 = new Vec3Comparable(3.0, 2.0, 1.0); + + // Act + boolean areEqual = vec3c1.equals(vec3c2); + + // Assert + assertFalse(areEqual); + } + + @Test + void hashCode_same_when_same_value() { + // Arrange + Vec3Comparable vec3c1 = new Vec3Comparable(1.0, 2.0, 3.0); + Vec3Comparable vec3c2 = new Vec3Comparable(1.0, 2.0, 3.0); + + // Act + double vec3c1Hash = vec3c1.hashCode(); + double vec3c2Hash = vec3c2.hashCode(); + + // Assert + assertEquals(vec3c1Hash, vec3c2Hash); + } + + @Test + void hashCode_different_when_different_value() { + // Arrange + Vec3Comparable vec3c1 = new Vec3Comparable(1.0, 2.0, 3.0); + Vec3Comparable vec3c2 = new Vec3Comparable(3.0, 2.0, 1.0); + + // Act + double vec3c1Hash = vec3c1.hashCode(); + double vec3c2Hash = vec3c2.hashCode(); + + // Assert + assertNotEquals(vec3c1Hash, vec3c2Hash); + } + + @Test + void compareTo_zero_when_equal() { + // Arrange + Vec3Comparable vec3c1 = new Vec3Comparable(1.0, 2.0, 3.0); + Vec3Comparable vec3c2 = new Vec3Comparable(1.0, 2.0, 3.0); + + // Act + int result = vec3c1.compareTo(vec3c2); + + // Assert + assertEquals(0, result); + } + + @Test + void compareTo_negative_when_lower() { + // Arrange + Vec3Comparable vec3c1 = new Vec3Comparable(0.0, 2.0, 3.0); + Vec3Comparable vec3c2 = new Vec3Comparable(1.0, 2.0, 3.0); + + // Act + int result = vec3c1.compareTo(vec3c2); + + // Assert + assertTrue(result < 0); + } + + @Test + void compareTo_positive_when_x_y_or_z_is_higher() { + // Arrange + Vec3Comparable vec3c1x = new Vec3Comparable(2.0, 2.0, 3.0); + Vec3Comparable vec3c2x = new Vec3Comparable(1.0, 2.0, 3.0); + Vec3Comparable vec3c1y = new Vec3Comparable(1.0, 3.0, 3.0); + Vec3Comparable vec3c2y = new Vec3Comparable(1.0, 2.0, 3.0); + Vec3Comparable vec3c1z = new Vec3Comparable(1.0, 2.0, 4.0); + Vec3Comparable vec3c2z = new Vec3Comparable(1.0, 2.0, 3.0); + + // Act + int resultX = vec3c1x.compareTo(vec3c2x); + int resultY = vec3c1y.compareTo(vec3c2y); + int resultZ = vec3c1z.compareTo(vec3c2z); + + // Assert + assertTrue(resultX > 0); + assertTrue(resultY > 0); + assertTrue(resultZ > 0); + } + + @Test + void compareTo_throws_on_null() { + // Arrange + Vec3Comparable vec3c = new Vec3Comparable(1.0, 2.0, 3.0); + + // Act & Assert + Assertions.assertThrows(NullPointerException.class, () -> { + vec3c.compareTo(null); + }); + } + + @Test + void signumEquals_is_true_when_all_signums_match() { + Vec3Comparable first = new Vec3Comparable(-1.0, 1.0, 0); + Vec3 second = new Vec3(-1.0, 1.0, 0); + Assertions.assertTrue(first.signumEquals(second)); + } + + @Test + void signumEquals_is_false_when_any_signum_differs() { + Vec3Comparable first = new Vec3Comparable(-1.0, 1.0, 0); + Vec3 second = new Vec3(-1.0, 1.0, 1.0); + Vec3 third = new Vec3(-1.0, -1.0, 0); + Vec3 fourth = new Vec3(1.0, 1.0, 1.0); + Assertions.assertFalse(first.signumEquals(second)); + Assertions.assertFalse(first.signumEquals(third)); + Assertions.assertFalse(first.signumEquals(fourth)); + } +} diff --git a/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolverTest.java b/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolverTest.java new file mode 100644 index 00000000..58233410 --- /dev/null +++ b/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolverTest.java @@ -0,0 +1,204 @@ +package io.github.moulberry.notenoughupdates.miscfeatures; + +import io.github.moulberry.notenoughupdates.core.util.Vec3Comparable; +import io.github.moulberry.notenoughupdates.miscfeatures.CrystalMetalDetectorSolver.SolutionState; +import io.github.moulberry.notenoughupdates.util.NEUDebugLogger; +import net.minecraft.util.BlockPos; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Assertions; + +import java.util.ArrayList; + +class CrystalMetalDetectorSolverTest { + class Location { + double distance; + Vec3Comparable playerPosition; + SolutionState expectedState; + boolean centerKnown; + + public Location(double distance, + Vec3Comparable playerPosition, + SolutionState expectedState, + boolean centerKnown) { + this.distance = distance; + this.playerPosition = playerPosition; + this.expectedState = expectedState; + this.centerKnown = centerKnown; + } + } + + class Solution { + ArrayList locations = new ArrayList<>(); + BlockPos center = BlockPos.ORIGIN; + BlockPos expectedSolution = BlockPos.ORIGIN; + } + + @BeforeEach + void setUp() { + CrystalMetalDetectorSolver.initWorld(); + CrystalMetalDetectorSolver.treasureAllowedPredicate = blockPos -> true; + NEUDebugLogger.logMethod = CrystalMetalDetectorSolverTest::neuDebugLog; + NEUDebugLogger.allFlagsEnabled = true; + } + + private void findPossibleSolutionsTwice(Location loc, boolean centerNewlyDiscovered) { + // Each location has to be received twice to be valid + CrystalMetalDetectorSolver.findPossibleSolutions(loc.distance, loc.playerPosition, centerNewlyDiscovered); + CrystalMetalDetectorSolver.findPossibleSolutions(loc.distance, loc.playerPosition, false); + } + + private void checkSolution(Solution solution) { + boolean centerSet = false; + int index = 0; + for (Location loc : solution.locations) { + if (loc.centerKnown && !centerSet && !solution.center.equals(BlockPos.ORIGIN)) { + CrystalMetalDetectorSolver.setMinesCenter(solution.center); + centerSet = true; + findPossibleSolutionsTwice(loc, true); + } else { + findPossibleSolutionsTwice(loc, false); + } + Assertions.assertEquals(loc.expectedState, + CrystalMetalDetectorSolver.currentState, + "Location index " + index); + index++; + } + + Assertions.assertEquals(solution.expectedSolution, CrystalMetalDetectorSolver.getSolution()); + } + + @Test + void findPossibleSolutions_single_location_sample_is_ignored() { + Location location = new Location(37.3, + new Vec3Comparable(779.1057116115207, 70.5, 502.2997937667801), + SolutionState.MULTIPLE, + false); + + CrystalMetalDetectorSolver.findPossibleSolutions(location.distance, location.playerPosition, false); + Assertions.assertEquals(SolutionState.NOT_STARTED, CrystalMetalDetectorSolver.previousState, + "Previous state"); + Assertions.assertEquals(SolutionState.NOT_STARTED, CrystalMetalDetectorSolver.currentState, + "Current state"); + } + + @Test + void findPossibleSolutions_currentState_becomes_previousState() { + Location location = new Location(37.3, + new Vec3Comparable(779.1057116115207, 70.5, 502.2997937667801), + SolutionState.MULTIPLE, + false); + + findPossibleSolutionsTwice(location, false); + Assertions.assertEquals(SolutionState.NOT_STARTED, CrystalMetalDetectorSolver.previousState, + "Previous state"); + Assertions.assertEquals(location.expectedState, CrystalMetalDetectorSolver.currentState, + "Current state"); + } + + @Test + void findPossibleSolutions_state_is_invalid_when_solution_and_distance_mismatch() { + Solution solution = new Solution(); + solution.center = new BlockPos(736, 88, 547); + solution.expectedSolution = new BlockPos(722, 67, 590); + solution.locations.add(new Location(67.5, + new Vec3Comparable(757.8235166144441, 68.0, 532.8037800566217), + SolutionState.FOUND_KNOWN, + true)); + // slightly different player position with invalid distance + solution.locations.add(new Location(4.0, + new Vec3Comparable(757.8235166144441, 69.0, 532.8037800566217), + SolutionState.INVALID, + true)); + checkSolution(solution); + } + + @Test + void findPossibleSolutions_state_is_failed_when_second_location_eliminates_all_blocks() { + Solution solution = new Solution(); + solution.center = new BlockPos(736, 88, 547); + solution.locations.add(new Location(29.4, + new Vec3Comparable(721.5979761606153, 68.0, 590.9056839507032), + SolutionState.MULTIPLE_KNOWN, + true)); + solution.locations.add(new Location(4.0, // actual distance should be 38.2 + new Vec3Comparable(711.858759313838, 67.0, 590.3583935310772), + SolutionState.FAILED, + true)); + checkSolution(solution); + } + + @Test + void findPossibleSolutions_state_is_found_known_when_center_found_after_location() { + Solution solution = new Solution(); + solution.center = new BlockPos(736, 88, 547); + solution.locations.add(new Location(67.5, + new Vec3Comparable(757.8235166144441, 68.0, 532.8037800566217), + SolutionState.MULTIPLE, + false)); + checkSolution(solution); + + solution.locations.get(0).centerKnown = true; + solution.locations.get(0).expectedState = SolutionState.FOUND_KNOWN; + solution.expectedSolution = new BlockPos(722, 67, 590); + checkSolution(solution); + } + + @Test + void findPossibleSolutions_state_is_found_when_single_known_location() { + Solution solution = new Solution(); + solution.center = new BlockPos(736, 88, 547); + solution.expectedSolution = new BlockPos(722, 67, 590); + solution.locations.add(new Location(67.5, + new Vec3Comparable(757.8235166144441, 68.0, 532.8037800566217), + SolutionState.FOUND_KNOWN, + true)); + checkSolution(solution); + } + + @Test + void findPossibleSolutions_states_are_correct_using_multiple_locations_with_unknown_center() { + Solution solution = new Solution(); + solution.locations.add(new Location(37.3, + new Vec3Comparable(779.1057116115207, 70.5, 502.2997937667801), + SolutionState.MULTIPLE, + false)); + solution.locations.add(new Location(34.8, + new Vec3Comparable(782.6999999880791, 71.0, 508.69999998807907), + SolutionState.FOUND, + false)); + solution.expectedSolution = new BlockPos(758, 67, 533); + + checkSolution(solution); + } + + @Test + void findPossibleSolutions_states_are_correct_when_multiple_known_locations_found() { + Solution solution = new Solution(); + + // First, validate that the solution doesn't work without the center + solution.locations.add(new Location(29.4, + new Vec3Comparable(721.5979761606153, 68.0, 590.9056839507032), + SolutionState.MULTIPLE, + false)); + solution.locations.add(new Location(38.2, + new Vec3Comparable(711.858759313838, 67.0, 590.3583935310772), + SolutionState.MULTIPLE, + false)); + checkSolution(solution); + + // Now validate that the solution works with the center + CrystalMetalDetectorSolver.resetSolution(false); + solution.locations.get(0).expectedState = SolutionState.MULTIPLE_KNOWN; + solution.locations.get(0).centerKnown = true; + solution.locations.get(1).expectedState = SolutionState.FOUND_KNOWN; + solution.locations.get(1).centerKnown = true; + solution.expectedSolution = new BlockPos(748, 66, 578); + solution.center = new BlockPos(736, 88, 547); + checkSolution(solution); + } + + private static void neuDebugLog(String message) { + System.out.println(message); + } +} diff --git a/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolverTest.java b/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolverTest.java new file mode 100644 index 00000000..ed39a505 --- /dev/null +++ b/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolverTest.java @@ -0,0 +1,1206 @@ +package io.github.moulberry.notenoughupdates.miscfeatures; + +import io.github.moulberry.notenoughupdates.core.util.Vec3Comparable; +import io.github.moulberry.notenoughupdates.miscfeatures.CrystalWishingCompassSolver.CompassTarget; +import io.github.moulberry.notenoughupdates.miscfeatures.CrystalWishingCompassSolver.HandleCompassResult; +import io.github.moulberry.notenoughupdates.miscfeatures.CrystalWishingCompassSolver.SolverState; +import io.github.moulberry.notenoughupdates.util.NEUDebugLogger; +import net.minecraft.util.BlockPos; +import net.minecraft.util.Vec3; +import net.minecraft.util.Vec3i; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.EnumSet; + +import static io.github.moulberry.notenoughupdates.miscfeatures.CrystalWishingCompassSolver.*; + +class CrystalWishingCompassSolverTest { + private static final CrystalWishingCompassSolver solver = getInstance(); + long systemTimeMillis; + private final long DELAY_AFTER_FIRST_COMPASS_LAST_PARTICLE = 500L; + + private final CompassUse minesOfDivanCompassUse1 = new CompassUse( + 1647528732979L, + new BlockPos(754, 137, 239), + new ArrayList<>(Arrays.asList( + new ParticleSpawn(new Vec3Comparable(754.358459, 138.536407, 239.200928), 137), + new ParticleSpawn(new Vec3Comparable(754.315735, 138.444351, 239.690521), 45), + new ParticleSpawn(new Vec3Comparable(754.272278, 138.352051, 240.180008), 51), + new ParticleSpawn(new Vec3Comparable(754.228760, 138.259750, 240.669479), 49), + new ParticleSpawn(new Vec3Comparable(754.185303, 138.167435, 241.158966), 57), + new ParticleSpawn(new Vec3Comparable(754.141846, 138.075134, 241.648438), 50), + new ParticleSpawn(new Vec3Comparable(754.098328, 137.982819, 242.137909), 51), + new ParticleSpawn(new Vec3Comparable(754.054871, 137.890518, 242.627396), 57), + new ParticleSpawn(new Vec3Comparable(754.011353, 137.798203, 243.116867), 44), + new ParticleSpawn(new Vec3Comparable(753.967896, 137.705887, 243.606354), 59), + new ParticleSpawn(new Vec3Comparable(753.924438, 137.613586, 244.095825), 35), + new ParticleSpawn(new Vec3Comparable(753.880920, 137.521271, 244.585297), 48), + new ParticleSpawn(new Vec3Comparable(753.837463, 137.428970, 245.074783), 70), + new ParticleSpawn(new Vec3Comparable(753.793945, 137.336655, 245.564255), 33), + new ParticleSpawn(new Vec3Comparable(753.750488, 137.244354, 246.053741), 55), + new ParticleSpawn(new Vec3Comparable(753.707031, 137.152039, 246.543213), 42), + new ParticleSpawn(new Vec3Comparable(753.663513, 137.059738, 247.032700), 56), + new ParticleSpawn(new Vec3Comparable(753.620056, 136.967422, 247.522171), 48), + new ParticleSpawn(new Vec3Comparable(753.576538, 136.875122, 248.011642), 56), + new ParticleSpawn(new Vec3Comparable(754.333618, 138.527710, 239.197800), 55) + )), + HandleCompassResult.SUCCESS, + SolverState.NEED_SECOND_COMPASS); + + private final CompassUse minesOfDivanCompassUse2 = new CompassUse( + DELAY_AFTER_FIRST_COMPASS_LAST_PARTICLE, + new BlockPos(760, 134, 266), + new ArrayList<>(Arrays.asList( + new ParticleSpawn(new Vec3Comparable(759.686951, 135.524994, 266.190704), 129), + new ParticleSpawn(new Vec3Comparable(759.625183, 135.427887, 266.677277), 69), + new ParticleSpawn(new Vec3Comparable(759.561707, 135.330704, 267.163635), 31), + new ParticleSpawn(new Vec3Comparable(759.498230, 135.233536, 267.649963), 115), + new ParticleSpawn(new Vec3Comparable(759.434753, 135.136368, 268.136322), 0), + new ParticleSpawn(new Vec3Comparable(759.371277, 135.039200, 268.622650), 46), + new ParticleSpawn(new Vec3Comparable(759.307800, 134.942017, 269.109009), 49), + new ParticleSpawn(new Vec3Comparable(759.244324, 134.844849, 269.595337), 59), + new ParticleSpawn(new Vec3Comparable(759.180847, 134.747681, 270.081696), 45), + new ParticleSpawn(new Vec3Comparable(759.117371, 134.650513, 270.568024), 39), + new ParticleSpawn(new Vec3Comparable(759.053894, 134.553329, 271.054352), 67), + new ParticleSpawn(new Vec3Comparable(758.990356, 134.456161, 271.540710), 49), + new ParticleSpawn(new Vec3Comparable(758.926880, 134.358994, 272.027039), 32), + new ParticleSpawn(new Vec3Comparable(758.863403, 134.261826, 272.513397), 61), + new ParticleSpawn(new Vec3Comparable(758.799927, 134.164642, 272.999725), 44), + new ParticleSpawn(new Vec3Comparable(758.736450, 134.067474, 273.486084), 48), + new ParticleSpawn(new Vec3Comparable(758.672974, 133.970306, 273.972412), 57), + new ParticleSpawn(new Vec3Comparable(758.609497, 133.873138, 274.458740), 55), + new ParticleSpawn(new Vec3Comparable(758.546021, 133.775955, 274.945099), 59), + new ParticleSpawn(new Vec3Comparable(758.482544, 133.678787, 275.431427), 38), + new ParticleSpawn(new Vec3Comparable(759.636658, 135.522827, 266.186371), 0) + )), + HandleCompassResult.SUCCESS, + SolverState.SOLVED); + + Vec3i minesOfDivanSolution = new Vec3i(735, 98, 451); + + private final CompassUse goblinHoldoutCompassUse1 = new CompassUse( + 1647776326763L, + new BlockPos(454, 87, 776), + new ArrayList<>(Arrays.asList( + new ParticleSpawn(new Vec3Comparable(454.171722, 88.616852, 775.807190), 188), + new ParticleSpawn(new Vec3Comparable(454.010315, 88.613464, 775.333984), 44), + new ParticleSpawn(new Vec3Comparable(453.849243, 88.610069, 774.860657), 61), + new ParticleSpawn(new Vec3Comparable(453.688141, 88.606674, 774.387329), 51), + new ParticleSpawn(new Vec3Comparable(453.527069, 88.603271, 773.914001), 40), + new ParticleSpawn(new Vec3Comparable(453.365997, 88.599876, 773.440674), 57), + new ParticleSpawn(new Vec3Comparable(453.204926, 88.596481, 772.967346), 45), + new ParticleSpawn(new Vec3Comparable(453.043854, 88.593086, 772.494019), 49), + new ParticleSpawn(new Vec3Comparable(452.882782, 88.589691, 772.020691), 46), + new ParticleSpawn(new Vec3Comparable(452.721710, 88.586288, 771.547302), 65), + new ParticleSpawn(new Vec3Comparable(452.560638, 88.582893, 771.073975), 43), + new ParticleSpawn(new Vec3Comparable(452.399567, 88.579498, 770.600647), 50), + new ParticleSpawn(new Vec3Comparable(452.238495, 88.576103, 770.127319), 48), + new ParticleSpawn(new Vec3Comparable(452.077423, 88.572701, 769.653992), 47), + new ParticleSpawn(new Vec3Comparable(451.916351, 88.569305, 769.180664), 60), + new ParticleSpawn(new Vec3Comparable(451.755280, 88.565910, 768.707336), 40), + new ParticleSpawn(new Vec3Comparable(451.594208, 88.562515, 768.234009), 69), + new ParticleSpawn(new Vec3Comparable(451.433136, 88.559120, 767.760681), 40), + new ParticleSpawn(new Vec3Comparable(451.272064, 88.555717, 767.287354), 42), + new ParticleSpawn(new Vec3Comparable(454.183441, 88.616600, 775.803040), 54) + )), + HandleCompassResult.SUCCESS, + SolverState.NEED_SECOND_COMPASS); + + private final CompassUse goblinHoldoutCompassUse2 = new CompassUse( + DELAY_AFTER_FIRST_COMPASS_LAST_PARTICLE, + new BlockPos(439, 85, 777), + new ArrayList<>(Arrays.asList( + new ParticleSpawn(new Vec3Comparable(439.068848, 86.624870, 776.043701), 136), + new ParticleSpawn(new Vec3Comparable(438.936066, 86.625786, 775.561646), 46), + new ParticleSpawn(new Vec3Comparable(438.804352, 86.626595, 775.079346), 65), + new ParticleSpawn(new Vec3Comparable(438.672699, 86.627396, 774.596985), 40), + new ParticleSpawn(new Vec3Comparable(438.541016, 86.628197, 774.114624), 51), + new ParticleSpawn(new Vec3Comparable(438.409332, 86.628998, 773.632263), 50), + new ParticleSpawn(new Vec3Comparable(438.277679, 86.629799, 773.149902), 50), + new ParticleSpawn(new Vec3Comparable(438.145996, 86.630608, 772.667603), 56), + new ParticleSpawn(new Vec3Comparable(438.014343, 86.631409, 772.185242), 40), + new ParticleSpawn(new Vec3Comparable(437.882660, 86.632210, 771.702881), 65), + new ParticleSpawn(new Vec3Comparable(437.751007, 86.633011, 771.220520), 45), + new ParticleSpawn(new Vec3Comparable(437.619324, 86.633812, 770.738159), 42), + new ParticleSpawn(new Vec3Comparable(437.487671, 86.634613, 770.255798), 60), + new ParticleSpawn(new Vec3Comparable(437.355988, 86.635414, 769.773499), 51), + new ParticleSpawn(new Vec3Comparable(437.224335, 86.636215, 769.291138), 44), + new ParticleSpawn(new Vec3Comparable(437.092651, 86.637024, 768.808777), 56), + new ParticleSpawn(new Vec3Comparable(436.960999, 86.637825, 768.326416), 56), + new ParticleSpawn(new Vec3Comparable(436.829315, 86.638626, 767.844055), 40), + new ParticleSpawn(new Vec3Comparable(436.697632, 86.639427, 767.361694), 50), + new ParticleSpawn(new Vec3Comparable(436.565979, 86.640228, 766.879395), 46), + new ParticleSpawn(new Vec3Comparable(439.108551, 86.620811, 776.031067), 0) + )), + HandleCompassResult.SUCCESS, + SolverState.SOLVED); + + Vec3i goblinHoldoutKingSolution = new Vec3i(377, 87, 550); + Vec3i goblinHoldoutQueenSolution = new Vec3i(322, 139, 769); + + private final CompassUse precursorCityCompassUse1 = new CompassUse( + 1647744920365L, + new BlockPos(570, 120, 565), + new ArrayList<>(Arrays.asList( + new ParticleSpawn(new Vec3Comparable(570.428955, 121.630745, 565.674500), 192), + new ParticleSpawn(new Vec3Comparable(570.572998, 121.642563, 566.153137), 52), + new ParticleSpawn(new Vec3Comparable(570.714233, 121.654442, 566.632629), 45), + new ParticleSpawn(new Vec3Comparable(570.855286, 121.666321, 567.112183), 51), + new ParticleSpawn(new Vec3Comparable(570.996338, 121.678200, 567.591736), 0), + new ParticleSpawn(new Vec3Comparable(571.137390, 121.690079, 568.071289), 111), + new ParticleSpawn(new Vec3Comparable(571.278442, 121.701958, 568.550781), 38), + new ParticleSpawn(new Vec3Comparable(571.419495, 121.713844, 569.030334), 51), + new ParticleSpawn(new Vec3Comparable(571.560547, 121.725723, 569.509888), 49), + new ParticleSpawn(new Vec3Comparable(571.701599, 121.737602, 569.989441), 0), + new ParticleSpawn(new Vec3Comparable(571.842651, 121.749481, 570.468994), 101), + new ParticleSpawn(new Vec3Comparable(571.983704, 121.761360, 570.948547), 53), + new ParticleSpawn(new Vec3Comparable(572.124756, 121.773239, 571.428101), 47), + new ParticleSpawn(new Vec3Comparable(572.265747, 121.785118, 571.907654), 49), + new ParticleSpawn(new Vec3Comparable(572.406799, 121.796997, 572.387207), 49), + new ParticleSpawn(new Vec3Comparable(572.547852, 121.808876, 572.866699), 51), + new ParticleSpawn(new Vec3Comparable(572.688904, 121.820755, 573.346252), 57), + new ParticleSpawn(new Vec3Comparable(572.829956, 121.832634, 573.825806), 42), + new ParticleSpawn(new Vec3Comparable(572.971008, 121.844513, 574.305359), 50), + new ParticleSpawn(new Vec3Comparable(573.112061, 121.856392, 574.784912), 52), + new ParticleSpawn(new Vec3Comparable(570.372192, 121.631874, 565.694946), 0) + )), + HandleCompassResult.SUCCESS, + SolverState.NEED_SECOND_COMPASS); + + private final CompassUse precursorCityCompassUse2 = new CompassUse( + DELAY_AFTER_FIRST_COMPASS_LAST_PARTICLE, + new BlockPos(591, 136, 579), + new ArrayList<>(Arrays.asList( + new ParticleSpawn(new Vec3Comparable(590.847961, 137.589584, 579.776672), 192), + new ParticleSpawn(new Vec3Comparable(590.918945, 137.528259, 580.267761), 50), + new ParticleSpawn(new Vec3Comparable(590.985229, 137.465118, 580.759338), 56), + new ParticleSpawn(new Vec3Comparable(591.051147, 137.401855, 581.250916), 47), + new ParticleSpawn(new Vec3Comparable(591.117126, 137.338593, 581.742493), 47), + new ParticleSpawn(new Vec3Comparable(591.183044, 137.275330, 582.234070), 49), + new ParticleSpawn(new Vec3Comparable(591.249023, 137.212067, 582.725647), 60), + new ParticleSpawn(new Vec3Comparable(591.314941, 137.148804, 583.217224), 55), + new ParticleSpawn(new Vec3Comparable(591.380920, 137.085541, 583.708801), 47), + new ParticleSpawn(new Vec3Comparable(591.446838, 137.022263, 584.200378), 50), + new ParticleSpawn(new Vec3Comparable(591.512817, 136.959000, 584.691956), 39), + new ParticleSpawn(new Vec3Comparable(591.578735, 136.895737, 585.183533), 53), + new ParticleSpawn(new Vec3Comparable(591.644714, 136.832474, 585.675110), 53), + new ParticleSpawn(new Vec3Comparable(591.710632, 136.769211, 586.166687), 45), + new ParticleSpawn(new Vec3Comparable(591.776611, 136.705948, 586.658264), 79), + new ParticleSpawn(new Vec3Comparable(591.842529, 136.642685, 587.149841), 20), + new ParticleSpawn(new Vec3Comparable(591.908508, 136.579407, 587.641418), 62), + new ParticleSpawn(new Vec3Comparable(591.974426, 136.516144, 588.132996), 48), + new ParticleSpawn(new Vec3Comparable(592.040344, 136.452881, 588.624573), 40), + new ParticleSpawn(new Vec3Comparable(592.106323, 136.389618, 589.116150), 51), + new ParticleSpawn(new Vec3Comparable(590.766357, 137.556885, 579.791565), 0) + )), + HandleCompassResult.SUCCESS, + SolverState.SOLVED); + + Vec3i precursorCitySolution = new Vec3i(604, 124, 681); + + private final CompassUse jungleCompassUse1 = new CompassUse( + 1647744980313L, + new BlockPos(454, 122, 459), + new ArrayList<>(Arrays.asList( + new ParticleSpawn(new Vec3Comparable(453.954895, 122.958122, 458.687866), 141), + new ParticleSpawn(new Vec3Comparable(453.515991, 122.760010, 458.553314), 59), + new ParticleSpawn(new Vec3Comparable(453.078156, 122.560112, 458.417877), 41), + new ParticleSpawn(new Vec3Comparable(452.640381, 122.360123, 458.282349), 50), + new ParticleSpawn(new Vec3Comparable(452.202606, 122.160133, 458.146851), 66), + new ParticleSpawn(new Vec3Comparable(451.764832, 121.960136, 458.011353), 35), + new ParticleSpawn(new Vec3Comparable(451.327057, 121.760147, 457.875854), 49), + new ParticleSpawn(new Vec3Comparable(450.889313, 121.560150, 457.740356), 50), + new ParticleSpawn(new Vec3Comparable(450.451538, 121.360161, 457.604858), 49), + new ParticleSpawn(new Vec3Comparable(450.013763, 121.160172, 457.469330), 51), + new ParticleSpawn(new Vec3Comparable(449.575989, 120.960175, 457.333832), 59), + new ParticleSpawn(new Vec3Comparable(449.138214, 120.760185, 457.198334), 41), + new ParticleSpawn(new Vec3Comparable(448.700439, 120.560196, 457.062836), 55), + new ParticleSpawn(new Vec3Comparable(448.262695, 120.360199, 456.927338), 50), + new ParticleSpawn(new Vec3Comparable(447.824921, 120.160210, 456.791840), 49), + new ParticleSpawn(new Vec3Comparable(447.387146, 119.960213, 456.656311), 53), + new ParticleSpawn(new Vec3Comparable(446.949371, 119.760223, 456.520813), 43), + new ParticleSpawn(new Vec3Comparable(446.511597, 119.560234, 456.385315), 51), + new ParticleSpawn(new Vec3Comparable(446.073853, 119.360237, 456.249817), 49), + new ParticleSpawn(new Vec3Comparable(445.636078, 119.160248, 456.114319), 56), + new ParticleSpawn(new Vec3Comparable(453.975647, 122.920158, 458.668488), 0) + )), + HandleCompassResult.SUCCESS, + SolverState.NEED_SECOND_COMPASS); + + private final CompassUse jungleCompassUse2 = new CompassUse( + DELAY_AFTER_FIRST_COMPASS_LAST_PARTICLE, + new BlockPos(438, 126, 468), + new ArrayList<>(Arrays.asList( + new ParticleSpawn(new Vec3Comparable(437.701721, 127.395279, 467.455048), 139), + new ParticleSpawn(new Vec3Comparable(437.297852, 127.161415, 467.275604), 35), + new ParticleSpawn(new Vec3Comparable(436.895813, 126.927208, 467.092529), 68), + new ParticleSpawn(new Vec3Comparable(436.493896, 126.692986, 466.909241), 41), + new ParticleSpawn(new Vec3Comparable(436.091980, 126.458763, 466.725952), 54), + new ParticleSpawn(new Vec3Comparable(435.690033, 126.224533, 466.542664), 39), + new ParticleSpawn(new Vec3Comparable(435.288116, 125.990311, 466.359375), 52), + new ParticleSpawn(new Vec3Comparable(434.886200, 125.756088, 466.176086), 66), + new ParticleSpawn(new Vec3Comparable(434.484283, 125.521866, 465.992767), 40), + new ParticleSpawn(new Vec3Comparable(434.082367, 125.287636, 465.809479), 41), + new ParticleSpawn(new Vec3Comparable(433.680420, 125.053413, 465.626190), 50), + new ParticleSpawn(new Vec3Comparable(433.278503, 124.819191, 465.442902), 59), + new ParticleSpawn(new Vec3Comparable(432.876587, 124.584969, 465.259613), 54), + new ParticleSpawn(new Vec3Comparable(432.474670, 124.350746, 465.076294), 38), + new ParticleSpawn(new Vec3Comparable(432.072723, 124.116516, 464.893005), 63), + new ParticleSpawn(new Vec3Comparable(431.670807, 123.882294, 464.709717), 36), + new ParticleSpawn(new Vec3Comparable(431.268890, 123.648071, 464.526428), 64), + new ParticleSpawn(new Vec3Comparable(430.866974, 123.413849, 464.343140), 48), + new ParticleSpawn(new Vec3Comparable(430.465057, 123.179619, 464.159821), 53), + new ParticleSpawn(new Vec3Comparable(430.063110, 122.945396, 463.976532), 46), + new ParticleSpawn(new Vec3Comparable(437.732666, 127.385803, 467.381592), 1) + )), + HandleCompassResult.SUCCESS, + SolverState.SOLVED); + + Vec3i jungleSolution = new Vec3i(343, 72, 424); + Vec3i jungleSolutionTempleDoor = new Vec3i( + jungleSolution.getX() - 57, + jungleSolution.getY() + 36, + jungleSolution.getZ() -21); + + private final CompassUse magmaCompassUse1 = new CompassUse( + 1647745029814L, + new BlockPos(462, 58, 550), + new ArrayList<>(Arrays.asList( + new ParticleSpawn(new Vec3Comparable(462.226898, 59.614380, 550.032654), 160), + new ParticleSpawn(new Vec3Comparable(462.693848, 59.609089, 549.853943), 47), + new ParticleSpawn(new Vec3Comparable(463.160706, 59.603809, 549.674988), 48), + new ParticleSpawn(new Vec3Comparable(463.627533, 59.598526, 549.496033), 136), + new ParticleSpawn(new Vec3Comparable(464.094391, 59.593246, 549.317017), 0), + new ParticleSpawn(new Vec3Comparable(464.561218, 59.587963, 549.138062), 0), + new ParticleSpawn(new Vec3Comparable(465.028076, 59.582684, 548.959106), 53), + new ParticleSpawn(new Vec3Comparable(465.494904, 59.577400, 548.780090), 48), + new ParticleSpawn(new Vec3Comparable(465.961761, 59.572117, 548.601135), 55), + new ParticleSpawn(new Vec3Comparable(466.428589, 59.566837, 548.422180), 47), + new ParticleSpawn(new Vec3Comparable(466.895416, 59.561554, 548.243164), 46), + new ParticleSpawn(new Vec3Comparable(467.362274, 59.556274, 548.064209), 53), + new ParticleSpawn(new Vec3Comparable(467.829102, 59.550991, 547.885254), 50), + new ParticleSpawn(new Vec3Comparable(468.295959, 59.545712, 547.706238), 54), + new ParticleSpawn(new Vec3Comparable(468.762787, 59.540428, 547.527283), 52), + new ParticleSpawn(new Vec3Comparable(469.229645, 59.535145, 547.348328), 105), + new ParticleSpawn(new Vec3Comparable(469.696472, 59.529865, 547.169312), 1), + new ParticleSpawn(new Vec3Comparable(470.163300, 59.524582, 546.990356), 51), + new ParticleSpawn(new Vec3Comparable(470.630157, 59.519302, 546.811401), 40), + new ParticleSpawn(new Vec3Comparable(471.096985, 59.514019, 546.632385), 49), + new ParticleSpawn(new Vec3Comparable(462.221954, 59.614719, 550.019165), 0) + )), + HandleCompassResult.SUCCESS, + SolverState.NEED_SECOND_COMPASS); + + private final CompassUse magmaCompassUse2 = new CompassUse( + DELAY_AFTER_FIRST_COMPASS_LAST_PARTICLE, + new BlockPos(449, 53, 556), + new ArrayList<>(Arrays.asList( + new ParticleSpawn(new Vec3Comparable(449.120911, 54.624340, 556.108948), 204), + new ParticleSpawn(new Vec3Comparable(449.587433, 54.627399, 555.929138), 102), + new ParticleSpawn(new Vec3Comparable(450.053741, 54.630432, 555.748657), 0), + new ParticleSpawn(new Vec3Comparable(450.520020, 54.633465, 555.568237), 62), + new ParticleSpawn(new Vec3Comparable(450.986298, 54.636497, 555.387756), 38), + new ParticleSpawn(new Vec3Comparable(451.452606, 54.639530, 555.207275), 48), + new ParticleSpawn(new Vec3Comparable(451.918884, 54.642563, 555.026794), 63), + new ParticleSpawn(new Vec3Comparable(452.385162, 54.645596, 554.846375), 52), + new ParticleSpawn(new Vec3Comparable(452.851471, 54.648628, 554.665894), 35), + new ParticleSpawn(new Vec3Comparable(453.317749, 54.651661, 554.485413), 53), + new ParticleSpawn(new Vec3Comparable(453.784027, 54.654694, 554.304993), 54), + new ParticleSpawn(new Vec3Comparable(454.250305, 54.657726, 554.124512), 50), + new ParticleSpawn(new Vec3Comparable(454.716614, 54.660759, 553.944031), 55), + new ParticleSpawn(new Vec3Comparable(455.182892, 54.663792, 553.763550), 49), + new ParticleSpawn(new Vec3Comparable(455.649170, 54.666824, 553.583130), 41), + new ParticleSpawn(new Vec3Comparable(456.115479, 54.669857, 553.402649), 48), + new ParticleSpawn(new Vec3Comparable(456.581757, 54.672890, 553.222168), 54), + new ParticleSpawn(new Vec3Comparable(457.048035, 54.675922, 553.041687), 45), + new ParticleSpawn(new Vec3Comparable(457.514313, 54.678959, 552.861267), 55), + new ParticleSpawn(new Vec3Comparable(449.110443, 54.623035, 556.079163), 49) + )), + HandleCompassResult.SUCCESS, + SolverState.SOLVED); + + Vec3i magmaSolution = new Vec3i(737, 56, 444); + + Vec3Comparable kingMinesOrNucleusCoordsInRemnants = new Vec3Comparable(604, 100, 681); + Vec3Comparable odawaSolution = new Vec3Comparable(349, 110, 390); + + private final CompassUse nucleusCompass = new CompassUse( + 1647745029814L, + new BlockPos(512, 106, 512), + null, + HandleCompassResult.PLAYER_IN_NUCLEUS, + SolverState.NOT_STARTED); + + private void resetSolverState() { + solver.initWorld(); + systemTimeMillis = 0; + solver.currentTimeMillis = () -> (systemTimeMillis); + // These must be overridden for all test cases or an exception will be thrown when + // data that is only present when running in the context of Minecraft is accessed. + solver.keyInInventory = () -> false; + solver.kingsScentPresent = () -> false; + solver.foundCrystals = () -> EnumSet.noneOf(Crystal.class); + } + + @BeforeEach + void setUp() { + NEUDebugLogger.logMethod = CrystalWishingCompassSolverTest::neuDebugLog; + NEUDebugLogger.allFlagsEnabled = true; + resetSolverState(); + } + + private void checkSolution(Solution solution) { + int index = 0; + for (CompassUse compassUse : solution.compassUses) { + systemTimeMillis += compassUse.timeIncrementMillis; + HandleCompassResult handleCompassResult = solver.handleCompassUse(compassUse.playerPos); + Assertions.assertEquals(compassUse.expectedHandleCompassUseResult, + handleCompassResult, + "CompassUse index " + index); + + for (ParticleSpawn particle : compassUse.particles) { + systemTimeMillis += particle.timeIncrementMillis; + solver.solveUsingParticle( + particle.spawnLocation.xCoord, + particle.spawnLocation.yCoord, + particle.spawnLocation.zCoord, + systemTimeMillis); + } + + Assertions.assertEquals(compassUse.expectedSolverState, + solver.getSolverState(), + "CompassUse index " + index); + if (compassUse.expectedSolverState == SolverState.SOLVED) { + Assertions.assertEquals(solution.expectedSolutionCoords, + solver.getSolutionCoords()); + } + + index++; + } + } + + @Test + void first_compass_without_particles_sets_solver_state_to_processing_first_use() { + // Arrange + CompassUse compassUse = new CompassUse(minesOfDivanCompassUse1); + compassUse.particles.clear(); + compassUse.expectedSolverState = SolverState.PROCESSING_FIRST_USE; + + Solution solution = new Solution( + new ArrayList<>(Collections.singletonList(compassUse)), + Vec3i.NULL_VECTOR); + + // Act & Assert + checkSolution(solution); + } + + @Test + void new_compass_resets_processing_first_use_state_after_timeout() { + // Arrange + CompassUse processingFirstUseCompassUse = new CompassUse(minesOfDivanCompassUse1); + processingFirstUseCompassUse.particles.clear(); + processingFirstUseCompassUse.expectedSolverState = SolverState.PROCESSING_FIRST_USE; + Solution processingFirstUseSolution = new Solution( + new ArrayList<>(Collections.singletonList(processingFirstUseCompassUse)), + Vec3i.NULL_VECTOR); + checkSolution(processingFirstUseSolution); + Assertions.assertEquals(SolverState.PROCESSING_FIRST_USE, solver.getSolverState()); + + CompassUse resetStateCompassUse = new CompassUse(jungleCompassUse1); + resetStateCompassUse.timeIncrementMillis = ALL_PARTICLES_MAX_MILLIS + 1; + resetStateCompassUse.expectedHandleCompassUseResult = HandleCompassResult.NO_PARTICLES_FOR_PREVIOUS_COMPASS; + resetStateCompassUse.expectedSolverState = SolverState.FAILED_TIMEOUT_NO_REPEATING; + Solution goodSolution = new Solution( + new ArrayList<>(Collections.singletonList(resetStateCompassUse)), + Vec3i.NULL_VECTOR); + + // Act & Assert + checkSolution(goodSolution); + } + + @Test + void first_compass_with_repeating_particles_sets_state_to_need_second_compass() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Collections.singletonList(minesOfDivanCompassUse1)), + Vec3i.NULL_VECTOR); + + // Act & Assert + checkSolution(solution); + } + + @Test + void first_compass_in_nucleus_sets_state_to_player_in_nucleus() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Collections.singletonList(nucleusCompass)), + Vec3i.NULL_VECTOR); + + // Act & Assert + checkSolution(solution); + } + + @Test + void use_while_handling_previous_returns_still_processing_first_use() { + // Arrange + CompassUse compassUse1 = new CompassUse( + 1647528732979L, + new BlockPos(754, 137, 239), + new ArrayList<>(Collections.singletonList( + new ParticleSpawn(new Vec3Comparable(754.358459, 138.536407, 239.200928), 137) + )), + HandleCompassResult.SUCCESS, + SolverState.PROCESSING_FIRST_USE); + + // STILL_PROCESSING_FIRST_USE is expected instead of LOCATION_TOO_CLOSE since the solver + // isn't ready for the second compass use, which includes the location check + CompassUse compassUse2 = new CompassUse(compassUse1); + compassUse2.expectedHandleCompassUseResult = HandleCompassResult.STILL_PROCESSING_PRIOR_USE; + compassUse2.timeIncrementMillis = 500; + + Solution solution = new Solution( + new ArrayList<>(Arrays.asList(compassUse1, compassUse2)), + Vec3i.NULL_VECTOR); + + // Act & Assert + checkSolution(solution); + } + + @Test + void missing_repeating_particles_sets_state_to_failed_timeout_no_repeating() { + CompassUse compassUse = new CompassUse(minesOfDivanCompassUse1); + compassUse.particles.remove(compassUse.particles.size()-1); + compassUse.particles.get(compassUse.particles.size()-1).timeIncrementMillis += ALL_PARTICLES_MAX_MILLIS; + compassUse.expectedSolverState = SolverState.FAILED_TIMEOUT_NO_REPEATING; + + Solution solution = new Solution( + new ArrayList<>(Collections.singletonList(compassUse)), + Vec3i.NULL_VECTOR); + + // Act & Assert + checkSolution(solution); + } + + @Test + void compasses_too_close_returns_location_too_close_and_solver_state_is_still_need_second_compass() { + // Arrange + CompassUse secondCompassUse = new CompassUse( + DELAY_AFTER_FIRST_COMPASS_LAST_PARTICLE, + minesOfDivanCompassUse1.playerPos.add(2, 2, 2), + null, + HandleCompassResult.LOCATION_TOO_CLOSE, + SolverState.NEED_SECOND_COMPASS + ); + + Solution solution = new Solution( + new ArrayList<>(Arrays.asList(minesOfDivanCompassUse1, secondCompassUse)), + Vec3i.NULL_VECTOR); + + // Act & Assert + checkSolution(solution); + } + + @Test + void second_compass_sets_solver_state_to_processing_second_use() { + // Arrange + CompassUse secondCompassUse = new CompassUse(minesOfDivanCompassUse2); + secondCompassUse.expectedSolverState = SolverState.PROCESSING_SECOND_USE; + secondCompassUse.particles.clear(); + + // Arrange + Solution solution = new Solution( + new ArrayList<>(Arrays.asList(minesOfDivanCompassUse1, minesOfDivanCompassUse2)), + minesOfDivanSolution + ); + + // Act & Assert + checkSolution(solution); + } + + @Test + void second_compass_with_repeating_particles_sets_state_to_solved() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Arrays.asList(minesOfDivanCompassUse1, minesOfDivanCompassUse2)), + minesOfDivanSolution + ); + + // Act & Assert + checkSolution(solution); + } + + @Test + void particles_from_first_compass_are_ignored_by_second_compass() { + // Arrange + CompassUse compassUse2 = new CompassUse(minesOfDivanCompassUse2); + compassUse2.particles.add(0, minesOfDivanCompassUse1.particles.get(0)); + Solution solution = new Solution( + new ArrayList<>(Arrays.asList(minesOfDivanCompassUse1, compassUse2)), + minesOfDivanSolution + ); + + // Act & Assert + checkSolution(solution); + } + + private void execInvalidParticlesInvalidSolution() { + // Arrange + CompassUse compassUse2 = new CompassUse(minesOfDivanCompassUse2); + + // reverse the direction of the particles, moving the repeat particle + // to "new" end + compassUse2.particles.remove(compassUse2.particles.size()-1); + Collections.reverse(compassUse2.particles); + // add a new repeat particle + compassUse2.particles.add(new ParticleSpawn(compassUse2.particles.get(0))); + + // Adjust the player position + compassUse2.playerPos = new BlockPos(compassUse2.particles.get(0).spawnLocation); + compassUse2.expectedSolverState = SolverState.FAILED_INVALID_SOLUTION; + Solution solution = new Solution( + new ArrayList<>(Arrays.asList(minesOfDivanCompassUse1, compassUse2)), + Vec3i.NULL_VECTOR); + + // Act & Assert + checkSolution(solution); + } + + @Test + void second_compass_with_inverted_particles_sets_state_to_invalid_solution() { + // Arrange, Act, and Assert + execInvalidParticlesInvalidSolution(); + } + + @Test + void solution_outside_hollows_sets_state_to_invalid_solution() { + // Arrange + CompassUse compassUse1 = new CompassUse(minesOfDivanCompassUse1); + CompassUse compassUse2 = new CompassUse(minesOfDivanCompassUse2); + Vec3 offset = new Vec3(0.0, 200.0, 0.0); + + compassUse1.playerPos = compassUse1.playerPos.add(offset.xCoord, offset.yCoord, offset.zCoord); + for (ParticleSpawn particle : compassUse1.particles) { + particle.spawnLocation = particle.spawnLocation.add(offset); + } + + compassUse2.playerPos = compassUse2.playerPos.add(offset.xCoord, offset.yCoord, offset.zCoord); + for (ParticleSpawn particle : compassUse2.particles) { + particle.spawnLocation = particle.spawnLocation.add(offset); + } + compassUse2.expectedSolverState = SolverState.FAILED_INVALID_SOLUTION; + + Solution solution = new Solution( + new ArrayList<>(Arrays.asList(compassUse1, compassUse2)), + Vec3i.NULL_VECTOR); + + // Act & Assert + checkSolution(solution); + } + + @Test + void second_solution_can_be_solved_after_state_is_solved() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Arrays.asList(minesOfDivanCompassUse1, minesOfDivanCompassUse2)), + minesOfDivanSolution + ); + checkSolution(solution); + + Solution solution2 = new Solution( + new ArrayList<>(Arrays.asList(precursorCityCompassUse1, precursorCityCompassUse2)), + precursorCitySolution + ); + + // Act & Assert + checkSolution(solution2); + } + + @Test + void second_solution_can_be_solved_after_state_is_failed() { + // Arrange + execInvalidParticlesInvalidSolution(); + Assertions.assertEquals(solver.getSolverState(), SolverState.FAILED_INVALID_SOLUTION); + + Solution solution2 = new Solution( + new ArrayList<>(Arrays.asList(precursorCityCompassUse1, precursorCityCompassUse2)), + precursorCitySolution + ); + + // Act & Assert + checkSolution(solution2); + } + + @Test + void distant_particles_are_ignored() { + // Arrange + CompassUse compassUse = new CompassUse(minesOfDivanCompassUse1); + compassUse.particles.get(2).spawnLocation.addVector(100.0, 100.0, 100.0); + Solution solution = new Solution( + new ArrayList<>(Collections.singletonList(minesOfDivanCompassUse1)), + Vec3i.NULL_VECTOR); + + // Act & Assert + checkSolution(solution); + } + + @Test + void possible_targets_includes_queen_and_excludes_king_when_kings_scent_is_present() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Collections.singletonList(goblinHoldoutCompassUse1)), + Vec3i.NULL_VECTOR); + solver.kingsScentPresent = () -> true; + + // Act + checkSolution(solution); + EnumSet targets = solver.getPossibleTargets(); + + // Assert + Assertions.assertTrue(targets.contains(CompassTarget.GOBLIN_QUEEN)); + Assertions.assertFalse(targets.contains(CompassTarget.GOBLIN_KING)); + } + + @Test + void possible_targets_excludes_king_and_includes_queen_when_kings_scent_is_not_present() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Collections.singletonList(goblinHoldoutCompassUse1)), + Vec3i.NULL_VECTOR); + solver.kingsScentPresent = () -> false; + + // Act + checkSolution(solution); + EnumSet targets = solver.getPossibleTargets(); + + // Assert + Assertions.assertFalse(targets.contains(CompassTarget.GOBLIN_QUEEN)); + Assertions.assertTrue(targets.contains(CompassTarget.GOBLIN_KING)); + } + + @Test + void possible_targets_excludes_odawa_and_includes_temple_when_key_in_inventory() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Collections.singletonList(jungleCompassUse1)), + Vec3i.NULL_VECTOR); + solver.keyInInventory = () -> true; + + // Act + checkSolution(solution); + EnumSet targets = solver.getPossibleTargets(); + + // Assert + Assertions.assertFalse(targets.contains(CompassTarget.ODAWA)); + Assertions.assertTrue(targets.contains(CompassTarget.JUNGLE_TEMPLE)); + } + + @Test + void possible_targets_includes_odawa_and_excludes_temple_when_key_not_in_inventory() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Collections.singletonList(jungleCompassUse1)), + Vec3i.NULL_VECTOR); + solver.keyInInventory = () -> false; + + // Act + checkSolution(solution); + EnumSet targets = solver.getPossibleTargets(); + + // Assert + Assertions.assertTrue(targets.contains(CompassTarget.ODAWA)); + Assertions.assertFalse(targets.contains(CompassTarget.JUNGLE_TEMPLE)); + } + + @Test + void possible_targets_only_contains_city_and_nucleus_when_in_remnants_without_sapphire_crystal() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Collections.singletonList(precursorCityCompassUse1)), + Vec3i.NULL_VECTOR); + + // Act + checkSolution(solution); + EnumSet targets = solver.getPossibleTargets(); + + // Assert + Assertions.assertTrue(targets.contains(CompassTarget.PRECURSOR_CITY)); + Assertions.assertTrue(targets.contains(CompassTarget.CRYSTAL_NUCLEUS)); + Assertions.assertEquals(2, targets.size()); + } + + @Test + void possible_targets_only_contains_mines_and_nucleus_when_in_deposits_without_jade_crystal() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Collections.singletonList(minesOfDivanCompassUse1)), + Vec3i.NULL_VECTOR); + + // Act + checkSolution(solution); + EnumSet targets = solver.getPossibleTargets(); + + // Assert + Assertions.assertTrue(targets.contains(CompassTarget.MINES_OF_DIVAN)); + Assertions.assertTrue(targets.contains(CompassTarget.CRYSTAL_NUCLEUS)); + Assertions.assertEquals(2, targets.size()); + } + + @Test + void possible_targets_only_contains_king_or_queen_and_nucleus_when_in_holdout_without_crystal() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Collections.singletonList(goblinHoldoutCompassUse1)), + Vec3i.NULL_VECTOR); + + // Act + checkSolution(solution); + EnumSet targets = solver.getPossibleTargets(); + + // Assert + Assertions.assertTrue(targets.contains(CompassTarget.GOBLIN_KING) || + targets.contains(CompassTarget.GOBLIN_QUEEN)); + Assertions.assertTrue(targets.contains(CompassTarget.CRYSTAL_NUCLEUS)); + Assertions.assertEquals(2, targets.size()); + } + + @Test + void possible_targets_only_contains_king_and_odawa_and_nucleus_when_in_jungle_without_crystal_or_key() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Collections.singletonList(jungleCompassUse1)), + Vec3i.NULL_VECTOR); + + // Act + checkSolution(solution); + EnumSet targets = solver.getPossibleTargets(); + + // Assert + Assertions.assertTrue(targets.contains(CompassTarget.GOBLIN_KING)); + Assertions.assertTrue(targets.contains(CompassTarget.ODAWA)); + Assertions.assertTrue(targets.contains(CompassTarget.CRYSTAL_NUCLEUS)); + Assertions.assertEquals(3, targets.size()); + } + + @Test + void possible_targets_only_contains_bal_and_nucleus_when_in_magma_fields_without_crystal() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Collections.singletonList(magmaCompassUse1)), + Vec3i.NULL_VECTOR); + + // Act + checkSolution(solution); + EnumSet targets = solver.getPossibleTargets(); + + // Assert + Assertions.assertTrue(targets.contains(CompassTarget.BAL)); + Assertions.assertTrue(targets.contains(CompassTarget.CRYSTAL_NUCLEUS)); + Assertions.assertEquals(2, targets.size()); + } + + private void CheckExcludedTargetsForCrystals( + CompassUse compassUseToExecute, + ArrayList excludedTargets, + EnumSet foundCrystals) { + // Arrange + EnumSet targets; + Solution solution = new Solution( + new ArrayList<>(Collections.singletonList(compassUseToExecute)), + Vec3i.NULL_VECTOR); + + // Act + checkSolution(solution); + targets = solver.getPossibleTargets(); + boolean targetFound = false; + for (CompassTarget target : excludedTargets) { + if (targets.contains(target)) { + targetFound = true; + break; + } + } + Assertions.assertTrue(targetFound); + + resetSolverState(); + solver.foundCrystals = () -> foundCrystals; + checkSolution(solution); + targets = solver.getPossibleTargets(); + + // Assert + for (CompassTarget target : excludedTargets) { + Assertions.assertFalse(targets.contains(target)); + } + } + + @Test + void possible_targets_excludes_king_and_queen_when_amber_crystal_found() { + ArrayList excludedTargets = new ArrayList<>(Arrays.asList( + CompassTarget.GOBLIN_KING, + CompassTarget.GOBLIN_QUEEN + )); + CheckExcludedTargetsForCrystals(goblinHoldoutCompassUse1, excludedTargets, EnumSet.of(Crystal.AMBER)); + } + + @Test + void possible_targets_excludes_odawa_and_temple_when_amethyst_crystal_found() { + ArrayList excludedTargets = new ArrayList<>(Arrays.asList( + CompassTarget.ODAWA, + CompassTarget.JUNGLE_TEMPLE)); + CheckExcludedTargetsForCrystals(jungleCompassUse1, excludedTargets, EnumSet.of(Crystal.AMETHYST)); + } + + @Test + void possible_targets_excludes_mines_when_jade_crystal_found() { + ArrayList excludedTargets = new ArrayList<>(Collections.singletonList( + CompassTarget.MINES_OF_DIVAN)); + CheckExcludedTargetsForCrystals(minesOfDivanCompassUse1, excludedTargets, EnumSet.of(Crystal.JADE)); + } + + @Test + void possible_targets_excludes_city_when_sapphire_crystal_found() { + ArrayList excludedTargets = new ArrayList<>(Collections.singletonList( + CompassTarget.PRECURSOR_CITY)); + CheckExcludedTargetsForCrystals(precursorCityCompassUse1, excludedTargets, EnumSet.of(Crystal.SAPPHIRE)); + } + + @Test + void possible_targets_excludes_bal_when_topaz_crystal_found() { + ArrayList excludedTargets = new ArrayList<>(Collections.singletonList( + CompassTarget.BAL)); + CheckExcludedTargetsForCrystals(magmaCompassUse1, excludedTargets, EnumSet.of(Crystal.TOPAZ)); + } + + @Test + void solver_resets_when_possible_targets_change_based_on_found_crystals() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Collections.singletonList(minesOfDivanCompassUse1)), + Vec3i.NULL_VECTOR); + + // Act + checkSolution(solution); + systemTimeMillis += minesOfDivanCompassUse2.timeIncrementMillis; + solver.foundCrystals = () -> EnumSet.of(Crystal.JADE); + HandleCompassResult handleCompassResult = solver.handleCompassUse(minesOfDivanCompassUse2.playerPos); + + // Assert + Assertions.assertEquals(HandleCompassResult.POSSIBLE_TARGETS_CHANGED, handleCompassResult); + Assertions.assertEquals(SolverState.NOT_STARTED, solver.getSolverState()); + } + + @Test + void solver_resets_when_possible_targets_change_based_on_location() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Collections.singletonList(minesOfDivanCompassUse1)), + Vec3i.NULL_VECTOR); + + // Act + checkSolution(solution); + systemTimeMillis += minesOfDivanCompassUse2.timeIncrementMillis; + BlockPos newLocation = minesOfDivanCompassUse2.playerPos.add(-400, 0 ,0); + HandleCompassResult handleCompassResult = solver.handleCompassUse(newLocation); + + // Assert + Assertions.assertEquals(HandleCompassResult.POSSIBLE_TARGETS_CHANGED, handleCompassResult); + Assertions.assertEquals(SolverState.NOT_STARTED, solver.getSolverState()); + } + + @Test + void mines_of_divan_solution_is_solved() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Arrays.asList(minesOfDivanCompassUse1, minesOfDivanCompassUse2)), + minesOfDivanSolution + ); + + // Act & Assert + checkSolution(solution); + } + + @Test + void jungle_temple_solution_with_key_in_inventory_is_solved() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Arrays.asList(jungleCompassUse1, jungleCompassUse2)), + jungleSolutionTempleDoor + ); + solver.keyInInventory = () -> true; + + // Act & Assert + checkSolution(solution); + } + + @Test + void jungle_temple_solution_is_solved() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Arrays.asList(jungleCompassUse1, jungleCompassUse2)), + jungleSolution + ); + + // Act & Assert + checkSolution(solution); + } + + @Test + void precursor_city_solution_is_solved() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Arrays.asList(precursorCityCompassUse1, precursorCityCompassUse2)), + precursorCitySolution + ); + + // Act & Assert + checkSolution(solution); + } + + @Test + void goblin_king_solution_is_solved() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Arrays.asList(goblinHoldoutCompassUse1, goblinHoldoutCompassUse2)), + goblinHoldoutKingSolution + ); + + // Act & Assert + checkSolution(solution); + } + + @Test + void bal_solution_is_solved() { + // Arrange + Solution solution = new Solution( + new ArrayList<>(Arrays.asList(magmaCompassUse1, magmaCompassUse2)), + magmaSolution + ); + + // Act & Assert + checkSolution(solution); + } + + EnumSet GetSolutionTargetsHelper( + EnumSet possibleTargets, + Vec3Comparable solutionCoords, + int expectedSolutionCount) { + EnumSet solutionTargets = + CrystalWishingCompassSolver.getSolutionTargets(possibleTargets, solutionCoords); + Assertions.assertEquals(expectedSolutionCount, solutionTargets.size()); + return solutionTargets; + } + + @Test + void solutionPossibleTargets_removes_nucleus_when_coords_not_in_nucleus() { + // Arrange & Act + EnumSet solutionTargets = GetSolutionTargetsHelper( + EnumSet.allOf(CompassTarget.class), + new Vec3Comparable(minesOfDivanSolution), + 2); + + //Assert + Assertions.assertFalse(solutionTargets.contains(CompassTarget.CRYSTAL_NUCLEUS)); + } + + @Test + void solutionPossibleTargets_includes_adjacent_zones() { + // Arrange & Act + EnumSet solutionTargets = GetSolutionTargetsHelper( + EnumSet.allOf(CompassTarget.class), + kingMinesOrNucleusCoordsInRemnants, + 2); + + //Assert + Assertions.assertTrue(solutionTargets.contains(CompassTarget.GOBLIN_KING)); + Assertions.assertTrue(solutionTargets.contains(CompassTarget.MINES_OF_DIVAN)); + } + + @Test + void solutionPossibleTargets_skips_y_filtering_when_single_possible_target() { + // Arrange & Act + EnumSet solutionTargets = GetSolutionTargetsHelper( + EnumSet.of(CompassTarget.GOBLIN_QUEEN), + new Vec3Comparable(goblinHoldoutKingSolution), // Coords not valid for queen + 1); + + //Assert + Assertions.assertTrue(solutionTargets.contains(CompassTarget.GOBLIN_QUEEN)); + } + + @Test + void solutionPossibleTargets_still_filters_non_adjacent_when_single_possible_target() { + // Arrange, Act and Assert + GetSolutionTargetsHelper( + EnumSet.of(CompassTarget.ODAWA), + kingMinesOrNucleusCoordsInRemnants, + 0); + } + + @Test + void solutionPossibleTargets_includes_king_based_on_y_coordinate() { + // Arrange & Act + EnumSet possibleTargets = EnumSet.allOf(CompassTarget.class); + possibleTargets.remove(CompassTarget.ODAWA); + EnumSet solutionTargets = GetSolutionTargetsHelper( + possibleTargets, + new Vec3Comparable(goblinHoldoutKingSolution), + 1); + + //Assert + Assertions.assertTrue(solutionTargets.contains(CompassTarget.GOBLIN_KING)); + } + + @Test + void solutionPossibleTargets_includes_odawa_based_on_y_coordinate() { + // Arrange & Act + // Arrange & Act + EnumSet possibleTargets = EnumSet.allOf(CompassTarget.class); + possibleTargets.remove(CompassTarget.GOBLIN_KING); + EnumSet solutionTargets = GetSolutionTargetsHelper( + possibleTargets, + new Vec3Comparable(odawaSolution), + 1); + + //Assert + Assertions.assertTrue(solutionTargets.contains(CompassTarget.ODAWA)); + } + + @Test + void solutionPossibleTargets_includes_mines_based_on_y_coordinate() { + // Arrange & Act + EnumSet possibleTargets = EnumSet.allOf(CompassTarget.class); + possibleTargets.remove(CompassTarget.ODAWA); + EnumSet solutionTargets = GetSolutionTargetsHelper( + possibleTargets, + new Vec3Comparable(minesOfDivanSolution), + 1); + + //Assert + Assertions.assertTrue(solutionTargets.contains(CompassTarget.MINES_OF_DIVAN)); + } + + @Test + void solutionPossibleTargets_includes_temple_based_on_y_coordinate() { + // Arrange & Act + EnumSet possibleTargets = EnumSet.allOf(CompassTarget.class); + possibleTargets.remove(CompassTarget.BAL); + possibleTargets.remove(CompassTarget.ODAWA); + possibleTargets.remove(CompassTarget.GOBLIN_KING); + EnumSet solutionTargets = GetSolutionTargetsHelper( + possibleTargets, + new Vec3Comparable(jungleSolution), + 1); + + //Assert + Assertions.assertTrue(solutionTargets.contains(CompassTarget.JUNGLE_TEMPLE)); + } + + @Test + void solutionPossibleTargets_includes_queen_based_on_y_coordinate() { + // Arrange & Act + EnumSet possibleTargets = EnumSet.allOf(CompassTarget.class); + possibleTargets.remove(CompassTarget.GOBLIN_KING); + possibleTargets.remove(CompassTarget.ODAWA); + EnumSet solutionTargets = GetSolutionTargetsHelper( + possibleTargets, + new Vec3Comparable(goblinHoldoutQueenSolution), + 1); + + //Assert + Assertions.assertTrue(solutionTargets.contains(CompassTarget.GOBLIN_QUEEN)); + } + + @Test + void solutionPossibleTargets_includes_city_based_on_y_coordinate() { + // Arrange & Act + EnumSet possibleTargets = EnumSet.allOf(CompassTarget.class); + possibleTargets.remove(CompassTarget.GOBLIN_KING); + EnumSet solutionTargets = GetSolutionTargetsHelper( + possibleTargets, + new Vec3Comparable(precursorCitySolution), + 1); + + //Assert + Assertions.assertTrue(solutionTargets.contains(CompassTarget.PRECURSOR_CITY)); + } + + @Test + void solutionPossibleTargets_includes_bal_based_on_y_coordinate() { + // Arrange & Act + EnumSet solutionTargets = GetSolutionTargetsHelper( + EnumSet.allOf(CompassTarget.class), + new Vec3Comparable(magmaSolution), + 1); + + //Assert + Assertions.assertTrue(solutionTargets.contains(CompassTarget.BAL)); + } + + // Represents a particle spawn, including: + // - Milliseconds to increment the "system time" prior to spawn. + // - The particle spawn location. + static class ParticleSpawn { + long timeIncrementMillis; + Vec3Comparable spawnLocation; + + ParticleSpawn(Vec3Comparable spawnLocation, long timeIncrementMillis) { + this.timeIncrementMillis = timeIncrementMillis; + this.spawnLocation = spawnLocation; + } + + ParticleSpawn(ParticleSpawn source) { + timeIncrementMillis = source.timeIncrementMillis; + spawnLocation = new Vec3Comparable(source.spawnLocation); + } + } + + // Represents a use of the wishing compass, including: + // - Milliseconds to increment the "system time" prior to use. + // - The player's position when the compass is used. + // - The resulting set of particles + // - The expected state of the wishing compass solver after this compass is used + static class CompassUse { + long timeIncrementMillis; + BlockPos playerPos; + ArrayList particles; + HandleCompassResult expectedHandleCompassUseResult; + SolverState expectedSolverState; + + CompassUse(long timeIncrementMillis, + BlockPos playerPos, + ArrayList particles, + HandleCompassResult expectedHandleCompassUseResult, + SolverState expectedState) { + this.timeIncrementMillis = timeIncrementMillis; + this.playerPos = playerPos; + this.particles = particles != null ? particles : new ArrayList<>(); + this.expectedHandleCompassUseResult = expectedHandleCompassUseResult; + this.expectedSolverState = expectedState; + } + + CompassUse(CompassUse source) { + this.timeIncrementMillis = source.timeIncrementMillis; + this.playerPos = new BlockPos(source.playerPos); + this.particles = new ArrayList<>(source.particles); + this.expectedHandleCompassUseResult = source.expectedHandleCompassUseResult; + this.expectedSolverState = source.expectedSolverState; + } + } + + static class Solution { + ArrayList compassUses; + Vec3i expectedSolutionCoords; + + Solution(ArrayList compassUses, Vec3i expectedSolutionCoords) { + this.compassUses = compassUses; + this.expectedSolutionCoords = new Vec3i(expectedSolutionCoords.getX(), expectedSolutionCoords.getY(), expectedSolutionCoords.getZ()); + } + } + + private static void neuDebugLog(String message) { + System.out.println(message); + } +} diff --git a/src/test/resources/log4j2-test.xml b/src/test/resources/log4j2-test.xml new file mode 100644 index 00000000..25209eae --- /dev/null +++ b/src/test/resources/log4j2-test.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + -- cgit From 924f5da75b3c5ab8bdcfee8b9f16496c6e07f8f0 Mon Sep 17 00:00:00 2001 From: Walker Selby Date: Tue, 29 Mar 2022 01:38:49 -0700 Subject: NEU Pack Dev Additions (#103) --- Update Notes/2.1.md | 3 + .../commands/dev/PackDevCommand.java | 296 +++++++++++++++++++-- .../commands/help/HelpCommand.java | 2 +- 3 files changed, 273 insertions(+), 28 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 4e8e7bf8..8c8006b3 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -69,6 +69,9 @@ - Added NBT data to Profile Viewer Tab Icons - whalker - Added NBT data to Profile Viewer XP Bar Icons - whalker - Added Blaze Slayer information - whalker +- Added subcommand to /neupackdev allowing you to get NBT data from nearby mob(s) - whalker +- Added subcommand to /neupackdev allowing you to get NBT data from nearby armor stand(s) - whalker +- Added optional radius argument for neupackdev subcommands. -whalker ### **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/commands/dev/PackDevCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/PackDevCommand.java index e809ed72..a52541a4 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 @@ -8,6 +8,9 @@ import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.item.EntityArmorStand; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; @@ -18,42 +21,281 @@ public class PackDevCommand extends ClientCommandBase { super("neupackdev"); } + EntityPlayerSP p = Minecraft.getMinecraft().thePlayer; + double dist = 5; + double distSq = 25; @Override public void processCommand(ICommandSender sender, String[] args) throws CommandException { - if (args.length == 1 && args[0].equalsIgnoreCase("getnpc")) { - double distSq = 25; - EntityPlayer closestNPC = null; - EntityPlayerSP p = Minecraft.getMinecraft().thePlayer; - for (EntityPlayer player : Minecraft.getMinecraft().theWorld.playerEntities) { - if (player instanceof AbstractClientPlayer && p != player && player.getUniqueID().version() != 4) { - double dSq = player.getDistanceSq(p.posX, p.posY, p.posZ); - if (dSq < distSq) { - distSq = dSq; - closestNPC = player; - } + if (args.length >= 1) { + + if (args.length == 2) { + try { + distSq = Double.parseDouble(args[1]) * Double.parseDouble(args[1]); + dist = Double.parseDouble(args[1]); + } catch (NumberFormatException e) { + sender.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "Invalid distance! Must be a number, defaulting to a radius of 5.")); } } + StringBuilder value; + switch (args[0].toLowerCase()) { + case "getnpc": + getNPCData(); + break; + + case "getmob": + value = getMobData(); + if (value != null) MiscUtils.copyToClipboard(value.toString()); + break; + + case "getmobs": + value = getMobsData(); + if (value != null) MiscUtils.copyToClipboard(value.toString()); + break; + + case "getarmorstand": + value = getArmorStandData(); + if (value != null) MiscUtils.copyToClipboard(value.toString()); + break; + + case "getarmorstands": + value = getArmorStandsData(); + if (value != null) MiscUtils.copyToClipboard(value.toString()); + break; + + case "getall": + value = getMobsData(); + StringBuilder value2 = getArmorStandsData(); + if (value == null && value2 == null) { + break; + } else if (value != null && value2 != null) { + MiscUtils.copyToClipboard(value.append(value2).toString()); + } else if (value == null) { + MiscUtils.copyToClipboard(value2.toString()); + } else { + MiscUtils.copyToClipboard(value.toString()); + } + break; + + default: + break; + } - if (closestNPC == null) { - Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText( - EnumChatFormatting.RED + "No NPCs found within 5 blocks :(")); + } else { + NotEnoughUpdates.INSTANCE.packDevEnabled = !NotEnoughUpdates.INSTANCE.packDevEnabled; + if (NotEnoughUpdates.INSTANCE.packDevEnabled) { + sender.addChatMessage(new ChatComponentText( + EnumChatFormatting.GREEN + "Enabled pack developer mode.")); } else { - Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText( - EnumChatFormatting.GREEN + "Copied entity texture id to clipboard")); - MiscUtils.copyToClipboard(((AbstractClientPlayer) closestNPC) - .getLocationSkin() - .getResourcePath() - .replace("skins/", "")); + sender.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "Disabled pack developer mode.")); + } + } + } + + public void getNPCData() { + EntityPlayer closestNPC = null; + for (EntityPlayer player : Minecraft.getMinecraft().theWorld.playerEntities) { + if (player instanceof AbstractClientPlayer && p != player && player.getUniqueID().version() != 4) { + double dSq = player.getDistanceSq(p.posX, p.posY, p.posZ); + if (dSq < distSq) { + distSq = dSq; + closestNPC = player; + } + } + } + + if (closestNPC == null) { + p.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "No NPCs found within " + dist + " blocks. :(")); + } else { + p.addChatMessage(new ChatComponentText( + EnumChatFormatting.GREEN + "Copied NPC entity texture id to clipboard")); + MiscUtils.copyToClipboard(((AbstractClientPlayer) closestNPC) + .getLocationSkin() + .getResourcePath() + .replace("skins/", "")); + } + } + + public StringBuilder getMobData(){ + Entity closestMob = null; + for (Entity mob : Minecraft.getMinecraft().theWorld.loadedEntityList) { + if (mob != null && mob != Minecraft.getMinecraft().thePlayer && mob instanceof EntityLiving) { + double dSq = mob.getDistanceSq(p.posX, p.posY, p.posZ); + if (dSq < distSq) { + distSq = dSq; + closestMob = mob; + } + } + } + + + if (closestMob == null) { + p.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "No mobs found within" + dist + " blocks. :(")); + } else { + p.addChatMessage(new ChatComponentText( + EnumChatFormatting.GREEN + "Copied mob data to clipboard")); + + return mobDataBuilder(closestMob); + + } + return null; + } + + public StringBuilder getMobsData(){ + StringBuilder mobStringBuilder = new StringBuilder(); + for (Entity mob : Minecraft.getMinecraft().theWorld.loadedEntityList) { + if (mob != null && mob != Minecraft.getMinecraft().thePlayer && mob instanceof EntityLiving && + mob.getDistanceSq(p.posX, p.posY, p.posZ) < distSq) { + mobStringBuilder.append(mobDataBuilder(mob)); + } + } + + if (mobStringBuilder.toString().equals("")) { + p.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "No mobs found within" + dist + " blocks. :(")); + } else { + p.addChatMessage(new ChatComponentText( + EnumChatFormatting.GREEN + "Copied mob data to clipboard")); + return mobStringBuilder; + } + return null; + } + + public StringBuilder getArmorStandData(){ + EntityArmorStand closestArmorStand = null; + for (Entity armorStand : Minecraft.getMinecraft().theWorld.loadedEntityList) { + if (armorStand instanceof EntityArmorStand) { + double dSq = armorStand.getDistanceSq(p.posX, p.posY, p.posZ); + if (dSq < distSq) { + distSq = dSq; + closestArmorStand = (EntityArmorStand) armorStand; + } + } + } + + if (closestArmorStand == null) { + p.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "No armor stands found within " + dist + " blocks. :(")); + } else { + p.addChatMessage(new ChatComponentText( + EnumChatFormatting.GREEN + "Copied armor stand data to clipboard")); + + return(armorStandDataBuilder(closestArmorStand)); + + } + return null; + } + + public StringBuilder getArmorStandsData(){ + + StringBuilder armorStandStringBuilder = new StringBuilder(); + for (Entity armorStand : Minecraft.getMinecraft().theWorld.loadedEntityList) { + if (armorStand instanceof EntityArmorStand && + armorStand.getDistanceSq(p.posX, p.posY, p.posZ) < distSq) { + armorStandStringBuilder.append(armorStandDataBuilder((EntityArmorStand) armorStand)); } - return; } - NotEnoughUpdates.INSTANCE.packDevEnabled = !NotEnoughUpdates.INSTANCE.packDevEnabled; - if (NotEnoughUpdates.INSTANCE.packDevEnabled) { - Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText( - EnumChatFormatting.GREEN + "Enabled pack developer mode.")); + + if (armorStandStringBuilder.toString().equals("")) { + p.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "No armor stands found within" + dist + " blocks. :(")); + } else { + p.addChatMessage(new ChatComponentText( + EnumChatFormatting.GREEN + "Copied armor stand data to clipboard")); + return armorStandStringBuilder; + } + return null; + } + + + + + public StringBuilder mobDataBuilder(Entity mob) { + StringBuilder mobData = new StringBuilder(); + + //Preventing Null Pointer Exception + //Entity Information + mobData + .append("Entity Id: ") + .append(mob.getEntityId() != -1 ? mob.getEntityId() : "null") + .append("\nMob: ") + .append(mob.getName() != null ? mob.getName() : "null") + .append("\nCuston Name: ") + .append(mob.getCustomNameTag() != null ? mob.getCustomNameTag() : "null"); + + //Held Item + if (((EntityLiving) mob).getHeldItem() != null) { + mobData + .append("\nItem: ") + .append(((EntityLiving) mob).getHeldItem()) + .append("\nItem Display Name: ") + .append(((EntityLiving) mob).getHeldItem().getDisplayName()!= null ? ((EntityLiving) mob).getHeldItem().getDisplayName() : "null") + .append("\nItem Tag Compound: ") + .append(((EntityLiving) mob).getHeldItem().getTagCompound().toString() != null ? ((EntityLiving) mob).getHeldItem().getTagCompound().toString() : "null") + .append("\nItem Tag Compound Extra Attributes: ") + .append(((EntityLiving) mob).getHeldItem().getTagCompound().getTag("ExtraAttributes") != null ? ((EntityLiving) mob).getHeldItem().getTagCompound().getTag("ExtraAttributes").toString() : "null"); + } else { + mobData.append("\nItem: null"); + } + + //Armor + mobData + .append("\nBoots: ") + .append(((EntityLiving) mob).getCurrentArmor(0).getTagCompound() != null ? ((EntityLiving) mob).getCurrentArmor(0).getTagCompound().toString() : "null") + .append("\nLeggings: ") + .append(((EntityLiving) mob).getCurrentArmor(1).getTagCompound() != null ? ((EntityLiving) mob).getCurrentArmor(1).getTagCompound() : "null") + .append("\nChestplate: ") + .append(((EntityLiving) mob).getCurrentArmor(2).getTagCompound() != null ? ((EntityLiving) mob).getCurrentArmor(2).getTagCompound() : "null") + .append("\nHelmet: ") + .append(((EntityLiving) mob).getCurrentArmor(3).getTagCompound() != null ? ((EntityLiving) mob).getCurrentArmor(3).getTagCompound() : "null") + .append("\n\n"); + + return mobData; + } + + public StringBuilder armorStandDataBuilder(EntityArmorStand armorStand) { + StringBuilder armorStandData = new StringBuilder(); + + //Preventing Null Pointer Exception + //Entity Information + armorStandData + .append("Entity Id: ") + .append(armorStand.getEntityId()) + .append("\nMob: ") + .append(armorStand.getName() != null ? armorStand.getName() : "null") + .append("\nCustom Name: ") + .append(armorStand.getCustomNameTag() != null ? armorStand.getCustomNameTag() : "null"); + + //Held Item + if (armorStand.getHeldItem() != null) { + armorStandData + .append("\nItem: ") + .append(armorStand.getHeldItem()) + .append("\nItem Display Name: ") + .append(armorStand.getHeldItem().getDisplayName() != null ? armorStand.getHeldItem().getDisplayName() : "null") + .append("\nItem Tag Compound: ") + .append(armorStand.getHeldItem().getTagCompound().toString() != null ? armorStand.getHeldItem().getTagCompound().toString() : "null") + .append("\nItem Tag Compound Extra Attributes: ") + .append(armorStand.getHeldItem().getTagCompound().getTag("ExtraAttributes") != null ? armorStand.getHeldItem().getTagCompound().getTag("ExtraAttributes") : "null"); + } else { - Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText( - EnumChatFormatting.RED + "Disabled pack developer mode.")); + armorStandData.append("\nItem: null"); } + + //Armor + armorStandData + .append("\nBoots: ") + .append(armorStand.getCurrentArmor(0).getTagCompound() != null ? armorStand.getCurrentArmor(0).getTagCompound() : "null") + .append("\nLeggings: ") + .append(armorStand.getCurrentArmor(1).getTagCompound() != null ? armorStand.getCurrentArmor(1).getTagCompound() : "null") + .append("\nChestplate: ") + .append(armorStand.getCurrentArmor(2).getTagCompound() != null ? armorStand.getCurrentArmor(2).getTagCompound() : "null") + .append("\nHelmet: ") + .append(armorStand.getCurrentArmor(3).getTagCompound() != null ? armorStand.getCurrentArmor(3).getTagCompound() : "null"); + armorStandData.append("\n\n"); + return armorStandData; } } 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 9669be60..f84b238d 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" + "\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)); -- cgit From 6f3ed710839922a3637a5afda2e8758dff594b77 Mon Sep 17 00:00:00 2001 From: Walker Selby Date: Fri, 8 Apr 2022 06:21:21 -0700 Subject: Neupackdev subcommand additions 2 (#106) Co-authored-by: CraftyOldMiner <85420839+CraftyOldMiner@users.noreply.github.com> --- Update Notes/2.1.md | 6 +- .../commands/dev/PackDevCommand.java | 440 ++++++++++----------- 2 files changed, 208 insertions(+), 238 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 8c8006b3..cdc4404b 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -71,7 +71,11 @@ - Added Blaze Slayer information - whalker - Added subcommand to /neupackdev allowing you to get NBT data from nearby mob(s) - whalker - Added subcommand to /neupackdev allowing you to get NBT data from nearby armor stand(s) - whalker -- Added optional radius argument for neupackdev subcommands. -whalker +- Added additional data to the /neupackdev NPC subcommand - whalker +- Added a subcommand to /neupackdev to get the NBT of all mobs, armor stands, and npc in the loaded world - whalker +- Added a subcommand to /neupackdev to get the NBT of the closest mob, armor stand, and npc in a radius in the loaded world - whalker +- Added optional radius argument for neupackdev subcommands. - whalker +- Added tab completion to /neupackdev subcommands. - whalker ### **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/commands/dev/PackDevCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/dev/PackDevCommand.java index a52541a4..2b0e7240 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 @@ -5,297 +5,263 @@ import io.github.moulberry.notenoughupdates.commands.ClientCommandBase; import io.github.moulberry.notenoughupdates.core.util.MiscUtils; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.AbstractClientPlayer; -import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityArmorStand; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.BlockPos; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; -public class PackDevCommand extends ClientCommandBase { +import java.util.HashMap; +import java.util.List; +import java.util.function.Supplier; +public class PackDevCommand extends ClientCommandBase { + static Minecraft mc = Minecraft.getMinecraft(); public PackDevCommand() { super("neupackdev"); } - EntityPlayerSP p = Minecraft.getMinecraft().thePlayer; - double dist = 5; - double distSq = 25; - @Override - public void processCommand(ICommandSender sender, String[] args) throws CommandException { - if (args.length >= 1) { - - if (args.length == 2) { - try { - distSq = Double.parseDouble(args[1]) * Double.parseDouble(args[1]); - dist = Double.parseDouble(args[1]); - } catch (NumberFormatException e) { - sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.RED + "Invalid distance! Must be a number, defaulting to a radius of 5.")); - } - } - StringBuilder value; - switch (args[0].toLowerCase()) { - case "getnpc": - getNPCData(); - break; - - case "getmob": - value = getMobData(); - if (value != null) MiscUtils.copyToClipboard(value.toString()); - break; - - case "getmobs": - value = getMobsData(); - if (value != null) MiscUtils.copyToClipboard(value.toString()); - break; - - case "getarmorstand": - value = getArmorStandData(); - if (value != null) MiscUtils.copyToClipboard(value.toString()); - break; - - case "getarmorstands": - value = getArmorStandsData(); - if (value != null) MiscUtils.copyToClipboard(value.toString()); - break; + private static final HashMap> commands = new HashMap>() {{ + put("getnpc", + new Command<>( + "NPC", + () -> mc.theWorld.playerEntities, + true, + AbstractClientPlayer.class + )); + put("getnpcs", + new Command<>( + "NPC", + () -> mc.theWorld.playerEntities, + false, + AbstractClientPlayer.class + )); + put("getmob", + new Command<>( + "mob", + () -> mc.theWorld.loadedEntityList, + true, + EntityLiving.class + )); + put("getmobs", + new Command<>( + "mob", + () -> mc.theWorld.loadedEntityList, + false, + EntityLiving.class + )); + put("getarmorstand", + new Command<>("armor stand", + () -> mc.theWorld.loadedEntityList, + true, + EntityArmorStand.class + )); + put("getarmorstands", + new Command<>("armor stand", + () -> mc.theWorld.loadedEntityList, + false, + EntityArmorStand.class + )); + }}; - case "getall": - value = getMobsData(); - StringBuilder value2 = getArmorStandsData(); - if (value == null && value2 == null) { - break; - } else if (value != null && value2 != null) { - MiscUtils.copyToClipboard(value.append(value2).toString()); - } else if (value == null) { - MiscUtils.copyToClipboard(value2.toString()); - } else { - MiscUtils.copyToClipboard(value.toString()); - } - break; - - default: - break; - } - - } else { - NotEnoughUpdates.INSTANCE.packDevEnabled = !NotEnoughUpdates.INSTANCE.packDevEnabled; - if (NotEnoughUpdates.INSTANCE.packDevEnabled) { - sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.GREEN + "Enabled pack developer mode.")); - } else { - sender.addChatMessage(new ChatComponentText( - EnumChatFormatting.RED + "Disabled pack developer mode.")); - } - } + @Override + public List addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) { + return args.length == 1 ? getListOfStringsMatchingLastWord(args, commands.keySet()) : null; } - public void getNPCData() { - EntityPlayer closestNPC = null; - for (EntityPlayer player : Minecraft.getMinecraft().theWorld.playerEntities) { - if (player instanceof AbstractClientPlayer && p != player && player.getUniqueID().version() != 4) { - double dSq = player.getDistanceSq(p.posX, p.posY, p.posZ); - if (dSq < distSq) { - distSq = dSq; - closestNPC = player; - } - } - } - - if (closestNPC == null) { - p.addChatMessage(new ChatComponentText( - EnumChatFormatting.RED + "No NPCs found within " + dist + " blocks. :(")); + public static void togglePackDeveloperMode(ICommandSender sender) { + NotEnoughUpdates.INSTANCE.packDevEnabled = !NotEnoughUpdates.INSTANCE.packDevEnabled; + if (NotEnoughUpdates.INSTANCE.packDevEnabled) { + sender.addChatMessage(new ChatComponentText( + EnumChatFormatting.GREEN + "Enabled pack developer mode.")); } else { - p.addChatMessage(new ChatComponentText( - EnumChatFormatting.GREEN + "Copied NPC entity texture id to clipboard")); - MiscUtils.copyToClipboard(((AbstractClientPlayer) closestNPC) - .getLocationSkin() - .getResourcePath() - .replace("skins/", "")); + sender.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "Disabled pack developer mode.")); } } - public StringBuilder getMobData(){ - Entity closestMob = null; - for (Entity mob : Minecraft.getMinecraft().theWorld.loadedEntityList) { - if (mob != null && mob != Minecraft.getMinecraft().thePlayer && mob instanceof EntityLiving) { - double dSq = mob.getDistanceSq(p.posX, p.posY, p.posZ); - if (dSq < distSq) { - distSq = dSq; - closestMob = mob; - } - } - } - - - if (closestMob == null) { - p.addChatMessage(new ChatComponentText( - EnumChatFormatting.RED + "No mobs found within" + dist + " blocks. :(")); - } else { - p.addChatMessage(new ChatComponentText( - EnumChatFormatting.GREEN + "Copied mob data to clipboard")); - - return mobDataBuilder(closestMob); - + @Override + public void processCommand(ICommandSender sender, String[] args) throws CommandException { + if (args.length == 0) { + togglePackDeveloperMode(sender); + return; } - return null; - } - public StringBuilder getMobsData(){ - StringBuilder mobStringBuilder = new StringBuilder(); - for (Entity mob : Minecraft.getMinecraft().theWorld.loadedEntityList) { - if (mob != null && mob != Minecraft.getMinecraft().thePlayer && mob instanceof EntityLiving && - mob.getDistanceSq(p.posX, p.posY, p.posZ) < distSq) { - mobStringBuilder.append(mobDataBuilder(mob)); + double dist = 5.0; + if (args.length >= 2) { + try { + dist = Double.parseDouble(args[1]); + } catch (NumberFormatException e) { + sender.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "Invalid distance! Must be a number, defaulting to a radius of 5.")); } } - if (mobStringBuilder.toString().equals("")) { - p.addChatMessage(new ChatComponentText( - EnumChatFormatting.RED + "No mobs found within" + dist + " blocks. :(")); + StringBuilder output; + String subCommand = args[0].toLowerCase(); + if (commands.containsKey(subCommand)) { + Command command = commands.get(subCommand); + output = command.getData(dist); + } else if (subCommand.equals("getall")) { + output = getAll(dist); + } else if (subCommand.equals("getallclose")) { + output = getAllClose(dist); } else { - p.addChatMessage(new ChatComponentText( - EnumChatFormatting.GREEN + "Copied mob data to clipboard")); - return mobStringBuilder; + sender.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "Invalid sub-command.")); + return; } - return null; - } - public StringBuilder getArmorStandData(){ - EntityArmorStand closestArmorStand = null; - for (Entity armorStand : Minecraft.getMinecraft().theWorld.loadedEntityList) { - if (armorStand instanceof EntityArmorStand) { - double dSq = armorStand.getDistanceSq(p.posX, p.posY, p.posZ); - if (dSq < distSq) { - distSq = dSq; - closestArmorStand = (EntityArmorStand) armorStand; - } - } + if (output.length() != 0) { + MiscUtils.copyToClipboard(output.toString()); } + } - if (closestArmorStand == null) { - p.addChatMessage(new ChatComponentText( - EnumChatFormatting.RED + "No armor stands found within " + dist + " blocks. :(")); - } else { - p.addChatMessage(new ChatComponentText( - EnumChatFormatting.GREEN + "Copied armor stand data to clipboard")); - - return(armorStandDataBuilder(closestArmorStand)); - - } - return null; + private static StringBuilder getAllClose(Double dist) { + StringBuilder sb = new StringBuilder(); + sb.append(commands.get("getmob").getData(dist)); + sb.append(commands.get("getarmorstand").getData(dist)); + sb.append(commands.get("getnpc").getData(dist)); + return sb; } - public StringBuilder getArmorStandsData(){ + private static StringBuilder getAll(Double dist) { + StringBuilder sb = new StringBuilder(); + sb.append(commands.get("getmobs").getData(dist)); + sb.append(commands.get("getarmorstands").getData(dist)); + sb.append(commands.get("getnpcs").getData(dist)); + return sb; + } - StringBuilder armorStandStringBuilder = new StringBuilder(); - for (Entity armorStand : Minecraft.getMinecraft().theWorld.loadedEntityList) { - if (armorStand instanceof EntityArmorStand && - armorStand.getDistanceSq(p.posX, p.posY, p.posZ) < distSq) { - armorStandStringBuilder.append(armorStandDataBuilder((EntityArmorStand) armorStand)); - } + public static StringBuilder livingBaseDataBuilder(T entity, Class clazz) { + StringBuilder entityData = new StringBuilder(); + if (EntityPlayer.class.isAssignableFrom(entity.getClass())) { + EntityPlayer entityPlayer = (EntityPlayer) entity; + + // NPC Information + String skinResourcePath = ((AbstractClientPlayer) entityPlayer).getLocationSkin().getResourcePath(); + entityData + .append("Player Id: ") + .append(entityPlayer.getUniqueID() != null ? entityPlayer.getUniqueID().toString() : "null") + .append(entityPlayer.getCustomNameTag() != null ? entityPlayer.getCustomNameTag() : "null") + .append("\nEntity Texture Id: ") + .append(skinResourcePath != null ? skinResourcePath.replace("skins/", "") : "null"); } - if (armorStandStringBuilder.toString().equals("")) { - p.addChatMessage(new ChatComponentText( - EnumChatFormatting.RED + "No armor stands found within" + dist + " blocks. :(")); - } else { - p.addChatMessage(new ChatComponentText( - EnumChatFormatting.GREEN + "Copied armor stand data to clipboard")); - return armorStandStringBuilder; + if (!clazz.isAssignableFrom(entity.getClass())) { + return entityData; } - return null; - } - - - - public StringBuilder mobDataBuilder(Entity mob) { - StringBuilder mobData = new StringBuilder(); - - //Preventing Null Pointer Exception //Entity Information - mobData + entityData .append("Entity Id: ") - .append(mob.getEntityId() != -1 ? mob.getEntityId() : "null") + .append(entity.getEntityId()) .append("\nMob: ") - .append(mob.getName() != null ? mob.getName() : "null") - .append("\nCuston Name: ") - .append(mob.getCustomNameTag() != null ? mob.getCustomNameTag() : "null"); + .append(entity.getName() != null ? entity.getName() : "null") + .append("\nCustom Name: ") + .append(entity.getCustomNameTag() != null ? entity.getCustomNameTag() : "null"); //Held Item - if (((EntityLiving) mob).getHeldItem() != null) { - mobData + if (entity.getHeldItem() != null) { + entityData .append("\nItem: ") - .append(((EntityLiving) mob).getHeldItem()) + .append(entity.getHeldItem()) .append("\nItem Display Name: ") - .append(((EntityLiving) mob).getHeldItem().getDisplayName()!= null ? ((EntityLiving) mob).getHeldItem().getDisplayName() : "null") - .append("\nItem Tag Compound: ") - .append(((EntityLiving) mob).getHeldItem().getTagCompound().toString() != null ? ((EntityLiving) mob).getHeldItem().getTagCompound().toString() : "null") - .append("\nItem Tag Compound Extra Attributes: ") - .append(((EntityLiving) mob).getHeldItem().getTagCompound().getTag("ExtraAttributes") != null ? ((EntityLiving) mob).getHeldItem().getTagCompound().getTag("ExtraAttributes").toString() : "null"); + .append(entity.getHeldItem().getDisplayName() != null + ? entity.getHeldItem().getDisplayName() + : "null") + .append("\nItem Tag Compound: "); + NBTTagCompound heldItemTagCompound = entity.getHeldItem().getTagCompound(); + if (heldItemTagCompound != null) { + String heldItemString = heldItemTagCompound.toString(); + NBTBase extraAttrTag = heldItemTagCompound.getTag("ExtraAttributes"); + entityData + .append(heldItemString != null ? heldItemString : "null") + .append("\nItem Tag Compound Extra Attributes: ") + .append(extraAttrTag != null ? extraAttrTag : "null"); + } else { + entityData.append("null"); + } + } else { - mobData.append("\nItem: null"); + entityData.append("\nItem: null"); } - //Armor - mobData - .append("\nBoots: ") - .append(((EntityLiving) mob).getCurrentArmor(0).getTagCompound() != null ? ((EntityLiving) mob).getCurrentArmor(0).getTagCompound().toString() : "null") - .append("\nLeggings: ") - .append(((EntityLiving) mob).getCurrentArmor(1).getTagCompound() != null ? ((EntityLiving) mob).getCurrentArmor(1).getTagCompound() : "null") - .append("\nChestplate: ") - .append(((EntityLiving) mob).getCurrentArmor(2).getTagCompound() != null ? ((EntityLiving) mob).getCurrentArmor(2).getTagCompound() : "null") - .append("\nHelmet: ") - .append(((EntityLiving) mob).getCurrentArmor(3).getTagCompound() != null ? ((EntityLiving) mob).getCurrentArmor(3).getTagCompound() : "null") - .append("\n\n"); + entityData.append(armorDataBuilder(entity)).append("\n\n"); - return mobData; + return entityData; } - public StringBuilder armorStandDataBuilder(EntityArmorStand armorStand) { - StringBuilder armorStandData = new StringBuilder(); + private static final String[] armorPieceTypes = {"Boots", "Leggings", "Chestplate", "Helmet"}; + public static StringBuilder armorDataBuilder (T entity) { + StringBuilder armorData = new StringBuilder(); + for (int i=0; i < 4; i++) { + ItemStack currentArmor = entity.getCurrentArmor(0); + armorData.append(String.format("\n%s: ", armorPieceTypes[i])); + if (currentArmor == null) { + armorData.append("null"); + } else { + armorData.append(currentArmor.getTagCompound() != null ? currentArmor.getTagCompound().toString() : "null"); + } + } + return armorData; + } - //Preventing Null Pointer Exception - //Entity Information - armorStandData - .append("Entity Id: ") - .append(armorStand.getEntityId()) - .append("\nMob: ") - .append(armorStand.getName() != null ? armorStand.getName() : "null") - .append("\nCustom Name: ") - .append(armorStand.getCustomNameTag() != null ? armorStand.getCustomNameTag() : "null"); + static class Command { + String typeFriendlyName; + Supplier> entitySupplier; + Class clazz; + boolean single; + + Command(String typeFriendlyName, + Supplier> entitySupplier, + boolean single, + Class clazz) { + this.typeFriendlyName = typeFriendlyName; + this.entitySupplier = entitySupplier; + this.single = single; + this.clazz = clazz; + } - //Held Item - if (armorStand.getHeldItem() != null) { - armorStandData - .append("\nItem: ") - .append(armorStand.getHeldItem()) - .append("\nItem Display Name: ") - .append(armorStand.getHeldItem().getDisplayName() != null ? armorStand.getHeldItem().getDisplayName() : "null") - .append("\nItem Tag Compound: ") - .append(armorStand.getHeldItem().getTagCompound().toString() != null ? armorStand.getHeldItem().getTagCompound().toString() : "null") - .append("\nItem Tag Compound Extra Attributes: ") - .append(armorStand.getHeldItem().getTagCompound().getTag("ExtraAttributes") != null ? armorStand.getHeldItem().getTagCompound().getTag("ExtraAttributes") : "null"); + @SuppressWarnings("unchecked") + public StringBuilder getData(double dist) { + StringBuilder result = new StringBuilder(); + double distSq = dist * dist; + T closest = null; + for (Entity entity : entitySupplier.get()) { + if (!clazz.isAssignableFrom(entity.getClass()) || entity == mc.thePlayer) { + continue; + } + T entityT = (T) entity; + double entityDistanceSq = entity.getDistanceSq(mc.thePlayer.posX, mc.thePlayer.posY, mc.thePlayer.posZ); + if (entityDistanceSq < distSq) { + if (single) { + distSq = entityDistanceSq; + closest = entityT; + } else { + result.append(livingBaseDataBuilder(entityT, clazz)); + } + } + } - } else { - armorStandData.append("\nItem: null"); - } + if ((single && closest == null) || (!single && result.length() == 0)) { + mc.thePlayer.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "No " + typeFriendlyName + "s found within " + dist + " blocks.")); + } else { + mc.thePlayer.addChatMessage(new ChatComponentText( + EnumChatFormatting.GREEN + "Copied " + typeFriendlyName + " data to clipboard")); + return single ? livingBaseDataBuilder(closest, clazz) : result; + } - //Armor - armorStandData - .append("\nBoots: ") - .append(armorStand.getCurrentArmor(0).getTagCompound() != null ? armorStand.getCurrentArmor(0).getTagCompound() : "null") - .append("\nLeggings: ") - .append(armorStand.getCurrentArmor(1).getTagCompound() != null ? armorStand.getCurrentArmor(1).getTagCompound() : "null") - .append("\nChestplate: ") - .append(armorStand.getCurrentArmor(2).getTagCompound() != null ? armorStand.getCurrentArmor(2).getTagCompound() : "null") - .append("\nHelmet: ") - .append(armorStand.getCurrentArmor(3).getTagCompound() != null ? armorStand.getCurrentArmor(3).getTagCompound() : "null"); - armorStandData.append("\n\n"); - return armorStandData; + return result; + } } } -- cgit From 0f7fb90f9a757117584daf37b6eba8b37add1518 Mon Sep 17 00:00:00 2001 From: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> Date: Tue, 12 Apr 2022 16:23:58 +0000 Subject: Added an command to change repo url and commits url (#109) * Added an command to change repo url and commits url * Added new armor types to itemlist category * made /neurepomode setRepoURL not a pain to use Co-authored-by: jani270 --- Update Notes/2.1.md | 2 +- .../moulberry/notenoughupdates/NEUOverlay.java | 7 ++++- .../commands/repo/RepoModeCommand.java | 32 +++++++++++++++++++--- 3 files changed, 35 insertions(+), 6 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index cdc4404b..139b1a4f 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -35,7 +35,7 @@ - Added a help menu to /neuec - Made it so treecap shows foraging xp instead of farming xp on the farming overlay - Made it so a jungle axe with cult will show the "farming" overlay -- Added /neurepomode to toggle item editing and dev mode +- Added /neurepomode to toggle item editing and dev mode, and changing the item repo url - Changed "NEUAH is DISABLED! Enable in /neusettings." to /neu - Changed misc overlays tab to todo overlays - Added a config option for npc retexturing diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java index b7aa42d6..75bff803 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java @@ -1390,7 +1390,12 @@ public class NEUOverlay extends Gui { "DUNGEON HELMET", "DUNGEON CHESTPLATE", "DUNGEON LEGGINGS", - "DUNGEON BOOTS" + "DUNGEON BOOTS", + "BELT", + "GLOVES", + "CLOAK", + "NECKLACE", + "BRACELET" ) >= 0; } else if (getSortMode() == SORT_MODE_ACCESSORY) { return checkItemType(item.get("lore").getAsJsonArray(), "ACCESSORY", "HATCCESSORY", "DUNGEON ACCESSORY") >= 0; 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 bb6e1675..a8f53460 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 @@ -15,9 +15,33 @@ public class RepoModeCommand extends ClientCommandBase { @Override public void processCommand(ICommandSender sender, String[] args) throws CommandException { - NotEnoughUpdates.INSTANCE.config.hidden.dev = !NotEnoughUpdates.INSTANCE.config.hidden.dev; - NotEnoughUpdates.INSTANCE.config.hidden.enableItemEditing = - !NotEnoughUpdates.INSTANCE.config.hidden.enableItemEditing; - Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("\u00a75Toggled NEU repo dev mode.")); + if (args.length == 1 && args[0].equalsIgnoreCase("toggle")) { + NotEnoughUpdates.INSTANCE.config.hidden.dev = !NotEnoughUpdates.INSTANCE.config.hidden.dev; + NotEnoughUpdates.INSTANCE.config.hidden.enableItemEditing = + !NotEnoughUpdates.INSTANCE.config.hidden.enableItemEditing; + Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("\u00a75Toggled NEU repo dev mode.")); + } else if (args.length >= 2 && args[0].equalsIgnoreCase("setrepourl")) { + String githubUser = "Moulberry"; + String githubRepo = "NotEnoughUpdates-REPO"; + String githubBranch = "master"; + if (!args[1].equalsIgnoreCase("reset")) { + githubUser = args[1]; + if (args.length >= 3) { + githubRepo = args[2]; + } + if (args.length >= 4) { + 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)); + + } else { + Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("\u00a7cUsage:" + + "\n\u00a75/neurepomode Toggles on/off dev mode and item editing." + + "\n\u00a75/neurepomode [reponame] [branch] Sets the repo URL for downloading from.")); + } } } -- cgit From c983bb5785318c54d5be59907410b4dfe6d39b64 Mon Sep 17 00:00:00 2001 From: CraftyOldMiner <85420839+CraftyOldMiner@users.noreply.github.com> Date: Wed, 13 Apr 2022 00:54:08 -0500 Subject: Change fairy soul beacon colors based on distance, always track found souls (#111) --- Update Notes/2.1.md | 2 + .../notenoughupdates/NotEnoughUpdates.java | 21 +- .../config/annotations/ConfigEditorBoolean.java | 4 +- .../core/config/gui/GuiOptionEditorBoolean.java | 23 +- .../core/config/struct/ConfigProcessor.java | 3 +- .../core/util/render/RenderUtils.java | 4 +- .../listener/NEUEventListener.java | 2 +- .../notenoughupdates/miscfeatures/FairySouls.java | 468 +++++++++++++-------- .../notenoughupdates/options/NEUConfig.java | 11 +- .../options/seperateSections/Misc.java | 25 +- 10 files changed, 344 insertions(+), 219 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 139b1a4f..cb117f31 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -28,6 +28,8 @@ - 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) +- Fairy soul beacons now change color based on their distance +- Separated settings for fairy soul tracking from showing beacons. Tracking is turned on by default. - Added fairy souls option to /neu misc - Make it so fairy souls are tracked independently for each profile - Lulonaut - Added a button in the storage gui to open the settings diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index e60ff666..0a77c677 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -186,7 +186,7 @@ public class NotEnoughUpdates { ItemCustomizeManager.loadCustomization(new File(neuDir, "itemCustomization.json")); StorageManager.getInstance().loadConfig(new File(neuDir, "storageItems.json")); - FairySouls.load(new File(neuDir, "collected_fairy_souls.json"), gson); + FairySouls.getInstance().loadFoundSoulsForAllProfiles(new File(neuDir, "collected_fairy_souls.json"), gson); PetInfoOverlay.loadConfig(new File(neuDir, "petCache.json")); SlotLocking.getInstance().loadConfig(new File(neuDir, "slotLocking.json")); ItemPriceInformation.init(new File(neuDir, "auctionable_items.json"), gson); @@ -208,7 +208,7 @@ public class NotEnoughUpdates { MinecraftForge.EVENT_BUS.register(new DungeonMap()); MinecraftForge.EVENT_BUS.register(new SunTzu()); MinecraftForge.EVENT_BUS.register(new MiningStuff()); - MinecraftForge.EVENT_BUS.register(new FairySouls()); + MinecraftForge.EVENT_BUS.register(FairySouls.getInstance()); MinecraftForge.EVENT_BUS.register(new CrystalOverlay()); MinecraftForge.EVENT_BUS.register(new ItemCooldowns()); MinecraftForge.EVENT_BUS.register(new DwarvenMinesWaypoints()); @@ -223,25 +223,10 @@ public class NotEnoughUpdates { MinecraftForge.EVENT_BUS.register(CrystalWishingCompassSolver.getInstance()); MinecraftForge.EVENT_BUS.register(new DwarvenMinesTextures()); MinecraftForge.EVENT_BUS.register(CustomBiomes.INSTANCE); - - MinecraftForge.EVENT_BUS.register(this); - MinecraftForge.EVENT_BUS.register(new NEUEventListener(this)); MinecraftForge.EVENT_BUS.register(new ChatListener(this)); 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 RecipeGenerator(this)); - MinecraftForge.EVENT_BUS.register(CapeManager.getInstance()); - MinecraftForge.EVENT_BUS.register(new EnchantingSolvers()); - MinecraftForge.EVENT_BUS.register(new CalendarOverlay()); - MinecraftForge.EVENT_BUS.register(SBInfo.getInstance()); - MinecraftForge.EVENT_BUS.register(CustomItemEffects.INSTANCE); - MinecraftForge.EVENT_BUS.register(new DungeonMap()); - MinecraftForge.EVENT_BUS.register(new SunTzu()); - MinecraftForge.EVENT_BUS.register(new MiningStuff()); - MinecraftForge.EVENT_BUS.register(new FairySouls()); - MinecraftForge.EVENT_BUS.register(new CrystalOverlay()); - MinecraftForge.EVENT_BUS.register(new ItemCooldowns()); if (Minecraft.getMinecraft().getResourceManager() instanceof IReloadableResourceManager) { IReloadableResourceManager manager = (IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager(); @@ -300,7 +285,7 @@ public class NotEnoughUpdates { } catch (Exception ignored) { } try { - FairySouls.save(new File(neuDir, "collected_fairy_souls.json"), gson); + FairySouls.getInstance().saveFoundSoulsForAllProfiles(new File(neuDir, "collected_fairy_souls.json"), gson); } catch (Exception ignored) { } try { 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 a0ca1f38..f625b318 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 @@ -7,4 +7,6 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) -public @interface ConfigEditorBoolean {} +public @interface ConfigEditorBoolean { + int runnableId() default -1; +} 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 9e2c912a..8a3b2f14 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,15 +1,24 @@ package io.github.moulberry.notenoughupdates.core.config.gui; import io.github.moulberry.notenoughupdates.core.GuiElementBoolean; +import io.github.moulberry.notenoughupdates.core.config.Config; import io.github.moulberry.notenoughupdates.core.config.struct.ConfigProcessor; public class GuiOptionEditorBoolean extends GuiOptionEditor { - private final GuiElementBoolean bool; - public GuiOptionEditorBoolean(ConfigProcessor.ProcessedOption option) { + private final GuiElementBoolean bool; + private final Config config; + private final int runnableId; + + public GuiOptionEditorBoolean( + ConfigProcessor.ProcessedOption option, + int runnableId, + Config config + ) { super(option); - - bool = new GuiElementBoolean(0, 0, (boolean) option.get(), 10, option::set); + this.config = config; + this.runnableId = runnableId; + bool = new GuiElementBoolean(0, 0, (boolean) option.get(),10, (value) -> onUpdate(option, value)); } @Override @@ -34,4 +43,10 @@ public class GuiOptionEditorBoolean extends GuiOptionEditor { public boolean keyboardInput() { return false; } + + private void onUpdate(ConfigProcessor.ProcessedOption option, boolean value) { + if (option.set(value)) { + config.executeRunnable(runnableId); + } + } } 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 0d06980a..dddc14de 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 @@ -130,7 +130,8 @@ public class ConfigProcessor { } if (optionType.isAssignableFrom(boolean.class) && optionField.isAnnotationPresent(ConfigEditorBoolean.class)) { - editor = new GuiOptionEditorBoolean(option); + ConfigEditorBoolean configEditorAnnotation = optionField.getAnnotation(ConfigEditorBoolean.class); + editor = new GuiOptionEditorBoolean(option, configEditorAnnotation.runnableId(), config); } if (optionType.isAssignableFrom(boolean.class) && optionField.isAnnotationPresent(ConfigEditorAccordion.class)) { 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 9a4607ed..d7fd7907 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 @@ -228,7 +228,7 @@ public class RenderUtils { double d11 = 0.5D + Math.sin(d2 + 5.497787143782138D) * 0.2D; double d14 = -1.0D + d1; double d15 = (double) (height) * 2.5D + d14; - worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR); + worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR); worldrenderer.pos(x + d4, y + topOffset, z + d5).tex(1.0D, d15).color(r, g, b, 1.0F * alphaMult).endVertex(); worldrenderer.pos(x + d4, y + bottomOffset, z + d5).tex(1.0D, d14).color(r, g, b, 1.0F).endVertex(); worldrenderer.pos(x + d6, y + bottomOffset, z + d7).tex(0.0D, d14).color(r, g, b, 1.0F).endVertex(); @@ -251,7 +251,7 @@ public class RenderUtils { double d12 = -1.0D + d1; double d13 = height + d12; - worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR); + worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR); worldrenderer.pos(x + 0.2D, y + topOffset, z + 0.2D).tex(1.0D, d13).color(r, g, b, 0.25F * alphaMult).endVertex(); worldrenderer.pos(x + 0.2D, y + bottomOffset, z + 0.2D).tex(1.0D, d12).color(r, g, b, 0.25F).endVertex(); worldrenderer.pos(x + 0.8D, y + bottomOffset, z + 0.2D).tex(0.0D, d12).color(r, g, b, 0.25F).endVertex(); 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 eeb80abd..b86d5828 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/NEUEventListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/NEUEventListener.java @@ -212,7 +212,7 @@ public class NEUEventListener { if (longUpdate) { CrystalOverlay.tick(); - FairySouls.tick(); + FairySouls.getInstance().tick(); XPInformation.getInstance().tick(); ProfileApiSyncer.getInstance().tick(); ItemCustomizeManager.tick(); 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 725d4b9d..39ac1b22 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FairySouls.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FairySouls.java @@ -21,70 +21,301 @@ import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import java.io.*; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; +import java.util.TreeMap; import java.util.stream.Collectors; public class FairySouls { + private static FairySouls instance = null; private static final String unknownProfile = "unknown"; - private static List currentSoulList = null; - private static List currentSoulListClose = null; - private static HashMap>> loadedFoundSouls = new HashMap<>(); - private static HashMap> getFoundSoulsForProfile() { + private boolean trackSouls; + private boolean showSouls; + private HashMap>> allProfilesFoundSouls = new HashMap<>(); + private List allSoulsInCurrentLocation; + private Set foundSoulsInLocation; + private TreeMap missingSoulsDistanceSqMap; + private List closestMissingSouls; + private String currentLocation; + private BlockPos lastPlayerPos; + + public static FairySouls getInstance() { + if (instance == null) { + instance = new FairySouls(); + } + return instance; + } + + @SubscribeEvent + public void onWorldLoad(WorldEvent.Load event) { + currentLocation = null; + trackSouls = NotEnoughUpdates.INSTANCE.config.misc.trackFairySouls; + showSouls = NotEnoughUpdates.INSTANCE.config.misc.fariySoul; + } + + public void initializeLocation() { + if (!trackSouls || currentLocation == null) { + return; + } + + foundSoulsInLocation = null; + closestMissingSouls = new ArrayList<>(); + missingSoulsDistanceSqMap = new TreeMap<>(); + lastPlayerPos = BlockPos.ORIGIN; + + allSoulsInCurrentLocation = loadLocationFairySoulsFromConfig(currentLocation); + if (allSoulsInCurrentLocation == null) { + return; + } + + foundSoulsInLocation = getFoundSoulsForProfile() + .computeIfAbsent(currentLocation, k -> new HashSet<>()); + refreshMissingSoulInfo(true); + } + + private void refreshMissingSoulInfo(boolean force) { + if (allSoulsInCurrentLocation == null) return; + + BlockPos currentPlayerPos = Minecraft.getMinecraft().thePlayer.getPosition(); + if (lastPlayerPos.equals(currentPlayerPos) && !force) { + return; + } + lastPlayerPos = currentPlayerPos; + + missingSoulsDistanceSqMap.clear(); + for (int i = 0; i < allSoulsInCurrentLocation.size(); i++) { + if (foundSoulsInLocation.contains(i)) { + continue; + } + BlockPos pos = allSoulsInCurrentLocation.get(i); + double distSq = pos.distanceSq(lastPlayerPos); + missingSoulsDistanceSqMap.put(distSq, pos); + } + closestMissingSouls.clear(); + if (missingSoulsDistanceSqMap.isEmpty()) { + return; + } + + // rebuild the list of the closest ones + int maxSouls = 15; + int souls = 0; + for (BlockPos pos : missingSoulsDistanceSqMap.values()) { + closestMissingSouls.add(pos); + if (++souls >= maxSouls) break; + } + } + + private int interpolateColors(int color1, int color2, double factor) { + int r1 = ((color1 >> 16) & 0xff); + int g1 = ((color1 >> 8) & 0xff); + int b1 = (color1 & 0xff); + + int r2 = (color2 >> 16) & 0xff; + 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)); + + return (r3 & 0xff) << 16 | + (g3 & 0xff) << 8 | + (b3 & 0xff); } + + private double normalize(double value, double min, double max) { + return ((value - min) / (max - min)); + } + + @SubscribeEvent + public void onRenderLast(RenderWorldLastEvent event) { + if (!showSouls || !trackSouls || currentLocation == null || closestMissingSouls.isEmpty()) { + return; + } + + int closeColor = 0x772991; // 0xa839ce + int farColor = 0xCEB4D1; + 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); + int rgb = interpolateColors(closeColor, farColor, Math.min(0.40, factor)); + RenderUtils.renderBeaconBeamOrBoundingBox(currentSoul, rgb, 1.0f, event.partialTicks); + } + } + + public void setShowFairySouls(boolean enabled) { + NotEnoughUpdates.INSTANCE.config.misc.fariySoul = enabled; + showSouls = enabled; + } + + public void setTrackFairySouls(boolean enabled) { + NotEnoughUpdates.INSTANCE.config.misc.trackFairySouls = enabled; + trackSouls = enabled; + } + + public void markClosestSoulFound() { + if (!trackSouls) return; + int closestIndex = -1; + double closestDistSq = 10 * 10; + for (int i = 0; i < allSoulsInCurrentLocation.size(); i++) { + BlockPos pos = allSoulsInCurrentLocation.get(i); + + double distSq = pos.distanceSq(Minecraft.getMinecraft().thePlayer.getPosition()); + + if (distSq < closestDistSq) { + closestDistSq = distSq; + closestIndex = i; + } + } + if (closestIndex != -1) { + foundSoulsInLocation.add(closestIndex); + refreshMissingSoulInfo(true); + } + } + + public void markAllAsFound() { + if (!trackSouls) { + print(EnumChatFormatting.RED + "Fairy soul tracking is turned off, turn it on using /neu"); + return; + } + if (allSoulsInCurrentLocation == null) { + print(EnumChatFormatting.RED + "No fairy souls found in your current world"); + return; + } + for (int i = 0; i < allSoulsInCurrentLocation.size(); i++) { + foundSoulsInLocation.add(i); + } + refreshMissingSoulInfo(true); + + print(EnumChatFormatting.DARK_PURPLE + "Marked all fairy souls as found"); + } + + public void markAllAsMissing() { + if (!trackSouls) { + print(EnumChatFormatting.RED + "Fairy soul tracking is turned off, turn it on using /neu"); + return; + } + if (allSoulsInCurrentLocation == null) { + print(EnumChatFormatting.RED + "No fairy souls found in your current world"); + return; + } + foundSoulsInLocation.clear(); + refreshMissingSoulInfo(true); + + print(EnumChatFormatting.DARK_PURPLE + "Marked all fairy souls as not found"); + } + + private HashMap> getFoundSoulsForProfile() { String profile = SBInfo.getInstance().currentProfile; if (profile == null) { - if (loadedFoundSouls.containsKey(unknownProfile)) - return loadedFoundSouls.get(unknownProfile); + if (allProfilesFoundSouls.containsKey(unknownProfile)) + return allProfilesFoundSouls.get(unknownProfile); } else { profile = profile.toLowerCase(Locale.getDefault()); - if (loadedFoundSouls.containsKey(unknownProfile)) { - HashMap> unknownProfileData = loadedFoundSouls.remove(unknownProfile); - loadedFoundSouls.put(profile, unknownProfileData); + if (allProfilesFoundSouls.containsKey(unknownProfile)) { + HashMap> unknownProfileData = allProfilesFoundSouls.remove(unknownProfile); + allProfilesFoundSouls.put(profile, unknownProfileData); return unknownProfileData; } - if (loadedFoundSouls.containsKey(profile)) { - return loadedFoundSouls.get(profile); + if (allProfilesFoundSouls.containsKey(profile)) { + return allProfilesFoundSouls.get(profile); } else { - //create a new entry for this profile + // Create a new entry for this profile HashMap> profileData = new HashMap<>(); - loadedFoundSouls.put(profile, profileData); + allProfilesFoundSouls.put(profile, profileData); return profileData; } } return new HashMap<>(); } - public static void load(File file, Gson gson) { - loadedFoundSouls = new HashMap<>(); + private static List loadLocationFairySoulsFromConfig(String currentLocation) { + JsonObject fairySoulList = Constants.FAIRYSOULS; + if (fairySoulList == null) { + return null; + } + + if (!fairySoulList.has(currentLocation) || !fairySoulList.get(currentLocation).isJsonArray()) { + return null; + } + + JsonArray locations = fairySoulList.get(currentLocation).getAsJsonArray(); + List locationSouls = new ArrayList<>(); + for (int i = 0; i < locations.size(); i++) { + try { + String coord = locations.get(i).getAsString(); + + String[] split = coord.split(","); + if (split.length == 3) { + String xS = split[0]; + String yS = split[1]; + String zS = split[2]; + + int x = Integer.parseInt(xS); + int y = Integer.parseInt(yS); + int z = Integer.parseInt(zS); + + locationSouls.add(new BlockPos(x, y, z)); + } + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + if (locationSouls.size() == 0) { + return null; + } + + return locationSouls; + } + + public void loadFoundSoulsForAllProfiles(File file, Gson gson) { + allProfilesFoundSouls = new HashMap<>(); String fileContent; try { fileContent = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8)) .lines() .collect(Collectors.joining(System.lineSeparator())); } catch (FileNotFoundException e) { + // it is possible that the collected_fairy_souls.json won't exist return; } try { //noinspection UnstableApiUsage Type multiProfileSoulsType = new TypeToken>>>() {}.getType(); - loadedFoundSouls = gson.fromJson(fileContent, multiProfileSoulsType); + allProfilesFoundSouls = gson.fromJson(fileContent, multiProfileSoulsType); } catch (JsonSyntaxException e) { //The file is in the old format, convert it to the new one and set the profile to unknown try { //noinspection UnstableApiUsage Type singleProfileSoulsType = new TypeToken>>() {}.getType(); - loadedFoundSouls.put(unknownProfile, gson.fromJson(fileContent, singleProfileSoulsType)); + allProfilesFoundSouls.put(unknownProfile, gson.fromJson(fileContent, singleProfileSoulsType)); } catch (JsonSyntaxException e2) { System.err.println("Can't read file containing collected fairy souls, resetting."); } } } - public static void save(File file, Gson gson) { + public void saveFoundSoulsForAllProfiles(File file, Gson gson) { try { //noinspection ResultOfMethodCallIgnored file.createNewFile(); @@ -95,78 +326,24 @@ public class FairySouls { StandardCharsets.UTF_8 )) ) { - writer.write(gson.toJson(loadedFoundSouls)); + writer.write(gson.toJson(allProfilesFoundSouls)); } - } catch (IOException ignored) { + } catch (IOException e) { + e.printStackTrace(); } } - public static void tick() { - if (!NotEnoughUpdates.INSTANCE.config.misc.fariySoul) return; - - if (Minecraft.getMinecraft().theWorld == null) { - currentSoulList = null; - return; - } - - JsonObject fairySouls = Constants.FAIRYSOULS; - if (fairySouls == null) return; - + public void tick() { + if (!trackSouls) return; String location = SBInfo.getInstance().getLocation(); - if (location == null) { - currentSoulList = null; - return; - } + if (location == null || location.isEmpty()) return; - if (currentSoulList == null) { - if (fairySouls.has(location) && fairySouls.get(location).isJsonArray()) { - JsonArray locations = fairySouls.get(location).getAsJsonArray(); - currentSoulList = new ArrayList<>(); - for (int i = 0; i < locations.size(); i++) { - try { - String coord = locations.get(i).getAsString(); - - String[] split = coord.split(","); - if (split.length == 3) { - String xS = split[0]; - String yS = split[1]; - String zS = split[2]; - - int x = Integer.parseInt(xS); - int y = Integer.parseInt(yS); - int z = Integer.parseInt(zS); - - currentSoulList.add(new BlockPos(x, y, z)); - } - } catch (Exception ignored) { - } - } - } + if (!location.equals(currentLocation)) { + currentLocation = location; + initializeLocation(); } - if (currentSoulList != null && !currentSoulList.isEmpty()) { - TreeMap distanceSqMap = new TreeMap<>(); - - HashMap> foundSouls = getFoundSoulsForProfile(); - - Set found = foundSouls.computeIfAbsent(location, k -> new HashSet<>()); - - for (int i = 0; i < currentSoulList.size(); i++) { - if (found.contains(i)) continue; - - BlockPos pos = currentSoulList.get(i); - double distSq = pos.distanceSq(Minecraft.getMinecraft().thePlayer.getPosition()); - distanceSqMap.put(distSq, pos); - } - - int maxSouls = 15; - int souls = 0; - currentSoulListClose = new ArrayList<>(); - for (BlockPos pos : distanceSqMap.values()) { - currentSoulListClose.add(pos); - if (++souls >= maxSouls) break; - } - } + refreshMissingSoulInfo(false); } private static void print(String s) { @@ -186,63 +363,24 @@ public class FairySouls { } print(EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD + " Commands:"); print(EnumChatFormatting.YELLOW + "/neusouls help - Display this message"); - print(EnumChatFormatting.YELLOW + "/neusouls on/off - Enable/disable the waypoint markers"); + print(EnumChatFormatting.YELLOW + "/neusouls on/off - Enable/disable showing waypoint markers"); print(EnumChatFormatting.YELLOW + "/neusouls clear/unclear - Marks every waypoint in your current world as completed/uncompleted"); print(""); } - @SubscribeEvent - public void onWorldUnload(WorldEvent.Unload event) { - currentSoulList = null; - } - @SubscribeEvent public void onChatReceived(ClientChatReceivedEvent event) { - if (currentSoulList == null) return; - - if (event.message.getFormattedText().equals("\u00A7r\u00A7dYou have already found that Fairy Soul!\u00A7r") || - event.message.getFormattedText().equals( - "\u00A7d\u00A7lSOUL! \u00A7fYou found a \u00A7r\u00A7dFairy Soul\u00A7r\u00A7f!\u00A7r")) { - String location = SBInfo.getInstance().getLocation(); - if (location == null) return; - - int closestIndex = -1; - double closestDistSq = 10 * 10; - for (int i = 0; i < currentSoulList.size(); i++) { - BlockPos pos = currentSoulList.get(i); - - double distSq = pos.distanceSq(Minecraft.getMinecraft().thePlayer.getPosition()); - - if (distSq < closestDistSq) { - closestDistSq = distSq; - closestIndex = i; - } - } - if (closestIndex != -1) { - HashMap> foundSouls = getFoundSoulsForProfile(); - Set found = foundSouls.computeIfAbsent(location, k -> new HashSet<>()); - found.add(closestIndex); - } - } - } - - @SubscribeEvent - public void onRenderLast(RenderWorldLastEvent event) { - if (!NotEnoughUpdates.INSTANCE.config.misc.fariySoul) return; + if (!trackSouls || event.type == 2) return; - String location = SBInfo.getInstance().getLocation(); - if (location == null) return; - if (currentSoulList == null || currentSoulList.isEmpty()) return; - - int rgb = 0xa839ce; - for (BlockPos currentSoul : currentSoulListClose) { - RenderUtils.renderBeaconBeamOrBoundingBox(currentSoul, rgb, 1.0f, event.partialTicks); + if (event.message.getUnformattedText().equals("You have already found that Fairy Soul!") || + event.message.getUnformattedText().equals( + "SOUL! You found a Fairy Soul!")) { + markClosestSoulFound(); } } public static class FairySoulsCommand extends ClientCommandBase { - public FairySoulsCommand() { super("neusouls"); } @@ -258,73 +396,35 @@ public class FairySouls { printHelp(); return; } - String subcommand = args[0].toLowerCase(); + String subcommand = args[0].toLowerCase(); switch (subcommand) { case "help": printHelp(); - return; + break; case "on": case "enable": + if (!FairySouls.instance.trackSouls) { + 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"); - NotEnoughUpdates.INSTANCE.config.misc.fariySoul = true; - return; + FairySouls.getInstance().setShowFairySouls(true); + break; case "off": case "disable": + FairySouls.getInstance().setShowFairySouls(false); print(EnumChatFormatting.DARK_PURPLE + "Disabled fairy soul waypoints"); - NotEnoughUpdates.INSTANCE.config.misc.fariySoul = false; - return; - case "clear": { - String location = SBInfo.getInstance().getLocation(); - if (currentSoulList == null || location == null) { - print(EnumChatFormatting.RED + "No fairy souls found in your current world"); - } else { - HashMap> foundSouls = getFoundSoulsForProfile(); - Set found = foundSouls.computeIfAbsent(location, k -> new HashSet<>()); - for (int i = 0; i < currentSoulList.size(); i++) { - found.add(i); - } - String profileName = SBInfo.getInstance().currentProfile; - if (profileName == null) { - if (loadedFoundSouls.containsKey(unknownProfile)) { - loadedFoundSouls.get(unknownProfile).put(location, found); - } - } else { - profileName = profileName.toLowerCase(); - if (!loadedFoundSouls.containsKey(profileName)) { - HashMap> profileData = new HashMap<>(); - loadedFoundSouls.put(profileName, profileData); - } - loadedFoundSouls.get(profileName).put(location, found); - } - print(EnumChatFormatting.DARK_PURPLE + "Marked all fairy souls as found"); - } - } - return; + break; + case "clear": + FairySouls.getInstance().markAllAsFound(); + break; case "unclear": - String location = SBInfo.getInstance().getLocation(); - if (location == null) { - print(EnumChatFormatting.RED + "No fairy souls found in your current world"); - } else { - String profileName = SBInfo.getInstance().currentProfile; - if (profileName == null) { - if (loadedFoundSouls.containsKey(unknownProfile)) { - loadedFoundSouls.get(unknownProfile).remove(location); - } - } else { - profileName = profileName.toLowerCase(); - if (!loadedFoundSouls.containsKey(profileName)) { - HashMap> profileData = new HashMap<>(); - loadedFoundSouls.put(profileName, profileData); - } - loadedFoundSouls.get(profileName).remove(location); - } - print(EnumChatFormatting.DARK_PURPLE + "Marked all fairy souls as not found"); - } - return; + FairySouls.getInstance().markAllAsMissing(); + break; + default: + print(EnumChatFormatting.RED + "Unknown subcommand: " + subcommand); } - - print(EnumChatFormatting.RED + "Unknown subcommand: " + subcommand); } } } 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 25c47fce..2fba6e80 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java @@ -8,6 +8,7 @@ import io.github.moulberry.notenoughupdates.core.config.Config; import io.github.moulberry.notenoughupdates.core.config.Position; import io.github.moulberry.notenoughupdates.core.config.annotations.Category; import io.github.moulberry.notenoughupdates.core.config.gui.GuiPositionEditor; +import io.github.moulberry.notenoughupdates.miscfeatures.FairySouls; import io.github.moulberry.notenoughupdates.miscgui.GuiEnchantColour; import io.github.moulberry.notenoughupdates.miscgui.GuiInvButtonEditor; import io.github.moulberry.notenoughupdates.miscgui.NEUOverlayPlacements; @@ -78,6 +79,8 @@ public class NEUConfig extends Config { } switch (runnableId) { + case -1: + return; case 0: ClientCommandHandler.instance.executeCommand(Minecraft.getMinecraft().thePlayer, "/neumap"); return; @@ -129,6 +132,10 @@ public class NEUConfig extends Config { case 14: editOverlay(activeConfigCategory, OverlayManager.fishingSkillOverlay, skillOverlays.fishingPosition); return; + case 15: + String command = NotEnoughUpdates.INSTANCE.config.misc.fariySoul ? "/neusouls on" : "/neusouls off"; + ClientCommandHandler.instance.executeCommand(Minecraft.getMinecraft().thePlayer, command); + return; case 16: ClientCommandHandler.instance.executeCommand(Minecraft.getMinecraft().thePlayer, "/neusouls clear"); return; @@ -140,7 +147,9 @@ public class NEUConfig extends Config { return; case 19: editOverlay(activeConfigCategory, OverlayManager.combatSkillOverlay, skillOverlays.combatPosition); - + return; + case 20: + FairySouls.getInstance().setTrackFairySouls(NotEnoughUpdates.INSTANCE.config.misc.trackFairySouls); } } 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 48410404..631ce545 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 @@ -36,17 +36,28 @@ public class Misc { public boolean fariySoulAccordion = false; @Expose @ConfigOption( - name = "Fairy Souls Finder", - desc = "Shows waypoints to fairy souls (/neusouls)" + name = "Track Fairy Souls", + desc = "Track Found Fairy Souls" + ) + @ConfigEditorBoolean(runnableId = 20) + @ConfigAccordionId(id = 0) + public boolean trackFairySouls = true; + + @Expose + @ConfigOption( + name = "Show Waypoints", + desc = "Show Fairy Soul Waypoints (Requires fairy soul tracking)" + ) + @ConfigEditorBoolean( + runnableId = 15 ) - @ConfigEditorBoolean @ConfigAccordionId(id = 0) public boolean fariySoul = false; @Expose @ConfigOption( - name = "Clear Fairy Souls", - desc = "Clears waypoints to fairy souls (/neusouls clear)" + name = "Mark All As Found", + desc = "Mark all fairy souls in current location as found" ) @ConfigEditorButton( runnableId = 16, @@ -57,8 +68,8 @@ public class Misc { @Expose @ConfigOption( - name = "Unclear Fairy Souls", - desc = "Shows all waypoints to fairy souls (/neusouls unclear)" + name = "Mark All As Missing", + desc = "Mark all fairy souls in current location as missing" ) @ConfigEditorButton( runnableId = 17, -- cgit From 9fe86ccb4d30b78826e513a6576027ca6e4c1600 Mon Sep 17 00:00:00 2001 From: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> Date: Mon, 18 Apr 2022 10:54:18 +0000 Subject: Fixed stuff from the project board (#112) * Fix /et not closing when clicking inventory keybind * Made it so calendar timer in inventory works if you have no event data * Made it if you hold shift in the enchant solvers it overrides prevent missclicks * Revert "Made it so calendar timer in inventory works if you have no event data" This reverts commit d2ee3ebc679da5a231d35a9d54eb10c701daff1d. * made crash not crash * consistency fixes for my heart * fix https://cdn.discordapp.com/attachments/832652653292027904/964353119557394462/unknown.png * fix https://i.imgur.com/Z3qChN3.png Co-authored-by: jani270 --- Update Notes/2.1.md | 2 ++ .../io/github/moulberry/notenoughupdates/NEUOverlay.java | 4 ++-- .../notenoughupdates/listener/ItemTooltipListener.java | 2 +- .../notenoughupdates/miscfeatures/EnchantingSolvers.java | 5 +++-- .../notenoughupdates/miscgui/AccessoryBagOverlay.java | 2 +- .../notenoughupdates/miscgui/CalendarOverlay.java | 15 +++++++++++++++ .../notenoughupdates/miscgui/GuiCustomEnchant.java | 1 + .../options/seperateSections/AHGraph.java | 2 +- .../options/seperateSections/CustomArmour.java | 4 ++-- .../options/seperateSections/PetOverlay.java | 6 +++--- .../options/seperateSections/StorageGUI.java | 2 +- 11 files changed, 32 insertions(+), 13 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index cb117f31..18a4ba8a 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -78,6 +78,7 @@ - Added a subcommand to /neupackdev to get the NBT of the closest mob, armor stand, and npc in a radius in the loaded world - whalker - 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 ### **Bug Fixes:** - Fix wiki pages freezing the entire game - nea89 - Made titanium overlay and waypoints work with dwarven overlay off @@ -105,6 +106,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 ### **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 75bff803..7965abae 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java @@ -775,8 +775,8 @@ public class NEUOverlay extends Gui { displayInformationPane(new TextInfoPane( this, manager, - "Loading", - "Loading your requested information about " + name + "." + EnumChatFormatting.GRAY + "Loading", + EnumChatFormatting.GRAY + "Loading your requested information about " + name + EnumChatFormatting.GRAY + "." )); infoPaneLoadingJob = InfoPane.create(this, manager, infoType, name, internalname, infoText) .thenAccept(this::displayInformationPane); 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 52729143..cc2b11e8 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java @@ -929,7 +929,7 @@ public class ItemTooltipListener { } else if (NotEnoughUpdates.INSTANCE.packDevEnabled) { event.toolTip.add(""); event.toolTip.add(EnumChatFormatting.AQUA + "NEU Pack Dev Info:"); - event.toolTip.add("Press " + EnumChatFormatting.GOLD + "[KEY]" + EnumChatFormatting.GRAY + " to copy line"); + event.toolTip.add(EnumChatFormatting.GRAY + "Press " + EnumChatFormatting.GOLD + "[KEY]" + EnumChatFormatting.GRAY + " to copy line"); String internal = NotEnoughUpdates.INSTANCE.manager.getInternalNameForItem(event.itemStack); 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 16b59b05..83a68915 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/EnchantingSolvers.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/EnchantingSolvers.java @@ -17,6 +17,7 @@ import net.minecraftforge.client.event.GuiOpenEvent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; +import org.lwjgl.input.Keyboard; import java.util.*; @@ -325,7 +326,7 @@ public class EnchantingSolvers { if (chronomatronReplayIndex < chronomatronOrder.size()) { String chronomatronCurrent = chronomatronOrder.get(chronomatronReplayIndex); if (!NotEnoughUpdates.INSTANCE.config.enchantingSolvers.preventMisclicks1 || - chronomatronCurrent.equals(displayName)) { + chronomatronCurrent.equals(displayName) || Keyboard.getEventKey() == Keyboard.KEY_LSHIFT) { chronomatronReplayIndex++; Minecraft.getMinecraft().playerController.windowClick(windowId, slotId, 2, mode, Minecraft.getMinecraft().thePlayer @@ -356,7 +357,7 @@ public class EnchantingSolvers { long currentTime = System.currentTimeMillis(); if (currentTime - millisLastClick > 150 && (!NotEnoughUpdates.INSTANCE.config.enchantingSolvers.preventMisclicks1 || - current.containerIndex == slotId)) { + current.containerIndex == slotId || Keyboard.getEventKey() == Keyboard.KEY_LSHIFT)) { ultrasequencerReplayIndex++; Minecraft.getMinecraft().playerController.windowClick(windowId, slotId, 2, mode, Minecraft.getMinecraft().thePlayer diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/AccessoryBagOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/AccessoryBagOverlay.java index f2205c49..95e21cd0 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/AccessoryBagOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/AccessoryBagOverlay.java @@ -836,7 +836,7 @@ public class AccessoryBagOverlay { GuiChest eventGui = (GuiChest) Minecraft.getMinecraft().currentScreen; ContainerChest cc = (ContainerChest) eventGui.inventorySlots; String containerName = cc.getLowerChestInventory().getDisplayName().getUnformattedText(); - if (containerName.trim().startsWith("Accessory Bag")) { + if (containerName.trim().startsWith("Accessory Bag") && !containerName.contains("Thaumaturgy") && !containerName.contains("Upgrades")) { inAccessoryBag = true; try { int xSize = (int) Utils.getField(GuiContainer.class, eventGui, "xSize", "field_146999_f"); 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 98d8f11d..a9cf44c4 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/CalendarOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/CalendarOverlay.java @@ -1000,6 +1000,21 @@ public class CalendarOverlay { GlStateManager.translate(0, 0, -100); } } + } else if (!enabled && NotEnoughUpdates.INSTANCE.config.calendar.showEventTimerInInventory) { + FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; + + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.disableFog(); + GlStateManager.disableLighting(); + GlStateManager.disableColorMaterial(); + + renderBlurredBackground(10, width, height, guiLeft + 3, guiTop + 3, xSize - 6, ySize - 6); + + Minecraft.getMinecraft().getTextureManager().bindTexture(DISPLAYBAR); + Utils.drawTexturedRect(guiLeft, guiTop, xSize, 20, GL11.GL_NEAREST); + + String nextS = EnumChatFormatting.RED + "Open calendar to see events"; + fr.drawString(nextS, guiLeft + 8, guiTop + 6, -1, false); } } GlStateManager.translate(0, 0, -10); 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 f5838052..25869452 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.java @@ -1899,6 +1899,7 @@ public class GuiCustomEnchant extends Gui { } return Keyboard.getEventKey() != Keyboard.KEY_ESCAPE && + Keyboard.getEventKey() != Minecraft.getMinecraft().gameSettings.keyBindInventory.getKeyCode() && (!NotEnoughUpdates.INSTANCE.config.slotLocking.enableSlotLocking || Keyboard.getEventKey() != NotEnoughUpdates.INSTANCE.config.slotLocking.slotLockKey); } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHGraph.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHGraph.java index 8d3acaf9..ad96f744 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHGraph.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHGraph.java @@ -27,7 +27,7 @@ public class AHGraph { desc = "Change the style of the graph GUI" ) @ConfigEditorDropdown( - values = {"Minecraft", "Dark", "PacksHQ Dark", "FSR"} + values = {"Minecraft", "Grey", "PacksHQ Dark", "FSR"} ) public int graphStyle = 0; 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 57a5e1d7..f1b2338f 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 @@ -25,11 +25,11 @@ public class CustomArmour { @Expose @ConfigOption( - name = "GUI Colour", + name = "GUI Style", desc = "Change the colour of the GUI" ) @ConfigEditorDropdown( - values = {"Vanilla", "Grey", "Dark", "Transparent", "FSR"} + values = {"Minecraft", "Grey", "PacksHQ Dark", "Transparent", "FSR"} ) public int colourStyle = 0; 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 1cef5faf..6f96e972 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 @@ -62,7 +62,7 @@ public class PetOverlay { desc = "Change the style of the Pet Info overlay" ) @ConfigEditorDropdown( - values = {"Background", "No Shadow", "Shadow Only", "Full Shadow"} + values = {"Background", "No Shadow", "Shadow", "Full Shadow"} ) public int petInfoOverlayStyle = 0; @@ -84,11 +84,11 @@ public class PetOverlay { @Expose @ConfigOption( - name = "GUI Colour", + name = "GUI Style", desc = "Change the colour of the GUI" ) @ConfigEditorDropdown( - values = {"Vanilla", "Grey", "Dark", "Transparent", "FSR"} + values = {"Minecraft", "Grey", "PacksHQ Dark", "Transparent", "FSR"} ) public int colourStyle = 0; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/StorageGUI.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/StorageGUI.java index 2e765777..bdc9ee1b 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/StorageGUI.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/StorageGUI.java @@ -54,7 +54,7 @@ public class StorageGUI { desc = "Change the visual style of the overlay" ) @ConfigEditorDropdown( - values = {"Transparent", "Minecraft", "Dark", "Custom"} + values = {"Transparent", "Minecraft", "Grey", "Custom"} ) @ConfigAccordionId(id = 1) public int displayStyle = 0; -- 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 'Update Notes/2.1.md') 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 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 mapper) { + return getJsonArrayAsStream(array).map(mapper).collect(Collectors.toList()); + } + + public static List getJsonArrayOrEmpty(JsonObject rootObject, String name, Function 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 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 79bc28639e966415a97b1f21dd11617c6a4e0215 Mon Sep 17 00:00:00 2001 From: Cobble8 <41165207+Cobble8@users.noreply.github.com> Date: Wed, 27 Apr 2022 14:56:23 -0400 Subject: HEAVY PEARL TODO TIMER THING (#120) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * HEAVY PEARL TODO TIMER THING yay hopefully this works idk don't wanna wait 21 hours to test it again but Im pretty confident it works * fix bad change thing hopefully idk maybe * fix formatting + 2.1.md 🙂 * fix formatting * fixed heavy pearls overriding gemstone powder Co-authored-by: NopoTheGamer --- Update Notes/2.1.md | 1 + .../notenoughupdates/listener/ChatListener.java | 2 + .../listener/ScoreboardLocationChangeListener.java | 30 ++++++++ .../notenoughupdates/options/NEUConfig.java | 2 + .../options/seperateSections/MiscOverlays.java | 16 +++- .../notenoughupdates/overlays/TimersOverlay.java | 86 +++++++++++++++++++++- .../moulberry/notenoughupdates/util/SBInfo.java | 5 +- 7 files changed, 138 insertions(+), 4 deletions(-) create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/listener/ScoreboardLocationChangeListener.java (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index dff52a65..aa8cd3f2 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -80,6 +80,7 @@ - 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 Heavy Pearls to todo overlay - cobble8 ### **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/listener/ChatListener.java b/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java index d40a39f1..060dcb80 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java @@ -6,6 +6,7 @@ import io.github.moulberry.notenoughupdates.miscfeatures.CrystalMetalDetectorSol import io.github.moulberry.notenoughupdates.miscfeatures.StreamerMode; import io.github.moulberry.notenoughupdates.overlays.OverlayManager; import io.github.moulberry.notenoughupdates.overlays.SlayerOverlay; +import io.github.moulberry.notenoughupdates.overlays.TimersOverlay; import io.github.moulberry.notenoughupdates.util.SBInfo; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; @@ -122,6 +123,7 @@ public class ChatListener { public void onGuiChat(ClientChatReceivedEvent e) { if (e.type == 2) { CrystalMetalDetectorSolver.process(e.message); + TimersOverlay.processActionBar(e.message.getUnformattedText()); e.message = processChatComponent(e.message); return; } else if (e.type == 0) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/listener/ScoreboardLocationChangeListener.java b/src/main/java/io/github/moulberry/notenoughupdates/listener/ScoreboardLocationChangeListener.java new file mode 100644 index 00000000..2f4ec33c --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ScoreboardLocationChangeListener.java @@ -0,0 +1,30 @@ +package io.github.moulberry.notenoughupdates.listener; + +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.overlays.TimersOverlay; + +public class ScoreboardLocationChangeListener { + + public ScoreboardLocationChangeListener(String oldLocation, String newLocation) { + if (oldLocation.equals("Belly of the Beast") && newLocation.equals("Matriarchs Lair")) { + //Check inventory pearl count for AFTER they complete to see if it is the same as before + (amount available on actionbar) + Thread thread = new Thread(() -> { + try { + Thread.sleep(3000); + TimersOverlay.afterPearls = TimersOverlay.heavyPearlCount(); + //Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW+"You exited the beast with ["+EnumChatFormatting.AQUA+(TimersOverlay.afterPearls-TimersOverlay.beforePearls)+EnumChatFormatting.YELLOW+"/"+EnumChatFormatting.AQUA+TimersOverlay.availablePearls+EnumChatFormatting.YELLOW+"] Heavy Pearls!")); + if (TimersOverlay.afterPearls - TimersOverlay.beforePearls == TimersOverlay.availablePearls) { + NotEnoughUpdates.INSTANCE.config.getProfileSpecific().dailyHeavyPearlCompleted = System.currentTimeMillis(); + //Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN+"Daily "+EnumChatFormatting.DARK_AQUA+"Heavy Pearls"+EnumChatFormatting.GREEN+" Complete!")); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + }); + thread.start(); + } else if (oldLocation.equals("Matriarchs Lair") && newLocation.equals("Belly of the Beast")) { + //Check inventory pearl count BEFORE they complete so we can later check if it is complete. + TimersOverlay.beforePearls = TimersOverlay.heavyPearlCount(); + } + } +} 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 68449ba8..5c766254 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java @@ -510,6 +510,8 @@ public class NEUConfig extends Config { public long dailyGemstonePowderCompleted = 0L; @Expose public long dailyMithrilPowerCompleted = 0L; + @Expose + public long dailyHeavyPearlCompleted = 0L; } public HiddenLocationSpecific getLocationSpecific() { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/MiscOverlays.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/MiscOverlays.java index 849f5823..616e8188 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/MiscOverlays.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/MiscOverlays.java @@ -42,10 +42,11 @@ public class MiscOverlays { "\u00a73Experiments: \u00a7e3h38m", "\u00a73Daily Mithril Powder: \u00a7e3h38m", "\u00a73Daily Gemstone Powder: \u00a7e3h38m", + "\u00a73Daily Heavy Pearls: \u00a7e3h38m", } ) @ConfigAccordionId(id = 0) - public List todoText2 = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8)); + public List todoText2 = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)); @ConfigOption( name = "Show Only If Soon", @@ -163,6 +164,19 @@ public class MiscOverlays { ) public int dailyGemstonePowderDisplay = 0; + @Expose + @ConfigOption( + name = "Daily Heavy Pearl Display", + desc = "Change the way the daily heavy pearl displays\n" + + "Only when ready, When very Soon, When soon, When kinda soon or always." + ) + @ConfigAccordionId(id = 1) + @ConfigEditorDropdown( + values = {"Only when ready", "When very Soon", "When soon", "When Kinda Soon", "Always"} + ) + + public int dailyHeavyPearlDisplay = 0; + @ConfigOption( name = "Colours", desc = "" 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 ede30448..59a77ea3 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/TimersOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/TimersOverlay.java @@ -13,6 +13,7 @@ import net.minecraft.init.Items; import net.minecraft.inventory.ContainerChest; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; import net.minecraftforge.client.event.ClientChatReceivedEvent; import net.minecraftforge.fml.common.eventhandler.EventPriority; @@ -186,6 +187,11 @@ public class TimersOverlay extends TextOverlay { .getItemInformation() .get("PERFECT_AMETHYST_GEM")); break; + case "Daily Heavy Pearls": + icon = NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager + .getItemInformation() + .get("HEAVY_PEARL")); + break; } if (icon != null) { @@ -529,6 +535,7 @@ public class TimersOverlay extends TextOverlay { } long midnightReset = (currentTime - 18000000) / 86400000 * 86400000 + 18000000; // 12am est + long pearlsReset = midnightReset - 14400000 + 86400000; //8pm est long catacombsReset = currentTime / 86400000 * 86400000; // 7pm est long timeDiffMidnightNow = midnightReset + 86400000 - currentTime; long catacombsDiffNow = catacombsReset + 86400000 - currentTime; @@ -743,6 +750,49 @@ public class TimersOverlay extends TextOverlay { ); } + //Daily Heavy Pearl Display + if (hidden.dailyHeavyPearlCompleted < pearlsReset) { + map.put( + 9, + DARK_AQUA + "Daily Heavy Pearls: " + + EnumChatFormatting.values()[NotEnoughUpdates.INSTANCE.config.miscOverlays.readyColour] + "Ready!" + ); + } else if ( + NotEnoughUpdates.INSTANCE.config.miscOverlays.dailyHeavyPearlDisplay >= DISPLAYTYPE.VERYSOON.ordinal() && + (hidden.dailyHeavyPearlCompleted < (pearlsReset - TimeEnums.HALFANHOUR.time))) { + map.put( + 9, + DARK_AQUA + "Daily Heavy Pearls: " + + EnumChatFormatting.values()[NotEnoughUpdates.INSTANCE.config.miscOverlays.verySoonColour] + + Utils.prettyTime(pearlsReset + 86400000 - currentTime) + ); + } else if (NotEnoughUpdates.INSTANCE.config.miscOverlays.dailyHeavyPearlDisplay >= DISPLAYTYPE.SOON.ordinal() && + (hidden.dailyHeavyPearlCompleted < (pearlsReset - TimeEnums.HOUR.time))) { + map.put( + 9, + DARK_AQUA + "Daily Heavy Pearls: " + + EnumChatFormatting.values()[NotEnoughUpdates.INSTANCE.config.miscOverlays.soonColour] + + Utils.prettyTime(pearlsReset + 86400000 - currentTime) + ); + } else if ( + NotEnoughUpdates.INSTANCE.config.miscOverlays.dailyHeavyPearlDisplay >= DISPLAYTYPE.KINDASOON.ordinal() && + (hidden.dailyHeavyPearlCompleted < (pearlsReset - (TimeEnums.HOUR.time * 3)))) { + map.put( + 9, + DARK_AQUA + "Daily Heavy Pearls: " + + EnumChatFormatting.values()[NotEnoughUpdates.INSTANCE.config.miscOverlays.kindaSoonColour] + + Utils.prettyTime(pearlsReset + 86400000 - currentTime) + ); + } else if (NotEnoughUpdates.INSTANCE.config.miscOverlays.dailyHeavyPearlDisplay >= + DISPLAYTYPE.ALWAYS.ordinal()) { + map.put( + 9, + DARK_AQUA + "Daily Heavy Pearls: " + + EnumChatFormatting.values()[NotEnoughUpdates.INSTANCE.config.miscOverlays.defaultColour] + + Utils.prettyTime(pearlsReset + 86400000 - currentTime) + ); + } + overlayStrings = new ArrayList<>(); for (int index : NotEnoughUpdates.INSTANCE.config.miscOverlays.todoText2) { if (map.containsKey(index)) { @@ -752,8 +802,40 @@ public class TimersOverlay extends TextOverlay { if (overlayStrings.isEmpty()) overlayStrings = null; } - public String compactRemaining(int amount) { - return (5 - amount) + " remaining"; + public static int beforePearls = -1; + public static int afterPearls = -1; + public static int availablePearls = -1; + public static int heavyPearlCount() { + int heavyPearls = 0; + + List inventory = Minecraft.getMinecraft().thePlayer.inventoryContainer.getInventory(); + for (ItemStack item : inventory) { + if (item == null) { + continue; + } else if (!item.hasTagCompound()) { + continue; + } + NBTTagCompound itemData = item.getSubCompound("ExtraAttributes", false); + if (itemData == null) { + continue; + } + if (itemData.getString("id").equals("HEAVY_PEARL")) { + heavyPearls += item.stackSize; + } + } + return heavyPearls; + } + + public static void processActionBar(String msg) { + if(SBInfo.getInstance().location.equals("Belly of the Beast")) { + try { + msg = Utils.cleanColour(msg); + msg = msg.substring(msg.indexOf("Pearls Collected: ")+18); + availablePearls = Integer.parseInt(msg.substring(msg.indexOf("/")+1)); + } catch(Exception e) { + e.printStackTrace(); + } + } } private enum TimeEnums { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java b/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java index f1e40671..6519d547 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java @@ -3,6 +3,7 @@ package io.github.moulberry.notenoughupdates.util; import com.google.common.reflect.TypeToken; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.listener.ScoreboardLocationChangeListener; import io.github.moulberry.notenoughupdates.miscfeatures.customblockzones.LocationChangeEvent; import io.github.moulberry.notenoughupdates.overlays.SlayerOverlay; import net.minecraft.client.Minecraft; @@ -367,7 +368,9 @@ public class SBInfo { //Replaced with for loop because in crystal hollows with events the line it's on can shift. for (String line : lines) { if (line.contains("⏣")) { - location = Utils.cleanColour(line).replaceAll("[^A-Za-z0-9() ]", "").trim(); + String l = Utils.cleanColour(line).replaceAll("[^A-Za-z0-9() ]", "").trim(); + if(!l.equals(location)) { new ScoreboardLocationChangeListener(location, l); } + location = l; break; } } -- 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 'Update Notes/2.1.md') 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 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 'Update Notes/2.1.md') 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 c697563d4d8d596d65dbc91d82d7c0a9f10a25d4 Mon Sep 17 00:00:00 2001 From: Lulonaut <67191924+Lulonaut@users.noreply.github.com> Date: Tue, 17 May 2022 18:02:09 +0200 Subject: Improve item editor (#137) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Intellij insurance * Only parse inventory in essence guide * Save mobs with whitespaces correctly * npe when currentProfile is null * ??? * 🧌 * 🤡 * Fixed crash with spamming remove enchant in /neuec - thank you lulo for free pr to commit to * added command to toggle repo autoupdating * i am so good at patch note * i used the github web editor for this * i double checked the brackets and everything * don't even look at it (this is only ran with dev mode enabled) * more readable Co-authored-by: NopoTheGamer Co-authored-by: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> --- Update Notes/2.1.md | 3 +- .../moulberry/notenoughupdates/NEUOverlay.java | 12 +- .../commands/repo/RepoModeCommand.java | 6 +- .../notenoughupdates/itemeditor/NEUItemEditor.java | 163 +++++++++++++-------- .../notenoughupdates/listener/RenderListener.java | 69 ++++++++- .../notenoughupdates/miscgui/GuiEnchantColour.java | 10 +- .../notenoughupdates/recipes/RecipeGenerator.java | 8 +- 7 files changed, 193 insertions(+), 78 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 2ea1bef0..c8f97357 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -38,7 +38,7 @@ - Added a help menu to /neuec - Made it so treecap shows foraging xp instead of farming xp on the farming overlay - Made it so a jungle axe with cult will show the "farming" overlay -- Added /neurepomode to toggle item editing and dev mode, and changing the item repo url +- 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 @@ -113,6 +113,7 @@ - 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 - 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 diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java index ff8187f2..fcdb9b9c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java @@ -80,6 +80,7 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.TreeSet; import java.util.UUID; @@ -1135,8 +1136,9 @@ public class NEUOverlay extends Gui { if (internalname.get() != null) { if (itemstack.get() != null) { if (NotEnoughUpdates.INSTANCE.config.hidden.enableItemEditing && Keyboard.getEventCharacter() == 'k') { - Minecraft.getMinecraft().displayGuiScreen(new NEUItemEditor(manager, - internalname.get(), manager.getJsonForItem(itemstack.get()) + Minecraft.getMinecraft().displayGuiScreen(new NEUItemEditor( + internalname.get(), + manager.getJsonForItem(itemstack.get()) )); return true; } @@ -1159,9 +1161,7 @@ public class NEUOverlay extends Gui { } } else if (NotEnoughUpdates.INSTANCE.config.hidden.enableItemEditing && Keyboard.getEventCharacter() == 'k') { - Minecraft.getMinecraft().displayGuiScreen(new NEUItemEditor(manager, - internalname.get(), item - )); + Minecraft.getMinecraft().displayGuiScreen(new NEUItemEditor(internalname.get(), item)); return true; } else if (keyPressed == manager.keybindItemSelect.getKeyCode() && NotEnoughUpdates.INSTANCE.config.toolbar.searchBar) { @@ -1880,7 +1880,7 @@ public class NEUOverlay extends Gui { private String lastProfile; private ItemStack getWardrobeSlot(int armourSlot) { - if (!SBInfo.getInstance().currentProfile.equals(lastProfile)) { + if (!Objects.equals(SBInfo.getInstance().currentProfile, lastProfile)) { lastProfile = SBInfo.getInstance().currentProfile; slot1 = null; slot2 = null; 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 46156a47..7e5312fb 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 @@ -47,10 +47,14 @@ public class RepoModeCommand extends ClientCommandBase { ClickEvent.Action.SUGGEST_COMMAND, "/neureloadrepo fetch")))) .appendSibling(new ChatComponentText("\u00a75> to redownload your repo."))); + } else if (args.length == 1 && args[0].equalsIgnoreCase("autoupdate")) { + NotEnoughUpdates.INSTANCE.config.hidden.autoupdate = !NotEnoughUpdates.INSTANCE.config.hidden.autoupdate; + Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("\u00a75Toggled repo auto-updating" + (NotEnoughUpdates.INSTANCE.config.hidden.autoupdate ? "on" : "off"))); } else { Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("\u00a7cUsage:" + "\n\u00a75/neurepomode Toggles on/off dev mode and item editing." + - "\n\u00a75/neurepomode [reponame] [branch] Sets the repo URL for downloading from.")); + "\n\u00a75/neurepomode [reponame] [branch] Sets the repo URL for downloading from." + + "\n\u00a75/neurepomode Toggles on/off auto-updating the repo")); } } } 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 f2edf8bd..7e776bcd 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/NEUItemEditor.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/NEUItemEditor.java @@ -1,8 +1,9 @@ package io.github.moulberry.notenoughupdates.itemeditor; import com.google.gson.JsonArray; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import io.github.moulberry.notenoughupdates.NEUManager; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.core.util.lerp.LerpingInteger; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; @@ -38,114 +39,153 @@ import static io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextFiel import static io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField.NUM_ONLY; public class NEUItemEditor extends GuiScreen { - private final NEUManager manager; - private final List options = new ArrayList<>(); private final List rightOptions = new ArrayList<>(); - private final JsonObject item; + private JsonObject item; + private final JsonObject savedRepoItem; private static final int PADDING = 10; private static final int SCROLL_AMOUNT = 20; private final LerpingInteger scrollHeight = new LerpingInteger(0); - private final Supplier internalname; - private final Supplier itemid; - private final Supplier displayname; + private final Supplier internalName; + private final Supplier itemId; + private final Supplier displayName; private final Supplier lore; - private final Supplier crafttext; + private final Supplier craftText; private final Supplier infoType; private final Supplier info; - private final Supplier clickcommand; + private final Supplier clickCommand; private final Supplier damage; - private NBTTagCompound nbttag; - private boolean hasChanges = false; + private NBTTagCompound nbtTag; + private int saved = 0; - public NEUItemEditor(NEUManager manager, String internalname, JsonObject item) { - this.manager = manager; + public NEUItemEditor(String internalName, JsonObject item) { this.item = item; - if (item.has("nbttag")) { try { - nbttag = JsonToNBT.getTagFromJson(item.get("nbttag").getAsString()); + nbtTag = JsonToNBT.getTagFromJson(item.get("nbttag").getAsString()); } catch (NBTException ignored) { } } + nbtTag.getCompoundTag("ExtraAttributes").removeTag("uuid"); + nbtTag.getCompoundTag("ExtraAttributes").removeTag("timestamp"); + + savedRepoItem = NotEnoughUpdates.INSTANCE.manager.getItemInformation().getOrDefault(internalName, null); - internalname = internalname == null ? "" : internalname; + internalName = internalName == null ? "" : internalName; options.add(new GuiElementText("Internal Name: ", Color.WHITE.getRGB())); - this.internalname = addTextFieldWithSupplier(internalname, NO_SPACE | FORCE_CAPS); + this.internalName = addTextFieldWithSupplier(internalName, NO_SPACE | FORCE_CAPS); options.add(new GuiElementText("Item ID: ", Color.WHITE.getRGB())); String itemid = item.has("itemid") ? item.get("itemid").getAsString() : ""; - this.itemid = addTextFieldWithSupplier(itemid, NO_SPACE); + this.itemId = addTextFieldWithSupplier(itemid, NO_SPACE); options.add(new GuiElementText("Display name: ", Color.WHITE.getRGB())); String displayname = item.has("displayname") ? item.get("displayname").getAsString() : ""; - this.displayname = addTextFieldWithSupplier(displayname, COLOUR); + this.displayName = addTextFieldWithSupplier(displayname, COLOUR); options.add(new GuiElementText("Lore: ", Color.WHITE.getRGB())); - JsonArray lore = item.has("lore") ? item.get("lore").getAsJsonArray() : new JsonArray(); + JsonElement loreElement = getItemInfo("lore"); + JsonArray lore = loreElement != null ? loreElement.getAsJsonArray() : new JsonArray(); String[] loreA = new String[lore.size()]; for (int i = 0; i < lore.size(); i++) loreA[i] = lore.get(i).getAsString(); this.lore = addTextFieldWithSupplier(String.join("\n", loreA), COLOUR | MULTILINE); options.add(new GuiElementText("Craft text: ", Color.WHITE.getRGB())); - String crafttext = item.has("crafttext") ? item.get("crafttext").getAsString() : ""; - this.crafttext = addTextFieldWithSupplier(crafttext, COLOUR); + JsonElement craftTextElement = getItemInfo("crafttext"); + String craftText = craftTextElement != null ? craftTextElement.getAsString() : ""; + this.craftText = addTextFieldWithSupplier(craftText, COLOUR); options.add(new GuiElementText("Info type: ", Color.WHITE.getRGB())); - String infoType = item.has("infoType") ? item.get("infoType").getAsString() : ""; + JsonElement infoTypeElement = getItemInfo("infoType"); + String infoType = infoTypeElement != null ? infoTypeElement.getAsString() : ""; this.infoType = addTextFieldWithSupplier(infoType, NO_SPACE | FORCE_CAPS); options.add(new GuiElementText("Additional information: ", Color.WHITE.getRGB())); - JsonArray info = item.has("info") ? item.get("info").getAsJsonArray() : new JsonArray(); + JsonElement infoElement = getItemInfo("info"); + JsonArray info = infoElement != null ? infoElement.getAsJsonArray() : new JsonArray(); String[] infoA = new String[info.size()]; for (int i = 0; i < info.size(); i++) infoA[i] = info.get(i).getAsString(); this.info = addTextFieldWithSupplier(String.join("\n", infoA), COLOUR | MULTILINE); options.add(new GuiElementText("Click-command (viewrecipe or viewpotion): ", Color.WHITE.getRGB())); - String clickcommand = item.has("clickcommand") ? item.get("clickcommand").getAsString() : ""; - this.clickcommand = addTextFieldWithSupplier(clickcommand, NO_SPACE); + JsonElement clickCommandElement = getItemInfo("clickcommand"); + String clickCommand = clickCommandElement != null ? clickCommandElement.getAsString() : ""; + this.clickCommand = addTextFieldWithSupplier(clickCommand, NO_SPACE); options.add(new GuiElementText("Damage: ", Color.WHITE.getRGB())); - String damage = item.has("damage") ? item.get("damage").getAsString() : ""; + JsonElement damageElement = getItemInfo("damage"); + String damage = damageElement != null ? damageElement.getAsString() : ""; this.damage = addTextFieldWithSupplier(damage, NO_SPACE | NUM_ONLY); rightOptions.add(new GuiElementButton("Close (discards changes)", Color.LIGHT_GRAY.getRGB(), () -> Minecraft.getMinecraft().displayGuiScreen(null))); + + rightOptions.add(new GuiElementText("", Color.WHITE.getRGB())); + GuiElementButton button = new Object() { //Used to make the compiler shut the fuck up final GuiElementButton b = new GuiElementButton("Save to local disk", Color.GREEN.getRGB(), new Runnable() { public void run() { if (save()) { - b.setText("Save to local disk (SUCCESS)"); + b.setText(saved == 0 ? "Saved" : "Saved (" + saved + ")"); + saved++; } else { - b.setText("Save to local disk (FAILED)"); + b.setText("Saving FAILED!"); } } }); }.b; rightOptions.add(button); - rightOptions.add(new GuiElementText("", Color.WHITE.getRGB())); - rightOptions.add(new GuiElementButton("Remove enchants", Color.RED.getRGB(), () -> { - nbttag.removeTag("ench"); - nbttag.getCompoundTag("ExtraAttributes").removeTag("enchantments"); + nbtTag.removeTag("ench"); + nbtTag.getCompoundTag("ExtraAttributes").removeTag("enchantments"); })); rightOptions.add(new GuiElementButton( "Add enchant glint", Color.ORANGE.getRGB(), - () -> nbttag.setTag("ench", new NBTTagList()) + () -> nbtTag.setTag("ench", new NBTTagList()) )); - rightOptions.add(new GuiElementButton("Remove timestamp/uuid", Color.RED.getRGB(), () -> { - nbttag.getCompoundTag("ExtraAttributes").removeTag("uuid"); - nbttag.getCompoundTag("ExtraAttributes").removeTag("timestamp"); - })); - resetScrollToTop(); + if (savedRepoItem != null) { + this.item = savedRepoItem; + } else { + this.item = item; + } + } + + /** + * Creates a new ItemEditor object and instantly saves. This will update the lore/nbt tag and other item infos in the repo without removing things like recipes and wiki URLs and without showing the GUI + * + * @param internalName the internal name for the item + * @param item the Item as a JsonObject + * @return weather the saving was successful or not + * @see io.github.moulberry.notenoughupdates.NEUManager#getInternalNameForItem(ItemStack) + * @see io.github.moulberry.notenoughupdates.NEUManager#getJsonForItem(ItemStack) + */ + public static boolean saveOnly(String internalName, JsonObject item) { + NEUItemEditor editor = new NEUItemEditor(internalName, item); + return editor.save(); + } + + /** + * Returns the Element from the item being edited or the already existing item, prioritizing the item currently being edited + * + * @param key The JSON key + * @return the element found, or null + */ + private JsonElement getItemInfo(String key) { + if (item.has(key)) { + return item.get(key); + } else if (savedRepoItem != null && savedRepoItem.has(key)) { + return savedRepoItem.get(key); + } else { + return null; + } } public boolean save() { @@ -159,8 +199,18 @@ public class NEUItemEditor extends GuiScreen { if (infoA.length == 0 || infoA[0].isEmpty()) { infoA = new String[0]; } - return manager.writeItemJson(item, internalname.get(), itemid.get(), displayname.get(), lore.get().split("\n"), - crafttext.get(), infoType.get(), infoA, clickcommand.get(), damageI, nbttag + return NotEnoughUpdates.INSTANCE.manager.writeItemJson( + item, + internalName.get(), + itemId.get(), + displayName.get(), + lore.get().split("\n"), + craftText.get(), + infoType.get(), + infoA, + clickCommand.get(), + damageI, + nbtTag ); } @@ -171,7 +221,7 @@ public class NEUItemEditor extends GuiScreen { } public void resyncNbttag() { - if (nbttag == null) nbttag = new NBTTagCompound(); + if (nbtTag == null) nbtTag = new NBTTagCompound(); //Item lore NBTTagList list = new NBTTagList(); @@ -179,17 +229,17 @@ public class NEUItemEditor extends GuiScreen { list.appendTag(new NBTTagString(lore)); } - NBTTagCompound display = nbttag.getCompoundTag("display"); + NBTTagCompound display = nbtTag.getCompoundTag("display"); display.setTag("Lore", list); //Name - display.setString("Name", displayname.get()); - nbttag.setTag("display", display); + display.setString("Name", displayName.get()); + nbtTag.setTag("display", display); //Internal ID - NBTTagCompound ea = nbttag.getCompoundTag("ExtraAttributes"); - ea.setString("id", internalname.get()); - nbttag.setTag("ExtraAttributes", ea); + NBTTagCompound ea = nbtTag.getCompoundTag("ExtraAttributes"); + ea.setString("id", internalName.get()); + nbtTag.setTag("ExtraAttributes", ea); } public void resetScrollToTop() { @@ -243,9 +293,6 @@ public class NEUItemEditor extends GuiScreen { drawRect(0, 0, width, height, backgroundColour.getRGB()); int yScroll = calculateYScroll(); - if (yScroll > 0) { - //Render scroll bar - } int currentY = PADDING - yScroll; for (GuiElement gui : options) { @@ -268,7 +315,7 @@ public class NEUItemEditor extends GuiScreen { drawRect(itemX - 9, itemY - 9, itemX + itemSize + 9, itemY + itemSize + 9, itemBorder.getRGB()); drawRect(itemX - 6, itemY - 6, itemX + itemSize + 6, itemY + itemSize + 6, Color.DARK_GRAY.getRGB()); drawRect(itemX - 5, itemY - 5, itemX + itemSize + 5, itemY + itemSize + 5, itemBackground.getRGB()); - ItemStack stack = new ItemStack(Item.itemRegistry.getObject(new ResourceLocation(itemid.get()))); + ItemStack stack = new ItemStack(Item.itemRegistry.getObject(new ResourceLocation(itemId.get()))); if (stack.getItem() != null) { try { @@ -277,18 +324,18 @@ public class NEUItemEditor extends GuiScreen { } resyncNbttag(); - stack.setTagCompound(nbttag); + stack.setTagCompound(nbtTag); int scaleFactor = itemSize / 16; GL11.glPushMatrix(); GlStateManager.scale(scaleFactor, scaleFactor, 1); - drawItemStack(stack, itemX / scaleFactor, itemY / scaleFactor, null); + drawItemStack(stack, itemX / scaleFactor, itemY / scaleFactor); GL11.glPopMatrix(); } //Tooltip List text = new ArrayList<>(); - text.add(displayname.get()); + text.add(displayName.get()); text.addAll(Arrays.asList(lore.get().split("\n"))); Utils.drawHoveringText(text, itemX - 20, itemY + itemSize + 28, width, height, -1, @@ -300,6 +347,7 @@ public class NEUItemEditor extends GuiScreen { @Override protected void keyTyped(char typedChar, int keyCode) { + boolean hasChanges = false; if (keyCode == Keyboard.KEY_ESCAPE && !hasChanges) { Minecraft.getMinecraft().displayGuiScreen(null); return; @@ -408,7 +456,7 @@ public class NEUItemEditor extends GuiScreen { } } - private void drawItemStack(ItemStack stack, int x, int y, String altText) { + private void drawItemStack(ItemStack stack, int x, int y) { RenderItem itemRender = Minecraft.getMinecraft().getRenderItem(); FontRenderer font = Minecraft.getMinecraft().fontRendererObj; @@ -416,7 +464,6 @@ public class NEUItemEditor extends GuiScreen { itemRender.renderItemAndEffectIntoGUI(stack, x, y); RenderHelper.disableStandardItemLighting(); - itemRender.renderItemOverlayIntoGUI(font, stack, x, y, altText); + itemRender.renderItemOverlayIntoGUI(font, stack, x, y, null); } - } 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 ef2c67a8..4823f5c5 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java @@ -14,6 +14,7 @@ import io.github.moulberry.notenoughupdates.auction.CustomAHGui; import io.github.moulberry.notenoughupdates.commands.profile.ViewProfileCommand; import io.github.moulberry.notenoughupdates.core.GuiScreenElementWrapper; import io.github.moulberry.notenoughupdates.dungeons.DungeonWin; +import io.github.moulberry.notenoughupdates.itemeditor.NEUItemEditor; import io.github.moulberry.notenoughupdates.miscfeatures.AuctionBINWarning; import io.github.moulberry.notenoughupdates.miscfeatures.BetterContainers; import io.github.moulberry.notenoughupdates.miscfeatures.CrystalMetalDetectorSolver; @@ -75,15 +76,16 @@ import javax.swing.*; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; -import java.io.FileInputStream; 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.ArrayList; import java.util.ConcurrentModificationException; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TreeMap; @@ -1028,11 +1030,16 @@ public class RenderListener { 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; - ContainerChest cc = (ContainerChest) eventGui.inventorySlots; - IInventory lower = cc.getLowerChestInventory(); + if (NotEnoughUpdates.INSTANCE.config.hidden.dev && Keyboard.isKeyDown(Keyboard.KEY_B) && + Minecraft.getMinecraft().currentScreen instanceof GuiChest + ) { + GuiChest eventGui = (GuiChest) Minecraft.getMinecraft().currentScreen; + ContainerChest cc = (ContainerChest) eventGui.inventorySlots; + IInventory lower = cc.getLowerChestInventory(); + + ItemStack backArrow = lower.getStackInSlot(48); + List tooltip = backArrow != null ? backArrow.getTooltip(Minecraft.getMinecraft().thePlayer, false) : null; + if (tooltip != null && tooltip.size() >= 2 && tooltip.get(1).endsWith("Essence")) { try { File file = new File( @@ -1040,7 +1047,7 @@ public class RenderListener { "config/notenoughupdates/repo/constants/essencecosts.json" ); String fileContent; - fileContent = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8)) + fileContent = new BufferedReader(new InputStreamReader(Files.newInputStream(file.toPath()), StandardCharsets.UTF_8)) .lines() .collect(Collectors.joining(System.lineSeparator())); String id = null; @@ -1264,6 +1271,54 @@ public class RenderListener { EnumChatFormatting.RED + "Error while parsing inventory. Try again or check logs for details")); } } + } else if (NotEnoughUpdates.INSTANCE.config.hidden.dev && Keyboard.isKeyDown(Keyboard.KEY_B) && + Minecraft.getMinecraft().currentScreen instanceof GuiChest && + ((((ContainerChest) ((GuiChest) Minecraft.getMinecraft().currentScreen).inventorySlots) + .getLowerChestInventory() + .getDisplayName() + .getUnformattedText() + .endsWith("Essence")))) { + GuiChest eventGui = (GuiChest) Minecraft.getMinecraft().currentScreen; + ContainerChest cc = (ContainerChest) eventGui.inventorySlots; + IInventory lower = cc.getLowerChestInventory(); + + for (int i = 9; 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.getInternalNameForItem(stack); + if (internalName == null) { + Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "ERROR: Could not get internal name for: " + EnumChatFormatting.AQUA + + stack.getDisplayName())); + continue; + } + JsonObject itemObject = NotEnoughUpdates.INSTANCE.manager.getJsonForItem(stack); + JsonArray lore = itemObject.get("lore").getAsJsonArray(); + List loreList = new ArrayList<>(); + for (int j = 0; j < lore.size(); j++) loreList.add(lore.get(j).getAsString()); + if (loreList.get(loreList.size() - 1).equals("§7§eClick to view upgrades!")) { + loreList.remove(loreList.size() - 1); + loreList.remove(loreList.size() - 1); + } + + JsonArray newLore = new JsonArray(); + for (String s : loreList) { + newLore.add(new JsonPrimitive(s)); + } + itemObject.remove("lore"); + itemObject.add("lore", newLore); + + if (!NEUItemEditor.saveOnly(internalName, itemObject)) { + Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "ERROR: Failed to save item: " + EnumChatFormatting.AQUA + + stack.getDisplayName())); + } + } + Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText( + EnumChatFormatting.AQUA + "Parsed page: " + lower.getDisplayName().getUnformattedText())); + event.setCanceled(true); + return; } if (AuctionBINWarning.getInstance().shouldShow()) { 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 4e865b28..5a8fd901 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiEnchantColour.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiEnchantColour.java @@ -599,10 +599,12 @@ public class GuiEnchantColour extends GuiScreen { getEnchantOpString(guiElementTextFields.get(yIndex), comparators.get(yIndex), modifiers.get(yIndex)) ); } else if (mouseX > guiLeft + 160 && mouseX < guiLeft + 160 + 20) { - NotEnoughUpdates.INSTANCE.config.hidden.enchantColours.remove(yIndex); - guiElementTextFields.remove(yIndex); - comparators.remove(yIndex); - modifiers.remove(yIndex); + if (NotEnoughUpdates.INSTANCE.config.hidden.enchantColours.size() > 0) { + NotEnoughUpdates.INSTANCE.config.hidden.enchantColours.remove(yIndex); + guiElementTextFields.remove(yIndex); + comparators.remove(yIndex); + modifiers.remove(yIndex); + } } } } 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 e5028146..b7d4a321 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeGenerator.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeGenerator.java @@ -21,7 +21,12 @@ import net.minecraftforge.fml.common.gameevent.TickEvent; import org.lwjgl.input.Keyboard; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -231,6 +236,7 @@ public class RecipeGenerator { Damage: 3s }*/ public boolean saveRecipes(String relevantItem, List recipes) throws IOException { + relevantItem = relevantItem.replace(" ", "_"); JsonObject outputJson = neu.manager.readJsonDefaultDir(relevantItem + ".json"); if (outputJson == null) return false; outputJson.addProperty("clickcommand", "viewrecipe"); -- 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 'Update Notes/2.1.md') 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 @@ downloads --> - - lines + + lines - - license + + license - - contributors + + contributors 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 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()); - put("name", new NameModifier()); - }}; - - 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 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; - } - - } + 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 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()); + put("name", new NameModifier()); + }}; + + 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 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 index bab6c354..aa6d22c9 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EntityViewerModifier.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EntityViewerModifier.java @@ -1,8 +1,27 @@ +/* + * 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; import net.minecraft.entity.EntityLivingBase; public abstract class EntityViewerModifier { - public abstract EntityLivingBase applyModifier(EntityLivingBase base, JsonObject info); + 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 index 3011e479..685e161a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EquipmentModifier.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/EquipmentModifier.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; 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 index db20a684..8cdf2ef0 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/GUIClientPlayer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/GUIClientPlayer.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.mojang.authlib.GameProfile; @@ -9,29 +28,29 @@ 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; - } - }; + 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 public String getName() { @@ -45,7 +64,7 @@ public class GUIClientPlayer extends AbstractClientPlayer { } @Override - protected NetworkPlayerInfo getPlayerInfo() { - return playerInfo; - } + 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 index 7fd2dadd..b29152bf 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/HorseModifier.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/HorseModifier.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.JsonElement; 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 index c2138b3f..74535ce9 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/InvisibleModifier.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/InvisibleModifier.java @@ -1,12 +1,31 @@ +/* + * 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; 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; - } + @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/NameModifier.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/NameModifier.java index 9978882d..c0fd23bd 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/NameModifier.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/NameModifier.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; 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 index 9879542a..72dd8b73 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/RidingModifier.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/RidingModifier.java @@ -1,14 +1,33 @@ +/* + * Copyright (C) 2022 NotEnoughUpdates contributors + * + * This file is part of NotEnoughUpdates. + * + * NotEnoughUpdates is free software: you can redistribute it + * and/or modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * NotEnoughUpdates is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with NotEnoughUpdates. If not, see . + */ + 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; - } + @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 index 55e8a432..076e8417 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/SkinModifier.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/SkinModifier.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.JsonElement; @@ -9,38 +28,38 @@ 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; - } + @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 index c5580f17..3b73c26f 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/WitherModifier.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/entityviewer/WitherModifier.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; @@ -5,25 +24,25 @@ 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; - } + @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/AccessoryBagOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/AccessoryBagOverlay.java index 95e21cd0..c8fd0fde 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/AccessoryBagOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/AccessoryBagOverlay.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.miscgui; import com.google.gson.JsonArray; @@ -33,8 +52,14 @@ import org.lwjgl.opengl.GL14; import java.awt.*; import java.io.ByteArrayInputStream; import java.io.IOException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; 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; @@ -55,7 +80,8 @@ public class AccessoryBagOverlay { Utils.createItemStack(Items.diamond_sword, EnumChatFormatting.DARK_AQUA + "Total Stat Bonuses", 0 ), - Utils.createItemStack(Item.getItemFromBlock(Blocks.anvil), + Utils.createItemStack( + Item.getItemFromBlock(Blocks.anvil), EnumChatFormatting.DARK_AQUA + "Total Stat Bonuses (from reforges)", 0 ), @@ -211,7 +237,8 @@ public class AccessoryBagOverlay { } } - Utils.drawStringCenteredScaledMaxWidth("# By Rarity", + Utils.drawStringCenteredScaledMaxWidth( + "# By Rarity", Minecraft.getMinecraft().fontRendererObj, x + 40, y + 12, @@ -244,7 +271,8 @@ public class AccessoryBagOverlay { } } - Utils.drawStringCenteredScaledMaxWidth("Total Stats", + Utils.drawStringCenteredScaledMaxWidth( + "Total Stats", Minecraft.getMinecraft().fontRendererObj, x + 40, y + 12, @@ -291,7 +319,8 @@ public class AccessoryBagOverlay { } } - Utils.drawStringCenteredScaledMaxWidth("Reforge Stats", + Utils.drawStringCenteredScaledMaxWidth( + "Reforge Stats", Minecraft.getMinecraft().fontRendererObj, x + 40, y + 12, @@ -334,7 +363,8 @@ public class AccessoryBagOverlay { if (duplicates == null) { JsonObject misc = Constants.MISC; if (misc == null) { - Utils.drawStringCenteredScaledMaxWidth("Duplicates: ERROR", + Utils.drawStringCenteredScaledMaxWidth( + "Duplicates: ERROR", Minecraft.getMinecraft().fontRendererObj, x + 40, y + 12, @@ -346,7 +376,8 @@ public class AccessoryBagOverlay { } JsonElement talisman_upgrades_element = misc.get("talisman_upgrades"); if (talisman_upgrades_element == null) { - Utils.drawStringCenteredScaledMaxWidth("Duplicates: ERROR", + Utils.drawStringCenteredScaledMaxWidth( + "Duplicates: ERROR", Minecraft.getMinecraft().fontRendererObj, x + 40, y + 12, @@ -388,7 +419,8 @@ public class AccessoryBagOverlay { } } if (duplicates.isEmpty()) { - Utils.drawStringCenteredScaledMaxWidth("No Duplicates", + Utils.drawStringCenteredScaledMaxWidth( + "No Duplicates", Minecraft.getMinecraft().fontRendererObj, x + 40, y + 12, @@ -397,7 +429,8 @@ public class AccessoryBagOverlay { new Color(80, 80, 80).getRGB() ); } else { - Utils.drawStringCenteredScaledMaxWidth("Duplicates: " + duplicates.size(), + Utils.drawStringCenteredScaledMaxWidth( + "Duplicates: " + duplicates.size(), Minecraft.getMinecraft().fontRendererObj, x + 40, y + 12, @@ -432,7 +465,8 @@ public class AccessoryBagOverlay { if (missing == null) { JsonObject misc = Constants.MISC; if (misc == null) { - Utils.drawStringCenteredScaledMaxWidth("Duplicates: ERROR", + Utils.drawStringCenteredScaledMaxWidth( + "Duplicates: ERROR", Minecraft.getMinecraft().fontRendererObj, x + 40, y + 12, @@ -444,7 +478,8 @@ public class AccessoryBagOverlay { } JsonElement talisman_upgrades_element = misc.get("talisman_upgrades"); if (talisman_upgrades_element == null) { - Utils.drawStringCenteredScaledMaxWidth("Duplicates: ERROR", + Utils.drawStringCenteredScaledMaxWidth( + "Duplicates: ERROR", Minecraft.getMinecraft().fontRendererObj, x + 40, y + 12, @@ -519,7 +554,8 @@ public class AccessoryBagOverlay { } } if (missing.isEmpty()) { - Utils.drawStringCenteredScaledMaxWidth("No Missing", + Utils.drawStringCenteredScaledMaxWidth( + "No Missing", Minecraft.getMinecraft().fontRendererObj, x + 40, y + 12, @@ -528,7 +564,8 @@ public class AccessoryBagOverlay { new Color(80, 80, 80).getRGB() ); } else { - Utils.drawStringCenteredScaledMaxWidth("Missing: " + missing.size(), + Utils.drawStringCenteredScaledMaxWidth( + "Missing: " + missing.size(), Minecraft.getMinecraft().fontRendererObj, x + 40, y + 12, @@ -653,7 +690,8 @@ public class AccessoryBagOverlay { private static int mainWeapon = 1; public static void renderOptimizerOverlay(int x, int y) { - Utils.drawStringCenteredScaledMaxWidth("Optimizer", + Utils.drawStringCenteredScaledMaxWidth( + "Optimizer", Minecraft.getMinecraft().fontRendererObj, x + 40, y + 12, @@ -686,7 +724,8 @@ public class AccessoryBagOverlay { dark ); - Utils.drawStringCenteredScaledMaxWidth("Force 100% CC", + Utils.drawStringCenteredScaledMaxWidth( + "Force 100% CC", Minecraft.getMinecraft().fontRendererObj, x + 40, y + 27, @@ -698,7 +737,8 @@ public class AccessoryBagOverlay { Minecraft.getMinecraft().fontRendererObj, x + 20, y + 37, true, 30, new Color(80, 80, 80).getRGB() ); - Utils.drawStringCenteredScaledMaxWidth((forceCC ? EnumChatFormatting.GRAY : EnumChatFormatting.RED) + "NO", + Utils.drawStringCenteredScaledMaxWidth( + (forceCC ? EnumChatFormatting.GRAY : EnumChatFormatting.RED) + "NO", Minecraft.getMinecraft().fontRendererObj, x + 60, y + 37, @@ -707,7 +747,8 @@ public class AccessoryBagOverlay { new Color(80, 80, 80).getRGB() ); - Utils.drawStringCenteredScaledMaxWidth("Force 100% ATKSPEED", + Utils.drawStringCenteredScaledMaxWidth( + "Force 100% ATKSPEED", Minecraft.getMinecraft().fontRendererObj, x + 40, y + 47, @@ -715,7 +756,8 @@ public class AccessoryBagOverlay { 70, new Color(80, 80, 80).getRGB() ); - Utils.drawStringCenteredScaledMaxWidth((forceAS ? EnumChatFormatting.GREEN : EnumChatFormatting.GRAY) + "YES", + Utils.drawStringCenteredScaledMaxWidth( + (forceAS ? EnumChatFormatting.GREEN : EnumChatFormatting.GRAY) + "YES", Minecraft.getMinecraft().fontRendererObj, x + 20, y + 57, @@ -723,7 +765,8 @@ public class AccessoryBagOverlay { 30, new Color(80, 80, 80).getRGB() ); - Utils.drawStringCenteredScaledMaxWidth((forceAS ? EnumChatFormatting.GRAY : EnumChatFormatting.RED) + "NO", + Utils.drawStringCenteredScaledMaxWidth( + (forceAS ? EnumChatFormatting.GRAY : EnumChatFormatting.RED) + "NO", Minecraft.getMinecraft().fontRendererObj, x + 60, y + 57, @@ -732,7 +775,8 @@ public class AccessoryBagOverlay { new Color(80, 80, 80).getRGB() ); - Utils.drawStringCenteredScaledMaxWidth("Use God Potion", + Utils.drawStringCenteredScaledMaxWidth( + "Use God Potion", Minecraft.getMinecraft().fontRendererObj, x + 40, y + 67, @@ -740,7 +784,8 @@ public class AccessoryBagOverlay { 70, new Color(80, 80, 80).getRGB() ); - Utils.drawStringCenteredScaledMaxWidth((useGodPot ? EnumChatFormatting.GREEN : EnumChatFormatting.GRAY) + "YES", + Utils.drawStringCenteredScaledMaxWidth( + (useGodPot ? EnumChatFormatting.GREEN : EnumChatFormatting.GRAY) + "YES", Minecraft.getMinecraft().fontRendererObj, x + 20, y + 77, @@ -748,7 +793,8 @@ public class AccessoryBagOverlay { 30, new Color(80, 80, 80).getRGB() ); - Utils.drawStringCenteredScaledMaxWidth((useGodPot ? EnumChatFormatting.GRAY : EnumChatFormatting.RED) + "NO", + Utils.drawStringCenteredScaledMaxWidth( + (useGodPot ? EnumChatFormatting.GRAY : EnumChatFormatting.RED) + "NO", Minecraft.getMinecraft().fontRendererObj, x + 60, y + 77, @@ -757,7 +803,8 @@ public class AccessoryBagOverlay { new Color(80, 80, 80).getRGB() ); - Utils.drawStringCenteredScaledMaxWidth("Use God Potion", + Utils.drawStringCenteredScaledMaxWidth( + "Use God Potion", Minecraft.getMinecraft().fontRendererObj, x + 40, y + 87, @@ -774,7 +821,8 @@ public class AccessoryBagOverlay { true, 30, new Color(80, 80, 80).getRGB() ); - Utils.drawStringCenteredScaledMaxWidth("Main Weapon", + Utils.drawStringCenteredScaledMaxWidth( + "Main Weapon", Minecraft.getMinecraft().fontRendererObj, x + 40, y + 107, @@ -836,7 +884,8 @@ public class AccessoryBagOverlay { GuiChest eventGui = (GuiChest) Minecraft.getMinecraft().currentScreen; ContainerChest cc = (ContainerChest) eventGui.inventorySlots; String containerName = cc.getLowerChestInventory().getDisplayName().getUnformattedText(); - if (containerName.trim().startsWith("Accessory Bag") && !containerName.contains("Thaumaturgy") && !containerName.contains("Upgrades")) { + if (containerName.trim().startsWith("Accessory Bag") && !containerName.contains("Thaumaturgy") && + !containerName.contains("Upgrades")) { inAccessoryBag = true; try { int xSize = (int) Utils.getField(GuiContainer.class, eventGui, "xSize", "field_146999_f"); 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 06cf28e1..64396905 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/CalendarOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/CalendarOverlay.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.miscgui; import com.google.gson.JsonArray; @@ -36,7 +55,12 @@ import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import java.io.File; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +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/miscgui/GuiCustomEnchant.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.java index 42340259..8ba3a98a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.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.miscgui; import com.google.common.collect.Lists; @@ -39,7 +58,12 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.util.glu.Project; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; +import java.util.Random; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -946,7 +970,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); - ((AccessorGuiContainer)chest).doDrawSlot(slot); + ((AccessorGuiContainer) chest).doDrawSlot(slot); GlStateManager.popMatrix(); if (mouseX >= itemX && mouseX < itemX + 18 && 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 2ed708e9..31713189 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiEnchantColour.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiEnchantColour.java @@ -1,13 +1,34 @@ +/* + * 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.miscgui; import com.google.common.base.Splitter; import com.google.common.collect.Lists; -import com.google.gson.*; +import com.google.gson.JsonArray; +import com.google.gson.JsonParseException; +import com.google.gson.JsonParser; +import com.google.gson.JsonPrimitive; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.core.util.lerp.LerpingInteger; import io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField; import io.github.moulberry.notenoughupdates.options.NEUConfig; -import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; 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 d65a18b0..40e12e35 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiInvButtonEditor.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiInvButtonEditor.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.miscgui; import com.google.gson.JsonArray; @@ -22,7 +41,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.ResourceLocation; -import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; 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 0645ede7..7d541296 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemCustomize.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemCustomize.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.miscgui; import com.google.common.collect.Lists; 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 129e25e7..69343e99 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemRecipe.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemRecipe.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.miscgui; import com.google.common.collect.ImmutableList; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiNavigation.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiNavigation.java index d34988f6..dcb1344c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiNavigation.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiNavigation.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.miscgui; import com.google.gson.JsonObject; 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 e2381503..ed8d5d92 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiPriceGraph.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiPriceGraph.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.miscgui; import com.google.common.reflect.TypeToken; @@ -17,14 +36,26 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; -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.InputStreamReader; +import java.io.OutputStreamWriter; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.time.Instant; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; import java.util.stream.Collectors; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; @@ -347,7 +378,7 @@ public class GuiPriceGraph extends GuiScreen { itemData = new ItemData( new TreeMap<>(itemData.get().entrySet().stream() .filter(e -> e.getKey() > System.currentTimeMillis() / 1000 - - (mode == 0 ? 3600 : mode == 1 ? 86400 : 604800)) + (mode == 0 ? 3600 : mode == 1 ? 86400 : 604800)) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))), itemData.isBz() ); @@ -428,7 +459,12 @@ public class GuiPriceGraph extends GuiScreen { } } - private static void addOrUpdateItemPriceInfo(Map.Entry item, HashMap prices, long timestamp, boolean bazaar) { + private static void addOrUpdateItemPriceInfo( + Map.Entry item, + HashMap prices, + long timestamp, + boolean bazaar + ) { String itemName = item.getKey(); ItemData existingItemData = null; if (prices.containsKey(itemName)) { @@ -456,7 +492,8 @@ public class GuiPriceGraph extends GuiScreen { BzData bzData = new BzData( item.getValue().getAsJsonObject().get("curr_buy").getAsFloat(), - item.getValue().getAsJsonObject().get("curr_sell").getAsFloat()); + item.getValue().getAsJsonObject().get("curr_sell").getAsFloat() + ); if (existingItemData != null) { existingItemData.bz.put(timestamp, bzData); @@ -485,7 +522,8 @@ public class GuiPriceGraph extends GuiScreen { else trimmed.ah = new TreeMap<>(); int zones = NotEnoughUpdates.INSTANCE.config.ahGraph.graphZones; - Long[] dataArray = !itemData.isBz() ? itemData.ah.keySet().toArray(new Long[0]) : itemData.bz.keySet().toArray(new Long[0]); + Long[] dataArray = + !itemData.isBz() ? itemData.ah.keySet().toArray(new Long[0]) : itemData.bz.keySet().toArray(new Long[0]); int prev = 0; for (int i = 0; i < zones; i++) { long lowest = (long) map(i, 0, zones, first, last); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/InventoryStorageSelector.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/InventoryStorageSelector.java index 3932c9d5..0abf3f11 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/InventoryStorageSelector.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/InventoryStorageSelector.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.miscgui; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; 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 5a763411..b22ff11f 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/KatSitterOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/KatSitterOverlay.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.miscgui; import com.google.gson.JsonObject; @@ -62,12 +81,23 @@ public class KatSitterOverlay { int currentWidth = font.getStringWidth(currentText); String upgradedText = "Upgraded pet level: " + upgradedLevel; int upgradedWidth = font.getStringWidth(upgradedText); - int left = ((AccessorGuiContainer)gui).getGuiLeft() - 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, ((AccessorGuiContainer)gui).getGuiTop() + 25, false, 0xFFD700, 1F); + Utils.drawStringScaled(currentText, font, left, ((AccessorGuiContainer) gui).getGuiTop() + 25, false, 0xFFD700, 1F); if (upgradedLevel != null) - Utils.drawStringScaled(upgradedText, font, left, ((AccessorGuiContainer)gui).getGuiTop() + 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/NEUOverlayPlacements.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/NEUOverlayPlacements.java index f95302ef..ac96f527 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/NEUOverlayPlacements.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/NEUOverlayPlacements.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.miscgui; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; 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 e5e0ff5c..98efa381 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/StorageOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/StorageOverlay.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.miscgui; import com.google.common.collect.Lists; 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 1f47e6ee..086b6e06 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TradeWindow.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TradeWindow.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.miscgui; import com.google.gson.JsonObject; @@ -560,7 +579,12 @@ public class TradeWindow { int y = 104 + 18 * (index / 9); if (index < 9) y = 180; - ((AccessorGuiContainer)chest).doDrawSlot(new Slot(Minecraft.getMinecraft().thePlayer.inventory, index, 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/miscgui/tutorials/NeuConfigTutorial.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/tutorials/NeuConfigTutorial.java index 938f3f98..6a2602f8 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/tutorials/NeuConfigTutorial.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/tutorials/NeuConfigTutorial.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.miscgui.tutorials; public class NeuConfigTutorial extends TutorialBase { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/tutorials/NeuTutorial.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/tutorials/NeuTutorial.java index 24c6bb7f..c0a5d8c8 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/tutorials/NeuTutorial.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/tutorials/NeuTutorial.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.miscgui.tutorials; import net.minecraft.client.Minecraft; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/tutorials/TutorialBase.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/tutorials/TutorialBase.java index 34167b3f..27172ed8 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/tutorials/TutorialBase.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/tutorials/TutorialBase.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.miscgui.tutorials; import com.google.gson.JsonArray; 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 e41c12eb..d30cb9b3 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorEntityAgeable.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorEntityAgeable.java @@ -1,14 +1,31 @@ +/* + * 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.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/AccessorEntityArmorStand.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorEntityArmorStand.java index b6a3ca6e..50bbe135 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorEntityArmorStand.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorEntityArmorStand.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.mixins; import net.minecraft.entity.item.EntityArmorStand; @@ -6,7 +25,7 @@ import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(EntityArmorStand.class) public interface AccessorEntityArmorStand { - @Invoker(value = "setSmall") - void setSmallDirect(boolean isSmall); + @Invoker(value = "setSmall") + void setSmallDirect(boolean isSmall); } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiContainer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiContainer.java index 3966317b..a12cd9c8 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiContainer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiContainer.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.mixins; import net.minecraft.client.gui.inventory.GuiContainer; @@ -9,25 +28,25 @@ import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(GuiContainer.class) public interface AccessorGuiContainer { - @Invoker("getSlotAtPosition") - Slot doGetSlotAtPosition(int x, int y); + @Invoker("getSlotAtPosition") + Slot doGetSlotAtPosition(int x, int y); - @Invoker("drawSlot") - void doDrawSlot(Slot slot); + @Invoker("drawSlot") + void doDrawSlot(Slot slot); - @Invoker("isMouseOverSlot") - boolean doIsMouseOverSlot(Slot slot, int x, int y); + @Invoker("isMouseOverSlot") + boolean doIsMouseOverSlot(Slot slot, int x, int y); - @Accessor("guiLeft") - int getGuiLeft(); + @Accessor("guiLeft") + int getGuiLeft(); - @Accessor("guiTop") - int getGuiTop(); + @Accessor("guiTop") + int getGuiTop(); - @Accessor("xSize") - int getXSize(); + @Accessor("xSize") + int getXSize(); - @Accessor("ySize") - int getYSize(); + @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 index ea945d5d..d1cd7069 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiEditSign.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiEditSign.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.mixins; import net.minecraft.client.gui.inventory.GuiEditSign; @@ -7,6 +26,6 @@ import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(GuiEditSign.class) public interface AccessorGuiEditSign { - @Accessor("tileSign") - TileEntitySign getTileSign(); + @Accessor("tileSign") + TileEntitySign getTileSign(); } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiPlayerTabOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiPlayerTabOverlay.java index 530e3013..0189e2fc 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiPlayerTabOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorGuiPlayerTabOverlay.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.mixins; import net.minecraft.client.gui.GuiPlayerTabOverlay; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorMinecraft.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorMinecraft.java index 0277a18b..6d8c941c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorMinecraft.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/AccessorMinecraft.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.mixins; import net.minecraft.client.Minecraft; @@ -9,6 +28,6 @@ import java.util.List; @Mixin(Minecraft.class) public interface AccessorMinecraft { - @Accessor(value = "defaultResourcePacks") - List onGetDefaultResourcePacks(); + @Accessor(value = "defaultResourcePacks") + List onGetDefaultResourcePacks(); } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinAbstractClientPlayer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinAbstractClientPlayer.java index 5c81c758..685528e0 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinAbstractClientPlayer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinAbstractClientPlayer.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.mixins; import io.github.moulberry.notenoughupdates.miscfeatures.NPCRetexturing; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinContainer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinContainer.java index 80d79712..53643fb0 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinContainer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinContainer.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.mixins; import io.github.moulberry.notenoughupdates.miscfeatures.EnchantingSolvers; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEffectRenderer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEffectRenderer.java index 8d0b291a..451fff3a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEffectRenderer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEffectRenderer.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.mixins; import io.github.moulberry.notenoughupdates.miscfeatures.CustomItemEffects; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntity.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntity.java index 86995647..39951ba4 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntity.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntity.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.mixins; import net.minecraft.entity.Entity; 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 801b9041..d9b60a13 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityAgeable.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityAgeable.java @@ -1,9 +1,27 @@ +/* + * 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.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 index fe88922e..50eb15ba 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityHorse.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityHorse.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.mixins; import net.minecraft.entity.passive.EntityHorse; @@ -8,10 +27,10 @@ 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; - } + @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/MixinEntityPlayer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityPlayer.java index 280e964e..573b2ad5 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityPlayer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityPlayer.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.mixins; import io.github.moulberry.notenoughupdates.cosmetics.CapeManager; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityPlayerSP.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityPlayerSP.java index 573eac22..765ed372 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityPlayerSP.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityPlayerSP.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.mixins; import io.github.moulberry.notenoughupdates.miscfeatures.SlotLocking; 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 ab448660..12ff1cb4 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityRenderer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityRenderer.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.mixins; import io.github.moulberry.notenoughupdates.miscfeatures.CustomItemEffects; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntitySkeleton.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntitySkeleton.java index 54fe53f3..49c7ccb2 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntitySkeleton.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntitySkeleton.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.mixins; import net.minecraft.entity.monster.EntitySkeleton; @@ -8,10 +27,10 @@ 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; - } + @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/mixins/MixinGuiChest.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiChest.java index c0d5627d..1b6b5c61 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiChest.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiChest.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.mixins; import io.github.moulberry.notenoughupdates.miscfeatures.BetterContainers; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java index 9f7d8528..e3741ac7 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java @@ -1,9 +1,33 @@ +/* + * Copyright (C) 2022 NotEnoughUpdates contributors + * + * This file is part of NotEnoughUpdates. + * + * NotEnoughUpdates is free software: you can redistribute it + * and/or modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * NotEnoughUpdates is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with NotEnoughUpdates. If not, see . + */ + package io.github.moulberry.notenoughupdates.mixins; import io.github.moulberry.notenoughupdates.NEUOverlay; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.listener.RenderListener; -import io.github.moulberry.notenoughupdates.miscfeatures.*; +import io.github.moulberry.notenoughupdates.miscfeatures.AuctionBINWarning; +import io.github.moulberry.notenoughupdates.miscfeatures.AuctionSortModeWarning; +import io.github.moulberry.notenoughupdates.miscfeatures.BetterContainers; +import io.github.moulberry.notenoughupdates.miscfeatures.EnchantingSolvers; +import io.github.moulberry.notenoughupdates.miscfeatures.PetInfoOverlay; +import io.github.moulberry.notenoughupdates.miscfeatures.SlotLocking; import io.github.moulberry.notenoughupdates.miscgui.GuiCustomEnchant; import io.github.moulberry.notenoughupdates.miscgui.StorageOverlay; import io.github.moulberry.notenoughupdates.util.Utils; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiIngame.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiIngame.java index 7f7f25c8..3856e2d5 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiIngame.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiIngame.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.mixins; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiInventory.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiInventory.java index 7b225d50..bd712ec7 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiInventory.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiInventory.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.mixins; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiScreen.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiScreen.java index eac2b2d5..b978b433 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiScreen.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiScreen.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.mixins; import io.github.moulberry.notenoughupdates.util.SBInfo; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinInventoryEffectRenderer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinInventoryEffectRenderer.java index fb5707fe..dbcb260d 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinInventoryEffectRenderer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinInventoryEffectRenderer.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.mixins; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinInventoryPlayer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinInventoryPlayer.java index 345b5171..de117002 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinInventoryPlayer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinInventoryPlayer.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.mixins; import io.github.moulberry.notenoughupdates.miscfeatures.SlotLocking; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinItemCameraTransforms.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinItemCameraTransforms.java index da2b2e08..bbe0f842 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinItemCameraTransforms.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinItemCameraTransforms.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.mixins; import io.github.moulberry.notenoughupdates.miscfeatures.CustomSkulls; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinItemRenderer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinItemRenderer.java index d691b79f..c2739ad8 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinItemRenderer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinItemRenderer.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.mixins; import io.github.moulberry.notenoughupdates.miscgui.InventoryStorageSelector; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinItemStack.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinItemStack.java index 25109704..83379a18 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinItemStack.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinItemStack.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.mixins; import io.github.moulberry.notenoughupdates.miscfeatures.ItemCustomizeManager; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinLayerArmorBase.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinLayerArmorBase.java index a085c5d1..773e7ebe 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinLayerArmorBase.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinLayerArmorBase.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.mixins; import io.github.moulberry.notenoughupdates.core.ChromaColour; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinLayerCustomHead.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinLayerCustomHead.java index a2785ec7..90101696 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinLayerCustomHead.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinLayerCustomHead.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.mixins; import com.mojang.authlib.GameProfile; 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 8708afd8..abc9d8c6 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinMinecraft.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinMinecraft.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.mixins; import io.github.moulberry.notenoughupdates.miscfeatures.SlotLocking; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinMouseHelper.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinMouseHelper.java index ff71ad1e..a89893b9 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinMouseHelper.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinMouseHelper.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.mixins; import io.github.moulberry.notenoughupdates.listener.RenderListener; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinNetHandlerPlayClient.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinNetHandlerPlayClient.java index f7baffd6..abc8c2a2 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinNetHandlerPlayClient.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinNetHandlerPlayClient.java @@ -1,13 +1,43 @@ +/* + * 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.mixins; -import io.github.moulberry.notenoughupdates.miscfeatures.*; +import io.github.moulberry.notenoughupdates.miscfeatures.CrystalWishingCompassSolver; +import io.github.moulberry.notenoughupdates.miscfeatures.CustomItemEffects; +import io.github.moulberry.notenoughupdates.miscfeatures.EnchantingSolvers; +import io.github.moulberry.notenoughupdates.miscfeatures.FishingHelper; +import io.github.moulberry.notenoughupdates.miscfeatures.ItemCooldowns; +import io.github.moulberry.notenoughupdates.miscfeatures.MiningStuff; +import io.github.moulberry.notenoughupdates.miscfeatures.StorageManager; import io.github.moulberry.notenoughupdates.util.SBInfo; import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.network.Packet; import net.minecraft.network.play.client.C0EPacketClickWindow; -import net.minecraft.network.play.server.*; +import net.minecraft.network.play.server.S23PacketBlockChange; +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 net.minecraft.network.play.server.S47PacketPlayerListHeaderFooter; import net.minecraft.util.EnumParticleTypes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -47,7 +77,8 @@ public class MixinNetHandlerPlayClient { double xCoord, double yCoord, double zCoord, double xOffset, double yOffset, double zOffset, int[] params ) { - CrystalWishingCompassSolver.getInstance().onSpawnParticle(particleTypes, + CrystalWishingCompassSolver.getInstance().onSpawnParticle( + particleTypes, xCoord, yCoord, zCoord diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinPlayerControllerMP.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinPlayerControllerMP.java index b4481a73..fc8fee02 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinPlayerControllerMP.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinPlayerControllerMP.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.mixins; import io.github.moulberry.notenoughupdates.events.OnBlockBreakSoundEffect; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRender.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRender.java index 14aad887..db35fcb9 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRender.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRender.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.mixins; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderFish.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderFish.java index 9e989311..ca40c5e7 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderFish.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderFish.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.mixins; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; @@ -178,4 +197,4 @@ public abstract class MixinRenderFish extends Render { private static double mathLerp(double var1, double var2, double var3) { return var2 + var1 * (var3 - var2); } -} \ No newline at end of file +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderGlobal.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderGlobal.java index fc3347bf..30c6b36e 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderGlobal.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderGlobal.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.mixins; import io.github.moulberry.notenoughupdates.cosmetics.CapeManager; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderItem.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderItem.java index 6c432ce3..4f193c98 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderItem.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderItem.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.mixins; import io.github.moulberry.notenoughupdates.NEUOverlay; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderList.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderList.java index 8c1cc247..e7782bcd 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderList.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderList.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.mixins; import io.github.moulberry.notenoughupdates.dungeons.DungeonBlocks; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRendererLivingEntity.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRendererLivingEntity.java index 16c6c99c..5503c8cf 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRendererLivingEntity.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRendererLivingEntity.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.mixins; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinTextureManager.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinTextureManager.java index de6d1537..d8a48ecd 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinTextureManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinTextureManager.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.mixins; import io.github.moulberry.notenoughupdates.miscfeatures.ItemCustomizeManager; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinTileEntitySkullRenderer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinTileEntitySkullRenderer.java index 71750fec..0b70f790 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinTileEntitySkullRenderer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinTileEntitySkullRenderer.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.mixins; import com.mojang.authlib.GameProfile; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinTileEntitySpecialRenderer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinTileEntitySpecialRenderer.java index f93608b1..2f342614 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinTileEntitySpecialRenderer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinTileEntitySpecialRenderer.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.mixins; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinVboRenderList.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinVboRenderList.java index 73cb19d3..22448944 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinVboRenderList.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinVboRenderList.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.mixins; import io.github.moulberry.notenoughupdates.dungeons.DungeonBlocks; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinWorld.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinWorld.java index 86073984..b738359a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinWorld.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinWorld.java @@ -1,8 +1,27 @@ +/* + * 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.mixins; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import io.github.moulberry.notenoughupdates.miscfeatures.customblockzones.CustomBiomes; import io.github.moulberry.notenoughupdates.miscfeatures.CustomItemEffects; +import io.github.moulberry.notenoughupdates.miscfeatures.customblockzones.CustomBiomes; import net.minecraft.util.BlockPos; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinWorldClient.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinWorldClient.java index b20ff8fd..84e6da86 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinWorldClient.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinWorldClient.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.mixins; import io.github.moulberry.notenoughupdates.miscfeatures.FishingHelper; 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 d9cc77e3..237a76ca 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.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.options; import com.google.common.collect.Lists; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfigEditor.java b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfigEditor.java index 43c04698..17bc57e9 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfigEditor.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfigEditor.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.options; import com.google.common.collect.Lists; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/customtypes/NEUDebugFlag.java b/src/main/java/io/github/moulberry/notenoughupdates/options/customtypes/NEUDebugFlag.java index 5b3188d6..8e0e4c11 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/customtypes/NEUDebugFlag.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/customtypes/NEUDebugFlag.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.options.customtypes; public enum NEUDebugFlag { @@ -8,5 +27,5 @@ public enum NEUDebugFlag { public static final String FLAG_LIST = "METAL - Metal Detector Solver\n" + - "WISHING - Wishing Compass Solver"; + "WISHING - Wishing Compass Solver"; } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHGraph.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHGraph.java index ad96f744..ce931392 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHGraph.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHGraph.java @@ -1,7 +1,31 @@ +/* + * 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.options.seperateSections; import com.google.gson.annotations.Expose; -import io.github.moulberry.notenoughupdates.core.config.annotations.*; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorBoolean; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorColour; +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 AHGraph { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHTweaks.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHTweaks.java index c4651b02..7c8446b0 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHTweaks.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHTweaks.java @@ -1,7 +1,30 @@ +/* + * 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.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.ConfigEditorSlider; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigOption; public class AHTweaks { @ConfigOption( diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AccessoryBag.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AccessoryBag.java index 5e1d58c1..b87db1d6 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AccessoryBag.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AccessoryBag.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.options.seperateSections; import com.google.gson.annotations.Expose; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ApiData.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ApiData.java index 6121e189..3fc72db5 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ApiData.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ApiData.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.options.seperateSections; import com.google.gson.annotations.Expose; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Calendar.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Calendar.java index cd2fb53f..fe593f56 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Calendar.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Calendar.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.options.seperateSections; import com.google.gson.annotations.Expose; 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 edfd2276..60d8e5ef 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 @@ -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.options.seperateSections; import com.google.gson.annotations.Expose; 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 03465db7..8e211bd6 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 @@ -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.options.seperateSections; import com.google.gson.annotations.Expose; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Dungeons.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Dungeons.java index d1d36e9a..1c825cdf 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Dungeons.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Dungeons.java @@ -1,7 +1,34 @@ +/* + * 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.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.ConfigEditorColour; +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.ConfigEditorSlider; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigOption; public class Dungeons { @ConfigOption( diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Enchanting.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Enchanting.java index e9add7b4..7a49f7c2 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Enchanting.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Enchanting.java @@ -1,7 +1,30 @@ +/* + * 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.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.ConfigEditorDropdown; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigOption; public class Enchanting { @ConfigOption( diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Fishing.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Fishing.java index 9d1367b0..e02413f7 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Fishing.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Fishing.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.options.seperateSections; import com.google.gson.annotations.Expose; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ImprovedSBMenu.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ImprovedSBMenu.java index 60058280..8216c892 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ImprovedSBMenu.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ImprovedSBMenu.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.options.seperateSections; import com.google.gson.annotations.Expose; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/InventoryButtons.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/InventoryButtons.java index 6826302a..685aeb98 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/InventoryButtons.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/InventoryButtons.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.options.seperateSections; import com.google.gson.annotations.Expose; 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 9298623b..7cf56c96 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 @@ -1,8 +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.options.seperateSections; import com.google.gson.annotations.Expose; import io.github.moulberry.notenoughupdates.core.config.Position; -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.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.ConfigEditorSlider; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigOption; import java.util.ArrayList; import java.util.Arrays; 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 db154c24..c83f370f 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 @@ -1,7 +1,30 @@ +/* + * 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.options.seperateSections; import com.google.gson.annotations.Expose; -import io.github.moulberry.notenoughupdates.core.config.annotations.*; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorBoolean; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorColour; +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; public class Itemlist { @Expose 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 462fbd92..42316592 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 @@ -1,8 +1,30 @@ +/* + * 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.options.seperateSections; import com.google.gson.annotations.Expose; import io.github.moulberry.notenoughupdates.core.config.Position; -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.ConfigEditorButton; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigOption; public class LocationEdit { @Expose 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 697cabf3..2f31261d 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 @@ -1,8 +1,34 @@ +/* + * 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.options.seperateSections; import com.google.gson.annotations.Expose; import io.github.moulberry.notenoughupdates.core.config.Position; -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.ConfigEditorDraggableList; +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 java.util.ArrayList; import java.util.Arrays; 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 a04a51f9..c0f4e8c9 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,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.options.seperateSections; import com.google.gson.annotations.Expose; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/MiscOverlays.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/MiscOverlays.java index 616e8188..e56da32f 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/MiscOverlays.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/MiscOverlays.java @@ -1,8 +1,33 @@ +/* + * Copyright (C) 2022 NotEnoughUpdates contributors + * + * This file is part of NotEnoughUpdates. + * + * NotEnoughUpdates is free software: you can redistribute it + * and/or modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * NotEnoughUpdates is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with NotEnoughUpdates. If not, see . + */ + package io.github.moulberry.notenoughupdates.options.seperateSections; import com.google.gson.annotations.Expose; import io.github.moulberry.notenoughupdates.core.config.Position; -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.ConfigEditorDraggableList; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorDropdown; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigOption; import java.util.ArrayList; import java.util.Arrays; @@ -166,13 +191,13 @@ public class MiscOverlays { @Expose @ConfigOption( - name = "Daily Heavy Pearl Display", - desc = "Change the way the daily heavy pearl displays\n" + - "Only when ready, When very Soon, When soon, When kinda soon or always." + name = "Daily Heavy Pearl Display", + desc = "Change the way the daily heavy pearl displays\n" + + "Only when ready, When very Soon, When soon, When kinda soon or always." ) @ConfigAccordionId(id = 1) @ConfigEditorDropdown( - values = {"Only when ready", "When very Soon", "When soon", "When Kinda Soon", "Always"} + values = {"Only when ready", "When very Soon", "When soon", "When Kinda Soon", "Always"} ) public int dailyHeavyPearlDisplay = 0; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/NeuAuctionHouse.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/NeuAuctionHouse.java index 25efd693..44f3454a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/NeuAuctionHouse.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/NeuAuctionHouse.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.options.seperateSections; import com.google.gson.annotations.Expose; 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 bcdee28a..353cd36d 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 @@ -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.options.seperateSections; import com.google.gson.annotations.Expose; 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 9cba8202..353c4e08 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 @@ -1,8 +1,31 @@ +/* + * 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.options.seperateSections; import com.google.gson.annotations.Expose; import io.github.moulberry.notenoughupdates.core.config.Position; -import io.github.moulberry.notenoughupdates.core.config.annotations.*; +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.ConfigEditorDraggableList; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorDropdown; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigOption; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java index 04fe6e6b..5d3b6532 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java @@ -1,7 +1,30 @@ +/* + * 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.options.seperateSections; import com.google.gson.annotations.Expose; -import io.github.moulberry.notenoughupdates.core.config.annotations.*; +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.ConfigEditorDraggableList; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorFSR; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigOption; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/SkillOverlays.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/SkillOverlays.java index acdfbe54..54e17fcf 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/SkillOverlays.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/SkillOverlays.java @@ -1,8 +1,36 @@ +/* + * Copyright (C) 2022 NotEnoughUpdates contributors + * + * This file is part of NotEnoughUpdates. + * + * NotEnoughUpdates is free software: you can redistribute it + * and/or modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * NotEnoughUpdates is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with NotEnoughUpdates. If not, see . + */ + package io.github.moulberry.notenoughupdates.options.seperateSections; import com.google.gson.annotations.Expose; import io.github.moulberry.notenoughupdates.core.config.Position; -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.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.ConfigOption; import org.lwjgl.input.Keyboard; import java.util.ArrayList; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/SlayerOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/SlayerOverlay.java index 220b992b..927d00e5 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/SlayerOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/SlayerOverlay.java @@ -1,8 +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.options.seperateSections; import com.google.gson.annotations.Expose; import io.github.moulberry.notenoughupdates.core.config.Position; -import io.github.moulberry.notenoughupdates.core.config.annotations.*; +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.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.ConfigOption; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/SlotLocking.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/SlotLocking.java index c86708bb..22286808 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/SlotLocking.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/SlotLocking.java @@ -1,7 +1,30 @@ +/* + * 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.options.seperateSections; import com.google.gson.annotations.Expose; -import io.github.moulberry.notenoughupdates.core.config.annotations.*; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorBoolean; +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.ConfigOption; import org.lwjgl.input.Keyboard; public class SlotLocking { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/StorageGUI.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/StorageGUI.java index bdc9ee1b..e43fa5cf 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/StorageGUI.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/StorageGUI.java @@ -1,7 +1,34 @@ +/* + * 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.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.ConfigEditorColour; +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.ConfigOption; import org.lwjgl.input.Keyboard; public class StorageGUI { 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 741b57e5..7d2f4fc4 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 @@ -1,7 +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.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.ConfigEditorSlider; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigOption; public class Toolbar { @Expose diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TooltipTweaks.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TooltipTweaks.java index 79a107b7..d1660e68 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TooltipTweaks.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TooltipTweaks.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.options.seperateSections; import com.google.gson.annotations.Expose; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TradeMenu.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TradeMenu.java index d6f0808f..d2b4e0bb 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TradeMenu.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TradeMenu.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.options.seperateSections; import com.google.gson.annotations.Expose; 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 f36c0958..a493d201 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/AuctionSearchOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/AuctionSearchOverlay.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.overlays; import com.google.common.base.Splitter; @@ -25,7 +44,11 @@ import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; @@ -36,7 +59,8 @@ 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 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); @@ -135,7 +159,12 @@ public class AuctionSearchOverlay { 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); + 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); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/BonemerangOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/BonemerangOverlay.java index aa8a15ce..e8447699 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/BonemerangOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/BonemerangOverlay.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.overlays; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; @@ -14,7 +33,11 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.Vec3; import org.lwjgl.util.vector.Vector3f; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import java.util.function.Supplier; public class BonemerangOverlay extends TextOverlay { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/CombatSkillOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/CombatSkillOverlay.java index 6d46dfd6..250be27d 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/CombatSkillOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/CombatSkillOverlay.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.overlays; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; @@ -255,4 +274,4 @@ public class CombatSkillOverlay if (overlayStrings != null && overlayStrings.isEmpty()) overlayStrings = null; } } -} \ No newline at end of file +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/CrystalHollowOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/CrystalHollowOverlay.java index ea190323..aae5d028 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/CrystalHollowOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/CrystalHollowOverlay.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.overlays; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; @@ -16,7 +35,10 @@ import net.minecraft.util.EnumChatFormatting; import org.lwjgl.util.vector.Vector2f; import java.text.DecimalFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -79,11 +101,14 @@ public class CrystalHollowOverlay extends TextOverlay { Matcher hotmCrystalNotPlacedMatcher = hotmCrystalNotPlacedPattern.matcher(cleanLine); Matcher hotmCrystalNotFoundMatcher = hotmCrystalNotFoundPattern.matcher(cleanLine); Matcher hotmCrystalPlacedMatcher = hotmCrystalPlacedPattern.matcher(cleanLine); - if (hotmCrystalNotFoundMatcher.matches() && perProfileConfig.crystals.containsKey(hotmCrystalNotFoundMatcher.group("crystal"))) { + if (hotmCrystalNotFoundMatcher.matches() && + perProfileConfig.crystals.containsKey(hotmCrystalNotFoundMatcher.group("crystal"))) { perProfileConfig.crystals.put(hotmCrystalNotFoundMatcher.group("crystal"), 0); - } else if (hotmCrystalNotPlacedMatcher.matches() && perProfileConfig.crystals.containsKey(hotmCrystalNotPlacedMatcher.group("crystal"))) { + } else if (hotmCrystalNotPlacedMatcher.matches() && perProfileConfig.crystals.containsKey( + hotmCrystalNotPlacedMatcher.group("crystal"))) { perProfileConfig.crystals.put(hotmCrystalNotPlacedMatcher.group("crystal"), 1); - } else if (hotmCrystalPlacedMatcher.matches() && perProfileConfig.crystals.containsKey(hotmCrystalPlacedMatcher.group("crystal"))) { + } else if (hotmCrystalPlacedMatcher.matches() && + perProfileConfig.crystals.containsKey(hotmCrystalPlacedMatcher.group("crystal"))) { perProfileConfig.crystals.put(hotmCrystalPlacedMatcher.group("crystal"), 2); } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/FarmingOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/FarmingOverlay.java index bbab59cb..970c74ab 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/FarmingOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/FarmingOverlay.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.overlays; import com.google.gson.JsonObject; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/FishingSkillOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/FishingSkillOverlay.java index 6f7b21d8..717ff944 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/FishingSkillOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/FishingSkillOverlay.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.overlays; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; @@ -402,4 +421,4 @@ public class FishingSkillOverlay if (overlayStrings != null && overlayStrings.isEmpty()) overlayStrings = null; } } -} \ No newline at end of file +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/FuelBar.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/FuelBar.java index fa2db8b5..d180efcf 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/FuelBar.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/FuelBar.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.overlays; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/MiningOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/MiningOverlay.java index 96864391..5dda0d85 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/MiningOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/MiningOverlay.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.overlays; import com.google.common.collect.ComparisonChain; @@ -26,12 +45,24 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.lwjgl.util.vector.Vector2f; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static net.minecraft.util.EnumChatFormatting.*; +import static net.minecraft.util.EnumChatFormatting.BLUE; +import static net.minecraft.util.EnumChatFormatting.BOLD; +import static net.minecraft.util.EnumChatFormatting.DARK_AQUA; +import static net.minecraft.util.EnumChatFormatting.GOLD; +import static net.minecraft.util.EnumChatFormatting.GREEN; +import static net.minecraft.util.EnumChatFormatting.RED; +import static net.minecraft.util.EnumChatFormatting.RESET; +import static net.minecraft.util.EnumChatFormatting.YELLOW; public class MiningOverlay extends TextOverlay { public MiningOverlay( @@ -219,7 +250,7 @@ public class MiningOverlay extends TextOverlay { // Get commission and forge info even if the overlay isn't going to be rendered since it is used elsewhere //thanks to "Pure Genie#7250" for helping with this (makes tita alert and waypoints work without mine overlay) - if(SBInfo.getInstance().getLocation() == null) return; + if (SBInfo.getInstance().getLocation() == null) return; if (SBInfo.getInstance().getLocation().equals("mining_3") || SBInfo.getInstance().getLocation().equals("crystal_hollows")) { commissionProgress.clear(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/MiningSkillOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/MiningSkillOverlay.java index fb7cdab5..a20b1d27 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/MiningSkillOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/MiningSkillOverlay.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.overlays; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; @@ -358,4 +377,4 @@ public class MiningSkillOverlay if (overlayStrings != null && overlayStrings.isEmpty()) overlayStrings = null; } } -} \ No newline at end of file +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/OverlayManager.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/OverlayManager.java index 8c25594e..c1a1c848 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/OverlayManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/OverlayManager.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.overlays; import com.google.common.collect.Lists; 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 9661812f..2a30f6f1 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/RancherBootOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/RancherBootOverlay.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.overlays; import io.github.moulberry.notenoughupdates.core.GuiElementTextField; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/SlayerOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/SlayerOverlay.java index e2b22b82..00e13016 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/SlayerOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/SlayerOverlay.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.overlays; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; @@ -8,7 +27,11 @@ import net.minecraft.client.Minecraft; import net.minecraft.util.EnumChatFormatting; import java.text.NumberFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; import java.util.function.Supplier; public class SlayerOverlay extends TextOverlay { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/TextOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/TextOverlay.java index 5fe066f2..f8e02fef 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/TextOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/TextOverlay.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.overlays; import io.github.moulberry.notenoughupdates.core.config.Position; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/TextOverlayStyle.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/TextOverlayStyle.java index 4a3a2b73..2ccc3ace 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/TextOverlayStyle.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/TextOverlayStyle.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.overlays; public enum TextOverlayStyle { 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 0454044f..5510023c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/TimersOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/TimersOverlay.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.overlays; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; @@ -805,6 +824,7 @@ public class TimersOverlay extends TextOverlay { public static int beforePearls = -1; public static int afterPearls = -1; public static int availablePearls = -1; + public static int heavyPearlCount() { int heavyPearls = 0; @@ -827,12 +847,12 @@ public class TimersOverlay extends TextOverlay { } public static void processActionBar(String msg) { - if(SBInfo.getInstance().location.equals("Belly of the Beast")) { + if (SBInfo.getInstance().location.equals("Belly of the Beast")) { try { msg = Utils.cleanColour(msg); - msg = msg.substring(msg.indexOf("Pearls Collected: ")+18); - availablePearls = Integer.parseInt(msg.substring(msg.indexOf("/")+1)); - } catch(Exception e) { + msg = msg.substring(msg.indexOf("Pearls Collected: ") + 18); + availablePearls = Integer.parseInt(msg.substring(msg.indexOf("/") + 1)); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BingoPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BingoPage.java index 0d03f297..dfcbb007 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BingoPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BingoPage.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.profileviewer; import com.google.gson.JsonArray; 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 ee73f66f..ba3b97f8 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.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.profileviewer; import com.google.common.base.Splitter; 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 a2d297f5..ed7eb55d 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/Panorama.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/Panorama.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.profileviewer; import io.github.moulberry.notenoughupdates.util.TexLoc; @@ -27,7 +46,6 @@ 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) { 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 6535a99a..4865830c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PlayerStats.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PlayerStats.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.profileviewer; import com.google.gson.JsonArray; @@ -247,6 +266,7 @@ 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))); 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 95acb7d8..5ed84b03 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.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.profileviewer; import com.google.gson.JsonArray; @@ -239,10 +258,13 @@ 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") + put( + "MAGMA_FISH", + Utils.createSkull( + EnumChatFormatting.AQUA + "Magmafish", + "5c53195c-5b98-3476-9731-c32647b22723", + "ewogICJ0aW1lc3RhbXAiIDogMTY0MjQ4ODA3MDY2NiwKICAicHJvZmlsZUlkIiA6ICIzNDkxZjJiOTdjMDE0MWE2OTM2YjFjMjJhMmEwMGZiNyIsCiAgInByb2ZpbGVOYW1lIiA6ICJKZXNzc3N1aGgiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjU2YjU5NTViMjk1NTIyYzk2ODk0ODE5NjBjMDFhOTkyY2ExYzc3NTRjZjRlZTMxM2M4ZGQwYzM1NmQzMzVmIgogICAgfQogIH0KfQ" + ) ); }}; private static final AtomicBoolean updatingResourceCollection = new AtomicBoolean(false); @@ -1287,7 +1309,8 @@ public class ProfileViewer { } } for (JsonObject current_member_info : coopMembers) { - if (!current_member_info.has("crafted_generators") || !current_member_info.get("crafted_generators").isJsonArray()) continue; + if (!current_member_info.has("crafted_generators") || + !current_member_info.get("crafted_generators").isJsonArray()) continue; JsonArray crafted_generators = Utils.getElement(current_member_info, "crafted_generators").getAsJsonArray(); for (int j = 0; j < crafted_generators.size(); j++) { String unlocked = crafted_generators.get(j).getAsString(); @@ -1365,7 +1388,7 @@ public class ProfileViewer { } public PlayerStats.Stats getStats(String profileId) { - if(stats.get(profileId) != null) return stats.get(profileId); + if (stats.get(profileId) != null) return stats.get(profileId); JsonObject profileInfo = getProfileInformation(profileId); if (profileInfo == null) { return null; 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 45675945..004ea372 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/CraftingOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/CraftingOverlay.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.recipes; import io.github.moulberry.notenoughupdates.NEUManager; @@ -50,10 +69,10 @@ public class CraftingOverlay { ) { forEachSlot(chest, (recipeIngredient, slot) -> { if (Utils.isWithinRect( - mouseX, mouseY, - slot.xDisplayPosition + ((AccessorGuiContainer) gui).getGuiLeft(), - slot.yDisplayPosition + ((AccessorGuiContainer) gui).getGuiTop(), - 16, 16 + mouseX, mouseY, + slot.xDisplayPosition + ((AccessorGuiContainer) gui).getGuiLeft(), + slot.yDisplayPosition + ((AccessorGuiContainer) gui).getGuiTop(), + 16, 16 )) block.accept(recipeIngredient, slot); }); @@ -81,9 +100,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, - ((AccessorGuiContainer) guiChest).getGuiTop() - 15f, 0x808080 + currentRecipe.getCraftText(), + Utils.peekGuiScale().getScaledWidth() / 2f - fontRenderer.getStringWidth(currentRecipe.getCraftText()) / 2f, + ((AccessorGuiContainer) guiChest).getGuiTop() - 15f, 0x808080 ); } renderTooltip(guiChest, chest); @@ -141,8 +160,8 @@ public class CraftingOverlay { } private void drawItemStack(GuiChest gui, Slot slot, ItemStack item) { - int slotX = slot.xDisplayPosition + ((AccessorGuiContainer)gui).getGuiLeft(); - int slotY = slot.yDisplayPosition + ((AccessorGuiContainer)gui).getGuiTop(); + 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/java/io/github/moulberry/notenoughupdates/recipes/CraftingRecipe.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/CraftingRecipe.java index 79f349fa..a642187b 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/CraftingRecipe.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/CraftingRecipe.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.recipes; import com.google.common.collect.Sets; @@ -17,135 +36,136 @@ import java.util.Set; public class CraftingRecipe implements NeuRecipe { - 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); - } + 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 7847b0b4..47eb0d11 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/ForgeRecipe.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/ForgeRecipe.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.recipes; import com.google.common.collect.Sets; @@ -15,216 +34,256 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Set; public class ForgeRecipe implements NeuRecipe { - 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); - } + 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 c4928605..c973f8c0 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/Ingredient.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/Ingredient.java @@ -1,10 +1,27 @@ +/* + * 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.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; import java.util.HashMap; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/recipes/ItemShopRecipe.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/ItemShopRecipe.java index 778f156f..235ba3ce 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/ItemShopRecipe.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/ItemShopRecipe.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.recipes; import com.google.common.collect.Sets; 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 a65bfec2..0d891071 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/MobLootRecipe.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/MobLootRecipe.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.recipes; import com.google.common.collect.Sets; 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 04945cc5..a0090050 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/NeuRecipe.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/NeuRecipe.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.recipes; import com.google.gson.JsonObject; 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 3e3b06b1..d63ea42c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeGenerator.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeGenerator.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.recipes; import com.google.gson.JsonArray; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeSlot.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeSlot.java index 61f8ef27..489485e4 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeSlot.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeSlot.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.recipes; import io.github.moulberry.notenoughupdates.miscgui.GuiItemRecipe; 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 023b20eb..de9c869f 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeType.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/RecipeType.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.recipes; import com.google.gson.JsonObject; 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 10eb96a5..9bb79604 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/VillagerTradeRecipe.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/VillagerTradeRecipe.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.recipes; import com.google.common.collect.Sets; @@ -17,134 +36,151 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.passive.EntityVillager; import net.minecraft.util.ResourceLocation; -import java.util.*; +import java.util.Arrays; +import java.util.Calendar; +import java.util.List; +import java.util.Set; +import java.util.UUID; public class VillagerTradeRecipe implements NeuRecipe { - 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.serialize()); - 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 - ); - } + 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.serialize()); + 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/AllowEmptyHTMLTag.java b/src/main/java/io/github/moulberry/notenoughupdates/util/AllowEmptyHTMLTag.java index b7fc55e4..5c223605 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/AllowEmptyHTMLTag.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/AllowEmptyHTMLTag.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.util; import info.bliki.htmlcleaner.TagNode; 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 4c421f3e..3230714a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/Constants.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/Constants.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.util; import com.google.gson.Gson; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/Debouncer.java b/src/main/java/io/github/moulberry/notenoughupdates/util/Debouncer.java index 15808a29..ec076a77 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/Debouncer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/Debouncer.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.util; /** diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/DiscordMarkdownBuilder.java b/src/main/java/io/github/moulberry/notenoughupdates/util/DiscordMarkdownBuilder.java index 1c78f924..3c6c5f3d 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/DiscordMarkdownBuilder.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/DiscordMarkdownBuilder.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.util; public class DiscordMarkdownBuilder { 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 ba57537e..3ead5a56 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/GuiTextures.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/GuiTextures.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.util; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/HastebinUploader.java b/src/main/java/io/github/moulberry/notenoughupdates/util/HastebinUploader.java index 9cbad402..27993510 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/HastebinUploader.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/HastebinUploader.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.util; import com.google.gson.Gson; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/HotmInformation.java b/src/main/java/io/github/moulberry/notenoughupdates/util/HotmInformation.java index 800c025a..5d7bfa6d 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/HotmInformation.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/HotmInformation.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.util; import com.google.gson.JsonArray; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/HypixelApi.java b/src/main/java/io/github/moulberry/notenoughupdates/util/HypixelApi.java index 937a0ab8..3e38fd2e 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/HypixelApi.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/HypixelApi.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.util; import com.google.gson.Gson; 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 729e68bd..6abcc33d 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.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.util; import net.minecraft.item.ItemStack; 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 5ee1dda1..2e2977cc 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/JsonUtils.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/JsonUtils.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.util; import com.google.gson.JsonArray; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/LerpingFloat.java b/src/main/java/io/github/moulberry/notenoughupdates/util/LerpingFloat.java index a034fa8d..e2bfa711 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/LerpingFloat.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/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.util; public class LerpingFloat { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/NEUDebugLogger.java b/src/main/java/io/github/moulberry/notenoughupdates/util/NEUDebugLogger.java index 827a3e97..230b8ae5 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/NEUDebugLogger.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/NEUDebugLogger.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.util; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; @@ -6,8 +25,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; -import java.util.Collections; -import java.util.EnumSet; import java.util.function.Consumer; public class NEUDebugLogger { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/NEUResourceManager.java b/src/main/java/io/github/moulberry/notenoughupdates/util/NEUResourceManager.java index 3ef40567..af681f2d 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/NEUResourceManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/NEUResourceManager.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.util; import net.minecraft.client.resources.IResource; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/NotificationHandler.java b/src/main/java/io/github/moulberry/notenoughupdates/util/NotificationHandler.java index 492c1dd7..c64fdb56 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/NotificationHandler.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/NotificationHandler.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.util; import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/ProfileApiSyncer.java b/src/main/java/io/github/moulberry/notenoughupdates/util/ProfileApiSyncer.java index 439ad571..b90e8087 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/ProfileApiSyncer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/ProfileApiSyncer.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.util; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/RequestFocusListener.java b/src/main/java/io/github/moulberry/notenoughupdates/util/RequestFocusListener.java index 3df5d9f1..092c8564 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/RequestFocusListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/RequestFocusListener.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.util; import javax.swing.*; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/ReverseWorldRenderer.java b/src/main/java/io/github/moulberry/notenoughupdates/util/ReverseWorldRenderer.java index c517bd08..634c94b6 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/ReverseWorldRenderer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/ReverseWorldRenderer.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.util; import com.google.common.primitives.Floats; @@ -9,10 +28,13 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.apache.logging.log4j.LogManager; -import java.nio.*; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.ShortBuffer; import java.util.Arrays; import java.util.BitSet; -import java.util.Comparator; @SideOnly(Side.CLIENT) public class ReverseWorldRenderer { @@ -564,4 +586,4 @@ public class ReverseWorldRenderer { return this.stateVertexFormat; } } -} \ No newline at end of file +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java b/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java index 6519d547..9419be4f 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.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.util; import com.google.common.reflect.TypeToken; @@ -37,7 +56,12 @@ import java.nio.file.Files; import java.nio.file.Path; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -369,7 +393,9 @@ public class SBInfo { for (String line : lines) { if (line.contains("⏣")) { String l = Utils.cleanColour(line).replaceAll("[^A-Za-z0-9() ]", "").trim(); - if(!l.equals(location)) { new ScoreboardLocationChangeListener(location, l); } + if (!l.equals(location)) { + new ScoreboardLocationChangeListener(location, l); + } location = l; break; } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/SkytilsCompat.java b/src/main/java/io/github/moulberry/notenoughupdates/util/SkytilsCompat.java index 5bc5d13c..97c11fe2 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/SkytilsCompat.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/SkytilsCompat.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.util; import net.minecraft.item.ItemStack; @@ -6,7 +25,6 @@ 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 { @@ -49,7 +67,7 @@ public class SkytilsCompat { ); isSkytilsFullyPresent = true; } catch (ClassNotFoundException | NoSuchMethodException | NoSuchFieldException | IllegalAccessException | - InvocationTargetException e) { + InvocationTargetException e) { System.err.println("Failed to get Skytils class even tho Skytils mod is present. This is (probably) a NEU bug"); e.printStackTrace(); } @@ -64,6 +82,7 @@ public class SkytilsCompat { public static boolean isSkytilsPresent() { return Holder.isSkytilsPresent; } + public static void renderSkytilsRarity(ItemStack stack, int x, int y) { renderSkytilsRarity(stack, x, y, false); } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/SpecialColour.java b/src/main/java/io/github/moulberry/notenoughupdates/util/SpecialColour.java index 27a40565..e3318e3c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/SpecialColour.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/SpecialColour.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.util; import java.awt.*; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/TexLoc.java b/src/main/java/io/github/moulberry/notenoughupdates/util/TexLoc.java index b38db88f..bcce86bb 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/TexLoc.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/TexLoc.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.util; import org.lwjgl.input.Keyboard; 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 4f420de1..b6447706 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.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.util; import com.google.common.base.Splitter; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/XPInformation.java b/src/main/java/io/github/moulberry/notenoughupdates/util/XPInformation.java index aef2490e..158f9917 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/XPInformation.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/XPInformation.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.util; import com.google.common.base.Splitter; diff --git a/src/main/resources/assets/notenoughupdates/dream.json b/src/main/resources/assets/notenoughupdates/dream.json index 6f27e89e..9dda86c6 100644 --- a/src/main/resources/assets/notenoughupdates/dream.json +++ b/src/main/resources/assets/notenoughupdates/dream.json @@ -1,49 +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" - } + { + "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/dungeon_map/borders/large/1.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/1.json index 23e86d67..860548cf 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/1.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/1.json @@ -1,3 +1,3 @@ { - "radiusSq": 0.25 -} \ No newline at end of file + "radiusSq": 0.25 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/10.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/10.json index 23e86d67..860548cf 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/10.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/10.json @@ -1,3 +1,3 @@ { - "radiusSq": 0.25 -} \ No newline at end of file + "radiusSq": 0.25 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/11.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/11.json index 23e86d67..860548cf 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/11.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/11.json @@ -1,3 +1,3 @@ { - "radiusSq": 0.25 -} \ No newline at end of file + "radiusSq": 0.25 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/2.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/2.json index 9576ae4f..69245cb7 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/2.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/2.json @@ -1,3 +1,3 @@ { - "radiusSq": 1 -} \ No newline at end of file + "radiusSq": 1 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/3.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/3.json index 9576ae4f..69245cb7 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/3.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/3.json @@ -1,3 +1,3 @@ { - "radiusSq": 1 -} \ No newline at end of file + "radiusSq": 1 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/4.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/4.json index 9576ae4f..69245cb7 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/4.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/4.json @@ -1,3 +1,3 @@ { - "radiusSq": 1 -} \ No newline at end of file + "radiusSq": 1 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/5.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/5.json index 23e86d67..860548cf 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/5.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/5.json @@ -1,3 +1,3 @@ { - "radiusSq": 0.25 -} \ No newline at end of file + "radiusSq": 0.25 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/6.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/6.json index 9576ae4f..69245cb7 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/6.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/6.json @@ -1,3 +1,3 @@ { - "radiusSq": 1 -} \ No newline at end of file + "radiusSq": 1 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/7.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/7.json index 9576ae4f..69245cb7 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/7.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/7.json @@ -1,3 +1,3 @@ { - "radiusSq": 1 -} \ No newline at end of file + "radiusSq": 1 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/8.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/8.json index b2625fc5..b21bf2b8 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/8.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/8.json @@ -1,3 +1,3 @@ { - "radiusSq": 0.21 -} \ No newline at end of file + "radiusSq": 0.21 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/9.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/9.json index 9576ae4f..69245cb7 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/9.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/large/9.json @@ -1,3 +1,3 @@ { - "radiusSq": 1 -} \ No newline at end of file + "radiusSq": 1 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/1.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/1.json index 23e86d67..860548cf 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/1.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/1.json @@ -1,3 +1,3 @@ { - "radiusSq": 0.25 -} \ No newline at end of file + "radiusSq": 0.25 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/10.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/10.json index 23e86d67..860548cf 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/10.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/10.json @@ -1,3 +1,3 @@ { - "radiusSq": 0.25 -} \ No newline at end of file + "radiusSq": 0.25 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/11.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/11.json index 23e86d67..860548cf 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/11.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/11.json @@ -1,3 +1,3 @@ { - "radiusSq": 0.25 -} \ No newline at end of file + "radiusSq": 0.25 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/2.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/2.json index 9576ae4f..69245cb7 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/2.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/2.json @@ -1,3 +1,3 @@ { - "radiusSq": 1 -} \ No newline at end of file + "radiusSq": 1 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/3.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/3.json index 9576ae4f..69245cb7 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/3.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/3.json @@ -1,3 +1,3 @@ { - "radiusSq": 1 -} \ No newline at end of file + "radiusSq": 1 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/4.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/4.json index 9576ae4f..69245cb7 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/4.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/4.json @@ -1,3 +1,3 @@ { - "radiusSq": 1 -} \ No newline at end of file + "radiusSq": 1 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/5.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/5.json index 23e86d67..860548cf 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/5.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/5.json @@ -1,3 +1,3 @@ { - "radiusSq": 0.25 -} \ No newline at end of file + "radiusSq": 0.25 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/6.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/6.json index 9576ae4f..69245cb7 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/6.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/6.json @@ -1,3 +1,3 @@ { - "radiusSq": 1 -} \ No newline at end of file + "radiusSq": 1 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/7.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/7.json index 9576ae4f..69245cb7 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/7.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/7.json @@ -1,3 +1,3 @@ { - "radiusSq": 1 -} \ No newline at end of file + "radiusSq": 1 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/8.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/8.json index 8c12699d..42f0d5e6 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/8.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/8.json @@ -1,3 +1,3 @@ { - "radiusSq": 0.22 -} \ No newline at end of file + "radiusSq": 0.22 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/9.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/9.json index 9576ae4f..69245cb7 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/9.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/medium/9.json @@ -1,3 +1,3 @@ { - "radiusSq": 1 -} \ No newline at end of file + "radiusSq": 1 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/1.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/1.json index 23e86d67..860548cf 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/1.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/1.json @@ -1,3 +1,3 @@ { - "radiusSq": 0.25 -} \ No newline at end of file + "radiusSq": 0.25 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/10.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/10.json index 23e86d67..860548cf 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/10.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/10.json @@ -1,3 +1,3 @@ { - "radiusSq": 0.25 -} \ No newline at end of file + "radiusSq": 0.25 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/11.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/11.json index 23e86d67..860548cf 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/11.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/11.json @@ -1,3 +1,3 @@ { - "radiusSq": 0.25 -} \ No newline at end of file + "radiusSq": 0.25 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/2.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/2.json index 9576ae4f..69245cb7 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/2.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/2.json @@ -1,3 +1,3 @@ { - "radiusSq": 1 -} \ No newline at end of file + "radiusSq": 1 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/3.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/3.json index 9576ae4f..69245cb7 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/3.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/3.json @@ -1,3 +1,3 @@ { - "radiusSq": 1 -} \ No newline at end of file + "radiusSq": 1 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/4.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/4.json index 9576ae4f..69245cb7 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/4.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/4.json @@ -1,3 +1,3 @@ { - "radiusSq": 1 -} \ No newline at end of file + "radiusSq": 1 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/5.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/5.json index 23e86d67..860548cf 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/5.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/5.json @@ -1,3 +1,3 @@ { - "radiusSq": 0.25 -} \ No newline at end of file + "radiusSq": 0.25 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/6.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/6.json index 9576ae4f..69245cb7 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/6.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/6.json @@ -1,3 +1,3 @@ { - "radiusSq": 1 -} \ No newline at end of file + "radiusSq": 1 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/7.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/7.json index 9576ae4f..69245cb7 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/7.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/7.json @@ -1,3 +1,3 @@ { - "radiusSq": 1 -} \ No newline at end of file + "radiusSq": 1 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/8.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/8.json index 8c12699d..42f0d5e6 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/8.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/8.json @@ -1,3 +1,3 @@ { - "radiusSq": 0.22 -} \ No newline at end of file + "radiusSq": 0.22 +} diff --git a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/9.json b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/9.json index 9576ae4f..69245cb7 100644 --- a/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/9.json +++ b/src/main/resources/assets/notenoughupdates/dungeon_map/borders/small/9.json @@ -1,3 +1,3 @@ { - "radiusSq": 1 -} \ No newline at end of file + "radiusSq": 1 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-1.json index 5b97e666..981f0029 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-1.json @@ -1 +1,8 @@ -{"8:7":true,"9:7":true,"9:1":true,"7:8":true,"2:0":true,"8:3":true} \ No newline at end of file +{ + "8:7": true, + "9:7": true, + "9:1": true, + "7:8": true, + "2:0": true, + "8:3": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-2.json index ec49e91c..05e5c008 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-2.json @@ -1 +1,16 @@ -{"12:11":189,"14:9":true,"15:7":true,"9:15":true,"13:10":188,"10:10":185,"7:13":184,"15:8":true,"14:8":true,"8:12":184,"1:14":true,"14:10":189,"13:11":189,"4:12":true} \ No newline at end of file +{ + "12:11": 189, + "14:9": true, + "15:7": true, + "9:15": true, + "13:10": 188, + "10:10": 185, + "7:13": 184, + "15:8": true, + "14:8": true, + "8:12": 184, + "1:14": true, + "14:10": 189, + "13:11": 189, + "4:12": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-3.json index 70660f8d..1763c9aa 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-3.json @@ -1 +1,14 @@ -{"1:5":true,"0:6":true,"0:4":true,"1:6":[177,178],"1:4":true,"0:7":[177,179]} \ No newline at end of file +{ + "1:5": true, + "0:6": true, + "0:4": true, + "1:6": [ + 177, + 178 + ], + "1:4": true, + "0:7": [ + 177, + 179 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-4.json index 16206a50..1956eeb5 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-4.json @@ -1 +1,36 @@ -{"6:0":true,"1:11":[199,201],"10:4":true,"10:3":true,"7:2":true,"2:9":true,"10:2":true,"0:10":[199,217],"3:12":199,"2:8":true,"7:0":true,"6:2":true,"2:11":true,"15:4":true,"2:12":[169,200],"15:3":true,"6:1":true,"15:2":true,"2:14":[169,172],"15:13":true,"2:10":true,"7:1":true} \ No newline at end of file +{ + "6:0": true, + "1:11": [ + 199, + 201 + ], + "10:4": true, + "10:3": true, + "7:2": true, + "2:9": true, + "10:2": true, + "0:10": [ + 199, + 217 + ], + "3:12": 199, + "2:8": true, + "7:0": true, + "6:2": true, + "2:11": true, + "15:4": true, + "2:12": [ + 169, + 200 + ], + "15:3": true, + "6:1": true, + "15:2": true, + "2:14": [ + 169, + 172 + ], + "15:13": true, + "2:10": true, + "7:1": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-5.json index 897faaee..7f1786f9 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-5.json @@ -1 +1,12 @@ -{"7:15":true,"6:13":true,"7:13":231,"6:14":true,"6:12":true,"6:15":true,"8:15":true,"7:0":true,"8:0":true,"5:13":true} \ No newline at end of file +{ + "7:15": true, + "6:13": true, + "7:13": 231, + "6:14": true, + "6:12": true, + "6:15": true, + "8:15": true, + "7:0": true, + "8:0": true, + "5:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-6.json index ef35b97d..99a4c6e4 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-6.json @@ -1 +1,31 @@ -{"12:1":200,"11:5":true,"12:5":true,"11:1":200,"10:12":true,"11:8":true,"12:8":true,"10:10":true,"4:1":true,"11:9":true,"10:0":true,"9:10":true,"5:1":true,"3:2":200,"11:7":true,"12:7":true,"11:0":201,"12:6":true,"10:9":true,"12:0":201,"9:9":true,"13:1":true,"4:2":200,"11:4":true,"9:11":true,"10:5":true,"5:0":true,"10:11":true,"8:15":true} \ No newline at end of file +{ + "12:1": 200, + "11:5": true, + "12:5": true, + "11:1": 200, + "10:12": true, + "11:8": true, + "12:8": true, + "10:10": true, + "4:1": true, + "11:9": true, + "10:0": true, + "9:10": true, + "5:1": true, + "3:2": 200, + "11:7": true, + "12:7": true, + "11:0": 201, + "12:6": true, + "10:9": true, + "12:0": 201, + "9:9": true, + "13:1": true, + "4:2": 200, + "11:4": true, + "9:11": true, + "10:5": true, + "5:0": true, + "10:11": true, + "8:15": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-7.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-7.json index d23b3f4b..8c286333 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-7.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_-7.json @@ -1 +1,7 @@ -{"11:15":[202,203],"10:15":true} \ No newline at end of file +{ + "11:15": [ + 202, + 203 + ], + "10:15": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_0.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_0.json index 99a12616..a794f893 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_0.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_0.json @@ -1 +1,27 @@ -{"14:14":true,"4:14":true,"3:13":true,"13:13":true,"10:14":true,"0:13":true,"15:14":true,"11:13":true,"12:13":true,"2:14":true,"1:13":true,"12:14":true,"2:13":true,"1:14":true,"7:13":true,"11:14":true,"15:13":true,"13:14":true,"10:13":true,"5:13":true,"0:14":true,"3:14":true,"14:13":true,"9:13":true,"4:13":true} \ No newline at end of file +{ + "14:14": true, + "4:14": true, + "3:13": true, + "13:13": true, + "10:14": true, + "0:13": true, + "15:14": true, + "11:13": true, + "12:13": true, + "2:14": true, + "1:13": true, + "12:14": true, + "2:13": true, + "1:14": true, + "7:13": true, + "11:14": true, + "15:13": true, + "13:14": true, + "10:13": true, + "5:13": true, + "0:14": true, + "3:14": true, + "14:13": true, + "9:13": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_3.json index 857daba9..8d8fb9d1 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_3.json @@ -1 +1,101 @@ -{"9:14":true,"2:7":[171,194],"8:8":true,"7:12":[174,176],"10:14":true,"11:11":true,"10:12":true,"6:13":175,"2:9":true,"9:15":184,"9:12":true,"3:6":170,"10:15":true,"7:14":176,"8:7":true,"5:5":true,"7:13":175,"2:8":[192,194],"9:10":true,"4:5":true,"6:14":true,"10:13":true,"8:9":true,"7:10":172,"6:12":176,"1:7":171,"9:13":true,"8:13":174,"2:12":true,"7:7":true,"9:9":true,"8:10":171,"7:9":172,"3:5":true,"0:11":true,"9:7":true,"2:14":true,"7:8":true,"8:12":173,"4:6":true,"2:13":true,"5:6":true,"6:7":true,"8:14":175,"9:8":true,"3:13":true,"1:5":171,"0:13":true,"6:6":true,"8:5":true,"5:7":true,"8:11":172,"4:7":171,"9:6":true,"3:12":true,"0:15":true,"0:12":true,"2:5":[171,192],"0:14":true,"3:14":true,"7:6":true,"4:14":true,"1:6":170,"11:10":true,"6:5":true,"5:14":true,"11:13":true,"5:12":176,"8:6":true,"4:12":true,"3:7":171,"9:11":[173,190],"10:11":true,"11:14":true,"11:12":true,"5:13":true,"7:5":true,"11:15":true,"7:11":173,"4:13":true,"2:6":[170,193]} \ No newline at end of file +{ + "9:14": true, + "2:7": [ + 171, + 194 + ], + "8:8": true, + "7:12": [ + 174, + 176 + ], + "10:14": true, + "11:11": true, + "10:12": true, + "6:13": 175, + "2:9": true, + "9:15": 184, + "9:12": true, + "3:6": 170, + "10:15": true, + "7:14": 176, + "8:7": true, + "5:5": true, + "7:13": 175, + "2:8": [ + 192, + 194 + ], + "9:10": true, + "4:5": true, + "6:14": true, + "10:13": true, + "8:9": true, + "7:10": 172, + "6:12": 176, + "1:7": 171, + "9:13": true, + "8:13": 174, + "2:12": true, + "7:7": true, + "9:9": true, + "8:10": 171, + "7:9": 172, + "3:5": true, + "0:11": true, + "9:7": true, + "2:14": true, + "7:8": true, + "8:12": 173, + "4:6": true, + "2:13": true, + "5:6": true, + "6:7": true, + "8:14": 175, + "9:8": true, + "3:13": true, + "1:5": 171, + "0:13": true, + "6:6": true, + "8:5": true, + "5:7": true, + "8:11": 172, + "4:7": 171, + "9:6": true, + "3:12": true, + "0:15": true, + "0:12": true, + "2:5": [ + 171, + 192 + ], + "0:14": true, + "3:14": true, + "7:6": true, + "4:14": true, + "1:6": 170, + "11:10": true, + "6:5": true, + "5:14": true, + "11:13": true, + "5:12": 176, + "8:6": true, + "4:12": true, + "3:7": 171, + "9:11": [ + 173, + 190 + ], + "10:11": true, + "11:14": true, + "11:12": true, + "5:13": true, + "7:5": true, + "11:15": true, + "7:11": 173, + "4:13": true, + "2:6": [ + 170, + 193 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_4.json index 31878b3e..39157aec 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_4.json @@ -1 +1,95 @@ -{"1:1":true,"11:5":true,"3:0":true,"0:6":true,"0:0":true,"8:1":171,"3:6":true,"5:5":true,"0:2":true,"4:5":true,"3:2":true,"3:4":true,"0:3":true,"3:3":true,"0:4":true,"2:1":true,"11:0":true,"4:3":true,"5:4":true,"5:3":true,"6:1":true,"4:4":true,"3:5":true,"4:2":true,"0:11":true,"5:2":true,"0:5":true,"11:4":true,"9:1":[171,187],"4:6":true,"5:0":true,"10:1":true,"5:6":true,"11:3":true,"4:0":true,"11:2":true,"7:1":true,"9:3":171,"6:0":true,"10:4":true,"10:3":true,"1:5":true,"7:2":true,"6:6":true,"11:1":true,"9:4":171,"8:5":true,"7:4":true,"9:2":171,"10:2":true,"0:10":true,"7:3":true,"9:6":true,"4:1":true,"6:4":true,"10:0":true,"5:1":true,"9:0":[171,185],"6:3":true,"7:0":171,"2:5":true,"6:2":true,"7:6":true,"1:6":true,"6:5":true,"2:2":true,"0:8":true,"1:0":true,"2:4":true,"8:0":171,"0:1":true,"8:6":true,"3:1":true,"2:3":true,"10:5":true,"1:3":true,"9:5":true,"8:2":171,"1:4":true,"0:7":true,"2:0":true,"8:4":true,"1:2":true,"7:5":true,"8:3":true,"0:9":true,"2:6":true} \ No newline at end of file +{ + "1:1": true, + "11:5": true, + "3:0": true, + "0:6": true, + "0:0": true, + "8:1": 171, + "3:6": true, + "5:5": true, + "0:2": true, + "4:5": true, + "3:2": true, + "3:4": true, + "0:3": true, + "3:3": true, + "0:4": true, + "2:1": true, + "11:0": true, + "4:3": true, + "5:4": true, + "5:3": true, + "6:1": true, + "4:4": true, + "3:5": true, + "4:2": true, + "0:11": true, + "5:2": true, + "0:5": true, + "11:4": true, + "9:1": [ + 171, + 187 + ], + "4:6": true, + "5:0": true, + "10:1": true, + "5:6": true, + "11:3": true, + "4:0": true, + "11:2": true, + "7:1": true, + "9:3": 171, + "6:0": true, + "10:4": true, + "10:3": true, + "1:5": true, + "7:2": true, + "6:6": true, + "11:1": true, + "9:4": 171, + "8:5": true, + "7:4": true, + "9:2": 171, + "10:2": true, + "0:10": true, + "7:3": true, + "9:6": true, + "4:1": true, + "6:4": true, + "10:0": true, + "5:1": true, + "9:0": [ + 171, + 185 + ], + "6:3": true, + "7:0": 171, + "2:5": true, + "6:2": true, + "7:6": true, + "1:6": true, + "6:5": true, + "2:2": true, + "0:8": true, + "1:0": true, + "2:4": true, + "8:0": 171, + "0:1": true, + "8:6": true, + "3:1": true, + "2:3": true, + "10:5": true, + "1:3": true, + "9:5": true, + "8:2": 171, + "1:4": true, + "0:7": true, + "2:0": true, + "8:4": true, + "1:2": true, + "7:5": true, + "8:3": true, + "0:9": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_6.json index 35cdf158..7520ac2c 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_6.json @@ -1 +1,219 @@ -{"8:8":true,"6:10":true,"13:13":true,"3:0":true,"3:6":true,"13:15":true,"10:10":true,"8:7":true,"5:5":true,"4:11":true,"9:10":true,"5:11":true,"4:5":true,"13:12":true,"3:2":true,"13:14":true,"3:4":true,"8:9":true,"7:10":true,"3:3":true,"0:4":true,"14:14":true,"4:3":true,"5:4":true,"2:12":true,"7:7":true,"5:3":true,"2:15":true,"15:14":true,"9:9":true,"4:4":true,"8:10":true,"7:9":true,"6:8":true,"3:5":true,"15:12":true,"14:15":true,"13:1":[152,153],"4:2":true,"15:15":true,"14:12":true,"9:7":true,"5:2":true,"2:14":true,"1:13":true,"0:5":true,"2:13":true,"7:8":true,"6:9":true,"4:6":true,"1:14":true,"5:0":true,"5:6":true,"4:0":true,"15:13":true,"1:15":true,"6:7":true,"1:12":true,"9:8":true,"14:13":true,"3:13":true,"1:5":true,"0:13":true,"13:0":true,"14:11":true,"4:1":true,"3:12":true,"0:15":true,"5:1":true,"3:15":true,"0:12":true,"15:11":true,"2:5":true,"0:14":true,"3:14":true,"4:14":true,"1:6":true,"5:14":[159,175],"2:2":true,"5:12":true,"2:4":true,"13:11":true,"4:15":162,"4:12":[162,164],"3:1":true,"5:15":[160,161],"2:3":true,"15:0":[150,151],"1:3":true,"1:4":true,"14:0":true,"2:0":true,"2:6":true,"12:11":true,"9:14":true,"2:7":true,"7:12":true,"10:14":true,"7:15":[165,202],"11:11":true,"10:12":true,"2:9":true,"9:12":true,"8:1":true,"10:15":true,"1:8":true,"7:13":true,"2:8":true,"6:14":[165,173],"10:13":true,"6:12":true,"1:7":true,"6:15":[157,159],"9:13":true,"11:0":true,"8:13":true,"1:10":true,"12:0":true,"6:1":true,"11:4":155,"9:1":true,"8:12":true,"10:1":true,"11:3":[154,156],"12:2":[154,156],"11:2":157,"7:1":true,"12:1":[154,156],"9:3":true,"6:0":true,"10:4":true,"5:9":true,"10:3":156,"7:2":true,"6:6":true,"4:9":true,"11:1":157,"9:4":true,"8:5":true,"5:7":true,"3:10":true,"7:4":true,"9:2":true,"8:11":true,"4:7":true,"10:2":true,"7:3":true,"9:6":true,"6:4":true,"10:0":true,"10:6":true,"9:0":true,"6:3":true,"7:0":true,"5:8":true,"6:2":true,"7:6":true,"4:8":true,"6:5":true,"3:8":true,"6:11":true,"11:13":true,"8:0":true,"8:6":true,"12:13":true,"12:14":true,"10:5":true,"9:11":true,"5:10":true,"3:7":true,"10:11":true,"9:5":true,"4:10":true,"11:14":true,"8:2":true,"12:15":true,"11:12":true,"8:4":true,"7:5":true,"3:9":true,"12:12":true,"11:15":true,"8:3":true,"7:11":true} \ No newline at end of file +{ + "8:8": true, + "6:10": true, + "13:13": true, + "3:0": true, + "3:6": true, + "13:15": true, + "10:10": true, + "8:7": true, + "5:5": true, + "4:11": true, + "9:10": true, + "5:11": true, + "4:5": true, + "13:12": true, + "3:2": true, + "13:14": true, + "3:4": true, + "8:9": true, + "7:10": true, + "3:3": true, + "0:4": true, + "14:14": true, + "4:3": true, + "5:4": true, + "2:12": true, + "7:7": true, + "5:3": true, + "2:15": true, + "15:14": true, + "9:9": true, + "4:4": true, + "8:10": true, + "7:9": true, + "6:8": true, + "3:5": true, + "15:12": true, + "14:15": true, + "13:1": [ + 152, + 153 + ], + "4:2": true, + "15:15": true, + "14:12": true, + "9:7": true, + "5:2": true, + "2:14": true, + "1:13": true, + "0:5": true, + "2:13": true, + "7:8": true, + "6:9": true, + "4:6": true, + "1:14": true, + "5:0": true, + "5:6": true, + "4:0": true, + "15:13": true, + "1:15": true, + "6:7": true, + "1:12": true, + "9:8": true, + "14:13": true, + "3:13": true, + "1:5": true, + "0:13": true, + "13:0": true, + "14:11": true, + "4:1": true, + "3:12": true, + "0:15": true, + "5:1": true, + "3:15": true, + "0:12": true, + "15:11": true, + "2:5": true, + "0:14": true, + "3:14": true, + "4:14": true, + "1:6": true, + "5:14": [ + 159, + 175 + ], + "2:2": true, + "5:12": true, + "2:4": true, + "13:11": true, + "4:15": 162, + "4:12": [ + 162, + 164 + ], + "3:1": true, + "5:15": [ + 160, + 161 + ], + "2:3": true, + "15:0": [ + 150, + 151 + ], + "1:3": true, + "1:4": true, + "14:0": true, + "2:0": true, + "2:6": true, + "12:11": true, + "9:14": true, + "2:7": true, + "7:12": true, + "10:14": true, + "7:15": [ + 165, + 202 + ], + "11:11": true, + "10:12": true, + "2:9": true, + "9:12": true, + "8:1": true, + "10:15": true, + "1:8": true, + "7:13": true, + "2:8": true, + "6:14": [ + 165, + 173 + ], + "10:13": true, + "6:12": true, + "1:7": true, + "6:15": [ + 157, + 159 + ], + "9:13": true, + "11:0": true, + "8:13": true, + "1:10": true, + "12:0": true, + "6:1": true, + "11:4": 155, + "9:1": true, + "8:12": true, + "10:1": true, + "11:3": [ + 154, + 156 + ], + "12:2": [ + 154, + 156 + ], + "11:2": 157, + "7:1": true, + "12:1": [ + 154, + 156 + ], + "9:3": true, + "6:0": true, + "10:4": true, + "5:9": true, + "10:3": 156, + "7:2": true, + "6:6": true, + "4:9": true, + "11:1": 157, + "9:4": true, + "8:5": true, + "5:7": true, + "3:10": true, + "7:4": true, + "9:2": true, + "8:11": true, + "4:7": true, + "10:2": true, + "7:3": true, + "9:6": true, + "6:4": true, + "10:0": true, + "10:6": true, + "9:0": true, + "6:3": true, + "7:0": true, + "5:8": true, + "6:2": true, + "7:6": true, + "4:8": true, + "6:5": true, + "3:8": true, + "6:11": true, + "11:13": true, + "8:0": true, + "8:6": true, + "12:13": true, + "12:14": true, + "10:5": true, + "9:11": true, + "5:10": true, + "3:7": true, + "10:11": true, + "9:5": true, + "4:10": true, + "11:14": true, + "8:2": true, + "12:15": true, + "11:12": true, + "8:4": true, + "7:5": true, + "3:9": true, + "12:12": true, + "11:15": true, + "8:3": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_7.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_7.json index 5bfc81a7..a9da93d7 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_7.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_7.json @@ -1 +1,244 @@ -{"1:1":true,"6:10":true,"13:13":true,"3:0":true,"0:6":true,"0:0":true,"3:6":true,"14:1":true,"13:15":true,"10:10":true,"5:5":true,"4:11":true,"0:2":true,"9:10":true,"5:11":true,"4:5":true,"13:12":true,"3:2":true,"15:1":true,"13:14":true,"3:4":true,"0:3":true,"8:9":true,"2:1":true,"14:14":true,"5:4":true,"2:12":true,"10:9":true,"7:7":true,"5:3":true,"15:14":true,"9:9":true,"4:4":true,"10:7":true,"8:10":true,"7:9":true,"6:8":true,"3:5":true,"15:12":true,"14:15":true,"13:1":true,"4:2":true,"15:15":true,"14:12":true,"9:7":true,"3:11":true,"5:2":true,"0:5":true,"7:8":true,"4:6":true,"5:0":true,"5:6":true,"4:0":true,"15:13":true,"10:8":true,"6:7":true,"9:8":true,"14:13":true,"1:11":true,"1:5":true,"11:8":true,"13:6":true,"13:0":true,"12:8":true,"14:11":true,"4:1":true,"3:12":true,"11:9":true,"15:5":true,"14:5":true,"5:1":true,"15:11":true,"12:9":true,"11:7":true,"2:5":true,"13:4":true,"12:7":true,"2:11":true,"15:4":true,"14:3":true,"1:6":true,"11:10":true,"12:10":true,"2:2":true,"15:3":true,"1:0":true,"14:4":true,"5:12":true,"2:4":true,"14:2":true,"13:11":true,"0:1":true,"15:2":true,"4:12":true,"3:1":true,"13:5":true,"15:0":true,"14:6":true,"1:3":true,"1:4":true,"15:6":true,"14:0":true,"2:0":true,"5:13":true,"1:2":true,"4:13":171,"2:6":true,"15:9":true,"12:11":true,"9:14":true,"11:5":true,"2:7":true,"7:12":true,"12:5":true,"10:14":true,"7:15":[158,170],"14:9":true,"11:11":true,"10:12":true,"6:13":true,"2:9":true,"15:7":true,"9:15":true,"14:7":true,"9:12":true,"8:1":[155,157],"13:10":true,"10:15":true,"7:14":true,"1:8":true,"7:13":true,"2:8":true,"6:14":[157,158],"1:9":true,"15:8":true,"10:13":true,"6:12":true,"1:7":true,"14:8":true,"9:13":true,"11:0":true,"12:6":true,"8:13":true,"13:8":true,"12:0":true,"6:1":true,"12:3":true,"11:4":true,"9:1":[162,202],"15:10":true,"14:10":true,"13:7":true,"12:4":true,"11:3":[172,202],"8:15":true,"2:10":true,"11:2":[180,195],"8:14":true,"13:9":true,"7:1":true,"12:1":[148,151],"9:3":true,"6:0":true,"10:4":true,"10:3":true,"7:2":true,"6:6":true,"4:9":true,"9:4":true,"8:5":true,"5:7":true,"3:10":true,"7:4":true,"9:2":true,"8:11":true,"4:7":true,"10:2":[162,202],"0:10":true,"7:3":true,"6:4":true,"6:3":true,"7:0":true,"5:8":true,"6:2":true,"7:6":true,"4:8":true,"6:5":true,"3:8":true,"0:8":true,"6:11":true,"11:13":true,"8:0":[162,202],"8:6":true,"12:13":true,"12:14":true,"10:5":true,"9:11":true,"5:10":true,"3:7":true,"10:11":true,"9:5":true,"4:10":true,"11:14":true,"8:2":true,"0:7":true,"12:15":true,"11:12":true,"8:4":true,"7:5":true,"3:9":true,"12:12":true,"11:15":true,"8:3":true,"0:9":true,"7:11":true} \ No newline at end of file +{ + "1:1": true, + "6:10": true, + "13:13": true, + "3:0": true, + "0:6": true, + "0:0": true, + "3:6": true, + "14:1": true, + "13:15": true, + "10:10": true, + "5:5": true, + "4:11": true, + "0:2": true, + "9:10": true, + "5:11": true, + "4:5": true, + "13:12": true, + "3:2": true, + "15:1": true, + "13:14": true, + "3:4": true, + "0:3": true, + "8:9": true, + "2:1": true, + "14:14": true, + "5:4": true, + "2:12": true, + "10:9": true, + "7:7": true, + "5:3": true, + "15:14": true, + "9:9": true, + "4:4": true, + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": true, + "3:5": true, + "15:12": true, + "14:15": true, + "13:1": true, + "4:2": true, + "15:15": true, + "14:12": true, + "9:7": true, + "3:11": true, + "5:2": true, + "0:5": true, + "7:8": true, + "4:6": true, + "5:0": true, + "5:6": true, + "4:0": true, + "15:13": true, + "10:8": true, + "6:7": true, + "9:8": true, + "14:13": true, + "1:11": true, + "1:5": true, + "11:8": true, + "13:6": true, + "13:0": true, + "12:8": true, + "14:11": true, + "4:1": true, + "3:12": true, + "11:9": true, + "15:5": true, + "14:5": true, + "5:1": true, + "15:11": true, + "12:9": true, + "11:7": true, + "2:5": true, + "13:4": true, + "12:7": true, + "2:11": true, + "15:4": true, + "14:3": true, + "1:6": true, + "11:10": true, + "12:10": true, + "2:2": true, + "15:3": true, + "1:0": true, + "14:4": true, + "5:12": true, + "2:4": true, + "14:2": true, + "13:11": true, + "0:1": true, + "15:2": true, + "4:12": true, + "3:1": true, + "13:5": true, + "15:0": true, + "14:6": true, + "1:3": true, + "1:4": true, + "15:6": true, + "14:0": true, + "2:0": true, + "5:13": true, + "1:2": true, + "4:13": 171, + "2:6": true, + "15:9": true, + "12:11": true, + "9:14": true, + "11:5": true, + "2:7": true, + "7:12": true, + "12:5": true, + "10:14": true, + "7:15": [ + 158, + 170 + ], + "14:9": true, + "11:11": true, + "10:12": true, + "6:13": true, + "2:9": true, + "15:7": true, + "9:15": true, + "14:7": true, + "9:12": true, + "8:1": [ + 155, + 157 + ], + "13:10": true, + "10:15": true, + "7:14": true, + "1:8": true, + "7:13": true, + "2:8": true, + "6:14": [ + 157, + 158 + ], + "1:9": true, + "15:8": true, + "10:13": true, + "6:12": true, + "1:7": true, + "14:8": true, + "9:13": true, + "11:0": true, + "12:6": true, + "8:13": true, + "13:8": true, + "12:0": true, + "6:1": true, + "12:3": true, + "11:4": true, + "9:1": [ + 162, + 202 + ], + "15:10": true, + "14:10": true, + "13:7": true, + "12:4": true, + "11:3": [ + 172, + 202 + ], + "8:15": true, + "2:10": true, + "11:2": [ + 180, + 195 + ], + "8:14": true, + "13:9": true, + "7:1": true, + "12:1": [ + 148, + 151 + ], + "9:3": true, + "6:0": true, + "10:4": true, + "10:3": true, + "7:2": true, + "6:6": true, + "4:9": true, + "9:4": true, + "8:5": true, + "5:7": true, + "3:10": true, + "7:4": true, + "9:2": true, + "8:11": true, + "4:7": true, + "10:2": [ + 162, + 202 + ], + "0:10": true, + "7:3": true, + "6:4": true, + "6:3": true, + "7:0": true, + "5:8": true, + "6:2": true, + "7:6": true, + "4:8": true, + "6:5": true, + "3:8": true, + "0:8": true, + "6:11": true, + "11:13": true, + "8:0": [ + 162, + 202 + ], + "8:6": true, + "12:13": true, + "12:14": true, + "10:5": true, + "9:11": true, + "5:10": true, + "3:7": true, + "10:11": true, + "9:5": true, + "4:10": true, + "11:14": true, + "8:2": true, + "0:7": true, + "12:15": true, + "11:12": true, + "8:4": true, + "7:5": true, + "3:9": true, + "12:12": true, + "11:15": true, + "8:3": true, + "0:9": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_8.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_8.json index d6f006c3..d419dc47 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-10_8.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-10_8.json @@ -1 +1,89 @@ -{"15:9":true,"12:11":true,"11:5":true,"13:13":true,"12:5":true,"14:9":true,"15:7":true,"14:7":true,"14:1":true,"13:15":true,"10:10":true,"13:12":true,"15:1":true,"15:8":true,"14:8":true,"11:0":true,"14:14":true,"12:6":true,"10:9":true,"13:8":true,"15:14":true,"12:0":true,"11:6":true,"10:7":true,"15:12":true,"14:15":true,"13:1":true,"15:15":true,"14:12":true,"9:7":151,"12:3":true,"11:4":true,"9:1":true,"15:10":true,"14:10":true,"10:1":true,"13:7":true,"12:4":true,"11:3":true,"15:13":true,"12:2":true,"10:8":true,"11:2":true,"13:9":true,"14:13":true,"12:1":true,"10:3":true,"11:1":true,"11:8":true,"13:6":true,"13:0":true,"10:2":true,"12:8":true,"14:11":true,"13:2":true,"9:6":151,"11:9":true,"15:5":true,"10:0":true,"14:5":true,"10:6":true,"15:11":true,"12:9":true,"9:0":true,"13:3":true,"11:7":true,"13:4":true,"15:4":true,"14:3":true,"11:10":true,"12:10":true,"15:3":true,"14:4":true,"8:0":[158,170],"14:2":true,"13:11":true,"15:2":true,"13:5":true,"15:0":true,"14:6":true,"15:6":true,"14:0":true,"12:15":true,"12:12":true} \ No newline at end of file +{ + "15:9": true, + "12:11": true, + "11:5": true, + "13:13": true, + "12:5": true, + "14:9": true, + "15:7": true, + "14:7": true, + "14:1": true, + "13:15": true, + "10:10": true, + "13:12": true, + "15:1": true, + "15:8": true, + "14:8": true, + "11:0": true, + "14:14": true, + "12:6": true, + "10:9": true, + "13:8": true, + "15:14": true, + "12:0": true, + "11:6": true, + "10:7": true, + "15:12": true, + "14:15": true, + "13:1": true, + "15:15": true, + "14:12": true, + "9:7": 151, + "12:3": true, + "11:4": true, + "9:1": true, + "15:10": true, + "14:10": true, + "10:1": true, + "13:7": true, + "12:4": true, + "11:3": true, + "15:13": true, + "12:2": true, + "10:8": true, + "11:2": true, + "13:9": true, + "14:13": true, + "12:1": true, + "10:3": true, + "11:1": true, + "11:8": true, + "13:6": true, + "13:0": true, + "10:2": true, + "12:8": true, + "14:11": true, + "13:2": true, + "9:6": 151, + "11:9": true, + "15:5": true, + "10:0": true, + "14:5": true, + "10:6": true, + "15:11": true, + "12:9": true, + "9:0": true, + "13:3": true, + "11:7": true, + "13:4": true, + "15:4": true, + "14:3": true, + "11:10": true, + "12:10": true, + "15:3": true, + "14:4": true, + "8:0": [ + 158, + 170 + ], + "14:2": true, + "13:11": true, + "15:2": true, + "13:5": true, + "15:0": true, + "14:6": true, + "15:6": true, + "14:0": true, + "12:15": true, + "12:12": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-11_-3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-11_-3.json index 352ead0c..ed4788e9 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-11_-3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-11_-3.json @@ -1 +1,188 @@ -{"12:11":true,"9:14":true,"11:5":true,"2:7":true,"8:8":true,"7:12":true,"6:10":true,"12:5":true,"10:14":true,"7:15":true,"14:9":true,"11:11":true,"10:12":true,"6:13":true,"2:9":true,"9:15":true,"0:6":true,"14:7":true,"9:12":true,"3:6":true,"13:10":true,"10:15":true,"7:14":true,"1:8":true,"10:10":true,"8:7":true,"5:5":true,"4:11":true,"7:13":true,"2:8":true,"5:11":true,"4:5":true,"13:12":true,"6:14":true,"1:9":true,"15:8":true,"10:13":true,"3:4":true,"6:12":true,"3:3":true,"1:7":true,"6:15":true,"9:13":true,"12:6":true,"4:3":true,"8:13":true,"5:4":true,"2:12":true,"10:9":true,"7:7":true,"5:3":true,"2:15":true,"1:10":true,"13:8":true,"11:6":true,"4:4":true,"10:7":true,"6:8":true,"3:5":true,"13:1":181,"0:11":true,"9:7":true,"3:11":true,"2:14":true,"1:13":true,"0:5":true,"12:3":true,"11:4":true,"8:12":true,"6:9":true,"4:6":true,"2:13":true,"14:10":true,"10:1":179,"5:6":true,"13:7":true,"12:4":true,"11:3":true,"8:15":true,"12:2":true,"2:10":true,"1:15":true,"10:8":true,"11:2":true,"8:14":true,"1:12":true,"13:9":true,"9:8":true,"12:1":[180,181],"9:3":true,"10:4":true,"3:13":true,"5:9":true,"10:3":true,"1:5":true,"0:13":true,"7:2":true,"6:6":true,"4:9":true,"11:1":180,"9:4":true,"8:5":true,"5:7":true,"3:10":true,"11:8":true,"7:4":true,"13:6":true,"9:2":true,"4:7":true,"10:2":true,"0:10":true,"12:8":true,"7:3":true,"14:11":true,"13:2":true,"9:6":true,"3:12":true,"0:15":true,"11:9":true,"6:4":true,"14:5":true,"10:6":true,"3:15":true,"12:9":true,"6:3":true,"13:3":true,"11:7":true,"2:5":true,"0:14":true,"5:8":true,"13:4":true,"12:7":true,"3:14":true,"6:2":true,"7:6":true,"4:8":true,"2:11":true,"15:4":true,"14:3":true,"4:14":true,"1:6":true,"11:10":true,"6:5":true,"3:8":true,"12:10":true,"5:14":true,"0:8":true,"15:3":true,"6:11":true,"14:4":true,"11:13":true,"5:12":true,"2:4":true,"14:2":true,"13:11":true,"4:15":true,"15:2":true,"8:6":true,"4:12":true,"13:5":true,"12:13":true,"5:15":true,"10:5":true,"9:11":true,"5:10":true,"3:7":true,"10:11":true,"9:5":true,"4:10":true,"11:14":true,"8:2":true,"0:7":true,"11:12":true,"8:4":true,"5:13":true,"7:5":true,"3:9":true,"12:12":true,"11:15":true,"8:3":true,"0:9":true,"4:13":true,"2:6":true} \ No newline at end of file +{ + "12:11": true, + "9:14": true, + "11:5": true, + "2:7": true, + "8:8": true, + "7:12": true, + "6:10": true, + "12:5": true, + "10:14": true, + "7:15": true, + "14:9": true, + "11:11": true, + "10:12": true, + "6:13": true, + "2:9": true, + "9:15": true, + "0:6": true, + "14:7": true, + "9:12": true, + "3:6": true, + "13:10": true, + "10:15": true, + "7:14": true, + "1:8": true, + "10:10": true, + "8:7": true, + "5:5": true, + "4:11": true, + "7:13": true, + "2:8": true, + "5:11": true, + "4:5": true, + "13:12": true, + "6:14": true, + "1:9": true, + "15:8": true, + "10:13": true, + "3:4": true, + "6:12": true, + "3:3": true, + "1:7": true, + "6:15": true, + "9:13": true, + "12:6": true, + "4:3": true, + "8:13": true, + "5:4": true, + "2:12": true, + "10:9": true, + "7:7": true, + "5:3": true, + "2:15": true, + "1:10": true, + "13:8": true, + "11:6": true, + "4:4": true, + "10:7": true, + "6:8": true, + "3:5": true, + "13:1": 181, + "0:11": true, + "9:7": true, + "3:11": true, + "2:14": true, + "1:13": true, + "0:5": true, + "12:3": true, + "11:4": true, + "8:12": true, + "6:9": true, + "4:6": true, + "2:13": true, + "14:10": true, + "10:1": 179, + "5:6": true, + "13:7": true, + "12:4": true, + "11:3": true, + "8:15": true, + "12:2": true, + "2:10": true, + "1:15": true, + "10:8": true, + "11:2": true, + "8:14": true, + "1:12": true, + "13:9": true, + "9:8": true, + "12:1": [ + 180, + 181 + ], + "9:3": true, + "10:4": true, + "3:13": true, + "5:9": true, + "10:3": true, + "1:5": true, + "0:13": true, + "7:2": true, + "6:6": true, + "4:9": true, + "11:1": 180, + "9:4": true, + "8:5": true, + "5:7": true, + "3:10": true, + "11:8": true, + "7:4": true, + "13:6": true, + "9:2": true, + "4:7": true, + "10:2": true, + "0:10": true, + "12:8": true, + "7:3": true, + "14:11": true, + "13:2": true, + "9:6": true, + "3:12": true, + "0:15": true, + "11:9": true, + "6:4": true, + "14:5": true, + "10:6": true, + "3:15": true, + "12:9": true, + "6:3": true, + "13:3": true, + "11:7": true, + "2:5": true, + "0:14": true, + "5:8": true, + "13:4": true, + "12:7": true, + "3:14": true, + "6:2": true, + "7:6": true, + "4:8": true, + "2:11": true, + "15:4": true, + "14:3": true, + "4:14": true, + "1:6": true, + "11:10": true, + "6:5": true, + "3:8": true, + "12:10": true, + "5:14": true, + "0:8": true, + "15:3": true, + "6:11": true, + "14:4": true, + "11:13": true, + "5:12": true, + "2:4": true, + "14:2": true, + "13:11": true, + "4:15": true, + "15:2": true, + "8:6": true, + "4:12": true, + "13:5": true, + "12:13": true, + "5:15": true, + "10:5": true, + "9:11": true, + "5:10": true, + "3:7": true, + "10:11": true, + "9:5": true, + "4:10": true, + "11:14": true, + "8:2": true, + "0:7": true, + "11:12": true, + "8:4": true, + "5:13": true, + "7:5": true, + "3:9": true, + "12:12": true, + "11:15": true, + "8:3": true, + "0:9": true, + "4:13": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-11_-4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-11_-4.json index 643d735d..3988841a 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-11_-4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-11_-4.json @@ -1 +1,20 @@ -{"15:9":true,"12:6":true,"14:9":true,"11:6":true,"11:8":199,"15:7":true,"13:6":true,"14:7":true,"12:8":true,"10:5":true,"15:10":[199,217],"10:6":true,"13:7":true,"12:7":true,"13:9":true} \ No newline at end of file +{ + "15:9": true, + "12:6": true, + "14:9": true, + "11:6": true, + "11:8": 199, + "15:7": true, + "13:6": true, + "14:7": true, + "12:8": true, + "10:5": true, + "15:10": [ + 199, + 217 + ], + "10:6": true, + "13:7": true, + "12:7": true, + "13:9": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-11_-5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-11_-5.json index b7fc8ac8..3de191fa 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-11_-5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-11_-5.json @@ -1 +1,25 @@ -{"10:4":true,"12:5":true,"7:15":true,"9:4":true,"5:12":213,"4:12":[211,212],"7:14":true,"11:4":true,"10:5":true,"10:6":true,"12:4":true,"6:14":[214,216],"5:13":[211,216],"6:15":215} \ No newline at end of file +{ + "10:4": true, + "12:5": true, + "7:15": true, + "9:4": true, + "5:12": 213, + "4:12": [ + 211, + 212 + ], + "7:14": true, + "11:4": true, + "10:5": true, + "10:6": true, + "12:4": true, + "6:14": [ + 214, + 216 + ], + "5:13": [ + 211, + 216 + ], + "6:15": 215 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-11_-6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-11_-6.json index e79a0352..84cd9a00 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-11_-6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-11_-6.json @@ -1 +1,11 @@ -{"12:6":[203,205],"8:13":[213,214],"8:12":212} \ No newline at end of file +{ + "12:6": [ + 203, + 205 + ], + "8:13": [ + 213, + 214 + ], + "8:12": 212 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-11_2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-11_2.json index 4d8c42a8..99a82999 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-11_2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-11_2.json @@ -1 +1,23 @@ -{"11:10":161,"13:13":159,"11:11":[160,161],"11:8":156,"9:2":true,"12:13":[160,161],"9:1":true,"11:9":167,"10:0":true,"10:1":true,"9:0":true,"12:12":[159,161]} \ No newline at end of file +{ + "11:10": 161, + "13:13": 159, + "11:11": [ + 160, + 161 + ], + "11:8": 156, + "9:2": true, + "12:13": [ + 160, + 161 + ], + "9:1": true, + "11:9": 167, + "10:0": true, + "10:1": true, + "9:0": true, + "12:12": [ + 159, + 161 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-11_5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-11_5.json index b605be36..31bc4325 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-11_5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-11_5.json @@ -1 +1,29 @@ -{"12:1":true,"9:14":[164,165],"11:5":true,"12:5":true,"7:15":true,"11:1":true,"14:1":true,"15:5":true,"14:5":true,"15:1":true,"10:13":[163,165],"6:15":true,"11:13":true,"13:1":true,"13:5":true,"10:5":true,"9:5":true,"8:15":166,"11:12":true,"8:14":true,"7:1":175} \ No newline at end of file +{ + "12:1": true, + "9:14": [ + 164, + 165 + ], + "11:5": true, + "12:5": true, + "7:15": true, + "11:1": true, + "14:1": true, + "15:5": true, + "14:5": true, + "15:1": true, + "10:13": [ + 163, + 165 + ], + "6:15": true, + "11:13": true, + "13:1": true, + "13:5": true, + "10:5": true, + "9:5": true, + "8:15": 166, + "11:12": true, + "8:14": true, + "7:1": 175 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-11_6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-11_6.json index 22ad94f8..dd61311b 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-11_6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-11_6.json @@ -1 +1,85 @@ -{"12:11":true,"8:8":true,"13:13":true,"11:11":true,"10:12":true,"13:15":true,"10:10":true,"8:7":true,"5:5":167,"9:10":true,"4:5":true,"13:12":true,"13:14":true,"8:9":true,"7:10":true,"14:14":true,"5:4":true,"7:7":true,"5:3":true,"15:14":true,"9:9":true,"6:1":true,"4:4":true,"8:10":true,"7:9":true,"6:8":true,"15:12":true,"14:15":true,"15:15":true,"14:12":true,"5:2":true,"7:8":true,"6:9":[163,166],"4:6":true,"5:6":[166,167],"15:13":true,"6:7":true,"9:8":true,"7:1":true,"14:13":true,"6:0":true,"7:2":true,"6:6":true,"5:7":[165,166],"7:4":true,"9:2":true,"8:11":165,"4:7":true,"7:3":true,"14:11":true,"6:4":true,"6:3":true,"7:0":true,"5:8":[163,165],"6:2":true,"7:6":true,"11:10":true,"6:5":true,"12:10":true,"11:13":true,"13:11":true,"12:13":true,"12:14":true,"9:11":true,"10:11":true,"8:2":true,"11:12":true,"8:4":true,"7:5":true,"12:12":true,"8:3":true} \ No newline at end of file +{ + "12:11": true, + "8:8": true, + "13:13": true, + "11:11": true, + "10:12": true, + "13:15": true, + "10:10": true, + "8:7": true, + "5:5": 167, + "9:10": true, + "4:5": true, + "13:12": true, + "13:14": true, + "8:9": true, + "7:10": true, + "14:14": true, + "5:4": true, + "7:7": true, + "5:3": true, + "15:14": true, + "9:9": true, + "6:1": true, + "4:4": true, + "8:10": true, + "7:9": true, + "6:8": true, + "15:12": true, + "14:15": true, + "15:15": true, + "14:12": true, + "5:2": true, + "7:8": true, + "6:9": [ + 163, + 166 + ], + "4:6": true, + "5:6": [ + 166, + 167 + ], + "15:13": true, + "6:7": true, + "9:8": true, + "7:1": true, + "14:13": true, + "6:0": true, + "7:2": true, + "6:6": true, + "5:7": [ + 165, + 166 + ], + "7:4": true, + "9:2": true, + "8:11": 165, + "4:7": true, + "7:3": true, + "14:11": true, + "6:4": true, + "6:3": true, + "7:0": true, + "5:8": [ + 163, + 165 + ], + "6:2": true, + "7:6": true, + "11:10": true, + "6:5": true, + "12:10": true, + "11:13": true, + "13:11": true, + "12:13": true, + "12:14": true, + "9:11": true, + "10:11": true, + "8:2": true, + "11:12": true, + "8:4": true, + "7:5": true, + "12:12": true, + "8:3": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-11_7.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-11_7.json index 6b724e4e..feb2ef05 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-11_7.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-11_7.json @@ -1 +1,15 @@ -{"15:9":true,"14:9":true,"15:7":true,"13:6":true,"14:7":true,"13:5":true,"15:0":true,"14:6":true,"15:5":true,"15:6":true,"14:0":true,"15:8":true,"14:8":true} \ No newline at end of file +{ + "15:9": true, + "14:9": true, + "15:7": true, + "13:6": true, + "14:7": true, + "13:5": true, + "15:0": true, + "14:6": true, + "15:5": true, + "15:6": true, + "14:0": true, + "15:8": true, + "14:8": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-1_0.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-1_0.json index 2734cb56..bd0f39ea 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-1_0.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-1_0.json @@ -1 +1,58 @@ -{"12:1":true,"9:3":true,"1:11":true,"11:5":true,"10:4":true,"12:5":true,"10:3":true,"11:1":true,"15:7":true,"13:6":true,"9:2":true,"13:0":true,"14:7":true,"8:1":true,"10:2":true,"14:1":true,"13:2":true,"15:5":true,"10:0":true,"14:5":true,"15:1":true,"9:0":true,"7:0":true,"13:3":true,"0:14":145,"13:4":true,"15:4":true,"11:0":true,"14:3":true,"12:6":true,"2:12":true,"15:3":true,"12:0":true,"14:4":true,"8:0":true,"14:2":true,"13:1":true,"0:11":true,"15:2":true,"13:5":true,"15:0":true,"14:6":true,"12:3":true,"11:4":true,"9:1":true,"10:1":true,"13:7":true,"12:4":true,"11:3":true,"8:2":true,"15:6":true,"14:0":true,"12:2":true,"11:2":true,"1:12":true,"7:1":true} \ No newline at end of file +{ + "12:1": true, + "9:3": true, + "1:11": true, + "11:5": true, + "10:4": true, + "12:5": true, + "10:3": true, + "11:1": true, + "15:7": true, + "13:6": true, + "9:2": true, + "13:0": true, + "14:7": true, + "8:1": true, + "10:2": true, + "14:1": true, + "13:2": true, + "15:5": true, + "10:0": true, + "14:5": true, + "15:1": true, + "9:0": true, + "7:0": true, + "13:3": true, + "0:14": 145, + "13:4": true, + "15:4": true, + "11:0": true, + "14:3": true, + "12:6": true, + "2:12": true, + "15:3": true, + "12:0": true, + "14:4": true, + "8:0": true, + "14:2": true, + "13:1": true, + "0:11": true, + "15:2": true, + "13:5": true, + "15:0": true, + "14:6": true, + "12:3": true, + "11:4": true, + "9:1": true, + "10:1": true, + "13:7": true, + "12:4": true, + "11:3": true, + "8:2": true, + "15:6": true, + "14:0": true, + "12:2": true, + "11:2": true, + "1:12": true, + "7:1": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-1_1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-1_1.json index a52bf506..7f7300c1 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-1_1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-1_1.json @@ -1 +1,66 @@ -{"1:1":146,"10:10":true,"9:10":true,"3:2":146,"2:1":145,"4:3":145,"2:12":[143,144],"2:15":161,"9:9":true,"4:2":145,"15:15":true,"5:2":145,"2:14":136,"1:13":[137,139],"2:13":142,"1:14":136,"5:0":[167,169],"4:0":[168,169],"1:12":[140,146],"6:0":[166,167],"3:13":[143,146],"0:13":137,"4:1":145,"0:12":[143,147],"5:14":[144,145],"2:2":146,"3:1":145,"12:13":true,"12:14":true,"9:11":true,"11:14":true,"1:2":true,"11:15":true,"4:13":[144,146]} \ No newline at end of file +{ + "1:1": 146, + "10:10": true, + "9:10": true, + "3:2": 146, + "2:1": 145, + "4:3": 145, + "2:12": [ + 143, + 144 + ], + "2:15": 161, + "9:9": true, + "4:2": 145, + "15:15": true, + "5:2": 145, + "2:14": 136, + "1:13": [ + 137, + 139 + ], + "2:13": 142, + "1:14": 136, + "5:0": [ + 167, + 169 + ], + "4:0": [ + 168, + 169 + ], + "1:12": [ + 140, + 146 + ], + "6:0": [ + 166, + 167 + ], + "3:13": [ + 143, + 146 + ], + "0:13": 137, + "4:1": 145, + "0:12": [ + 143, + 147 + ], + "5:14": [ + 144, + 145 + ], + "2:2": 146, + "3:1": 145, + "12:13": true, + "12:14": true, + "9:11": true, + "11:14": true, + "1:2": true, + "11:15": true, + "4:13": [ + 144, + 146 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-1_10.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-1_10.json index aa6db439..3c099835 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-1_10.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-1_10.json @@ -1 +1,51 @@ -{"11:5":true,"14:1":true,"13:15":true,"1:7":127,"11:0":true,"5:3":127,"15:14":true,"12:0":true,"4:4":127,"3:5":127,"14:15":true,"13:1":true,"15:15":true,"12:3":true,"11:4":true,"2:13":true,"5:0":207,"14:10":true,"12:4":true,"11:3":true,"4:0":127,"11:2":true,"13:9":true,"12:1":true,"6:0":207,"10:4":true,"10:3":true,"13:0":true,"10:2":true,"12:8":true,"7:3":true,"13:2":true,"10:6":true,"5:1":127,"3:15":true,"15:11":true,"11:7":127,"3:14":true,"6:2":127,"15:4":127,"14:3":true,"0:8":127,"15:3":127,"14:2":true,"15:2":127,"9:5":true,"14:0":127,"8:4":true,"2:6":127} \ No newline at end of file +{ + "11:5": true, + "14:1": true, + "13:15": true, + "1:7": 127, + "11:0": true, + "5:3": 127, + "15:14": true, + "12:0": true, + "4:4": 127, + "3:5": 127, + "14:15": true, + "13:1": true, + "15:15": true, + "12:3": true, + "11:4": true, + "2:13": true, + "5:0": 207, + "14:10": true, + "12:4": true, + "11:3": true, + "4:0": 127, + "11:2": true, + "13:9": true, + "12:1": true, + "6:0": 207, + "10:4": true, + "10:3": true, + "13:0": true, + "10:2": true, + "12:8": true, + "7:3": true, + "13:2": true, + "10:6": true, + "5:1": 127, + "3:15": true, + "15:11": true, + "11:7": 127, + "3:14": true, + "6:2": 127, + "15:4": 127, + "14:3": true, + "0:8": 127, + "15:3": 127, + "14:2": true, + "15:2": 127, + "9:5": true, + "14:0": 127, + "8:4": true, + "2:6": 127 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-1_11.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-1_11.json index d3691eee..bac1f70b 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-1_11.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-1_11.json @@ -1 +1,67 @@ -{"12:1":true,"1:1":true,"11:5":true,"10:4":true,"2:7":115,"12:5":true,"11:1":true,"3:0":true,"13:0":true,"8:1":true,"3:6":true,"14:1":true,"13:2":true,"8:7":true,"9:6":true,"4:1":true,"0:2":true,"14:5":true,"10:6":true,"5:1":true,"4:5":true,"15:1":true,"13:3":true,"3:4":true,"2:5":true,"13:4":true,"3:3":true,"2:1":true,"15:4":true,"14:3":true,"12:6":true,"7:7":true,"2:2":true,"15:3":true,"6:1":true,"14:4":true,"11:6":true,"4:4":true,"10:7":true,"3:5":true,"2:4":true,"14:2":true,"13:1":true,"0:1":true,"9:7":true,"3:1":true,"13:5":true,"2:3":true,"12:3":true,"11:4":true,"10:5":true,"15:0":true,"9:1":true,"4:6":true,"3:7":true,"1:3":true,"10:1":true,"9:5":true,"12:4":true,"14:0":true,"2:0":true,"12:2":true,"1:2":true,"6:7":true,"7:1":true} \ No newline at end of file +{ + "12:1": true, + "1:1": true, + "11:5": true, + "10:4": true, + "2:7": 115, + "12:5": true, + "11:1": true, + "3:0": true, + "13:0": true, + "8:1": true, + "3:6": true, + "14:1": true, + "13:2": true, + "8:7": true, + "9:6": true, + "4:1": true, + "0:2": true, + "14:5": true, + "10:6": true, + "5:1": true, + "4:5": true, + "15:1": true, + "13:3": true, + "3:4": true, + "2:5": true, + "13:4": true, + "3:3": true, + "2:1": true, + "15:4": true, + "14:3": true, + "12:6": true, + "7:7": true, + "2:2": true, + "15:3": true, + "6:1": true, + "14:4": true, + "11:6": true, + "4:4": true, + "10:7": true, + "3:5": true, + "2:4": true, + "14:2": true, + "13:1": true, + "0:1": true, + "9:7": true, + "3:1": true, + "13:5": true, + "2:3": true, + "12:3": true, + "11:4": true, + "10:5": true, + "15:0": true, + "9:1": true, + "4:6": true, + "3:7": true, + "1:3": true, + "10:1": true, + "9:5": true, + "12:4": true, + "14:0": true, + "2:0": true, + "12:2": true, + "1:2": true, + "6:7": true, + "7:1": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-1_3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-1_3.json index 4fb265b7..8aaf3ecd 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-1_3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-1_3.json @@ -1 +1,16 @@ -{"7:13":true,"4:14":true,"7:12":true,"7:15":true,"0:7":true,"15:14":true,"5:12":true,"14:15":true,"4:15":true,"6:12":true,"15:15":true,"4:12":true,"7:14":true,"4:13":true} \ No newline at end of file +{ + "7:13": true, + "4:14": true, + "7:12": true, + "7:15": true, + "0:7": true, + "15:14": true, + "5:12": true, + "14:15": true, + "4:15": true, + "6:12": true, + "15:15": true, + "4:12": true, + "7:14": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-1_7.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-1_7.json index e53a59df..bdceed93 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-1_7.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-1_7.json @@ -1 +1,24 @@ -{"9:14":true,"6:0":true,"10:9":true,"10:14":true,"15:14":true,"9:9":true,"10:12":true,"14:15":true,"9:15":true,"15:15":true,"9:12":true,"10:15":true,"10:10":true,"9:11":true,"5:0":true,"10:11":true,"9:10":true,"4:0":true,"7:0":true,"10:13":true,"9:8":true,"9:13":true} \ No newline at end of file +{ + "9:14": true, + "6:0": true, + "10:9": true, + "10:14": true, + "15:14": true, + "9:9": true, + "10:12": true, + "14:15": true, + "9:15": true, + "15:15": true, + "9:12": true, + "10:15": true, + "10:10": true, + "9:11": true, + "5:0": true, + "10:11": true, + "9:10": true, + "4:0": true, + "7:0": true, + "10:13": true, + "9:8": true, + "9:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-1_8.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-1_8.json index 4d1cb0dc..bc37be21 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-1_8.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-1_8.json @@ -1 +1,40 @@ -{"12:11":true,"1:11":true,"3:13":true,"13:13":true,"6:13":true,"13:0":true,"14:11":true,"14:1":true,"13:15":true,"7:13":true,"15:11":true,"15:1":true,"9:0":true,"1:9":true,"15:8":true,"10:13":true,"14:8":true,"9:13":true,"8:13":true,"1:10":true,"13:8":true,"0:8":130,"11:13":true,"14:15":true,"13:11":true,"15:15":true,"15:2":true,"12:13":true,"1:13":true,"15:0":true,"2:13":true,"14:0":true,"15:13":true,"12:15":true,"5:13":true,"1:15":true,"14:13":true,"4:13":true} \ No newline at end of file +{ + "12:11": true, + "1:11": true, + "3:13": true, + "13:13": true, + "6:13": true, + "13:0": true, + "14:11": true, + "14:1": true, + "13:15": true, + "7:13": true, + "15:11": true, + "15:1": true, + "9:0": true, + "1:9": true, + "15:8": true, + "10:13": true, + "14:8": true, + "9:13": true, + "8:13": true, + "1:10": true, + "13:8": true, + "0:8": 130, + "11:13": true, + "14:15": true, + "13:11": true, + "15:15": true, + "15:2": true, + "12:13": true, + "1:13": true, + "15:0": true, + "2:13": true, + "14:0": true, + "15:13": true, + "12:15": true, + "5:13": true, + "1:15": true, + "14:13": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-1_9.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-1_9.json index 1bd9898c..6352e1c4 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-1_9.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-1_9.json @@ -1 +1,41 @@ -{"12:11":true,"9:14":213,"1:1":true,"10:14":214,"13:15":true,"10:10":127,"0:2":true,"7:13":true,"6:14":true,"1:9":true,"13:14":127,"10:13":215,"9:13":214,"14:14":127,"15:14":true,"15:12":127,"14:15":127,"3:11":127,"8:12":true,"13:7":127,"15:13":true,"2:10":true,"14:13":true,"12:8":127,"11:9":127,"15:5":127,"5:14":true,"0:8":127,"1:0":true,"4:12":true,"5:15":[127,208],"14:6":127,"9:11":127,"11:14":true,"12:15":true,"5:13":127} \ No newline at end of file +{ + "12:11": true, + "9:14": 213, + "1:1": true, + "10:14": 214, + "13:15": true, + "10:10": 127, + "0:2": true, + "7:13": true, + "6:14": true, + "1:9": true, + "13:14": 127, + "10:13": 215, + "9:13": 214, + "14:14": 127, + "15:14": true, + "15:12": 127, + "14:15": 127, + "3:11": 127, + "8:12": true, + "13:7": 127, + "15:13": true, + "2:10": true, + "14:13": true, + "12:8": 127, + "11:9": 127, + "15:5": 127, + "5:14": true, + "0:8": 127, + "1:0": true, + "4:12": true, + "5:15": [ + 127, + 208 + ], + "14:6": 127, + "9:11": 127, + "11:14": true, + "12:15": true, + "5:13": 127 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-2.json index 7ead9273..e4e3ff1e 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-2.json @@ -1 +1,26 @@ -{"15:4":true,"11:0":true,"11:5":true,"12:5":true,"15:3":true,"8:5":true,"8:0":true,"15:2":true,"13:0":true,"13:5":true,"10:2":true,"15:0":true,"10:5":true,"15:5":true,"10:0":true,"14:5":true,"9:5":true,"11:3":true,"8:2":true,"15:1":true,"13:3":true,"8:4":true,"8:3":true,"7:11":true} \ No newline at end of file +{ + "15:4": true, + "11:0": true, + "11:5": true, + "12:5": true, + "15:3": true, + "8:5": true, + "8:0": true, + "15:2": true, + "13:0": true, + "13:5": true, + "10:2": true, + "15:0": true, + "10:5": true, + "15:5": true, + "10:0": true, + "14:5": true, + "9:5": true, + "11:3": true, + "8:2": true, + "15:1": true, + "13:3": true, + "8:4": true, + "8:3": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-3.json index a278b911..ce28df65 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-3.json @@ -1 +1,108 @@ -{"15:9":true,"1:1":true,"11:5":true,"8:8":true,"14:9":true,"15:7":true,"3:0":170,"0:6":true,"0:0":true,"14:7":true,"8:1":true,"3:6":true,"13:10":true,"14:1":true,"8:7":true,"5:5":true,"0:2":true,"4:5":true,"15:1":true,"15:8":true,"14:8":true,"2:1":true,"11:0":true,"4:3":170,"5:4":true,"5:3":true,"13:8":true,"15:14":true,"10:7":true,"3:5":true,"15:12":true,"13:1":true,"4:2":170,"15:15":true,"9:7":true,"5:2":true,"12:3":true,"11:4":true,"9:1":true,"4:6":true,"15:10":true,"5:0":true,"14:10":true,"10:1":true,"5:6":true,"13:7":true,"11:3":true,"4:0":170,"10:8":true,"11:2":true,"13:9":true,"9:8":true,"9:3":true,"10:4":true,"10:3":true,"1:5":true,"11:1":true,"9:4":true,"8:5":true,"13:6":true,"9:2":true,"13:0":true,"10:2":true,"13:2":true,"9:6":true,"4:1":170,"15:5":true,"10:0":true,"14:5":true,"10:6":true,"5:1":170,"9:0":true,"13:3":true,"13:4":true,"15:4":true,"14:3":true,"1:6":[151,169],"15:3":true,"1:0":true,"14:4":true,"8:0":true,"14:2":true,"13:11":true,"0:1":true,"15:2":true,"8:6":true,"3:1":170,"13:5":true,"15:0":true,"14:6":true,"10:5":true,"9:5":true,"8:2":true,"15:6":true,"14:0":true,"2:0":170,"11:12":true,"8:4":true,"8:3":true,"2:6":[151,169]} \ No newline at end of file +{ + "15:9": true, + "1:1": true, + "11:5": true, + "8:8": true, + "14:9": true, + "15:7": true, + "3:0": 170, + "0:6": true, + "0:0": true, + "14:7": true, + "8:1": true, + "3:6": true, + "13:10": true, + "14:1": true, + "8:7": true, + "5:5": true, + "0:2": true, + "4:5": true, + "15:1": true, + "15:8": true, + "14:8": true, + "2:1": true, + "11:0": true, + "4:3": 170, + "5:4": true, + "5:3": true, + "13:8": true, + "15:14": true, + "10:7": true, + "3:5": true, + "15:12": true, + "13:1": true, + "4:2": 170, + "15:15": true, + "9:7": true, + "5:2": true, + "12:3": true, + "11:4": true, + "9:1": true, + "4:6": true, + "15:10": true, + "5:0": true, + "14:10": true, + "10:1": true, + "5:6": true, + "13:7": true, + "11:3": true, + "4:0": 170, + "10:8": true, + "11:2": true, + "13:9": true, + "9:8": true, + "9:3": true, + "10:4": true, + "10:3": true, + "1:5": true, + "11:1": true, + "9:4": true, + "8:5": true, + "13:6": true, + "9:2": true, + "13:0": true, + "10:2": true, + "13:2": true, + "9:6": true, + "4:1": 170, + "15:5": true, + "10:0": true, + "14:5": true, + "10:6": true, + "5:1": 170, + "9:0": true, + "13:3": true, + "13:4": true, + "15:4": true, + "14:3": true, + "1:6": [ + 151, + 169 + ], + "15:3": true, + "1:0": true, + "14:4": true, + "8:0": true, + "14:2": true, + "13:11": true, + "0:1": true, + "15:2": true, + "8:6": true, + "3:1": 170, + "13:5": true, + "15:0": true, + "14:6": true, + "10:5": true, + "9:5": true, + "8:2": true, + "15:6": true, + "14:0": true, + "2:0": 170, + "11:12": true, + "8:4": true, + "8:3": true, + "2:6": [ + 151, + 169 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-4.json index 384c6db4..5c22c130 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-4.json @@ -1 +1,205 @@ -{"1:1":170,"8:8":true,"6:10":true,"13:13":true,"3:6":true,"14:1":true,"13:15":true,"10:10":true,"8:7":true,"5:5":true,"4:11":true,"0:2":true,"9:10":true,"5:11":true,"4:5":true,"13:12":true,"3:2":true,"15:1":true,"13:14":true,"3:4":true,"0:3":true,"8:9":true,"3:3":true,"0:4":true,"2:1":170,"14:14":true,"4:3":true,"5:4":true,"2:12":true,"10:9":true,"5:3":true,"2:15":170,"15:14":true,"9:9":true,"4:4":true,"10:7":true,"8:10":true,"6:8":true,"3:5":true,"15:12":true,"14:15":true,"13:1":true,"4:2":true,"0:11":true,"15:15":true,"14:12":true,"9:7":true,"3:11":true,"5:2":true,"2:14":170,"1:13":170,"6:9":true,"4:6":true,"2:13":true,"1:14":170,"5:0":170,"5:6":true,"4:0":170,"15:13":true,"1:15":170,"10:8":true,"1:12":true,"9:8":true,"14:13":true,"1:11":true,"3:13":true,"1:5":true,"11:8":true,"13:6":true,"13:0":true,"14:11":true,"13:2":true,"4:1":170,"3:12":true,"11:9":true,"15:5":true,"14:5":true,"5:1":170,"3:15":170,"15:11":true,"13:3":true,"11:7":true,"2:5":true,"13:4":true,"3:14":170,"2:11":true,"15:4":true,"14:3":true,"4:14":true,"1:6":true,"11:10":true,"5:14":true,"2:2":true,"15:3":true,"14:4":true,"5:12":true,"2:4":true,"14:2":true,"13:11":true,"4:15":170,"15:2":true,"4:12":true,"3:1":170,"13:5":true,"5:15":true,"2:3":true,"15:0":true,"14:6":true,"1:3":true,"1:4":true,"15:6":true,"14:0":true,"5:13":true,"1:2":170,"4:13":true,"2:6":true,"15:9":true,"9:14":true,"11:5":true,"2:7":true,"10:14":true,"14:9":true,"11:11":true,"10:12":true,"2:9":true,"15:7":true,"9:15":true,"14:7":true,"9:12":true,"8:1":170,"13:10":true,"10:15":true,"1:8":true,"2:8":true,"1:9":true,"15:8":true,"10:13":true,"6:12":true,"1:7":true,"14:8":true,"9:13":true,"8:13":true,"1:10":true,"13:8":true,"11:6":true,"11:4":true,"9:1":true,"8:12":true,"15:10":true,"14:10":true,"10:1":true,"13:7":true,"11:3":true,"8:15":true,"2:10":true,"11:2":true,"8:14":true,"13:9":true,"12:1":true,"9:3":true,"10:4":true,"5:9":true,"10:3":true,"4:9":true,"11:1":true,"9:4":true,"8:5":true,"5:7":true,"3:10":true,"9:2":true,"8:11":true,"4:7":true,"10:2":true,"0:10":true,"9:6":true,"10:0":true,"10:6":true,"9:0":true,"5:8":true,"4:8":true,"3:8":true,"6:11":true,"11:13":true,"8:0":[170,212],"8:6":true,"10:5":true,"9:11":true,"5:10":true,"3:7":true,"10:11":true,"9:5":true,"4:10":true,"11:14":true,"8:2":true,"11:12":true,"8:4":true,"3:9":true,"11:15":true,"8:3":true,"0:9":true} \ No newline at end of file +{ + "1:1": 170, + "8:8": true, + "6:10": true, + "13:13": true, + "3:6": true, + "14:1": true, + "13:15": true, + "10:10": true, + "8:7": true, + "5:5": true, + "4:11": true, + "0:2": true, + "9:10": true, + "5:11": true, + "4:5": true, + "13:12": true, + "3:2": true, + "15:1": true, + "13:14": true, + "3:4": true, + "0:3": true, + "8:9": true, + "3:3": true, + "0:4": true, + "2:1": 170, + "14:14": true, + "4:3": true, + "5:4": true, + "2:12": true, + "10:9": true, + "5:3": true, + "2:15": 170, + "15:14": true, + "9:9": true, + "4:4": true, + "10:7": true, + "8:10": true, + "6:8": true, + "3:5": true, + "15:12": true, + "14:15": true, + "13:1": true, + "4:2": true, + "0:11": true, + "15:15": true, + "14:12": true, + "9:7": true, + "3:11": true, + "5:2": true, + "2:14": 170, + "1:13": 170, + "6:9": true, + "4:6": true, + "2:13": true, + "1:14": 170, + "5:0": 170, + "5:6": true, + "4:0": 170, + "15:13": true, + "1:15": 170, + "10:8": true, + "1:12": true, + "9:8": true, + "14:13": true, + "1:11": true, + "3:13": true, + "1:5": true, + "11:8": true, + "13:6": true, + "13:0": true, + "14:11": true, + "13:2": true, + "4:1": 170, + "3:12": true, + "11:9": true, + "15:5": true, + "14:5": true, + "5:1": 170, + "3:15": 170, + "15:11": true, + "13:3": true, + "11:7": true, + "2:5": true, + "13:4": true, + "3:14": 170, + "2:11": true, + "15:4": true, + "14:3": true, + "4:14": true, + "1:6": true, + "11:10": true, + "5:14": true, + "2:2": true, + "15:3": true, + "14:4": true, + "5:12": true, + "2:4": true, + "14:2": true, + "13:11": true, + "4:15": 170, + "15:2": true, + "4:12": true, + "3:1": 170, + "13:5": true, + "5:15": true, + "2:3": true, + "15:0": true, + "14:6": true, + "1:3": true, + "1:4": true, + "15:6": true, + "14:0": true, + "5:13": true, + "1:2": 170, + "4:13": true, + "2:6": true, + "15:9": true, + "9:14": true, + "11:5": true, + "2:7": true, + "10:14": true, + "14:9": true, + "11:11": true, + "10:12": true, + "2:9": true, + "15:7": true, + "9:15": true, + "14:7": true, + "9:12": true, + "8:1": 170, + "13:10": true, + "10:15": true, + "1:8": true, + "2:8": true, + "1:9": true, + "15:8": true, + "10:13": true, + "6:12": true, + "1:7": true, + "14:8": true, + "9:13": true, + "8:13": true, + "1:10": true, + "13:8": true, + "11:6": true, + "11:4": true, + "9:1": true, + "8:12": true, + "15:10": true, + "14:10": true, + "10:1": true, + "13:7": true, + "11:3": true, + "8:15": true, + "2:10": true, + "11:2": true, + "8:14": true, + "13:9": true, + "12:1": true, + "9:3": true, + "10:4": true, + "5:9": true, + "10:3": true, + "4:9": true, + "11:1": true, + "9:4": true, + "8:5": true, + "5:7": true, + "3:10": true, + "9:2": true, + "8:11": true, + "4:7": true, + "10:2": true, + "0:10": true, + "9:6": true, + "10:0": true, + "10:6": true, + "9:0": true, + "5:8": true, + "4:8": true, + "3:8": true, + "6:11": true, + "11:13": true, + "8:0": [ + 170, + 212 + ], + "8:6": true, + "10:5": true, + "9:11": true, + "5:10": true, + "3:7": true, + "10:11": true, + "9:5": true, + "4:10": true, + "11:14": true, + "8:2": true, + "11:12": true, + "8:4": true, + "3:9": true, + "11:15": true, + "8:3": true, + "0:9": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-5.json index f5fe8895..036f035b 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-5.json @@ -1 +1,172 @@ -{"15:9":true,"1:1":true,"2:7":true,"13:13":true,"12:5":true,"10:14":170,"14:9":true,"15:7":true,"3:0":true,"9:15":true,"0:0":true,"14:7":true,"9:12":true,"8:1":true,"3:6":true,"13:10":true,"10:15":[170,207],"1:8":true,"14:1":true,"13:15":true,"8:7":true,"5:5":true,"0:2":true,"2:8":true,"9:10":true,"4:5":true,"13:12":true,"3:2":true,"15:1":true,"15:8":true,"13:14":true,"3:4":true,"0:3":true,"8:9":true,"3:3":true,"1:7":true,"0:4":true,"14:8":true,"2:1":true,"11:0":true,"14:14":true,"4:3":true,"8:13":true,"5:4":true,"5:3":true,"13:8":true,"12:0":true,"15:14":true,"4:4":true,"10:7":true,"8:10":true,"3:5":true,"15:12":true,"14:15":true,"13:1":true,"4:2":true,"15:15":true,"14:12":true,"9:7":true,"5:2":true,"2:14":[151,168],"11:4":true,"9:1":true,"8:12":true,"4:6":true,"1:14":[151,168],"15:10":true,"5:0":true,"14:10":true,"10:1":true,"5:6":true,"13:7":true,"8:15":true,"4:0":true,"15:13":true,"10:8":true,"13:9":true,"14:13":true,"6:0":true,"9:3":true,"10:4":true,"10:3":true,"1:5":true,"9:4":true,"8:5":true,"5:7":true,"13:6":true,"9:2":true,"13:0":true,"4:7":true,"10:2":true,"14:11":true,"13:2":true,"9:6":true,"4:1":true,"15:5":true,"10:0":true,"14:5":true,"10:6":true,"5:1":true,"15:11":true,"9:0":true,"7:0":true,"13:3":true,"2:5":true,"0:14":[154,165],"5:8":true,"13:4":true,"3:14":[151,169],"6:2":true,"4:8":true,"15:4":true,"14:3":true,"4:14":[151,169],"1:6":true,"3:8":true,"5:14":[151,169],"2:2":true,"0:8":true,"15:3":true,"1:0":true,"14:4":true,"2:4":true,"8:0":true,"14:2":true,"13:11":true,"4:15":170,"15:2":true,"8:6":true,"3:1":true,"13:5":true,"5:15":170,"2:3":true,"15:0":true,"14:6":true,"10:5":true,"3:7":true,"1:3":true,"9:5":true,"11:14":true,"8:2":true,"1:4":true,"15:6":true,"14:0":true,"2:0":true,"8:4":true,"1:2":true,"8:3":true,"2:6":true} \ No newline at end of file +{ + "15:9": true, + "1:1": true, + "2:7": true, + "13:13": true, + "12:5": true, + "10:14": 170, + "14:9": true, + "15:7": true, + "3:0": true, + "9:15": true, + "0:0": true, + "14:7": true, + "9:12": true, + "8:1": true, + "3:6": true, + "13:10": true, + "10:15": [ + 170, + 207 + ], + "1:8": true, + "14:1": true, + "13:15": true, + "8:7": true, + "5:5": true, + "0:2": true, + "2:8": true, + "9:10": true, + "4:5": true, + "13:12": true, + "3:2": true, + "15:1": true, + "15:8": true, + "13:14": true, + "3:4": true, + "0:3": true, + "8:9": true, + "3:3": true, + "1:7": true, + "0:4": true, + "14:8": true, + "2:1": true, + "11:0": true, + "14:14": true, + "4:3": true, + "8:13": true, + "5:4": true, + "5:3": true, + "13:8": true, + "12:0": true, + "15:14": true, + "4:4": true, + "10:7": true, + "8:10": true, + "3:5": true, + "15:12": true, + "14:15": true, + "13:1": true, + "4:2": true, + "15:15": true, + "14:12": true, + "9:7": true, + "5:2": true, + "2:14": [ + 151, + 168 + ], + "11:4": true, + "9:1": true, + "8:12": true, + "4:6": true, + "1:14": [ + 151, + 168 + ], + "15:10": true, + "5:0": true, + "14:10": true, + "10:1": true, + "5:6": true, + "13:7": true, + "8:15": true, + "4:0": true, + "15:13": true, + "10:8": true, + "13:9": true, + "14:13": true, + "6:0": true, + "9:3": true, + "10:4": true, + "10:3": true, + "1:5": true, + "9:4": true, + "8:5": true, + "5:7": true, + "13:6": true, + "9:2": true, + "13:0": true, + "4:7": true, + "10:2": true, + "14:11": true, + "13:2": true, + "9:6": true, + "4:1": true, + "15:5": true, + "10:0": true, + "14:5": true, + "10:6": true, + "5:1": true, + "15:11": true, + "9:0": true, + "7:0": true, + "13:3": true, + "2:5": true, + "0:14": [ + 154, + 165 + ], + "5:8": true, + "13:4": true, + "3:14": [ + 151, + 169 + ], + "6:2": true, + "4:8": true, + "15:4": true, + "14:3": true, + "4:14": [ + 151, + 169 + ], + "1:6": true, + "3:8": true, + "5:14": [ + 151, + 169 + ], + "2:2": true, + "0:8": true, + "15:3": true, + "1:0": true, + "14:4": true, + "2:4": true, + "8:0": true, + "14:2": true, + "13:11": true, + "4:15": 170, + "15:2": true, + "8:6": true, + "3:1": true, + "13:5": true, + "5:15": 170, + "2:3": true, + "15:0": true, + "14:6": true, + "10:5": true, + "3:7": true, + "1:3": true, + "9:5": true, + "11:14": true, + "8:2": true, + "1:4": true, + "15:6": true, + "14:0": true, + "2:0": true, + "8:4": true, + "1:2": true, + "8:3": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-7.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-7.json index 0b2eacc6..2ddd3045 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-7.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_-7.json @@ -1 +1,86 @@ -{"15:9":true,"12:11":true,"9:14":true,"13:13":true,"12:5":true,"10:14":true,"14:9":true,"11:11":true,"10:12":true,"11:8":true,"13:6":true,"9:15":true,"14:7":true,"9:12":true,"8:11":true,"8:1":true,"13:10":true,"10:15":true,"12:8":true,"14:11":true,"13:15":true,"10:10":true,"11:9":true,"15:5":true,"14:5":true,"9:10":true,"13:12":true,"15:11":true,"12:9":true,"15:8":true,"13:14":true,"11:7":true,"10:13":true,"8:9":true,"13:4":true,"12:7":true,"14:8":true,"9:13":true,"15:4":true,"14:3":true,"14:14":true,"12:6":true,"8:13":true,"10:9":true,"12:10":true,"13:8":true,"15:3":true,"15:14":true,"9:9":true,"14:4":true,"11:6":true,"10:7":true,"8:10":true,"15:12":true,"14:15":true,"13:11":true,"15:2":true,"15:15":true,"14:12":true,"13:5":true,"14:6":true,"12:14":true,"9:11":true,"8:12":true,"15:10":true,"14:10":true,"10:11":true,"13:7":true,"8:15":true,"15:6":true,"15:13":[155,215],"12:15":true,"11:12":true,"10:8":true,"12:12":true,"11:15":true,"8:14":true,"8:3":true,"13:9":true,"9:8":true,"14:13":true} \ No newline at end of file +{ + "15:9": true, + "12:11": true, + "9:14": true, + "13:13": true, + "12:5": true, + "10:14": true, + "14:9": true, + "11:11": true, + "10:12": true, + "11:8": true, + "13:6": true, + "9:15": true, + "14:7": true, + "9:12": true, + "8:11": true, + "8:1": true, + "13:10": true, + "10:15": true, + "12:8": true, + "14:11": true, + "13:15": true, + "10:10": true, + "11:9": true, + "15:5": true, + "14:5": true, + "9:10": true, + "13:12": true, + "15:11": true, + "12:9": true, + "15:8": true, + "13:14": true, + "11:7": true, + "10:13": true, + "8:9": true, + "13:4": true, + "12:7": true, + "14:8": true, + "9:13": true, + "15:4": true, + "14:3": true, + "14:14": true, + "12:6": true, + "8:13": true, + "10:9": true, + "12:10": true, + "13:8": true, + "15:3": true, + "15:14": true, + "9:9": true, + "14:4": true, + "11:6": true, + "10:7": true, + "8:10": true, + "15:12": true, + "14:15": true, + "13:11": true, + "15:2": true, + "15:15": true, + "14:12": true, + "13:5": true, + "14:6": true, + "12:14": true, + "9:11": true, + "8:12": true, + "15:10": true, + "14:10": true, + "10:11": true, + "13:7": true, + "8:15": true, + "15:6": true, + "15:13": [ + 155, + 215 + ], + "12:15": true, + "11:12": true, + "10:8": true, + "12:12": true, + "11:15": true, + "8:14": true, + "8:3": true, + "13:9": true, + "9:8": true, + "14:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_0.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_0.json index ef608932..5f8b086a 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_0.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_0.json @@ -1 +1,61 @@ -{"12:11":147,"13:13":[148,149],"11:11":148,"2:9":[155,239],"2:8":154,"1:9":[154,239],"13:14":148,"14:14":147,"1:10":238,"15:14":146,"15:12":243,"14:15":[148,149],"14:12":145,"2:14":[175,176],"1:14":[174,175],"15:13":145,"2:10":238,"14:13":146,"1:11":237,"4:9":240,"5:7":153,"3:10":[238,239],"0:10":153,"9:6":152,"15:11":true,"3:14":[175,176],"2:11":[236,237],"4:14":175,"0:8":true,"3:9":240,"12:12":148,"0:9":153} \ No newline at end of file +{ + "12:11": 147, + "13:13": [ + 148, + 149 + ], + "11:11": 148, + "2:9": [ + 155, + 239 + ], + "2:8": 154, + "1:9": [ + 154, + 239 + ], + "13:14": 148, + "14:14": 147, + "1:10": 238, + "15:14": 146, + "15:12": 243, + "14:15": [ + 148, + 149 + ], + "14:12": 145, + "2:14": [ + 175, + 176 + ], + "1:14": [ + 174, + 175 + ], + "15:13": 145, + "2:10": 238, + "14:13": 146, + "1:11": 237, + "4:9": 240, + "5:7": 153, + "3:10": [ + 238, + 239 + ], + "0:10": 153, + "9:6": 152, + "15:11": true, + "3:14": [ + 175, + 176 + ], + "2:11": [ + 236, + 237 + ], + "4:14": 175, + "0:8": true, + "3:9": 240, + "12:12": 148, + "0:9": 153 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_10.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_10.json index 2f50b994..51e98b28 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_10.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_10.json @@ -1 +1,59 @@ -{"15:9":127,"6:13":true,"9:12":true,"8:1":true,"14:1":127,"7:13":true,"6:12":true,"2:12":true,"6:1":true,"13:1":127,"5:2":true,"1:13":[170,171],"12:3":127,"11:4":127,"9:1":true,"8:12":true,"2:13":169,"14:10":127,"11:3":127,"12:2":127,"11:2":true,"7:1":true,"9:3":true,"3:13":true,"10:3":true,"7:2":true,"9:2":true,"13:0":127,"10:2":true,"13:2":127,"3:12":true,"0:12":[129,133],"9:0":true,"7:0":127,"3:14":[145,173],"6:2":true,"4:14":[145,174],"5:14":true,"5:12":true,"8:0":true,"15:0":127,"8:2":true,"14:0":127,"5:13":true,"8:3":true} \ No newline at end of file +{ + "15:9": 127, + "6:13": true, + "9:12": true, + "8:1": true, + "14:1": 127, + "7:13": true, + "6:12": true, + "2:12": true, + "6:1": true, + "13:1": 127, + "5:2": true, + "1:13": [ + 170, + 171 + ], + "12:3": 127, + "11:4": 127, + "9:1": true, + "8:12": true, + "2:13": 169, + "14:10": 127, + "11:3": 127, + "12:2": 127, + "11:2": true, + "7:1": true, + "9:3": true, + "3:13": true, + "10:3": true, + "7:2": true, + "9:2": true, + "13:0": 127, + "10:2": true, + "13:2": 127, + "3:12": true, + "0:12": [ + 129, + 133 + ], + "9:0": true, + "7:0": 127, + "3:14": [ + 145, + 173 + ], + "6:2": true, + "4:14": [ + 145, + 174 + ], + "5:14": true, + "5:12": true, + "8:0": true, + "15:0": 127, + "8:2": true, + "14:0": 127, + "5:13": true, + "8:3": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_11.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_11.json index 2b5520cf..5bae7eda 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_11.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_11.json @@ -1 +1,17 @@ -{"15:4":true,"12:1":true,"15:3":true,"11:1":true,"8:0":true,"13:1":true,"15:2":true,"4:7":true,"15:0":true,"14:1":true,"15:5":true,"10:0":true,"15:6":true,"15:1":true,"9:0":true} \ No newline at end of file +{ + "15:4": true, + "12:1": true, + "15:3": true, + "11:1": true, + "8:0": true, + "13:1": true, + "15:2": true, + "4:7": true, + "15:0": true, + "14:1": true, + "15:5": true, + "10:0": true, + "15:6": true, + "15:1": true, + "9:0": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_3.json index 1f44a377..a6a343e8 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_3.json @@ -1 +1,3 @@ -{"0:3":true} \ No newline at end of file +{ + "0:3": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_4.json index 50c8d9d0..030dac50 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_4.json @@ -1 +1,193 @@ -{"15:9":true,"1:1":true,"2:7":true,"8:8":true,"7:12":true,"14:9":true,"10:12":true,"6:13":true,"2:9":true,"15:7":true,"9:15":true,"0:6":[129,148],"14:7":true,"9:12":true,"3:6":true,"1:8":true,"13:15":true,"0:2":true,"14:1":true,"10:10":true,"8:7":true,"4:11":true,"7:13":true,"2:8":true,"9:10":true,"5:11":true,"3:2":true,"1:9":true,"15:8":true,"10:13":true,"0:3":true,"8:9":true,"6:12":true,"1:7":true,"0:4":[129,132],"14:8":true,"9:13":true,"12:6":true,"4:3":[111,177],"8:13":true,"5:4":[173,179],"2:12":true,"10:9":true,"7:7":true,"5:3":[111,179],"1:10":true,"13:8":true,"15:14":true,"9:9":true,"11:6":true,"4:4":[176,177],"10:7":true,"8:10":true,"7:9":true,"13:1":233,"4:2":true,"0:11":true,"15:15":true,"9:7":true,"3:11":true,"5:2":true,"1:13":true,"0:5":[129,132],"12:3":233,"11:4":true,"8:12":true,"7:8":true,"6:9":true,"4:6":true,"2:13":true,"5:6":true,"8:15":true,"13:7":true,"12:4":true,"12:2":234,"2:10":true,"10:8":true,"6:7":true,"1:12":true,"13:9":true,"9:8":true,"9:3":126,"1:11":true,"10:4":[129,132],"3:13":true,"10:3":[129,132],"0:13":true,"7:2":[129,132],"6:6":true,"4:9":true,"9:4":true,"5:7":true,"3:10":true,"11:8":true,"13:6":true,"9:2":[129,132],"8:11":true,"4:7":true,"10:2":[129,132],"0:10":true,"12:8":true,"13:2":true,"9:6":true,"3:12":true,"11:9":true,"15:5":true,"14:5":true,"10:6":true,"0:12":true,"12:9":true,"13:3":true,"11:7":true,"13:4":true,"12:7":true,"6:2":true,"7:6":true,"4:8":true,"2:11":true,"15:4":true,"14:3":true,"1:6":true,"3:8":true,"0:8":true,"15:3":true,"6:11":true,"14:4":true,"5:12":true,"14:2":true,"0:1":true,"15:2":true,"8:6":true,"4:12":true,"13:5":true,"14:6":true,"10:5":true,"9:11":true,"5:10":true,"3:7":true,"10:11":true,"9:5":true,"4:10":true,"8:2":[129,132],"0:7":true,"15:6":true,"12:15":true,"5:13":true,"3:9":true,"11:15":true,"0:9":true,"7:11":true,"4:13":true,"2:6":true} \ No newline at end of file +{ + "15:9": true, + "1:1": true, + "2:7": true, + "8:8": true, + "7:12": true, + "14:9": true, + "10:12": true, + "6:13": true, + "2:9": true, + "15:7": true, + "9:15": true, + "0:6": [ + 129, + 148 + ], + "14:7": true, + "9:12": true, + "3:6": true, + "1:8": true, + "13:15": true, + "0:2": true, + "14:1": true, + "10:10": true, + "8:7": true, + "4:11": true, + "7:13": true, + "2:8": true, + "9:10": true, + "5:11": true, + "3:2": true, + "1:9": true, + "15:8": true, + "10:13": true, + "0:3": true, + "8:9": true, + "6:12": true, + "1:7": true, + "0:4": [ + 129, + 132 + ], + "14:8": true, + "9:13": true, + "12:6": true, + "4:3": [ + 111, + 177 + ], + "8:13": true, + "5:4": [ + 173, + 179 + ], + "2:12": true, + "10:9": true, + "7:7": true, + "5:3": [ + 111, + 179 + ], + "1:10": true, + "13:8": true, + "15:14": true, + "9:9": true, + "11:6": true, + "4:4": [ + 176, + 177 + ], + "10:7": true, + "8:10": true, + "7:9": true, + "13:1": 233, + "4:2": true, + "0:11": true, + "15:15": true, + "9:7": true, + "3:11": true, + "5:2": true, + "1:13": true, + "0:5": [ + 129, + 132 + ], + "12:3": 233, + "11:4": true, + "8:12": true, + "7:8": true, + "6:9": true, + "4:6": true, + "2:13": true, + "5:6": true, + "8:15": true, + "13:7": true, + "12:4": true, + "12:2": 234, + "2:10": true, + "10:8": true, + "6:7": true, + "1:12": true, + "13:9": true, + "9:8": true, + "9:3": 126, + "1:11": true, + "10:4": [ + 129, + 132 + ], + "3:13": true, + "10:3": [ + 129, + 132 + ], + "0:13": true, + "7:2": [ + 129, + 132 + ], + "6:6": true, + "4:9": true, + "9:4": true, + "5:7": true, + "3:10": true, + "11:8": true, + "13:6": true, + "9:2": [ + 129, + 132 + ], + "8:11": true, + "4:7": true, + "10:2": [ + 129, + 132 + ], + "0:10": true, + "12:8": true, + "13:2": true, + "9:6": true, + "3:12": true, + "11:9": true, + "15:5": true, + "14:5": true, + "10:6": true, + "0:12": true, + "12:9": true, + "13:3": true, + "11:7": true, + "13:4": true, + "12:7": true, + "6:2": true, + "7:6": true, + "4:8": true, + "2:11": true, + "15:4": true, + "14:3": true, + "1:6": true, + "3:8": true, + "0:8": true, + "15:3": true, + "6:11": true, + "14:4": true, + "5:12": true, + "14:2": true, + "0:1": true, + "15:2": true, + "8:6": true, + "4:12": true, + "13:5": true, + "14:6": true, + "10:5": true, + "9:11": true, + "5:10": true, + "3:7": true, + "10:11": true, + "9:5": true, + "4:10": true, + "8:2": [ + 129, + 132 + ], + "0:7": true, + "15:6": true, + "12:15": true, + "5:13": true, + "3:9": true, + "11:15": true, + "0:9": true, + "7:11": true, + "4:13": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_6.json index 5a4f9d06..d5fffea6 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_6.json @@ -1 +1,220 @@ -{"15:9":true,"1:1":[129,144],"11:5":true,"6:10":[129,132],"12:5":true,"14:9":true,"15:7":true,"3:0":[141,143],"0:6":[129,148],"0:0":true,"14:7":true,"8:1":true,"3:6":true,"13:10":true,"10:10":true,"5:5":[139,140],"0:2":true,"9:10":true,"4:5":[139,140],"3:2":[141,143],"15:8":true,"3:4":true,"0:3":true,"7:10":[129,132],"3:3":true,"0:4":[129,148],"14:8":true,"2:1":[129,144],"12:6":true,"4:3":[139,140],"10:9":true,"13:8":true,"9:9":true,"6:1":true,"11:6":true,"4:4":[139,140],"10:7":true,"8:10":true,"3:5":true,"4:2":[111,140],"0:11":[129,152],"9:7":true,"5:2":[111,120],"0:5":[129,148],"12:3":true,"11:4":true,"9:1":true,"4:6":true,"15:10":true,"5:0":true,"14:10":true,"10:1":true,"5:6":141,"13:7":true,"12:4":true,"11:3":true,"4:0":[141,143],"10:8":true,"13:9":true,"9:8":true,"7:1":true,"9:3":true,"6:0":true,"1:11":true,"10:4":true,"5:9":[111,179],"10:3":true,"1:5":144,"6:6":[141,168],"4:9":[111,177],"9:4":true,"8:5":true,"3:10":true,"7:4":true,"13:6":true,"9:2":true,"10:2":true,"0:10":[129,132],"7:3":true,"9:6":true,"4:1":[129,140],"15:5":true,"10:0":true,"14:5":true,"10:6":true,"5:1":true,"9:0":true,"6:3":true,"7:0":true,"13:3":true,"2:5":144,"5:8":[173,179],"13:4":true,"7:6":true,"4:8":true,"15:4":true,"14:3":true,"1:6":144,"6:5":[139,168],"2:2":144,"0:8":[129,132],"15:3":true,"1:0":true,"14:4":true,"2:4":144,"8:0":true,"0:1":true,"8:6":true,"3:1":[129,143],"13:5":true,"2:3":144,"14:6":true,"10:5":true,"5:10":[129,132],"1:3":144,"9:5":true,"4:10":[129,132],"8:2":true,"1:4":144,"0:7":[129,132],"15:6":true,"2:0":144,"8:4":true,"1:2":144,"7:5":true,"8:3":true,"0:9":[108,132],"2:6":true} \ No newline at end of file +{ + "15:9": true, + "1:1": [ + 129, + 144 + ], + "11:5": true, + "6:10": [ + 129, + 132 + ], + "12:5": true, + "14:9": true, + "15:7": true, + "3:0": [ + 141, + 143 + ], + "0:6": [ + 129, + 148 + ], + "0:0": true, + "14:7": true, + "8:1": true, + "3:6": true, + "13:10": true, + "10:10": true, + "5:5": [ + 139, + 140 + ], + "0:2": true, + "9:10": true, + "4:5": [ + 139, + 140 + ], + "3:2": [ + 141, + 143 + ], + "15:8": true, + "3:4": true, + "0:3": true, + "7:10": [ + 129, + 132 + ], + "3:3": true, + "0:4": [ + 129, + 148 + ], + "14:8": true, + "2:1": [ + 129, + 144 + ], + "12:6": true, + "4:3": [ + 139, + 140 + ], + "10:9": true, + "13:8": true, + "9:9": true, + "6:1": true, + "11:6": true, + "4:4": [ + 139, + 140 + ], + "10:7": true, + "8:10": true, + "3:5": true, + "4:2": [ + 111, + 140 + ], + "0:11": [ + 129, + 152 + ], + "9:7": true, + "5:2": [ + 111, + 120 + ], + "0:5": [ + 129, + 148 + ], + "12:3": true, + "11:4": true, + "9:1": true, + "4:6": true, + "15:10": true, + "5:0": true, + "14:10": true, + "10:1": true, + "5:6": 141, + "13:7": true, + "12:4": true, + "11:3": true, + "4:0": [ + 141, + 143 + ], + "10:8": true, + "13:9": true, + "9:8": true, + "7:1": true, + "9:3": true, + "6:0": true, + "1:11": true, + "10:4": true, + "5:9": [ + 111, + 179 + ], + "10:3": true, + "1:5": 144, + "6:6": [ + 141, + 168 + ], + "4:9": [ + 111, + 177 + ], + "9:4": true, + "8:5": true, + "3:10": true, + "7:4": true, + "13:6": true, + "9:2": true, + "10:2": true, + "0:10": [ + 129, + 132 + ], + "7:3": true, + "9:6": true, + "4:1": [ + 129, + 140 + ], + "15:5": true, + "10:0": true, + "14:5": true, + "10:6": true, + "5:1": true, + "9:0": true, + "6:3": true, + "7:0": true, + "13:3": true, + "2:5": 144, + "5:8": [ + 173, + 179 + ], + "13:4": true, + "7:6": true, + "4:8": true, + "15:4": true, + "14:3": true, + "1:6": 144, + "6:5": [ + 139, + 168 + ], + "2:2": 144, + "0:8": [ + 129, + 132 + ], + "15:3": true, + "1:0": true, + "14:4": true, + "2:4": 144, + "8:0": true, + "0:1": true, + "8:6": true, + "3:1": [ + 129, + 143 + ], + "13:5": true, + "2:3": 144, + "14:6": true, + "10:5": true, + "5:10": [ + 129, + 132 + ], + "1:3": 144, + "9:5": true, + "4:10": [ + 129, + 132 + ], + "8:2": true, + "1:4": 144, + "0:7": [ + 129, + 132 + ], + "15:6": true, + "2:0": 144, + "8:4": true, + "1:2": 144, + "7:5": true, + "8:3": true, + "0:9": [ + 108, + 132 + ], + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_7.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_7.json index cc177949..8522ddbe 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_7.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_7.json @@ -1 +1,10 @@ -{"0:15":true,"0:3":232,"2:1":233,"2:2":true,"2:4":true,"2:3":true,"1:3":true,"1:2":true} \ No newline at end of file +{ + "0:15": true, + "0:3": 232, + "2:1": 233, + "2:2": true, + "2:4": true, + "2:3": true, + "1:3": true, + "1:2": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_8.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_8.json index 3e21e3c3..032a1fb4 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_8.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_8.json @@ -1 +1,48 @@ -{"15:9":true,"3:13":true,"7:15":true,"6:13":true,"9:15":true,"8:11":true,"10:15":true,"12:8":130,"1:8":true,"4:1":true,"4:11":true,"11:9":true,"7:13":true,"2:8":true,"5:11":true,"3:15":true,"15:8":[129,131],"10:13":true,"6:15":true,"14:8":[130,131],"9:13":true,"8:13":true,"13:8":[130,131],"0:8":true,"6:11":true,"11:13":true,"4:15":true,"5:15":true,"9:11":true,"10:11":true,"8:15":true,"5:13":true,"3:9":true,"11:15":true,"0:9":true,"7:11":true,"4:13":true} \ No newline at end of file +{ + "15:9": true, + "3:13": true, + "7:15": true, + "6:13": true, + "9:15": true, + "8:11": true, + "10:15": true, + "12:8": 130, + "1:8": true, + "4:1": true, + "4:11": true, + "11:9": true, + "7:13": true, + "2:8": true, + "5:11": true, + "3:15": true, + "15:8": [ + 129, + 131 + ], + "10:13": true, + "6:15": true, + "14:8": [ + 130, + 131 + ], + "9:13": true, + "8:13": true, + "13:8": [ + 130, + 131 + ], + "0:8": true, + "6:11": true, + "11:13": true, + "4:15": true, + "5:15": true, + "9:11": true, + "10:11": true, + "8:15": true, + "5:13": true, + "3:9": true, + "11:15": true, + "0:9": true, + "7:11": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_9.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_9.json index 2e8e27c8..4670975e 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-2_9.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-2_9.json @@ -1 +1,47 @@ -{"15:9":[211,214],"9:14":true,"10:14":true,"2:2":true,"11:1":true,"11:13":true,"15:12":206,"15:7":[127,216],"14:2":true,"14:15":127,"9:15":true,"0:1":true,"15:15":[202,203],"15:2":true,"3:1":true,"12:13":true,"14:6":true,"13:2":true,"13:15":127,"12:14":true,"0:2":true,"15:10":209,"11:14":true,"8:15":true,"15:11":true,"15:1":true,"15:8":[214,215],"13:14":true,"12:2":true,"11:12":true,"10:13":true,"1:2":true,"14:8":214} \ No newline at end of file +{ + "15:9": [ + 211, + 214 + ], + "9:14": true, + "10:14": true, + "2:2": true, + "11:1": true, + "11:13": true, + "15:12": 206, + "15:7": [ + 127, + 216 + ], + "14:2": true, + "14:15": 127, + "9:15": true, + "0:1": true, + "15:15": [ + 202, + 203 + ], + "15:2": true, + "3:1": true, + "12:13": true, + "14:6": true, + "13:2": true, + "13:15": 127, + "12:14": true, + "0:2": true, + "15:10": 209, + "11:14": true, + "8:15": true, + "15:11": true, + "15:1": true, + "15:8": [ + 214, + 215 + ], + "13:14": true, + "12:2": true, + "11:12": true, + "10:13": true, + "1:2": true, + "14:8": 214 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_-3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_-3.json index 442b6330..81b28ef2 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_-3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_-3.json @@ -1 +1,12 @@ -{"13:0":[152,166],"13:2":[152,166],"13:3":true,"8:0":true} \ No newline at end of file +{ + "13:0": [ + 152, + 166 + ], + "13:2": [ + 152, + 166 + ], + "13:3": true, + "8:0": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_-4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_-4.json index f30eae4d..64b7be65 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_-4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_-4.json @@ -1 +1,33 @@ -{"11:11":234,"8:1":[205,206],"13:15":[153,166],"5:5":208,"13:12":[153,166],"13:8":true,"13:1":true,"13:9":true,"7:2":206,"13:2":[152,166],"13:4":true,"11:10":true,"12:10":true,"13:11":[152,166],"13:5":true,"10:11":true} \ No newline at end of file +{ + "11:11": 234, + "8:1": [ + 205, + 206 + ], + "13:15": [ + 153, + 166 + ], + "5:5": 208, + "13:12": [ + 153, + 166 + ], + "13:8": true, + "13:1": true, + "13:9": true, + "7:2": 206, + "13:2": [ + 152, + 166 + ], + "13:4": true, + "11:10": true, + "12:10": true, + "13:11": [ + 152, + 166 + ], + "13:5": true, + "10:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_-5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_-5.json index 1817d7ae..a4f4b826 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_-5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_-5.json @@ -1 +1,35 @@ -{"14:9":true,"10:12":199,"13:0":true,"8:11":187,"13:2":true,"10:10":[187,191],"10:13":[171,203],"13:4":true,"9:13":[171,202],"11:10":[187,188],"8:13":201,"13:1":true,"13:5":true,"15:0":true,"9:11":[187,189],"14:10":true,"14:0":true,"11:12":true} \ No newline at end of file +{ + "14:9": true, + "10:12": 199, + "13:0": true, + "8:11": 187, + "13:2": true, + "10:10": [ + 187, + 191 + ], + "10:13": [ + 171, + 203 + ], + "13:4": true, + "9:13": [ + 171, + 202 + ], + "11:10": [ + 187, + 188 + ], + "8:13": 201, + "13:1": true, + "13:5": true, + "15:0": true, + "9:11": [ + 187, + 189 + ], + "14:10": true, + "14:0": true, + "11:12": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_0.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_0.json index c6a5087f..5ef00bba 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_0.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_0.json @@ -1 +1,83 @@ -{"2:7":232,"8:8":232,"7:12":true,"6:10":true,"2:9":[231,232],"0:6":true,"3:6":231,"1:8":true,"8:7":232,"2:8":[231,232],"5:11":true,"13:12":true,"1:9":true,"15:8":true,"8:9":true,"6:12":true,"1:7":true,"2:12":true,"7:7":true,"1:10":true,"8:10":true,"6:8":true,"15:12":153,"0:11":true,"14:12":true,"3:11":232,"8:12":true,"4:6":231,"15:10":152,"5:6":true,"15:13":154,"2:10":true,"6:7":true,"1:12":true,"14:13":154,"1:11":true,"5:9":true,"6:6":true,"4:9":true,"5:7":true,"3:10":true,"8:11":true,"4:7":true,"10:2":true,"0:10":true,"3:12":231,"15:11":153,"5:8":true,"7:6":true,"4:8":true,"2:11":true,"1:6":true,"3:8":[231,232],"0:8":true,"6:11":true,"5:12":true,"8:6":231,"4:12":231,"5:10":true,"3:7":232,"4:10":[231,232],"0:7":true,"3:9":[231,232],"0:9":true,"7:11":true,"2:6":231} \ No newline at end of file +{ + "2:7": 232, + "8:8": 232, + "7:12": true, + "6:10": true, + "2:9": [ + 231, + 232 + ], + "0:6": true, + "3:6": 231, + "1:8": true, + "8:7": 232, + "2:8": [ + 231, + 232 + ], + "5:11": true, + "13:12": true, + "1:9": true, + "15:8": true, + "8:9": true, + "6:12": true, + "1:7": true, + "2:12": true, + "7:7": true, + "1:10": true, + "8:10": true, + "6:8": true, + "15:12": 153, + "0:11": true, + "14:12": true, + "3:11": 232, + "8:12": true, + "4:6": 231, + "15:10": 152, + "5:6": true, + "15:13": 154, + "2:10": true, + "6:7": true, + "1:12": true, + "14:13": 154, + "1:11": true, + "5:9": true, + "6:6": true, + "4:9": true, + "5:7": true, + "3:10": true, + "8:11": true, + "4:7": true, + "10:2": true, + "0:10": true, + "3:12": 231, + "15:11": 153, + "5:8": true, + "7:6": true, + "4:8": true, + "2:11": true, + "1:6": true, + "3:8": [ + 231, + 232 + ], + "0:8": true, + "6:11": true, + "5:12": true, + "8:6": 231, + "4:12": 231, + "5:10": true, + "3:7": 232, + "4:10": [ + 231, + 232 + ], + "0:7": true, + "3:9": [ + 231, + 232 + ], + "0:9": true, + "7:11": true, + "2:6": 231 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_1.json index ad608523..93f45ca0 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_1.json @@ -1 +1,86 @@ -{"11:5":[192,193],"12:5":[188,189],"8:7":185,"4:11":204,"2:12":[159,183],"7:7":[200,201],"11:6":[189,192],"10:7":[190,191],"9:7":186,"3:11":183,"2:14":185,"12:3":193,"11:4":195,"6:9":202,"4:6":179,"2:13":184,"1:14":[184,185],"12:4":[188,193],"1:15":185,"10:8":191,"11:2":221,"10:4":196,"5:9":203,"10:3":[220,221],"4:9":[182,183],"8:5":201,"3:10":182,"4:7":true,"9:6":[184,185],"3:12":184,"13:3":[191,192],"0:14":207,"4:8":[181,182],"14:3":190,"14:2":191,"15:2":true,"8:6":200,"10:5":185,"5:10":203,"4:10":[183,204],"8:4":162,"7:5":162} \ No newline at end of file +{ + "11:5": [ + 192, + 193 + ], + "12:5": [ + 188, + 189 + ], + "8:7": 185, + "4:11": 204, + "2:12": [ + 159, + 183 + ], + "7:7": [ + 200, + 201 + ], + "11:6": [ + 189, + 192 + ], + "10:7": [ + 190, + 191 + ], + "9:7": 186, + "3:11": 183, + "2:14": 185, + "12:3": 193, + "11:4": 195, + "6:9": 202, + "4:6": 179, + "2:13": 184, + "1:14": [ + 184, + 185 + ], + "12:4": [ + 188, + 193 + ], + "1:15": 185, + "10:8": 191, + "11:2": 221, + "10:4": 196, + "5:9": 203, + "10:3": [ + 220, + 221 + ], + "4:9": [ + 182, + 183 + ], + "8:5": 201, + "3:10": 182, + "4:7": true, + "9:6": [ + 184, + 185 + ], + "3:12": 184, + "13:3": [ + 191, + 192 + ], + "0:14": 207, + "4:8": [ + 181, + 182 + ], + "14:3": 190, + "14:2": 191, + "15:2": true, + "8:6": 200, + "10:5": 185, + "5:10": 203, + "4:10": [ + 183, + 204 + ], + "8:4": 162, + "7:5": 162 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_11.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_11.json index 4b6bb9b4..b61ddcbe 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_11.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_11.json @@ -1 +1,4 @@ -{"8:0":true,"12:0":true} \ No newline at end of file +{ + "8:0": true, + "12:0": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_2.json index c8568d98..c34866aa 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_2.json @@ -1 +1,6 @@ -{"0:0":185,"1:0":185,"0:1":186,"2:0":185} \ No newline at end of file +{ + "0:0": 185, + "1:0": 185, + "0:1": 186, + "2:0": 185 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_4.json index 004f6226..086843da 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_4.json @@ -1 +1,167 @@ -{"15:9":true,"12:11":true,"2:7":true,"8:8":true,"7:12":true,"6:10":true,"13:13":true,"14:9":true,"11:11":true,"10:12":true,"6:13":true,"2:9":true,"15:7":true,"0:6":true,"14:7":true,"9:12":true,"3:6":true,"13:10":true,"1:8":true,"14:1":216,"8:7":true,"0:2":true,"7:13":true,"2:8":true,"13:12":true,"3:2":true,"15:1":[130,151],"1:9":true,"15:8":true,"10:13":true,"3:4":true,"0:3":true,"8:9":true,"7:10":true,"6:12":true,"3:3":true,"1:7":true,"0:4":true,"14:8":true,"9:13":true,"12:6":141,"8:13":true,"10:9":true,"7:7":true,"13:8":true,"9:9":true,"11:6":141,"10:7":[139,168],"8:10":true,"7:9":true,"6:8":true,"3:5":true,"15:12":true,"14:12":true,"9:7":true,"0:5":true,"12:3":[111,177],"11:4":[173,179],"8:12":true,"7:8":true,"6:9":true,"4:6":true,"15:10":true,"14:10":true,"5:6":true,"13:7":true,"12:4":[173,177],"11:3":true,"15:13":true,"12:2":true,"6:7":true,"11:2":true,"13:9":true,"9:8":true,"14:13":true,"10:4":true,"5:9":true,"1:5":true,"7:2":true,"6:6":true,"4:9":true,"5:7":true,"7:4":true,"13:6":[141,143],"9:2":true,"8:11":true,"4:7":true,"10:2":true,"12:8":true,"7:3":true,"14:11":true,"13:2":[129,132],"9:6":true,"6:4":true,"10:6":[141,216],"15:11":true,"12:9":true,"6:3":true,"11:7":[139,140],"2:5":true,"5:8":true,"13:4":true,"12:7":true,"6:2":true,"7:6":true,"4:8":true,"1:6":true,"11:10":true,"6:5":true,"3:8":true,"12:10":true,"2:2":true,"0:8":true,"6:11":true,"11:13":true,"2:4":true,"13:11":true,"8:6":true,"12:13":true,"2:3":true,"14:6":144,"9:11":true,"3:7":true,"1:3":true,"10:11":true,"9:5":true,"8:2":true,"1:4":true,"0:7":true,"15:6":true,"11:12":true,"1:2":true,"7:5":true,"3:9":true,"12:12":true,"0:9":true,"7:11":true,"2:6":true} \ No newline at end of file +{ + "15:9": true, + "12:11": true, + "2:7": true, + "8:8": true, + "7:12": true, + "6:10": true, + "13:13": true, + "14:9": true, + "11:11": true, + "10:12": true, + "6:13": true, + "2:9": true, + "15:7": true, + "0:6": true, + "14:7": true, + "9:12": true, + "3:6": true, + "13:10": true, + "1:8": true, + "14:1": 216, + "8:7": true, + "0:2": true, + "7:13": true, + "2:8": true, + "13:12": true, + "3:2": true, + "15:1": [ + 130, + 151 + ], + "1:9": true, + "15:8": true, + "10:13": true, + "3:4": true, + "0:3": true, + "8:9": true, + "7:10": true, + "6:12": true, + "3:3": true, + "1:7": true, + "0:4": true, + "14:8": true, + "9:13": true, + "12:6": 141, + "8:13": true, + "10:9": true, + "7:7": true, + "13:8": true, + "9:9": true, + "11:6": 141, + "10:7": [ + 139, + 168 + ], + "8:10": true, + "7:9": true, + "6:8": true, + "3:5": true, + "15:12": true, + "14:12": true, + "9:7": true, + "0:5": true, + "12:3": [ + 111, + 177 + ], + "11:4": [ + 173, + 179 + ], + "8:12": true, + "7:8": true, + "6:9": true, + "4:6": true, + "15:10": true, + "14:10": true, + "5:6": true, + "13:7": true, + "12:4": [ + 173, + 177 + ], + "11:3": true, + "15:13": true, + "12:2": true, + "6:7": true, + "11:2": true, + "13:9": true, + "9:8": true, + "14:13": true, + "10:4": true, + "5:9": true, + "1:5": true, + "7:2": true, + "6:6": true, + "4:9": true, + "5:7": true, + "7:4": true, + "13:6": [ + 141, + 143 + ], + "9:2": true, + "8:11": true, + "4:7": true, + "10:2": true, + "12:8": true, + "7:3": true, + "14:11": true, + "13:2": [ + 129, + 132 + ], + "9:6": true, + "6:4": true, + "10:6": [ + 141, + 216 + ], + "15:11": true, + "12:9": true, + "6:3": true, + "11:7": [ + 139, + 140 + ], + "2:5": true, + "5:8": true, + "13:4": true, + "12:7": true, + "6:2": true, + "7:6": true, + "4:8": true, + "1:6": true, + "11:10": true, + "6:5": true, + "3:8": true, + "12:10": true, + "2:2": true, + "0:8": true, + "6:11": true, + "11:13": true, + "2:4": true, + "13:11": true, + "8:6": true, + "12:13": true, + "2:3": true, + "14:6": 144, + "9:11": true, + "3:7": true, + "1:3": true, + "10:11": true, + "9:5": true, + "8:2": true, + "1:4": true, + "0:7": true, + "15:6": true, + "11:12": true, + "1:2": true, + "7:5": true, + "3:9": true, + "12:12": true, + "0:9": true, + "7:11": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_5.json index 1174ffa7..db267e0a 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_5.json @@ -1 +1,71 @@ -{"10:4":true,"7:12":true,"7:15":true,"9:4":true,"10:12":true,"3:10":true,"11:8":true,"2:9":true,"13:6":true,"9:15":true,"0:0":true,"9:12":true,"10:2":true,"10:15":true,"12:8":true,"13:15":true,"10:10":true,"4:11":true,"4:1":true,"3:12":true,"10:0":true,"5:11":true,"5:1":true,"3:2":true,"0:12":[221,227],"9:0":true,"6:3":true,"15:8":true,"6:12":true,"0:4":true,"6:15":true,"14:8":true,"2:1":true,"2:11":[217,222],"15:4":true,"2:12":true,"0:8":true,"6:11":true,"6:1":true,"14:4":true,"5:12":true,"14:15":true,"4:2":true,"15:15":true,"3:11":true,"3:1":true,"5:2":true,"14:6":true,"11:4":true,"6:9":true,"8:12":true,"5:10":true,"10:11":true,"10:1":true,"4:10":true,"12:4":true,"8:15":true,"15:6":true,"12:15":true,"10:8":true,"11:15":true,"1:12":224,"9:8":true} \ No newline at end of file +{ + "10:4": true, + "7:12": true, + "7:15": true, + "9:4": true, + "10:12": true, + "3:10": true, + "11:8": true, + "2:9": true, + "13:6": true, + "9:15": true, + "0:0": true, + "9:12": true, + "10:2": true, + "10:15": true, + "12:8": true, + "13:15": true, + "10:10": true, + "4:11": true, + "4:1": true, + "3:12": true, + "10:0": true, + "5:11": true, + "5:1": true, + "3:2": true, + "0:12": [ + 221, + 227 + ], + "9:0": true, + "6:3": true, + "15:8": true, + "6:12": true, + "0:4": true, + "6:15": true, + "14:8": true, + "2:1": true, + "2:11": [ + 217, + 222 + ], + "15:4": true, + "2:12": true, + "0:8": true, + "6:11": true, + "6:1": true, + "14:4": true, + "5:12": true, + "14:15": true, + "4:2": true, + "15:15": true, + "3:11": true, + "3:1": true, + "5:2": true, + "14:6": true, + "11:4": true, + "6:9": true, + "8:12": true, + "5:10": true, + "10:11": true, + "10:1": true, + "4:10": true, + "12:4": true, + "8:15": true, + "15:6": true, + "12:15": true, + "10:8": true, + "11:15": true, + "1:12": 224, + "9:8": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_6.json index 19d48785..a0f17d70 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_6.json @@ -1 +1,133 @@ -{"11:5":true,"2:7":true,"6:10":true,"12:5":true,"11:11":true,"2:9":true,"0:6":true,"8:1":true,"3:6":true,"13:10":true,"1:8":true,"14:1":true,"10:10":true,"5:5":true,"2:8":true,"9:10":true,"4:5":true,"15:1":true,"1:9":true,"3:4":true,"0:3":true,"7:10":true,"3:3":true,"1:7":true,"0:4":true,"11:0":true,"12:6":true,"4:3":true,"5:4":true,"7:7":true,"5:3":true,"1:10":true,"13:8":true,"12:0":true,"6:1":true,"11:6":true,"4:4":true,"8:10":true,"7:9":true,"6:8":true,"3:5":true,"13:1":true,"0:5":true,"12:3":true,"9:1":true,"7:8":true,"6:9":true,"4:6":true,"10:1":true,"5:6":true,"12:4":true,"12:2":true,"2:10":true,"6:7":true,"11:2":true,"7:1":true,"12:1":true,"9:3":true,"6:0":true,"10:3":true,"1:5":true,"7:2":true,"6:6":true,"11:1":true,"9:4":true,"8:5":true,"3:10":true,"11:8":true,"7:4":true,"13:6":true,"13:0":true,"0:10":true,"12:8":true,"7:3":true,"13:2":true,"9:6":true,"11:9":true,"6:4":true,"15:5":true,"10:0":true,"14:5":true,"10:6":true,"15:11":[130,151],"12:9":true,"9:0":true,"6:3":true,"7:0":true,"13:3":true,"2:5":true,"13:4":true,"6:2":true,"7:6":true,"15:4":true,"14:3":true,"1:6":true,"11:10":true,"6:5":true,"3:8":true,"12:10":true,"0:8":true,"15:3":true,"14:4":true,"2:4":true,"8:0":true,"14:2":true,"4:15":true,"15:2":true,"8:6":true,"13:5":true,"5:15":222,"2:3":true,"15:0":true,"14:6":true,"10:5":true,"3:7":true,"1:3":true,"9:5":true,"8:2":true,"1:4":true,"0:7":true,"15:6":true,"14:0":true,"8:4":true,"7:5":true,"3:9":true,"8:3":true,"0:9":true,"2:6":true} \ No newline at end of file +{ + "11:5": true, + "2:7": true, + "6:10": true, + "12:5": true, + "11:11": true, + "2:9": true, + "0:6": true, + "8:1": true, + "3:6": true, + "13:10": true, + "1:8": true, + "14:1": true, + "10:10": true, + "5:5": true, + "2:8": true, + "9:10": true, + "4:5": true, + "15:1": true, + "1:9": true, + "3:4": true, + "0:3": true, + "7:10": true, + "3:3": true, + "1:7": true, + "0:4": true, + "11:0": true, + "12:6": true, + "4:3": true, + "5:4": true, + "7:7": true, + "5:3": true, + "1:10": true, + "13:8": true, + "12:0": true, + "6:1": true, + "11:6": true, + "4:4": true, + "8:10": true, + "7:9": true, + "6:8": true, + "3:5": true, + "13:1": true, + "0:5": true, + "12:3": true, + "9:1": true, + "7:8": true, + "6:9": true, + "4:6": true, + "10:1": true, + "5:6": true, + "12:4": true, + "12:2": true, + "2:10": true, + "6:7": true, + "11:2": true, + "7:1": true, + "12:1": true, + "9:3": true, + "6:0": true, + "10:3": true, + "1:5": true, + "7:2": true, + "6:6": true, + "11:1": true, + "9:4": true, + "8:5": true, + "3:10": true, + "11:8": true, + "7:4": true, + "13:6": true, + "13:0": true, + "0:10": true, + "12:8": true, + "7:3": true, + "13:2": true, + "9:6": true, + "11:9": true, + "6:4": true, + "15:5": true, + "10:0": true, + "14:5": true, + "10:6": true, + "15:11": [ + 130, + 151 + ], + "12:9": true, + "9:0": true, + "6:3": true, + "7:0": true, + "13:3": true, + "2:5": true, + "13:4": true, + "6:2": true, + "7:6": true, + "15:4": true, + "14:3": true, + "1:6": true, + "11:10": true, + "6:5": true, + "3:8": true, + "12:10": true, + "0:8": true, + "15:3": true, + "14:4": true, + "2:4": true, + "8:0": true, + "14:2": true, + "4:15": true, + "15:2": true, + "8:6": true, + "13:5": true, + "5:15": 222, + "2:3": true, + "15:0": true, + "14:6": true, + "10:5": true, + "3:7": true, + "1:3": true, + "9:5": true, + "8:2": true, + "1:4": true, + "0:7": true, + "15:6": true, + "14:0": true, + "8:4": true, + "7:5": true, + "3:9": true, + "8:3": true, + "0:9": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_7.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_7.json index 16de57fc..93cf5660 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_7.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_7.json @@ -1 +1,4 @@ -{"14:15":true,"15:15":true} \ No newline at end of file +{ + "14:15": true, + "15:15": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_8.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_8.json index ff34c0ae..6bf7f26c 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_8.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_8.json @@ -1 +1,36 @@ -{"9:14":157,"10:14":[157,158],"7:15":153,"13:10":true,"3:15":153,"15:1":true,"15:8":true,"3:4":true,"0:3":true,"0:14":[152,154],"6:15":[153,154],"14:8":true,"10:9":156,"2:15":[151,177],"5:15":153,"2:3":true,"15:0":true,"1:3":true,"1:14":177,"11:14":true,"1:15":true,"13:9":true} \ No newline at end of file +{ + "9:14": 157, + "10:14": [ + 157, + 158 + ], + "7:15": 153, + "13:10": true, + "3:15": 153, + "15:1": true, + "15:8": true, + "3:4": true, + "0:3": true, + "0:14": [ + 152, + 154 + ], + "6:15": [ + 153, + 154 + ], + "14:8": true, + "10:9": 156, + "2:15": [ + 151, + 177 + ], + "5:15": 153, + "2:3": true, + "15:0": true, + "1:3": true, + "1:14": 177, + "11:14": true, + "1:15": true, + "13:9": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_9.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_9.json index 022335ab..9c1516a2 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-3_9.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-3_9.json @@ -1 +1,24 @@ -{"1:1":[142,145],"3:0":true,"9:2":true,"0:0":true,"8:1":true,"7:3":true,"3:2":true,"2:1":true,"5:3":true,"2:2":141,"1:0":true,"14:2":true,"15:2":true,"5:0":true,"10:1":true,"8:2":true,"4:0":true,"2:0":true,"8:3":true} \ No newline at end of file +{ + "1:1": [ + 142, + 145 + ], + "3:0": true, + "9:2": true, + "0:0": true, + "8:1": true, + "7:3": true, + "3:2": true, + "2:1": true, + "5:3": true, + "2:2": 141, + "1:0": true, + "14:2": true, + "15:2": true, + "5:0": true, + "10:1": true, + "8:2": true, + "4:0": true, + "2:0": true, + "8:3": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_-1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_-1.json index cebe97d4..11ba2b08 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_-1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_-1.json @@ -1 +1,50 @@ -{"0:6":[145,202],"0:0":true,"1:8":true,"0:2":[198,202],"15:8":true,"0:3":[198,202],"0:4":[143,202],"14:8":true,"0:11":true,"0:5":[198,202],"0:13":[198,202],"0:10":true,"0:15":true,"0:12":true,"7:0":[141,142],"0:14":[202,240],"1:6":true,"0:8":true,"0:1":true,"0:7":[198,202],"0:9":true} \ No newline at end of file +{ + "0:6": [ + 145, + 202 + ], + "0:0": true, + "1:8": true, + "0:2": [ + 198, + 202 + ], + "15:8": true, + "0:3": [ + 198, + 202 + ], + "0:4": [ + 143, + 202 + ], + "14:8": true, + "0:11": true, + "0:5": [ + 198, + 202 + ], + "0:13": [ + 198, + 202 + ], + "0:10": true, + "0:15": true, + "0:12": true, + "7:0": [ + 141, + 142 + ], + "0:14": [ + 202, + 240 + ], + "1:6": true, + "0:8": true, + "0:1": true, + "0:7": [ + 198, + 202 + ], + "0:9": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_-5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_-5.json index e7de5fa3..879e632f 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_-5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_-5.json @@ -1 +1,20 @@ -{"2:7":true,"7:15":209,"3:6":214,"3:4":215,"2:5":215,"1:7":164,"6:15":208,"1:6":[163,164],"3:8":214,"3:5":214,"2:4":216,"2:3":216,"3:7":214,"3:9":true,"2:6":true} \ No newline at end of file +{ + "2:7": true, + "7:15": 209, + "3:6": 214, + "3:4": 215, + "2:5": 215, + "1:7": 164, + "6:15": 208, + "1:6": [ + 163, + 164 + ], + "3:8": 214, + "3:5": 214, + "2:4": 216, + "2:3": 216, + "3:7": 214, + "3:9": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_-6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_-6.json index 63ccec79..5e345adf 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_-6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_-6.json @@ -1 +1,21 @@ -{"3:12":true,"4:3":true,"5:0":true,"2:12":true,"5:1":true,"5:6":true,"4:5":true,"0:12":[220,226],"4:9":true,"5:7":true,"5:8":true,"1:12":[219,226],"5:2":true} \ No newline at end of file +{ + "3:12": true, + "4:3": true, + "5:0": true, + "2:12": true, + "5:1": true, + "5:6": true, + "4:5": true, + "0:12": [ + 220, + 226 + ], + "4:9": true, + "5:7": true, + "5:8": true, + "1:12": [ + 219, + 226 + ], + "5:2": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_0.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_0.json index fac56be4..74ee4eb5 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_0.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_0.json @@ -1 +1,102 @@ -{"15:9":true,"2:7":true,"8:8":true,"7:12":true,"6:10":true,"14:9":true,"2:9":true,"15:7":true,"0:6":true,"0:0":true,"14:7":true,"9:12":true,"3:6":true,"13:10":true,"1:8":true,"10:10":true,"8:7":232,"0:2":true,"2:8":true,"9:10":true,"1:9":true,"15:8":true,"0:3":true,"8:9":true,"7:10":true,"6:12":true,"1:7":true,"0:4":true,"14:8":true,"12:6":true,"10:9":true,"7:7":232,"1:10":true,"13:8":true,"9:9":true,"11:6":true,"10:7":true,"8:10":true,"7:9":true,"6:8":true,"0:11":true,"9:7":true,"0:5":true,"8:12":true,"7:8":true,"6:9":true,"4:6":231,"15:10":true,"14:10":true,"5:6":231,"13:7":true,"2:10":true,"10:8":true,"6:7":232,"13:9":true,"9:8":true,"5:9":true,"0:13":true,"6:6":231,"4:9":true,"5:7":true,"3:10":true,"11:8":true,"13:6":true,"4:7":true,"0:10":true,"12:8":true,"14:11":true,"9:6":231,"0:15":true,"11:9":true,"10:6":true,"0:12":true,"15:11":true,"12:9":true,"11:7":true,"2:5":true,"0:14":true,"5:8":true,"12:7":true,"7:6":231,"4:8":true,"1:6":true,"11:10":true,"3:8":true,"12:10":true,"0:8":true,"0:1":true,"8:6":231,"14:6":true,"9:11":true,"5:10":true,"3:7":true,"10:11":true,"4:10":true,"0:7":true,"15:6":true,"3:9":true,"0:9":true,"2:6":true} \ No newline at end of file +{ + "15:9": true, + "2:7": true, + "8:8": true, + "7:12": true, + "6:10": true, + "14:9": true, + "2:9": true, + "15:7": true, + "0:6": true, + "0:0": true, + "14:7": true, + "9:12": true, + "3:6": true, + "13:10": true, + "1:8": true, + "10:10": true, + "8:7": 232, + "0:2": true, + "2:8": true, + "9:10": true, + "1:9": true, + "15:8": true, + "0:3": true, + "8:9": true, + "7:10": true, + "6:12": true, + "1:7": true, + "0:4": true, + "14:8": true, + "12:6": true, + "10:9": true, + "7:7": 232, + "1:10": true, + "13:8": true, + "9:9": true, + "11:6": true, + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": true, + "0:11": true, + "9:7": true, + "0:5": true, + "8:12": true, + "7:8": true, + "6:9": true, + "4:6": 231, + "15:10": true, + "14:10": true, + "5:6": 231, + "13:7": true, + "2:10": true, + "10:8": true, + "6:7": 232, + "13:9": true, + "9:8": true, + "5:9": true, + "0:13": true, + "6:6": 231, + "4:9": true, + "5:7": true, + "3:10": true, + "11:8": true, + "13:6": true, + "4:7": true, + "0:10": true, + "12:8": true, + "14:11": true, + "9:6": 231, + "0:15": true, + "11:9": true, + "10:6": true, + "0:12": true, + "15:11": true, + "12:9": true, + "11:7": true, + "2:5": true, + "0:14": true, + "5:8": true, + "12:7": true, + "7:6": 231, + "4:8": true, + "1:6": true, + "11:10": true, + "3:8": true, + "12:10": true, + "0:8": true, + "0:1": true, + "8:6": 231, + "14:6": true, + "9:11": true, + "5:10": true, + "3:7": true, + "10:11": true, + "4:10": true, + "0:7": true, + "15:6": true, + "3:9": true, + "0:9": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_1.json index c1c640ba..2ee90774 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_1.json @@ -1 +1,28 @@ -{"2:7":true,"0:13":true,"5:7":true,"0:6":true,"0:0":true,"0:10":true,"0:2":true,"0:15":true,"0:12":true,"3:4":true,"0:3":true,"0:14":true,"3:3":true,"0:4":true,"5:4":true,"5:3":true,"14:15":true,"0:11":true,"0:1":true,"2:3":true,"0:5":true,"3:7":true,"1:14":true,"5:6":true,"0:7":true,"0:9":true} \ No newline at end of file +{ + "2:7": true, + "0:13": true, + "5:7": true, + "0:6": true, + "0:0": true, + "0:10": true, + "0:2": true, + "0:15": true, + "0:12": true, + "3:4": true, + "0:3": true, + "0:14": true, + "3:3": true, + "0:4": true, + "5:4": true, + "5:3": true, + "14:15": true, + "0:11": true, + "0:1": true, + "2:3": true, + "0:5": true, + "3:7": true, + "1:14": true, + "5:6": true, + "0:7": true, + "0:9": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_10.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_10.json index f21789f0..7195ab3e 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_10.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_10.json @@ -1 +1,199 @@ -{"15:9":119,"12:11":true,"1:1":true,"11:5":119,"2:7":true,"8:8":true,"6:10":true,"13:13":true,"12:5":119,"14:9":120,"11:11":true,"10:12":true,"2:9":117,"15:7":119,"3:0":true,"0:6":true,"0:0":true,"14:7":119,"3:6":true,"13:10":true,"1:8":true,"10:10":true,"8:7":true,"5:5":120,"0:2":true,"2:8":true,"9:10":true,"4:5":true,"13:12":true,"3:2":true,"1:9":true,"15:8":119,"3:4":true,"0:3":true,"8:9":true,"7:10":true,"3:3":true,"1:7":true,"14:8":119,"2:1":true,"12:6":119,"4:3":true,"5:4":true,"10:9":true,"7:7":true,"5:3":true,"1:10":true,"13:8":120,"9:9":true,"6:1":true,"11:6":119,"4:4":true,"10:7":true,"8:10":true,"7:9":true,"6:8":true,"3:5":true,"15:12":true,"4:2":true,"0:11":true,"14:12":true,"9:7":true,"5:2":[121,139],"0:5":true,"11:4":118,"7:8":true,"6:9":true,"4:6":[120,161],"2:13":true,"1:14":true,"15:10":120,"5:0":true,"14:10":true,"5:6":120,"13:7":119,"12:4":[117,118],"11:3":true,"4:0":true,"15:13":true,"10:8":true,"6:7":true,"13:9":true,"9:8":true,"7:1":true,"14:13":true,"9:3":118,"6:0":true,"1:11":true,"10:4":119,"5:9":true,"10:3":[116,118],"1:5":true,"0:13":true,"7:2":true,"6:6":true,"4:9":119,"9:4":119,"8:5":true,"5:7":true,"11:8":true,"7:4":120,"13:6":119,"8:11":true,"4:7":120,"0:10":true,"12:8":120,"7:3":[120,163],"14:11":true,"9:6":true,"4:1":true,"0:15":true,"11:9":true,"6:4":true,"15:5":true,"14:5":118,"10:6":119,"5:1":true,"0:12":true,"15:11":120,"12:9":true,"6:3":[120,141],"11:7":120,"2:5":true,"0:14":true,"5:8":true,"13:4":true,"12:7":119,"6:2":true,"7:6":true,"4:8":120,"15:4":true,"1:6":true,"11:10":true,"6:5":120,"3:8":120,"12:10":true,"2:2":true,"0:8":true,"15:3":true,"1:0":true,"14:4":true,"2:4":true,"13:11":true,"0:1":true,"8:6":true,"3:1":true,"13:5":118,"12:13":true,"2:3":true,"14:6":118,"10:5":119,"9:11":true,"3:7":[120,161],"1:3":true,"10:11":true,"9:5":true,"8:2":true,"1:4":true,"0:7":true,"15:6":[118,161],"2:0":true,"11:12":true,"8:4":119,"1:2":true,"7:5":120,"3:9":[118,119],"12:12":true,"8:3":119,"0:9":true,"2:6":true} \ No newline at end of file +{ + "15:9": 119, + "12:11": true, + "1:1": true, + "11:5": 119, + "2:7": true, + "8:8": true, + "6:10": true, + "13:13": true, + "12:5": 119, + "14:9": 120, + "11:11": true, + "10:12": true, + "2:9": 117, + "15:7": 119, + "3:0": true, + "0:6": true, + "0:0": true, + "14:7": 119, + "3:6": true, + "13:10": true, + "1:8": true, + "10:10": true, + "8:7": true, + "5:5": 120, + "0:2": true, + "2:8": true, + "9:10": true, + "4:5": true, + "13:12": true, + "3:2": true, + "1:9": true, + "15:8": 119, + "3:4": true, + "0:3": true, + "8:9": true, + "7:10": true, + "3:3": true, + "1:7": true, + "14:8": 119, + "2:1": true, + "12:6": 119, + "4:3": true, + "5:4": true, + "10:9": true, + "7:7": true, + "5:3": true, + "1:10": true, + "13:8": 120, + "9:9": true, + "6:1": true, + "11:6": 119, + "4:4": true, + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": true, + "3:5": true, + "15:12": true, + "4:2": true, + "0:11": true, + "14:12": true, + "9:7": true, + "5:2": [ + 121, + 139 + ], + "0:5": true, + "11:4": 118, + "7:8": true, + "6:9": true, + "4:6": [ + 120, + 161 + ], + "2:13": true, + "1:14": true, + "15:10": 120, + "5:0": true, + "14:10": true, + "5:6": 120, + "13:7": 119, + "12:4": [ + 117, + 118 + ], + "11:3": true, + "4:0": true, + "15:13": true, + "10:8": true, + "6:7": true, + "13:9": true, + "9:8": true, + "7:1": true, + "14:13": true, + "9:3": 118, + "6:0": true, + "1:11": true, + "10:4": 119, + "5:9": true, + "10:3": [ + 116, + 118 + ], + "1:5": true, + "0:13": true, + "7:2": true, + "6:6": true, + "4:9": 119, + "9:4": 119, + "8:5": true, + "5:7": true, + "11:8": true, + "7:4": 120, + "13:6": 119, + "8:11": true, + "4:7": 120, + "0:10": true, + "12:8": 120, + "7:3": [ + 120, + 163 + ], + "14:11": true, + "9:6": true, + "4:1": true, + "0:15": true, + "11:9": true, + "6:4": true, + "15:5": true, + "14:5": 118, + "10:6": 119, + "5:1": true, + "0:12": true, + "15:11": 120, + "12:9": true, + "6:3": [ + 120, + 141 + ], + "11:7": 120, + "2:5": true, + "0:14": true, + "5:8": true, + "13:4": true, + "12:7": 119, + "6:2": true, + "7:6": true, + "4:8": 120, + "15:4": true, + "1:6": true, + "11:10": true, + "6:5": 120, + "3:8": 120, + "12:10": true, + "2:2": true, + "0:8": true, + "15:3": true, + "1:0": true, + "14:4": true, + "2:4": true, + "13:11": true, + "0:1": true, + "8:6": true, + "3:1": true, + "13:5": 118, + "12:13": true, + "2:3": true, + "14:6": 118, + "10:5": 119, + "9:11": true, + "3:7": [ + 120, + 161 + ], + "1:3": true, + "10:11": true, + "9:5": true, + "8:2": true, + "1:4": true, + "0:7": true, + "15:6": [ + 118, + 161 + ], + "2:0": true, + "11:12": true, + "8:4": 119, + "1:2": true, + "7:5": 120, + "3:9": [ + 118, + 119 + ], + "12:12": true, + "8:3": 119, + "0:9": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_11.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_11.json index 94a5299b..442a1304 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_11.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_11.json @@ -1 +1,13 @@ -{"0:2":[156,158],"0:3":true,"0:1":[157,158],"0:0":true,"0:4":true} \ No newline at end of file +{ + "0:2": [ + 156, + 158 + ], + "0:3": true, + "0:1": [ + 157, + 158 + ], + "0:0": true, + "0:4": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_2.json index 2663a92a..b3c7f83d 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_2.json @@ -1 +1,21 @@ -{"12:1":true,"10:4":[189,190],"13:0":true,"0:0":true,"0:2":true,"0:3":true,"0:4":true,"7:7":194,"6:5":true,"14:2":187,"13:1":true,"0:1":true,"0:5":true,"14:0":true,"7:5":true,"6:7":true} \ No newline at end of file +{ + "12:1": true, + "10:4": [ + 189, + 190 + ], + "13:0": true, + "0:0": true, + "0:2": true, + "0:3": true, + "0:4": true, + "7:7": 194, + "6:5": true, + "14:2": 187, + "13:1": true, + "0:1": true, + "0:5": true, + "14:0": true, + "7:5": true, + "6:7": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_3.json index 06368a6b..26198543 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_3.json @@ -1 +1,37 @@ -{"9:14":true,"10:12":true,"9:15":true,"9:12":true,"9:13":true,"11:0":[150,151],"12:0":176,"12:3":true,"10:1":[155,156],"11:3":true,"12:1":156,"9:3":[175,176],"11:1":[156,176],"9:4":177,"9:2":175,"10:2":176,"0:10":true,"12:13":true,"12:14":true,"12:15":true,"11:12":true,"12:12":true,"0:9":true} \ No newline at end of file +{ + "9:14": true, + "10:12": true, + "9:15": true, + "9:12": true, + "9:13": true, + "11:0": [ + 150, + 151 + ], + "12:0": 176, + "12:3": true, + "10:1": [ + 155, + 156 + ], + "11:3": true, + "12:1": 156, + "9:3": [ + 175, + 176 + ], + "11:1": [ + 156, + 176 + ], + "9:4": 177, + "9:2": 175, + "10:2": 176, + "0:10": true, + "12:13": true, + "12:14": true, + "12:15": true, + "11:12": true, + "12:12": true, + "0:9": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_4.json index baade365..521c4837 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_4.json @@ -1 +1,11 @@ -{"7:13":true,"0:4":138,"12:0":true,"0:5":139,"9:1":true,"10:1":true,"12:1":true,"11:1":true,"9:0":true} \ No newline at end of file +{ + "7:13": true, + "0:4": 138, + "12:0": true, + "0:5": 139, + "9:1": true, + "10:1": true, + "12:1": true, + "11:1": true, + "9:0": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_5.json index 43d11448..93ee3533 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_5.json @@ -1 +1,14 @@ -{"13:3":152,"13:4":true,"14:8":true,"14:3":[138,140],"13:8":true,"15:3":139,"12:0":183,"14:4":true,"12:3":true} \ No newline at end of file +{ + "13:3": 152, + "13:4": true, + "14:8": true, + "14:3": [ + 138, + 140 + ], + "13:8": true, + "15:3": 139, + "12:0": 183, + "14:4": true, + "12:3": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_6.json index 08674183..eeb113d8 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_6.json @@ -1 +1,25 @@ -{"12:11":true,"9:14":true,"11:11":true,"9:15":true,"9:12":true,"9:13":true,"2:12":true,"0:11":true,"1:13":true,"2:13":true,"1:12":true,"1:11":true,"3:13":true,"0:13":true,"0:10":true,"0:12":true,"0:1":true,"12:13":true,"9:11":true,"12:14":true,"10:11":true,"12:15":true,"12:12":true} \ No newline at end of file +{ + "12:11": true, + "9:14": true, + "11:11": true, + "9:15": true, + "9:12": true, + "9:13": true, + "2:12": true, + "0:11": true, + "1:13": true, + "2:13": true, + "1:12": true, + "1:11": true, + "3:13": true, + "0:13": true, + "0:10": true, + "0:12": true, + "0:1": true, + "12:13": true, + "9:11": true, + "12:14": true, + "10:11": true, + "12:15": true, + "12:12": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_7.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_7.json index 82769773..2df26e51 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_7.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_7.json @@ -1 +1,15 @@ -{"1:1":true,"0:2":true,"10:0":true,"9:0":true,"14:8":true,"2:1":true,"11:0":true,"2:2":197,"13:8":true,"12:0":true,"1:0":true,"0:1":true,"2:0":true} \ No newline at end of file +{ + "1:1": true, + "0:2": true, + "10:0": true, + "9:0": true, + "14:8": true, + "2:1": true, + "11:0": true, + "2:2": 197, + "13:8": true, + "12:0": true, + "1:0": true, + "0:1": true, + "2:0": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_8.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_8.json index 6980d16e..059a2de6 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_8.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_8.json @@ -1 +1,76 @@ -{"2:7":true,"8:8":true,"3:6":183,"8:7":137,"0:2":[162,171],"9:10":[157,184],"4:5":162,"13:12":181,"3:4":163,"0:3":[162,172],"8:9":[133,158],"10:9":[132,133],"7:7":183,"9:9":[133,183],"8:10":157,"7:9":133,"6:8":true,"3:5":161,"14:12":[153,180],"5:6":160,"15:13":153,"10:8":[134,182],"6:7":[160,184],"9:8":[135,182],"4:7":true,"11:9":133,"13:3":true,"5:8":true,"14:3":true,"11:10":157,"15:3":true,"2:4":[161,165],"0:1":true,"3:7":true,"1:3":[162,171],"1:4":160,"3:9":true,"2:6":true} \ No newline at end of file +{ + "2:7": true, + "8:8": true, + "3:6": 183, + "8:7": 137, + "0:2": [ + 162, + 171 + ], + "9:10": [ + 157, + 184 + ], + "4:5": 162, + "13:12": 181, + "3:4": 163, + "0:3": [ + 162, + 172 + ], + "8:9": [ + 133, + 158 + ], + "10:9": [ + 132, + 133 + ], + "7:7": 183, + "9:9": [ + 133, + 183 + ], + "8:10": 157, + "7:9": 133, + "6:8": true, + "3:5": 161, + "14:12": [ + 153, + 180 + ], + "5:6": 160, + "15:13": 153, + "10:8": [ + 134, + 182 + ], + "6:7": [ + 160, + 184 + ], + "9:8": [ + 135, + 182 + ], + "4:7": true, + "11:9": 133, + "13:3": true, + "5:8": true, + "14:3": true, + "11:10": 157, + "15:3": true, + "2:4": [ + 161, + 165 + ], + "0:1": true, + "3:7": true, + "1:3": [ + 162, + 171 + ], + "1:4": 160, + "3:9": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_9.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_9.json index 9f64e883..8dd2259d 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-4_9.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-4_9.json @@ -1 +1,42 @@ -{"1:11":true,"3:13":true,"0:13":true,"3:10":true,"2:9":true,"0:6":true,"0:10":true,"4:11":true,"3:12":true,"0:15":true,"2:8":true,"0:12":true,"1:9":true,"0:14":true,"3:14":true,"2:11":true,"4:14":true,"2:12":true,"5:14":true,"1:10":true,"0:8":true,"4:15":true,"0:11":true,"4:12":true,"3:11":true,"2:14":true,"1:13":true,"0:5":true,"15:0":true,"2:13":true,"1:14":true,"4:10":true,"0:7":true,"5:13":true,"2:10":true,"1:15":true,"3:9":true,"1:12":true,"0:9":true,"4:13":true} \ No newline at end of file +{ + "1:11": true, + "3:13": true, + "0:13": true, + "3:10": true, + "2:9": true, + "0:6": true, + "0:10": true, + "4:11": true, + "3:12": true, + "0:15": true, + "2:8": true, + "0:12": true, + "1:9": true, + "0:14": true, + "3:14": true, + "2:11": true, + "4:14": true, + "2:12": true, + "5:14": true, + "1:10": true, + "0:8": true, + "4:15": true, + "0:11": true, + "4:12": true, + "3:11": true, + "2:14": true, + "1:13": true, + "0:5": true, + "15:0": true, + "2:13": true, + "1:14": true, + "4:10": true, + "0:7": true, + "5:13": true, + "2:10": true, + "1:15": true, + "3:9": true, + "1:12": true, + "0:9": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-1.json index fe872f4b..ad2dba34 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-1.json @@ -1 +1,56 @@ -{"12:11":true,"12:5":true,"14:1":true,"15:1":true,"14:14":true,"12:6":true,"15:14":240,"12:0":202,"14:15":true,"14:12":[183,186],"12:3":true,"12:4":true,"15:13":198,"12:2":[198,202],"14:13":[144,189],"12:1":[198,202],"11:8":true,"12:8":true,"14:11":[182,183],"12:9":true,"12:7":true,"14:3":[182,183],"12:10":true,"14:2":[183,186],"12:13":true,"15:0":true,"12:14":true,"14:0":[146,192],"12:15":true,"12:12":true} \ No newline at end of file +{ + "12:11": true, + "12:5": true, + "14:1": true, + "15:1": true, + "14:14": true, + "12:6": true, + "15:14": 240, + "12:0": 202, + "14:15": true, + "14:12": [ + 183, + 186 + ], + "12:3": true, + "12:4": true, + "15:13": 198, + "12:2": [ + 198, + 202 + ], + "14:13": [ + 144, + 189 + ], + "12:1": [ + 198, + 202 + ], + "11:8": true, + "12:8": true, + "14:11": [ + 182, + 183 + ], + "12:9": true, + "12:7": true, + "14:3": [ + 182, + 183 + ], + "12:10": true, + "14:2": [ + 183, + 186 + ], + "12:13": true, + "15:0": true, + "12:14": true, + "14:0": [ + 146, + 192 + ], + "12:15": true, + "12:12": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-2.json index 4ba1b08a..f45f2e4f 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-2.json @@ -1 +1,53 @@ -{"15:9":true,"12:11":202,"12:1":true,"12:5":true,"14:9":true,"14:7":[182,183],"12:8":true,"14:11":[155,198],"12:9":true,"12:7":true,"14:8":[183,186],"14:14":[148,198],"12:6":true,"12:10":true,"12:0":true,"14:15":[147,198],"15:15":true,"14:12":[152,198],"12:13":true,"12:14":true,"12:3":true,"14:10":[156,198],"12:4":true,"12:15":202,"12:2":true,"12:12":202,"14:13":[150,198]} \ No newline at end of file +{ + "15:9": true, + "12:11": 202, + "12:1": true, + "12:5": true, + "14:9": true, + "14:7": [ + 182, + 183 + ], + "12:8": true, + "14:11": [ + 155, + 198 + ], + "12:9": true, + "12:7": true, + "14:8": [ + 183, + 186 + ], + "14:14": [ + 148, + 198 + ], + "12:6": true, + "12:10": true, + "12:0": true, + "14:15": [ + 147, + 198 + ], + "15:15": true, + "14:12": [ + 152, + 198 + ], + "12:13": true, + "12:14": true, + "12:3": true, + "14:10": [ + 156, + 198 + ], + "12:4": true, + "12:15": 202, + "12:2": true, + "12:12": 202, + "14:13": [ + 150, + 198 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-3.json index d86589b5..d3194487 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-3.json @@ -1 +1,50 @@ -{"12:11":true,"12:1":true,"12:5":true,"14:9":true,"14:7":true,"12:8":true,"14:11":true,"15:5":true,"14:5":true,"12:9":true,"12:7":true,"14:8":true,"14:14":[183,186],"14:3":[182,183],"12:6":true,"12:10":true,"12:0":true,"14:4":[183,186],"14:15":[182,183],"14:12":true,"12:13":true,"14:6":true,"12:14":true,"12:3":[198,202],"14:10":true,"12:4":true,"12:15":true,"12:2":[198,202],"12:12":true,"14:13":true} \ No newline at end of file +{ + "12:11": true, + "12:1": true, + "12:5": true, + "14:9": true, + "14:7": true, + "12:8": true, + "14:11": true, + "15:5": true, + "14:5": true, + "12:9": true, + "12:7": true, + "14:8": true, + "14:14": [ + 183, + 186 + ], + "14:3": [ + 182, + 183 + ], + "12:6": true, + "12:10": true, + "12:0": true, + "14:4": [ + 183, + 186 + ], + "14:15": [ + 182, + 183 + ], + "14:12": true, + "12:13": true, + "14:6": true, + "12:14": true, + "12:3": [ + 198, + 202 + ], + "14:10": true, + "12:4": true, + "12:15": true, + "12:2": [ + 198, + 202 + ], + "12:12": true, + "14:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-4.json index 72b3a2bf..ccc6a675 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-4.json @@ -1 +1,143 @@ -{"15:9":220,"12:11":true,"7:12":220,"13:13":220,"14:9":[164,193],"11:11":222,"10:12":222,"3:0":[201,202],"0:0":true,"14:7":[164,192],"9:12":[214,222],"13:10":222,"10:10":222,"7:13":[219,220],"9:10":true,"4:5":177,"13:12":222,"10:13":219,"3:4":[201,202],"7:10":220,"0:4":204,"14:8":true,"9:13":true,"5:4":[177,203],"10:9":219,"9:9":220,"4:4":[201,202],"8:10":true,"7:9":[219,220],"3:5":[175,177],"15:12":222,"0:11":true,"14:12":true,"1:13":true,"0:5":176,"8:12":222,"15:10":222,"14:10":[162,222],"15:13":220,"1:12":true,"13:9":220,"1:5":178,"8:11":222,"14:11":[162,222],"14:5":[172,188],"0:12":true,"15:11":222,"12:9":219,"6:3":177,"13:3":184,"2:5":[176,178],"3:14":true,"15:4":[182,184],"11:10":222,"12:10":222,"15:3":175,"1:0":true,"14:4":[173,184],"2:4":[202,203],"13:11":222,"12:13":[198,219],"14:6":[167,191],"12:14":[198,202],"9:11":222,"10:11":222,"1:4":[203,204],"15:6":190,"2:0":[202,203],"12:15":true,"11:12":222,"12:12":[198,222],"0:9":true} \ No newline at end of file +{ + "15:9": 220, + "12:11": true, + "7:12": 220, + "13:13": 220, + "14:9": [ + 164, + 193 + ], + "11:11": 222, + "10:12": 222, + "3:0": [ + 201, + 202 + ], + "0:0": true, + "14:7": [ + 164, + 192 + ], + "9:12": [ + 214, + 222 + ], + "13:10": 222, + "10:10": 222, + "7:13": [ + 219, + 220 + ], + "9:10": true, + "4:5": 177, + "13:12": 222, + "10:13": 219, + "3:4": [ + 201, + 202 + ], + "7:10": 220, + "0:4": 204, + "14:8": true, + "9:13": true, + "5:4": [ + 177, + 203 + ], + "10:9": 219, + "9:9": 220, + "4:4": [ + 201, + 202 + ], + "8:10": true, + "7:9": [ + 219, + 220 + ], + "3:5": [ + 175, + 177 + ], + "15:12": 222, + "0:11": true, + "14:12": true, + "1:13": true, + "0:5": 176, + "8:12": 222, + "15:10": 222, + "14:10": [ + 162, + 222 + ], + "15:13": 220, + "1:12": true, + "13:9": 220, + "1:5": 178, + "8:11": 222, + "14:11": [ + 162, + 222 + ], + "14:5": [ + 172, + 188 + ], + "0:12": true, + "15:11": 222, + "12:9": 219, + "6:3": 177, + "13:3": 184, + "2:5": [ + 176, + 178 + ], + "3:14": true, + "15:4": [ + 182, + 184 + ], + "11:10": 222, + "12:10": 222, + "15:3": 175, + "1:0": true, + "14:4": [ + 173, + 184 + ], + "2:4": [ + 202, + 203 + ], + "13:11": 222, + "12:13": [ + 198, + 219 + ], + "14:6": [ + 167, + 191 + ], + "12:14": [ + 198, + 202 + ], + "9:11": 222, + "10:11": 222, + "1:4": [ + 203, + 204 + ], + "15:6": 190, + "2:0": [ + 202, + 203 + ], + "12:15": true, + "11:12": 222, + "12:12": [ + 198, + 222 + ], + "0:9": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-5.json index 39e0ea2a..8d791b4b 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-5.json @@ -1 +1,6 @@ -{"3:0":true,"10:5":true,"5:0":true,"4:0":true} \ No newline at end of file +{ + "3:0": true, + "10:5": true, + "5:0": true, + "4:0": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-6.json index 20dc2658..b4ec815d 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_-6.json @@ -1 +1,64 @@ -{"11:5":true,"7:12":true,"4:9":true,"11:1":true,"10:12":true,"11:8":true,"3:0":true,"13:6":true,"13:0":true,"9:12":true,"3:6":true,"13:10":230,"12:8":true,"13:2":true,"11:9":true,"4:5":true,"13:12":true,"3:2":true,"13:3":true,"11:7":true,"6:12":true,"13:4":true,"12:7":true,"6:15":true,"11:0":true,"12:6":true,"4:3":true,"11:10":true,"3:8":[214,225],"12:10":true,"13:8":true,"12:0":true,"11:6":true,"15:12":[219,227],"13:1":true,"14:12":[219,227],"3:1":true,"13:5":true,"12:3":true,"11:4":true,"8:12":true,"3:7":[214,226],"13:7":true,"12:4":true,"11:3":true,"12:2":true,"11:12":true,"12:12":true,"11:2":true,"13:9":230} \ No newline at end of file +{ + "11:5": true, + "7:12": true, + "4:9": true, + "11:1": true, + "10:12": true, + "11:8": true, + "3:0": true, + "13:6": true, + "13:0": true, + "9:12": true, + "3:6": true, + "13:10": 230, + "12:8": true, + "13:2": true, + "11:9": true, + "4:5": true, + "13:12": true, + "3:2": true, + "13:3": true, + "11:7": true, + "6:12": true, + "13:4": true, + "12:7": true, + "6:15": true, + "11:0": true, + "12:6": true, + "4:3": true, + "11:10": true, + "3:8": [ + 214, + 225 + ], + "12:10": true, + "13:8": true, + "12:0": true, + "11:6": true, + "15:12": [ + 219, + 227 + ], + "13:1": true, + "14:12": [ + 219, + 227 + ], + "3:1": true, + "13:5": true, + "12:3": true, + "11:4": true, + "8:12": true, + "3:7": [ + 214, + 226 + ], + "13:7": true, + "12:4": true, + "11:3": true, + "12:2": true, + "11:12": true, + "12:12": true, + "11:2": true, + "13:9": 230 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_0.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_0.json index 1a304ed3..03400aad 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_0.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_0.json @@ -1 +1,102 @@ -{"15:9":true,"12:1":true,"12:11":true,"8:8":true,"6:10":true,"5:9":true,"12:5":true,"0:13":true,"14:9":true,"6:6":true,"4:9":true,"5:7":true,"11:8":true,"2:9":true,"15:7":true,"13:6":true,"14:7":[150,232],"4:7":true,"13:10":true,"12:8":true,"1:8":true,"14:11":true,"14:1":true,"8:7":true,"9:6":true,"11:9":true,"14:5":true,"10:6":true,"5:11":true,"3:15":true,"12:9":true,"1:9":true,"15:8":true,"11:7":true,"0:14":true,"8:9":true,"5:8":true,"12:7":true,"14:8":true,"7:6":true,"4:8":true,"14:14":true,"14:3":true,"12:6":true,"10:9":true,"7:7":true,"12:10":true,"13:8":true,"0:8":true,"12:0":true,"9:9":true,"14:4":true,"11:6":true,"10:7":true,"7:9":true,"6:8":true,"5:12":true,"14:15":[150,183],"14:2":true,"14:12":true,"9:7":true,"8:6":true,"12:13":true,"2:14":true,"1:13":true,"12:14":true,"12:3":true,"14:6":[140,231],"7:8":true,"6:9":true,"5:10":true,"4:6":true,"2:13":true,"1:14":true,"15:10":true,"14:10":true,"5:6":true,"4:10":true,"13:7":true,"12:4":true,"15:6":true,"14:0":true,"12:2":true,"12:15":true,"10:8":true,"6:7":true,"3:9":true,"12:12":true,"13:9":true,"9:8":true,"14:13":true} \ No newline at end of file +{ + "15:9": true, + "12:1": true, + "12:11": true, + "8:8": true, + "6:10": true, + "5:9": true, + "12:5": true, + "0:13": true, + "14:9": true, + "6:6": true, + "4:9": true, + "5:7": true, + "11:8": true, + "2:9": true, + "15:7": true, + "13:6": true, + "14:7": [ + 150, + 232 + ], + "4:7": true, + "13:10": true, + "12:8": true, + "1:8": true, + "14:11": true, + "14:1": true, + "8:7": true, + "9:6": true, + "11:9": true, + "14:5": true, + "10:6": true, + "5:11": true, + "3:15": true, + "12:9": true, + "1:9": true, + "15:8": true, + "11:7": true, + "0:14": true, + "8:9": true, + "5:8": true, + "12:7": true, + "14:8": true, + "7:6": true, + "4:8": true, + "14:14": true, + "14:3": true, + "12:6": true, + "10:9": true, + "7:7": true, + "12:10": true, + "13:8": true, + "0:8": true, + "12:0": true, + "9:9": true, + "14:4": true, + "11:6": true, + "10:7": true, + "7:9": true, + "6:8": true, + "5:12": true, + "14:15": [ + 150, + 183 + ], + "14:2": true, + "14:12": true, + "9:7": true, + "8:6": true, + "12:13": true, + "2:14": true, + "1:13": true, + "12:14": true, + "12:3": true, + "14:6": [ + 140, + 231 + ], + "7:8": true, + "6:9": true, + "5:10": true, + "4:6": true, + "2:13": true, + "1:14": true, + "15:10": true, + "14:10": true, + "5:6": true, + "4:10": true, + "13:7": true, + "12:4": true, + "15:6": true, + "14:0": true, + "12:2": true, + "12:15": true, + "10:8": true, + "6:7": true, + "3:9": true, + "12:12": true, + "13:9": true, + "9:8": true, + "14:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_1.json index 9811e723..4d3f3779 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_1.json @@ -1 +1,58 @@ -{"14:3":true,"12:1":true,"9:3":true,"1:1":true,"10:3":true,"2:15":true,"1:5":true,"15:3":true,"14:9":true,"12:0":true,"1:0":true,"14:4":true,"9:4":true,"2:4":true,"3:0":true,"14:2":true,"13:0":true,"0:0":true,"14:7":true,"3:1":true,"0:5":true,"7:3":true,"15:0":true,"14:11":[182,183],"14:6":true,"14:1":true,"12:3":true,"12:14":true,"0:15":true,"14:10":[183,186],"14:5":true,"3:15":true,"3:2":true,"1:4":true,"15:1":true,"14:0":[138,202],"2:0":true,"13:3":true,"12:2":true,"2:5":true,"1:15":true,"1:2":true,"12:7":true,"12:12":true,"3:3":true,"0:4":true,"14:8":true} \ No newline at end of file +{ + "14:3": true, + "12:1": true, + "9:3": true, + "1:1": true, + "10:3": true, + "2:15": true, + "1:5": true, + "15:3": true, + "14:9": true, + "12:0": true, + "1:0": true, + "14:4": true, + "9:4": true, + "2:4": true, + "3:0": true, + "14:2": true, + "13:0": true, + "0:0": true, + "14:7": true, + "3:1": true, + "0:5": true, + "7:3": true, + "15:0": true, + "14:11": [ + 182, + 183 + ], + "14:6": true, + "14:1": true, + "12:3": true, + "12:14": true, + "0:15": true, + "14:10": [ + 183, + 186 + ], + "14:5": true, + "3:15": true, + "3:2": true, + "1:4": true, + "15:1": true, + "14:0": [ + 138, + 202 + ], + "2:0": true, + "13:3": true, + "12:2": true, + "2:5": true, + "1:15": true, + "1:2": true, + "12:7": true, + "12:12": true, + "3:3": true, + "0:4": true, + "14:8": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_10.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_10.json index abef05f3..3bcb1c7c 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_10.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_10.json @@ -1 +1,176 @@ -{"12:11":true,"9:14":true,"1:1":true,"11:5":true,"2:7":true,"6:10":true,"13:13":true,"12:5":true,"11:11":true,"6:13":true,"2:9":true,"15:7":true,"3:0":true,"9:15":true,"0:6":true,"0:0":true,"14:7":true,"3:6":true,"7:14":true,"1:8":true,"14:1":true,"13:15":true,"8:7":true,"5:5":true,"4:11":true,"0:2":true,"7:13":true,"2:8":true,"5:11":true,"4:5":true,"13:12":true,"3:2":true,"15:1":true,"6:14":true,"1:9":true,"15:8":true,"13:14":true,"3:4":true,"0:3":true,"7:10":true,"6:12":true,"3:3":true,"1:7":true,"0:4":[150,180],"6:15":true,"2:1":true,"14:14":true,"4:3":true,"8:13":true,"5:4":true,"2:12":true,"2:15":true,"1:10":true,"15:14":true,"8:10":true,"7:9":true,"6:8":true,"3:5":true,"14:15":true,"13:1":true,"4:2":true,"0:11":true,"15:15":true,"3:11":true,"2:14":true,"1:13":true,"0:5":true,"11:4":true,"7:8":true,"6:9":true,"4:6":true,"2:13":true,"1:14":true,"5:0":true,"5:6":true,"8:15":true,"4:0":true,"15:13":true,"2:10":true,"1:15":true,"6:7":true,"8:14":true,"1:12":true,"7:1":true,"14:13":true,"6:0":true,"1:11":true,"10:4":true,"3:13":true,"5:9":true,"1:5":[150,176],"0:13":true,"6:6":true,"4:9":true,"8:5":true,"5:7":true,"13:6":true,"13:0":true,"8:11":true,"4:7":true,"0:10":true,"13:2":true,"4:1":true,"3:12":true,"0:15":true,"6:4":true,"15:5":true,"14:5":true,"5:1":true,"3:15":true,"0:12":true,"15:11":true,"7:0":true,"13:3":true,"2:5":true,"0:14":true,"5:8":true,"3:14":true,"7:6":true,"4:8":true,"2:11":true,"15:4":true,"14:3":true,"4:14":true,"1:6":true,"6:5":true,"5:14":true,"2:2":true,"0:8":true,"15:3":true,"1:0":true,"14:4":true,"11:13":true,"5:12":true,"2:4":true,"14:2":true,"4:15":true,"0:1":true,"15:2":true,"8:6":true,"4:12":true,"3:1":true,"13:5":true,"5:15":true,"2:3":true,"15:0":true,"12:14":true,"10:5":true,"5:10":true,"3:7":true,"1:3":150,"9:5":true,"4:10":true,"1:4":true,"0:7":true,"15:6":true,"14:0":true,"2:0":true,"12:15":true,"5:13":true,"1:2":true,"7:5":true,"3:9":true,"12:12":true,"0:9":true,"7:11":true,"4:13":true,"2:6":true} \ No newline at end of file +{ + "12:11": true, + "9:14": true, + "1:1": true, + "11:5": true, + "2:7": true, + "6:10": true, + "13:13": true, + "12:5": true, + "11:11": true, + "6:13": true, + "2:9": true, + "15:7": true, + "3:0": true, + "9:15": true, + "0:6": true, + "0:0": true, + "14:7": true, + "3:6": true, + "7:14": true, + "1:8": true, + "14:1": true, + "13:15": true, + "8:7": true, + "5:5": true, + "4:11": true, + "0:2": true, + "7:13": true, + "2:8": true, + "5:11": true, + "4:5": true, + "13:12": true, + "3:2": true, + "15:1": true, + "6:14": true, + "1:9": true, + "15:8": true, + "13:14": true, + "3:4": true, + "0:3": true, + "7:10": true, + "6:12": true, + "3:3": true, + "1:7": true, + "0:4": [ + 150, + 180 + ], + "6:15": true, + "2:1": true, + "14:14": true, + "4:3": true, + "8:13": true, + "5:4": true, + "2:12": true, + "2:15": true, + "1:10": true, + "15:14": true, + "8:10": true, + "7:9": true, + "6:8": true, + "3:5": true, + "14:15": true, + "13:1": true, + "4:2": true, + "0:11": true, + "15:15": true, + "3:11": true, + "2:14": true, + "1:13": true, + "0:5": true, + "11:4": true, + "7:8": true, + "6:9": true, + "4:6": true, + "2:13": true, + "1:14": true, + "5:0": true, + "5:6": true, + "8:15": true, + "4:0": true, + "15:13": true, + "2:10": true, + "1:15": true, + "6:7": true, + "8:14": true, + "1:12": true, + "7:1": true, + "14:13": true, + "6:0": true, + "1:11": true, + "10:4": true, + "3:13": true, + "5:9": true, + "1:5": [ + 150, + 176 + ], + "0:13": true, + "6:6": true, + "4:9": true, + "8:5": true, + "5:7": true, + "13:6": true, + "13:0": true, + "8:11": true, + "4:7": true, + "0:10": true, + "13:2": true, + "4:1": true, + "3:12": true, + "0:15": true, + "6:4": true, + "15:5": true, + "14:5": true, + "5:1": true, + "3:15": true, + "0:12": true, + "15:11": true, + "7:0": true, + "13:3": true, + "2:5": true, + "0:14": true, + "5:8": true, + "3:14": true, + "7:6": true, + "4:8": true, + "2:11": true, + "15:4": true, + "14:3": true, + "4:14": true, + "1:6": true, + "6:5": true, + "5:14": true, + "2:2": true, + "0:8": true, + "15:3": true, + "1:0": true, + "14:4": true, + "11:13": true, + "5:12": true, + "2:4": true, + "14:2": true, + "4:15": true, + "0:1": true, + "15:2": true, + "8:6": true, + "4:12": true, + "3:1": true, + "13:5": true, + "5:15": true, + "2:3": true, + "15:0": true, + "12:14": true, + "10:5": true, + "5:10": true, + "3:7": true, + "1:3": 150, + "9:5": true, + "4:10": true, + "1:4": true, + "0:7": true, + "15:6": true, + "14:0": true, + "2:0": true, + "12:15": true, + "5:13": true, + "1:2": true, + "7:5": true, + "3:9": true, + "12:12": true, + "0:9": true, + "7:11": true, + "4:13": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_2.json index f2f501c9..976d30de 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_2.json @@ -1 +1,40 @@ -{"14:3":[151,198],"4:3":true,"5:4":true,"6:5":true,"12:0":true,"14:4":[151,198],"4:4":[155,200],"8:5":true,"4:2":true,"14:7":true,"14:6":true,"13:2":true,"5:5":true,"4:6":true,"4:1":true,"6:4":true,"14:5":true,"4:5":[198,200],"4:0":true,"12:2":true,"7:5":true,"3:3":[154,155],"14:8":true} \ No newline at end of file +{ + "14:3": [ + 151, + 198 + ], + "4:3": true, + "5:4": true, + "6:5": true, + "12:0": true, + "14:4": [ + 151, + 198 + ], + "4:4": [ + 155, + 200 + ], + "8:5": true, + "4:2": true, + "14:7": true, + "14:6": true, + "13:2": true, + "5:5": true, + "4:6": true, + "4:1": true, + "6:4": true, + "14:5": true, + "4:5": [ + 198, + 200 + ], + "4:0": true, + "12:2": true, + "7:5": true, + "3:3": [ + 154, + 155 + ], + "14:8": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_4.json index 3ff8084e..3c775a74 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_4.json @@ -1 +1,10 @@ -{"15:9":true,"14:3":152,"13:8":166,"14:9":166,"15:10":167,"15:8":166,"13:9":166,"14:8":166} \ No newline at end of file +{ + "15:9": true, + "14:3": 152, + "13:8": 166, + "14:9": 166, + "15:10": 167, + "15:8": 166, + "13:9": 166, + "14:8": 166 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_6.json index 6e5a9552..92a6e8ef 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_6.json @@ -1 +1,4 @@ -{"3:10":158,"15:1":149} \ No newline at end of file +{ + "3:10": 158, + "15:1": 149 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_7.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_7.json index 803a589b..b6239079 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_7.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_7.json @@ -1 +1,32 @@ -{"3:13":true,"0:13":true,"7:15":true,"9:15":true,"10:15":true,"7:14":true,"3:12":true,"0:15":true,"3:15":true,"0:12":true,"6:14":true,"0:14":true,"3:14":true,"6:15":true,"2:11":true,"4:14":true,"2:12":true,"5:14":true,"2:15":true,"4:15":true,"4:12":true,"5:15":true,"2:14":true,"1:13":true,"2:13":true,"1:14":true,"8:15":true,"1:15":true,"1:12":true,"4:13":true} \ No newline at end of file +{ + "3:13": true, + "0:13": true, + "7:15": true, + "9:15": true, + "10:15": true, + "7:14": true, + "3:12": true, + "0:15": true, + "3:15": true, + "0:12": true, + "6:14": true, + "0:14": true, + "3:14": true, + "6:15": true, + "2:11": true, + "4:14": true, + "2:12": true, + "5:14": true, + "2:15": true, + "4:15": true, + "4:12": true, + "5:15": true, + "2:14": true, + "1:13": true, + "2:13": true, + "1:14": true, + "8:15": true, + "1:15": true, + "1:12": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_8.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_8.json index 3271d484..244c8eb7 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_8.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_8.json @@ -1 +1,183 @@ -{"1:1":true,"2:7":173,"6:10":true,"7:15":true,"6:13":129,"2:9":167,"15:7":true,"3:0":true,"9:15":true,"0:0":true,"14:7":true,"8:1":true,"3:6":true,"10:15":true,"7:14":true,"1:8":[169,173],"14:1":true,"10:10":true,"4:11":130,"0:2":true,"7:13":true,"2:8":[129,174],"5:11":129,"4:5":true,"3:2":true,"6:14":true,"1:9":[168,175],"3:4":true,"0:3":true,"7:10":true,"6:12":true,"3:3":true,"1:7":172,"0:4":true,"6:15":true,"2:1":true,"11:0":true,"12:6":true,"4:3":true,"5:4":true,"2:12":131,"5:3":true,"2:15":[131,151],"1:10":132,"12:0":true,"6:1":true,"4:4":true,"7:9":true,"13:1":true,"4:2":true,"0:11":true,"3:11":131,"5:2":true,"2:14":true,"1:13":true,"0:5":170,"12:3":true,"9:1":true,"6:9":true,"4:6":true,"2:13":true,"1:14":true,"5:0":true,"10:1":true,"5:6":true,"8:15":true,"4:0":true,"12:2":true,"1:15":[131,150],"10:8":true,"11:2":true,"12:1":true,"6:0":true,"10:4":true,"3:13":[131,149],"1:5":true,"0:13":true,"7:2":true,"6:6":true,"11:1":true,"9:4":true,"3:10":130,"7:4":true,"13:6":true,"9:2":true,"13:0":true,"10:2":true,"0:10":133,"13:2":true,"4:1":true,"3:12":131,"0:15":[130,150],"6:4":true,"10:0":true,"14:5":182,"5:1":true,"0:12":true,"9:0":true,"6:3":true,"7:0":true,"13:3":true,"11:7":true,"0:14":true,"3:14":[131,150],"6:2":true,"7:6":true,"2:11":132,"14:3":174,"4:14":131,"11:10":150,"3:8":true,"5:14":true,"2:2":true,"0:8":true,"15:3":[172,173],"1:0":true,"5:12":[130,144],"2:4":true,"8:0":true,"14:2":true,"4:15":true,"0:1":true,"15:2":true,"4:12":130,"3:1":true,"13:5":181,"5:15":131,"2:3":true,"10:5":true,"5:10":true,"3:7":true,"1:3":true,"4:10":128,"8:2":true,"1:4":true,"0:7":130,"15:6":true,"2:0":true,"5:13":130,"1:2":true,"7:5":true,"3:9":true,"11:15":125,"8:3":true,"0:9":132,"7:11":true,"4:13":[131,143],"2:6":true} \ No newline at end of file +{ + "1:1": true, + "2:7": 173, + "6:10": true, + "7:15": true, + "6:13": 129, + "2:9": 167, + "15:7": true, + "3:0": true, + "9:15": true, + "0:0": true, + "14:7": true, + "8:1": true, + "3:6": true, + "10:15": true, + "7:14": true, + "1:8": [ + 169, + 173 + ], + "14:1": true, + "10:10": true, + "4:11": 130, + "0:2": true, + "7:13": true, + "2:8": [ + 129, + 174 + ], + "5:11": 129, + "4:5": true, + "3:2": true, + "6:14": true, + "1:9": [ + 168, + 175 + ], + "3:4": true, + "0:3": true, + "7:10": true, + "6:12": true, + "3:3": true, + "1:7": 172, + "0:4": true, + "6:15": true, + "2:1": true, + "11:0": true, + "12:6": true, + "4:3": true, + "5:4": true, + "2:12": 131, + "5:3": true, + "2:15": [ + 131, + 151 + ], + "1:10": 132, + "12:0": true, + "6:1": true, + "4:4": true, + "7:9": true, + "13:1": true, + "4:2": true, + "0:11": true, + "3:11": 131, + "5:2": true, + "2:14": true, + "1:13": true, + "0:5": 170, + "12:3": true, + "9:1": true, + "6:9": true, + "4:6": true, + "2:13": true, + "1:14": true, + "5:0": true, + "10:1": true, + "5:6": true, + "8:15": true, + "4:0": true, + "12:2": true, + "1:15": [ + 131, + 150 + ], + "10:8": true, + "11:2": true, + "12:1": true, + "6:0": true, + "10:4": true, + "3:13": [ + 131, + 149 + ], + "1:5": true, + "0:13": true, + "7:2": true, + "6:6": true, + "11:1": true, + "9:4": true, + "3:10": 130, + "7:4": true, + "13:6": true, + "9:2": true, + "13:0": true, + "10:2": true, + "0:10": 133, + "13:2": true, + "4:1": true, + "3:12": 131, + "0:15": [ + 130, + 150 + ], + "6:4": true, + "10:0": true, + "14:5": 182, + "5:1": true, + "0:12": true, + "9:0": true, + "6:3": true, + "7:0": true, + "13:3": true, + "11:7": true, + "0:14": true, + "3:14": [ + 131, + 150 + ], + "6:2": true, + "7:6": true, + "2:11": 132, + "14:3": 174, + "4:14": 131, + "11:10": 150, + "3:8": true, + "5:14": true, + "2:2": true, + "0:8": true, + "15:3": [ + 172, + 173 + ], + "1:0": true, + "5:12": [ + 130, + 144 + ], + "2:4": true, + "8:0": true, + "14:2": true, + "4:15": true, + "0:1": true, + "15:2": true, + "4:12": 130, + "3:1": true, + "13:5": 181, + "5:15": 131, + "2:3": true, + "10:5": true, + "5:10": true, + "3:7": true, + "1:3": true, + "4:10": 128, + "8:2": true, + "1:4": true, + "0:7": 130, + "15:6": true, + "2:0": true, + "5:13": 130, + "1:2": true, + "7:5": true, + "3:9": true, + "11:15": 125, + "8:3": true, + "0:9": 132, + "7:11": true, + "4:13": [ + 131, + 143 + ], + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_9.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_9.json index cee24520..0b058a28 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-5_9.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-5_9.json @@ -1 +1,229 @@ -{"1:1":true,"8:8":true,"6:10":true,"13:13":true,"0:6":true,"0:0":true,"3:6":true,"13:15":true,"10:10":true,"8:7":true,"4:11":true,"0:2":true,"9:10":true,"5:11":true,"13:12":true,"3:2":[123,124],"13:14":true,"3:4":123,"0:3":true,"8:9":true,"7:10":true,"3:3":[123,124],"0:4":true,"2:1":128,"14:14":true,"4:3":true,"5:4":true,"2:12":true,"10:9":true,"7:7":true,"5:3":true,"2:15":true,"15:14":true,"9:9":true,"10:7":true,"8:10":true,"7:9":true,"6:8":true,"3:5":true,"15:12":true,"14:15":true,"4:2":true,"0:11":true,"15:15":true,"14:12":true,"9:7":true,"3:11":true,"5:2":true,"2:14":true,"1:13":true,"0:5":true,"2:13":true,"7:8":true,"6:9":true,"4:6":true,"1:14":true,"5:0":true,"5:6":true,"4:0":true,"15:13":true,"1:15":true,"10:8":true,"6:7":true,"1:12":true,"9:8":true,"14:13":true,"1:11":true,"3:13":true,"1:5":true,"0:13":true,"11:8":true,"13:6":true,"12:8":true,"14:11":true,"13:2":true,"4:1":true,"3:12":true,"0:15":true,"11:9":true,"15:5":true,"14:5":true,"5:1":true,"3:15":true,"0:12":true,"15:11":true,"12:9":true,"11:7":true,"2:5":true,"0:14":true,"13:4":true,"12:7":true,"3:14":true,"2:11":true,"4:14":true,"1:6":true,"11:10":true,"12:10":true,"5:14":true,"2:2":124,"1:0":true,"14:4":true,"5:12":true,"2:4":true,"13:11":true,"4:12":true,"3:1":129,"13:5":true,"2:3":true,"14:6":true,"1:3":true,"1:4":true,"15:6":true,"5:13":true,"1:2":true,"4:13":true,"2:6":true,"15:9":true,"12:11":true,"11:5":true,"2:7":true,"7:12":true,"12:5":true,"7:15":true,"14:9":true,"11:11":true,"10:12":true,"6:13":true,"2:9":true,"15:7":true,"14:7":true,"9:12":true,"8:1":true,"13:10":true,"1:8":true,"2:8":true,"6:14":true,"1:9":true,"15:8":true,"10:13":true,"6:12":true,"1:7":true,"6:15":true,"14:8":true,"12:6":true,"1:10":true,"13:8":true,"6:1":true,"11:6":true,"11:4":true,"9:1":true,"8:12":true,"12:3":true,"15:10":true,"14:10":true,"13:7":true,"11:3":true,"12:2":true,"2:10":true,"11:2":true,"8:14":true,"13:9":true,"7:1":true,"12:1":true,"9:3":true,"6:0":true,"10:4":true,"5:9":true,"10:3":true,"7:2":true,"6:6":true,"4:9":true,"11:1":true,"9:4":true,"8:5":true,"5:7":true,"3:10":true,"7:4":true,"9:2":true,"8:11":true,"4:7":true,"10:2":true,"0:10":true,"7:3":true,"9:6":true,"10:0":true,"10:6":true,"9:0":127,"6:3":true,"7:0":true,"5:8":true,"6:2":true,"7:6":true,"4:8":true,"6:5":true,"3:8":true,"0:8":true,"6:11":true,"11:13":true,"8:0":128,"8:6":true,"12:13":true,"12:14":true,"10:5":true,"9:11":true,"5:10":true,"3:7":true,"10:11":true,"9:5":true,"4:10":true,"11:14":true,"8:2":true,"0:7":true,"12:15":true,"11:12":true,"8:4":true,"7:5":true,"3:9":true,"12:12":true,"8:3":true,"0:9":true,"7:11":true} \ No newline at end of file +{ + "1:1": true, + "8:8": true, + "6:10": true, + "13:13": true, + "0:6": true, + "0:0": true, + "3:6": true, + "13:15": true, + "10:10": true, + "8:7": true, + "4:11": true, + "0:2": true, + "9:10": true, + "5:11": true, + "13:12": true, + "3:2": [ + 123, + 124 + ], + "13:14": true, + "3:4": 123, + "0:3": true, + "8:9": true, + "7:10": true, + "3:3": [ + 123, + 124 + ], + "0:4": true, + "2:1": 128, + "14:14": true, + "4:3": true, + "5:4": true, + "2:12": true, + "10:9": true, + "7:7": true, + "5:3": true, + "2:15": true, + "15:14": true, + "9:9": true, + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": true, + "3:5": true, + "15:12": true, + "14:15": true, + "4:2": true, + "0:11": true, + "15:15": true, + "14:12": true, + "9:7": true, + "3:11": true, + "5:2": true, + "2:14": true, + "1:13": true, + "0:5": true, + "2:13": true, + "7:8": true, + "6:9": true, + "4:6": true, + "1:14": true, + "5:0": true, + "5:6": true, + "4:0": true, + "15:13": true, + "1:15": true, + "10:8": true, + "6:7": true, + "1:12": true, + "9:8": true, + "14:13": true, + "1:11": true, + "3:13": true, + "1:5": true, + "0:13": true, + "11:8": true, + "13:6": true, + "12:8": true, + "14:11": true, + "13:2": true, + "4:1": true, + "3:12": true, + "0:15": true, + "11:9": true, + "15:5": true, + "14:5": true, + "5:1": true, + "3:15": true, + "0:12": true, + "15:11": true, + "12:9": true, + "11:7": true, + "2:5": true, + "0:14": true, + "13:4": true, + "12:7": true, + "3:14": true, + "2:11": true, + "4:14": true, + "1:6": true, + "11:10": true, + "12:10": true, + "5:14": true, + "2:2": 124, + "1:0": true, + "14:4": true, + "5:12": true, + "2:4": true, + "13:11": true, + "4:12": true, + "3:1": 129, + "13:5": true, + "2:3": true, + "14:6": true, + "1:3": true, + "1:4": true, + "15:6": true, + "5:13": true, + "1:2": true, + "4:13": true, + "2:6": true, + "15:9": true, + "12:11": true, + "11:5": true, + "2:7": true, + "7:12": true, + "12:5": true, + "7:15": true, + "14:9": true, + "11:11": true, + "10:12": true, + "6:13": true, + "2:9": true, + "15:7": true, + "14:7": true, + "9:12": true, + "8:1": true, + "13:10": true, + "1:8": true, + "2:8": true, + "6:14": true, + "1:9": true, + "15:8": true, + "10:13": true, + "6:12": true, + "1:7": true, + "6:15": true, + "14:8": true, + "12:6": true, + "1:10": true, + "13:8": true, + "6:1": true, + "11:6": true, + "11:4": true, + "9:1": true, + "8:12": true, + "12:3": true, + "15:10": true, + "14:10": true, + "13:7": true, + "11:3": true, + "12:2": true, + "2:10": true, + "11:2": true, + "8:14": true, + "13:9": true, + "7:1": true, + "12:1": true, + "9:3": true, + "6:0": true, + "10:4": true, + "5:9": true, + "10:3": true, + "7:2": true, + "6:6": true, + "4:9": true, + "11:1": true, + "9:4": true, + "8:5": true, + "5:7": true, + "3:10": true, + "7:4": true, + "9:2": true, + "8:11": true, + "4:7": true, + "10:2": true, + "0:10": true, + "7:3": true, + "9:6": true, + "10:0": true, + "10:6": true, + "9:0": 127, + "6:3": true, + "7:0": true, + "5:8": true, + "6:2": true, + "7:6": true, + "4:8": true, + "6:5": true, + "3:8": true, + "0:8": true, + "6:11": true, + "11:13": true, + "8:0": 128, + "8:6": true, + "12:13": true, + "12:14": true, + "10:5": true, + "9:11": true, + "5:10": true, + "3:7": true, + "10:11": true, + "9:5": true, + "4:10": true, + "11:14": true, + "8:2": true, + "0:7": true, + "12:15": true, + "11:12": true, + "8:4": true, + "7:5": true, + "3:9": true, + "12:12": true, + "8:3": true, + "0:9": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_-3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_-3.json index ee4eb238..b06d77d3 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_-3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_-3.json @@ -1 +1,22 @@ -{"1:6":true,"5:4":true,"2:7":[174,218],"7:2":true,"0:1":true,"8:1":true,"3:6":true,"2:3":true,"0:5":true,"4:1":true,"0:2":true,"5:0":true,"4:5":true,"3:2":true,"1:4":true,"9:0":true,"6:3":true} \ No newline at end of file +{ + "1:6": true, + "5:4": true, + "2:7": [ + 174, + 218 + ], + "7:2": true, + "0:1": true, + "8:1": true, + "3:6": true, + "2:3": true, + "0:5": true, + "4:1": true, + "0:2": true, + "5:0": true, + "4:5": true, + "3:2": true, + "1:4": true, + "9:0": true, + "6:3": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_-4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_-4.json index d839a5ae..0bac7ab9 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_-4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_-4.json @@ -1 +1,106 @@ -{"1:1":true,"12:5":true,"3:0":true,"0:0":true,"14:7":true,"9:12":true,"8:1":true,"10:15":true,"7:14":true,"14:1":true,"0:2":true,"13:12":true,"3:2":true,"1:9":true,"15:8":[175,218],"0:3":true,"3:3":true,"0:4":true,"6:15":true,"2:1":true,"11:0":true,"4:3":true,"8:13":true,"5:4":true,"5:3":true,"1:10":true,"13:8":[175,217],"12:0":true,"15:12":true,"4:2":true,"0:11":true,"5:2":true,"1:13":true,"11:4":true,"15:10":true,"5:0":204,"13:7":true,"12:4":true,"1:12":true,"6:0":[203,204],"1:11":true,"10:4":[202,203],"10:3":true,"0:13":true,"9:4":[201,202],"7:4":true,"13:6":true,"9:2":218,"0:10":true,"14:11":true,"4:1":true,"6:4":true,"10:0":true,"5:1":161,"0:12":true,"12:9":true,"9:0":true,"6:3":true,"7:0":[202,218],"13:3":true,"13:4":true,"12:7":true,"14:3":true,"11:10":true,"1:0":true,"8:0":[201,202],"14:2":true,"0:1":true,"8:6":true,"3:1":true,"12:13":true,"1:3":true,"10:11":true,"11:14":true,"1:4":true,"2:0":true,"8:4":[201,202],"1:2":true,"7:5":true,"0:9":true} \ No newline at end of file +{ + "1:1": true, + "12:5": true, + "3:0": true, + "0:0": true, + "14:7": true, + "9:12": true, + "8:1": true, + "10:15": true, + "7:14": true, + "14:1": true, + "0:2": true, + "13:12": true, + "3:2": true, + "1:9": true, + "15:8": [ + 175, + 218 + ], + "0:3": true, + "3:3": true, + "0:4": true, + "6:15": true, + "2:1": true, + "11:0": true, + "4:3": true, + "8:13": true, + "5:4": true, + "5:3": true, + "1:10": true, + "13:8": [ + 175, + 217 + ], + "12:0": true, + "15:12": true, + "4:2": true, + "0:11": true, + "5:2": true, + "1:13": true, + "11:4": true, + "15:10": true, + "5:0": 204, + "13:7": true, + "12:4": true, + "1:12": true, + "6:0": [ + 203, + 204 + ], + "1:11": true, + "10:4": [ + 202, + 203 + ], + "10:3": true, + "0:13": true, + "9:4": [ + 201, + 202 + ], + "7:4": true, + "13:6": true, + "9:2": 218, + "0:10": true, + "14:11": true, + "4:1": true, + "6:4": true, + "10:0": true, + "5:1": 161, + "0:12": true, + "12:9": true, + "9:0": true, + "6:3": true, + "7:0": [ + 202, + 218 + ], + "13:3": true, + "13:4": true, + "12:7": true, + "14:3": true, + "11:10": true, + "1:0": true, + "8:0": [ + 201, + 202 + ], + "14:2": true, + "0:1": true, + "8:6": true, + "3:1": true, + "12:13": true, + "1:3": true, + "10:11": true, + "11:14": true, + "1:4": true, + "2:0": true, + "8:4": [ + 201, + 202 + ], + "1:2": true, + "7:5": true, + "0:9": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_-5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_-5.json index 998fbd6c..302a2cfe 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_-5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_-5.json @@ -1 +1,102 @@ -{"1:1":true,"8:8":true,"6:10":true,"0:6":true,"0:0":true,"1:8":177,"4:11":true,"0:2":177,"5:11":true,"1:9":177,"3:4":[208,209],"8:9":true,"1:7":true,"6:15":217,"5:3":209,"2:15":true,"1:10":[177,218],"12:0":209,"9:9":true,"7:9":true,"15:12":235,"0:11":177,"3:11":[237,238],"9:1":[210,212],"7:8":true,"6:9":true,"1:14":true,"10:1":[211,212],"6:7":224,"6:0":true,"1:11":[177,237],"1:5":true,"0:13":true,"7:2":[210,211],"11:1":[209,213],"13:0":[209,210],"0:10":177,"3:12":218,"5:1":[196,198],"2:5":true,"0:14":true,"6:2":210,"2:11":[218,237],"5:14":217,"0:8":177,"6:11":true,"1:0":true,"0:1":177,"5:10":true,"4:10":236,"8:2":true,"0:7":true,"14:0":[211,212],"2:0":true,"1:2":177,"0:9":[177,218],"7:11":true,"4:13":[217,218]} \ No newline at end of file +{ + "1:1": true, + "8:8": true, + "6:10": true, + "0:6": true, + "0:0": true, + "1:8": 177, + "4:11": true, + "0:2": 177, + "5:11": true, + "1:9": 177, + "3:4": [ + 208, + 209 + ], + "8:9": true, + "1:7": true, + "6:15": 217, + "5:3": 209, + "2:15": true, + "1:10": [ + 177, + 218 + ], + "12:0": 209, + "9:9": true, + "7:9": true, + "15:12": 235, + "0:11": 177, + "3:11": [ + 237, + 238 + ], + "9:1": [ + 210, + 212 + ], + "7:8": true, + "6:9": true, + "1:14": true, + "10:1": [ + 211, + 212 + ], + "6:7": 224, + "6:0": true, + "1:11": [ + 177, + 237 + ], + "1:5": true, + "0:13": true, + "7:2": [ + 210, + 211 + ], + "11:1": [ + 209, + 213 + ], + "13:0": [ + 209, + 210 + ], + "0:10": 177, + "3:12": 218, + "5:1": [ + 196, + 198 + ], + "2:5": true, + "0:14": true, + "6:2": 210, + "2:11": [ + 218, + 237 + ], + "5:14": 217, + "0:8": 177, + "6:11": true, + "1:0": true, + "0:1": 177, + "5:10": true, + "4:10": 236, + "8:2": true, + "0:7": true, + "14:0": [ + 211, + 212 + ], + "2:0": true, + "1:2": 177, + "0:9": [ + 177, + 218 + ], + "7:11": true, + "4:13": [ + 217, + 218 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_-6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_-6.json index 32fc9d93..a9d5b23b 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_-6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_-6.json @@ -1 +1,21 @@ -{"1:6":true,"1:5":true,"0:8":true,"14:15":[209,210],"0:6":true,"0:5":true,"12:8":183,"1:8":true,"1:14":true,"0:15":true,"0:7":true,"1:9":true,"1:15":true,"0:14":true,"1:7":true,"0:9":true} \ No newline at end of file +{ + "1:6": true, + "1:5": true, + "0:8": true, + "14:15": [ + 209, + 210 + ], + "0:6": true, + "0:5": true, + "12:8": 183, + "1:8": true, + "1:14": true, + "0:15": true, + "0:7": true, + "1:9": true, + "1:15": true, + "0:14": true, + "1:7": true, + "0:9": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_0.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_0.json index f4ef8dc2..55039193 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_0.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_0.json @@ -1 +1,35 @@ -{"3:13":true,"13:13":true,"10:14":true,"0:13":190,"6:13":true,"7:14":true,"7:13":true,"3:15":true,"6:14":true,"13:14":true,"10:13":true,"0:14":190,"3:14":true,"9:13":true,"14:14":true,"4:14":true,"8:13":true,"5:14":true,"15:14":true,"11:13":true,"12:13":true,"5:15":true,"2:14":190,"1:13":true,"12:14":true,"2:13":true,"1:14":190,"11:14":true,"15:13":true,"5:13":true,"8:14":true,"14:13":true,"4:13":true} \ No newline at end of file +{ + "3:13": true, + "13:13": true, + "10:14": true, + "0:13": 190, + "6:13": true, + "7:14": true, + "7:13": true, + "3:15": true, + "6:14": true, + "13:14": true, + "10:13": true, + "0:14": 190, + "3:14": true, + "9:13": true, + "14:14": true, + "4:14": true, + "8:13": true, + "5:14": true, + "15:14": true, + "11:13": true, + "12:13": true, + "5:15": true, + "2:14": 190, + "1:13": true, + "12:14": true, + "2:13": true, + "1:14": 190, + "11:14": true, + "15:13": true, + "5:13": true, + "8:14": true, + "14:13": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_1.json index 7e4d2f51..3c4e65c8 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_1.json @@ -1 +1,98 @@ -{"1:1":true,"11:5":true,"12:5":true,"3:0":true,"0:0":[190,192],"10:15":true,"1:8":true,"13:15":[198,200],"5:5":true,"2:8":true,"4:5":true,"3:2":true,"15:1":true,"1:9":true,"3:4":true,"0:4":true,"11:0":true,"5:4":true,"12:0":true,"6:1":true,"4:4":true,"3:5":true,"14:15":[198,200],"13:1":true,"15:15":[198,200],"5:2":true,"0:5":true,"11:4":true,"9:1":true,"5:0":true,"12:4":true,"4:0":true,"11:2":true,"7:1":true,"6:0":true,"10:4":true,"1:5":true,"7:2":true,"11:1":true,"8:5":true,"7:4":true,"9:2":true,"13:0":true,"0:10":true,"13:2":true,"6:4":true,"15:5":true,"10:0":true,"14:5":true,"5:1":true,"9:0":true,"7:0":true,"2:5":true,"13:4":true,"4:8":true,"15:4":true,"6:5":true,"3:8":true,"0:8":true,"1:0":[190,192],"14:4":true,"2:4":true,"8:0":true,"15:2":true,"3:1":true,"13:5":true,"15:0":true,"10:5":true,"9:5":true,"1:4":true,"0:7":true,"14:0":true,"2:0":[190,192],"12:15":true,"8:4":true,"1:2":true,"7:5":true,"11:15":true} \ No newline at end of file +{ + "1:1": true, + "11:5": true, + "12:5": true, + "3:0": true, + "0:0": [ + 190, + 192 + ], + "10:15": true, + "1:8": true, + "13:15": [ + 198, + 200 + ], + "5:5": true, + "2:8": true, + "4:5": true, + "3:2": true, + "15:1": true, + "1:9": true, + "3:4": true, + "0:4": true, + "11:0": true, + "5:4": true, + "12:0": true, + "6:1": true, + "4:4": true, + "3:5": true, + "14:15": [ + 198, + 200 + ], + "13:1": true, + "15:15": [ + 198, + 200 + ], + "5:2": true, + "0:5": true, + "11:4": true, + "9:1": true, + "5:0": true, + "12:4": true, + "4:0": true, + "11:2": true, + "7:1": true, + "6:0": true, + "10:4": true, + "1:5": true, + "7:2": true, + "11:1": true, + "8:5": true, + "7:4": true, + "9:2": true, + "13:0": true, + "0:10": true, + "13:2": true, + "6:4": true, + "15:5": true, + "10:0": true, + "14:5": true, + "5:1": true, + "9:0": true, + "7:0": true, + "2:5": true, + "13:4": true, + "4:8": true, + "15:4": true, + "6:5": true, + "3:8": true, + "0:8": true, + "1:0": [ + 190, + 192 + ], + "14:4": true, + "2:4": true, + "8:0": true, + "15:2": true, + "3:1": true, + "13:5": true, + "15:0": true, + "10:5": true, + "9:5": true, + "1:4": true, + "0:7": true, + "14:0": true, + "2:0": [ + 190, + 192 + ], + "12:15": true, + "8:4": true, + "1:2": true, + "7:5": true, + "11:15": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_2.json index f01a6ff5..5da29662 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_2.json @@ -1 +1,19 @@ -{"8:5":true,"8:1":true,"0:15":true,"15:5":176,"8:6":true,"8:2":[198,200],"8:4":[198,200],"8:3":[198,200]} \ No newline at end of file +{ + "8:5": true, + "8:1": true, + "0:15": true, + "15:5": 176, + "8:6": true, + "8:2": [ + 198, + 200 + ], + "8:4": [ + 198, + 200 + ], + "8:3": [ + 198, + 200 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_4.json index cba2dea8..90cca4a3 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_4.json @@ -1 +1,141 @@ -{"1:1":true,"8:8":true,"7:12":true,"6:10":true,"10:14":true,"7:15":[147,148],"10:12":true,"6:13":147,"3:0":true,"9:15":true,"0:0":true,"8:1":true,"3:6":true,"10:15":true,"7:14":true,"10:10":true,"8:7":true,"5:5":true,"7:13":true,"9:10":true,"5:11":true,"4:5":true,"3:2":true,"6:14":147,"10:13":true,"3:4":true,"8:9":true,"7:10":true,"6:12":true,"3:3":true,"6:15":[147,148],"2:1":true,"4:3":true,"8:13":true,"5:4":true,"7:7":true,"5:3":true,"2:15":142,"9:9":true,"6:1":true,"4:4":true,"8:10":true,"7:9":true,"6:8":true,"3:5":true,"4:2":true,"9:7":true,"5:2":true,"8:12":true,"7:8":true,"6:9":true,"4:6":true,"5:0":true,"5:6":true,"8:15":true,"4:0":true,"6:7":true,"8:14":true,"9:8":true,"7:1":true,"6:0":true,"3:13":143,"5:9":true,"7:2":true,"6:6":true,"4:9":true,"8:5":true,"5:7":true,"3:10":145,"7:4":true,"8:11":true,"4:7":true,"7:3":true,"4:1":true,"3:12":144,"6:4":true,"5:1":true,"3:15":[142,145],"6:3":true,"7:0":true,"2:5":true,"5:8":true,"3:14":142,"6:2":true,"7:6":true,"4:8":true,"4:14":[143,146],"6:5":true,"3:8":true,"5:14":147,"2:2":true,"6:11":true,"1:0":true,"5:12":147,"2:4":true,"4:15":[142,148],"8:6":true,"4:12":[145,146],"3:1":true,"5:15":[147,148],"2:3":true,"5:10":true,"3:7":true,"4:10":[146,147],"8:2":true,"2:0":true,"8:4":true,"5:13":147,"1:2":true,"7:5":true,"3:9":145,"11:15":true,"8:3":true,"7:11":true,"4:13":true} \ No newline at end of file +{ + "1:1": true, + "8:8": true, + "7:12": true, + "6:10": true, + "10:14": true, + "7:15": [ + 147, + 148 + ], + "10:12": true, + "6:13": 147, + "3:0": true, + "9:15": true, + "0:0": true, + "8:1": true, + "3:6": true, + "10:15": true, + "7:14": true, + "10:10": true, + "8:7": true, + "5:5": true, + "7:13": true, + "9:10": true, + "5:11": true, + "4:5": true, + "3:2": true, + "6:14": 147, + "10:13": true, + "3:4": true, + "8:9": true, + "7:10": true, + "6:12": true, + "3:3": true, + "6:15": [ + 147, + 148 + ], + "2:1": true, + "4:3": true, + "8:13": true, + "5:4": true, + "7:7": true, + "5:3": true, + "2:15": 142, + "9:9": true, + "6:1": true, + "4:4": true, + "8:10": true, + "7:9": true, + "6:8": true, + "3:5": true, + "4:2": true, + "9:7": true, + "5:2": true, + "8:12": true, + "7:8": true, + "6:9": true, + "4:6": true, + "5:0": true, + "5:6": true, + "8:15": true, + "4:0": true, + "6:7": true, + "8:14": true, + "9:8": true, + "7:1": true, + "6:0": true, + "3:13": 143, + "5:9": true, + "7:2": true, + "6:6": true, + "4:9": true, + "8:5": true, + "5:7": true, + "3:10": 145, + "7:4": true, + "8:11": true, + "4:7": true, + "7:3": true, + "4:1": true, + "3:12": 144, + "6:4": true, + "5:1": true, + "3:15": [ + 142, + 145 + ], + "6:3": true, + "7:0": true, + "2:5": true, + "5:8": true, + "3:14": 142, + "6:2": true, + "7:6": true, + "4:8": true, + "4:14": [ + 143, + 146 + ], + "6:5": true, + "3:8": true, + "5:14": 147, + "2:2": true, + "6:11": true, + "1:0": true, + "5:12": 147, + "2:4": true, + "4:15": [ + 142, + 148 + ], + "8:6": true, + "4:12": [ + 145, + 146 + ], + "3:1": true, + "5:15": [ + 147, + 148 + ], + "2:3": true, + "5:10": true, + "3:7": true, + "4:10": [ + 146, + 147 + ], + "8:2": true, + "2:0": true, + "8:4": true, + "5:13": 147, + "1:2": true, + "7:5": true, + "3:9": 145, + "11:15": true, + "8:3": true, + "7:11": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_5.json index 46aeccfe..030b4d97 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_5.json @@ -1 +1,178 @@ -{"9:14":true,"1:1":true,"11:5":true,"2:7":true,"8:8":true,"7:12":true,"6:10":true,"12:5":true,"10:14":true,"7:15":true,"10:12":true,"6:13":true,"2:9":true,"9:15":true,"9:12":true,"8:1":147,"3:6":145,"10:15":true,"7:14":true,"10:10":true,"8:7":true,"5:5":147,"4:11":147,"7:13":true,"2:8":true,"9:10":true,"5:11":true,"4:5":[145,146],"6:14":true,"10:13":true,"3:4":143,"8:9":true,"7:10":true,"6:12":true,"6:15":true,"9:13":true,"12:6":true,"4:3":[144,146],"8:13":true,"5:4":147,"2:12":true,"10:9":true,"7:7":true,"5:3":true,"2:15":true,"1:10":true,"9:9":true,"6:1":147,"11:6":true,"4:4":[144,146],"10:7":true,"8:10":true,"7:9":true,"6:8":147,"3:5":144,"4:2":[144,146],"9:7":true,"5:2":147,"2:14":146,"0:5":true,"4:6":146,"12:3":true,"11:4":true,"9:1":true,"8:12":true,"7:8":true,"6:9":true,"2:13":[145,147],"5:0":147,"10:1":true,"5:6":147,"8:15":true,"13:7":true,"12:4":true,"11:3":true,"4:0":[143,146],"2:10":true,"10:8":true,"6:7":147,"11:2":true,"8:14":true,"9:8":true,"7:1":147,"9:3":true,"6:0":147,"10:4":true,"3:13":147,"5:9":147,"10:3":true,"1:5":true,"7:2":147,"6:6":147,"4:9":147,"11:1":true,"9:4":true,"8:5":true,"5:7":147,"3:10":true,"11:8":true,"7:4":147,"13:6":true,"9:2":true,"8:11":true,"4:7":146,"10:2":true,"12:8":true,"7:3":147,"9:6":true,"4:1":[145,146],"6:4":147,"10:0":true,"10:6":true,"5:1":147,"3:15":true,"9:0":true,"6:3":true,"7:0":147,"11:7":true,"5:8":147,"3:14":true,"6:2":147,"7:6":true,"4:8":147,"2:11":true,"4:14":true,"6:5":147,"3:8":true,"5:14":true,"6:11":true,"5:12":true,"8:0":true,"4:15":true,"0:1":true,"8:6":true,"4:12":147,"5:15":true,"13:5":true,"10:5":true,"9:11":true,"5:10":true,"3:7":true,"9:5":true,"4:10":147,"11:14":true,"8:2":true,"11:12":true,"8:4":true,"5:13":true,"7:5":147,"3:9":true,"11:15":true,"8:3":147,"7:11":true,"4:13":true,"2:6":true} \ No newline at end of file +{ + "9:14": true, + "1:1": true, + "11:5": true, + "2:7": true, + "8:8": true, + "7:12": true, + "6:10": true, + "12:5": true, + "10:14": true, + "7:15": true, + "10:12": true, + "6:13": true, + "2:9": true, + "9:15": true, + "9:12": true, + "8:1": 147, + "3:6": 145, + "10:15": true, + "7:14": true, + "10:10": true, + "8:7": true, + "5:5": 147, + "4:11": 147, + "7:13": true, + "2:8": true, + "9:10": true, + "5:11": true, + "4:5": [ + 145, + 146 + ], + "6:14": true, + "10:13": true, + "3:4": 143, + "8:9": true, + "7:10": true, + "6:12": true, + "6:15": true, + "9:13": true, + "12:6": true, + "4:3": [ + 144, + 146 + ], + "8:13": true, + "5:4": 147, + "2:12": true, + "10:9": true, + "7:7": true, + "5:3": true, + "2:15": true, + "1:10": true, + "9:9": true, + "6:1": 147, + "11:6": true, + "4:4": [ + 144, + 146 + ], + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": 147, + "3:5": 144, + "4:2": [ + 144, + 146 + ], + "9:7": true, + "5:2": 147, + "2:14": 146, + "0:5": true, + "4:6": 146, + "12:3": true, + "11:4": true, + "9:1": true, + "8:12": true, + "7:8": true, + "6:9": true, + "2:13": [ + 145, + 147 + ], + "5:0": 147, + "10:1": true, + "5:6": 147, + "8:15": true, + "13:7": true, + "12:4": true, + "11:3": true, + "4:0": [ + 143, + 146 + ], + "2:10": true, + "10:8": true, + "6:7": 147, + "11:2": true, + "8:14": true, + "9:8": true, + "7:1": 147, + "9:3": true, + "6:0": 147, + "10:4": true, + "3:13": 147, + "5:9": 147, + "10:3": true, + "1:5": true, + "7:2": 147, + "6:6": 147, + "4:9": 147, + "11:1": true, + "9:4": true, + "8:5": true, + "5:7": 147, + "3:10": true, + "11:8": true, + "7:4": 147, + "13:6": true, + "9:2": true, + "8:11": true, + "4:7": 146, + "10:2": true, + "12:8": true, + "7:3": 147, + "9:6": true, + "4:1": [ + 145, + 146 + ], + "6:4": 147, + "10:0": true, + "10:6": true, + "5:1": 147, + "3:15": true, + "9:0": true, + "6:3": true, + "7:0": 147, + "11:7": true, + "5:8": 147, + "3:14": true, + "6:2": 147, + "7:6": true, + "4:8": 147, + "2:11": true, + "4:14": true, + "6:5": 147, + "3:8": true, + "5:14": true, + "6:11": true, + "5:12": true, + "8:0": true, + "4:15": true, + "0:1": true, + "8:6": true, + "4:12": 147, + "5:15": true, + "13:5": true, + "10:5": true, + "9:11": true, + "5:10": true, + "3:7": true, + "9:5": true, + "4:10": 147, + "11:14": true, + "8:2": true, + "11:12": true, + "8:4": true, + "5:13": true, + "7:5": 147, + "3:9": true, + "11:15": true, + "8:3": 147, + "7:11": true, + "4:13": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_6.json index 303f3022..9eac7411 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_6.json @@ -1 +1,114 @@ -{"1:1":true,"2:7":true,"6:10":true,"2:9":true,"3:0":true,"8:1":true,"3:6":true,"5:5":true,"4:11":true,"2:8":true,"5:11":true,"4:5":true,"3:2":true,"1:9":true,"13:14":148,"3:4":true,"7:10":true,"6:12":true,"3:3":true,"6:15":true,"2:1":true,"4:3":true,"5:4":true,"2:12":true,"7:7":true,"5:3":true,"6:1":true,"4:4":true,"7:9":true,"6:8":true,"3:5":true,"4:2":true,"3:11":true,"5:2":true,"2:14":148,"9:1":true,"7:8":true,"6:9":true,"4:6":true,"5:0":true,"5:6":true,"4:0":true,"2:10":true,"6:7":true,"7:1":true,"9:3":true,"6:0":true,"3:13":true,"5:9":true,"7:2":true,"6:6":true,"4:9":true,"9:4":true,"8:5":true,"5:7":true,"3:10":true,"7:4":true,"9:2":true,"4:7":true,"7:3":true,"4:1":true,"3:12":true,"6:4":true,"10:0":true,"5:1":true,"3:15":[170,171],"9:0":true,"6:3":true,"7:0":true,"2:5":true,"5:8":true,"3:14":[147,170],"6:2":true,"7:6":true,"4:8":true,"2:11":true,"4:14":true,"6:5":true,"3:8":true,"5:14":true,"2:2":true,"6:11":true,"1:0":true,"5:12":true,"2:4":true,"8:0":true,"4:15":true,"8:6":true,"4:12":true,"3:1":true,"5:15":true,"2:3":true,"5:10":true,"3:7":true,"1:3":true,"8:2":true,"1:4":true,"2:0":true,"8:4":true,"5:13":true,"1:2":true,"7:5":true,"3:9":true,"8:3":true,"4:13":true,"2:6":true} \ No newline at end of file +{ + "1:1": true, + "2:7": true, + "6:10": true, + "2:9": true, + "3:0": true, + "8:1": true, + "3:6": true, + "5:5": true, + "4:11": true, + "2:8": true, + "5:11": true, + "4:5": true, + "3:2": true, + "1:9": true, + "13:14": 148, + "3:4": true, + "7:10": true, + "6:12": true, + "3:3": true, + "6:15": true, + "2:1": true, + "4:3": true, + "5:4": true, + "2:12": true, + "7:7": true, + "5:3": true, + "6:1": true, + "4:4": true, + "7:9": true, + "6:8": true, + "3:5": true, + "4:2": true, + "3:11": true, + "5:2": true, + "2:14": 148, + "9:1": true, + "7:8": true, + "6:9": true, + "4:6": true, + "5:0": true, + "5:6": true, + "4:0": true, + "2:10": true, + "6:7": true, + "7:1": true, + "9:3": true, + "6:0": true, + "3:13": true, + "5:9": true, + "7:2": true, + "6:6": true, + "4:9": true, + "9:4": true, + "8:5": true, + "5:7": true, + "3:10": true, + "7:4": true, + "9:2": true, + "4:7": true, + "7:3": true, + "4:1": true, + "3:12": true, + "6:4": true, + "10:0": true, + "5:1": true, + "3:15": [ + 170, + 171 + ], + "9:0": true, + "6:3": true, + "7:0": true, + "2:5": true, + "5:8": true, + "3:14": [ + 147, + 170 + ], + "6:2": true, + "7:6": true, + "4:8": true, + "2:11": true, + "4:14": true, + "6:5": true, + "3:8": true, + "5:14": true, + "2:2": true, + "6:11": true, + "1:0": true, + "5:12": true, + "2:4": true, + "8:0": true, + "4:15": true, + "8:6": true, + "4:12": true, + "3:1": true, + "5:15": true, + "2:3": true, + "5:10": true, + "3:7": true, + "1:3": true, + "8:2": true, + "1:4": true, + "2:0": true, + "8:4": true, + "5:13": true, + "1:2": true, + "7:5": true, + "3:9": true, + "8:3": true, + "4:13": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_7.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_7.json index 645ca655..81ba0e3a 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_7.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_7.json @@ -1 +1,136 @@ -{"9:14":true,"1:1":148,"8:8":true,"7:12":true,"6:10":true,"13:13":true,"10:14":true,"7:15":true,"10:12":true,"6:13":true,"2:9":true,"3:0":[148,171],"9:15":true,"9:12":true,"3:6":true,"10:15":true,"7:14":true,"13:15":true,"10:10":true,"8:7":true,"5:5":true,"4:11":true,"7:13":true,"2:8":true,"9:10":true,"5:11":true,"4:5":true,"3:2":true,"6:14":true,"1:9":true,"13:14":true,"10:13":true,"8:9":true,"7:10":true,"6:12":true,"3:3":true,"6:15":true,"9:13":true,"2:1":148,"14:14":true,"4:3":true,"8:13":true,"5:4":true,"2:12":true,"7:7":true,"5:3":true,"15:14":true,"9:9":true,"6:1":true,"4:4":true,"8:10":true,"7:9":true,"6:8":true,"3:5":true,"14:15":true,"4:2":true,"15:15":true,"9:7":true,"3:11":true,"5:2":true,"8:12":true,"7:8":true,"6:9":true,"4:6":true,"2:13":true,"5:0":true,"5:6":true,"8:15":true,"4:0":true,"15:13":true,"2:10":true,"6:7":true,"8:14":true,"9:8":true,"14:13":true,"6:0":true,"3:13":true,"5:9":true,"6:6":true,"4:9":true,"5:7":true,"3:10":true,"7:4":true,"8:11":true,"4:7":true,"7:3":true,"4:1":true,"3:12":true,"6:4":true,"5:1":true,"6:3":true,"2:5":true,"5:8":true,"3:14":true,"6:2":true,"7:6":true,"4:8":true,"2:11":true,"4:14":true,"6:5":true,"3:8":true,"5:14":true,"2:2":148,"6:11":true,"11:13":true,"5:12":true,"4:15":true,"8:6":true,"4:12":true,"3:1":true,"12:13":true,"5:15":true,"2:3":true,"12:14":true,"9:11":true,"5:10":true,"3:7":true,"1:3":148,"10:11":true,"4:10":true,"11:14":true,"2:0":148,"11:12":true,"5:13":true,"1:2":148,"7:5":true,"3:9":true,"11:15":true,"7:11":true,"4:13":true,"2:6":true} \ No newline at end of file +{ + "9:14": true, + "1:1": 148, + "8:8": true, + "7:12": true, + "6:10": true, + "13:13": true, + "10:14": true, + "7:15": true, + "10:12": true, + "6:13": true, + "2:9": true, + "3:0": [ + 148, + 171 + ], + "9:15": true, + "9:12": true, + "3:6": true, + "10:15": true, + "7:14": true, + "13:15": true, + "10:10": true, + "8:7": true, + "5:5": true, + "4:11": true, + "7:13": true, + "2:8": true, + "9:10": true, + "5:11": true, + "4:5": true, + "3:2": true, + "6:14": true, + "1:9": true, + "13:14": true, + "10:13": true, + "8:9": true, + "7:10": true, + "6:12": true, + "3:3": true, + "6:15": true, + "9:13": true, + "2:1": 148, + "14:14": true, + "4:3": true, + "8:13": true, + "5:4": true, + "2:12": true, + "7:7": true, + "5:3": true, + "15:14": true, + "9:9": true, + "6:1": true, + "4:4": true, + "8:10": true, + "7:9": true, + "6:8": true, + "3:5": true, + "14:15": true, + "4:2": true, + "15:15": true, + "9:7": true, + "3:11": true, + "5:2": true, + "8:12": true, + "7:8": true, + "6:9": true, + "4:6": true, + "2:13": true, + "5:0": true, + "5:6": true, + "8:15": true, + "4:0": true, + "15:13": true, + "2:10": true, + "6:7": true, + "8:14": true, + "9:8": true, + "14:13": true, + "6:0": true, + "3:13": true, + "5:9": true, + "6:6": true, + "4:9": true, + "5:7": true, + "3:10": true, + "7:4": true, + "8:11": true, + "4:7": true, + "7:3": true, + "4:1": true, + "3:12": true, + "6:4": true, + "5:1": true, + "6:3": true, + "2:5": true, + "5:8": true, + "3:14": true, + "6:2": true, + "7:6": true, + "4:8": true, + "2:11": true, + "4:14": true, + "6:5": true, + "3:8": true, + "5:14": true, + "2:2": 148, + "6:11": true, + "11:13": true, + "5:12": true, + "4:15": true, + "8:6": true, + "4:12": true, + "3:1": true, + "12:13": true, + "5:15": true, + "2:3": true, + "12:14": true, + "9:11": true, + "5:10": true, + "3:7": true, + "1:3": 148, + "10:11": true, + "4:10": true, + "11:14": true, + "2:0": 148, + "11:12": true, + "5:13": true, + "1:2": 148, + "7:5": true, + "3:9": true, + "11:15": true, + "7:11": true, + "4:13": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_8.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_8.json index c412285b..741c9bfe 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_8.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_8.json @@ -1 +1,262 @@ -{"6:10":true,"13:15":true,"14:1":true,"10:10":true,"8:7":true,"4:11":true,"9:10":true,"5:11":true,"13:12":[131,172],"15:1":true,"8:9":true,"7:10":true,"2:12":true,"10:9":true,"7:7":true,"2:15":[138,152],"15:14":true,"10:7":true,"8:10":true,"7:9":true,"6:8":true,"14:15":true,"13:1":true,"0:11":true,"15:15":[131,149],"14:12":true,"9:7":true,"3:11":true,"2:14":[138,150],"1:13":[138,151],"2:13":[138,150],"1:14":[138,150],"5:0":true,"5:6":true,"4:0":true,"15:13":true,"1:15":[138,152],"10:8":true,"6:7":true,"1:12":true,"9:8":true,"1:11":true,"3:13":true,"11:8":true,"13:6":true,"13:0":true,"12:8":true,"14:11":true,"13:2":[134,168],"3:12":true,"0:15":[138,152],"11:9":true,"14:5":[133,135],"5:1":true,"3:15":[138,150],"0:12":true,"15:11":true,"12:9":true,"13:3":true,"11:7":true,"0:14":151,"13:4":true,"12:7":true,"3:14":[137,149],"2:11":true,"4:14":true,"11:10":true,"12:10":true,"5:14":true,"15:3":169,"14:4":[133,134],"5:12":true,"14:2":true,"13:11":133,"4:15":[137,173],"15:2":true,"4:12":true,"13:5":true,"5:15":[137,173],"15:0":true,"14:6":true,"15:6":true,"14:0":true,"5:13":true,"4:13":true,"15:9":true,"12:11":133,"9:14":[133,173],"11:5":true,"7:12":true,"12:5":true,"10:14":[168,173],"7:15":[136,173],"14:9":133,"11:11":true,"10:12":true,"6:13":true,"2:9":true,"15:7":true,"9:15":true,"14:7":true,"9:12":true,"8:1":true,"10:15":true,"13:10":true,"7:14":true,"7:13":true,"6:14":true,"15:8":true,"10:13":true,"6:15":[137,173],"14:8":true,"9:13":true,"11:0":true,"12:6":true,"8:13":true,"1:10":true,"13:8":true,"12:0":true,"6:1":true,"11:6":true,"12:3":true,"11:4":true,"9:1":true,"8:12":true,"15:10":133,"14:10":133,"10:1":true,"13:7":true,"12:4":true,"11:3":true,"8:15":true,"12:2":[136,139],"2:10":true,"11:2":true,"8:14":[135,170],"13:9":true,"7:1":true,"12:1":true,"9:3":true,"6:0":true,"10:4":true,"5:9":true,"10:3":true,"7:2":true,"6:6":true,"4:9":true,"11:1":[136,167],"9:4":true,"8:5":true,"5:7":true,"3:10":true,"7:4":true,"9:2":true,"8:11":true,"10:2":true,"0:10":true,"7:3":true,"9:6":true,"6:4":true,"10:0":true,"10:6":true,"9:0":true,"6:3":true,"7:0":true,"5:8":true,"6:2":true,"7:6":true,"4:8":true,"6:5":true,"11:13":[132,174],"8:0":true,"8:6":true,"10:5":true,"9:11":true,"5:10":true,"10:11":true,"9:5":true,"4:10":true,"8:2":true,"12:15":true,"11:12":true,"8:4":true,"7:5":true,"3:9":true,"12:12":132,"8:3":true,"7:11":true} \ No newline at end of file +{ + "6:10": true, + "13:15": true, + "14:1": true, + "10:10": true, + "8:7": true, + "4:11": true, + "9:10": true, + "5:11": true, + "13:12": [ + 131, + 172 + ], + "15:1": true, + "8:9": true, + "7:10": true, + "2:12": true, + "10:9": true, + "7:7": true, + "2:15": [ + 138, + 152 + ], + "15:14": true, + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": true, + "14:15": true, + "13:1": true, + "0:11": true, + "15:15": [ + 131, + 149 + ], + "14:12": true, + "9:7": true, + "3:11": true, + "2:14": [ + 138, + 150 + ], + "1:13": [ + 138, + 151 + ], + "2:13": [ + 138, + 150 + ], + "1:14": [ + 138, + 150 + ], + "5:0": true, + "5:6": true, + "4:0": true, + "15:13": true, + "1:15": [ + 138, + 152 + ], + "10:8": true, + "6:7": true, + "1:12": true, + "9:8": true, + "1:11": true, + "3:13": true, + "11:8": true, + "13:6": true, + "13:0": true, + "12:8": true, + "14:11": true, + "13:2": [ + 134, + 168 + ], + "3:12": true, + "0:15": [ + 138, + 152 + ], + "11:9": true, + "14:5": [ + 133, + 135 + ], + "5:1": true, + "3:15": [ + 138, + 150 + ], + "0:12": true, + "15:11": true, + "12:9": true, + "13:3": true, + "11:7": true, + "0:14": 151, + "13:4": true, + "12:7": true, + "3:14": [ + 137, + 149 + ], + "2:11": true, + "4:14": true, + "11:10": true, + "12:10": true, + "5:14": true, + "15:3": 169, + "14:4": [ + 133, + 134 + ], + "5:12": true, + "14:2": true, + "13:11": 133, + "4:15": [ + 137, + 173 + ], + "15:2": true, + "4:12": true, + "13:5": true, + "5:15": [ + 137, + 173 + ], + "15:0": true, + "14:6": true, + "15:6": true, + "14:0": true, + "5:13": true, + "4:13": true, + "15:9": true, + "12:11": 133, + "9:14": [ + 133, + 173 + ], + "11:5": true, + "7:12": true, + "12:5": true, + "10:14": [ + 168, + 173 + ], + "7:15": [ + 136, + 173 + ], + "14:9": 133, + "11:11": true, + "10:12": true, + "6:13": true, + "2:9": true, + "15:7": true, + "9:15": true, + "14:7": true, + "9:12": true, + "8:1": true, + "10:15": true, + "13:10": true, + "7:14": true, + "7:13": true, + "6:14": true, + "15:8": true, + "10:13": true, + "6:15": [ + 137, + 173 + ], + "14:8": true, + "9:13": true, + "11:0": true, + "12:6": true, + "8:13": true, + "1:10": true, + "13:8": true, + "12:0": true, + "6:1": true, + "11:6": true, + "12:3": true, + "11:4": true, + "9:1": true, + "8:12": true, + "15:10": 133, + "14:10": 133, + "10:1": true, + "13:7": true, + "12:4": true, + "11:3": true, + "8:15": true, + "12:2": [ + 136, + 139 + ], + "2:10": true, + "11:2": true, + "8:14": [ + 135, + 170 + ], + "13:9": true, + "7:1": true, + "12:1": true, + "9:3": true, + "6:0": true, + "10:4": true, + "5:9": true, + "10:3": true, + "7:2": true, + "6:6": true, + "4:9": true, + "11:1": [ + 136, + 167 + ], + "9:4": true, + "8:5": true, + "5:7": true, + "3:10": true, + "7:4": true, + "9:2": true, + "8:11": true, + "10:2": true, + "0:10": true, + "7:3": true, + "9:6": true, + "6:4": true, + "10:0": true, + "10:6": true, + "9:0": true, + "6:3": true, + "7:0": true, + "5:8": true, + "6:2": true, + "7:6": true, + "4:8": true, + "6:5": true, + "11:13": [ + 132, + 174 + ], + "8:0": true, + "8:6": true, + "10:5": true, + "9:11": true, + "5:10": true, + "10:11": true, + "9:5": true, + "4:10": true, + "8:2": true, + "12:15": true, + "11:12": true, + "8:4": true, + "7:5": true, + "3:9": true, + "12:12": 132, + "8:3": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_9.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_9.json index e0ccf216..7d316b72 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-6_9.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-6_9.json @@ -1 +1,256 @@ -{"1:1":138,"8:8":true,"6:10":true,"13:13":true,"0:6":true,"3:6":true,"14:1":true,"13:15":true,"10:10":true,"8:7":true,"5:5":true,"4:11":true,"0:2":[138,181],"9:10":true,"5:11":true,"4:5":true,"13:12":true,"3:2":true,"15:1":true,"13:14":true,"3:4":true,"0:3":true,"8:9":true,"7:10":true,"3:3":true,"0:4":true,"2:1":138,"14:14":true,"4:3":true,"5:4":true,"2:12":true,"10:9":true,"7:7":true,"5:3":true,"2:15":true,"15:14":true,"9:9":true,"4:4":true,"10:7":true,"8:10":true,"7:9":true,"6:8":true,"3:5":true,"15:12":true,"14:15":true,"13:1":true,"4:2":true,"15:15":true,"14:12":true,"9:7":true,"3:11":true,"5:2":true,"0:5":true,"4:6":true,"7:8":true,"6:9":true,"2:13":true,"5:0":[138,173],"5:6":true,"4:0":149,"15:13":true,"1:15":true,"10:8":true,"6:7":true,"1:12":true,"9:8":true,"14:13":true,"1:11":true,"3:13":true,"1:5":true,"11:8":true,"13:6":true,"12:8":true,"14:11":true,"13:2":true,"4:1":true,"3:12":true,"0:15":true,"11:9":true,"15:5":true,"14:5":true,"5:1":true,"15:11":true,"12:9":true,"13:3":true,"11:7":true,"2:5":true,"0:14":true,"13:4":true,"12:7":true,"2:11":true,"15:4":true,"14:3":true,"4:14":true,"1:6":true,"11:10":true,"12:10":true,"5:14":true,"2:2":[138,183],"15:3":true,"1:0":138,"14:4":true,"5:12":true,"2:4":true,"14:2":true,"13:11":true,"4:15":true,"0:1":138,"15:2":true,"4:12":true,"3:1":[138,173],"13:5":true,"5:15":true,"2:3":true,"15:0":true,"14:6":true,"1:3":true,"1:4":true,"15:6":true,"14:0":true,"2:0":138,"5:13":true,"1:2":[138,182],"4:13":true,"2:6":true,"15:9":true,"12:11":true,"9:14":true,"11:5":true,"2:7":true,"7:12":true,"12:5":true,"10:14":true,"14:9":true,"11:11":true,"10:12":true,"6:13":true,"2:9":true,"15:7":true,"9:15":true,"14:7":true,"9:12":true,"8:1":true,"13:10":true,"10:15":true,"1:8":true,"2:8":true,"6:14":true,"1:9":true,"15:8":true,"10:13":true,"6:12":true,"1:7":true,"6:15":true,"14:8":true,"9:13":true,"12:6":true,"8:13":[132,148],"1:10":true,"13:8":true,"6:1":true,"11:6":true,"12:3":true,"11:4":true,"9:1":true,"8:12":true,"15:10":true,"14:10":true,"13:7":true,"12:4":true,"11:3":true,"8:15":true,"12:2":true,"2:10":true,"11:2":true,"8:14":true,"13:9":true,"7:1":true,"12:1":true,"9:3":true,"6:0":true,"10:4":true,"5:9":true,"10:3":true,"7:2":true,"6:6":true,"4:9":true,"11:1":true,"9:4":true,"8:5":true,"5:7":true,"3:10":true,"7:4":true,"9:2":true,"8:11":true,"4:7":true,"10:2":true,"0:10":true,"7:3":true,"9:6":true,"6:4":true,"10:6":true,"9:0":true,"6:3":true,"7:0":true,"5:8":true,"6:2":true,"7:6":true,"4:8":true,"6:5":true,"3:8":true,"0:8":true,"6:11":true,"11:13":true,"8:0":true,"8:6":true,"12:13":true,"10:5":true,"9:11":true,"5:10":true,"3:7":true,"10:11":true,"9:5":true,"4:10":true,"8:2":true,"0:7":true,"12:15":true,"11:12":true,"8:4":true,"7:5":true,"3:9":true,"12:12":true,"11:15":true,"8:3":true,"0:9":true,"7:11":true} \ No newline at end of file +{ + "1:1": 138, + "8:8": true, + "6:10": true, + "13:13": true, + "0:6": true, + "3:6": true, + "14:1": true, + "13:15": true, + "10:10": true, + "8:7": true, + "5:5": true, + "4:11": true, + "0:2": [ + 138, + 181 + ], + "9:10": true, + "5:11": true, + "4:5": true, + "13:12": true, + "3:2": true, + "15:1": true, + "13:14": true, + "3:4": true, + "0:3": true, + "8:9": true, + "7:10": true, + "3:3": true, + "0:4": true, + "2:1": 138, + "14:14": true, + "4:3": true, + "5:4": true, + "2:12": true, + "10:9": true, + "7:7": true, + "5:3": true, + "2:15": true, + "15:14": true, + "9:9": true, + "4:4": true, + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": true, + "3:5": true, + "15:12": true, + "14:15": true, + "13:1": true, + "4:2": true, + "15:15": true, + "14:12": true, + "9:7": true, + "3:11": true, + "5:2": true, + "0:5": true, + "4:6": true, + "7:8": true, + "6:9": true, + "2:13": true, + "5:0": [ + 138, + 173 + ], + "5:6": true, + "4:0": 149, + "15:13": true, + "1:15": true, + "10:8": true, + "6:7": true, + "1:12": true, + "9:8": true, + "14:13": true, + "1:11": true, + "3:13": true, + "1:5": true, + "11:8": true, + "13:6": true, + "12:8": true, + "14:11": true, + "13:2": true, + "4:1": true, + "3:12": true, + "0:15": true, + "11:9": true, + "15:5": true, + "14:5": true, + "5:1": true, + "15:11": true, + "12:9": true, + "13:3": true, + "11:7": true, + "2:5": true, + "0:14": true, + "13:4": true, + "12:7": true, + "2:11": true, + "15:4": true, + "14:3": true, + "4:14": true, + "1:6": true, + "11:10": true, + "12:10": true, + "5:14": true, + "2:2": [ + 138, + 183 + ], + "15:3": true, + "1:0": 138, + "14:4": true, + "5:12": true, + "2:4": true, + "14:2": true, + "13:11": true, + "4:15": true, + "0:1": 138, + "15:2": true, + "4:12": true, + "3:1": [ + 138, + 173 + ], + "13:5": true, + "5:15": true, + "2:3": true, + "15:0": true, + "14:6": true, + "1:3": true, + "1:4": true, + "15:6": true, + "14:0": true, + "2:0": 138, + "5:13": true, + "1:2": [ + 138, + 182 + ], + "4:13": true, + "2:6": true, + "15:9": true, + "12:11": true, + "9:14": true, + "11:5": true, + "2:7": true, + "7:12": true, + "12:5": true, + "10:14": true, + "14:9": true, + "11:11": true, + "10:12": true, + "6:13": true, + "2:9": true, + "15:7": true, + "9:15": true, + "14:7": true, + "9:12": true, + "8:1": true, + "13:10": true, + "10:15": true, + "1:8": true, + "2:8": true, + "6:14": true, + "1:9": true, + "15:8": true, + "10:13": true, + "6:12": true, + "1:7": true, + "6:15": true, + "14:8": true, + "9:13": true, + "12:6": true, + "8:13": [ + 132, + 148 + ], + "1:10": true, + "13:8": true, + "6:1": true, + "11:6": true, + "12:3": true, + "11:4": true, + "9:1": true, + "8:12": true, + "15:10": true, + "14:10": true, + "13:7": true, + "12:4": true, + "11:3": true, + "8:15": true, + "12:2": true, + "2:10": true, + "11:2": true, + "8:14": true, + "13:9": true, + "7:1": true, + "12:1": true, + "9:3": true, + "6:0": true, + "10:4": true, + "5:9": true, + "10:3": true, + "7:2": true, + "6:6": true, + "4:9": true, + "11:1": true, + "9:4": true, + "8:5": true, + "5:7": true, + "3:10": true, + "7:4": true, + "9:2": true, + "8:11": true, + "4:7": true, + "10:2": true, + "0:10": true, + "7:3": true, + "9:6": true, + "6:4": true, + "10:6": true, + "9:0": true, + "6:3": true, + "7:0": true, + "5:8": true, + "6:2": true, + "7:6": true, + "4:8": true, + "6:5": true, + "3:8": true, + "0:8": true, + "6:11": true, + "11:13": true, + "8:0": true, + "8:6": true, + "12:13": true, + "10:5": true, + "9:11": true, + "5:10": true, + "3:7": true, + "10:11": true, + "9:5": true, + "4:10": true, + "8:2": true, + "0:7": true, + "12:15": true, + "11:12": true, + "8:4": true, + "7:5": true, + "3:9": true, + "12:12": true, + "11:15": true, + "8:3": true, + "0:9": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-1.json index 6b55f55d..fe8dced2 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-1.json @@ -1 +1,139 @@ -{"12:11":true,"11:5":171,"8:8":true,"12:5":[171,175],"7:15":true,"6:13":true,"9:15":true,"14:7":true,"8:1":true,"13:10":true,"10:15":true,"10:10":true,"8:7":true,"0:2":true,"9:10":true,"13:14":true,"8:9":true,"6:15":true,"14:8":224,"11:0":171,"14:14":true,"12:6":171,"10:9":true,"7:7":true,"13:8":true,"15:14":true,"12:0":true,"9:9":true,"6:1":true,"11:6":171,"10:7":true,"8:10":true,"7:9":true,"6:8":true,"15:12":[216,222],"0:11":[152,153],"15:15":true,"9:7":true,"12:3":[171,175],"11:4":171,"9:1":171,"7:8":true,"6:9":true,"15:10":[216,222],"14:10":[216,222],"10:1":171,"13:7":true,"12:4":171,"11:3":171,"8:15":true,"15:13":true,"12:2":171,"10:8":true,"6:7":true,"11:2":171,"9:8":true,"7:1":171,"12:1":[171,175],"9:3":171,"6:0":171,"10:4":true,"10:3":171,"7:2":true,"6:6":true,"11:1":171,"9:4":171,"8:5":true,"11:8":true,"7:4":true,"9:2":true,"10:2":171,"12:8":true,"7:3":true,"9:6":true,"11:9":true,"6:4":true,"10:0":171,"10:6":171,"0:12":true,"15:11":[216,222],"12:9":true,"9:0":171,"6:3":true,"7:0":171,"11:7":171,"12:7":[171,223],"6:2":true,"7:6":true,"15:4":true,"11:10":true,"6:5":true,"12:10":true,"6:11":true,"14:4":true,"8:0":true,"0:1":true,"8:6":true,"12:13":true,"14:6":true,"12:14":true,"10:5":171,"9:5":171,"11:14":true,"8:2":171,"12:15":true,"8:4":true,"1:2":true,"7:5":true,"11:15":true,"8:3":true} \ No newline at end of file +{ + "12:11": true, + "11:5": 171, + "8:8": true, + "12:5": [ + 171, + 175 + ], + "7:15": true, + "6:13": true, + "9:15": true, + "14:7": true, + "8:1": true, + "13:10": true, + "10:15": true, + "10:10": true, + "8:7": true, + "0:2": true, + "9:10": true, + "13:14": true, + "8:9": true, + "6:15": true, + "14:8": 224, + "11:0": 171, + "14:14": true, + "12:6": 171, + "10:9": true, + "7:7": true, + "13:8": true, + "15:14": true, + "12:0": true, + "9:9": true, + "6:1": true, + "11:6": 171, + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": true, + "15:12": [ + 216, + 222 + ], + "0:11": [ + 152, + 153 + ], + "15:15": true, + "9:7": true, + "12:3": [ + 171, + 175 + ], + "11:4": 171, + "9:1": 171, + "7:8": true, + "6:9": true, + "15:10": [ + 216, + 222 + ], + "14:10": [ + 216, + 222 + ], + "10:1": 171, + "13:7": true, + "12:4": 171, + "11:3": 171, + "8:15": true, + "15:13": true, + "12:2": 171, + "10:8": true, + "6:7": true, + "11:2": 171, + "9:8": true, + "7:1": 171, + "12:1": [ + 171, + 175 + ], + "9:3": 171, + "6:0": 171, + "10:4": true, + "10:3": 171, + "7:2": true, + "6:6": true, + "11:1": 171, + "9:4": 171, + "8:5": true, + "11:8": true, + "7:4": true, + "9:2": true, + "10:2": 171, + "12:8": true, + "7:3": true, + "9:6": true, + "11:9": true, + "6:4": true, + "10:0": 171, + "10:6": 171, + "0:12": true, + "15:11": [ + 216, + 222 + ], + "12:9": true, + "9:0": 171, + "6:3": true, + "7:0": 171, + "11:7": 171, + "12:7": [ + 171, + 223 + ], + "6:2": true, + "7:6": true, + "15:4": true, + "11:10": true, + "6:5": true, + "12:10": true, + "6:11": true, + "14:4": true, + "8:0": true, + "0:1": true, + "8:6": true, + "12:13": true, + "14:6": true, + "12:14": true, + "10:5": 171, + "9:5": 171, + "11:14": true, + "8:2": 171, + "12:15": true, + "8:4": true, + "1:2": true, + "7:5": true, + "11:15": true, + "8:3": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-2.json index a1729354..0c07f450 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-2.json @@ -1 +1,149 @@ -{"12:11":[171,175],"9:14":true,"11:5":true,"8:8":171,"7:12":171,"6:10":171,"12:5":true,"10:14":true,"7:15":true,"11:11":171,"10:12":true,"6:13":true,"9:15":171,"9:12":true,"8:1":true,"10:15":171,"7:14":true,"10:10":171,"8:7":171,"7:13":171,"9:10":171,"6:14":true,"10:13":true,"8:9":171,"7:10":171,"6:12":171,"6:15":[171,175],"9:13":true,"11:0":true,"12:6":true,"8:13":171,"10:9":171,"7:7":171,"12:0":true,"9:9":171,"6:1":[169,175],"11:6":true,"10:7":171,"8:10":171,"7:9":171,"6:8":171,"9:7":171,"12:3":true,"11:4":true,"9:1":true,"8:12":171,"7:8":171,"6:9":[171,175],"14:10":true,"10:1":true,"12:4":true,"11:3":true,"8:15":171,"12:2":true,"10:8":171,"6:7":[171,175],"11:2":true,"8:14":171,"9:8":171,"7:1":169,"12:1":true,"9:3":true,"6:0":168,"10:4":true,"10:3":true,"7:2":170,"6:6":171,"11:1":true,"9:4":171,"8:5":171,"11:8":171,"7:4":171,"9:2":true,"8:11":171,"10:2":true,"12:8":true,"7:3":171,"9:6":171,"11:9":171,"6:4":171,"10:0":true,"10:6":171,"15:11":true,"12:9":[171,175],"9:0":true,"6:3":[171,175],"7:0":true,"11:7":true,"12:7":true,"6:2":170,"7:6":171,"11:10":171,"6:5":[171,175],"12:10":171,"6:11":[171,175],"11:13":true,"8:0":true,"8:6":171,"12:13":[171,175],"12:14":171,"10:5":true,"9:11":171,"10:11":171,"9:5":171,"11:14":true,"8:2":170,"12:15":[171,175],"11:12":171,"8:4":171,"7:5":171,"12:12":171,"11:15":true,"8:3":171,"7:11":171} \ No newline at end of file +{ + "12:11": [ + 171, + 175 + ], + "9:14": true, + "11:5": true, + "8:8": 171, + "7:12": 171, + "6:10": 171, + "12:5": true, + "10:14": true, + "7:15": true, + "11:11": 171, + "10:12": true, + "6:13": true, + "9:15": 171, + "9:12": true, + "8:1": true, + "10:15": 171, + "7:14": true, + "10:10": 171, + "8:7": 171, + "7:13": 171, + "9:10": 171, + "6:14": true, + "10:13": true, + "8:9": 171, + "7:10": 171, + "6:12": 171, + "6:15": [ + 171, + 175 + ], + "9:13": true, + "11:0": true, + "12:6": true, + "8:13": 171, + "10:9": 171, + "7:7": 171, + "12:0": true, + "9:9": 171, + "6:1": [ + 169, + 175 + ], + "11:6": true, + "10:7": 171, + "8:10": 171, + "7:9": 171, + "6:8": 171, + "9:7": 171, + "12:3": true, + "11:4": true, + "9:1": true, + "8:12": 171, + "7:8": 171, + "6:9": [ + 171, + 175 + ], + "14:10": true, + "10:1": true, + "12:4": true, + "11:3": true, + "8:15": 171, + "12:2": true, + "10:8": 171, + "6:7": [ + 171, + 175 + ], + "11:2": true, + "8:14": 171, + "9:8": 171, + "7:1": 169, + "12:1": true, + "9:3": true, + "6:0": 168, + "10:4": true, + "10:3": true, + "7:2": 170, + "6:6": 171, + "11:1": true, + "9:4": 171, + "8:5": 171, + "11:8": 171, + "7:4": 171, + "9:2": true, + "8:11": 171, + "10:2": true, + "12:8": true, + "7:3": 171, + "9:6": 171, + "11:9": 171, + "6:4": 171, + "10:0": true, + "10:6": 171, + "15:11": true, + "12:9": [ + 171, + 175 + ], + "9:0": true, + "6:3": [ + 171, + 175 + ], + "7:0": true, + "11:7": true, + "12:7": true, + "6:2": 170, + "7:6": 171, + "11:10": 171, + "6:5": [ + 171, + 175 + ], + "12:10": 171, + "6:11": [ + 171, + 175 + ], + "11:13": true, + "8:0": true, + "8:6": 171, + "12:13": [ + 171, + 175 + ], + "12:14": 171, + "10:5": true, + "9:11": 171, + "10:11": 171, + "9:5": 171, + "11:14": true, + "8:2": 170, + "12:15": [ + 171, + 175 + ], + "11:12": 171, + "8:4": 171, + "7:5": 171, + "12:12": 171, + "11:15": true, + "8:3": 171, + "7:11": 171 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-3.json index c16c3f4a..9505661b 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-3.json @@ -1 +1,71 @@ -{"15:9":true,"12:11":true,"5:9":true,"0:13":195,"7:15":true,"4:9":true,"3:10":[192,193],"6:13":true,"2:9":true,"9:15":true,"14:7":true,"10:15":true,"11:9":true,"15:5":true,"3:15":true,"3:2":true,"15:1":true,"12:9":true,"0:14":195,"5:8":true,"6:15":[168,175],"14:8":true,"4:8":true,"2:11":true,"2:1":true,"15:4":true,"4:14":true,"2:12":[190,194],"3:8":true,"5:14":true,"2:2":true,"13:8":true,"9:9":true,"6:11":true,"7:9":true,"15:2":true,"3:1":true,"3:11":[190,192],"12:13":true,"1:13":[194,195],"12:14":true,"6:9":true,"4:10":true,"8:15":true,"12:15":true,"5:13":true,"2:10":159,"3:9":true,"11:15":true,"1:12":[192,193],"13:9":true} \ No newline at end of file +{ + "15:9": true, + "12:11": true, + "5:9": true, + "0:13": 195, + "7:15": true, + "4:9": true, + "3:10": [ + 192, + 193 + ], + "6:13": true, + "2:9": true, + "9:15": true, + "14:7": true, + "10:15": true, + "11:9": true, + "15:5": true, + "3:15": true, + "3:2": true, + "15:1": true, + "12:9": true, + "0:14": 195, + "5:8": true, + "6:15": [ + 168, + 175 + ], + "14:8": true, + "4:8": true, + "2:11": true, + "2:1": true, + "15:4": true, + "4:14": true, + "2:12": [ + 190, + 194 + ], + "3:8": true, + "5:14": true, + "2:2": true, + "13:8": true, + "9:9": true, + "6:11": true, + "7:9": true, + "15:2": true, + "3:1": true, + "3:11": [ + 190, + 192 + ], + "12:13": true, + "1:13": [ + 194, + 195 + ], + "12:14": true, + "6:9": true, + "4:10": true, + "8:15": true, + "12:15": true, + "5:13": true, + "2:10": 159, + "3:9": true, + "11:15": true, + "1:12": [ + 192, + 193 + ], + "13:9": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-4.json index 87e54c02..28e49cd7 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-4.json @@ -1 +1,61 @@ -{"15:9":true,"9:14":true,"1:11":true,"3:13":true,"2:7":true,"7:12":true,"4:9":true,"3:10":true,"2:9":true,"13:0":true,"10:15":true,"3:12":true,"6:4":true,"15:5":true,"5:1":164,"15:11":true,"15:1":true,"6:3":true,"1:9":true,"15:8":true,"0:14":203,"13:4":true,"3:14":[177,201],"6:2":true,"2:11":true,"15:4":true,"1:6":true,"8:13":true,"2:12":true,"3:8":true,"5:3":true,"1:10":true,"15:14":true,"15:3":true,"6:11":true,"14:4":true,"3:5":true,"15:12":true,"15:2":true,"3:11":true,"5:2":164,"2:14":202,"1:13":true,"0:5":true,"15:0":true,"5:10":true,"2:13":true,"15:10":true,"12:4":true,"14:0":true,"15:13":true,"5:13":199,"2:10":true,"3:9":true,"1:12":true,"4:13":200} \ No newline at end of file +{ + "15:9": true, + "9:14": true, + "1:11": true, + "3:13": true, + "2:7": true, + "7:12": true, + "4:9": true, + "3:10": true, + "2:9": true, + "13:0": true, + "10:15": true, + "3:12": true, + "6:4": true, + "15:5": true, + "5:1": 164, + "15:11": true, + "15:1": true, + "6:3": true, + "1:9": true, + "15:8": true, + "0:14": 203, + "13:4": true, + "3:14": [ + 177, + 201 + ], + "6:2": true, + "2:11": true, + "15:4": true, + "1:6": true, + "8:13": true, + "2:12": true, + "3:8": true, + "5:3": true, + "1:10": true, + "15:14": true, + "15:3": true, + "6:11": true, + "14:4": true, + "3:5": true, + "15:12": true, + "15:2": true, + "3:11": true, + "5:2": 164, + "2:14": 202, + "1:13": true, + "0:5": true, + "15:0": true, + "5:10": true, + "2:13": true, + "15:10": true, + "12:4": true, + "14:0": true, + "15:13": true, + "5:13": 199, + "2:10": true, + "3:9": true, + "1:12": true, + "4:13": 200 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-5.json index 38a94887..01f4756c 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-5.json @@ -1 +1,72 @@ -{"15:9":177,"1:1":true,"2:7":true,"13:13":true,"11:11":199,"15:7":true,"3:0":true,"0:0":true,"14:7":[208,212],"3:6":177,"13:10":171,"1:8":177,"2:8":177,"13:12":true,"3:2":true,"15:1":true,"15:8":177,"3:3":true,"1:7":true,"2:1":true,"15:14":true,"10:7":[167,169],"7:9":[206,207],"15:12":true,"15:15":true,"14:12":true,"9:7":true,"15:10":177,"13:7":208,"15:13":true,"10:8":170,"14:13":true,"11:8":[170,208],"12:8":[207,209],"14:11":163,"15:11":[171,177],"3:8":true,"2:2":true,"15:3":177,"1:0":true,"8:0":true,"13:11":163,"15:2":true,"3:1":true,"15:0":177,"3:7":true,"15:6":[177,210],"2:0":true,"12:12":true} \ No newline at end of file +{ + "15:9": 177, + "1:1": true, + "2:7": true, + "13:13": true, + "11:11": 199, + "15:7": true, + "3:0": true, + "0:0": true, + "14:7": [ + 208, + 212 + ], + "3:6": 177, + "13:10": 171, + "1:8": 177, + "2:8": 177, + "13:12": true, + "3:2": true, + "15:1": true, + "15:8": 177, + "3:3": true, + "1:7": true, + "2:1": true, + "15:14": true, + "10:7": [ + 167, + 169 + ], + "7:9": [ + 206, + 207 + ], + "15:12": true, + "15:15": true, + "14:12": true, + "9:7": true, + "15:10": 177, + "13:7": 208, + "15:13": true, + "10:8": 170, + "14:13": true, + "11:8": [ + 170, + 208 + ], + "12:8": [ + 207, + 209 + ], + "14:11": 163, + "15:11": [ + 171, + 177 + ], + "3:8": true, + "2:2": true, + "15:3": 177, + "1:0": true, + "8:0": true, + "13:11": 163, + "15:2": true, + "3:1": true, + "15:0": 177, + "3:7": true, + "15:6": [ + 177, + 210 + ], + "2:0": true, + "12:12": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-6.json index 19ba134e..06cf2b55 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_-6.json @@ -1 +1,36 @@ -{"15:9":true,"3:13":true,"2:7":true,"1:5":true,"3:10":true,"2:9":177,"15:7":true,"3:6":true,"1:8":true,"2:8":true,"15:5":true,"3:15":true,"1:9":true,"15:8":true,"3:4":true,"2:5":true,"3:14":true,"1:7":true,"15:4":true,"1:6":true,"3:8":true,"2:15":true,"15:14":true,"3:5":true,"15:15":true,"2:14":true,"3:7":true,"1:14":true,"15:10":true,"15:6":true,"15:13":true,"1:15":true,"3:9":true,"2:6":true} \ No newline at end of file +{ + "15:9": true, + "3:13": true, + "2:7": true, + "1:5": true, + "3:10": true, + "2:9": 177, + "15:7": true, + "3:6": true, + "1:8": true, + "2:8": true, + "15:5": true, + "3:15": true, + "1:9": true, + "15:8": true, + "3:4": true, + "2:5": true, + "3:14": true, + "1:7": true, + "15:4": true, + "1:6": true, + "3:8": true, + "2:15": true, + "15:14": true, + "3:5": true, + "15:15": true, + "2:14": true, + "3:7": true, + "1:14": true, + "15:10": true, + "15:6": true, + "15:13": true, + "1:15": true, + "3:9": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_0.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_0.json index 102e124f..f8f28b67 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_0.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_0.json @@ -1 +1,152 @@ -{"12:11":true,"9:14":true,"11:5":true,"8:8":true,"7:12":true,"6:10":true,"13:13":[190,192],"12:5":true,"10:14":true,"7:15":true,"11:11":true,"10:12":171,"6:13":[171,190],"9:15":true,"9:12":171,"8:1":true,"10:15":true,"7:14":[171,190],"10:10":true,"8:7":true,"7:13":[171,192],"9:10":true,"6:14":[171,190],"13:14":true,"10:13":true,"8:9":true,"7:10":true,"6:12":true,"6:15":true,"9:13":[171,192],"11:0":true,"8:13":[171,190],"10:9":true,"7:7":true,"15:14":190,"9:9":true,"6:1":true,"11:6":true,"10:7":true,"8:10":true,"7:9":true,"6:8":true,"9:7":true,"2:14":true,"1:13":true,"2:13":true,"12:3":true,"11:4":true,"9:1":true,"8:12":171,"7:8":true,"6:9":true,"1:14":true,"10:1":true,"11:3":true,"8:15":true,"15:13":[190,192],"10:8":true,"6:7":true,"11:2":true,"8:14":true,"9:8":true,"7:1":true,"12:1":true,"9:3":true,"6:0":true,"10:4":true,"3:13":true,"10:3":true,"0:13":true,"7:2":true,"6:6":true,"11:1":true,"9:4":true,"8:5":true,"11:8":true,"7:4":true,"9:2":true,"8:11":true,"10:2":true,"7:3":true,"9:6":true,"11:9":true,"6:4":true,"10:0":true,"10:6":true,"12:9":true,"9:0":true,"6:3":true,"7:0":true,"11:7":true,"0:14":true,"12:7":true,"6:2":true,"7:6":true,"4:14":190,"11:10":true,"6:5":true,"5:14":190,"6:11":true,"11:13":[171,192],"8:0":true,"8:6":true,"12:13":[175,190],"12:14":true,"9:11":true,"10:5":true,"10:11":true,"9:5":true,"11:14":true,"8:2":true,"12:15":true,"11:12":171,"8:4":true,"5:13":true,"7:5":true,"11:15":true,"8:3":true,"7:11":true,"4:13":true} \ No newline at end of file +{ + "12:11": true, + "9:14": true, + "11:5": true, + "8:8": true, + "7:12": true, + "6:10": true, + "13:13": [ + 190, + 192 + ], + "12:5": true, + "10:14": true, + "7:15": true, + "11:11": true, + "10:12": 171, + "6:13": [ + 171, + 190 + ], + "9:15": true, + "9:12": 171, + "8:1": true, + "10:15": true, + "7:14": [ + 171, + 190 + ], + "10:10": true, + "8:7": true, + "7:13": [ + 171, + 192 + ], + "9:10": true, + "6:14": [ + 171, + 190 + ], + "13:14": true, + "10:13": true, + "8:9": true, + "7:10": true, + "6:12": true, + "6:15": true, + "9:13": [ + 171, + 192 + ], + "11:0": true, + "8:13": [ + 171, + 190 + ], + "10:9": true, + "7:7": true, + "15:14": 190, + "9:9": true, + "6:1": true, + "11:6": true, + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": true, + "9:7": true, + "2:14": true, + "1:13": true, + "2:13": true, + "12:3": true, + "11:4": true, + "9:1": true, + "8:12": 171, + "7:8": true, + "6:9": true, + "1:14": true, + "10:1": true, + "11:3": true, + "8:15": true, + "15:13": [ + 190, + 192 + ], + "10:8": true, + "6:7": true, + "11:2": true, + "8:14": true, + "9:8": true, + "7:1": true, + "12:1": true, + "9:3": true, + "6:0": true, + "10:4": true, + "3:13": true, + "10:3": true, + "0:13": true, + "7:2": true, + "6:6": true, + "11:1": true, + "9:4": true, + "8:5": true, + "11:8": true, + "7:4": true, + "9:2": true, + "8:11": true, + "10:2": true, + "7:3": true, + "9:6": true, + "11:9": true, + "6:4": true, + "10:0": true, + "10:6": true, + "12:9": true, + "9:0": true, + "6:3": true, + "7:0": true, + "11:7": true, + "0:14": true, + "12:7": true, + "6:2": true, + "7:6": true, + "4:14": 190, + "11:10": true, + "6:5": true, + "5:14": 190, + "6:11": true, + "11:13": [ + 171, + 192 + ], + "8:0": true, + "8:6": true, + "12:13": [ + 175, + 190 + ], + "12:14": true, + "9:11": true, + "10:5": true, + "10:11": true, + "9:5": true, + "11:14": true, + "8:2": true, + "12:15": true, + "11:12": 171, + "8:4": true, + "5:13": true, + "7:5": true, + "11:15": true, + "8:3": true, + "7:11": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_1.json index 4574dc7f..ce03478f 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_1.json @@ -1 +1,167 @@ -{"12:11":true,"1:1":192,"11:5":true,"8:8":true,"6:10":true,"12:5":true,"7:15":true,"6:13":true,"3:0":true,"9:15":true,"0:0":true,"8:1":171,"10:15":true,"13:15":true,"10:10":true,"8:7":true,"5:5":true,"9:10":true,"4:5":true,"3:2":192,"15:1":192,"8:9":true,"7:10":true,"0:4":190,"6:15":true,"11:0":true,"12:6":true,"5:4":true,"10:9":true,"7:7":true,"12:0":true,"9:9":true,"6:1":[171,175],"11:6":true,"4:4":true,"10:7":true,"8:10":true,"7:9":true,"6:8":true,"3:5":true,"14:15":true,"13:1":192,"9:7":true,"5:2":192,"0:5":true,"12:3":true,"11:4":true,"9:1":[171,192],"7:8":true,"6:9":true,"5:0":true,"10:1":171,"12:4":true,"11:3":true,"8:15":true,"4:0":true,"10:8":true,"6:7":true,"11:2":true,"9:8":true,"7:1":[171,192],"12:1":175,"9:3":true,"6:0":[171,192],"10:4":true,"10:3":true,"1:5":true,"7:2":true,"6:6":true,"11:1":[171,192],"9:4":true,"8:5":true,"11:8":true,"7:4":true,"9:2":true,"13:0":true,"10:2":true,"12:8":true,"7:3":true,"13:2":192,"9:6":true,"11:9":true,"6:4":true,"15:5":true,"10:0":[171,192],"10:6":true,"5:1":192,"3:15":true,"12:9":true,"9:0":[171,192],"6:3":true,"7:0":[171,192],"11:7":true,"2:5":true,"13:4":true,"12:7":true,"6:2":171,"7:6":true,"15:4":true,"11:10":true,"6:5":true,"12:10":true,"6:11":true,"1:0":[190,192],"2:4":true,"8:0":[171,192],"4:15":true,"15:2":192,"8:6":true,"3:1":true,"13:5":true,"12:13":true,"5:15":true,"15:0":[190,192],"10:5":true,"9:5":true,"8:2":true,"1:4":190,"14:0":[190,192],"2:0":[190,192],"12:15":true,"8:4":true,"1:2":192,"7:5":true,"11:15":true,"8:3":true} \ No newline at end of file +{ + "12:11": true, + "1:1": 192, + "11:5": true, + "8:8": true, + "6:10": true, + "12:5": true, + "7:15": true, + "6:13": true, + "3:0": true, + "9:15": true, + "0:0": true, + "8:1": 171, + "10:15": true, + "13:15": true, + "10:10": true, + "8:7": true, + "5:5": true, + "9:10": true, + "4:5": true, + "3:2": 192, + "15:1": 192, + "8:9": true, + "7:10": true, + "0:4": 190, + "6:15": true, + "11:0": true, + "12:6": true, + "5:4": true, + "10:9": true, + "7:7": true, + "12:0": true, + "9:9": true, + "6:1": [ + 171, + 175 + ], + "11:6": true, + "4:4": true, + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": true, + "3:5": true, + "14:15": true, + "13:1": 192, + "9:7": true, + "5:2": 192, + "0:5": true, + "12:3": true, + "11:4": true, + "9:1": [ + 171, + 192 + ], + "7:8": true, + "6:9": true, + "5:0": true, + "10:1": 171, + "12:4": true, + "11:3": true, + "8:15": true, + "4:0": true, + "10:8": true, + "6:7": true, + "11:2": true, + "9:8": true, + "7:1": [ + 171, + 192 + ], + "12:1": 175, + "9:3": true, + "6:0": [ + 171, + 192 + ], + "10:4": true, + "10:3": true, + "1:5": true, + "7:2": true, + "6:6": true, + "11:1": [ + 171, + 192 + ], + "9:4": true, + "8:5": true, + "11:8": true, + "7:4": true, + "9:2": true, + "13:0": true, + "10:2": true, + "12:8": true, + "7:3": true, + "13:2": 192, + "9:6": true, + "11:9": true, + "6:4": true, + "15:5": true, + "10:0": [ + 171, + 192 + ], + "10:6": true, + "5:1": 192, + "3:15": true, + "12:9": true, + "9:0": [ + 171, + 192 + ], + "6:3": true, + "7:0": [ + 171, + 192 + ], + "11:7": true, + "2:5": true, + "13:4": true, + "12:7": true, + "6:2": 171, + "7:6": true, + "15:4": true, + "11:10": true, + "6:5": true, + "12:10": true, + "6:11": true, + "1:0": [ + 190, + 192 + ], + "2:4": true, + "8:0": [ + 171, + 192 + ], + "4:15": true, + "15:2": 192, + "8:6": true, + "3:1": true, + "13:5": true, + "12:13": true, + "5:15": true, + "15:0": [ + 190, + 192 + ], + "10:5": true, + "9:5": true, + "8:2": true, + "1:4": 190, + "14:0": [ + 190, + 192 + ], + "2:0": [ + 190, + 192 + ], + "12:15": true, + "8:4": true, + "1:2": 192, + "7:5": true, + "11:15": true, + "8:3": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_2.json index 3736f0b1..c1959b3c 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_2.json @@ -1 +1,100 @@ -{"12:11":true,"9:14":true,"7:12":true,"13:13":true,"12:5":true,"10:14":true,"7:15":true,"10:12":true,"6:13":true,"3:0":true,"9:15":true,"9:12":true,"10:15":true,"7:14":true,"1:8":true,"14:1":true,"13:15":true,"4:11":true,"7:13":true,"5:11":true,"6:14":true,"1:9":true,"13:14":true,"10:13":true,"6:12":true,"1:7":true,"6:15":true,"9:13":true,"14:14":true,"8:13":true,"2:12":true,"2:15":true,"1:10":true,"15:14":true,"6:1":true,"14:15":true,"13:1":true,"0:11":true,"15:15":true,"3:11":true,"2:14":true,"1:13":true,"12:3":true,"8:12":true,"6:9":true,"2:13":true,"1:14":true,"8:15":true,"2:10":true,"1:15":true,"6:7":true,"8:14":true,"1:12":true,"12:1":true,"1:11":true,"3:13":true,"5:9":true,"0:13":true,"4:9":true,"3:10":true,"0:10":true,"4:1":true,"3:12":true,"5:1":true,"3:15":true,"0:12":true,"12:9":true,"6:3":true,"0:14":true,"12:7":true,"3:14":true,"4:8":true,"2:11":true,"4:14":true,"6:5":true,"3:8":true,"5:14":true,"0:8":true,"6:11":true,"11:13":true,"5:12":true,"4:15":true,"4:12":true,"3:1":true,"12:13":true,"5:15":true,"12:14":true,"5:10":true,"4:10":true,"11:14":true,"0:7":true,"12:15":true,"11:12":true,"5:13":true,"3:9":true,"0:9":true,"7:11":true,"4:13":true} \ No newline at end of file +{ + "12:11": true, + "9:14": true, + "7:12": true, + "13:13": true, + "12:5": true, + "10:14": true, + "7:15": true, + "10:12": true, + "6:13": true, + "3:0": true, + "9:15": true, + "9:12": true, + "10:15": true, + "7:14": true, + "1:8": true, + "14:1": true, + "13:15": true, + "4:11": true, + "7:13": true, + "5:11": true, + "6:14": true, + "1:9": true, + "13:14": true, + "10:13": true, + "6:12": true, + "1:7": true, + "6:15": true, + "9:13": true, + "14:14": true, + "8:13": true, + "2:12": true, + "2:15": true, + "1:10": true, + "15:14": true, + "6:1": true, + "14:15": true, + "13:1": true, + "0:11": true, + "15:15": true, + "3:11": true, + "2:14": true, + "1:13": true, + "12:3": true, + "8:12": true, + "6:9": true, + "2:13": true, + "1:14": true, + "8:15": true, + "2:10": true, + "1:15": true, + "6:7": true, + "8:14": true, + "1:12": true, + "12:1": true, + "1:11": true, + "3:13": true, + "5:9": true, + "0:13": true, + "4:9": true, + "3:10": true, + "0:10": true, + "4:1": true, + "3:12": true, + "5:1": true, + "3:15": true, + "0:12": true, + "12:9": true, + "6:3": true, + "0:14": true, + "12:7": true, + "3:14": true, + "4:8": true, + "2:11": true, + "4:14": true, + "6:5": true, + "3:8": true, + "5:14": true, + "0:8": true, + "6:11": true, + "11:13": true, + "5:12": true, + "4:15": true, + "4:12": true, + "3:1": true, + "12:13": true, + "5:15": true, + "12:14": true, + "5:10": true, + "4:10": true, + "11:14": true, + "0:7": true, + "12:15": true, + "11:12": true, + "5:13": true, + "3:9": true, + "0:9": true, + "7:11": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_3.json index aed53373..2266b3ad 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_3.json @@ -1 +1,122 @@ -{"15:9":true,"12:11":true,"9:14":true,"11:5":true,"7:12":true,"6:10":true,"12:5":true,"10:14":true,"7:15":true,"14:9":true,"11:11":true,"10:12":true,"6:13":true,"15:7":true,"3:0":true,"9:15":true,"14:7":true,"9:12":true,"8:1":true,"10:15":true,"7:14":true,"14:1":true,"10:10":true,"7:13":true,"9:10":true,"15:1":true,"6:14":true,"15:8":true,"10:13":true,"8:9":true,"7:10":171,"6:12":true,"6:15":true,"14:8":true,"9:13":true,"8:13":true,"13:8":true,"12:0":true,"6:1":true,"8:10":171,"7:9":171,"6:8":true,"15:12":true,"13:1":true,"12:3":true,"11:4":true,"9:1":true,"8:12":true,"7:8":true,"6:9":[171,175],"15:10":true,"5:0":true,"14:10":true,"10:1":true,"13:7":true,"12:4":true,"11:3":true,"8:15":true,"4:0":true,"15:13":true,"12:2":true,"6:7":true,"11:2":true,"8:14":true,"7:1":true,"12:1":true,"9:3":true,"6:0":true,"10:3":true,"6:6":true,"11:1":true,"13:6":true,"9:2":true,"13:0":true,"8:11":true,"10:2":true,"13:2":true,"4:1":true,"15:5":true,"14:5":true,"5:1":true,"3:15":true,"15:11":true,"12:9":true,"6:3":true,"13:3":true,"13:4":true,"12:7":true,"15:4":true,"14:3":true,"4:14":true,"6:5":true,"12:10":true,"15:3":true,"6:11":true,"14:4":true,"11:13":true,"14:2":true,"15:2":true,"13:5":true,"12:13":true,"15:0":true,"14:6":true,"12:14":true,"9:11":true,"10:11":true,"11:14":true,"8:2":true,"15:6":true,"14:0":true,"12:15":true,"11:12":true,"5:13":true,"12:12":true,"11:15":true,"0:9":true,"7:11":true} \ No newline at end of file +{ + "15:9": true, + "12:11": true, + "9:14": true, + "11:5": true, + "7:12": true, + "6:10": true, + "12:5": true, + "10:14": true, + "7:15": true, + "14:9": true, + "11:11": true, + "10:12": true, + "6:13": true, + "15:7": true, + "3:0": true, + "9:15": true, + "14:7": true, + "9:12": true, + "8:1": true, + "10:15": true, + "7:14": true, + "14:1": true, + "10:10": true, + "7:13": true, + "9:10": true, + "15:1": true, + "6:14": true, + "15:8": true, + "10:13": true, + "8:9": true, + "7:10": 171, + "6:12": true, + "6:15": true, + "14:8": true, + "9:13": true, + "8:13": true, + "13:8": true, + "12:0": true, + "6:1": true, + "8:10": 171, + "7:9": 171, + "6:8": true, + "15:12": true, + "13:1": true, + "12:3": true, + "11:4": true, + "9:1": true, + "8:12": true, + "7:8": true, + "6:9": [ + 171, + 175 + ], + "15:10": true, + "5:0": true, + "14:10": true, + "10:1": true, + "13:7": true, + "12:4": true, + "11:3": true, + "8:15": true, + "4:0": true, + "15:13": true, + "12:2": true, + "6:7": true, + "11:2": true, + "8:14": true, + "7:1": true, + "12:1": true, + "9:3": true, + "6:0": true, + "10:3": true, + "6:6": true, + "11:1": true, + "13:6": true, + "9:2": true, + "13:0": true, + "8:11": true, + "10:2": true, + "13:2": true, + "4:1": true, + "15:5": true, + "14:5": true, + "5:1": true, + "3:15": true, + "15:11": true, + "12:9": true, + "6:3": true, + "13:3": true, + "13:4": true, + "12:7": true, + "15:4": true, + "14:3": true, + "4:14": true, + "6:5": true, + "12:10": true, + "15:3": true, + "6:11": true, + "14:4": true, + "11:13": true, + "14:2": true, + "15:2": true, + "13:5": true, + "12:13": true, + "15:0": true, + "14:6": true, + "12:14": true, + "9:11": true, + "10:11": true, + "11:14": true, + "8:2": true, + "15:6": true, + "14:0": true, + "12:15": true, + "11:12": true, + "5:13": true, + "12:12": true, + "11:15": true, + "0:9": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_4.json index 0dc13427..f52dabff 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_4.json @@ -1 +1,33 @@ -{"11:0":true,"9:3":true,"5:4":true,"6:5":true,"5:3":true,"7:2":true,"12:0":true,"6:1":true,"11:1":true,"7:4":true,"8:0":true,"9:2":true,"8:1":true,"10:2":true,"5:2":true,"7:3":true,"9:1":true,"5:5":true,"6:4":true,"10:0":true,"10:1":true,"5:1":true,"8:2":true,"9:0":true,"6:3":true,"7:0":true,"8:4":true,"7:5":true,"8:3":true,"6:2":true,"7:1":true} \ No newline at end of file +{ + "11:0": true, + "9:3": true, + "5:4": true, + "6:5": true, + "5:3": true, + "7:2": true, + "12:0": true, + "6:1": true, + "11:1": true, + "7:4": true, + "8:0": true, + "9:2": true, + "8:1": true, + "10:2": true, + "5:2": true, + "7:3": true, + "9:1": true, + "5:5": true, + "6:4": true, + "10:0": true, + "10:1": true, + "5:1": true, + "8:2": true, + "9:0": true, + "6:3": true, + "7:0": true, + "8:4": true, + "7:5": true, + "8:3": true, + "6:2": true, + "7:1": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_8.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_8.json index 25cbedf1..e554d428 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_8.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_8.json @@ -1 +1,217 @@ -{"12:11":true,"9:14":true,"11:5":true,"2:7":[148,153],"8:8":true,"7:12":true,"6:10":true,"13:13":true,"10:14":true,"7:15":[136,153],"11:11":true,"10:12":true,"6:13":true,"2:9":true,"9:15":true,"0:6":[155,156],"9:12":true,"3:6":150,"10:15":true,"7:14":true,"1:8":true,"13:15":[138,153],"10:10":true,"8:7":true,"4:11":true,"7:13":true,"2:8":true,"9:10":true,"5:11":true,"4:5":151,"13:12":true,"6:14":true,"1:9":true,"13:14":[138,152],"10:13":true,"3:4":[145,146],"8:9":true,"7:10":true,"6:12":true,"3:3":[144,147],"1:7":[154,156],"0:4":153,"6:15":[134,156],"9:13":true,"14:14":[138,152],"8:13":true,"2:12":true,"7:7":true,"2:15":[135,161],"15:14":[138,152],"9:9":true,"8:10":true,"7:9":true,"6:8":true,"3:5":[146,149],"15:12":true,"14:15":[138,153],"15:15":[138,153],"14:12":true,"9:7":true,"2:14":true,"1:13":true,"0:5":154,"2:13":true,"12:3":145,"11:4":[145,147],"8:12":true,"7:8":true,"6:9":true,"1:14":true,"12:4":true,"8:15":[138,153],"15:13":[138,151],"1:15":[134,161],"6:7":true,"8:14":true,"1:12":true,"14:13":[138,152],"3:13":true,"5:9":true,"0:13":true,"6:6":true,"4:9":true,"5:7":true,"3:10":true,"7:4":181,"8:11":true,"4:7":true,"14:11":true,"9:6":true,"3:12":true,"0:15":[135,175],"10:6":true,"3:15":true,"0:12":true,"15:11":true,"2:5":true,"0:14":true,"5:8":true,"3:14":true,"4:8":true,"4:14":true,"1:6":[153,154],"11:10":true,"3:8":true,"12:10":true,"5:14":true,"0:8":157,"6:11":true,"11:13":true,"5:12":true,"13:11":true,"4:15":true,"8:6":true,"4:12":true,"12:13":true,"5:15":[133,159],"12:14":152,"10:5":true,"9:11":true,"3:7":true,"5:10":true,"10:11":true,"4:10":true,"11:14":true,"0:7":157,"12:15":[138,153],"11:12":true,"5:13":true,"3:9":true,"12:12":true,"11:15":[138,153],"8:3":181,"0:9":true,"7:11":true,"4:13":true,"2:6":[148,149]} \ No newline at end of file +{ + "12:11": true, + "9:14": true, + "11:5": true, + "2:7": [ + 148, + 153 + ], + "8:8": true, + "7:12": true, + "6:10": true, + "13:13": true, + "10:14": true, + "7:15": [ + 136, + 153 + ], + "11:11": true, + "10:12": true, + "6:13": true, + "2:9": true, + "9:15": true, + "0:6": [ + 155, + 156 + ], + "9:12": true, + "3:6": 150, + "10:15": true, + "7:14": true, + "1:8": true, + "13:15": [ + 138, + 153 + ], + "10:10": true, + "8:7": true, + "4:11": true, + "7:13": true, + "2:8": true, + "9:10": true, + "5:11": true, + "4:5": 151, + "13:12": true, + "6:14": true, + "1:9": true, + "13:14": [ + 138, + 152 + ], + "10:13": true, + "3:4": [ + 145, + 146 + ], + "8:9": true, + "7:10": true, + "6:12": true, + "3:3": [ + 144, + 147 + ], + "1:7": [ + 154, + 156 + ], + "0:4": 153, + "6:15": [ + 134, + 156 + ], + "9:13": true, + "14:14": [ + 138, + 152 + ], + "8:13": true, + "2:12": true, + "7:7": true, + "2:15": [ + 135, + 161 + ], + "15:14": [ + 138, + 152 + ], + "9:9": true, + "8:10": true, + "7:9": true, + "6:8": true, + "3:5": [ + 146, + 149 + ], + "15:12": true, + "14:15": [ + 138, + 153 + ], + "15:15": [ + 138, + 153 + ], + "14:12": true, + "9:7": true, + "2:14": true, + "1:13": true, + "0:5": 154, + "2:13": true, + "12:3": 145, + "11:4": [ + 145, + 147 + ], + "8:12": true, + "7:8": true, + "6:9": true, + "1:14": true, + "12:4": true, + "8:15": [ + 138, + 153 + ], + "15:13": [ + 138, + 151 + ], + "1:15": [ + 134, + 161 + ], + "6:7": true, + "8:14": true, + "1:12": true, + "14:13": [ + 138, + 152 + ], + "3:13": true, + "5:9": true, + "0:13": true, + "6:6": true, + "4:9": true, + "5:7": true, + "3:10": true, + "7:4": 181, + "8:11": true, + "4:7": true, + "14:11": true, + "9:6": true, + "3:12": true, + "0:15": [ + 135, + 175 + ], + "10:6": true, + "3:15": true, + "0:12": true, + "15:11": true, + "2:5": true, + "0:14": true, + "5:8": true, + "3:14": true, + "4:8": true, + "4:14": true, + "1:6": [ + 153, + 154 + ], + "11:10": true, + "3:8": true, + "12:10": true, + "5:14": true, + "0:8": 157, + "6:11": true, + "11:13": true, + "5:12": true, + "13:11": true, + "4:15": true, + "8:6": true, + "4:12": true, + "12:13": true, + "5:15": [ + 133, + 159 + ], + "12:14": 152, + "10:5": true, + "9:11": true, + "3:7": true, + "5:10": true, + "10:11": true, + "4:10": true, + "11:14": true, + "0:7": 157, + "12:15": [ + 138, + 153 + ], + "11:12": true, + "5:13": true, + "3:9": true, + "12:12": true, + "11:15": [ + 138, + 153 + ], + "8:3": 181, + "0:9": true, + "7:11": true, + "4:13": true, + "2:6": [ + 148, + 149 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_9.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_9.json index 0bd4fdd5..970d3fc8 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-7_9.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-7_9.json @@ -1 +1,316 @@ -{"1:1":[137,158],"8:8":true,"6:10":true,"13:13":true,"3:0":[135,158],"0:6":true,"0:0":[135,157],"3:6":true,"14:1":138,"13:15":true,"10:10":true,"8:7":true,"5:5":true,"4:11":true,"0:2":true,"9:10":true,"5:11":true,"4:5":true,"13:12":true,"3:2":158,"15:1":138,"13:14":true,"3:4":[144,157],"0:3":true,"8:9":true,"7:10":true,"3:3":[144,158],"0:4":true,"2:1":[138,142],"14:14":true,"4:3":[144,157],"5:4":[144,157],"2:12":true,"10:9":true,"7:7":true,"5:3":[144,157],"2:15":true,"15:14":true,"9:9":true,"4:4":[144,157],"10:7":true,"8:10":true,"7:9":true,"6:8":true,"3:5":true,"15:12":true,"14:15":true,"13:1":138,"4:2":[144,158],"0:11":true,"15:15":true,"14:12":true,"9:7":true,"3:11":true,"5:2":[144,157],"2:14":true,"1:13":true,"0:5":true,"2:13":true,"7:8":true,"6:9":true,"4:6":true,"1:14":true,"5:0":true,"5:6":true,"4:0":true,"1:15":true,"10:8":true,"1:12":true,"9:8":true,"14:13":true,"1:11":true,"3:13":true,"1:5":true,"0:13":true,"11:8":true,"13:6":true,"13:0":138,"13:2":[138,179],"4:1":[139,157],"3:12":true,"0:15":true,"11:9":true,"15:5":true,"14:5":true,"5:1":true,"3:15":true,"0:12":true,"12:9":true,"13:3":true,"11:7":true,"2:5":true,"0:14":true,"13:4":true,"3:14":true,"2:11":true,"15:4":true,"14:3":true,"4:14":true,"1:6":true,"11:10":true,"12:10":true,"5:14":true,"15:3":true,"1:0":[136,157],"14:4":true,"5:12":true,"2:4":true,"14:2":138,"13:11":true,"4:15":true,"0:1":true,"15:2":[138,182],"4:12":true,"3:1":[139,158],"13:5":true,"5:15":true,"2:3":[144,158],"15:0":138,"14:6":true,"1:3":true,"1:4":true,"15:6":true,"14:0":138,"2:0":[140,158],"5:13":true,"1:2":[140,158],"4:13":true,"2:6":true,"15:9":true,"12:11":true,"9:14":true,"11:5":true,"2:7":true,"7:12":true,"12:5":true,"10:14":true,"7:15":true,"11:11":true,"10:12":true,"6:13":true,"2:9":true,"15:7":true,"9:15":true,"14:7":true,"9:12":true,"8:1":true,"13:10":true,"10:15":true,"7:14":true,"1:8":true,"7:13":true,"2:8":true,"6:14":true,"1:9":true,"15:8":true,"10:13":true,"6:12":true,"1:7":true,"6:15":true,"9:13":true,"11:0":true,"12:6":true,"8:13":true,"1:10":true,"6:1":140,"11:6":true,"11:4":true,"9:1":138,"8:12":true,"10:1":true,"13:7":true,"12:4":true,"11:3":true,"8:15":true,"12:2":[168,178],"2:10":true,"11:2":[138,177],"8:14":true,"13:9":true,"7:1":true,"12:1":true,"9:3":140,"6:0":true,"10:4":true,"5:9":true,"10:3":true,"7:2":141,"6:6":true,"4:9":true,"11:1":true,"9:4":true,"8:5":true,"5:7":true,"3:10":true,"7:4":143,"9:2":139,"8:11":true,"4:7":true,"10:2":true,"0:10":true,"7:3":[142,155],"9:6":true,"6:4":144,"10:6":true,"6:3":[142,156],"5:8":true,"6:2":[141,143],"7:6":true,"4:8":true,"6:5":true,"3:8":true,"0:8":true,"6:11":true,"11:13":true,"8:0":151,"8:6":true,"12:13":true,"12:14":true,"10:5":true,"9:11":true,"5:10":true,"3:7":true,"10:11":true,"9:5":true,"4:10":true,"11:14":true,"8:2":140,"0:7":true,"12:15":true,"11:12":true,"8:4":142,"7:5":true,"3:9":true,"12:12":true,"11:15":true,"8:3":141,"0:9":true,"7:11":true} \ No newline at end of file +{ + "1:1": [ + 137, + 158 + ], + "8:8": true, + "6:10": true, + "13:13": true, + "3:0": [ + 135, + 158 + ], + "0:6": true, + "0:0": [ + 135, + 157 + ], + "3:6": true, + "14:1": 138, + "13:15": true, + "10:10": true, + "8:7": true, + "5:5": true, + "4:11": true, + "0:2": true, + "9:10": true, + "5:11": true, + "4:5": true, + "13:12": true, + "3:2": 158, + "15:1": 138, + "13:14": true, + "3:4": [ + 144, + 157 + ], + "0:3": true, + "8:9": true, + "7:10": true, + "3:3": [ + 144, + 158 + ], + "0:4": true, + "2:1": [ + 138, + 142 + ], + "14:14": true, + "4:3": [ + 144, + 157 + ], + "5:4": [ + 144, + 157 + ], + "2:12": true, + "10:9": true, + "7:7": true, + "5:3": [ + 144, + 157 + ], + "2:15": true, + "15:14": true, + "9:9": true, + "4:4": [ + 144, + 157 + ], + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": true, + "3:5": true, + "15:12": true, + "14:15": true, + "13:1": 138, + "4:2": [ + 144, + 158 + ], + "0:11": true, + "15:15": true, + "14:12": true, + "9:7": true, + "3:11": true, + "5:2": [ + 144, + 157 + ], + "2:14": true, + "1:13": true, + "0:5": true, + "2:13": true, + "7:8": true, + "6:9": true, + "4:6": true, + "1:14": true, + "5:0": true, + "5:6": true, + "4:0": true, + "1:15": true, + "10:8": true, + "1:12": true, + "9:8": true, + "14:13": true, + "1:11": true, + "3:13": true, + "1:5": true, + "0:13": true, + "11:8": true, + "13:6": true, + "13:0": 138, + "13:2": [ + 138, + 179 + ], + "4:1": [ + 139, + 157 + ], + "3:12": true, + "0:15": true, + "11:9": true, + "15:5": true, + "14:5": true, + "5:1": true, + "3:15": true, + "0:12": true, + "12:9": true, + "13:3": true, + "11:7": true, + "2:5": true, + "0:14": true, + "13:4": true, + "3:14": true, + "2:11": true, + "15:4": true, + "14:3": true, + "4:14": true, + "1:6": true, + "11:10": true, + "12:10": true, + "5:14": true, + "15:3": true, + "1:0": [ + 136, + 157 + ], + "14:4": true, + "5:12": true, + "2:4": true, + "14:2": 138, + "13:11": true, + "4:15": true, + "0:1": true, + "15:2": [ + 138, + 182 + ], + "4:12": true, + "3:1": [ + 139, + 158 + ], + "13:5": true, + "5:15": true, + "2:3": [ + 144, + 158 + ], + "15:0": 138, + "14:6": true, + "1:3": true, + "1:4": true, + "15:6": true, + "14:0": 138, + "2:0": [ + 140, + 158 + ], + "5:13": true, + "1:2": [ + 140, + 158 + ], + "4:13": true, + "2:6": true, + "15:9": true, + "12:11": true, + "9:14": true, + "11:5": true, + "2:7": true, + "7:12": true, + "12:5": true, + "10:14": true, + "7:15": true, + "11:11": true, + "10:12": true, + "6:13": true, + "2:9": true, + "15:7": true, + "9:15": true, + "14:7": true, + "9:12": true, + "8:1": true, + "13:10": true, + "10:15": true, + "7:14": true, + "1:8": true, + "7:13": true, + "2:8": true, + "6:14": true, + "1:9": true, + "15:8": true, + "10:13": true, + "6:12": true, + "1:7": true, + "6:15": true, + "9:13": true, + "11:0": true, + "12:6": true, + "8:13": true, + "1:10": true, + "6:1": 140, + "11:6": true, + "11:4": true, + "9:1": 138, + "8:12": true, + "10:1": true, + "13:7": true, + "12:4": true, + "11:3": true, + "8:15": true, + "12:2": [ + 168, + 178 + ], + "2:10": true, + "11:2": [ + 138, + 177 + ], + "8:14": true, + "13:9": true, + "7:1": true, + "12:1": true, + "9:3": 140, + "6:0": true, + "10:4": true, + "5:9": true, + "10:3": true, + "7:2": 141, + "6:6": true, + "4:9": true, + "11:1": true, + "9:4": true, + "8:5": true, + "5:7": true, + "3:10": true, + "7:4": 143, + "9:2": 139, + "8:11": true, + "4:7": true, + "10:2": true, + "0:10": true, + "7:3": [ + 142, + 155 + ], + "9:6": true, + "6:4": 144, + "10:6": true, + "6:3": [ + 142, + 156 + ], + "5:8": true, + "6:2": [ + 141, + 143 + ], + "7:6": true, + "4:8": true, + "6:5": true, + "3:8": true, + "0:8": true, + "6:11": true, + "11:13": true, + "8:0": 151, + "8:6": true, + "12:13": true, + "12:14": true, + "10:5": true, + "9:11": true, + "5:10": true, + "3:7": true, + "10:11": true, + "9:5": true, + "4:10": true, + "11:14": true, + "8:2": 140, + "0:7": true, + "12:15": true, + "11:12": true, + "8:4": 142, + "7:5": true, + "3:9": true, + "12:12": true, + "11:15": true, + "8:3": 141, + "0:9": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-1.json index cd9b9487..7ab9b6cb 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-1.json @@ -1 +1,31 @@ -{"10:3":[164,165],"11:1":164,"13:0":true,"10:2":160,"14:1":true,"13:2":true,"10:0":160,"15:1":true,"11:0":164,"12:0":217,"10:7":[178,179],"15:12":[153,154],"15:2":true,"10:1":160,"11:3":[164,165],"14:0":true,"11:2":165} \ No newline at end of file +{ + "10:3": [ + 164, + 165 + ], + "11:1": 164, + "13:0": true, + "10:2": 160, + "14:1": true, + "13:2": true, + "10:0": 160, + "15:1": true, + "11:0": 164, + "12:0": 217, + "10:7": [ + 178, + 179 + ], + "15:12": [ + 153, + 154 + ], + "15:2": true, + "10:1": 160, + "11:3": [ + 164, + 165 + ], + "14:0": true, + "11:2": 165 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-2.json index e1b6709c..f9dfb020 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-2.json @@ -1 +1,25 @@ -{"11:5":164,"11:11":true,"11:6":164,"3:5":true,"0:5":167,"12:3":149,"11:4":165,"11:3":true,"4:0":true,"12:1":158,"11:1":true,"11:8":true,"11:9":true,"10:6":160,"9:0":true,"11:7":165,"11:10":true,"11:13":true,"10:5":true,"11:14":true,"12:15":216,"11:12":true,"11:15":165} \ No newline at end of file +{ + "11:5": 164, + "11:11": true, + "11:6": 164, + "3:5": true, + "0:5": 167, + "12:3": 149, + "11:4": 165, + "11:3": true, + "4:0": true, + "12:1": 158, + "11:1": true, + "11:8": true, + "11:9": true, + "10:6": 160, + "9:0": true, + "11:7": 165, + "11:10": true, + "11:13": true, + "10:5": true, + "11:14": true, + "12:15": 216, + "11:12": true, + "11:15": 165 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-3.json index 65b6d476..87cd0f65 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-3.json @@ -1 +1,34 @@ -{"9:15":true,"13:14":164,"2:15":true,"15:14":196,"15:12":[166,167],"2:14":184,"1:13":184,"1:14":[170,185],"8:15":182,"2:10":183,"1:15":185,"14:13":[165,166],"0:13":185,"9:6":true,"0:15":[170,185],"0:14":[169,185],"14:3":true} \ No newline at end of file +{ + "9:15": true, + "13:14": 164, + "2:15": true, + "15:14": 196, + "15:12": [ + 166, + 167 + ], + "2:14": 184, + "1:13": 184, + "1:14": [ + 170, + 185 + ], + "8:15": 182, + "2:10": 183, + "1:15": 185, + "14:13": [ + 165, + 166 + ], + "0:13": 185, + "9:6": true, + "0:15": [ + 170, + 185 + ], + "0:14": [ + 169, + 185 + ], + "14:3": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-4.json index aee1ef41..d984881a 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-4.json @@ -1 +1,30 @@ -{"6:10":[204,233],"5:11":204,"7:10":true,"6:12":true,"6:9":204,"14:13":true,"12:1":217,"9:3":205,"7:2":true,"7:4":[212,213],"7:3":[206,214],"13:2":true,"9:0":210,"15:4":true,"14:3":true,"6:11":true,"8:2":212,"8:4":true,"8:3":true} \ No newline at end of file +{ + "6:10": [ + 204, + 233 + ], + "5:11": 204, + "7:10": true, + "6:12": true, + "6:9": 204, + "14:13": true, + "12:1": 217, + "9:3": 205, + "7:2": true, + "7:4": [ + 212, + 213 + ], + "7:3": [ + 206, + 214 + ], + "13:2": true, + "9:0": 210, + "15:4": true, + "14:3": true, + "6:11": true, + "8:2": 212, + "8:4": true, + "8:3": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-5.json index 50f3e00b..44379810 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-5.json @@ -1 +1,21 @@ -{"2:7":true,"6:6":true,"0:6":171,"3:6":true,"10:15":211,"4:5":180,"15:8":true,"1:7":true,"7:6":true,"1:6":170,"6:5":181,"4:6":true,"3:7":true,"11:14":[211,212],"0:7":182,"2:6":true} \ No newline at end of file +{ + "2:7": true, + "6:6": true, + "0:6": 171, + "3:6": true, + "10:15": 211, + "4:5": 180, + "15:8": true, + "1:7": true, + "7:6": true, + "1:6": 170, + "6:5": 181, + "4:6": true, + "3:7": true, + "11:14": [ + 211, + 212 + ], + "0:7": 182, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-6.json index 6dd850a8..8b25f421 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_-6.json @@ -1 +1,5 @@ -{"12:6":true,"11:6":191,"10:6":192} \ No newline at end of file +{ + "12:6": true, + "11:6": 191, + "10:6": 192 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_0.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_0.json index 4041bf83..1c778a7d 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_0.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_0.json @@ -1 +1,61 @@ -{"14:14":true,"9:14":true,"1:11":true,"3:13":[159,209],"2:12":true,"3:8":true,"13:13":true,"10:14":true,"2:15":true,"1:10":true,"0:13":true,"15:14":true,"11:13":true,"3:5":true,"3:10":true,"6:13":true,"8:0":true,"3:6":true,"3:11":[150,209],"12:13":true,"2:14":true,"1:13":true,"7:14":true,"12:14":true,"3:7":true,"3:12":[150,209],"2:13":true,"1:14":true,"7:13":true,"11:14":true,"3:15":[163,210],"6:14":true,"15:13":true,"13:14":true,"10:13":true,"5:13":true,"3:4":true,"2:10":true,"1:15":true,"0:14":true,"3:9":true,"3:14":true,"1:12":true,"14:13":true,"9:13":true,"4:13":true,"2:11":true} \ No newline at end of file +{ + "14:14": true, + "9:14": true, + "1:11": true, + "3:13": [ + 159, + 209 + ], + "2:12": true, + "3:8": true, + "13:13": true, + "10:14": true, + "2:15": true, + "1:10": true, + "0:13": true, + "15:14": true, + "11:13": true, + "3:5": true, + "3:10": true, + "6:13": true, + "8:0": true, + "3:6": true, + "3:11": [ + 150, + 209 + ], + "12:13": true, + "2:14": true, + "1:13": true, + "7:14": true, + "12:14": true, + "3:7": true, + "3:12": [ + 150, + 209 + ], + "2:13": true, + "1:14": true, + "7:13": true, + "11:14": true, + "3:15": [ + 163, + 210 + ], + "6:14": true, + "15:13": true, + "13:14": true, + "10:13": true, + "5:13": true, + "3:4": true, + "2:10": true, + "1:15": true, + "0:14": true, + "3:9": true, + "3:14": true, + "1:12": true, + "14:13": true, + "9:13": true, + "4:13": true, + "2:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_1.json index 7d15d4b4..72b5e29c 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_1.json @@ -1 +1,106 @@ -{"6:0":true,"1:1":true,"11:5":true,"10:4":true,"3:13":true,"2:7":true,"12:5":true,"1:5":true,"7:2":true,"11:1":true,"9:4":true,"3:10":true,"7:4":true,"3:0":[160,210],"9:2":true,"13:0":true,"0:0":true,"3:6":[150,205],"1:8":true,"13:2":true,"5:5":true,"3:12":true,"0:2":true,"6:4":true,"2:8":true,"15:5":true,"10:0":true,"14:5":true,"5:1":true,"4:5":true,"3:2":[168,210],"15:1":true,"9:0":true,"7:0":true,"3:4":true,"2:5":true,"13:4":true,"3:14":true,"3:3":[163,210],"1:7":true,"0:4":true,"2:1":true,"15:4":true,"11:0":true,"14:3":true,"1:6":true,"6:5":true,"3:8":true,"2:2":true,"12:0":true,"1:0":true,"14:4":true,"3:5":[159,205],"2:4":true,"8:0":true,"13:1":true,"0:1":true,"15:2":192,"3:11":true,"3:1":[167,210],"13:5":true,"5:2":true,"2:3":true,"0:5":true,"15:0":true,"11:4":true,"10:5":true,"9:1":true,"3:7":[150,205],"1:3":true,"5:0":true,"9:5":true,"12:4":true,"1:4":true,"14:0":true,"4:0":true,"2:0":true,"1:2":true,"7:5":true,"3:9":true,"11:2":true,"7:1":true,"2:6":true} \ No newline at end of file +{ + "6:0": true, + "1:1": true, + "11:5": true, + "10:4": true, + "3:13": true, + "2:7": true, + "12:5": true, + "1:5": true, + "7:2": true, + "11:1": true, + "9:4": true, + "3:10": true, + "7:4": true, + "3:0": [ + 160, + 210 + ], + "9:2": true, + "13:0": true, + "0:0": true, + "3:6": [ + 150, + 205 + ], + "1:8": true, + "13:2": true, + "5:5": true, + "3:12": true, + "0:2": true, + "6:4": true, + "2:8": true, + "15:5": true, + "10:0": true, + "14:5": true, + "5:1": true, + "4:5": true, + "3:2": [ + 168, + 210 + ], + "15:1": true, + "9:0": true, + "7:0": true, + "3:4": true, + "2:5": true, + "13:4": true, + "3:14": true, + "3:3": [ + 163, + 210 + ], + "1:7": true, + "0:4": true, + "2:1": true, + "15:4": true, + "11:0": true, + "14:3": true, + "1:6": true, + "6:5": true, + "3:8": true, + "2:2": true, + "12:0": true, + "1:0": true, + "14:4": true, + "3:5": [ + 159, + 205 + ], + "2:4": true, + "8:0": true, + "13:1": true, + "0:1": true, + "15:2": 192, + "3:11": true, + "3:1": [ + 167, + 210 + ], + "13:5": true, + "5:2": true, + "2:3": true, + "0:5": true, + "15:0": true, + "11:4": true, + "10:5": true, + "9:1": true, + "3:7": [ + 150, + 205 + ], + "1:3": true, + "5:0": true, + "9:5": true, + "12:4": true, + "1:4": true, + "14:0": true, + "4:0": true, + "2:0": true, + "1:2": true, + "7:5": true, + "3:9": true, + "11:2": true, + "7:1": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_2.json index 1024acf2..a1ab3fb3 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_2.json @@ -1 +1,110 @@ -{"15:9":true,"12:11":true,"2:7":true,"8:8":true,"7:12":true,"6:10":true,"13:13":true,"14:9":true,"11:11":true,"10:12":true,"2:9":true,"15:7":true,"14:7":true,"9:12":true,"13:10":true,"1:8":true,"10:10":true,"8:7":true,"4:11":true,"2:8":true,"9:10":true,"5:11":true,"1:9":true,"15:8":true,"8:9":true,"7:10":true,"6:12":true,"1:7":true,"14:8":true,"14:14":true,"12:6":true,"2:12":true,"10:9":true,"7:7":true,"1:10":true,"13:8":true,"15:14":true,"9:9":true,"10:7":true,"8:10":true,"7:9":true,"6:8":true,"15:12":true,"14:12":true,"9:7":true,"3:11":true,"8:12":true,"7:8":true,"6:9":true,"4:6":true,"2:13":true,"15:10":true,"14:10":true,"5:6":true,"13:7":true,"15:13":true,"2:10":true,"10:8":true,"6:7":true,"13:9":true,"9:8":true,"14:13":true,"3:13":true,"5:9":true,"6:6":true,"4:9":true,"5:7":true,"3:10":true,"11:8":true,"13:6":true,"8:11":true,"12:8":true,"14:11":true,"9:6":true,"3:12":true,"11:9":true,"10:6":true,"15:11":true,"12:9":true,"11:7":true,"5:8":true,"12:7":true,"7:6":true,"4:8":true,"2:11":true,"11:10":true,"3:8":true,"12:10":true,"0:8":true,"6:11":true,"11:13":true,"5:12":true,"13:11":true,"8:6":true,"4:12":true,"12:13":true,"14:6":true,"5:10":true,"9:11":true,"3:7":true,"10:11":true,"4:10":true,"15:6":true,"3:9":true,"12:12":true,"0:9":179,"7:11":true,"2:6":true} \ No newline at end of file +{ + "15:9": true, + "12:11": true, + "2:7": true, + "8:8": true, + "7:12": true, + "6:10": true, + "13:13": true, + "14:9": true, + "11:11": true, + "10:12": true, + "2:9": true, + "15:7": true, + "14:7": true, + "9:12": true, + "13:10": true, + "1:8": true, + "10:10": true, + "8:7": true, + "4:11": true, + "2:8": true, + "9:10": true, + "5:11": true, + "1:9": true, + "15:8": true, + "8:9": true, + "7:10": true, + "6:12": true, + "1:7": true, + "14:8": true, + "14:14": true, + "12:6": true, + "2:12": true, + "10:9": true, + "7:7": true, + "1:10": true, + "13:8": true, + "15:14": true, + "9:9": true, + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": true, + "15:12": true, + "14:12": true, + "9:7": true, + "3:11": true, + "8:12": true, + "7:8": true, + "6:9": true, + "4:6": true, + "2:13": true, + "15:10": true, + "14:10": true, + "5:6": true, + "13:7": true, + "15:13": true, + "2:10": true, + "10:8": true, + "6:7": true, + "13:9": true, + "9:8": true, + "14:13": true, + "3:13": true, + "5:9": true, + "6:6": true, + "4:9": true, + "5:7": true, + "3:10": true, + "11:8": true, + "13:6": true, + "8:11": true, + "12:8": true, + "14:11": true, + "9:6": true, + "3:12": true, + "11:9": true, + "10:6": true, + "15:11": true, + "12:9": true, + "11:7": true, + "5:8": true, + "12:7": true, + "7:6": true, + "4:8": true, + "2:11": true, + "11:10": true, + "3:8": true, + "12:10": true, + "0:8": true, + "6:11": true, + "11:13": true, + "5:12": true, + "13:11": true, + "8:6": true, + "4:12": true, + "12:13": true, + "14:6": true, + "5:10": true, + "9:11": true, + "3:7": true, + "10:11": true, + "4:10": true, + "15:6": true, + "3:9": true, + "12:12": true, + "0:9": 179, + "7:11": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_3.json index a3278b89..d250466e 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_3.json @@ -1 +1,42 @@ -{"15:9":true,"14:9":true,"9:10":true,"4:5":169,"3:2":true,"15:8":[198,199],"3:4":[169,170],"3:3":true,"14:8":[198,199],"2:1":173,"10:9":true,"13:8":199,"4:4":true,"8:10":true,"4:2":true,"5:2":174,"12:3":true,"12:2":true,"11:2":[186,187],"13:9":true,"10:2":186,"4:1":[173,174],"13:3":true,"3:1":173,"10:11":true} \ No newline at end of file +{ + "15:9": true, + "14:9": true, + "9:10": true, + "4:5": 169, + "3:2": true, + "15:8": [ + 198, + 199 + ], + "3:4": [ + 169, + 170 + ], + "3:3": true, + "14:8": [ + 198, + 199 + ], + "2:1": 173, + "10:9": true, + "13:8": 199, + "4:4": true, + "8:10": true, + "4:2": true, + "5:2": 174, + "12:3": true, + "12:2": true, + "11:2": [ + 186, + 187 + ], + "13:9": true, + "10:2": 186, + "4:1": [ + 173, + 174 + ], + "13:3": true, + "3:1": 173, + "10:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_4.json index 789747c8..232e64b6 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_4.json @@ -1 +1,82 @@ -{"9:3":true,"6:0":true,"1:1":true,"11:5":true,"10:4":true,"10:3":true,"1:5":true,"7:2":true,"6:6":true,"11:1":true,"9:4":true,"8:5":true,"7:4":true,"3:0":true,"9:2":true,"0:6":true,"0:0":true,"8:1":true,"3:6":true,"10:2":true,"7:3":true,"9:6":true,"5:5":true,"4:1":true,"0:2":true,"6:4":true,"5:1":true,"4:5":true,"3:2":true,"9:0":true,"6:3":true,"7:0":true,"3:4":true,"2:5":true,"0:3":true,"3:3":true,"0:4":true,"6:2":true,"7:6":true,"2:1":true,"4:3":true,"1:6":true,"5:4":true,"6:5":true,"5:3":true,"2:2":true,"6:1":true,"1:0":true,"4:4":true,"3:5":true,"2:4":true,"8:0":true,"4:2":true,"0:1":true,"8:6":true,"3:1":true,"5:2":true,"2:3":true,"0:5":true,"11:4":true,"10:5":true,"9:1":true,"4:6":true,"1:3":true,"5:0":true,"10:1":true,"9:5":true,"5:6":true,"11:3":true,"8:2":true,"1:4":true,"4:0":true,"2:0":true,"8:4":true,"1:2":true,"7:5":true,"11:2":true,"8:3":true,"7:1":true,"2:6":true} \ No newline at end of file +{ + "9:3": true, + "6:0": true, + "1:1": true, + "11:5": true, + "10:4": true, + "10:3": true, + "1:5": true, + "7:2": true, + "6:6": true, + "11:1": true, + "9:4": true, + "8:5": true, + "7:4": true, + "3:0": true, + "9:2": true, + "0:6": true, + "0:0": true, + "8:1": true, + "3:6": true, + "10:2": true, + "7:3": true, + "9:6": true, + "5:5": true, + "4:1": true, + "0:2": true, + "6:4": true, + "5:1": true, + "4:5": true, + "3:2": true, + "9:0": true, + "6:3": true, + "7:0": true, + "3:4": true, + "2:5": true, + "0:3": true, + "3:3": true, + "0:4": true, + "6:2": true, + "7:6": true, + "2:1": true, + "4:3": true, + "1:6": true, + "5:4": true, + "6:5": true, + "5:3": true, + "2:2": true, + "6:1": true, + "1:0": true, + "4:4": true, + "3:5": true, + "2:4": true, + "8:0": true, + "4:2": true, + "0:1": true, + "8:6": true, + "3:1": true, + "5:2": true, + "2:3": true, + "0:5": true, + "11:4": true, + "10:5": true, + "9:1": true, + "4:6": true, + "1:3": true, + "5:0": true, + "10:1": true, + "9:5": true, + "5:6": true, + "11:3": true, + "8:2": true, + "1:4": true, + "4:0": true, + "2:0": true, + "8:4": true, + "1:2": true, + "7:5": true, + "11:2": true, + "8:3": true, + "7:1": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_5.json index e9b7db0b..8e06143e 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_5.json @@ -1 +1,41 @@ -{"12:1":true,"1:1":true,"11:5":202,"12:5":true,"1:5":true,"11:1":true,"8:5":true,"8:1":true,"10:2":true,"14:1":true,"5:5":true,"4:1":true,"0:2":true,"15:5":true,"14:5":true,"5:1":true,"4:5":true,"15:1":true,"2:5":true,"0:3":true,"0:4":true,"2:1":true,"6:5":true,"6:1":true,"3:5":true,"13:1":true,"0:1":true,"3:1":true,"13:5":true,"0:5":true,"10:5":[198,202],"9:1":true,"10:1":true,"9:5":true,"7:5":true,"7:1":true} \ No newline at end of file +{ + "12:1": true, + "1:1": true, + "11:5": 202, + "12:5": true, + "1:5": true, + "11:1": true, + "8:5": true, + "8:1": true, + "10:2": true, + "14:1": true, + "5:5": true, + "4:1": true, + "0:2": true, + "15:5": true, + "14:5": true, + "5:1": true, + "4:5": true, + "15:1": true, + "2:5": true, + "0:3": true, + "0:4": true, + "2:1": true, + "6:5": true, + "6:1": true, + "3:5": true, + "13:1": true, + "0:1": true, + "3:1": true, + "13:5": true, + "0:5": true, + "10:5": [ + 198, + 202 + ], + "9:1": true, + "10:1": true, + "9:5": true, + "7:5": true, + "7:1": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_6.json index e47f1f03..29c4dc07 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_6.json @@ -1 +1,31 @@ -{"3:13":[146,147],"0:13":true,"14:1":true,"4:11":true,"3:12":true,"0:15":true,"5:11":[144,145],"0:12":true,"0:14":true,"4:12":[145,146],"2:14":[147,148],"2:13":true,"1:14":true,"1:15":[148,149]} \ No newline at end of file +{ + "3:13": [ + 146, + 147 + ], + "0:13": true, + "14:1": true, + "4:11": true, + "3:12": true, + "0:15": true, + "5:11": [ + 144, + 145 + ], + "0:12": true, + "0:14": true, + "4:12": [ + 145, + 146 + ], + "2:14": [ + 147, + 148 + ], + "2:13": true, + "1:14": true, + "1:15": [ + 148, + 149 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_7.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_7.json index 3154cd03..d3cf2923 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_7.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_7.json @@ -1 +1,85 @@ -{"7:15":true,"2:9":158,"0:6":[157,159],"0:0":true,"3:6":true,"7:14":true,"13:15":152,"5:5":true,"0:2":true,"4:5":true,"13:12":true,"6:14":true,"1:9":true,"3:4":149,"0:3":151,"1:7":146,"6:15":true,"5:4":true,"2:12":true,"2:15":true,"1:10":true,"4:4":true,"3:5":true,"15:12":222,"0:11":true,"14:12":true,"2:14":true,"1:13":true,"0:5":157,"4:6":true,"2:13":true,"1:14":true,"5:6":true,"2:10":true,"1:15":true,"1:12":true,"3:13":true,"0:13":true,"6:6":true,"7:4":true,"0:10":true,"7:3":true,"3:12":true,"0:15":[151,159],"6:4":true,"3:15":true,"0:12":true,"2:5":149,"0:14":true,"3:14":true,"6:2":156,"7:6":true,"4:14":true,"1:6":[147,149],"6:5":true,"5:14":true,"0:8":[147,160],"4:15":true,"0:1":true,"8:6":true,"4:12":true,"0:7":[147,159],"5:13":true,"1:2":true,"12:12":true,"0:9":true,"4:13":true,"2:6":true} \ No newline at end of file +{ + "7:15": true, + "2:9": 158, + "0:6": [ + 157, + 159 + ], + "0:0": true, + "3:6": true, + "7:14": true, + "13:15": 152, + "5:5": true, + "0:2": true, + "4:5": true, + "13:12": true, + "6:14": true, + "1:9": true, + "3:4": 149, + "0:3": 151, + "1:7": 146, + "6:15": true, + "5:4": true, + "2:12": true, + "2:15": true, + "1:10": true, + "4:4": true, + "3:5": true, + "15:12": 222, + "0:11": true, + "14:12": true, + "2:14": true, + "1:13": true, + "0:5": 157, + "4:6": true, + "2:13": true, + "1:14": true, + "5:6": true, + "2:10": true, + "1:15": true, + "1:12": true, + "3:13": true, + "0:13": true, + "6:6": true, + "7:4": true, + "0:10": true, + "7:3": true, + "3:12": true, + "0:15": [ + 151, + 159 + ], + "6:4": true, + "3:15": true, + "0:12": true, + "2:5": 149, + "0:14": true, + "3:14": true, + "6:2": 156, + "7:6": true, + "4:14": true, + "1:6": [ + 147, + 149 + ], + "6:5": true, + "5:14": true, + "0:8": [ + 147, + 160 + ], + "4:15": true, + "0:1": true, + "8:6": true, + "4:12": true, + "0:7": [ + 147, + 159 + ], + "5:13": true, + "1:2": true, + "12:12": true, + "0:9": true, + "4:13": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_8.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_8.json index 575f6f03..4863ca14 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_8.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_8.json @@ -1 +1,265 @@ -{"13:13":[172,173],"3:0":true,"0:6":[149,155],"0:0":[153,159],"14:1":true,"13:15":true,"4:11":true,"0:2":true,"5:11":true,"13:12":172,"3:2":[153,155],"13:14":true,"0:3":true,"0:4":[149,154],"2:1":[153,154],"14:14":174,"4:3":true,"5:4":[152,153],"2:12":true,"5:3":[154,155],"2:15":true,"15:14":157,"15:12":true,"14:15":true,"13:1":154,"4:2":[156,158],"0:11":true,"15:15":[136,175],"2:14":true,"1:13":true,"0:5":[149,154],"1:14":true,"4:0":true,"15:13":true,"1:15":true,"10:8":166,"1:12":true,"1:11":true,"3:13":true,"0:13":true,"13:6":157,"13:0":true,"12:8":153,"13:2":true,"4:1":true,"3:12":true,"0:15":true,"11:9":167,"14:5":157,"3:15":true,"0:12":true,"12:9":[168,169],"0:14":true,"13:4":157,"12:7":[154,156],"3:14":true,"2:11":true,"15:4":154,"14:3":155,"4:14":true,"11:10":167,"12:10":[169,170],"5:14":true,"15:3":153,"1:0":153,"5:12":true,"14:2":155,"13:11":[153,171],"4:15":true,"0:1":[154,156],"4:12":true,"3:1":[155,158],"13:5":157,"5:15":true,"15:0":true,"14:6":157,"15:6":157,"2:0":true,"5:13":true,"4:13":true,"15:9":true,"12:11":[153,170],"9:14":true,"11:5":156,"12:5":157,"10:14":true,"7:15":true,"14:9":157,"11:11":[151,152],"10:12":[149,153],"6:13":true,"15:7":157,"9:15":true,"14:7":157,"9:12":true,"8:1":true,"13:10":152,"10:15":true,"7:14":true,"7:13":true,"6:14":true,"15:8":157,"10:13":true,"6:12":true,"6:15":true,"14:8":157,"9:13":true,"12:6":157,"8:13":true,"1:10":true,"13:8":[154,156],"6:1":true,"11:6":[153,156],"12:3":true,"11:4":157,"9:1":true,"8:12":true,"15:10":true,"14:10":[153,156],"13:7":157,"12:4":157,"11:3":true,"8:15":true,"11:2":true,"8:14":true,"13:9":[153,156],"7:1":true,"9:3":true,"6:0":true,"10:4":157,"10:3":true,"9:4":156,"8:5":true,"7:4":[153,156],"9:2":true,"10:2":true,"0:10":[149,182],"7:3":true,"6:4":[152,155],"10:6":[153,154],"6:3":156,"7:0":true,"0:8":[149,157],"6:11":true,"11:13":155,"8:0":true,"12:13":155,"12:14":true,"10:5":[155,156],"5:10":183,"9:5":true,"11:14":true,"0:7":[148,155],"12:15":true,"11:12":[150,154],"8:4":[155,157],"7:5":true,"12:12":154,"11:15":true,"8:3":158,"0:9":[151,157]} \ No newline at end of file +{ + "13:13": [ + 172, + 173 + ], + "3:0": true, + "0:6": [ + 149, + 155 + ], + "0:0": [ + 153, + 159 + ], + "14:1": true, + "13:15": true, + "4:11": true, + "0:2": true, + "5:11": true, + "13:12": 172, + "3:2": [ + 153, + 155 + ], + "13:14": true, + "0:3": true, + "0:4": [ + 149, + 154 + ], + "2:1": [ + 153, + 154 + ], + "14:14": 174, + "4:3": true, + "5:4": [ + 152, + 153 + ], + "2:12": true, + "5:3": [ + 154, + 155 + ], + "2:15": true, + "15:14": 157, + "15:12": true, + "14:15": true, + "13:1": 154, + "4:2": [ + 156, + 158 + ], + "0:11": true, + "15:15": [ + 136, + 175 + ], + "2:14": true, + "1:13": true, + "0:5": [ + 149, + 154 + ], + "1:14": true, + "4:0": true, + "15:13": true, + "1:15": true, + "10:8": 166, + "1:12": true, + "1:11": true, + "3:13": true, + "0:13": true, + "13:6": 157, + "13:0": true, + "12:8": 153, + "13:2": true, + "4:1": true, + "3:12": true, + "0:15": true, + "11:9": 167, + "14:5": 157, + "3:15": true, + "0:12": true, + "12:9": [ + 168, + 169 + ], + "0:14": true, + "13:4": 157, + "12:7": [ + 154, + 156 + ], + "3:14": true, + "2:11": true, + "15:4": 154, + "14:3": 155, + "4:14": true, + "11:10": 167, + "12:10": [ + 169, + 170 + ], + "5:14": true, + "15:3": 153, + "1:0": 153, + "5:12": true, + "14:2": 155, + "13:11": [ + 153, + 171 + ], + "4:15": true, + "0:1": [ + 154, + 156 + ], + "4:12": true, + "3:1": [ + 155, + 158 + ], + "13:5": 157, + "5:15": true, + "15:0": true, + "14:6": 157, + "15:6": 157, + "2:0": true, + "5:13": true, + "4:13": true, + "15:9": true, + "12:11": [ + 153, + 170 + ], + "9:14": true, + "11:5": 156, + "12:5": 157, + "10:14": true, + "7:15": true, + "14:9": 157, + "11:11": [ + 151, + 152 + ], + "10:12": [ + 149, + 153 + ], + "6:13": true, + "15:7": 157, + "9:15": true, + "14:7": 157, + "9:12": true, + "8:1": true, + "13:10": 152, + "10:15": true, + "7:14": true, + "7:13": true, + "6:14": true, + "15:8": 157, + "10:13": true, + "6:12": true, + "6:15": true, + "14:8": 157, + "9:13": true, + "12:6": 157, + "8:13": true, + "1:10": true, + "13:8": [ + 154, + 156 + ], + "6:1": true, + "11:6": [ + 153, + 156 + ], + "12:3": true, + "11:4": 157, + "9:1": true, + "8:12": true, + "15:10": true, + "14:10": [ + 153, + 156 + ], + "13:7": 157, + "12:4": 157, + "11:3": true, + "8:15": true, + "11:2": true, + "8:14": true, + "13:9": [ + 153, + 156 + ], + "7:1": true, + "9:3": true, + "6:0": true, + "10:4": 157, + "10:3": true, + "9:4": 156, + "8:5": true, + "7:4": [ + 153, + 156 + ], + "9:2": true, + "10:2": true, + "0:10": [ + 149, + 182 + ], + "7:3": true, + "6:4": [ + 152, + 155 + ], + "10:6": [ + 153, + 154 + ], + "6:3": 156, + "7:0": true, + "0:8": [ + 149, + 157 + ], + "6:11": true, + "11:13": 155, + "8:0": true, + "12:13": 155, + "12:14": true, + "10:5": [ + 155, + 156 + ], + "5:10": 183, + "9:5": true, + "11:14": true, + "0:7": [ + 148, + 155 + ], + "12:15": true, + "11:12": [ + 150, + 154 + ], + "8:4": [ + 155, + 157 + ], + "7:5": true, + "12:12": 154, + "11:15": true, + "8:3": 158, + "0:9": [ + 151, + 157 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_9.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_9.json index 9990588f..65c19273 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-8_9.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-8_9.json @@ -1 +1,213 @@ -{"1:1":true,"13:13":true,"3:0":true,"0:6":[171,173],"0:0":true,"3:6":174,"14:1":true,"10:10":[152,154],"8:7":true,"5:5":177,"0:2":true,"9:10":154,"4:5":176,"13:12":true,"3:2":true,"15:1":true,"3:4":true,"0:3":true,"8:9":154,"7:10":156,"3:3":true,"0:4":true,"2:1":true,"14:14":true,"4:3":true,"5:4":true,"10:9":152,"7:7":true,"5:3":true,"15:14":true,"9:9":153,"4:4":true,"10:7":true,"8:10":155,"7:9":155,"3:5":175,"15:12":true,"14:15":true,"13:1":true,"4:2":true,"15:15":true,"14:12":true,"9:7":true,"5:2":true,"0:5":[171,175],"7:8":154,"4:6":175,"5:0":true,"5:6":176,"4:0":true,"15:13":true,"10:8":true,"6:7":[175,176],"14:13":true,"1:5":[170,173],"11:8":true,"13:6":true,"13:0":true,"12:8":true,"14:11":true,"13:2":true,"4:1":true,"11:9":[137,142],"15:5":true,"14:5":true,"5:1":true,"15:11":true,"12:9":true,"13:3":true,"11:7":true,"2:5":174,"13:4":true,"12:7":true,"15:4":true,"14:3":true,"11:10":true,"12:10":true,"2:2":true,"15:3":true,"1:0":true,"14:4":true,"2:4":true,"14:2":true,"13:11":true,"0:1":true,"15:2":true,"3:1":true,"13:5":true,"2:3":true,"15:0":true,"14:6":true,"1:3":true,"1:4":true,"15:6":true,"14:0":true,"2:0":true,"1:2":true,"2:6":173,"15:9":true,"12:11":true,"9:14":true,"11:5":true,"7:12":true,"12:5":true,"10:14":true,"14:9":true,"11:11":true,"10:12":true,"15:7":true,"14:7":true,"9:12":true,"8:1":true,"13:10":true,"10:15":true,"7:13":155,"15:8":true,"10:13":true,"14:8":true,"9:13":true,"11:0":true,"12:6":true,"8:13":true,"13:8":true,"12:0":true,"6:1":true,"11:6":true,"12:3":true,"11:4":true,"9:1":true,"8:12":true,"15:10":true,"14:10":true,"10:1":true,"13:7":true,"12:4":true,"11:3":true,"12:2":true,"11:2":true,"13:9":true,"7:1":true,"12:1":true,"9:3":true,"6:0":true,"10:4":true,"10:3":true,"7:2":true,"6:6":177,"11:1":true,"9:4":true,"8:5":true,"5:7":[174,175],"7:4":true,"9:2":true,"8:11":true,"4:7":[173,174],"10:2":true,"7:3":true,"9:6":true,"6:4":true,"10:0":true,"10:6":true,"9:0":true,"6:3":true,"7:0":true,"6:2":true,"7:6":true,"6:5":true,"11:13":true,"8:0":true,"8:6":true,"12:13":true,"12:14":true,"10:5":true,"9:11":true,"3:7":173,"10:11":true,"9:5":true,"11:14":true,"8:2":true,"12:15":true,"11:12":true,"8:4":true,"7:5":true,"12:12":true,"11:15":true,"8:3":true,"7:11":true} \ No newline at end of file +{ + "1:1": true, + "13:13": true, + "3:0": true, + "0:6": [ + 171, + 173 + ], + "0:0": true, + "3:6": 174, + "14:1": true, + "10:10": [ + 152, + 154 + ], + "8:7": true, + "5:5": 177, + "0:2": true, + "9:10": 154, + "4:5": 176, + "13:12": true, + "3:2": true, + "15:1": true, + "3:4": true, + "0:3": true, + "8:9": 154, + "7:10": 156, + "3:3": true, + "0:4": true, + "2:1": true, + "14:14": true, + "4:3": true, + "5:4": true, + "10:9": 152, + "7:7": true, + "5:3": true, + "15:14": true, + "9:9": 153, + "4:4": true, + "10:7": true, + "8:10": 155, + "7:9": 155, + "3:5": 175, + "15:12": true, + "14:15": true, + "13:1": true, + "4:2": true, + "15:15": true, + "14:12": true, + "9:7": true, + "5:2": true, + "0:5": [ + 171, + 175 + ], + "7:8": 154, + "4:6": 175, + "5:0": true, + "5:6": 176, + "4:0": true, + "15:13": true, + "10:8": true, + "6:7": [ + 175, + 176 + ], + "14:13": true, + "1:5": [ + 170, + 173 + ], + "11:8": true, + "13:6": true, + "13:0": true, + "12:8": true, + "14:11": true, + "13:2": true, + "4:1": true, + "11:9": [ + 137, + 142 + ], + "15:5": true, + "14:5": true, + "5:1": true, + "15:11": true, + "12:9": true, + "13:3": true, + "11:7": true, + "2:5": 174, + "13:4": true, + "12:7": true, + "15:4": true, + "14:3": true, + "11:10": true, + "12:10": true, + "2:2": true, + "15:3": true, + "1:0": true, + "14:4": true, + "2:4": true, + "14:2": true, + "13:11": true, + "0:1": true, + "15:2": true, + "3:1": true, + "13:5": true, + "2:3": true, + "15:0": true, + "14:6": true, + "1:3": true, + "1:4": true, + "15:6": true, + "14:0": true, + "2:0": true, + "1:2": true, + "2:6": 173, + "15:9": true, + "12:11": true, + "9:14": true, + "11:5": true, + "7:12": true, + "12:5": true, + "10:14": true, + "14:9": true, + "11:11": true, + "10:12": true, + "15:7": true, + "14:7": true, + "9:12": true, + "8:1": true, + "13:10": true, + "10:15": true, + "7:13": 155, + "15:8": true, + "10:13": true, + "14:8": true, + "9:13": true, + "11:0": true, + "12:6": true, + "8:13": true, + "13:8": true, + "12:0": true, + "6:1": true, + "11:6": true, + "12:3": true, + "11:4": true, + "9:1": true, + "8:12": true, + "15:10": true, + "14:10": true, + "10:1": true, + "13:7": true, + "12:4": true, + "11:3": true, + "12:2": true, + "11:2": true, + "13:9": true, + "7:1": true, + "12:1": true, + "9:3": true, + "6:0": true, + "10:4": true, + "10:3": true, + "7:2": true, + "6:6": 177, + "11:1": true, + "9:4": true, + "8:5": true, + "5:7": [ + 174, + 175 + ], + "7:4": true, + "9:2": true, + "8:11": true, + "4:7": [ + 173, + 174 + ], + "10:2": true, + "7:3": true, + "9:6": true, + "6:4": true, + "10:0": true, + "10:6": true, + "9:0": true, + "6:3": true, + "7:0": true, + "6:2": true, + "7:6": true, + "6:5": true, + "11:13": true, + "8:0": true, + "8:6": true, + "12:13": true, + "12:14": true, + "10:5": true, + "9:11": true, + "3:7": 173, + "10:11": true, + "9:5": true, + "11:14": true, + "8:2": true, + "12:15": true, + "11:12": true, + "8:4": true, + "7:5": true, + "12:12": true, + "11:15": true, + "8:3": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-1.json index d31fa63e..3b14a2de 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-1.json @@ -1 +1,20 @@ -{"11:5":true,"8:5":true,"0:6":197,"7:14":[165,168],"10:6":true,"6:14":[166,167],"11:6":true,"10:7":true,"9:7":true,"5:15":166,"0:5":196,"8:14":true} \ No newline at end of file +{ + "11:5": true, + "8:5": true, + "0:6": 197, + "7:14": [ + 165, + 168 + ], + "10:6": true, + "6:14": [ + 166, + 167 + ], + "11:6": true, + "10:7": true, + "9:7": true, + "5:15": 166, + "0:5": 196, + "8:14": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-2.json index aca1f76c..3f60da15 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-2.json @@ -1 +1,36 @@ -{"0:6":true,"0:0":[168,212],"14:1":[169,170],"0:2":true,"3:4":true,"5:3":true,"13:1":169,"10:1":211,"10:3":211,"13:0":168,"10:2":211,"13:2":true,"15:5":true,"2:5":true,"14:3":168,"1:0":168,"14:2":169,"0:1":[167,216],"15:0":[169,170],"15:6":true,"14:0":168,"1:2":216} \ No newline at end of file +{ + "0:6": true, + "0:0": [ + 168, + 212 + ], + "14:1": [ + 169, + 170 + ], + "0:2": true, + "3:4": true, + "5:3": true, + "13:1": 169, + "10:1": 211, + "10:3": 211, + "13:0": 168, + "10:2": 211, + "13:2": true, + "15:5": true, + "2:5": true, + "14:3": 168, + "1:0": 168, + "14:2": 169, + "0:1": [ + 167, + 216 + ], + "15:0": [ + 169, + 170 + ], + "15:6": true, + "14:0": 168, + "1:2": 216 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-3.json index 9a2f6ba9..84181f40 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-3.json @@ -1 +1,31 @@ -{"12:5":true,"10:12":true,"10:13":true,"12:6":true,"15:14":185,"14:15":168,"15:15":169,"3:11":169,"12:4":210,"13:6":201,"13:2":211,"15:5":201,"14:5":201,"13:3":[210,211],"11:7":208,"13:4":[201,211],"12:7":201,"14:3":201,"14:4":true,"14:2":212,"13:5":201,"14:6":201,"10:11":true} \ No newline at end of file +{ + "12:5": true, + "10:12": true, + "10:13": true, + "12:6": true, + "15:14": 185, + "14:15": 168, + "15:15": 169, + "3:11": 169, + "12:4": 210, + "13:6": 201, + "13:2": 211, + "15:5": 201, + "14:5": 201, + "13:3": [ + 210, + 211 + ], + "11:7": 208, + "13:4": [ + 201, + 211 + ], + "12:7": 201, + "14:3": 201, + "14:4": true, + "14:2": 212, + "13:5": 201, + "14:6": 201, + "10:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-4.json index 3994b683..146a0bba 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-4.json @@ -1 +1,23 @@ -{"7:7":true,"5:9":true,"10:3":true,"0:13":true,"6:6":true,"4:9":true,"6:8":true,"5:7":true,"5:12":true,"7:8":true,"5:10":true,"1:3":true,"0:2":true,"5:11":true,"1:4":true,"0:12":true,"0:14":true,"1:2":true,"6:7":true,"5:8":true,"0:4":true} \ No newline at end of file +{ + "7:7": true, + "5:9": true, + "10:3": true, + "0:13": true, + "6:6": true, + "4:9": true, + "6:8": true, + "5:7": true, + "5:12": true, + "7:8": true, + "5:10": true, + "1:3": true, + "0:2": true, + "5:11": true, + "1:4": true, + "0:12": true, + "0:14": true, + "1:2": true, + "6:7": true, + "5:8": true, + "0:4": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-5.json index 8cf4d4b1..ead7e176 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-5.json @@ -1 +1,49 @@ -{"8:8":true,"6:6":true,"5:7":true,"0:0":188,"12:8":[172,173],"0:2":true,"10:10":[222,223],"14:5":[200,201],"9:10":224,"8:9":true,"5:8":true,"2:11":true,"15:4":[201,202],"2:12":true,"10:9":223,"7:7":true,"2:15":true,"9:9":true,"14:4":200,"8:10":true,"7:9":true,"6:8":true,"0:1":true,"2:14":true,"14:6":[200,201],"9:11":224,"7:8":true,"2:13":true,"10:11":223,"5:6":true,"13:7":172,"6:7":true} \ No newline at end of file +{ + "8:8": true, + "6:6": true, + "5:7": true, + "0:0": 188, + "12:8": [ + 172, + 173 + ], + "0:2": true, + "10:10": [ + 222, + 223 + ], + "14:5": [ + 200, + 201 + ], + "9:10": 224, + "8:9": true, + "5:8": true, + "2:11": true, + "15:4": [ + 201, + 202 + ], + "2:12": true, + "10:9": 223, + "7:7": true, + "2:15": true, + "9:9": true, + "14:4": 200, + "8:10": true, + "7:9": true, + "6:8": true, + "0:1": true, + "2:14": true, + "14:6": [ + 200, + 201 + ], + "9:11": 224, + "7:8": true, + "2:13": true, + "10:11": 223, + "5:6": true, + "13:7": 172, + "6:7": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-6.json index 69ff3534..2bb76172 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_-6.json @@ -1 +1,22 @@ -{"7:12":true,"0:2":201,"3:4":true,"0:3":[201,216],"6:12":true,"3:14":226,"7:6":true,"4:14":226,"5:14":true,"4:4":true,"2:4":true,"2:3":201,"1:3":201,"1:4":true,"5:13":true,"7:11":true,"4:13":true} \ No newline at end of file +{ + "7:12": true, + "0:2": 201, + "3:4": true, + "0:3": [ + 201, + 216 + ], + "6:12": true, + "3:14": 226, + "7:6": true, + "4:14": 226, + "5:14": true, + "4:4": true, + "2:4": true, + "2:3": 201, + "1:3": 201, + "1:4": true, + "5:13": true, + "7:11": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_0.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_0.json index 5d27980e..405d0278 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_0.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_0.json @@ -1 +1,29 @@ -{"12:1":true,"9:14":true,"8:13":true,"3:13":true,"0:13":true,"13:13":true,"10:14":true,"5:14":true,"12:0":true,"14:4":true,"11:1":true,"11:13":true,"6:13":true,"1:13":true,"7:14":true,"12:3":true,"7:13":true,"6:14":true,"15:13":true,"0:14":true,"12:2":true,"10:13":true,"5:13":true,"13:4":true,"11:2":true,"8:14":true,"9:13":true} \ No newline at end of file +{ + "12:1": true, + "9:14": true, + "8:13": true, + "3:13": true, + "0:13": true, + "13:13": true, + "10:14": true, + "5:14": true, + "12:0": true, + "14:4": true, + "11:1": true, + "11:13": true, + "6:13": true, + "1:13": true, + "7:14": true, + "12:3": true, + "7:13": true, + "6:14": true, + "15:13": true, + "0:14": true, + "12:2": true, + "10:13": true, + "5:13": true, + "13:4": true, + "11:2": true, + "8:14": true, + "9:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_2.json index f2607f0a..a73a600d 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_2.json @@ -1 +1,23 @@ -{"11:0":true,"15:9":true,"12:1":true,"12:11":true,"6:10":true,"13:13":[177,179],"12:10":true,"14:9":true,"12:0":true,"6:11":true,"11:1":true,"13:10":true,"12:8":true,"15:8":true,"12:2":true,"13:9":true,"14:8":true,"14:13":178} \ No newline at end of file +{ + "11:0": true, + "15:9": true, + "12:1": true, + "12:11": true, + "6:10": true, + "13:13": [ + 177, + 179 + ], + "12:10": true, + "14:9": true, + "12:0": true, + "6:11": true, + "11:1": true, + "13:10": true, + "12:8": true, + "15:8": true, + "12:2": true, + "13:9": true, + "14:8": true, + "14:13": 178 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_3.json index 1ccf4ded..aee761df 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_3.json @@ -1 +1,6 @@ -{"10:7":true,"9:7":true,"10:6":true,"10:8":true} \ No newline at end of file +{ + "10:7": true, + "9:7": true, + "10:6": true, + "10:8": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_4.json index 4471b7ad..66948398 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_4.json @@ -1 +1,84 @@ -{"12:1":true,"9:3":true,"11:5":true,"10:4":true,"12:5":true,"10:3":true,"7:2":true,"11:1":true,"9:4":true,"8:5":true,"7:4":true,"13:6":true,"9:2":true,"13:0":true,"8:1":true,"10:2":true,"7:3":true,"14:1":true,"13:2":true,"9:6":true,"5:5":true,"6:4":true,"15:5":true,"10:0":true,"14:5":true,"10:6":true,"5:1":true,"15:1":true,"9:0":true,"6:3":true,"7:0":true,"0:3":true,"13:3":true,"13:4":true,"6:2":true,"7:6":true,"15:4":true,"11:0":true,"14:3":true,"12:6":true,"5:4":true,"6:5":true,"5:3":true,"15:3":true,"12:0":true,"6:1":true,"14:4":true,"11:6":true,"8:0":true,"14:2":true,"13:1":true,"0:1":[174,175],"15:2":true,"8:6":true,"13:5":true,"5:2":true,"0:5":[174,175],"15:0":true,"14:6":true,"12:3":true,"11:4":true,"10:5":true,"9:1":true,"10:1":true,"9:5":true,"12:4":true,"11:3":true,"8:2":true,"15:6":true,"14:0":true,"12:2":true,"8:4":true,"7:5":true,"11:2":true,"8:3":true,"7:1":true} \ No newline at end of file +{ + "12:1": true, + "9:3": true, + "11:5": true, + "10:4": true, + "12:5": true, + "10:3": true, + "7:2": true, + "11:1": true, + "9:4": true, + "8:5": true, + "7:4": true, + "13:6": true, + "9:2": true, + "13:0": true, + "8:1": true, + "10:2": true, + "7:3": true, + "14:1": true, + "13:2": true, + "9:6": true, + "5:5": true, + "6:4": true, + "15:5": true, + "10:0": true, + "14:5": true, + "10:6": true, + "5:1": true, + "15:1": true, + "9:0": true, + "6:3": true, + "7:0": true, + "0:3": true, + "13:3": true, + "13:4": true, + "6:2": true, + "7:6": true, + "15:4": true, + "11:0": true, + "14:3": true, + "12:6": true, + "5:4": true, + "6:5": true, + "5:3": true, + "15:3": true, + "12:0": true, + "6:1": true, + "14:4": true, + "11:6": true, + "8:0": true, + "14:2": true, + "13:1": true, + "0:1": [ + 174, + 175 + ], + "15:2": true, + "8:6": true, + "13:5": true, + "5:2": true, + "0:5": [ + 174, + 175 + ], + "15:0": true, + "14:6": true, + "12:3": true, + "11:4": true, + "10:5": true, + "9:1": true, + "10:1": true, + "9:5": true, + "12:4": true, + "11:3": true, + "8:2": true, + "15:6": true, + "14:0": true, + "12:2": true, + "8:4": true, + "7:5": true, + "11:2": true, + "8:3": true, + "7:1": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_7.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_7.json index 771280f8..822d27e8 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_7.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_7.json @@ -1 +1,292 @@ -{"1:1":true,"8:8":true,"6:10":true,"13:13":true,"3:0":true,"0:6":true,"0:0":true,"3:6":true,"14:1":true,"10:10":true,"8:7":true,"5:5":true,"4:11":true,"0:2":true,"9:10":true,"5:11":true,"4:5":true,"13:12":true,"3:2":true,"15:1":true,"3:4":true,"0:3":true,"8:9":true,"7:10":true,"3:3":true,"0:4":true,"2:1":true,"4:3":true,"5:4":true,"2:12":[152,154],"10:9":true,"7:7":true,"5:3":true,"15:14":[154,155],"9:9":true,"4:4":true,"10:7":true,"8:10":true,"7:9":true,"6:8":true,"3:5":true,"15:12":true,"13:1":true,"4:2":true,"0:11":true,"14:12":true,"9:7":true,"3:11":[154,173],"5:2":true,"1:13":true,"0:5":true,"2:13":[149,151],"7:8":true,"6:9":true,"4:6":true,"1:14":true,"5:0":true,"5:6":true,"4:0":true,"15:13":true,"1:15":true,"10:8":true,"6:7":true,"1:12":true,"9:8":true,"14:13":true,"1:11":true,"3:13":true,"1:5":true,"0:13":true,"11:8":true,"13:6":true,"13:0":true,"12:8":true,"14:11":true,"13:2":true,"4:1":true,"3:12":[150,175],"0:15":true,"11:9":true,"14:5":true,"5:1":true,"3:15":true,"0:12":true,"15:11":true,"12:9":true,"13:3":true,"11:7":true,"2:5":true,"0:14":true,"13:4":true,"12:7":true,"3:14":[164,175],"2:11":155,"15:4":true,"14:3":true,"1:6":true,"11:10":true,"12:10":true,"2:2":true,"15:3":true,"1:0":true,"14:4":true,"5:12":[147,152],"2:4":true,"14:2":true,"13:11":true,"0:1":true,"15:2":true,"4:12":[148,152],"3:1":true,"13:5":true,"2:3":true,"15:0":true,"14:6":true,"1:3":true,"1:4":true,"15:6":150,"14:0":true,"2:0":true,"5:13":147,"1:2":true,"2:6":true,"15:9":true,"12:11":true,"9:14":152,"11:5":true,"2:7":true,"7:12":true,"12:5":true,"10:14":151,"7:15":[149,151],"14:9":true,"11:11":true,"10:12":151,"6:13":[148,149],"2:9":true,"15:7":[148,157],"9:15":152,"14:7":true,"9:12":151,"8:1":true,"13:10":true,"10:15":152,"7:14":[148,151],"1:8":true,"7:13":true,"2:8":true,"6:14":[146,147],"1:9":[155,202],"15:8":true,"10:13":151,"6:12":true,"1:7":true,"6:15":[146,148],"14:8":true,"9:13":true,"12:6":true,"8:13":true,"1:10":true,"13:8":true,"6:1":true,"11:6":true,"12:3":true,"11:4":true,"8:12":true,"15:10":true,"14:10":true,"13:7":true,"12:4":true,"11:3":true,"8:15":152,"12:2":true,"2:10":[155,192],"11:2":true,"8:14":152,"13:9":true,"7:1":true,"12:1":true,"9:3":true,"6:0":true,"10:4":true,"5:9":true,"10:3":true,"7:2":true,"4:9":true,"9:4":true,"8:5":true,"5:7":true,"3:10":true,"7:4":true,"9:2":true,"8:11":true,"4:7":true,"10:2":true,"0:10":true,"7:3":true,"9:6":true,"10:6":true,"6:3":true,"7:0":true,"5:8":true,"6:2":true,"7:6":true,"4:8":true,"3:8":true,"0:8":[156,202],"6:11":true,"11:13":[149,150],"8:6":true,"12:13":[147,148],"10:5":true,"9:11":true,"5:10":true,"3:7":true,"10:11":true,"9:5":true,"4:10":true,"11:14":true,"8:2":true,"0:7":true,"11:12":150,"8:4":true,"7:5":true,"3:9":true,"12:12":true,"11:15":true,"8:3":true,"0:9":[156,194],"7:11":true} \ No newline at end of file +{ + "1:1": true, + "8:8": true, + "6:10": true, + "13:13": true, + "3:0": true, + "0:6": true, + "0:0": true, + "3:6": true, + "14:1": true, + "10:10": true, + "8:7": true, + "5:5": true, + "4:11": true, + "0:2": true, + "9:10": true, + "5:11": true, + "4:5": true, + "13:12": true, + "3:2": true, + "15:1": true, + "3:4": true, + "0:3": true, + "8:9": true, + "7:10": true, + "3:3": true, + "0:4": true, + "2:1": true, + "4:3": true, + "5:4": true, + "2:12": [ + 152, + 154 + ], + "10:9": true, + "7:7": true, + "5:3": true, + "15:14": [ + 154, + 155 + ], + "9:9": true, + "4:4": true, + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": true, + "3:5": true, + "15:12": true, + "13:1": true, + "4:2": true, + "0:11": true, + "14:12": true, + "9:7": true, + "3:11": [ + 154, + 173 + ], + "5:2": true, + "1:13": true, + "0:5": true, + "2:13": [ + 149, + 151 + ], + "7:8": true, + "6:9": true, + "4:6": true, + "1:14": true, + "5:0": true, + "5:6": true, + "4:0": true, + "15:13": true, + "1:15": true, + "10:8": true, + "6:7": true, + "1:12": true, + "9:8": true, + "14:13": true, + "1:11": true, + "3:13": true, + "1:5": true, + "0:13": true, + "11:8": true, + "13:6": true, + "13:0": true, + "12:8": true, + "14:11": true, + "13:2": true, + "4:1": true, + "3:12": [ + 150, + 175 + ], + "0:15": true, + "11:9": true, + "14:5": true, + "5:1": true, + "3:15": true, + "0:12": true, + "15:11": true, + "12:9": true, + "13:3": true, + "11:7": true, + "2:5": true, + "0:14": true, + "13:4": true, + "12:7": true, + "3:14": [ + 164, + 175 + ], + "2:11": 155, + "15:4": true, + "14:3": true, + "1:6": true, + "11:10": true, + "12:10": true, + "2:2": true, + "15:3": true, + "1:0": true, + "14:4": true, + "5:12": [ + 147, + 152 + ], + "2:4": true, + "14:2": true, + "13:11": true, + "0:1": true, + "15:2": true, + "4:12": [ + 148, + 152 + ], + "3:1": true, + "13:5": true, + "2:3": true, + "15:0": true, + "14:6": true, + "1:3": true, + "1:4": true, + "15:6": 150, + "14:0": true, + "2:0": true, + "5:13": 147, + "1:2": true, + "2:6": true, + "15:9": true, + "12:11": true, + "9:14": 152, + "11:5": true, + "2:7": true, + "7:12": true, + "12:5": true, + "10:14": 151, + "7:15": [ + 149, + 151 + ], + "14:9": true, + "11:11": true, + "10:12": 151, + "6:13": [ + 148, + 149 + ], + "2:9": true, + "15:7": [ + 148, + 157 + ], + "9:15": 152, + "14:7": true, + "9:12": 151, + "8:1": true, + "13:10": true, + "10:15": 152, + "7:14": [ + 148, + 151 + ], + "1:8": true, + "7:13": true, + "2:8": true, + "6:14": [ + 146, + 147 + ], + "1:9": [ + 155, + 202 + ], + "15:8": true, + "10:13": 151, + "6:12": true, + "1:7": true, + "6:15": [ + 146, + 148 + ], + "14:8": true, + "9:13": true, + "12:6": true, + "8:13": true, + "1:10": true, + "13:8": true, + "6:1": true, + "11:6": true, + "12:3": true, + "11:4": true, + "8:12": true, + "15:10": true, + "14:10": true, + "13:7": true, + "12:4": true, + "11:3": true, + "8:15": 152, + "12:2": true, + "2:10": [ + 155, + 192 + ], + "11:2": true, + "8:14": 152, + "13:9": true, + "7:1": true, + "12:1": true, + "9:3": true, + "6:0": true, + "10:4": true, + "5:9": true, + "10:3": true, + "7:2": true, + "4:9": true, + "9:4": true, + "8:5": true, + "5:7": true, + "3:10": true, + "7:4": true, + "9:2": true, + "8:11": true, + "4:7": true, + "10:2": true, + "0:10": true, + "7:3": true, + "9:6": true, + "10:6": true, + "6:3": true, + "7:0": true, + "5:8": true, + "6:2": true, + "7:6": true, + "4:8": true, + "3:8": true, + "0:8": [ + 156, + 202 + ], + "6:11": true, + "11:13": [ + 149, + 150 + ], + "8:6": true, + "12:13": [ + 147, + 148 + ], + "10:5": true, + "9:11": true, + "5:10": true, + "3:7": true, + "10:11": true, + "9:5": true, + "4:10": true, + "11:14": true, + "8:2": true, + "0:7": true, + "11:12": 150, + "8:4": true, + "7:5": true, + "3:9": true, + "12:12": true, + "11:15": true, + "8:3": true, + "0:9": [ + 156, + 194 + ], + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_8.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_8.json index d412a806..dec30d93 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_8.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_8.json @@ -1 +1,279 @@ -{"1:1":true,"8:8":true,"6:10":true,"13:13":true,"3:0":true,"0:6":true,"0:0":true,"3:6":true,"13:15":true,"10:10":true,"8:7":true,"5:5":true,"4:11":true,"0:2":true,"9:10":true,"5:11":true,"4:5":true,"13:12":true,"3:2":true,"13:14":true,"3:4":true,"0:3":true,"8:9":true,"7:10":true,"3:3":true,"0:4":true,"2:1":true,"14:14":true,"4:3":true,"5:4":true,"2:12":true,"10:9":true,"7:7":true,"5:3":true,"2:15":true,"15:14":true,"9:9":true,"4:4":true,"8:10":true,"7:9":true,"6:8":true,"3:5":true,"15:12":true,"14:15":true,"4:2":true,"0:11":true,"15:15":true,"14:12":true,"9:7":true,"3:11":true,"5:2":true,"2:14":true,"1:13":true,"0:5":true,"2:13":true,"7:8":true,"6:9":true,"4:6":true,"1:14":true,"5:0":true,"5:6":true,"15:13":true,"1:15":true,"10:8":true,"6:7":true,"1:12":true,"9:8":true,"14:13":true,"1:11":true,"3:13":true,"1:5":true,"0:13":true,"11:8":true,"13:6":155,"12:8":true,"14:11":true,"4:1":true,"3:12":true,"0:15":true,"11:9":true,"14:5":[151,152],"5:1":true,"3:15":true,"0:12":true,"15:11":true,"12:9":true,"13:3":[152,153],"11:7":true,"2:5":true,"0:14":true,"13:4":[149,153],"12:7":true,"2:11":true,"4:14":true,"1:6":true,"11:10":true,"12:10":true,"5:14":true,"2:2":true,"1:0":true,"5:12":true,"2:4":true,"13:11":true,"4:15":true,"0:1":true,"4:12":true,"3:1":true,"13:5":[147,154],"5:15":true,"2:3":true,"14:6":[148,154],"1:3":true,"1:4":true,"2:0":true,"5:13":true,"4:13":true,"2:6":true,"15:9":true,"12:11":true,"9:14":true,"2:7":true,"7:12":true,"12:5":155,"10:14":true,"7:15":true,"14:9":true,"11:11":true,"10:12":true,"6:13":true,"2:9":true,"15:7":[150,154],"9:15":true,"14:7":[148,155],"9:12":true,"8:1":152,"13:10":true,"10:15":true,"7:14":true,"1:8":true,"7:13":true,"2:8":true,"6:14":true,"1:9":true,"15:8":[150,155],"10:13":true,"6:12":true,"1:7":true,"6:15":true,"14:8":true,"9:13":true,"11:0":[146,151],"12:6":true,"8:13":true,"1:10":true,"6:1":true,"11:6":true,"11:4":154,"9:1":153,"8:12":true,"12:3":[147,154],"15:10":true,"14:10":true,"10:1":153,"12:4":[146,154],"11:3":[146,154],"8:15":true,"12:2":[149,153],"2:10":true,"11:2":[147,153],"8:14":true,"13:9":true,"7:1":152,"9:3":true,"6:0":[148,151],"10:4":true,"5:9":true,"10:3":154,"7:2":true,"6:6":true,"4:9":true,"11:1":[148,152],"9:4":true,"5:7":true,"3:10":true,"7:4":true,"9:2":153,"8:11":true,"4:7":true,"10:2":153,"0:10":true,"7:3":true,"9:6":true,"6:4":true,"10:0":152,"10:6":true,"9:0":152,"6:3":true,"7:0":152,"5:8":true,"6:2":true,"7:6":true,"4:8":true,"3:8":true,"0:8":true,"6:11":true,"11:13":true,"8:0":152,"8:6":true,"12:13":true,"12:14":true,"10:5":true,"9:11":true,"5:10":true,"3:7":true,"10:11":true,"9:5":true,"4:10":true,"11:14":true,"8:2":true,"0:7":true,"12:15":true,"11:12":true,"8:4":true,"3:9":true,"12:12":true,"11:15":true,"8:3":true,"0:9":true,"7:11":true} \ No newline at end of file +{ + "1:1": true, + "8:8": true, + "6:10": true, + "13:13": true, + "3:0": true, + "0:6": true, + "0:0": true, + "3:6": true, + "13:15": true, + "10:10": true, + "8:7": true, + "5:5": true, + "4:11": true, + "0:2": true, + "9:10": true, + "5:11": true, + "4:5": true, + "13:12": true, + "3:2": true, + "13:14": true, + "3:4": true, + "0:3": true, + "8:9": true, + "7:10": true, + "3:3": true, + "0:4": true, + "2:1": true, + "14:14": true, + "4:3": true, + "5:4": true, + "2:12": true, + "10:9": true, + "7:7": true, + "5:3": true, + "2:15": true, + "15:14": true, + "9:9": true, + "4:4": true, + "8:10": true, + "7:9": true, + "6:8": true, + "3:5": true, + "15:12": true, + "14:15": true, + "4:2": true, + "0:11": true, + "15:15": true, + "14:12": true, + "9:7": true, + "3:11": true, + "5:2": true, + "2:14": true, + "1:13": true, + "0:5": true, + "2:13": true, + "7:8": true, + "6:9": true, + "4:6": true, + "1:14": true, + "5:0": true, + "5:6": true, + "15:13": true, + "1:15": true, + "10:8": true, + "6:7": true, + "1:12": true, + "9:8": true, + "14:13": true, + "1:11": true, + "3:13": true, + "1:5": true, + "0:13": true, + "11:8": true, + "13:6": 155, + "12:8": true, + "14:11": true, + "4:1": true, + "3:12": true, + "0:15": true, + "11:9": true, + "14:5": [ + 151, + 152 + ], + "5:1": true, + "3:15": true, + "0:12": true, + "15:11": true, + "12:9": true, + "13:3": [ + 152, + 153 + ], + "11:7": true, + "2:5": true, + "0:14": true, + "13:4": [ + 149, + 153 + ], + "12:7": true, + "2:11": true, + "4:14": true, + "1:6": true, + "11:10": true, + "12:10": true, + "5:14": true, + "2:2": true, + "1:0": true, + "5:12": true, + "2:4": true, + "13:11": true, + "4:15": true, + "0:1": true, + "4:12": true, + "3:1": true, + "13:5": [ + 147, + 154 + ], + "5:15": true, + "2:3": true, + "14:6": [ + 148, + 154 + ], + "1:3": true, + "1:4": true, + "2:0": true, + "5:13": true, + "4:13": true, + "2:6": true, + "15:9": true, + "12:11": true, + "9:14": true, + "2:7": true, + "7:12": true, + "12:5": 155, + "10:14": true, + "7:15": true, + "14:9": true, + "11:11": true, + "10:12": true, + "6:13": true, + "2:9": true, + "15:7": [ + 150, + 154 + ], + "9:15": true, + "14:7": [ + 148, + 155 + ], + "9:12": true, + "8:1": 152, + "13:10": true, + "10:15": true, + "7:14": true, + "1:8": true, + "7:13": true, + "2:8": true, + "6:14": true, + "1:9": true, + "15:8": [ + 150, + 155 + ], + "10:13": true, + "6:12": true, + "1:7": true, + "6:15": true, + "14:8": true, + "9:13": true, + "11:0": [ + 146, + 151 + ], + "12:6": true, + "8:13": true, + "1:10": true, + "6:1": true, + "11:6": true, + "11:4": 154, + "9:1": 153, + "8:12": true, + "12:3": [ + 147, + 154 + ], + "15:10": true, + "14:10": true, + "10:1": 153, + "12:4": [ + 146, + 154 + ], + "11:3": [ + 146, + 154 + ], + "8:15": true, + "12:2": [ + 149, + 153 + ], + "2:10": true, + "11:2": [ + 147, + 153 + ], + "8:14": true, + "13:9": true, + "7:1": 152, + "9:3": true, + "6:0": [ + 148, + 151 + ], + "10:4": true, + "5:9": true, + "10:3": 154, + "7:2": true, + "6:6": true, + "4:9": true, + "11:1": [ + 148, + 152 + ], + "9:4": true, + "5:7": true, + "3:10": true, + "7:4": true, + "9:2": 153, + "8:11": true, + "4:7": true, + "10:2": 153, + "0:10": true, + "7:3": true, + "9:6": true, + "6:4": true, + "10:0": 152, + "10:6": true, + "9:0": 152, + "6:3": true, + "7:0": 152, + "5:8": true, + "6:2": true, + "7:6": true, + "4:8": true, + "3:8": true, + "0:8": true, + "6:11": true, + "11:13": true, + "8:0": 152, + "8:6": true, + "12:13": true, + "12:14": true, + "10:5": true, + "9:11": true, + "5:10": true, + "3:7": true, + "10:11": true, + "9:5": true, + "4:10": true, + "11:14": true, + "8:2": true, + "0:7": true, + "12:15": true, + "11:12": true, + "8:4": true, + "3:9": true, + "12:12": true, + "11:15": true, + "8:3": true, + "0:9": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_9.json b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_9.json index 27bc3ed4..e59d8282 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/-9_9.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/-9_9.json @@ -1 +1,74 @@ -{"12:1":true,"9:3":true,"11:5":true,"10:4":true,"12:5":true,"10:3":true,"7:2":true,"11:1":true,"7:4":149,"9:2":true,"13:0":true,"0:0":true,"8:1":true,"10:2":true,"7:3":true,"14:1":true,"13:2":true,"4:1":true,"15:5":true,"10:0":true,"14:5":true,"5:1":true,"3:2":true,"15:1":true,"9:0":true,"6:3":true,"7:0":true,"13:3":true,"13:4":true,"6:2":true,"2:1":true,"15:4":true,"11:0":true,"14:3":true,"12:6":153,"5:3":true,"15:3":true,"12:0":true,"6:1":true,"1:0":true,"14:4":true,"8:0":true,"14:2":true,"13:1":true,"4:2":true,"15:2":true,"3:1":true,"13:5":true,"5:2":true,"15:0":true,"12:3":true,"11:4":true,"10:5":[151,152],"9:1":true,"10:1":true,"12:4":true,"11:3":true,"8:2":true,"14:0":true,"4:0":true,"2:0":true,"12:2":true,"8:4":[150,151],"11:2":true,"8:3":true,"7:1":true} \ No newline at end of file +{ + "12:1": true, + "9:3": true, + "11:5": true, + "10:4": true, + "12:5": true, + "10:3": true, + "7:2": true, + "11:1": true, + "7:4": 149, + "9:2": true, + "13:0": true, + "0:0": true, + "8:1": true, + "10:2": true, + "7:3": true, + "14:1": true, + "13:2": true, + "4:1": true, + "15:5": true, + "10:0": true, + "14:5": true, + "5:1": true, + "3:2": true, + "15:1": true, + "9:0": true, + "6:3": true, + "7:0": true, + "13:3": true, + "13:4": true, + "6:2": true, + "2:1": true, + "15:4": true, + "11:0": true, + "14:3": true, + "12:6": 153, + "5:3": true, + "15:3": true, + "12:0": true, + "6:1": true, + "1:0": true, + "14:4": true, + "8:0": true, + "14:2": true, + "13:1": true, + "4:2": true, + "15:2": true, + "3:1": true, + "13:5": true, + "5:2": true, + "15:0": true, + "12:3": true, + "11:4": true, + "10:5": [ + 151, + 152 + ], + "9:1": true, + "10:1": true, + "12:4": true, + "11:3": true, + "8:2": true, + "14:0": true, + "4:0": true, + "2:0": true, + "12:2": true, + "8:4": [ + 150, + 151 + ], + "11:2": true, + "8:3": true, + "7:1": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/0_0.json b/src/main/resources/assets/notenoughupdates/dwarven_data/0_0.json index a30cb4a9..58bf1e76 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/0_0.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/0_0.json @@ -1 +1,72 @@ -{"6:0":true,"1:1":true,"2:7":true,"1:5":true,"7:2":true,"3:0":true,"0:6":true,"0:0":true,"13:0":true,"8:1":true,"3:6":true,"7:3":true,"5:5":true,"4:1":true,"0:2":true,"6:4":true,"10:0":true,"5:1":true,"4:5":true,"3:2":true,"9:0":true,"6:3":true,"7:0":true,"3:4":true,"2:5":true,"0:3":true,"3:3":true,"1:7":true,"0:4":true,"6:2":true,"2:1":true,"11:0":true,"4:3":true,"1:6":true,"5:4":true,"5:3":true,"2:2":true,"12:0":true,"6:1":true,"1:0":true,"4:4":true,"3:5":true,"2:4":true,"8:0":true,"14:15":true,"4:2":true,"0:1":true,"15:15":[146,233],"3:1":true,"5:2":true,"2:3":true,"0:5":true,"15:0":true,"9:1":true,"4:6":true,"3:7":true,"1:3":true,"5:0":true,"8:2":true,"1:4":true,"0:7":true,"14:0":true,"4:0":true,"2:0":true,"1:2":true,"7:1":true,"2:6":true} \ No newline at end of file +{ + "6:0": true, + "1:1": true, + "2:7": true, + "1:5": true, + "7:2": true, + "3:0": true, + "0:6": true, + "0:0": true, + "13:0": true, + "8:1": true, + "3:6": true, + "7:3": true, + "5:5": true, + "4:1": true, + "0:2": true, + "6:4": true, + "10:0": true, + "5:1": true, + "4:5": true, + "3:2": true, + "9:0": true, + "6:3": true, + "7:0": true, + "3:4": true, + "2:5": true, + "0:3": true, + "3:3": true, + "1:7": true, + "0:4": true, + "6:2": true, + "2:1": true, + "11:0": true, + "4:3": true, + "1:6": true, + "5:4": true, + "5:3": true, + "2:2": true, + "12:0": true, + "6:1": true, + "1:0": true, + "4:4": true, + "3:5": true, + "2:4": true, + "8:0": true, + "14:15": true, + "4:2": true, + "0:1": true, + "15:15": [ + 146, + 233 + ], + "3:1": true, + "5:2": true, + "2:3": true, + "0:5": true, + "15:0": true, + "9:1": true, + "4:6": true, + "3:7": true, + "1:3": true, + "5:0": true, + "8:2": true, + "1:4": true, + "0:7": true, + "14:0": true, + "4:0": true, + "2:0": true, + "1:2": true, + "7:1": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/0_10.json b/src/main/resources/assets/notenoughupdates/dwarven_data/0_10.json index 27c8872f..5c459232 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/0_10.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/0_10.json @@ -1 +1,59 @@ -{"9:3":127,"6:0":true,"1:11":true,"11:5":true,"3:13":true,"12:5":[205,207],"0:13":true,"6:6":true,"11:1":127,"5:7":true,"15:7":true,"3:0":true,"10:2":true,"4:1":127,"3:12":true,"0:2":127,"3:2":true,"0:12":true,"0:3":127,"0:14":true,"0:4":127,"4:8":true,"2:1":127,"12:6":202,"2:2":127,"12:0":127,"11:6":202,"4:12":[113,114],"3:1":127,"13:5":127,"2:3":127,"1:13":true,"0:5":127,"14:6":true,"11:4":true,"2:13":true,"1:3":127,"5:0":true,"12:4":[127,208],"11:3":127,"1:4":127,"4:0":true,"2:0":true,"8:4":true,"2:10":true,"1:2":127,"7:5":true,"3:9":true} \ No newline at end of file +{ + "9:3": 127, + "6:0": true, + "1:11": true, + "11:5": true, + "3:13": true, + "12:5": [ + 205, + 207 + ], + "0:13": true, + "6:6": true, + "11:1": 127, + "5:7": true, + "15:7": true, + "3:0": true, + "10:2": true, + "4:1": 127, + "3:12": true, + "0:2": 127, + "3:2": true, + "0:12": true, + "0:3": 127, + "0:14": true, + "0:4": 127, + "4:8": true, + "2:1": 127, + "12:6": 202, + "2:2": 127, + "12:0": 127, + "11:6": 202, + "4:12": [ + 113, + 114 + ], + "3:1": 127, + "13:5": 127, + "2:3": 127, + "1:13": true, + "0:5": 127, + "14:6": true, + "11:4": true, + "2:13": true, + "1:3": 127, + "5:0": true, + "12:4": [ + 127, + 208 + ], + "11:3": 127, + "1:4": 127, + "4:0": true, + "2:0": true, + "8:4": true, + "2:10": true, + "1:2": 127, + "7:5": true, + "3:9": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/0_3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/0_3.json index c490d54b..e5302331 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/0_3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/0_3.json @@ -1 +1,21 @@ -{"9:14":true,"2:15":true,"0:13":true,"10:12":true,"9:15":true,"9:12":true,"10:15":true,"12:13":true,"12:14":true,"1:14":true,"0:15":true,"12:15":true,"11:12":true,"1:15":true,"0:14":true,"11:15":true,"12:12":true,"9:8":true,"9:13":true} \ No newline at end of file +{ + "9:14": true, + "2:15": true, + "0:13": true, + "10:12": true, + "9:15": true, + "9:12": true, + "10:15": true, + "12:13": true, + "12:14": true, + "1:14": true, + "0:15": true, + "12:15": true, + "11:12": true, + "1:15": true, + "0:14": true, + "11:15": true, + "12:12": true, + "9:8": true, + "9:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/0_7.json b/src/main/resources/assets/notenoughupdates/dwarven_data/0_7.json index 519dafcc..8ca05ce1 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/0_7.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/0_7.json @@ -1 +1,31 @@ -{"7:12":true,"6:10":true,"0:13":127,"7:15":true,"6:13":true,"7:14":true,"0:15":true,"7:13":true,"10:0":true,"9:0":true,"6:14":true,"0:14":true,"7:10":true,"6:12":true,"6:15":true,"11:0":true,"2:15":127,"12:0":true,"6:11":true,"7:9":true,"0:1":true,"7:8":[117,120],"6:9":true,"1:14":127,"1:15":127,"7:11":true} \ No newline at end of file +{ + "7:12": true, + "6:10": true, + "0:13": 127, + "7:15": true, + "6:13": true, + "7:14": true, + "0:15": true, + "7:13": true, + "10:0": true, + "9:0": true, + "6:14": true, + "0:14": true, + "7:10": true, + "6:12": true, + "6:15": true, + "11:0": true, + "2:15": 127, + "12:0": true, + "6:11": true, + "7:9": true, + "0:1": true, + "7:8": [ + 117, + 120 + ], + "6:9": true, + "1:14": 127, + "1:15": 127, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/0_8.json b/src/main/resources/assets/notenoughupdates/dwarven_data/0_8.json index 83229162..a4dfb68b 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/0_8.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/0_8.json @@ -1 +1,45 @@ -{"15:9":true,"1:11":true,"1:1":true,"3:13":true,"13:13":true,"0:13":true,"6:13":true,"3:0":127,"4:11":true,"0:15":true,"0:2":true,"7:13":true,"3:15":true,"0:12":true,"15:11":true,"7:0":true,"10:13":true,"0:14":true,"0:3":true,"9:13":true,"2:11":true,"2:1":127,"8:13":true,"2:15":true,"0:8":true,"1:0":127,"11:13":true,"4:15":true,"0:11":true,"0:1":true,"15:15":true,"3:11":true,"12:13":true,"1:13":true,"2:13":true,"15:10":true,"15:13":true,"2:0":127,"5:13":true,"1:15":true,"1:2":true,"14:13":true,"4:13":true} \ No newline at end of file +{ + "15:9": true, + "1:11": true, + "1:1": true, + "3:13": true, + "13:13": true, + "0:13": true, + "6:13": true, + "3:0": 127, + "4:11": true, + "0:15": true, + "0:2": true, + "7:13": true, + "3:15": true, + "0:12": true, + "15:11": true, + "7:0": true, + "10:13": true, + "0:14": true, + "0:3": true, + "9:13": true, + "2:11": true, + "2:1": 127, + "8:13": true, + "2:15": true, + "0:8": true, + "1:0": 127, + "11:13": true, + "4:15": true, + "0:11": true, + "0:1": true, + "15:15": true, + "3:11": true, + "12:13": true, + "1:13": true, + "2:13": true, + "15:10": true, + "15:13": true, + "2:0": 127, + "5:13": true, + "1:15": true, + "1:2": true, + "14:13": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/0_9.json b/src/main/resources/assets/notenoughupdates/dwarven_data/0_9.json index 7dfe7b5f..bc399186 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/0_9.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/0_9.json @@ -1 +1,52 @@ -{"15:9":127,"6:10":127,"10:14":127,"7:15":[115,116],"6:13":117,"9:15":116,"7:14":117,"15:1":true,"6:14":true,"6:12":117,"0:4":true,"6:15":116,"9:13":true,"2:15":true,"0:11":127,"2:14":true,"1:13":true,"8:12":127,"2:13":true,"1:14":true,"14:10":true,"8:15":[115,117],"1:12":127,"5:9":127,"1:5":true,"0:13":true,"14:11":true,"3:15":true,"0:12":127,"0:14":true,"3:14":true,"4:8":127,"11:13":127,"5:12":117,"13:11":true,"4:15":true,"5:15":true,"15:0":true,"3:7":true,"5:13":117,"12:12":true,"11:15":true,"7:11":127,"2:6":true} \ No newline at end of file +{ + "15:9": 127, + "6:10": 127, + "10:14": 127, + "7:15": [ + 115, + 116 + ], + "6:13": 117, + "9:15": 116, + "7:14": 117, + "15:1": true, + "6:14": true, + "6:12": 117, + "0:4": true, + "6:15": 116, + "9:13": true, + "2:15": true, + "0:11": 127, + "2:14": true, + "1:13": true, + "8:12": 127, + "2:13": true, + "1:14": true, + "14:10": true, + "8:15": [ + 115, + 117 + ], + "1:12": 127, + "5:9": 127, + "1:5": true, + "0:13": true, + "14:11": true, + "3:15": true, + "0:12": 127, + "0:14": true, + "3:14": true, + "4:8": 127, + "11:13": 127, + "5:12": 117, + "13:11": true, + "4:15": true, + "5:15": true, + "15:0": true, + "3:7": true, + "5:13": 117, + "12:12": true, + "11:15": true, + "7:11": 127, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/10_1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/10_1.json index e31b7d9f..b8dde378 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/10_1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/10_1.json @@ -1 +1,202 @@ -{"15:9":true,"9:14":true,"11:5":[167,169],"2:7":true,"8:8":true,"7:12":true,"6:10":true,"12:5":[167,171],"10:14":true,"7:15":true,"14:9":true,"10:12":true,"6:13":true,"2:9":true,"15:7":167,"9:15":true,"0:6":[151,154],"14:7":168,"9:12":true,"10:15":true,"7:14":true,"1:8":true,"4:11":true,"7:13":true,"2:8":true,"9:10":true,"5:11":true,"6:14":true,"1:9":true,"15:8":true,"10:13":true,"8:9":true,"7:10":true,"6:12":true,"1:7":true,"0:4":[156,157],"6:15":true,"14:8":true,"9:13":true,"2:1":true,"12:6":true,"8:13":true,"2:12":true,"10:9":true,"7:7":true,"2:15":true,"1:10":true,"13:8":true,"9:9":true,"11:6":true,"10:7":true,"8:10":true,"7:9":true,"6:8":true,"0:11":true,"9:7":true,"3:11":true,"2:14":true,"1:13":true,"0:5":[154,190],"11:4":170,"8:12":true,"7:8":true,"6:9":true,"2:13":true,"1:14":true,"15:10":true,"13:7":true,"8:15":true,"2:10":true,"1:15":true,"10:8":true,"6:7":true,"8:14":true,"1:12":true,"13:9":true,"9:8":true,"1:11":true,"3:13":true,"5:9":true,"1:5":[151,189],"0:13":true,"4:9":true,"5:7":true,"3:10":true,"11:8":true,"13:6":170,"8:11":true,"4:7":true,"0:10":true,"12:8":true,"9:6":true,"3:12":true,"0:15":true,"11:9":true,"15:5":168,"14:5":169,"10:6":true,"3:15":true,"0:12":true,"11:7":true,"2:5":[151,226],"0:14":true,"5:8":true,"13:4":[166,167],"12:7":true,"3:14":true,"4:8":true,"2:11":true,"15:4":[164,165],"4:14":true,"1:6":150,"3:8":true,"5:14":true,"2:2":[187,221],"0:8":154,"6:11":true,"14:4":[165,169],"5:12":true,"2:4":[152,222],"4:15":true,"8:6":true,"4:12":true,"13:5":[167,170],"5:15":true,"2:3":[187,222],"14:6":169,"10:5":[168,170],"9:11":true,"5:10":true,"3:7":true,"1:3":156,"9:5":true,"4:10":true,"11:14":true,"1:4":[154,155],"0:7":[151,154],"15:6":168,"12:15":true,"5:13":true,"3:9":true,"11:15":true,"0:9":true,"7:11":true,"4:13":true,"2:6":[192,223]} \ No newline at end of file +{ + "15:9": true, + "9:14": true, + "11:5": [ + 167, + 169 + ], + "2:7": true, + "8:8": true, + "7:12": true, + "6:10": true, + "12:5": [ + 167, + 171 + ], + "10:14": true, + "7:15": true, + "14:9": true, + "10:12": true, + "6:13": true, + "2:9": true, + "15:7": 167, + "9:15": true, + "0:6": [ + 151, + 154 + ], + "14:7": 168, + "9:12": true, + "10:15": true, + "7:14": true, + "1:8": true, + "4:11": true, + "7:13": true, + "2:8": true, + "9:10": true, + "5:11": true, + "6:14": true, + "1:9": true, + "15:8": true, + "10:13": true, + "8:9": true, + "7:10": true, + "6:12": true, + "1:7": true, + "0:4": [ + 156, + 157 + ], + "6:15": true, + "14:8": true, + "9:13": true, + "2:1": true, + "12:6": true, + "8:13": true, + "2:12": true, + "10:9": true, + "7:7": true, + "2:15": true, + "1:10": true, + "13:8": true, + "9:9": true, + "11:6": true, + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": true, + "0:11": true, + "9:7": true, + "3:11": true, + "2:14": true, + "1:13": true, + "0:5": [ + 154, + 190 + ], + "11:4": 170, + "8:12": true, + "7:8": true, + "6:9": true, + "2:13": true, + "1:14": true, + "15:10": true, + "13:7": true, + "8:15": true, + "2:10": true, + "1:15": true, + "10:8": true, + "6:7": true, + "8:14": true, + "1:12": true, + "13:9": true, + "9:8": true, + "1:11": true, + "3:13": true, + "5:9": true, + "1:5": [ + 151, + 189 + ], + "0:13": true, + "4:9": true, + "5:7": true, + "3:10": true, + "11:8": true, + "13:6": 170, + "8:11": true, + "4:7": true, + "0:10": true, + "12:8": true, + "9:6": true, + "3:12": true, + "0:15": true, + "11:9": true, + "15:5": 168, + "14:5": 169, + "10:6": true, + "3:15": true, + "0:12": true, + "11:7": true, + "2:5": [ + 151, + 226 + ], + "0:14": true, + "5:8": true, + "13:4": [ + 166, + 167 + ], + "12:7": true, + "3:14": true, + "4:8": true, + "2:11": true, + "15:4": [ + 164, + 165 + ], + "4:14": true, + "1:6": 150, + "3:8": true, + "5:14": true, + "2:2": [ + 187, + 221 + ], + "0:8": 154, + "6:11": true, + "14:4": [ + 165, + 169 + ], + "5:12": true, + "2:4": [ + 152, + 222 + ], + "4:15": true, + "8:6": true, + "4:12": true, + "13:5": [ + 167, + 170 + ], + "5:15": true, + "2:3": [ + 187, + 222 + ], + "14:6": 169, + "10:5": [ + 168, + 170 + ], + "9:11": true, + "5:10": true, + "3:7": true, + "1:3": 156, + "9:5": true, + "4:10": true, + "11:14": true, + "1:4": [ + 154, + 155 + ], + "0:7": [ + 151, + 154 + ], + "15:6": 168, + "12:15": true, + "5:13": true, + "3:9": true, + "11:15": true, + "0:9": true, + "7:11": true, + "4:13": true, + "2:6": [ + 192, + 223 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/10_3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/10_3.json index 9c96f830..98cae537 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/10_3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/10_3.json @@ -1 +1,215 @@ -{"8:8":true,"6:10":true,"13:13":true,"0:6":true,"3:6":true,"14:1":true,"10:10":true,"8:7":true,"5:5":true,"4:11":true,"0:2":true,"9:10":true,"5:11":true,"4:5":true,"13:12":true,"15:1":true,"13:14":[161,163],"3:4":true,"0:3":true,"8:9":true,"7:10":true,"3:3":true,"0:4":true,"2:1":true,"14:14":true,"4:3":true,"5:4":true,"2:12":true,"10:9":true,"7:7":true,"5:3":true,"2:15":true,"15:14":true,"9:9":true,"4:4":true,"10:7":true,"3:5":true,"15:12":true,"14:15":160,"13:1":true,"0:11":true,"15:15":true,"14:12":true,"9:7":true,"3:11":true,"2:14":true,"1:13":true,"0:5":true,"2:13":true,"7:8":true,"6:9":true,"4:6":true,"1:14":true,"5:6":true,"15:13":true,"1:15":true,"10:8":true,"1:12":true,"9:8":true,"14:13":true,"1:11":true,"3:13":true,"1:5":true,"0:13":true,"11:8":true,"13:6":true,"13:0":true,"12:8":true,"14:11":true,"13:2":true,"3:12":true,"0:15":true,"11:9":true,"14:5":true,"3:15":true,"0:12":true,"15:11":true,"12:9":true,"13:3":true,"11:7":true,"2:5":true,"0:14":true,"13:4":true,"12:7":true,"2:11":true,"14:3":true,"1:6":true,"11:10":true,"12:10":true,"2:2":true,"15:3":true,"14:4":true,"2:4":true,"14:2":true,"13:11":true,"4:15":true,"15:2":true,"4:12":true,"13:5":true,"5:15":true,"2:3":true,"15:0":true,"14:6":true,"1:4":true,"15:6":true,"14:0":true,"5:13":153,"4:13":true,"2:6":true,"15:9":true,"12:11":true,"2:7":true,"7:12":[149,150],"12:5":true,"14:9":true,"11:11":true,"10:12":true,"2:9":true,"15:7":true,"14:7":true,"9:12":[150,151],"13:10":true,"1:8":true,"2:8":true,"1:9":true,"15:8":true,"6:12":[148,149],"1:7":true,"14:8":true,"11:0":true,"1:10":true,"13:8":true,"12:0":true,"11:4":true,"9:1":true,"8:12":[149,151],"12:3":true,"15:10":true,"14:10":true,"10:1":true,"13:7":true,"12:4":true,"11:3":true,"12:2":true,"2:10":true,"11:2":true,"13:9":true,"12:1":true,"5:9":true,"10:3":true,"6:6":true,"4:9":true,"11:1":true,"8:5":true,"3:10":true,"7:4":true,"9:2":true,"8:11":148,"10:2":true,"0:10":true,"9:6":true,"6:4":true,"10:0":true,"10:6":true,"9:0":true,"6:3":true,"5:8":true,"7:6":true,"4:8":true,"6:5":true,"3:8":true,"0:8":true,"6:11":147,"11:13":[161,163],"8:0":true,"8:6":true,"12:13":true,"12:14":[161,162],"9:11":true,"5:10":true,"10:11":true,"4:10":true,"0:7":true,"11:12":true,"7:5":true,"3:9":true,"12:12":true,"0:9":true,"7:11":[147,148]} \ No newline at end of file +{ + "8:8": true, + "6:10": true, + "13:13": true, + "0:6": true, + "3:6": true, + "14:1": true, + "10:10": true, + "8:7": true, + "5:5": true, + "4:11": true, + "0:2": true, + "9:10": true, + "5:11": true, + "4:5": true, + "13:12": true, + "15:1": true, + "13:14": [ + 161, + 163 + ], + "3:4": true, + "0:3": true, + "8:9": true, + "7:10": true, + "3:3": true, + "0:4": true, + "2:1": true, + "14:14": true, + "4:3": true, + "5:4": true, + "2:12": true, + "10:9": true, + "7:7": true, + "5:3": true, + "2:15": true, + "15:14": true, + "9:9": true, + "4:4": true, + "10:7": true, + "3:5": true, + "15:12": true, + "14:15": 160, + "13:1": true, + "0:11": true, + "15:15": true, + "14:12": true, + "9:7": true, + "3:11": true, + "2:14": true, + "1:13": true, + "0:5": true, + "2:13": true, + "7:8": true, + "6:9": true, + "4:6": true, + "1:14": true, + "5:6": true, + "15:13": true, + "1:15": true, + "10:8": true, + "1:12": true, + "9:8": true, + "14:13": true, + "1:11": true, + "3:13": true, + "1:5": true, + "0:13": true, + "11:8": true, + "13:6": true, + "13:0": true, + "12:8": true, + "14:11": true, + "13:2": true, + "3:12": true, + "0:15": true, + "11:9": true, + "14:5": true, + "3:15": true, + "0:12": true, + "15:11": true, + "12:9": true, + "13:3": true, + "11:7": true, + "2:5": true, + "0:14": true, + "13:4": true, + "12:7": true, + "2:11": true, + "14:3": true, + "1:6": true, + "11:10": true, + "12:10": true, + "2:2": true, + "15:3": true, + "14:4": true, + "2:4": true, + "14:2": true, + "13:11": true, + "4:15": true, + "15:2": true, + "4:12": true, + "13:5": true, + "5:15": true, + "2:3": true, + "15:0": true, + "14:6": true, + "1:4": true, + "15:6": true, + "14:0": true, + "5:13": 153, + "4:13": true, + "2:6": true, + "15:9": true, + "12:11": true, + "2:7": true, + "7:12": [ + 149, + 150 + ], + "12:5": true, + "14:9": true, + "11:11": true, + "10:12": true, + "2:9": true, + "15:7": true, + "14:7": true, + "9:12": [ + 150, + 151 + ], + "13:10": true, + "1:8": true, + "2:8": true, + "1:9": true, + "15:8": true, + "6:12": [ + 148, + 149 + ], + "1:7": true, + "14:8": true, + "11:0": true, + "1:10": true, + "13:8": true, + "12:0": true, + "11:4": true, + "9:1": true, + "8:12": [ + 149, + 151 + ], + "12:3": true, + "15:10": true, + "14:10": true, + "10:1": true, + "13:7": true, + "12:4": true, + "11:3": true, + "12:2": true, + "2:10": true, + "11:2": true, + "13:9": true, + "12:1": true, + "5:9": true, + "10:3": true, + "6:6": true, + "4:9": true, + "11:1": true, + "8:5": true, + "3:10": true, + "7:4": true, + "9:2": true, + "8:11": 148, + "10:2": true, + "0:10": true, + "9:6": true, + "6:4": true, + "10:0": true, + "10:6": true, + "9:0": true, + "6:3": true, + "5:8": true, + "7:6": true, + "4:8": true, + "6:5": true, + "3:8": true, + "0:8": true, + "6:11": 147, + "11:13": [ + 161, + 163 + ], + "8:0": true, + "8:6": true, + "12:13": true, + "12:14": [ + 161, + 162 + ], + "9:11": true, + "5:10": true, + "10:11": true, + "4:10": true, + "0:7": true, + "11:12": true, + "7:5": true, + "3:9": true, + "12:12": true, + "0:9": true, + "7:11": [ + 147, + 148 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/10_4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/10_4.json index d59a6e28..967958bf 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/10_4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/10_4.json @@ -1 +1,47 @@ -{"12:11":true,"9:14":true,"10:14":true,"0:13":true,"10:12":156,"6:13":true,"3:0":true,"9:15":true,"0:0":true,"13:10":true,"7:14":true,"0:15":true,"7:13":true,"3:15":true,"6:14":true,"10:13":true,"0:14":true,"3:14":true,"6:15":true,"9:13":true,"4:14":true,"8:13":true,"5:14":true,"2:15":true,"1:0":true,"11:13":true,"13:11":true,"4:15":true,"0:1":true,"5:15":true,"2:14":true,"1:13":true,"15:0":true,"2:13":true,"1:14":true,"5:0":true,"14:0":160,"4:0":true,"2:0":true,"11:12":true,"5:13":true,"1:15":true,"12:12":true,"8:14":true,"4:13":true} \ No newline at end of file +{ + "12:11": true, + "9:14": true, + "10:14": true, + "0:13": true, + "10:12": 156, + "6:13": true, + "3:0": true, + "9:15": true, + "0:0": true, + "13:10": true, + "7:14": true, + "0:15": true, + "7:13": true, + "3:15": true, + "6:14": true, + "10:13": true, + "0:14": true, + "3:14": true, + "6:15": true, + "9:13": true, + "4:14": true, + "8:13": true, + "5:14": true, + "2:15": true, + "1:0": true, + "11:13": true, + "13:11": true, + "4:15": true, + "0:1": true, + "5:15": true, + "2:14": true, + "1:13": true, + "15:0": true, + "2:13": true, + "1:14": true, + "5:0": true, + "14:0": 160, + "4:0": true, + "2:0": true, + "11:12": true, + "5:13": true, + "1:15": true, + "12:12": true, + "8:14": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/10_5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/10_5.json index 44c446c1..075087ce 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/10_5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/10_5.json @@ -1 +1,96 @@ -{"1:1":true,"1:11":[170,189],"10:4":156,"2:7":true,"1:5":true,"0:13":[161,170],"4:9":[158,160],"3:10":[158,161],"2:9":true,"3:0":true,"0:6":true,"0:0":true,"0:10":true,"13:2":154,"3:12":true,"0:2":true,"0:15":true,"2:8":true,"0:12":[170,171],"15:1":true,"2:5":true,"0:3":true,"0:14":true,"5:8":158,"2:1":true,"2:11":[158,226],"2:12":[159,222],"7:7":[156,158],"2:2":true,"2:15":true,"0:8":true,"1:0":true,"6:8":[156,158],"2:4":true,"14:2":153,"0:1":true,"0:11":[171,190],"8:6":[156,158],"3:1":true,"2:14":true,"2:3":true,"1:13":true,"0:5":true,"2:13":true,"1:14":true,"5:0":true,"11:3":155,"1:4":true,"4:0":true,"2:0":true,"2:10":[192,223],"1:2":true,"1:15":true,"1:12":[160,169],"2:6":true} \ No newline at end of file +{ + "1:1": true, + "1:11": [ + 170, + 189 + ], + "10:4": 156, + "2:7": true, + "1:5": true, + "0:13": [ + 161, + 170 + ], + "4:9": [ + 158, + 160 + ], + "3:10": [ + 158, + 161 + ], + "2:9": true, + "3:0": true, + "0:6": true, + "0:0": true, + "0:10": true, + "13:2": 154, + "3:12": true, + "0:2": true, + "0:15": true, + "2:8": true, + "0:12": [ + 170, + 171 + ], + "15:1": true, + "2:5": true, + "0:3": true, + "0:14": true, + "5:8": 158, + "2:1": true, + "2:11": [ + 158, + 226 + ], + "2:12": [ + 159, + 222 + ], + "7:7": [ + 156, + 158 + ], + "2:2": true, + "2:15": true, + "0:8": true, + "1:0": true, + "6:8": [ + 156, + 158 + ], + "2:4": true, + "14:2": 153, + "0:1": true, + "0:11": [ + 171, + 190 + ], + "8:6": [ + 156, + 158 + ], + "3:1": true, + "2:14": true, + "2:3": true, + "1:13": true, + "0:5": true, + "2:13": true, + "1:14": true, + "5:0": true, + "11:3": 155, + "1:4": true, + "4:0": true, + "2:0": true, + "2:10": [ + 192, + 223 + ], + "1:2": true, + "1:15": true, + "1:12": [ + 160, + 169 + ], + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/11_1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/11_1.json index 0540c5c2..225a6e2d 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/11_1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/11_1.json @@ -1 +1,72 @@ -{"4:14":true,"1:11":true,"1:6":true,"3:13":true,"2:7":[162,166],"6:10":true,"5:9":158,"3:8":161,"5:14":true,"1:10":true,"1:5":true,"0:8":[166,167],"4:9":true,"5:12":true,"3:10":163,"6:13":true,"2:9":[164,166],"4:15":true,"0:6":167,"4:7":true,"4:12":[162,164],"3:6":true,"3:11":167,"1:8":true,"5:10":[157,161],"4:11":[162,163],"3:7":true,"3:12":165,"2:8":165,"5:11":true,"4:10":[162,164],"3:15":true,"1:4":true,"0:7":167,"1:9":166,"5:13":true,"2:10":true,"6:12":true,"3:9":[163,164],"1:12":true,"1:7":166,"0:4":true,"0:9":true,"4:8":true,"4:13":true,"2:6":162} \ No newline at end of file +{ + "4:14": true, + "1:11": true, + "1:6": true, + "3:13": true, + "2:7": [ + 162, + 166 + ], + "6:10": true, + "5:9": 158, + "3:8": 161, + "5:14": true, + "1:10": true, + "1:5": true, + "0:8": [ + 166, + 167 + ], + "4:9": true, + "5:12": true, + "3:10": 163, + "6:13": true, + "2:9": [ + 164, + 166 + ], + "4:15": true, + "0:6": 167, + "4:7": true, + "4:12": [ + 162, + 164 + ], + "3:6": true, + "3:11": 167, + "1:8": true, + "5:10": [ + 157, + 161 + ], + "4:11": [ + 162, + 163 + ], + "3:7": true, + "3:12": 165, + "2:8": 165, + "5:11": true, + "4:10": [ + 162, + 164 + ], + "3:15": true, + "1:4": true, + "0:7": 167, + "1:9": 166, + "5:13": true, + "2:10": true, + "6:12": true, + "3:9": [ + 163, + 164 + ], + "1:12": true, + "1:7": 166, + "0:4": true, + "0:9": true, + "4:8": true, + "4:13": true, + "2:6": 162 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/11_3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/11_3.json index ccf6e685..b60a43f7 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/11_3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/11_3.json @@ -1 +1,60 @@ -{"1:11":true,"0:13":true,"6:6":true,"4:9":true,"5:7":true,"3:10":true,"2:9":true,"0:0":true,"4:7":true,"3:6":true,"0:10":true,"1:8":true,"5:5":true,"4:1":true,"0:15":true,"6:4":true,"2:8":true,"5:1":true,"4:5":true,"0:12":true,"6:3":true,"1:9":true,"0:14":true,"7:6":true,"4:8":true,"2:11":true,"4:3":true,"5:4":true,"7:7":true,"6:5":true,"3:8":true,"5:3":true,"1:10":true,"0:8":true,"6:1":[156,158],"4:4":true,"6:8":true,"4:2":true,"0:11":true,"3:1":true,"5:2":true,"4:6":true,"3:7":true,"5:0":[155,164],"5:6":true,"0:7":true,"4:0":166,"2:10":true,"6:7":true,"3:9":true,"1:12":true,"0:9":true} \ No newline at end of file +{ + "1:11": true, + "0:13": true, + "6:6": true, + "4:9": true, + "5:7": true, + "3:10": true, + "2:9": true, + "0:0": true, + "4:7": true, + "3:6": true, + "0:10": true, + "1:8": true, + "5:5": true, + "4:1": true, + "0:15": true, + "6:4": true, + "2:8": true, + "5:1": true, + "4:5": true, + "0:12": true, + "6:3": true, + "1:9": true, + "0:14": true, + "7:6": true, + "4:8": true, + "2:11": true, + "4:3": true, + "5:4": true, + "7:7": true, + "6:5": true, + "3:8": true, + "5:3": true, + "1:10": true, + "0:8": true, + "6:1": [ + 156, + 158 + ], + "4:4": true, + "6:8": true, + "4:2": true, + "0:11": true, + "3:1": true, + "5:2": true, + "4:6": true, + "3:7": true, + "5:0": [ + 155, + 164 + ], + "5:6": true, + "0:7": true, + "4:0": 166, + "2:10": true, + "6:7": true, + "3:9": true, + "1:12": true, + "0:9": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/11_4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/11_4.json index b1c880dc..ee4dac0f 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/11_4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/11_4.json @@ -1 +1,17 @@ -{"2:15":true,"1:5":true,"4:9":true,"5:7":true,"0:1":true,"0:0":true,"0:5":true,"1:3":true,"0:2":true,"5:6":true,"1:4":true,"1:2":true,"0:3":true,"5:8":true,"4:8":true} \ No newline at end of file +{ + "2:15": true, + "1:5": true, + "4:9": true, + "5:7": true, + "0:1": true, + "0:0": true, + "0:5": true, + "1:3": true, + "0:2": true, + "5:6": true, + "1:4": true, + "1:2": true, + "0:3": true, + "5:8": true, + "4:8": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/1_-1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/1_-1.json index 07c13c50..5f3ff028 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/1_-1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/1_-1.json @@ -1 +1,119 @@ -{"7:12":196,"13:13":198,"7:15":[189,196],"10:12":199,"6:13":true,"9:15":[188,198],"9:12":198,"8:1":true,"10:15":[187,199],"14:1":[200,201],"13:15":198,"7:13":[189,196],"13:12":[198,202],"13:14":true,"10:13":[187,199],"8:9":173,"6:12":true,"6:15":true,"9:13":[188,198],"14:14":true,"8:13":[189,197],"2:12":true,"2:15":true,"15:14":196,"8:10":[172,174],"7:9":true,"15:12":[196,201],"14:15":true,"15:15":196,"14:12":[197,201],"1:13":true,"9:1":233,"8:12":197,"2:13":true,"8:15":[189,197],"15:13":196,"1:15":true,"1:12":true,"14:13":197,"9:3":147,"10:4":148,"3:13":true,"0:13":true,"8:5":true,"11:8":167,"13:0":153,"13:2":152,"3:12":true,"0:15":true,"3:15":true,"0:12":true,"13:3":157,"11:7":167,"12:7":166,"11:13":[186,199],"5:12":true,"4:15":true,"15:2":200,"4:12":true,"12:13":[185,199],"5:15":true,"11:14":226,"8:2":true,"14:0":198,"12:15":true,"11:12":true,"8:4":true,"5:13":true,"12:12":true,"11:15":true,"8:3":true,"4:13":true} \ No newline at end of file +{ + "7:12": 196, + "13:13": 198, + "7:15": [ + 189, + 196 + ], + "10:12": 199, + "6:13": true, + "9:15": [ + 188, + 198 + ], + "9:12": 198, + "8:1": true, + "10:15": [ + 187, + 199 + ], + "14:1": [ + 200, + 201 + ], + "13:15": 198, + "7:13": [ + 189, + 196 + ], + "13:12": [ + 198, + 202 + ], + "13:14": true, + "10:13": [ + 187, + 199 + ], + "8:9": 173, + "6:12": true, + "6:15": true, + "9:13": [ + 188, + 198 + ], + "14:14": true, + "8:13": [ + 189, + 197 + ], + "2:12": true, + "2:15": true, + "15:14": 196, + "8:10": [ + 172, + 174 + ], + "7:9": true, + "15:12": [ + 196, + 201 + ], + "14:15": true, + "15:15": 196, + "14:12": [ + 197, + 201 + ], + "1:13": true, + "9:1": 233, + "8:12": 197, + "2:13": true, + "8:15": [ + 189, + 197 + ], + "15:13": 196, + "1:15": true, + "1:12": true, + "14:13": 197, + "9:3": 147, + "10:4": 148, + "3:13": true, + "0:13": true, + "8:5": true, + "11:8": 167, + "13:0": 153, + "13:2": 152, + "3:12": true, + "0:15": true, + "3:15": true, + "0:12": true, + "13:3": 157, + "11:7": 167, + "12:7": 166, + "11:13": [ + 186, + 199 + ], + "5:12": true, + "4:15": true, + "15:2": 200, + "4:12": true, + "12:13": [ + 185, + 199 + ], + "5:15": true, + "11:14": 226, + "8:2": true, + "14:0": 198, + "12:15": true, + "11:12": true, + "8:4": true, + "5:13": true, + "12:12": true, + "11:15": true, + "8:3": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/1_-2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/1_-2.json index f84a02d8..fbe1c1b7 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/1_-2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/1_-2.json @@ -1 +1,36 @@ -{"3:0":true,"0:0":true,"8:1":234,"0:2":true,"3:3":true,"0:4":true,"4:3":true,"5:3":[177,178],"3:5":true,"9:7":192,"0:5":true,"5:0":true,"6:7":233,"9:8":[191,192],"1:5":true,"7:4":174,"4:7":true,"7:0":[195,223],"2:5":true,"4:8":true,"1:0":true,"1:3":true,"8:4":true,"3:9":true,"11:15":224} \ No newline at end of file +{ + "3:0": true, + "0:0": true, + "8:1": 234, + "0:2": true, + "3:3": true, + "0:4": true, + "4:3": true, + "5:3": [ + 177, + 178 + ], + "3:5": true, + "9:7": 192, + "0:5": true, + "5:0": true, + "6:7": 233, + "9:8": [ + 191, + 192 + ], + "1:5": true, + "7:4": 174, + "4:7": true, + "7:0": [ + 195, + 223 + ], + "2:5": true, + "4:8": true, + "1:0": true, + "1:3": true, + "8:4": true, + "3:9": true, + "11:15": 224 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/1_-3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/1_-3.json index 2585400c..9499a2e1 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/1_-3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/1_-3.json @@ -1 +1,151 @@ -{"9:14":[179,221],"1:1":true,"11:5":true,"2:7":true,"8:8":true,"6:10":true,"12:5":true,"10:14":[179,222],"2:9":true,"3:0":true,"0:6":true,"0:0":true,"8:1":true,"3:6":true,"7:14":true,"1:8":true,"14:1":true,"8:7":true,"5:5":true,"2:8":true,"4:5":true,"3:2":true,"15:1":true,"1:9":true,"13:14":true,"3:4":true,"8:9":true,"3:3":true,"1:7":true,"2:1":true,"11:0":true,"14:14":true,"12:6":true,"4:3":true,"7:7":true,"15:14":true,"12:0":true,"6:1":true,"11:6":true,"8:10":true,"6:8":true,"3:5":true,"13:1":true,"0:11":true,"5:2":true,"0:5":true,"12:3":true,"11:4":true,"7:8":true,"6:9":true,"4:6":true,"1:14":true,"5:6":true,"12:4":true,"11:3":true,"12:2":true,"2:10":true,"6:7":true,"11:2":true,"8:14":[179,220],"1:12":true,"7:1":true,"12:1":true,"6:0":true,"5:9":true,"1:5":true,"7:2":true,"6:6":true,"4:9":true,"11:1":true,"8:5":true,"5:7":true,"3:10":true,"7:4":true,"13:6":true,"13:0":true,"8:11":true,"4:7":true,"0:10":true,"7:3":true,"13:2":true,"6:4":true,"15:5":true,"14:5":true,"0:12":true,"6:3":true,"7:0":true,"13:3":true,"2:5":true,"0:14":true,"5:8":true,"13:4":true,"6:2":true,"7:6":true,"4:8":true,"15:4":true,"14:3":true,"1:6":true,"6:5":true,"3:8":true,"2:2":true,"0:8":true,"15:3":true,"1:0":true,"14:4":true,"2:4":true,"8:0":true,"14:2":true,"15:2":true,"8:6":true,"3:1":true,"13:5":true,"2:3":true,"15:0":true,"14:6":true,"12:14":[184,224],"5:10":true,"3:7":true,"1:3":true,"4:10":true,"11:14":[184,223],"8:2":true,"1:4":true,"0:7":true,"15:6":true,"14:0":true,"2:0":true,"8:4":true,"1:2":true,"7:5":true,"3:9":true,"8:3":true,"0:9":true,"2:6":true} \ No newline at end of file +{ + "9:14": [ + 179, + 221 + ], + "1:1": true, + "11:5": true, + "2:7": true, + "8:8": true, + "6:10": true, + "12:5": true, + "10:14": [ + 179, + 222 + ], + "2:9": true, + "3:0": true, + "0:6": true, + "0:0": true, + "8:1": true, + "3:6": true, + "7:14": true, + "1:8": true, + "14:1": true, + "8:7": true, + "5:5": true, + "2:8": true, + "4:5": true, + "3:2": true, + "15:1": true, + "1:9": true, + "13:14": true, + "3:4": true, + "8:9": true, + "3:3": true, + "1:7": true, + "2:1": true, + "11:0": true, + "14:14": true, + "12:6": true, + "4:3": true, + "7:7": true, + "15:14": true, + "12:0": true, + "6:1": true, + "11:6": true, + "8:10": true, + "6:8": true, + "3:5": true, + "13:1": true, + "0:11": true, + "5:2": true, + "0:5": true, + "12:3": true, + "11:4": true, + "7:8": true, + "6:9": true, + "4:6": true, + "1:14": true, + "5:6": true, + "12:4": true, + "11:3": true, + "12:2": true, + "2:10": true, + "6:7": true, + "11:2": true, + "8:14": [ + 179, + 220 + ], + "1:12": true, + "7:1": true, + "12:1": true, + "6:0": true, + "5:9": true, + "1:5": true, + "7:2": true, + "6:6": true, + "4:9": true, + "11:1": true, + "8:5": true, + "5:7": true, + "3:10": true, + "7:4": true, + "13:6": true, + "13:0": true, + "8:11": true, + "4:7": true, + "0:10": true, + "7:3": true, + "13:2": true, + "6:4": true, + "15:5": true, + "14:5": true, + "0:12": true, + "6:3": true, + "7:0": true, + "13:3": true, + "2:5": true, + "0:14": true, + "5:8": true, + "13:4": true, + "6:2": true, + "7:6": true, + "4:8": true, + "15:4": true, + "14:3": true, + "1:6": true, + "6:5": true, + "3:8": true, + "2:2": true, + "0:8": true, + "15:3": true, + "1:0": true, + "14:4": true, + "2:4": true, + "8:0": true, + "14:2": true, + "15:2": true, + "8:6": true, + "3:1": true, + "13:5": true, + "2:3": true, + "15:0": true, + "14:6": true, + "12:14": [ + 184, + 224 + ], + "5:10": true, + "3:7": true, + "1:3": true, + "4:10": true, + "11:14": [ + 184, + 223 + ], + "8:2": true, + "1:4": true, + "0:7": true, + "15:6": true, + "14:0": true, + "2:0": true, + "8:4": true, + "1:2": true, + "7:5": true, + "3:9": true, + "8:3": true, + "0:9": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/1_0.json b/src/main/resources/assets/notenoughupdates/dwarven_data/1_0.json index e9baac3c..82bb1ab6 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/1_0.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/1_0.json @@ -1 +1,89 @@ -{"3:0":true,"0:0":true,"13:10":214,"4:11":[146,151],"5:11":150,"11:0":[199,226],"12:0":[199,226],"3:11":145,"2:14":148,"1:13":145,"2:13":[145,149],"9:1":[174,175],"1:14":148,"15:10":213,"5:0":true,"14:10":[213,214],"4:0":true,"1:15":147,"6:0":true,"3:13":[149,150],"4:9":146,"3:10":145,"13:0":[198,226],"10:2":173,"3:12":145,"0:15":147,"10:0":[175,200],"9:0":[175,199],"7:0":[196,197],"1:0":true,"8:0":[197,198],"4:12":[146,150],"15:0":[196,202],"5:10":[147,152],"4:10":[146,147],"8:2":143,"14:0":true,"2:0":true,"4:13":149} \ No newline at end of file +{ + "3:0": true, + "0:0": true, + "13:10": 214, + "4:11": [ + 146, + 151 + ], + "5:11": 150, + "11:0": [ + 199, + 226 + ], + "12:0": [ + 199, + 226 + ], + "3:11": 145, + "2:14": 148, + "1:13": 145, + "2:13": [ + 145, + 149 + ], + "9:1": [ + 174, + 175 + ], + "1:14": 148, + "15:10": 213, + "5:0": true, + "14:10": [ + 213, + 214 + ], + "4:0": true, + "1:15": 147, + "6:0": true, + "3:13": [ + 149, + 150 + ], + "4:9": 146, + "3:10": 145, + "13:0": [ + 198, + 226 + ], + "10:2": 173, + "3:12": 145, + "0:15": 147, + "10:0": [ + 175, + 200 + ], + "9:0": [ + 175, + 199 + ], + "7:0": [ + 196, + 197 + ], + "1:0": true, + "8:0": [ + 197, + 198 + ], + "4:12": [ + 146, + 150 + ], + "15:0": [ + 196, + 202 + ], + "5:10": [ + 147, + 152 + ], + "4:10": [ + 146, + 147 + ], + "8:2": 143, + "14:0": true, + "2:0": true, + "4:13": 149 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/1_10.json b/src/main/resources/assets/notenoughupdates/dwarven_data/1_10.json index 1c619aa1..15873317 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/1_10.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/1_10.json @@ -1 +1,90 @@ -{"11:5":true,"7:12":true,"13:13":true,"12:5":true,"10:12":true,"3:0":true,"8:1":true,"14:1":true,"13:12":true,"3:2":127,"15:1":true,"1:9":true,"15:8":true,"13:14":true,"10:13":true,"14:8":true,"9:13":true,"2:1":true,"12:6":true,"4:3":127,"5:4":true,"5:3":true,"13:8":true,"11:6":true,"10:7":true,"13:1":true,"4:2":[127,202],"14:12":true,"9:7":true,"5:2":true,"9:1":true,"8:12":true,"13:7":true,"12:4":true,"15:13":true,"12:2":true,"2:10":127,"10:8":true,"11:2":true,"7:1":true,"14:13":true,"12:1":true,"10:4":true,"10:3":true,"7:2":true,"11:8":true,"13:6":true,"9:2":true,"10:2":true,"12:8":true,"13:2":true,"9:6":true,"15:5":true,"14:5":true,"10:6":true,"5:1":201,"9:0":true,"6:3":127,"7:0":true,"13:3":true,"11:7":true,"13:4":true,"12:7":true,"6:2":127,"7:6":true,"15:4":true,"0:8":true,"15:3":true,"1:0":127,"14:4":true,"11:13":true,"8:0":true,"14:2":true,"15:2":true,"8:6":true,"3:1":true,"14:6":true,"12:14":true,"10:5":true,"9:5":true,"11:14":true,"15:6":true,"14:0":true,"2:0":true,"11:12":true} \ No newline at end of file +{ + "11:5": true, + "7:12": true, + "13:13": true, + "12:5": true, + "10:12": true, + "3:0": true, + "8:1": true, + "14:1": true, + "13:12": true, + "3:2": 127, + "15:1": true, + "1:9": true, + "15:8": true, + "13:14": true, + "10:13": true, + "14:8": true, + "9:13": true, + "2:1": true, + "12:6": true, + "4:3": 127, + "5:4": true, + "5:3": true, + "13:8": true, + "11:6": true, + "10:7": true, + "13:1": true, + "4:2": [ + 127, + 202 + ], + "14:12": true, + "9:7": true, + "5:2": true, + "9:1": true, + "8:12": true, + "13:7": true, + "12:4": true, + "15:13": true, + "12:2": true, + "2:10": 127, + "10:8": true, + "11:2": true, + "7:1": true, + "14:13": true, + "12:1": true, + "10:4": true, + "10:3": true, + "7:2": true, + "11:8": true, + "13:6": true, + "9:2": true, + "10:2": true, + "12:8": true, + "13:2": true, + "9:6": true, + "15:5": true, + "14:5": true, + "10:6": true, + "5:1": 201, + "9:0": true, + "6:3": 127, + "7:0": true, + "13:3": true, + "11:7": true, + "13:4": true, + "12:7": true, + "6:2": 127, + "7:6": true, + "15:4": true, + "0:8": true, + "15:3": true, + "1:0": 127, + "14:4": true, + "11:13": true, + "8:0": true, + "14:2": true, + "15:2": true, + "8:6": true, + "3:1": true, + "14:6": true, + "12:14": true, + "10:5": true, + "9:5": true, + "11:14": true, + "15:6": true, + "14:0": true, + "2:0": true, + "11:12": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/1_7.json b/src/main/resources/assets/notenoughupdates/dwarven_data/1_7.json index 8c280ebc..a961528d 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/1_7.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/1_7.json @@ -1 +1,7 @@ -{"13:15":true,"10:14":true,"12:15":true,"11:15":true,"10:15":true} \ No newline at end of file +{ + "13:15": true, + "10:14": true, + "12:15": true, + "11:15": true, + "10:15": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/1_8.json b/src/main/resources/assets/notenoughupdates/dwarven_data/1_8.json index 84dcdb8b..646a75b5 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/1_8.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/1_8.json @@ -1 +1,44 @@ -{"12:1":true,"12:11":true,"5:9":true,"13:13":true,"7:15":true,"11:1":true,"11:11":true,"6:13":true,"9:15":true,"13:0":true,"8:11":true,"10:15":true,"1:8":true,"13:15":true,"7:13":true,"2:8":true,"10:0":true,"15:8":true,"10:13":true,"6:15":true,"14:8":true,"4:8":true,"9:13":true,"11:0":true,"8:13":true,"3:8":true,"0:8":true,"12:0":true,"6:11":true,"11:13":true,"5:15":true,"12:13":true,"9:1":true,"9:11":true,"10:1":true,"10:11":true,"8:15":true,"12:15":true,"5:13":true,"11:15":true,"13:9":true,"7:11":true} \ No newline at end of file +{ + "12:1": true, + "12:11": true, + "5:9": true, + "13:13": true, + "7:15": true, + "11:1": true, + "11:11": true, + "6:13": true, + "9:15": true, + "13:0": true, + "8:11": true, + "10:15": true, + "1:8": true, + "13:15": true, + "7:13": true, + "2:8": true, + "10:0": true, + "15:8": true, + "10:13": true, + "6:15": true, + "14:8": true, + "4:8": true, + "9:13": true, + "11:0": true, + "8:13": true, + "3:8": true, + "0:8": true, + "12:0": true, + "6:11": true, + "11:13": true, + "5:15": true, + "12:13": true, + "9:1": true, + "9:11": true, + "10:1": true, + "10:11": true, + "8:15": true, + "12:15": true, + "5:13": true, + "11:15": true, + "13:9": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/1_9.json b/src/main/resources/assets/notenoughupdates/dwarven_data/1_9.json index 2b778aa2..e84aa3ad 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/1_9.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/1_9.json @@ -1 +1,96 @@ -{"15:9":true,"8:8":true,"13:13":true,"7:15":127,"14:9":true,"6:13":127,"15:7":true,"7:14":127,"10:10":true,"8:7":true,"5:5":true,"0:2":true,"9:10":true,"4:5":true,"13:12":true,"3:2":true,"6:14":127,"15:8":true,"13:14":true,"3:4":true,"8:9":true,"7:10":[117,118],"1:7":true,"0:4":true,"14:8":true,"14:14":true,"10:9":true,"7:7":true,"2:15":true,"13:8":true,"15:14":true,"9:9":true,"8:10":true,"7:9":119,"6:8":120,"3:5":true,"15:12":true,"13:1":true,"4:2":true,"15:15":true,"7:8":true,"15:10":true,"14:10":true,"5:6":true,"8:15":true,"15:13":true,"6:7":true,"1:12":[116,117],"13:9":true,"14:13":true,"6:6":true,"5:7":true,"8:11":117,"12:8":true,"14:11":true,"11:9":true,"5:1":true,"3:15":true,"0:12":[117,118],"12:9":true,"3:14":true,"7:6":true,"4:14":true,"11:10":true,"6:5":true,"5:14":127,"2:2":true,"0:8":true,"15:3":true,"11:13":true,"5:12":true,"2:4":true,"14:2":true,"13:11":true,"15:2":true,"12:13":true,"12:14":true,"9:11":true,"1:4":true,"15:6":true,"5:13":true,"1:2":true,"11:15":true,"4:13":true,"2:6":true} \ No newline at end of file +{ + "15:9": true, + "8:8": true, + "13:13": true, + "7:15": 127, + "14:9": true, + "6:13": 127, + "15:7": true, + "7:14": 127, + "10:10": true, + "8:7": true, + "5:5": true, + "0:2": true, + "9:10": true, + "4:5": true, + "13:12": true, + "3:2": true, + "6:14": 127, + "15:8": true, + "13:14": true, + "3:4": true, + "8:9": true, + "7:10": [ + 117, + 118 + ], + "1:7": true, + "0:4": true, + "14:8": true, + "14:14": true, + "10:9": true, + "7:7": true, + "2:15": true, + "13:8": true, + "15:14": true, + "9:9": true, + "8:10": true, + "7:9": 119, + "6:8": 120, + "3:5": true, + "15:12": true, + "13:1": true, + "4:2": true, + "15:15": true, + "7:8": true, + "15:10": true, + "14:10": true, + "5:6": true, + "8:15": true, + "15:13": true, + "6:7": true, + "1:12": [ + 116, + 117 + ], + "13:9": true, + "14:13": true, + "6:6": true, + "5:7": true, + "8:11": 117, + "12:8": true, + "14:11": true, + "11:9": true, + "5:1": true, + "3:15": true, + "0:12": [ + 117, + 118 + ], + "12:9": true, + "3:14": true, + "7:6": true, + "4:14": true, + "11:10": true, + "6:5": true, + "5:14": 127, + "2:2": true, + "0:8": true, + "15:3": true, + "11:13": true, + "5:12": true, + "2:4": true, + "14:2": true, + "13:11": true, + "15:2": true, + "12:13": true, + "12:14": true, + "9:11": true, + "1:4": true, + "15:6": true, + "5:13": true, + "1:2": true, + "11:15": true, + "4:13": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/2_-1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/2_-1.json index 70315fcb..d8d42d25 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/2_-1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/2_-1.json @@ -1 +1,18 @@ -{"10:12":true,"9:12":true,"13:12":true,"11:0":196,"9:9":true,"0:11":205,"10:8":true,"9:8":true,"1:11":205,"8:11":true,"14:11":true,"10:0":197,"15:11":true,"11:12":true,"12:12":true,"7:11":true} \ No newline at end of file +{ + "10:12": true, + "9:12": true, + "13:12": true, + "11:0": 196, + "9:9": true, + "0:11": 205, + "10:8": true, + "9:8": true, + "1:11": 205, + "8:11": true, + "14:11": true, + "10:0": 197, + "15:11": true, + "11:12": true, + "12:12": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/2_-2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/2_-2.json index ea803f53..511a2a33 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/2_-2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/2_-2.json @@ -1 +1,48 @@ -{"12:11":233,"13:13":true,"6:13":true,"13:0":true,"13:10":234,"14:11":true,"14:1":true,"15:5":[174,175],"13:12":true,"15:1":true,"6:12":227,"15:4":[173,174],"15:3":[173,174],"9:9":[213,215],"11:6":[211,213],"10:7":[211,212],"8:10":214,"13:11":true,"13:1":true,"14:12":true,"12:13":true,"15:0":true,"15:6":[174,175],"14:0":true,"12:12":234} \ No newline at end of file +{ + "12:11": 233, + "13:13": true, + "6:13": true, + "13:0": true, + "13:10": 234, + "14:11": true, + "14:1": true, + "15:5": [ + 174, + 175 + ], + "13:12": true, + "15:1": true, + "6:12": 227, + "15:4": [ + 173, + 174 + ], + "15:3": [ + 173, + 174 + ], + "9:9": [ + 213, + 215 + ], + "11:6": [ + 211, + 213 + ], + "10:7": [ + 211, + 212 + ], + "8:10": 214, + "13:11": true, + "13:1": true, + "14:12": true, + "12:13": true, + "15:0": true, + "15:6": [ + 174, + 175 + ], + "14:0": true, + "12:12": 234 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/2_-4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/2_-4.json index 06c33ad1..9a9539b0 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/2_-4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/2_-4.json @@ -1 +1,71 @@ -{"9:14":true,"7:12":true,"5:9":true,"13:13":true,"4:9":true,"11:1":true,"9:4":true,"7:4":true,"9:12":true,"0:10":true,"7:14":true,"9:6":true,"4:1":true,"3:12":true,"0:2":true,"7:13":true,"6:4":true,"9:10":true,"5:1":true,"13:12":true,"3:15":true,"3:2":true,"9:0":true,"6:14":true,"6:3":true,"7:0":true,"3:4":true,"0:3":true,"7:10":true,"5:8":true,"0:4":true,"6:15":true,"6:2":true,"7:6":true,"4:8":true,"9:13":true,"11:0":true,"4:14":true,"4:3":true,"5:4":true,"7:7":true,"3:8":true,"5:14":true,"5:3":true,"9:9":true,"4:4":true,"7:9":true,"3:5":true,"4:15":true,"4:2":true,"0:11":true,"9:7":true,"3:1":true,"3:11":true,"5:15":true,"5:2":true,"9:11":true,"9:1":true,"7:8":true,"6:9":true,"5:10":true,"9:5":true,"4:10":true,"7:5":true,"3:9":true,"0:9":true,"9:8":true,"7:11":true,"7:1":true} \ No newline at end of file +{ + "9:14": true, + "7:12": true, + "5:9": true, + "13:13": true, + "4:9": true, + "11:1": true, + "9:4": true, + "7:4": true, + "9:12": true, + "0:10": true, + "7:14": true, + "9:6": true, + "4:1": true, + "3:12": true, + "0:2": true, + "7:13": true, + "6:4": true, + "9:10": true, + "5:1": true, + "13:12": true, + "3:15": true, + "3:2": true, + "9:0": true, + "6:14": true, + "6:3": true, + "7:0": true, + "3:4": true, + "0:3": true, + "7:10": true, + "5:8": true, + "0:4": true, + "6:15": true, + "6:2": true, + "7:6": true, + "4:8": true, + "9:13": true, + "11:0": true, + "4:14": true, + "4:3": true, + "5:4": true, + "7:7": true, + "3:8": true, + "5:14": true, + "5:3": true, + "9:9": true, + "4:4": true, + "7:9": true, + "3:5": true, + "4:15": true, + "4:2": true, + "0:11": true, + "9:7": true, + "3:1": true, + "3:11": true, + "5:15": true, + "5:2": true, + "9:11": true, + "9:1": true, + "7:8": true, + "6:9": true, + "5:10": true, + "9:5": true, + "4:10": true, + "7:5": true, + "3:9": true, + "0:9": true, + "9:8": true, + "7:11": true, + "7:1": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/2_-5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/2_-5.json index b7f553d7..2390fe19 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/2_-5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/2_-5.json @@ -1 +1,60 @@ -{"9:14":true,"7:12":true,"6:10":true,"5:9":true,"12:5":true,"7:15":true,"4:9":true,"11:11":true,"11:8":true,"6:13":true,"9:15":true,"9:12":true,"4:7":true,"7:14":true,"4:11":true,"0:2":true,"11:9":true,"7:13":true,"9:10":true,"5:11":true,"3:2":true,"9:0":true,"3:4":true,"0:3":true,"0:14":true,"7:10":true,"6:12":true,"5:8":true,"0:4":true,"4:8":true,"9:13":true,"11:10":true,"5:4":true,"0:8":true,"6:11":true,"4:4":true,"11:13":true,"7:9":true,"6:8":true,"5:12":true,"3:5":true,"2:4":true,"0:1":true,"4:12":true,"3:1":true,"9:11":true,"7:8":true,"6:9":true,"5:10":true,"4:10":true,"11:14":true,"1:4":true,"11:12":true,"5:13":true,"11:15":true,"7:11":true,"7:1":true,"4:13":true} \ No newline at end of file +{ + "9:14": true, + "7:12": true, + "6:10": true, + "5:9": true, + "12:5": true, + "7:15": true, + "4:9": true, + "11:11": true, + "11:8": true, + "6:13": true, + "9:15": true, + "9:12": true, + "4:7": true, + "7:14": true, + "4:11": true, + "0:2": true, + "11:9": true, + "7:13": true, + "9:10": true, + "5:11": true, + "3:2": true, + "9:0": true, + "3:4": true, + "0:3": true, + "0:14": true, + "7:10": true, + "6:12": true, + "5:8": true, + "0:4": true, + "4:8": true, + "9:13": true, + "11:10": true, + "5:4": true, + "0:8": true, + "6:11": true, + "4:4": true, + "11:13": true, + "7:9": true, + "6:8": true, + "5:12": true, + "3:5": true, + "2:4": true, + "0:1": true, + "4:12": true, + "3:1": true, + "9:11": true, + "7:8": true, + "6:9": true, + "5:10": true, + "4:10": true, + "11:14": true, + "1:4": true, + "11:12": true, + "5:13": true, + "11:15": true, + "7:11": true, + "7:1": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/2_-7.json b/src/main/resources/assets/notenoughupdates/dwarven_data/2_-7.json index 175d154e..c1e5c107 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/2_-7.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/2_-7.json @@ -1 +1,40 @@ -{"12:11":true,"1:11":true,"2:7":true,"2:12":true,"13:13":true,"1:10":true,"13:8":true,"10:7":true,"5:7":true,"13:11":true,"9:7":true,"4:7":true,"13:10":true,"12:13":true,"10:15":true,"5:15":true,"1:13":true,"1:8":true,"13:15":true,"8:7":true,"2:13":true,"1:14":true,"0:15":true,"11:9":true,"13:12":true,"13:7":true,"3:15":true,"1:9":true,"13:14":true,"1:15":true,"6:7":true,"3:9":true,"12:7":true,"12:12":true,"1:12":true,"1:7":true,"13:9":true,"2:11":true} \ No newline at end of file +{ + "12:11": true, + "1:11": true, + "2:7": true, + "2:12": true, + "13:13": true, + "1:10": true, + "13:8": true, + "10:7": true, + "5:7": true, + "13:11": true, + "9:7": true, + "4:7": true, + "13:10": true, + "12:13": true, + "10:15": true, + "5:15": true, + "1:13": true, + "1:8": true, + "13:15": true, + "8:7": true, + "2:13": true, + "1:14": true, + "0:15": true, + "11:9": true, + "13:12": true, + "13:7": true, + "3:15": true, + "1:9": true, + "13:14": true, + "1:15": true, + "6:7": true, + "3:9": true, + "12:7": true, + "12:12": true, + "1:12": true, + "1:7": true, + "13:9": true, + "2:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/2_0.json b/src/main/resources/assets/notenoughupdates/dwarven_data/2_0.json index 046b2dbc..e6bb771d 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/2_0.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/2_0.json @@ -1 +1,87 @@ -{"1:1":true,"3:0":[196,202],"0:0":[193,203],"8:1":205,"14:1":205,"15:1":205,"11:0":[157,202],"5:4":true,"7:7":true,"12:0":[141,202],"4:4":true,"9:1":159,"5:0":true,"4:0":true,"12:2":true,"11:2":true,"7:1":205,"6:0":true,"7:2":[154,158],"6:6":true,"11:1":156,"13:0":[141,202],"10:2":true,"13:2":[157,159],"6:4":true,"10:0":[142,202],"9:0":[143,202],"6:3":true,"7:0":[152,202],"6:2":157,"1:0":true,"8:0":[150,202],"14:2":158,"0:1":true,"15:0":[198,202],"11:14":214,"14:0":[198,202],"2:0":[196,202],"12:15":true,"11:15":[212,213]} \ No newline at end of file +{ + "1:1": true, + "3:0": [ + 196, + 202 + ], + "0:0": [ + 193, + 203 + ], + "8:1": 205, + "14:1": 205, + "15:1": 205, + "11:0": [ + 157, + 202 + ], + "5:4": true, + "7:7": true, + "12:0": [ + 141, + 202 + ], + "4:4": true, + "9:1": 159, + "5:0": true, + "4:0": true, + "12:2": true, + "11:2": true, + "7:1": 205, + "6:0": true, + "7:2": [ + 154, + 158 + ], + "6:6": true, + "11:1": 156, + "13:0": [ + 141, + 202 + ], + "10:2": true, + "13:2": [ + 157, + 159 + ], + "6:4": true, + "10:0": [ + 142, + 202 + ], + "9:0": [ + 143, + 202 + ], + "6:3": true, + "7:0": [ + 152, + 202 + ], + "6:2": 157, + "1:0": true, + "8:0": [ + 150, + 202 + ], + "14:2": 158, + "0:1": true, + "15:0": [ + 198, + 202 + ], + "11:14": 214, + "14:0": [ + 198, + 202 + ], + "2:0": [ + 196, + 202 + ], + "12:15": true, + "11:15": [ + 212, + 213 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/2_10.json b/src/main/resources/assets/notenoughupdates/dwarven_data/2_10.json index 59e038d9..18003fa5 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/2_10.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/2_10.json @@ -1 +1,278 @@ -{"1:1":true,"8:8":[139,141],"6:10":true,"13:13":true,"0:0":true,"3:6":true,"14:1":true,"13:15":true,"8:7":true,"5:5":154,"4:11":[165,166],"0:2":true,"5:11":[134,176],"13:12":true,"3:2":182,"15:1":true,"13:14":true,"0:3":true,"8:9":true,"7:10":true,"0:4":true,"2:1":true,"14:14":true,"5:4":154,"10:9":true,"7:7":true,"5:3":155,"15:14":true,"9:9":141,"10:7":true,"8:10":true,"7:9":true,"3:5":[169,173],"15:12":true,"14:15":true,"13:1":true,"15:15":true,"14:12":true,"9:7":true,"0:5":true,"7:8":true,"6:9":[134,135],"15:13":true,"10:8":true,"6:7":true,"1:12":true,"9:8":true,"14:13":true,"1:5":true,"11:8":true,"13:6":[168,169],"13:0":true,"12:8":true,"14:11":true,"11:9":true,"15:5":[146,173],"14:5":[144,174],"0:12":true,"15:11":true,"12:9":true,"13:3":true,"2:5":true,"13:4":true,"15:4":[147,149],"14:3":true,"4:14":146,"11:10":true,"12:10":true,"5:14":true,"2:2":183,"1:0":true,"5:12":[134,176],"2:4":true,"14:2":true,"13:11":true,"0:1":true,"15:2":true,"4:12":[132,165],"13:5":[145,173],"2:3":[180,183],"15:0":true,"14:6":[168,169],"1:3":true,"1:4":true,"15:6":[168,172],"14:0":true,"2:0":true,"5:13":[167,176],"1:2":true,"4:13":[164,166],"2:6":true,"15:9":true,"12:11":true,"11:5":true,"2:7":true,"12:5":[148,170],"14:9":true,"11:11":true,"6:13":[169,174],"2:9":true,"13:10":true,"10:15":true,"1:8":true,"2:8":true,"15:8":true,"6:12":[140,174],"1:7":true,"14:8":158,"13:8":true,"6:1":156,"12:3":true,"11:4":[139,170],"15:10":true,"14:10":true,"10:1":[171,178],"12:4":[142,174],"11:3":[135,176],"12:2":true,"11:2":[131,178],"13:9":true,"7:1":[154,155],"12:1":true,"10:4":[134,138],"5:9":[170,174],"10:3":[131,173],"6:6":true,"4:9":[166,176],"11:1":[169,170],"9:4":132,"8:5":true,"7:4":true,"4:7":[168,169],"10:2":[174,176],"6:4":true,"10:0":[174,178],"10:6":true,"6:3":true,"7:0":true,"6:2":true,"7:6":true,"4:8":[167,175],"6:5":true,"3:8":true,"0:8":true,"6:11":[136,172],"11:13":true,"8:6":true,"12:13":true,"3:7":true,"12:14":true,"10:5":true,"5:10":[168,176],"9:5":true,"4:10":[166,177],"11:14":true,"12:15":true,"11:12":true,"7:5":true,"3:9":true,"12:12":true,"11:15":true,"7:11":true} \ No newline at end of file +{ + "1:1": true, + "8:8": [ + 139, + 141 + ], + "6:10": true, + "13:13": true, + "0:0": true, + "3:6": true, + "14:1": true, + "13:15": true, + "8:7": true, + "5:5": 154, + "4:11": [ + 165, + 166 + ], + "0:2": true, + "5:11": [ + 134, + 176 + ], + "13:12": true, + "3:2": 182, + "15:1": true, + "13:14": true, + "0:3": true, + "8:9": true, + "7:10": true, + "0:4": true, + "2:1": true, + "14:14": true, + "5:4": 154, + "10:9": true, + "7:7": true, + "5:3": 155, + "15:14": true, + "9:9": 141, + "10:7": true, + "8:10": true, + "7:9": true, + "3:5": [ + 169, + 173 + ], + "15:12": true, + "14:15": true, + "13:1": true, + "15:15": true, + "14:12": true, + "9:7": true, + "0:5": true, + "7:8": true, + "6:9": [ + 134, + 135 + ], + "15:13": true, + "10:8": true, + "6:7": true, + "1:12": true, + "9:8": true, + "14:13": true, + "1:5": true, + "11:8": true, + "13:6": [ + 168, + 169 + ], + "13:0": true, + "12:8": true, + "14:11": true, + "11:9": true, + "15:5": [ + 146, + 173 + ], + "14:5": [ + 144, + 174 + ], + "0:12": true, + "15:11": true, + "12:9": true, + "13:3": true, + "2:5": true, + "13:4": true, + "15:4": [ + 147, + 149 + ], + "14:3": true, + "4:14": 146, + "11:10": true, + "12:10": true, + "5:14": true, + "2:2": 183, + "1:0": true, + "5:12": [ + 134, + 176 + ], + "2:4": true, + "14:2": true, + "13:11": true, + "0:1": true, + "15:2": true, + "4:12": [ + 132, + 165 + ], + "13:5": [ + 145, + 173 + ], + "2:3": [ + 180, + 183 + ], + "15:0": true, + "14:6": [ + 168, + 169 + ], + "1:3": true, + "1:4": true, + "15:6": [ + 168, + 172 + ], + "14:0": true, + "2:0": true, + "5:13": [ + 167, + 176 + ], + "1:2": true, + "4:13": [ + 164, + 166 + ], + "2:6": true, + "15:9": true, + "12:11": true, + "11:5": true, + "2:7": true, + "12:5": [ + 148, + 170 + ], + "14:9": true, + "11:11": true, + "6:13": [ + 169, + 174 + ], + "2:9": true, + "13:10": true, + "10:15": true, + "1:8": true, + "2:8": true, + "15:8": true, + "6:12": [ + 140, + 174 + ], + "1:7": true, + "14:8": 158, + "13:8": true, + "6:1": 156, + "12:3": true, + "11:4": [ + 139, + 170 + ], + "15:10": true, + "14:10": true, + "10:1": [ + 171, + 178 + ], + "12:4": [ + 142, + 174 + ], + "11:3": [ + 135, + 176 + ], + "12:2": true, + "11:2": [ + 131, + 178 + ], + "13:9": true, + "7:1": [ + 154, + 155 + ], + "12:1": true, + "10:4": [ + 134, + 138 + ], + "5:9": [ + 170, + 174 + ], + "10:3": [ + 131, + 173 + ], + "6:6": true, + "4:9": [ + 166, + 176 + ], + "11:1": [ + 169, + 170 + ], + "9:4": 132, + "8:5": true, + "7:4": true, + "4:7": [ + 168, + 169 + ], + "10:2": [ + 174, + 176 + ], + "6:4": true, + "10:0": [ + 174, + 178 + ], + "10:6": true, + "6:3": true, + "7:0": true, + "6:2": true, + "7:6": true, + "4:8": [ + 167, + 175 + ], + "6:5": true, + "3:8": true, + "0:8": true, + "6:11": [ + 136, + 172 + ], + "11:13": true, + "8:6": true, + "12:13": true, + "3:7": true, + "12:14": true, + "10:5": true, + "5:10": [ + 168, + 176 + ], + "9:5": true, + "4:10": [ + 166, + 177 + ], + "11:14": true, + "12:15": true, + "11:12": true, + "7:5": true, + "3:9": true, + "12:12": true, + "11:15": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/2_3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/2_3.json index 86d84cb3..e0fb583d 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/2_3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/2_3.json @@ -1 +1,3 @@ -{"1:4":true} \ No newline at end of file +{ + "1:4": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/2_4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/2_4.json index 182d0153..3f26cae9 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/2_4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/2_4.json @@ -1 +1,145 @@ -{"15:9":true,"1:1":true,"2:7":true,"8:8":true,"7:12":true,"14:9":true,"10:12":true,"6:13":true,"2:9":true,"15:7":true,"0:6":true,"14:7":true,"9:12":true,"3:6":true,"1:8":true,"10:10":true,"8:7":true,"4:11":true,"7:13":true,"2:8":true,"9:10":true,"5:11":true,"3:2":true,"1:9":true,"15:8":true,"10:13":true,"3:4":true,"0:3":true,"8:9":true,"6:12":true,"1:7":true,"14:8":true,"9:13":true,"12:6":true,"4:3":true,"8:13":true,"5:4":true,"2:12":true,"10:9":true,"7:7":true,"5:3":true,"1:10":true,"13:8":true,"9:9":true,"11:6":true,"4:4":true,"10:7":true,"8:10":true,"7:9":true,"4:2":true,"0:11":true,"9:7":true,"3:11":true,"5:2":true,"1:13":true,"8:12":true,"7:8":true,"6:9":true,"4:6":true,"2:13":true,"5:6":true,"13:7":true,"2:10":true,"10:8":true,"6:7":true,"1:12":true,"13:9":true,"9:8":true,"9:3":true,"1:11":true,"10:4":true,"3:13":true,"10:3":true,"0:13":true,"7:2":true,"6:6":true,"4:9":true,"9:4":true,"5:7":true,"3:10":true,"11:8":true,"13:6":true,"9:2":true,"8:11":true,"4:7":true,"10:2":true,"0:10":true,"12:8":true,"13:2":true,"9:6":true,"3:12":true,"11:9":true,"15:5":true,"14:5":true,"10:6":true,"0:12":true,"12:9":true,"13:3":true,"11:7":true,"13:4":true,"12:7":true,"6:2":true,"7:6":true,"4:8":true,"2:11":true,"15:4":true,"14:3":true,"1:6":true,"3:8":true,"0:8":true,"15:3":true,"6:11":true,"14:4":true,"5:12":true,"14:2":[154,157],"0:1":true,"15:2":[154,157],"8:6":true,"4:12":true,"13:5":true,"14:6":true,"9:11":true,"5:10":true,"10:5":true,"3:7":true,"10:11":true,"9:5":true,"4:10":true,"8:2":true,"0:7":true,"15:6":true,"5:13":true,"3:9":true,"0:9":true,"7:11":true,"4:13":true,"2:6":true} \ No newline at end of file +{ + "15:9": true, + "1:1": true, + "2:7": true, + "8:8": true, + "7:12": true, + "14:9": true, + "10:12": true, + "6:13": true, + "2:9": true, + "15:7": true, + "0:6": true, + "14:7": true, + "9:12": true, + "3:6": true, + "1:8": true, + "10:10": true, + "8:7": true, + "4:11": true, + "7:13": true, + "2:8": true, + "9:10": true, + "5:11": true, + "3:2": true, + "1:9": true, + "15:8": true, + "10:13": true, + "3:4": true, + "0:3": true, + "8:9": true, + "6:12": true, + "1:7": true, + "14:8": true, + "9:13": true, + "12:6": true, + "4:3": true, + "8:13": true, + "5:4": true, + "2:12": true, + "10:9": true, + "7:7": true, + "5:3": true, + "1:10": true, + "13:8": true, + "9:9": true, + "11:6": true, + "4:4": true, + "10:7": true, + "8:10": true, + "7:9": true, + "4:2": true, + "0:11": true, + "9:7": true, + "3:11": true, + "5:2": true, + "1:13": true, + "8:12": true, + "7:8": true, + "6:9": true, + "4:6": true, + "2:13": true, + "5:6": true, + "13:7": true, + "2:10": true, + "10:8": true, + "6:7": true, + "1:12": true, + "13:9": true, + "9:8": true, + "9:3": true, + "1:11": true, + "10:4": true, + "3:13": true, + "10:3": true, + "0:13": true, + "7:2": true, + "6:6": true, + "4:9": true, + "9:4": true, + "5:7": true, + "3:10": true, + "11:8": true, + "13:6": true, + "9:2": true, + "8:11": true, + "4:7": true, + "10:2": true, + "0:10": true, + "12:8": true, + "13:2": true, + "9:6": true, + "3:12": true, + "11:9": true, + "15:5": true, + "14:5": true, + "10:6": true, + "0:12": true, + "12:9": true, + "13:3": true, + "11:7": true, + "13:4": true, + "12:7": true, + "6:2": true, + "7:6": true, + "4:8": true, + "2:11": true, + "15:4": true, + "14:3": true, + "1:6": true, + "3:8": true, + "0:8": true, + "15:3": true, + "6:11": true, + "14:4": true, + "5:12": true, + "14:2": [ + 154, + 157 + ], + "0:1": true, + "15:2": [ + 154, + 157 + ], + "8:6": true, + "4:12": true, + "13:5": true, + "14:6": true, + "9:11": true, + "5:10": true, + "10:5": true, + "3:7": true, + "10:11": true, + "9:5": true, + "4:10": true, + "8:2": true, + "0:7": true, + "15:6": true, + "5:13": true, + "3:9": true, + "0:9": true, + "7:11": true, + "4:13": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/2_6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/2_6.json index 458177bc..71567b5a 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/2_6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/2_6.json @@ -1 +1,132 @@ -{"15:9":true,"1:1":true,"11:5":true,"6:10":true,"12:5":true,"14:9":true,"15:7":true,"3:0":true,"0:6":true,"0:0":true,"14:7":true,"8:1":true,"3:6":true,"13:10":true,"10:10":true,"5:5":true,"0:2":true,"9:10":true,"5:11":true,"4:5":true,"3:2":true,"15:8":true,"3:4":true,"0:3":true,"7:10":true,"3:3":true,"0:4":true,"6:15":true,"14:8":true,"2:1":true,"12:6":true,"4:3":true,"10:9":true,"13:8":true,"9:9":true,"6:1":true,"11:6":true,"4:4":true,"10:7":true,"8:10":true,"3:5":true,"4:2":true,"0:11":true,"9:7":true,"5:2":true,"0:5":true,"12:3":true,"11:4":true,"9:1":true,"4:6":true,"15:10":true,"5:0":true,"14:10":true,"10:1":true,"5:6":true,"13:7":true,"12:4":true,"11:3":true,"4:0":true,"10:8":true,"13:9":true,"9:8":true,"7:1":true,"9:3":true,"6:0":true,"1:11":true,"10:4":true,"5:9":true,"10:3":true,"1:5":true,"6:6":true,"4:9":true,"9:4":true,"8:5":true,"3:10":true,"7:4":true,"13:6":true,"9:2":true,"10:2":true,"7:3":true,"9:6":true,"4:1":true,"15:5":true,"10:0":true,"14:5":true,"10:6":true,"5:1":true,"9:0":true,"6:3":true,"7:0":true,"13:3":true,"2:5":true,"5:8":true,"13:4":true,"7:6":true,"4:8":true,"15:4":true,"14:3":true,"1:6":true,"6:5":true,"3:8":true,"2:2":true,"15:3":true,"1:0":true,"14:4":true,"5:12":true,"2:4":true,"8:0":true,"0:1":true,"8:6":true,"3:1":true,"13:5":true,"2:3":true,"14:6":true,"10:5":true,"5:10":true,"1:3":true,"9:5":true,"4:10":true,"8:2":true,"1:4":true,"15:6":true,"2:0":true,"8:4":true,"5:13":true,"1:2":true,"7:5":true,"8:3":true,"0:9":true,"2:6":true} \ No newline at end of file +{ + "15:9": true, + "1:1": true, + "11:5": true, + "6:10": true, + "12:5": true, + "14:9": true, + "15:7": true, + "3:0": true, + "0:6": true, + "0:0": true, + "14:7": true, + "8:1": true, + "3:6": true, + "13:10": true, + "10:10": true, + "5:5": true, + "0:2": true, + "9:10": true, + "5:11": true, + "4:5": true, + "3:2": true, + "15:8": true, + "3:4": true, + "0:3": true, + "7:10": true, + "3:3": true, + "0:4": true, + "6:15": true, + "14:8": true, + "2:1": true, + "12:6": true, + "4:3": true, + "10:9": true, + "13:8": true, + "9:9": true, + "6:1": true, + "11:6": true, + "4:4": true, + "10:7": true, + "8:10": true, + "3:5": true, + "4:2": true, + "0:11": true, + "9:7": true, + "5:2": true, + "0:5": true, + "12:3": true, + "11:4": true, + "9:1": true, + "4:6": true, + "15:10": true, + "5:0": true, + "14:10": true, + "10:1": true, + "5:6": true, + "13:7": true, + "12:4": true, + "11:3": true, + "4:0": true, + "10:8": true, + "13:9": true, + "9:8": true, + "7:1": true, + "9:3": true, + "6:0": true, + "1:11": true, + "10:4": true, + "5:9": true, + "10:3": true, + "1:5": true, + "6:6": true, + "4:9": true, + "9:4": true, + "8:5": true, + "3:10": true, + "7:4": true, + "13:6": true, + "9:2": true, + "10:2": true, + "7:3": true, + "9:6": true, + "4:1": true, + "15:5": true, + "10:0": true, + "14:5": true, + "10:6": true, + "5:1": true, + "9:0": true, + "6:3": true, + "7:0": true, + "13:3": true, + "2:5": true, + "5:8": true, + "13:4": true, + "7:6": true, + "4:8": true, + "15:4": true, + "14:3": true, + "1:6": true, + "6:5": true, + "3:8": true, + "2:2": true, + "15:3": true, + "1:0": true, + "14:4": true, + "5:12": true, + "2:4": true, + "8:0": true, + "0:1": true, + "8:6": true, + "3:1": true, + "13:5": true, + "2:3": true, + "14:6": true, + "10:5": true, + "5:10": true, + "1:3": true, + "9:5": true, + "4:10": true, + "8:2": true, + "1:4": true, + "15:6": true, + "2:0": true, + "8:4": true, + "5:13": true, + "1:2": true, + "7:5": true, + "8:3": true, + "0:9": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/2_7.json b/src/main/resources/assets/notenoughupdates/dwarven_data/2_7.json index 3b0bf529..2c97d46a 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/2_7.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/2_7.json @@ -1 +1,3 @@ -{"4:12":true} \ No newline at end of file +{ + "4:12": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/2_8.json b/src/main/resources/assets/notenoughupdates/dwarven_data/2_8.json index 56f5e08c..706c7308 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/2_8.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/2_8.json @@ -1 +1,103 @@ -{"12:11":true,"6:10":[142,201],"7:15":[155,156],"11:11":true,"10:12":true,"9:15":153,"9:12":true,"10:15":[149,154],"13:10":119,"1:8":true,"13:15":[149,153],"4:11":[150,151],"2:8":true,"9:10":120,"13:14":[142,189],"10:13":true,"6:15":[132,160],"9:13":true,"14:14":true,"8:13":true,"15:14":[150,151],"7:9":200,"15:12":[143,190],"14:15":[151,152],"14:12":[142,189],"6:9":true,"15:10":true,"14:10":119,"15:13":true,"9:8":172,"14:13":[142,190],"13:6":[176,177],"3:15":[153,161],"15:11":[142,190],"0:8":true,"13:11":true,"4:15":[133,162],"5:15":[132,161],"12:14":true,"9:11":true,"10:11":true,"12:15":[141,189],"11:12":true,"11:15":[141,188]} \ No newline at end of file +{ + "12:11": true, + "6:10": [ + 142, + 201 + ], + "7:15": [ + 155, + 156 + ], + "11:11": true, + "10:12": true, + "9:15": 153, + "9:12": true, + "10:15": [ + 149, + 154 + ], + "13:10": 119, + "1:8": true, + "13:15": [ + 149, + 153 + ], + "4:11": [ + 150, + 151 + ], + "2:8": true, + "9:10": 120, + "13:14": [ + 142, + 189 + ], + "10:13": true, + "6:15": [ + 132, + 160 + ], + "9:13": true, + "14:14": true, + "8:13": true, + "15:14": [ + 150, + 151 + ], + "7:9": 200, + "15:12": [ + 143, + 190 + ], + "14:15": [ + 151, + 152 + ], + "14:12": [ + 142, + 189 + ], + "6:9": true, + "15:10": true, + "14:10": 119, + "15:13": true, + "9:8": 172, + "14:13": [ + 142, + 190 + ], + "13:6": [ + 176, + 177 + ], + "3:15": [ + 153, + 161 + ], + "15:11": [ + 142, + 190 + ], + "0:8": true, + "13:11": true, + "4:15": [ + 133, + 162 + ], + "5:15": [ + 132, + 161 + ], + "12:14": true, + "9:11": true, + "10:11": true, + "12:15": [ + 141, + 189 + ], + "11:12": true, + "11:15": [ + 141, + 188 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/2_9.json b/src/main/resources/assets/notenoughupdates/dwarven_data/2_9.json index b1c8feb6..0019a44d 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/2_9.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/2_9.json @@ -1 +1,265 @@ -{"8:8":true,"6:10":true,"13:13":185,"0:6":true,"14:1":191,"13:15":184,"10:10":true,"8:7":true,"5:5":[157,158],"0:2":true,"9:10":true,"13:12":true,"15:1":192,"13:14":185,"0:3":true,"8:9":true,"7:10":true,"0:4":true,"2:1":true,"14:14":184,"4:3":158,"5:4":158,"2:12":true,"10:9":true,"7:7":true,"2:15":true,"15:14":[141,183],"9:9":true,"10:7":true,"8:10":true,"7:9":true,"6:8":158,"3:5":177,"15:12":[132,186],"14:15":[134,183],"13:1":[152,153],"4:2":158,"0:11":true,"15:15":true,"14:12":[152,187],"9:7":true,"3:11":182,"2:14":182,"1:13":true,"2:13":true,"7:8":true,"6:9":true,"1:14":true,"5:0":[132,133],"5:6":158,"4:0":133,"15:13":184,"1:15":true,"10:8":true,"6:7":true,"1:12":true,"9:8":true,"14:13":186,"1:11":true,"1:5":true,"0:13":true,"11:8":true,"13:6":true,"13:0":[150,190],"12:8":true,"14:11":188,"13:2":true,"3:12":182,"11:9":true,"15:5":true,"14:5":true,"0:12":true,"15:11":[132,188],"12:9":true,"13:3":true,"11:7":true,"2:5":true,"0:14":true,"13:4":true,"12:7":true,"2:11":true,"15:4":true,"1:6":true,"11:10":true,"12:10":true,"2:2":true,"15:3":192,"14:4":true,"2:4":true,"14:2":192,"13:11":true,"15:2":192,"3:1":158,"13:5":true,"2:3":[174,183],"15:0":192,"14:6":true,"1:3":true,"1:4":true,"15:6":true,"14:0":[152,191],"1:2":true,"2:6":true,"15:9":190,"12:11":true,"11:5":true,"2:7":true,"7:12":true,"12:5":true,"10:14":[174,175],"7:15":[155,157],"14:9":191,"11:11":true,"10:12":true,"2:9":true,"9:12":[154,182],"13:10":true,"10:15":[174,176],"7:14":true,"7:13":true,"2:8":true,"15:8":190,"10:13":true,"6:12":160,"1:7":true,"14:8":191,"9:13":[153,181],"11:0":[141,188],"12:6":true,"8:13":true,"1:10":true,"13:8":true,"12:0":[147,149],"6:1":[132,133],"11:6":true,"11:4":true,"8:12":true,"12:3":true,"15:10":189,"14:10":[132,189],"13:7":true,"12:4":true,"11:3":true,"8:15":154,"12:2":true,"2:10":true,"11:2":true,"8:14":true,"13:9":true,"12:1":[149,151],"10:4":184,"6:6":true,"11:1":[144,189],"3:10":[181,183],"8:11":true,"9:6":true,"10:6":true,"7:6":true,"3:8":[180,182],"0:8":true,"6:11":true,"11:13":[172,185],"12:13":185,"12:14":185,"10:5":true,"9:11":[155,182],"3:7":[179,180],"10:11":true,"11:14":[171,172],"0:7":true,"12:15":184,"11:12":true,"3:9":[181,183],"12:12":true,"0:9":true,"7:11":true} \ No newline at end of file +{ + "8:8": true, + "6:10": true, + "13:13": 185, + "0:6": true, + "14:1": 191, + "13:15": 184, + "10:10": true, + "8:7": true, + "5:5": [ + 157, + 158 + ], + "0:2": true, + "9:10": true, + "13:12": true, + "15:1": 192, + "13:14": 185, + "0:3": true, + "8:9": true, + "7:10": true, + "0:4": true, + "2:1": true, + "14:14": 184, + "4:3": 158, + "5:4": 158, + "2:12": true, + "10:9": true, + "7:7": true, + "2:15": true, + "15:14": [ + 141, + 183 + ], + "9:9": true, + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": 158, + "3:5": 177, + "15:12": [ + 132, + 186 + ], + "14:15": [ + 134, + 183 + ], + "13:1": [ + 152, + 153 + ], + "4:2": 158, + "0:11": true, + "15:15": true, + "14:12": [ + 152, + 187 + ], + "9:7": true, + "3:11": 182, + "2:14": 182, + "1:13": true, + "2:13": true, + "7:8": true, + "6:9": true, + "1:14": true, + "5:0": [ + 132, + 133 + ], + "5:6": 158, + "4:0": 133, + "15:13": 184, + "1:15": true, + "10:8": true, + "6:7": true, + "1:12": true, + "9:8": true, + "14:13": 186, + "1:11": true, + "1:5": true, + "0:13": true, + "11:8": true, + "13:6": true, + "13:0": [ + 150, + 190 + ], + "12:8": true, + "14:11": 188, + "13:2": true, + "3:12": 182, + "11:9": true, + "15:5": true, + "14:5": true, + "0:12": true, + "15:11": [ + 132, + 188 + ], + "12:9": true, + "13:3": true, + "11:7": true, + "2:5": true, + "0:14": true, + "13:4": true, + "12:7": true, + "2:11": true, + "15:4": true, + "1:6": true, + "11:10": true, + "12:10": true, + "2:2": true, + "15:3": 192, + "14:4": true, + "2:4": true, + "14:2": 192, + "13:11": true, + "15:2": 192, + "3:1": 158, + "13:5": true, + "2:3": [ + 174, + 183 + ], + "15:0": 192, + "14:6": true, + "1:3": true, + "1:4": true, + "15:6": true, + "14:0": [ + 152, + 191 + ], + "1:2": true, + "2:6": true, + "15:9": 190, + "12:11": true, + "11:5": true, + "2:7": true, + "7:12": true, + "12:5": true, + "10:14": [ + 174, + 175 + ], + "7:15": [ + 155, + 157 + ], + "14:9": 191, + "11:11": true, + "10:12": true, + "2:9": true, + "9:12": [ + 154, + 182 + ], + "13:10": true, + "10:15": [ + 174, + 176 + ], + "7:14": true, + "7:13": true, + "2:8": true, + "15:8": 190, + "10:13": true, + "6:12": 160, + "1:7": true, + "14:8": 191, + "9:13": [ + 153, + 181 + ], + "11:0": [ + 141, + 188 + ], + "12:6": true, + "8:13": true, + "1:10": true, + "13:8": true, + "12:0": [ + 147, + 149 + ], + "6:1": [ + 132, + 133 + ], + "11:6": true, + "11:4": true, + "8:12": true, + "12:3": true, + "15:10": 189, + "14:10": [ + 132, + 189 + ], + "13:7": true, + "12:4": true, + "11:3": true, + "8:15": 154, + "12:2": true, + "2:10": true, + "11:2": true, + "8:14": true, + "13:9": true, + "12:1": [ + 149, + 151 + ], + "10:4": 184, + "6:6": true, + "11:1": [ + 144, + 189 + ], + "3:10": [ + 181, + 183 + ], + "8:11": true, + "9:6": true, + "10:6": true, + "7:6": true, + "3:8": [ + 180, + 182 + ], + "0:8": true, + "6:11": true, + "11:13": [ + 172, + 185 + ], + "12:13": 185, + "12:14": 185, + "10:5": true, + "9:11": [ + 155, + 182 + ], + "3:7": [ + 179, + 180 + ], + "10:11": true, + "11:14": [ + 171, + 172 + ], + "0:7": true, + "12:15": 184, + "11:12": true, + "3:9": [ + 181, + 183 + ], + "12:12": true, + "0:9": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/3_-1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/3_-1.json index d4457364..1935090e 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/3_-1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/3_-1.json @@ -1 +1,27 @@ -{"15:4":true,"15:9":true,"2:12":true,"7:12":true,"15:3":true,"6:11":true,"10:12":true,"15:12":true,"13:11":true,"15:2":true,"14:12":true,"14:7":true,"9:12":true,"4:12":true,"14:6":true,"8:12":true,"3:12":true,"15:10":true,"5:11":true,"0:12":true,"15:11":true,"15:8":true,"11:12":true,"1:12":true,"14:8":true} \ No newline at end of file +{ + "15:4": true, + "15:9": true, + "2:12": true, + "7:12": true, + "15:3": true, + "6:11": true, + "10:12": true, + "15:12": true, + "13:11": true, + "15:2": true, + "14:12": true, + "14:7": true, + "9:12": true, + "4:12": true, + "14:6": true, + "8:12": true, + "3:12": true, + "15:10": true, + "5:11": true, + "0:12": true, + "15:11": true, + "15:8": true, + "11:12": true, + "1:12": true, + "14:8": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/3_-10.json b/src/main/resources/assets/notenoughupdates/dwarven_data/3_-10.json index b6c9743e..cac50614 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/3_-10.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/3_-10.json @@ -1 +1,5 @@ -{"5:12":true,"4:12":true,"3:11":true} \ No newline at end of file +{ + "5:12": true, + "4:12": true, + "3:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/3_-3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/3_-3.json index 5b792a9b..2bff09f0 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/3_-3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/3_-3.json @@ -1 +1,30 @@ -{"15:4":true,"14:3":203,"4:14":true,"4:3":true,"12:5":true,"5:14":true,"2:15":true,"7:15":true,"4:9":true,"14:4":true,"4:4":true,"5:12":true,"6:13":true,"4:15":true,"4:2":true,"5:15":true,"5:10":true,"0:15":true,"5:11":true,"3:15":true,"6:14":true,"5:13":true,"1:15":true,"0:14":true,"6:12":true,"13:4":true,"3:14":true,"6:15":true} \ No newline at end of file +{ + "15:4": true, + "14:3": 203, + "4:14": true, + "4:3": true, + "12:5": true, + "5:14": true, + "2:15": true, + "7:15": true, + "4:9": true, + "14:4": true, + "4:4": true, + "5:12": true, + "6:13": true, + "4:15": true, + "4:2": true, + "5:15": true, + "5:10": true, + "0:15": true, + "5:11": true, + "3:15": true, + "6:14": true, + "5:13": true, + "1:15": true, + "0:14": true, + "6:12": true, + "13:4": true, + "3:14": true, + "6:15": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/3_-4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/3_-4.json index 2cee3332..29e72fe4 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/3_-4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/3_-4.json @@ -1 +1,19 @@ -{"5:9":true,"4:9":true,"2:9":true,"4:7":true,"0:10":true,"4:11":true,"10:0":182,"5:11":true,"7:0":true,"5:8":true,"4:8":true,"3:8":true,"6:9":true,"5:10":true,"4:10":true,"3:9":true,"7:1":true} \ No newline at end of file +{ + "5:9": true, + "4:9": true, + "2:9": true, + "4:7": true, + "0:10": true, + "4:11": true, + "10:0": 182, + "5:11": true, + "7:0": true, + "5:8": true, + "4:8": true, + "3:8": true, + "6:9": true, + "5:10": true, + "4:10": true, + "3:9": true, + "7:1": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/3_-5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/3_-5.json index 09062bf7..0cf9c03f 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/3_-5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/3_-5.json @@ -1 +1,34 @@ -{"11:5":true,"10:4":true,"10:3":[185,186],"10:14":true,"6:6":187,"10:12":true,"3:0":true,"10:15":true,"10:2":[183,185],"5:5":186,"10:6":true,"10:13":true,"4:3":true,"6:5":187,"5:3":181,"9:7":true,"11:4":true,"10:5":[186,187],"11:3":[183,184],"6:7":187} \ No newline at end of file +{ + "11:5": true, + "10:4": true, + "10:3": [ + 185, + 186 + ], + "10:14": true, + "6:6": 187, + "10:12": true, + "3:0": true, + "10:15": true, + "10:2": [ + 183, + 185 + ], + "5:5": 186, + "10:6": true, + "10:13": true, + "4:3": true, + "6:5": 187, + "5:3": 181, + "9:7": true, + "11:4": true, + "10:5": [ + 186, + 187 + ], + "11:3": [ + 183, + 184 + ], + "6:7": 187 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/3_-6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/3_-6.json index eb9d426f..cab1d428 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/3_-6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/3_-6.json @@ -1 +1,58 @@ -{"12:11":true,"1:1":[188,189],"7:12":true,"6:13":true,"2:9":true,"0:6":true,"13:10":true,"7:14":true,"1:8":true,"0:2":true,"7:13":true,"2:8":true,"5:11":true,"6:14":true,"1:9":true,"0:3":true,"6:12":true,"0:4":true,"2:1":[187,188],"8:13":true,"10:7":214,"0:5":true,"8:14":188,"1:5":true,"9:4":217,"3:10":true,"4:1":185,"3:12":true,"5:14":true,"2:2":[189,190],"0:8":true,"6:11":true,"5:12":true,"13:11":true,"0:1":true,"3:1":[185,186],"5:15":true,"1:3":true,"4:10":true,"1:4":true,"0:7":true,"5:13":true,"1:2":true,"7:11":true} \ No newline at end of file +{ + "12:11": true, + "1:1": [ + 188, + 189 + ], + "7:12": true, + "6:13": true, + "2:9": true, + "0:6": true, + "13:10": true, + "7:14": true, + "1:8": true, + "0:2": true, + "7:13": true, + "2:8": true, + "5:11": true, + "6:14": true, + "1:9": true, + "0:3": true, + "6:12": true, + "0:4": true, + "2:1": [ + 187, + 188 + ], + "8:13": true, + "10:7": 214, + "0:5": true, + "8:14": 188, + "1:5": true, + "9:4": 217, + "3:10": true, + "4:1": 185, + "3:12": true, + "5:14": true, + "2:2": [ + 189, + 190 + ], + "0:8": true, + "6:11": true, + "5:12": true, + "13:11": true, + "0:1": true, + "3:1": [ + 185, + 186 + ], + "5:15": true, + "1:3": true, + "4:10": true, + "1:4": true, + "0:7": true, + "5:13": true, + "1:2": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/3_0.json b/src/main/resources/assets/notenoughupdates/dwarven_data/3_0.json index 0d735233..1ac48101 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/3_0.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/3_0.json @@ -1 +1,55 @@ -{"7:12":true,"3:0":true,"0:0":[198,202],"8:7":146,"11:0":true,"2:12":true,"7:7":[146,147],"12:0":true,"6:1":true,"3:5":[151,153],"15:12":222,"13:1":205,"0:11":true,"5:0":true,"5:6":[149,150],"4:0":true,"1:12":225,"6:0":true,"12:1":true,"1:11":true,"0:13":224,"6:6":149,"13:0":true,"8:11":true,"0:10":true,"10:0":true,"5:1":true,"9:0":true,"7:0":true,"2:11":true,"1:0":true,"8:0":true,"15:0":[198,202],"14:0":[198,202],"2:0":true} \ No newline at end of file +{ + "7:12": true, + "3:0": true, + "0:0": [ + 198, + 202 + ], + "8:7": 146, + "11:0": true, + "2:12": true, + "7:7": [ + 146, + 147 + ], + "12:0": true, + "6:1": true, + "3:5": [ + 151, + 153 + ], + "15:12": 222, + "13:1": 205, + "0:11": true, + "5:0": true, + "5:6": [ + 149, + 150 + ], + "4:0": true, + "1:12": 225, + "6:0": true, + "12:1": true, + "1:11": true, + "0:13": 224, + "6:6": 149, + "13:0": true, + "8:11": true, + "0:10": true, + "10:0": true, + "5:1": true, + "9:0": true, + "7:0": true, + "2:11": true, + "1:0": true, + "8:0": true, + "15:0": [ + 198, + 202 + ], + "14:0": [ + 198, + 202 + ], + "2:0": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/3_11.json b/src/main/resources/assets/notenoughupdates/dwarven_data/3_11.json index 051878c9..07a9fcf6 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/3_11.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/3_11.json @@ -1 +1,47 @@ -{"11:0":152,"12:11":true,"9:3":true,"9:14":true,"6:0":152,"1:1":true,"1:11":true,"1:10":true,"9:9":true,"1:0":true,"11:11":true,"9:4":true,"3:0":153,"13:11":true,"9:15":true,"9:2":true,"0:1":true,"0:0":true,"9:7":true,"9:12":true,"3:1":152,"14:11":true,"9:1":true,"9:6":true,"4:1":152,"1:3":true,"0:2":true,"5:0":153,"10:11":true,"9:5":true,"9:10":true,"5:1":true,"15:11":true,"9:0":true,"4:0":153,"2:0":true,"0:3":true,"1:12":true,"0:4":true,"9:8":true,"9:13":true,"2:1":[150,152]} \ No newline at end of file +{ + "11:0": 152, + "12:11": true, + "9:3": true, + "9:14": true, + "6:0": 152, + "1:1": true, + "1:11": true, + "1:10": true, + "9:9": true, + "1:0": true, + "11:11": true, + "9:4": true, + "3:0": 153, + "13:11": true, + "9:15": true, + "9:2": true, + "0:1": true, + "0:0": true, + "9:7": true, + "9:12": true, + "3:1": 152, + "14:11": true, + "9:1": true, + "9:6": true, + "4:1": 152, + "1:3": true, + "0:2": true, + "5:0": 153, + "10:11": true, + "9:5": true, + "9:10": true, + "5:1": true, + "15:11": true, + "9:0": true, + "4:0": 153, + "2:0": true, + "0:3": true, + "1:12": true, + "0:4": true, + "9:8": true, + "9:13": true, + "2:1": [ + 150, + 152 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/3_3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/3_3.json index dfd5cdf8..8cde17ab 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/3_3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/3_3.json @@ -1 +1,22 @@ -{"7:12":true,"7:2":true,"7:15":true,"7:4":true,"7:3":true,"7:14":true,"14:1":true,"7:13":true,"2:5":true,"6:12":true,"4:14":true,"6:1":true,"5:12":true,"3:5":true,"14:2":true,"4:15":true,"4:12":true,"8:2":true,"7:1":true,"4:13":true} \ No newline at end of file +{ + "7:12": true, + "7:2": true, + "7:15": true, + "7:4": true, + "7:3": true, + "7:14": true, + "14:1": true, + "7:13": true, + "2:5": true, + "6:12": true, + "4:14": true, + "6:1": true, + "5:12": true, + "3:5": true, + "14:2": true, + "4:15": true, + "4:12": true, + "8:2": true, + "7:1": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/3_4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/3_4.json index f6207f88..e99a3f13 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/3_4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/3_4.json @@ -1 +1,52 @@ -{"6:0":true,"0:6":true,"4:1":true,"0:2":true,"5:1":true,"7:0":true,"0:3":true,"7:10":[167,168],"6:12":172,"0:4":true,"6:15":[173,174],"0:8":true,"9:9":[166,167],"6:11":[166,170],"6:1":true,"10:7":167,"8:10":[164,167],"5:15":[174,176],"0:5":true,"5:0":true,"0:7":true,"4:0":true,"10:8":[166,167],"0:9":true,"7:11":[165,166],"7:1":true} \ No newline at end of file +{ + "6:0": true, + "0:6": true, + "4:1": true, + "0:2": true, + "5:1": true, + "7:0": true, + "0:3": true, + "7:10": [ + 167, + 168 + ], + "6:12": 172, + "0:4": true, + "6:15": [ + 173, + 174 + ], + "0:8": true, + "9:9": [ + 166, + 167 + ], + "6:11": [ + 166, + 170 + ], + "6:1": true, + "10:7": 167, + "8:10": [ + 164, + 167 + ], + "5:15": [ + 174, + 176 + ], + "0:5": true, + "5:0": true, + "0:7": true, + "4:0": true, + "10:8": [ + 166, + 167 + ], + "0:9": true, + "7:11": [ + 165, + 166 + ], + "7:1": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/3_5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/3_5.json index ded0da87..2703053d 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/3_5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/3_5.json @@ -1 +1,19 @@ -{"5:11":true,"4:10":true,"7:15":[138,171],"8:15":[140,171],"6:14":true,"5:12":true,"6:13":true,"5:13":true,"6:12":true,"6:15":true,"7:14":171} \ No newline at end of file +{ + "5:11": true, + "4:10": true, + "7:15": [ + 138, + 171 + ], + "8:15": [ + 140, + 171 + ], + "6:14": true, + "5:12": true, + "6:13": true, + "5:13": true, + "6:12": true, + "6:15": true, + "7:14": 171 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/3_6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/3_6.json index e283ddec..02d5d9bb 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/3_6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/3_6.json @@ -1 +1,79 @@ -{"8:8":true,"7:12":true,"10:14":true,"7:15":true,"10:12":true,"9:15":true,"0:6":true,"9:12":true,"8:1":181,"13:10":[171,172],"10:15":true,"7:14":true,"4:11":true,"7:13":true,"5:11":true,"0:3":true,"8:9":true,"0:4":true,"6:15":true,"8:13":true,"15:14":170,"9:9":true,"15:12":172,"14:12":171,"9:7":true,"0:5":true,"8:12":true,"7:8":true,"15:13":171,"9:8":true,"7:2":183,"8:5":true,"8:11":true,"0:10":true,"7:3":true,"14:11":[170,171],"9:6":[189,190],"12:9":[170,171],"7:0":170,"7:6":true,"4:14":true,"0:8":true,"6:11":true,"4:15":true,"8:6":true,"4:12":true,"5:15":true,"10:11":196,"9:5":[187,188],"8:2":169,"0:7":true,"12:15":194,"8:4":186,"7:5":true,"11:15":true,"8:3":[183,185],"0:9":true,"7:11":true,"4:13":true} \ No newline at end of file +{ + "8:8": true, + "7:12": true, + "10:14": true, + "7:15": true, + "10:12": true, + "9:15": true, + "0:6": true, + "9:12": true, + "8:1": 181, + "13:10": [ + 171, + 172 + ], + "10:15": true, + "7:14": true, + "4:11": true, + "7:13": true, + "5:11": true, + "0:3": true, + "8:9": true, + "0:4": true, + "6:15": true, + "8:13": true, + "15:14": 170, + "9:9": true, + "15:12": 172, + "14:12": 171, + "9:7": true, + "0:5": true, + "8:12": true, + "7:8": true, + "15:13": 171, + "9:8": true, + "7:2": 183, + "8:5": true, + "8:11": true, + "0:10": true, + "7:3": true, + "14:11": [ + 170, + 171 + ], + "9:6": [ + 189, + 190 + ], + "12:9": [ + 170, + 171 + ], + "7:0": 170, + "7:6": true, + "4:14": true, + "0:8": true, + "6:11": true, + "4:15": true, + "8:6": true, + "4:12": true, + "5:15": true, + "10:11": 196, + "9:5": [ + 187, + 188 + ], + "8:2": 169, + "0:7": true, + "12:15": 194, + "8:4": 186, + "7:5": true, + "11:15": true, + "8:3": [ + 183, + 185 + ], + "0:9": true, + "7:11": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/3_7.json b/src/main/resources/assets/notenoughupdates/dwarven_data/3_7.json index 208d6c92..beb2731e 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/3_7.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/3_7.json @@ -1 +1,16 @@ -{"6:0":true,"7:15":true,"12:0":true,"12:13":true,"10:15":true,"12:14":true,"10:0":true,"5:0":true,"10:1":true,"11:14":true,"4:0":true,"7:0":true,"11:2":true,"6:15":true} \ No newline at end of file +{ + "6:0": true, + "7:15": true, + "12:0": true, + "12:13": true, + "10:15": true, + "12:14": true, + "10:0": true, + "5:0": true, + "10:1": true, + "11:14": true, + "4:0": true, + "7:0": true, + "11:2": true, + "6:15": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/4_-1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/4_-1.json index 24c0a054..57fcf162 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/4_-1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/4_-1.json @@ -1 +1,49 @@ -{"1:1":true,"11:11":true,"3:0":true,"4:11":205,"0:2":true,"9:10":225,"3:2":true,"2:1":true,"2:15":true,"8:10":225,"0:11":true,"3:11":205,"2:14":true,"1:13":[164,166],"4:6":true,"1:14":165,"5:0":true,"5:6":true,"4:0":true,"1:12":[198,201],"5:7":true,"8:11":225,"4:7":true,"0:10":true,"4:1":true,"3:15":true,"0:12":[165,202],"5:8":true,"3:14":true,"4:8":true,"2:2":true,"0:1":true,"3:1":true,"9:11":224,"10:11":true,"2:0":true,"1:2":true,"7:11":true} \ No newline at end of file +{ + "1:1": true, + "11:11": true, + "3:0": true, + "4:11": 205, + "0:2": true, + "9:10": 225, + "3:2": true, + "2:1": true, + "2:15": true, + "8:10": 225, + "0:11": true, + "3:11": 205, + "2:14": true, + "1:13": [ + 164, + 166 + ], + "4:6": true, + "1:14": 165, + "5:0": true, + "5:6": true, + "4:0": true, + "1:12": [ + 198, + 201 + ], + "5:7": true, + "8:11": 225, + "4:7": true, + "0:10": true, + "4:1": true, + "3:15": true, + "0:12": [ + 165, + 202 + ], + "5:8": true, + "3:14": true, + "4:8": true, + "2:2": true, + "0:1": true, + "3:1": true, + "9:11": 224, + "10:11": true, + "2:0": true, + "1:2": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/4_-2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/4_-2.json index eb8125af..520d0e1f 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/4_-2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/4_-2.json @@ -1 +1,8 @@ -{"15:7":true,"14:7":true,"3:15":true,"0:4":212,"2:15":true,"12:12":true} \ No newline at end of file +{ + "15:7": true, + "14:7": true, + "3:15": true, + "0:4": 212, + "2:15": true, + "12:12": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/4_-8.json b/src/main/resources/assets/notenoughupdates/dwarven_data/4_-8.json index e604dcb9..76bfe654 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/4_-8.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/4_-8.json @@ -1 +1,69 @@ -{"15:9":true,"12:11":true,"13:13":true,"10:14":true,"14:9":true,"11:11":true,"10:12":true,"3:0":226,"14:7":true,"9:12":true,"13:10":true,"13:15":true,"10:10":true,"13:12":true,"15:1":210,"15:8":true,"13:14":true,"10:13":true,"14:8":true,"9:13":true,"14:14":true,"12:6":true,"13:8":true,"15:14":true,"15:12":true,"14:15":true,"15:15":true,"14:12":true,"15:10":true,"14:10":true,"13:7":true,"15:13":true,"13:9":true,"14:13":true,"11:8":true,"13:6":true,"12:8":true,"14:11":true,"11:9":true,"15:5":true,"10:0":221,"14:5":true,"15:11":true,"12:9":true,"13:4":true,"12:7":true,"15:4":true,"14:3":true,"11:10":true,"12:10":true,"15:3":true,"14:4":true,"11:13":true,"14:2":210,"13:11":true,"15:2":211,"13:5":true,"12:13":true,"14:6":true,"12:14":true,"10:11":true,"11:14":true,"15:6":true,"12:15":true,"11:12":true,"12:12":true,"11:15":true} \ No newline at end of file +{ + "15:9": true, + "12:11": true, + "13:13": true, + "10:14": true, + "14:9": true, + "11:11": true, + "10:12": true, + "3:0": 226, + "14:7": true, + "9:12": true, + "13:10": true, + "13:15": true, + "10:10": true, + "13:12": true, + "15:1": 210, + "15:8": true, + "13:14": true, + "10:13": true, + "14:8": true, + "9:13": true, + "14:14": true, + "12:6": true, + "13:8": true, + "15:14": true, + "15:12": true, + "14:15": true, + "15:15": true, + "14:12": true, + "15:10": true, + "14:10": true, + "13:7": true, + "15:13": true, + "13:9": true, + "14:13": true, + "11:8": true, + "13:6": true, + "12:8": true, + "14:11": true, + "11:9": true, + "15:5": true, + "10:0": 221, + "14:5": true, + "15:11": true, + "12:9": true, + "13:4": true, + "12:7": true, + "15:4": true, + "14:3": true, + "11:10": true, + "12:10": true, + "15:3": true, + "14:4": true, + "11:13": true, + "14:2": 210, + "13:11": true, + "15:2": 211, + "13:5": true, + "12:13": true, + "14:6": true, + "12:14": true, + "10:11": true, + "11:14": true, + "15:6": true, + "12:15": true, + "11:12": true, + "12:12": true, + "11:15": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/4_-9.json b/src/main/resources/assets/notenoughupdates/dwarven_data/4_-9.json index a4276076..ded6312e 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/4_-9.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/4_-9.json @@ -1 +1,4 @@ -{"0:12":true,"1:12":true} \ No newline at end of file +{ + "0:12": true, + "1:12": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/4_0.json b/src/main/resources/assets/notenoughupdates/dwarven_data/4_0.json index f9d3a234..2e59477c 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/4_0.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/4_0.json @@ -1 +1,129 @@ -{"6:10":[212,214],"13:13":true,"7:15":true,"15:7":true,"3:0":[161,202],"0:0":[198,202],"8:1":true,"7:14":true,"5:5":true,"7:13":true,"13:12":true,"7:10":true,"6:15":true,"11:0":[158,204],"4:3":165,"5:4":true,"12:0":[159,199],"4:2":[164,165],"0:11":202,"15:15":true,"9:1":169,"5:0":[198,202],"10:1":168,"12:4":true,"8:15":true,"4:0":[198,202],"12:2":166,"2:10":203,"11:2":167,"8:14":true,"9:3":169,"6:0":[198,202],"1:11":203,"10:3":168,"7:2":true,"11:1":167,"7:4":true,"9:2":169,"13:0":[160,198],"10:2":168,"7:3":true,"13:2":159,"4:1":205,"6:4":true,"15:5":[159,160],"10:0":[198,204],"14:5":159,"9:0":[198,202],"6:3":true,"7:0":[198,202],"13:3":true,"13:4":true,"6:2":true,"2:11":204,"15:4":[159,161],"14:3":true,"6:5":true,"15:3":[158,160],"1:0":true,"14:4":true,"8:0":[198,202],"14:2":160,"15:2":true,"3:1":[162,205],"13:5":true,"14:6":158,"8:2":true,"15:6":true,"2:0":true,"12:15":true,"7:5":168,"3:9":true,"8:3":true} \ No newline at end of file +{ + "6:10": [ + 212, + 214 + ], + "13:13": true, + "7:15": true, + "15:7": true, + "3:0": [ + 161, + 202 + ], + "0:0": [ + 198, + 202 + ], + "8:1": true, + "7:14": true, + "5:5": true, + "7:13": true, + "13:12": true, + "7:10": true, + "6:15": true, + "11:0": [ + 158, + 204 + ], + "4:3": 165, + "5:4": true, + "12:0": [ + 159, + 199 + ], + "4:2": [ + 164, + 165 + ], + "0:11": 202, + "15:15": true, + "9:1": 169, + "5:0": [ + 198, + 202 + ], + "10:1": 168, + "12:4": true, + "8:15": true, + "4:0": [ + 198, + 202 + ], + "12:2": 166, + "2:10": 203, + "11:2": 167, + "8:14": true, + "9:3": 169, + "6:0": [ + 198, + 202 + ], + "1:11": 203, + "10:3": 168, + "7:2": true, + "11:1": 167, + "7:4": true, + "9:2": 169, + "13:0": [ + 160, + 198 + ], + "10:2": 168, + "7:3": true, + "13:2": 159, + "4:1": 205, + "6:4": true, + "15:5": [ + 159, + 160 + ], + "10:0": [ + 198, + 204 + ], + "14:5": 159, + "9:0": [ + 198, + 202 + ], + "6:3": true, + "7:0": [ + 198, + 202 + ], + "13:3": true, + "13:4": true, + "6:2": true, + "2:11": 204, + "15:4": [ + 159, + 161 + ], + "14:3": true, + "6:5": true, + "15:3": [ + 158, + 160 + ], + "1:0": true, + "14:4": true, + "8:0": [ + 198, + 202 + ], + "14:2": 160, + "15:2": true, + "3:1": [ + 162, + 205 + ], + "13:5": true, + "14:6": 158, + "8:2": true, + "15:6": true, + "2:0": true, + "12:15": true, + "7:5": 168, + "3:9": true, + "8:3": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/4_6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/4_6.json index 5dd48953..b283ecd9 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/4_6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/4_6.json @@ -1 +1,61 @@ -{"9:14":true,"8:8":true,"7:12":true,"10:14":true,"7:15":true,"11:11":true,"10:12":true,"6:13":true,"15:7":true,"9:15":true,"9:12":true,"10:15":true,"7:14":true,"13:15":true,"10:10":true,"7:13":true,"9:10":true,"15:1":true,"6:14":true,"10:13":true,"8:9":true,"7:10":true,"6:15":true,"9:13":true,"8:13":true,"10:9":true,"2:15":175,"9:9":true,"8:10":true,"7:9":true,"9:7":true,"8:12":true,"8:15":true,"2:10":150,"1:15":190,"10:8":true,"8:14":true,"8:5":true,"11:8":true,"8:11":true,"12:8":true,"9:6":true,"3:12":158,"11:9":true,"15:5":true,"15:4":true,"11:10":true,"15:3":true,"11:13":true,"15:2":true,"8:6":true,"15:0":true,"9:11":true,"10:11":true,"11:14":true,"15:6":true,"12:15":true,"11:12":true,"11:15":true} \ No newline at end of file +{ + "9:14": true, + "8:8": true, + "7:12": true, + "10:14": true, + "7:15": true, + "11:11": true, + "10:12": true, + "6:13": true, + "15:7": true, + "9:15": true, + "9:12": true, + "10:15": true, + "7:14": true, + "13:15": true, + "10:10": true, + "7:13": true, + "9:10": true, + "15:1": true, + "6:14": true, + "10:13": true, + "8:9": true, + "7:10": true, + "6:15": true, + "9:13": true, + "8:13": true, + "10:9": true, + "2:15": 175, + "9:9": true, + "8:10": true, + "7:9": true, + "9:7": true, + "8:12": true, + "8:15": true, + "2:10": 150, + "1:15": 190, + "10:8": true, + "8:14": true, + "8:5": true, + "11:8": true, + "8:11": true, + "12:8": true, + "9:6": true, + "3:12": 158, + "11:9": true, + "15:5": true, + "15:4": true, + "11:10": true, + "15:3": true, + "11:13": true, + "15:2": true, + "8:6": true, + "15:0": true, + "9:11": true, + "10:11": true, + "11:14": true, + "15:6": true, + "12:15": true, + "11:12": true, + "11:15": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/5_-5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/5_-5.json index 07d74c09..5abb4b54 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/5_-5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/5_-5.json @@ -1 +1,7 @@ -{"9:12":210,"8:15":[205,206]} \ No newline at end of file +{ + "9:12": 210, + "8:15": [ + 205, + 206 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/5_-6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/5_-6.json index 9d96fa2f..81d36f69 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/5_-6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/5_-6.json @@ -1 +1,8 @@ -{"15:4":217,"15:5":216,"15:3":218,"15:6":true,"15:8":true,"15:7":true} \ No newline at end of file +{ + "15:4": 217, + "15:5": 216, + "15:3": 218, + "15:6": true, + "15:8": true, + "15:7": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/5_-8.json b/src/main/resources/assets/notenoughupdates/dwarven_data/5_-8.json index 7854cd61..b18293dd 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/5_-8.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/5_-8.json @@ -1 +1,102 @@ -{"1:1":true,"7:12":true,"6:10":true,"7:15":true,"2:9":true,"0:6":true,"3:6":true,"7:14":true,"1:8":true,"5:5":true,"4:11":true,"0:2":212,"7:13":true,"2:8":true,"5:11":true,"4:5":true,"3:2":212,"6:14":true,"1:9":true,"3:4":true,"0:3":true,"7:10":true,"6:12":true,"3:3":212,"0:4":true,"6:15":true,"4:3":212,"8:13":212,"5:4":212,"2:12":true,"5:3":212,"2:15":true,"1:10":true,"4:4":true,"7:9":true,"6:8":true,"3:5":true,"0:11":true,"3:11":true,"2:14":true,"1:13":true,"0:5":true,"8:12":222,"7:8":true,"6:9":true,"4:6":true,"2:13":true,"1:14":true,"5:6":true,"8:15":true,"2:10":true,"1:15":true,"8:14":true,"1:12":true,"1:11":true,"3:13":true,"5:9":true,"1:5":true,"0:13":true,"6:6":true,"4:9":true,"3:10":true,"0:10":true,"3:12":true,"0:15":true,"6:4":212,"3:15":true,"0:12":true,"2:5":true,"0:14":true,"5:8":true,"3:14":true,"4:8":true,"2:11":true,"4:14":true,"1:6":true,"6:5":true,"3:8":true,"5:14":true,"2:2":212,"0:8":true,"6:11":true,"5:12":true,"2:4":true,"4:15":true,"0:1":211,"4:12":true,"5:15":true,"2:3":true,"5:10":true,"1:3":true,"4:10":true,"1:4":true,"5:13":true,"1:2":212,"3:9":true,"0:9":true,"7:11":true,"4:13":true,"2:6":true} \ No newline at end of file +{ + "1:1": true, + "7:12": true, + "6:10": true, + "7:15": true, + "2:9": true, + "0:6": true, + "3:6": true, + "7:14": true, + "1:8": true, + "5:5": true, + "4:11": true, + "0:2": 212, + "7:13": true, + "2:8": true, + "5:11": true, + "4:5": true, + "3:2": 212, + "6:14": true, + "1:9": true, + "3:4": true, + "0:3": true, + "7:10": true, + "6:12": true, + "3:3": 212, + "0:4": true, + "6:15": true, + "4:3": 212, + "8:13": 212, + "5:4": 212, + "2:12": true, + "5:3": 212, + "2:15": true, + "1:10": true, + "4:4": true, + "7:9": true, + "6:8": true, + "3:5": true, + "0:11": true, + "3:11": true, + "2:14": true, + "1:13": true, + "0:5": true, + "8:12": 222, + "7:8": true, + "6:9": true, + "4:6": true, + "2:13": true, + "1:14": true, + "5:6": true, + "8:15": true, + "2:10": true, + "1:15": true, + "8:14": true, + "1:12": true, + "1:11": true, + "3:13": true, + "5:9": true, + "1:5": true, + "0:13": true, + "6:6": true, + "4:9": true, + "3:10": true, + "0:10": true, + "3:12": true, + "0:15": true, + "6:4": 212, + "3:15": true, + "0:12": true, + "2:5": true, + "0:14": true, + "5:8": true, + "3:14": true, + "4:8": true, + "2:11": true, + "4:14": true, + "1:6": true, + "6:5": true, + "3:8": true, + "5:14": true, + "2:2": 212, + "0:8": true, + "6:11": true, + "5:12": true, + "2:4": true, + "4:15": true, + "0:1": 211, + "4:12": true, + "5:15": true, + "2:3": true, + "5:10": true, + "1:3": true, + "4:10": true, + "1:4": true, + "5:13": true, + "1:2": 212, + "3:9": true, + "0:9": true, + "7:11": true, + "4:13": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/5_0.json b/src/main/resources/assets/notenoughupdates/dwarven_data/5_0.json index 53a6fea3..cfa532fa 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/5_0.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/5_0.json @@ -1 +1,10 @@ -{"1:1":true,"7:3":198,"6:3":[196,197],"13:14":193,"5:3":196} \ No newline at end of file +{ + "1:1": true, + "7:3": 198, + "6:3": [ + 196, + 197 + ], + "13:14": 193, + "5:3": 196 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/5_10.json b/src/main/resources/assets/notenoughupdates/dwarven_data/5_10.json index deaaa360..c87f7fa3 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/5_10.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/5_10.json @@ -1 +1,161 @@ -{"9:14":true,"1:1":[153,171],"11:5":true,"2:7":true,"7:12":true,"6:10":true,"12:5":true,"10:14":true,"10:12":true,"6:13":true,"2:9":true,"3:0":[168,169],"0:6":true,"0:0":true,"9:12":true,"3:6":[171,227],"7:14":true,"14:1":true,"10:10":true,"5:5":true,"0:2":[151,173],"7:13":true,"9:10":true,"4:5":true,"6:14":true,"1:9":true,"10:13":true,"0:3":true,"8:9":true,"7:10":true,"6:12":true,"1:7":true,"9:13":true,"12:6":true,"8:13":true,"2:12":true,"10:9":true,"1:10":true,"12:0":true,"9:9":true,"11:6":true,"8:10":true,"7:9":true,"3:5":true,"13:1":true,"0:11":true,"3:11":true,"2:14":true,"1:13":true,"0:5":true,"12:3":true,"11:4":true,"8:12":true,"6:9":true,"4:6":[171,227],"2:13":true,"1:14":true,"5:0":[169,170],"5:6":[165,227],"12:4":true,"4:0":[168,170],"12:2":true,"2:10":true,"8:14":true,"1:12":true,"12:1":true,"1:11":true,"10:4":true,"3:13":true,"1:5":true,"0:13":true,"6:6":[164,227],"9:4":true,"8:5":true,"5:7":true,"3:10":true,"7:4":true,"13:6":true,"13:0":true,"8:11":true,"4:7":true,"0:10":true,"7:3":true,"13:2":true,"9:6":true,"3:12":true,"14:5":true,"10:6":true,"0:12":true,"13:3":true,"2:5":[172,201],"0:14":true,"13:4":true,"3:14":true,"7:6":[164,227],"2:11":true,"15:4":true,"1:6":true,"6:5":true,"2:2":true,"6:11":true,"1:0":152,"14:4":true,"14:2":true,"0:1":[152,172],"8:6":true,"13:5":true,"14:6":true,"10:5":true,"3:7":true,"9:11":true,"1:3":true,"10:11":true,"9:5":true,"1:4":true,"14:0":true,"2:0":168,"1:2":172,"7:5":true,"3:9":true,"0:9":true,"7:11":true,"2:6":true} \ No newline at end of file +{ + "9:14": true, + "1:1": [ + 153, + 171 + ], + "11:5": true, + "2:7": true, + "7:12": true, + "6:10": true, + "12:5": true, + "10:14": true, + "10:12": true, + "6:13": true, + "2:9": true, + "3:0": [ + 168, + 169 + ], + "0:6": true, + "0:0": true, + "9:12": true, + "3:6": [ + 171, + 227 + ], + "7:14": true, + "14:1": true, + "10:10": true, + "5:5": true, + "0:2": [ + 151, + 173 + ], + "7:13": true, + "9:10": true, + "4:5": true, + "6:14": true, + "1:9": true, + "10:13": true, + "0:3": true, + "8:9": true, + "7:10": true, + "6:12": true, + "1:7": true, + "9:13": true, + "12:6": true, + "8:13": true, + "2:12": true, + "10:9": true, + "1:10": true, + "12:0": true, + "9:9": true, + "11:6": true, + "8:10": true, + "7:9": true, + "3:5": true, + "13:1": true, + "0:11": true, + "3:11": true, + "2:14": true, + "1:13": true, + "0:5": true, + "12:3": true, + "11:4": true, + "8:12": true, + "6:9": true, + "4:6": [ + 171, + 227 + ], + "2:13": true, + "1:14": true, + "5:0": [ + 169, + 170 + ], + "5:6": [ + 165, + 227 + ], + "12:4": true, + "4:0": [ + 168, + 170 + ], + "12:2": true, + "2:10": true, + "8:14": true, + "1:12": true, + "12:1": true, + "1:11": true, + "10:4": true, + "3:13": true, + "1:5": true, + "0:13": true, + "6:6": [ + 164, + 227 + ], + "9:4": true, + "8:5": true, + "5:7": true, + "3:10": true, + "7:4": true, + "13:6": true, + "13:0": true, + "8:11": true, + "4:7": true, + "0:10": true, + "7:3": true, + "13:2": true, + "9:6": true, + "3:12": true, + "14:5": true, + "10:6": true, + "0:12": true, + "13:3": true, + "2:5": [ + 172, + 201 + ], + "0:14": true, + "13:4": true, + "3:14": true, + "7:6": [ + 164, + 227 + ], + "2:11": true, + "15:4": true, + "1:6": true, + "6:5": true, + "2:2": true, + "6:11": true, + "1:0": 152, + "14:4": true, + "14:2": true, + "0:1": [ + 152, + 172 + ], + "8:6": true, + "13:5": true, + "14:6": true, + "10:5": true, + "3:7": true, + "9:11": true, + "1:3": true, + "10:11": true, + "9:5": true, + "1:4": true, + "14:0": true, + "2:0": 168, + "1:2": 172, + "7:5": true, + "3:9": true, + "0:9": true, + "7:11": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/5_7.json b/src/main/resources/assets/notenoughupdates/dwarven_data/5_7.json index 85efb804..14670145 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/5_7.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/5_7.json @@ -1 +1,227 @@ -{"12:11":true,"9:14":true,"1:1":true,"11:5":true,"2:7":[122,123],"7:12":true,"6:10":true,"13:13":true,"12:5":true,"10:14":true,"7:15":true,"14:9":true,"11:11":true,"10:12":true,"2:9":true,"3:0":true,"9:15":true,"0:6":true,"0:0":true,"14:7":true,"9:12":true,"3:6":true,"13:10":true,"10:15":true,"7:14":true,"1:8":[120,173],"14:1":true,"13:15":true,"10:10":true,"4:11":true,"0:2":true,"7:13":true,"2:8":[119,171],"9:10":true,"5:11":[170,171],"4:5":true,"13:12":true,"15:1":true,"1:9":[174,175],"13:14":true,"10:13":true,"3:4":true,"0:3":true,"8:9":true,"7:10":true,"1:7":122,"0:4":true,"14:8":true,"9:13":true,"11:0":true,"14:14":true,"12:6":true,"8:13":true,"10:9":true,"5:3":true,"2:15":[175,177],"1:10":true,"13:8":true,"15:14":true,"9:9":true,"11:6":true,"4:4":true,"10:7":true,"8:10":true,"7:9":true,"6:8":true,"3:5":true,"15:12":true,"14:15":true,"0:11":true,"15:15":true,"14:12":true,"2:14":true,"0:5":true,"12:3":true,"11:4":true,"8:12":true,"7:8":true,"6:9":true,"4:6":true,"2:13":true,"15:10":true,"14:10":true,"10:1":true,"5:6":true,"13:7":true,"12:4":true,"8:15":true,"15:13":true,"12:2":true,"8:14":true,"13:9":true,"7:1":true,"14:13":true,"12:1":true,"1:11":true,"3:13":true,"5:9":126,"1:5":[122,123],"11:1":true,"5:7":true,"11:8":true,"13:6":true,"8:11":true,"4:7":true,"0:10":true,"12:8":true,"14:11":true,"13:2":true,"3:12":true,"11:9":true,"10:0":true,"15:11":true,"12:9":true,"9:0":true,"13:3":true,"11:7":true,"2:5":true,"5:8":true,"13:4":true,"12:7":true,"3:14":176,"6:2":true,"4:8":true,"15:4":true,"14:3":true,"4:14":[172,175],"1:6":[122,123],"11:10":true,"3:8":[118,122],"12:10":true,"5:14":[165,171],"0:8":[174,175],"15:3":true,"6:11":true,"1:0":true,"11:13":true,"5:12":[169,172],"2:4":true,"8:0":true,"14:2":true,"13:11":true,"4:15":[164,174],"0:1":true,"15:2":true,"4:12":true,"13:5":true,"12:13":true,"5:15":true,"15:0":true,"14:6":true,"12:14":true,"9:11":true,"3:7":true,"1:3":true,"4:10":171,"11:14":true,"1:4":true,"0:7":[121,172],"14:0":true,"2:0":true,"12:15":true,"11:12":true,"5:13":[167,173],"3:9":[171,172],"12:12":true,"11:15":true,"0:9":[176,177],"7:11":true,"4:13":174,"2:6":true} \ No newline at end of file +{ + "12:11": true, + "9:14": true, + "1:1": true, + "11:5": true, + "2:7": [ + 122, + 123 + ], + "7:12": true, + "6:10": true, + "13:13": true, + "12:5": true, + "10:14": true, + "7:15": true, + "14:9": true, + "11:11": true, + "10:12": true, + "2:9": true, + "3:0": true, + "9:15": true, + "0:6": true, + "0:0": true, + "14:7": true, + "9:12": true, + "3:6": true, + "13:10": true, + "10:15": true, + "7:14": true, + "1:8": [ + 120, + 173 + ], + "14:1": true, + "13:15": true, + "10:10": true, + "4:11": true, + "0:2": true, + "7:13": true, + "2:8": [ + 119, + 171 + ], + "9:10": true, + "5:11": [ + 170, + 171 + ], + "4:5": true, + "13:12": true, + "15:1": true, + "1:9": [ + 174, + 175 + ], + "13:14": true, + "10:13": true, + "3:4": true, + "0:3": true, + "8:9": true, + "7:10": true, + "1:7": 122, + "0:4": true, + "14:8": true, + "9:13": true, + "11:0": true, + "14:14": true, + "12:6": true, + "8:13": true, + "10:9": true, + "5:3": true, + "2:15": [ + 175, + 177 + ], + "1:10": true, + "13:8": true, + "15:14": true, + "9:9": true, + "11:6": true, + "4:4": true, + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": true, + "3:5": true, + "15:12": true, + "14:15": true, + "0:11": true, + "15:15": true, + "14:12": true, + "2:14": true, + "0:5": true, + "12:3": true, + "11:4": true, + "8:12": true, + "7:8": true, + "6:9": true, + "4:6": true, + "2:13": true, + "15:10": true, + "14:10": true, + "10:1": true, + "5:6": true, + "13:7": true, + "12:4": true, + "8:15": true, + "15:13": true, + "12:2": true, + "8:14": true, + "13:9": true, + "7:1": true, + "14:13": true, + "12:1": true, + "1:11": true, + "3:13": true, + "5:9": 126, + "1:5": [ + 122, + 123 + ], + "11:1": true, + "5:7": true, + "11:8": true, + "13:6": true, + "8:11": true, + "4:7": true, + "0:10": true, + "12:8": true, + "14:11": true, + "13:2": true, + "3:12": true, + "11:9": true, + "10:0": true, + "15:11": true, + "12:9": true, + "9:0": true, + "13:3": true, + "11:7": true, + "2:5": true, + "5:8": true, + "13:4": true, + "12:7": true, + "3:14": 176, + "6:2": true, + "4:8": true, + "15:4": true, + "14:3": true, + "4:14": [ + 172, + 175 + ], + "1:6": [ + 122, + 123 + ], + "11:10": true, + "3:8": [ + 118, + 122 + ], + "12:10": true, + "5:14": [ + 165, + 171 + ], + "0:8": [ + 174, + 175 + ], + "15:3": true, + "6:11": true, + "1:0": true, + "11:13": true, + "5:12": [ + 169, + 172 + ], + "2:4": true, + "8:0": true, + "14:2": true, + "13:11": true, + "4:15": [ + 164, + 174 + ], + "0:1": true, + "15:2": true, + "4:12": true, + "13:5": true, + "12:13": true, + "5:15": true, + "15:0": true, + "14:6": true, + "12:14": true, + "9:11": true, + "3:7": true, + "1:3": true, + "4:10": 171, + "11:14": true, + "1:4": true, + "0:7": [ + 121, + 172 + ], + "14:0": true, + "2:0": true, + "12:15": true, + "11:12": true, + "5:13": [ + 167, + 173 + ], + "3:9": [ + 171, + 172 + ], + "12:12": true, + "11:15": true, + "0:9": [ + 176, + 177 + ], + "7:11": true, + "4:13": 174, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/5_8.json b/src/main/resources/assets/notenoughupdates/dwarven_data/5_8.json index 0a576965..e6c41903 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/5_8.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/5_8.json @@ -1 +1,157 @@ -{"15:9":true,"12:11":true,"9:14":true,"8:8":true,"7:12":true,"6:10":true,"13:13":true,"12:5":true,"10:14":true,"7:15":true,"14:9":true,"11:11":true,"10:12":true,"6:13":true,"9:15":true,"14:7":true,"9:12":true,"8:1":true,"13:10":true,"10:15":true,"7:14":true,"14:1":true,"10:10":true,"8:7":true,"7:13":true,"9:10":true,"5:11":true,"13:12":true,"15:1":true,"6:14":true,"15:8":true,"13:14":true,"10:13":true,"8:9":true,"7:10":true,"6:12":true,"6:15":true,"14:8":true,"9:13":true,"2:1":true,"14:14":true,"12:6":true,"10:9":true,"7:7":true,"2:15":true,"13:8":true,"12:0":true,"9:9":true,"11:6":true,"10:7":true,"8:10":true,"7:9":true,"6:8":true,"13:1":true,"9:7":true,"12:3":true,"11:4":true,"9:1":true,"7:8":true,"6:9":true,"15:10":true,"14:10":true,"10:1":true,"5:6":true,"13:7":true,"11:3":true,"4:0":[162,169],"12:2":true,"10:8":true,"6:7":true,"11:2":true,"13:9":true,"9:8":true,"14:13":true,"12:1":true,"9:3":true,"10:4":true,"5:9":true,"10:3":true,"6:6":true,"11:1":true,"9:4":true,"8:5":true,"5:7":true,"11:8":true,"13:6":true,"9:2":true,"13:0":true,"8:11":true,"10:2":true,"12:8":true,"14:11":true,"13:2":true,"9:6":true,"4:1":[160,167],"11:9":true,"15:5":true,"10:0":true,"14:5":true,"10:6":true,"3:15":true,"15:11":true,"12:9":true,"9:0":true,"13:3":true,"11:7":true,"5:8":true,"12:7":true,"7:6":true,"15:4":true,"14:3":true,"11:10":true,"6:5":true,"12:10":true,"15:3":true,"6:11":true,"14:4":true,"11:13":true,"5:12":true,"8:0":true,"4:15":true,"14:2":true,"13:11":true,"15:2":true,"8:6":true,"5:15":true,"13:5":true,"12:13":true,"15:0":true,"14:6":true,"12:14":true,"10:5":true,"9:11":true,"5:10":true,"10:11":true,"9:5":true,"11:14":true,"8:2":true,"15:6":true,"14:0":true,"2:0":true,"12:15":true,"11:12":true,"5:13":true,"7:5":true,"12:12":true,"11:15":true,"8:3":true,"7:11":true} \ No newline at end of file +{ + "15:9": true, + "12:11": true, + "9:14": true, + "8:8": true, + "7:12": true, + "6:10": true, + "13:13": true, + "12:5": true, + "10:14": true, + "7:15": true, + "14:9": true, + "11:11": true, + "10:12": true, + "6:13": true, + "9:15": true, + "14:7": true, + "9:12": true, + "8:1": true, + "13:10": true, + "10:15": true, + "7:14": true, + "14:1": true, + "10:10": true, + "8:7": true, + "7:13": true, + "9:10": true, + "5:11": true, + "13:12": true, + "15:1": true, + "6:14": true, + "15:8": true, + "13:14": true, + "10:13": true, + "8:9": true, + "7:10": true, + "6:12": true, + "6:15": true, + "14:8": true, + "9:13": true, + "2:1": true, + "14:14": true, + "12:6": true, + "10:9": true, + "7:7": true, + "2:15": true, + "13:8": true, + "12:0": true, + "9:9": true, + "11:6": true, + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": true, + "13:1": true, + "9:7": true, + "12:3": true, + "11:4": true, + "9:1": true, + "7:8": true, + "6:9": true, + "15:10": true, + "14:10": true, + "10:1": true, + "5:6": true, + "13:7": true, + "11:3": true, + "4:0": [ + 162, + 169 + ], + "12:2": true, + "10:8": true, + "6:7": true, + "11:2": true, + "13:9": true, + "9:8": true, + "14:13": true, + "12:1": true, + "9:3": true, + "10:4": true, + "5:9": true, + "10:3": true, + "6:6": true, + "11:1": true, + "9:4": true, + "8:5": true, + "5:7": true, + "11:8": true, + "13:6": true, + "9:2": true, + "13:0": true, + "8:11": true, + "10:2": true, + "12:8": true, + "14:11": true, + "13:2": true, + "9:6": true, + "4:1": [ + 160, + 167 + ], + "11:9": true, + "15:5": true, + "10:0": true, + "14:5": true, + "10:6": true, + "3:15": true, + "15:11": true, + "12:9": true, + "9:0": true, + "13:3": true, + "11:7": true, + "5:8": true, + "12:7": true, + "7:6": true, + "15:4": true, + "14:3": true, + "11:10": true, + "6:5": true, + "12:10": true, + "15:3": true, + "6:11": true, + "14:4": true, + "11:13": true, + "5:12": true, + "8:0": true, + "4:15": true, + "14:2": true, + "13:11": true, + "15:2": true, + "8:6": true, + "5:15": true, + "13:5": true, + "12:13": true, + "15:0": true, + "14:6": true, + "12:14": true, + "10:5": true, + "9:11": true, + "5:10": true, + "10:11": true, + "9:5": true, + "11:14": true, + "8:2": true, + "15:6": true, + "14:0": true, + "2:0": true, + "12:15": true, + "11:12": true, + "5:13": true, + "7:5": true, + "12:12": true, + "11:15": true, + "8:3": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/5_9.json b/src/main/resources/assets/notenoughupdates/dwarven_data/5_9.json index cd6ee4fd..da6f35d7 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/5_9.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/5_9.json @@ -1 +1,197 @@ -{"12:11":true,"11:5":true,"2:7":true,"8:8":true,"7:12":[156,193],"6:10":true,"13:13":true,"12:5":true,"14:9":true,"10:12":true,"2:9":true,"15:7":true,"0:6":true,"14:7":true,"9:12":true,"3:6":true,"13:10":true,"1:8":true,"14:1":true,"13:15":true,"8:7":true,"5:5":true,"4:11":[154,170],"7:13":[157,193],"2:8":true,"9:10":true,"5:11":[156,158],"4:5":true,"13:12":true,"3:2":true,"15:1":true,"1:9":true,"15:8":true,"13:14":true,"3:4":true,"0:3":true,"8:9":true,"7:10":[154,161],"3:3":true,"1:7":true,"0:4":true,"14:8":true,"11:0":true,"14:14":true,"12:6":true,"4:3":true,"2:12":true,"10:9":true,"7:7":true,"2:15":155,"1:10":true,"13:8":true,"12:0":true,"11:6":true,"4:4":true,"10:7":true,"7:9":true,"6:8":true,"3:5":true,"15:12":true,"14:15":true,"13:1":true,"4:2":true,"0:11":true,"14:12":true,"9:7":true,"3:11":true,"2:14":[151,153],"1:13":true,"0:5":true,"2:13":true,"12:3":true,"11:4":true,"7:8":true,"6:9":true,"4:6":true,"1:14":true,"10:1":true,"5:6":true,"13:7":true,"12:4":true,"11:3":true,"12:2":true,"2:10":true,"1:15":true,"10:8":true,"6:7":true,"11:2":true,"8:14":true,"1:12":true,"13:9":true,"9:8":true,"12:1":true,"9:3":true,"1:11":true,"5:9":true,"10:3":true,"1:5":true,"0:13":true,"4:9":true,"11:1":true,"5:7":true,"3:10":true,"11:8":true,"7:4":true,"13:6":true,"8:11":193,"4:7":true,"0:10":true,"12:8":true,"13:2":true,"3:12":true,"0:15":true,"11:9":true,"15:5":true,"10:0":true,"14:5":true,"0:12":true,"12:9":true,"13:3":true,"11:7":true,"2:5":true,"0:14":true,"5:8":true,"13:4":true,"12:7":true,"3:14":155,"7:6":true,"4:8":true,"2:11":true,"15:4":true,"14:3":true,"1:6":true,"3:8":true,"12:10":true,"0:8":true,"15:3":true,"14:4":true,"11:13":true,"5:12":157,"2:4":true,"14:2":true,"13:11":true,"15:2":true,"4:12":[155,156],"13:5":true,"12:13":true,"2:3":true,"14:6":true,"12:14":true,"3:7":true,"5:10":[155,160],"1:3":true,"4:10":true,"1:4":true,"0:7":true,"15:6":true,"12:15":true,"11:12":true,"8:4":true,"7:5":true,"3:9":true,"12:12":true,"8:3":true,"0:9":true,"7:11":[155,160],"4:13":157,"2:6":true} \ No newline at end of file +{ + "12:11": true, + "11:5": true, + "2:7": true, + "8:8": true, + "7:12": [ + 156, + 193 + ], + "6:10": true, + "13:13": true, + "12:5": true, + "14:9": true, + "10:12": true, + "2:9": true, + "15:7": true, + "0:6": true, + "14:7": true, + "9:12": true, + "3:6": true, + "13:10": true, + "1:8": true, + "14:1": true, + "13:15": true, + "8:7": true, + "5:5": true, + "4:11": [ + 154, + 170 + ], + "7:13": [ + 157, + 193 + ], + "2:8": true, + "9:10": true, + "5:11": [ + 156, + 158 + ], + "4:5": true, + "13:12": true, + "3:2": true, + "15:1": true, + "1:9": true, + "15:8": true, + "13:14": true, + "3:4": true, + "0:3": true, + "8:9": true, + "7:10": [ + 154, + 161 + ], + "3:3": true, + "1:7": true, + "0:4": true, + "14:8": true, + "11:0": true, + "14:14": true, + "12:6": true, + "4:3": true, + "2:12": true, + "10:9": true, + "7:7": true, + "2:15": 155, + "1:10": true, + "13:8": true, + "12:0": true, + "11:6": true, + "4:4": true, + "10:7": true, + "7:9": true, + "6:8": true, + "3:5": true, + "15:12": true, + "14:15": true, + "13:1": true, + "4:2": true, + "0:11": true, + "14:12": true, + "9:7": true, + "3:11": true, + "2:14": [ + 151, + 153 + ], + "1:13": true, + "0:5": true, + "2:13": true, + "12:3": true, + "11:4": true, + "7:8": true, + "6:9": true, + "4:6": true, + "1:14": true, + "10:1": true, + "5:6": true, + "13:7": true, + "12:4": true, + "11:3": true, + "12:2": true, + "2:10": true, + "1:15": true, + "10:8": true, + "6:7": true, + "11:2": true, + "8:14": true, + "1:12": true, + "13:9": true, + "9:8": true, + "12:1": true, + "9:3": true, + "1:11": true, + "5:9": true, + "10:3": true, + "1:5": true, + "0:13": true, + "4:9": true, + "11:1": true, + "5:7": true, + "3:10": true, + "11:8": true, + "7:4": true, + "13:6": true, + "8:11": 193, + "4:7": true, + "0:10": true, + "12:8": true, + "13:2": true, + "3:12": true, + "0:15": true, + "11:9": true, + "15:5": true, + "10:0": true, + "14:5": true, + "0:12": true, + "12:9": true, + "13:3": true, + "11:7": true, + "2:5": true, + "0:14": true, + "5:8": true, + "13:4": true, + "12:7": true, + "3:14": 155, + "7:6": true, + "4:8": true, + "2:11": true, + "15:4": true, + "14:3": true, + "1:6": true, + "3:8": true, + "12:10": true, + "0:8": true, + "15:3": true, + "14:4": true, + "11:13": true, + "5:12": 157, + "2:4": true, + "14:2": true, + "13:11": true, + "15:2": true, + "4:12": [ + 155, + 156 + ], + "13:5": true, + "12:13": true, + "2:3": true, + "14:6": true, + "12:14": true, + "3:7": true, + "5:10": [ + 155, + 160 + ], + "1:3": true, + "4:10": true, + "1:4": true, + "0:7": true, + "15:6": true, + "12:15": true, + "11:12": true, + "8:4": true, + "7:5": true, + "3:9": true, + "12:12": true, + "8:3": true, + "0:9": true, + "7:11": [ + 155, + 160 + ], + "4:13": 157, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/6_-3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/6_-3.json index ea179d82..9afd8d50 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/6_-3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/6_-3.json @@ -1 +1,12 @@ -{"10:14":[203,205],"13:15":true,"14:15":204,"12:14":222,"12:15":true,"5:13":208,"4:13":208} \ No newline at end of file +{ + "10:14": [ + 203, + 205 + ], + "13:15": true, + "14:15": 204, + "12:14": 222, + "12:15": true, + "5:13": 208, + "4:13": 208 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/6_0.json b/src/main/resources/assets/notenoughupdates/dwarven_data/6_0.json index 57d53e17..138ea888 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/6_0.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/6_0.json @@ -1 +1,65 @@ -{"9:14":true,"7:12":true,"13:13":true,"10:14":true,"7:15":true,"11:11":true,"10:12":true,"6:13":true,"13:6":true,"9:15":true,"9:12":true,"8:11":true,"13:10":true,"10:15":true,"7:14":true,"13:15":true,"10:10":true,"11:9":true,"7:13":true,"10:6":true,"13:12":true,"6:14":true,"13:14":true,"11:7":true,"10:13":true,"6:12":true,"6:15":true,"9:13":true,"14:14":true,"4:14":[188,224],"8:13":true,"10:9":true,"13:8":true,"15:14":true,"6:11":true,"11:13":true,"10:7":true,"14:15":true,"13:11":true,"4:15":true,"15:15":true,"10:5":[212,213],"9:11":true,"8:12":true,"9:5":true,"13:7":true,"11:14":true,"8:15":true,"11:12":true,"11:15":true,"8:14":true,"13:9":true,"7:11":true,"4:13":[188,223]} \ No newline at end of file +{ + "9:14": true, + "7:12": true, + "13:13": true, + "10:14": true, + "7:15": true, + "11:11": true, + "10:12": true, + "6:13": true, + "13:6": true, + "9:15": true, + "9:12": true, + "8:11": true, + "13:10": true, + "10:15": true, + "7:14": true, + "13:15": true, + "10:10": true, + "11:9": true, + "7:13": true, + "10:6": true, + "13:12": true, + "6:14": true, + "13:14": true, + "11:7": true, + "10:13": true, + "6:12": true, + "6:15": true, + "9:13": true, + "14:14": true, + "4:14": [ + 188, + 224 + ], + "8:13": true, + "10:9": true, + "13:8": true, + "15:14": true, + "6:11": true, + "11:13": true, + "10:7": true, + "14:15": true, + "13:11": true, + "4:15": true, + "15:15": true, + "10:5": [ + 212, + 213 + ], + "9:11": true, + "8:12": true, + "9:5": true, + "13:7": true, + "11:14": true, + "8:15": true, + "11:12": true, + "11:15": true, + "8:14": true, + "13:9": true, + "7:11": true, + "4:13": [ + 188, + 223 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/6_1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/6_1.json index 106e74e5..66594b9d 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/6_1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/6_1.json @@ -1 +1,233 @@ -{"12:11":171,"9:14":true,"11:5":true,"8:8":true,"7:12":true,"6:10":true,"13:13":[182,186],"10:14":236,"7:15":true,"11:11":[172,237],"10:12":true,"6:13":true,"9:15":235,"0:6":true,"9:12":true,"8:1":true,"13:10":[170,186],"10:15":235,"7:14":true,"14:1":true,"13:15":true,"10:10":true,"8:7":true,"5:5":true,"4:11":true,"0:2":[187,221],"7:13":true,"9:10":true,"5:11":true,"4:5":true,"13:12":true,"15:1":true,"6:14":true,"13:14":true,"10:13":[172,236],"0:3":[187,222],"8:9":true,"7:10":true,"6:12":true,"0:4":[189,222],"6:15":true,"9:13":true,"11:0":true,"14:14":true,"4:3":true,"8:13":true,"10:9":true,"7:7":true,"13:8":[182,186],"15:14":true,"9:9":true,"6:1":true,"11:6":true,"4:4":true,"10:7":true,"8:10":true,"7:9":true,"6:8":true,"15:12":true,"14:15":true,"13:1":true,"4:2":true,"0:11":true,"15:15":true,"14:12":true,"9:7":true,"0:5":[192,226],"11:4":true,"9:1":true,"8:12":true,"7:8":true,"6:9":true,"4:6":true,"15:10":true,"14:10":true,"10:1":true,"13:7":true,"11:3":true,"8:15":true,"4:0":true,"15:13":true,"10:8":true,"6:7":true,"11:2":true,"8:14":true,"13:9":[182,186],"9:8":true,"7:1":true,"14:13":true,"9:3":true,"6:0":true,"1:11":true,"10:4":true,"10:3":true,"1:5":true,"0:13":true,"7:2":true,"6:6":true,"4:9":true,"11:1":true,"9:4":true,"8:5":true,"11:8":true,"7:4":true,"13:6":true,"9:2":true,"13:0":true,"8:11":true,"4:7":true,"10:2":true,"0:10":true,"12:8":true,"7:3":true,"14:11":true,"13:2":true,"9:6":true,"4:1":true,"0:15":[187,221],"11:9":true,"6:4":true,"15:5":true,"10:0":true,"14:5":true,"10:6":true,"0:12":true,"15:11":true,"12:9":true,"9:0":true,"6:3":true,"7:0":true,"13:3":true,"11:7":true,"2:5":true,"0:14":[187,221],"13:4":true,"6:2":true,"7:6":true,"4:8":true,"2:11":true,"15:4":true,"14:3":true,"4:14":true,"11:10":true,"6:5":true,"12:10":[171,172],"0:8":true,"15:3":true,"6:11":true,"14:4":true,"11:13":true,"8:0":true,"14:2":true,"13:11":true,"4:15":true,"0:1":[187,221],"15:2":true,"8:6":true,"4:12":true,"13:5":true,"12:13":true,"15:0":true,"14:6":true,"12:14":true,"10:5":true,"9:11":true,"10:11":true,"9:5":true,"4:10":true,"11:14":[236,251],"8:2":true,"0:7":true,"15:6":true,"14:0":true,"12:15":true,"11:12":[171,251],"8:4":true,"7:5":true,"12:12":true,"11:15":true,"8:3":true,"0:9":true,"7:11":true,"4:13":true} \ No newline at end of file +{ + "12:11": 171, + "9:14": true, + "11:5": true, + "8:8": true, + "7:12": true, + "6:10": true, + "13:13": [ + 182, + 186 + ], + "10:14": 236, + "7:15": true, + "11:11": [ + 172, + 237 + ], + "10:12": true, + "6:13": true, + "9:15": 235, + "0:6": true, + "9:12": true, + "8:1": true, + "13:10": [ + 170, + 186 + ], + "10:15": 235, + "7:14": true, + "14:1": true, + "13:15": true, + "10:10": true, + "8:7": true, + "5:5": true, + "4:11": true, + "0:2": [ + 187, + 221 + ], + "7:13": true, + "9:10": true, + "5:11": true, + "4:5": true, + "13:12": true, + "15:1": true, + "6:14": true, + "13:14": true, + "10:13": [ + 172, + 236 + ], + "0:3": [ + 187, + 222 + ], + "8:9": true, + "7:10": true, + "6:12": true, + "0:4": [ + 189, + 222 + ], + "6:15": true, + "9:13": true, + "11:0": true, + "14:14": true, + "4:3": true, + "8:13": true, + "10:9": true, + "7:7": true, + "13:8": [ + 182, + 186 + ], + "15:14": true, + "9:9": true, + "6:1": true, + "11:6": true, + "4:4": true, + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": true, + "15:12": true, + "14:15": true, + "13:1": true, + "4:2": true, + "0:11": true, + "15:15": true, + "14:12": true, + "9:7": true, + "0:5": [ + 192, + 226 + ], + "11:4": true, + "9:1": true, + "8:12": true, + "7:8": true, + "6:9": true, + "4:6": true, + "15:10": true, + "14:10": true, + "10:1": true, + "13:7": true, + "11:3": true, + "8:15": true, + "4:0": true, + "15:13": true, + "10:8": true, + "6:7": true, + "11:2": true, + "8:14": true, + "13:9": [ + 182, + 186 + ], + "9:8": true, + "7:1": true, + "14:13": true, + "9:3": true, + "6:0": true, + "1:11": true, + "10:4": true, + "10:3": true, + "1:5": true, + "0:13": true, + "7:2": true, + "6:6": true, + "4:9": true, + "11:1": true, + "9:4": true, + "8:5": true, + "11:8": true, + "7:4": true, + "13:6": true, + "9:2": true, + "13:0": true, + "8:11": true, + "4:7": true, + "10:2": true, + "0:10": true, + "12:8": true, + "7:3": true, + "14:11": true, + "13:2": true, + "9:6": true, + "4:1": true, + "0:15": [ + 187, + 221 + ], + "11:9": true, + "6:4": true, + "15:5": true, + "10:0": true, + "14:5": true, + "10:6": true, + "0:12": true, + "15:11": true, + "12:9": true, + "9:0": true, + "6:3": true, + "7:0": true, + "13:3": true, + "11:7": true, + "2:5": true, + "0:14": [ + 187, + 221 + ], + "13:4": true, + "6:2": true, + "7:6": true, + "4:8": true, + "2:11": true, + "15:4": true, + "14:3": true, + "4:14": true, + "11:10": true, + "6:5": true, + "12:10": [ + 171, + 172 + ], + "0:8": true, + "15:3": true, + "6:11": true, + "14:4": true, + "11:13": true, + "8:0": true, + "14:2": true, + "13:11": true, + "4:15": true, + "0:1": [ + 187, + 221 + ], + "15:2": true, + "8:6": true, + "4:12": true, + "13:5": true, + "12:13": true, + "15:0": true, + "14:6": true, + "12:14": true, + "10:5": true, + "9:11": true, + "10:11": true, + "9:5": true, + "4:10": true, + "11:14": [ + 236, + 251 + ], + "8:2": true, + "0:7": true, + "15:6": true, + "14:0": true, + "12:15": true, + "11:12": [ + 171, + 251 + ], + "8:4": true, + "7:5": true, + "12:12": true, + "11:15": true, + "8:3": true, + "0:9": true, + "7:11": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/6_2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/6_2.json index 0c4de502..17a53bab 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/6_2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/6_2.json @@ -1 +1,184 @@ -{"12:11":true,"9:14":[168,232],"11:5":true,"7:12":true,"13:13":true,"12:5":true,"10:14":[168,232],"7:15":233,"11:11":true,"10:12":true,"6:13":true,"9:15":233,"0:0":[149,155],"9:12":true,"8:1":233,"13:10":true,"10:15":[168,233],"7:14":232,"14:1":true,"13:15":true,"10:10":true,"7:13":true,"9:10":true,"13:12":true,"15:1":true,"6:14":true,"13:14":true,"10:13":[165,231],"8:9":true,"7:10":true,"6:12":true,"6:15":true,"9:13":[169,231],"11:0":[234,252],"14:14":true,"12:6":true,"4:3":true,"8:13":[169,231],"5:4":true,"10:9":true,"13:8":true,"15:14":254,"12:0":true,"9:9":true,"6:1":true,"4:4":true,"10:7":true,"8:10":true,"7:9":true,"14:15":true,"13:1":true,"4:2":true,"15:15":true,"12:3":true,"11:4":true,"9:1":233,"8:12":true,"6:9":true,"10:1":[159,233],"13:7":true,"12:4":true,"11:3":true,"8:15":true,"4:0":true,"12:2":true,"10:8":true,"11:2":true,"8:14":232,"13:9":true,"9:8":true,"7:1":true,"12:1":true,"9:3":231,"6:0":true,"10:4":true,"10:3":true,"7:2":true,"11:1":true,"9:4":true,"8:5":[189,190],"7:4":true,"13:6":true,"9:2":232,"13:0":true,"8:11":true,"10:2":232,"12:8":true,"7:3":231,"13:2":true,"9:6":true,"4:1":true,"11:9":true,"6:4":true,"10:0":[234,240],"10:6":true,"12:9":true,"9:0":[234,240],"6:3":true,"7:0":true,"13:3":true,"11:7":true,"13:4":true,"12:7":true,"6:2":true,"14:3":true,"4:14":[188,224],"6:5":true,"12:10":true,"6:11":true,"14:4":true,"11:13":true,"8:0":true,"14:2":true,"13:11":true,"4:15":true,"15:2":true,"13:5":true,"15:0":true,"10:5":true,"9:11":true,"5:10":true,"10:11":true,"9:5":189,"11:14":true,"8:2":[158,232],"1:4":true,"14:0":true,"11:12":true,"8:4":[228,230],"7:5":true,"11:15":true,"8:3":231,"7:11":true,"4:13":[188,223]} \ No newline at end of file +{ + "12:11": true, + "9:14": [ + 168, + 232 + ], + "11:5": true, + "7:12": true, + "13:13": true, + "12:5": true, + "10:14": [ + 168, + 232 + ], + "7:15": 233, + "11:11": true, + "10:12": true, + "6:13": true, + "9:15": 233, + "0:0": [ + 149, + 155 + ], + "9:12": true, + "8:1": 233, + "13:10": true, + "10:15": [ + 168, + 233 + ], + "7:14": 232, + "14:1": true, + "13:15": true, + "10:10": true, + "7:13": true, + "9:10": true, + "13:12": true, + "15:1": true, + "6:14": true, + "13:14": true, + "10:13": [ + 165, + 231 + ], + "8:9": true, + "7:10": true, + "6:12": true, + "6:15": true, + "9:13": [ + 169, + 231 + ], + "11:0": [ + 234, + 252 + ], + "14:14": true, + "12:6": true, + "4:3": true, + "8:13": [ + 169, + 231 + ], + "5:4": true, + "10:9": true, + "13:8": true, + "15:14": 254, + "12:0": true, + "9:9": true, + "6:1": true, + "4:4": true, + "10:7": true, + "8:10": true, + "7:9": true, + "14:15": true, + "13:1": true, + "4:2": true, + "15:15": true, + "12:3": true, + "11:4": true, + "9:1": 233, + "8:12": true, + "6:9": true, + "10:1": [ + 159, + 233 + ], + "13:7": true, + "12:4": true, + "11:3": true, + "8:15": true, + "4:0": true, + "12:2": true, + "10:8": true, + "11:2": true, + "8:14": 232, + "13:9": true, + "9:8": true, + "7:1": true, + "12:1": true, + "9:3": 231, + "6:0": true, + "10:4": true, + "10:3": true, + "7:2": true, + "11:1": true, + "9:4": true, + "8:5": [ + 189, + 190 + ], + "7:4": true, + "13:6": true, + "9:2": 232, + "13:0": true, + "8:11": true, + "10:2": 232, + "12:8": true, + "7:3": 231, + "13:2": true, + "9:6": true, + "4:1": true, + "11:9": true, + "6:4": true, + "10:0": [ + 234, + 240 + ], + "10:6": true, + "12:9": true, + "9:0": [ + 234, + 240 + ], + "6:3": true, + "7:0": true, + "13:3": true, + "11:7": true, + "13:4": true, + "12:7": true, + "6:2": true, + "14:3": true, + "4:14": [ + 188, + 224 + ], + "6:5": true, + "12:10": true, + "6:11": true, + "14:4": true, + "11:13": true, + "8:0": true, + "14:2": true, + "13:11": true, + "4:15": true, + "15:2": true, + "13:5": true, + "15:0": true, + "10:5": true, + "9:11": true, + "5:10": true, + "10:11": true, + "9:5": 189, + "11:14": true, + "8:2": [ + 158, + 232 + ], + "1:4": true, + "14:0": true, + "11:12": true, + "8:4": [ + 228, + 230 + ], + "7:5": true, + "11:15": true, + "8:3": 231, + "7:11": true, + "4:13": [ + 188, + 223 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/6_3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/6_3.json index bb5f8edd..c20fc48e 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/6_3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/6_3.json @@ -1 +1,236 @@ -{"15:9":[160,162],"9:14":true,"11:5":[165,237],"8:8":true,"7:12":true,"6:10":true,"13:13":true,"12:5":[164,165],"10:14":true,"7:15":true,"14:9":[161,164],"11:11":true,"10:12":true,"6:13":true,"9:15":true,"0:6":true,"9:12":true,"8:1":[188,235],"13:10":true,"10:15":true,"7:14":true,"14:1":true,"13:15":true,"10:10":true,"8:7":true,"4:11":true,"0:2":true,"7:13":true,"9:10":true,"4:5":true,"13:12":true,"15:1":254,"6:14":true,"13:14":true,"10:13":true,"0:3":true,"8:9":true,"7:10":true,"6:12":true,"0:4":true,"6:15":true,"14:8":[162,163],"9:13":true,"11:0":true,"14:14":true,"12:6":[163,164],"4:3":true,"8:13":true,"10:9":true,"7:7":true,"13:8":[162,186],"15:14":true,"12:0":true,"9:9":true,"6:1":true,"11:6":[164,237],"4:4":true,"10:7":236,"8:10":true,"7:9":true,"6:8":true,"15:12":true,"14:15":true,"13:1":true,"4:2":true,"0:11":true,"15:15":true,"14:12":true,"9:7":true,"0:5":true,"12:3":true,"11:4":[165,251],"9:1":true,"8:12":true,"7:8":true,"6:9":true,"4:6":true,"15:10":[163,254],"14:10":true,"10:1":235,"13:7":[163,186],"12:4":165,"11:3":[165,252],"8:15":true,"4:0":true,"15:13":true,"12:2":true,"10:8":true,"6:7":true,"11:2":true,"8:14":true,"13:9":true,"9:8":true,"7:1":true,"14:13":true,"12:1":true,"9:3":236,"6:0":true,"10:4":[188,236],"10:3":[188,236],"0:13":true,"7:2":true,"6:6":true,"4:9":true,"11:1":true,"9:4":true,"8:5":true,"11:8":true,"7:4":true,"13:6":[165,186],"9:2":236,"13:0":true,"8:11":true,"4:7":true,"10:2":236,"0:10":true,"7:3":true,"14:11":true,"13:2":true,"9:6":true,"4:1":true,"0:15":true,"11:9":true,"6:4":true,"15:5":254,"10:0":[168,234],"14:5":true,"10:6":true,"0:12":true,"15:11":true,"9:0":234,"6:3":true,"7:0":234,"13:3":[167,186],"11:7":true,"0:14":true,"13:4":true,"12:7":162,"6:2":true,"7:6":true,"4:8":true,"15:4":254,"14:3":254,"4:14":true,"11:10":true,"6:5":true,"0:8":true,"15:3":254,"6:11":true,"14:4":254,"11:13":true,"8:0":true,"14:2":254,"13:11":true,"4:15":true,"0:1":true,"15:2":254,"8:6":true,"4:12":true,"13:5":true,"15:0":true,"14:6":true,"10:5":true,"9:11":true,"10:11":true,"9:5":true,"4:10":true,"11:14":true,"8:2":236,"0:7":true,"15:6":true,"14:0":true,"11:12":true,"8:4":true,"7:5":true,"11:15":true,"8:3":true,"0:9":true,"7:11":true,"4:13":true} \ No newline at end of file +{ + "15:9": [ + 160, + 162 + ], + "9:14": true, + "11:5": [ + 165, + 237 + ], + "8:8": true, + "7:12": true, + "6:10": true, + "13:13": true, + "12:5": [ + 164, + 165 + ], + "10:14": true, + "7:15": true, + "14:9": [ + 161, + 164 + ], + "11:11": true, + "10:12": true, + "6:13": true, + "9:15": true, + "0:6": true, + "9:12": true, + "8:1": [ + 188, + 235 + ], + "13:10": true, + "10:15": true, + "7:14": true, + "14:1": true, + "13:15": true, + "10:10": true, + "8:7": true, + "4:11": true, + "0:2": true, + "7:13": true, + "9:10": true, + "4:5": true, + "13:12": true, + "15:1": 254, + "6:14": true, + "13:14": true, + "10:13": true, + "0:3": true, + "8:9": true, + "7:10": true, + "6:12": true, + "0:4": true, + "6:15": true, + "14:8": [ + 162, + 163 + ], + "9:13": true, + "11:0": true, + "14:14": true, + "12:6": [ + 163, + 164 + ], + "4:3": true, + "8:13": true, + "10:9": true, + "7:7": true, + "13:8": [ + 162, + 186 + ], + "15:14": true, + "12:0": true, + "9:9": true, + "6:1": true, + "11:6": [ + 164, + 237 + ], + "4:4": true, + "10:7": 236, + "8:10": true, + "7:9": true, + "6:8": true, + "15:12": true, + "14:15": true, + "13:1": true, + "4:2": true, + "0:11": true, + "15:15": true, + "14:12": true, + "9:7": true, + "0:5": true, + "12:3": true, + "11:4": [ + 165, + 251 + ], + "9:1": true, + "8:12": true, + "7:8": true, + "6:9": true, + "4:6": true, + "15:10": [ + 163, + 254 + ], + "14:10": true, + "10:1": 235, + "13:7": [ + 163, + 186 + ], + "12:4": 165, + "11:3": [ + 165, + 252 + ], + "8:15": true, + "4:0": true, + "15:13": true, + "12:2": true, + "10:8": true, + "6:7": true, + "11:2": true, + "8:14": true, + "13:9": true, + "9:8": true, + "7:1": true, + "14:13": true, + "12:1": true, + "9:3": 236, + "6:0": true, + "10:4": [ + 188, + 236 + ], + "10:3": [ + 188, + 236 + ], + "0:13": true, + "7:2": true, + "6:6": true, + "4:9": true, + "11:1": true, + "9:4": true, + "8:5": true, + "11:8": true, + "7:4": true, + "13:6": [ + 165, + 186 + ], + "9:2": 236, + "13:0": true, + "8:11": true, + "4:7": true, + "10:2": 236, + "0:10": true, + "7:3": true, + "14:11": true, + "13:2": true, + "9:6": true, + "4:1": true, + "0:15": true, + "11:9": true, + "6:4": true, + "15:5": 254, + "10:0": [ + 168, + 234 + ], + "14:5": true, + "10:6": true, + "0:12": true, + "15:11": true, + "9:0": 234, + "6:3": true, + "7:0": 234, + "13:3": [ + 167, + 186 + ], + "11:7": true, + "0:14": true, + "13:4": true, + "12:7": 162, + "6:2": true, + "7:6": true, + "4:8": true, + "15:4": 254, + "14:3": 254, + "4:14": true, + "11:10": true, + "6:5": true, + "0:8": true, + "15:3": 254, + "6:11": true, + "14:4": 254, + "11:13": true, + "8:0": true, + "14:2": 254, + "13:11": true, + "4:15": true, + "0:1": true, + "15:2": 254, + "8:6": true, + "4:12": true, + "13:5": true, + "15:0": true, + "14:6": true, + "10:5": true, + "9:11": true, + "10:11": true, + "9:5": true, + "4:10": true, + "11:14": true, + "8:2": 236, + "0:7": true, + "15:6": true, + "14:0": true, + "11:12": true, + "8:4": true, + "7:5": true, + "11:15": true, + "8:3": true, + "0:9": true, + "7:11": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/6_5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/6_5.json index 5df021c3..e318a13a 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/6_5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/6_5.json @@ -1 +1,303 @@ -{"8:8":[161,236],"6:10":true,"13:13":[182,186],"0:6":true,"14:1":true,"13:15":true,"10:10":236,"8:7":[164,236],"5:5":true,"4:11":true,"0:2":true,"9:10":236,"5:11":true,"4:5":true,"13:12":true,"15:1":true,"13:14":[182,186],"0:3":true,"8:9":[162,236],"7:10":236,"0:4":true,"14:14":true,"4:3":true,"2:12":true,"10:9":236,"7:7":true,"2:15":true,"15:14":true,"9:9":236,"4:4":true,"10:7":236,"8:10":236,"7:9":[163,236],"6:8":true,"15:12":254,"14:15":true,"13:1":true,"4:2":true,"0:11":true,"15:15":true,"14:12":254,"9:7":236,"3:11":true,"2:14":true,"1:13":true,"0:5":true,"2:13":true,"7:8":true,"6:9":true,"4:6":true,"1:14":true,"4:0":true,"15:13":true,"1:15":true,"10:8":236,"6:7":true,"9:8":[160,236],"14:13":254,"1:11":true,"3:13":true,"1:5":true,"0:13":true,"11:8":[236,251],"13:6":[182,186],"13:0":true,"12:8":182,"14:11":true,"13:2":[166,186],"4:1":true,"3:12":true,"0:15":true,"11:9":[236,251],"15:5":254,"14:5":254,"3:15":true,"0:12":true,"15:11":254,"12:9":true,"13:3":[182,186],"11:7":[236,251],"2:5":true,"0:14":true,"13:4":[182,186],"12:7":true,"3:14":true,"2:11":true,"15:4":254,"14:3":254,"4:14":true,"11:10":true,"12:10":true,"5:14":true,"15:3":254,"14:4":254,"14:2":[166,254],"13:11":true,"4:15":[129,227],"0:1":true,"15:2":[165,254],"4:12":true,"13:5":[182,186],"15:0":true,"14:6":254,"15:6":true,"14:0":true,"5:13":[124,128],"4:13":true,"12:11":true,"9:14":236,"11:5":[236,237],"7:12":true,"12:5":182,"10:14":236,"7:15":235,"11:11":true,"10:12":236,"6:13":true,"9:15":235,"9:12":236,"8:1":true,"13:10":true,"10:15":235,"7:14":true,"7:13":true,"6:14":true,"10:13":236,"6:12":236,"6:15":true,"9:13":236,"11:0":true,"12:6":[153,182],"8:13":[126,236],"13:8":true,"6:1":true,"11:6":[236,237],"11:4":[166,251],"9:1":true,"8:12":236,"15:10":254,"14:10":254,"10:1":true,"13:7":true,"12:4":182,"11:3":[166,252],"8:15":true,"12:2":[166,168],"11:2":true,"8:14":[127,236],"13:9":true,"7:1":true,"9:3":true,"6:0":true,"10:4":true,"5:9":true,"10:3":true,"7:2":true,"6:6":true,"4:9":true,"11:1":true,"9:4":true,"8:5":true,"5:7":true,"3:10":true,"7:4":true,"9:2":true,"8:11":true,"4:7":true,"10:2":true,"0:10":true,"7:3":true,"9:6":[165,236],"6:4":true,"10:0":true,"10:6":236,"9:0":true,"6:3":true,"7:0":true,"6:2":true,"7:6":236,"4:8":true,"6:5":true,"0:8":true,"6:11":true,"11:13":[236,252],"8:0":true,"8:6":true,"12:13":182,"12:14":182,"10:5":[166,236],"9:11":236,"10:11":true,"9:5":true,"4:10":true,"11:14":[236,251],"8:2":true,"0:7":true,"12:15":182,"11:12":true,"8:4":true,"7:5":true,"12:12":182,"11:15":[235,237],"8:3":true,"0:9":true,"7:11":236} \ No newline at end of file +{ + "8:8": [ + 161, + 236 + ], + "6:10": true, + "13:13": [ + 182, + 186 + ], + "0:6": true, + "14:1": true, + "13:15": true, + "10:10": 236, + "8:7": [ + 164, + 236 + ], + "5:5": true, + "4:11": true, + "0:2": true, + "9:10": 236, + "5:11": true, + "4:5": true, + "13:12": true, + "15:1": true, + "13:14": [ + 182, + 186 + ], + "0:3": true, + "8:9": [ + 162, + 236 + ], + "7:10": 236, + "0:4": true, + "14:14": true, + "4:3": true, + "2:12": true, + "10:9": 236, + "7:7": true, + "2:15": true, + "15:14": true, + "9:9": 236, + "4:4": true, + "10:7": 236, + "8:10": 236, + "7:9": [ + 163, + 236 + ], + "6:8": true, + "15:12": 254, + "14:15": true, + "13:1": true, + "4:2": true, + "0:11": true, + "15:15": true, + "14:12": 254, + "9:7": 236, + "3:11": true, + "2:14": true, + "1:13": true, + "0:5": true, + "2:13": true, + "7:8": true, + "6:9": true, + "4:6": true, + "1:14": true, + "4:0": true, + "15:13": true, + "1:15": true, + "10:8": 236, + "6:7": true, + "9:8": [ + 160, + 236 + ], + "14:13": 254, + "1:11": true, + "3:13": true, + "1:5": true, + "0:13": true, + "11:8": [ + 236, + 251 + ], + "13:6": [ + 182, + 186 + ], + "13:0": true, + "12:8": 182, + "14:11": true, + "13:2": [ + 166, + 186 + ], + "4:1": true, + "3:12": true, + "0:15": true, + "11:9": [ + 236, + 251 + ], + "15:5": 254, + "14:5": 254, + "3:15": true, + "0:12": true, + "15:11": 254, + "12:9": true, + "13:3": [ + 182, + 186 + ], + "11:7": [ + 236, + 251 + ], + "2:5": true, + "0:14": true, + "13:4": [ + 182, + 186 + ], + "12:7": true, + "3:14": true, + "2:11": true, + "15:4": 254, + "14:3": 254, + "4:14": true, + "11:10": true, + "12:10": true, + "5:14": true, + "15:3": 254, + "14:4": 254, + "14:2": [ + 166, + 254 + ], + "13:11": true, + "4:15": [ + 129, + 227 + ], + "0:1": true, + "15:2": [ + 165, + 254 + ], + "4:12": true, + "13:5": [ + 182, + 186 + ], + "15:0": true, + "14:6": 254, + "15:6": true, + "14:0": true, + "5:13": [ + 124, + 128 + ], + "4:13": true, + "12:11": true, + "9:14": 236, + "11:5": [ + 236, + 237 + ], + "7:12": true, + "12:5": 182, + "10:14": 236, + "7:15": 235, + "11:11": true, + "10:12": 236, + "6:13": true, + "9:15": 235, + "9:12": 236, + "8:1": true, + "13:10": true, + "10:15": 235, + "7:14": true, + "7:13": true, + "6:14": true, + "10:13": 236, + "6:12": 236, + "6:15": true, + "9:13": 236, + "11:0": true, + "12:6": [ + 153, + 182 + ], + "8:13": [ + 126, + 236 + ], + "13:8": true, + "6:1": true, + "11:6": [ + 236, + 237 + ], + "11:4": [ + 166, + 251 + ], + "9:1": true, + "8:12": 236, + "15:10": 254, + "14:10": 254, + "10:1": true, + "13:7": true, + "12:4": 182, + "11:3": [ + 166, + 252 + ], + "8:15": true, + "12:2": [ + 166, + 168 + ], + "11:2": true, + "8:14": [ + 127, + 236 + ], + "13:9": true, + "7:1": true, + "9:3": true, + "6:0": true, + "10:4": true, + "5:9": true, + "10:3": true, + "7:2": true, + "6:6": true, + "4:9": true, + "11:1": true, + "9:4": true, + "8:5": true, + "5:7": true, + "3:10": true, + "7:4": true, + "9:2": true, + "8:11": true, + "4:7": true, + "10:2": true, + "0:10": true, + "7:3": true, + "9:6": [ + 165, + 236 + ], + "6:4": true, + "10:0": true, + "10:6": 236, + "9:0": true, + "6:3": true, + "7:0": true, + "6:2": true, + "7:6": 236, + "4:8": true, + "6:5": true, + "0:8": true, + "6:11": true, + "11:13": [ + 236, + 252 + ], + "8:0": true, + "8:6": true, + "12:13": 182, + "12:14": 182, + "10:5": [ + 166, + 236 + ], + "9:11": 236, + "10:11": true, + "9:5": true, + "4:10": true, + "11:14": [ + 236, + 251 + ], + "8:2": true, + "0:7": true, + "12:15": 182, + "11:12": true, + "8:4": true, + "7:5": true, + "12:12": 182, + "11:15": [ + 235, + 237 + ], + "8:3": true, + "0:9": true, + "7:11": 236 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/6_6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/6_6.json index 23298771..efbef311 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/6_6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/6_6.json @@ -1 +1,298 @@ -{"15:9":[116,232],"12:11":true,"1:1":true,"11:5":true,"2:7":true,"8:8":123,"6:10":125,"7:15":true,"14:9":118,"11:11":true,"2:9":true,"15:7":[116,184],"3:0":true,"9:15":true,"0:0":true,"14:7":[109,184],"8:1":233,"3:6":true,"10:15":true,"1:8":true,"14:1":true,"13:15":true,"8:7":[118,165],"5:5":[112,113],"4:11":true,"0:2":true,"2:8":true,"5:11":true,"4:5":112,"3:2":123,"15:1":true,"1:9":true,"15:8":true,"0:3":true,"8:9":124,"7:10":125,"6:12":true,"1:7":true,"6:15":true,"14:8":true,"2:1":true,"11:0":[234,237],"12:6":[111,115],"4:3":[188,223],"5:4":111,"10:9":[122,123],"7:7":true,"2:15":true,"1:10":true,"13:8":119,"12:0":true,"9:9":[123,124],"6:1":233,"11:6":[112,120],"4:4":111,"10:7":[116,189],"7:9":124,"6:8":[120,123],"14:15":true,"13:1":true,"4:2":[171,224],"0:11":true,"15:15":true,"9:7":[117,121],"11:4":true,"9:1":233,"7:8":123,"6:9":[123,124],"4:6":113,"15:10":[117,118],"14:10":[118,119],"10:1":true,"5:6":[113,117],"13:7":[114,184],"11:3":true,"8:15":true,"4:0":[174,226],"2:10":true,"1:15":true,"10:8":[121,166],"6:7":[117,120],"11:2":true,"1:12":true,"13:9":120,"9:8":[122,164],"7:1":233,"9:3":true,"6:0":234,"1:11":true,"10:4":true,"5:9":[121,122],"10:3":true,"0:13":true,"7:2":232,"6:6":116,"4:9":119,"11:1":true,"9:4":true,"8:5":true,"5:7":[117,121],"3:10":true,"11:8":[120,167],"7:4":true,"13:6":[110,182],"9:2":true,"13:0":true,"4:7":118,"10:2":true,"0:10":true,"12:8":[120,166],"7:3":[110,231],"14:11":true,"13:2":true,"9:6":true,"4:1":[123,225],"3:12":true,"11:9":122,"6:4":[111,230],"10:0":234,"10:6":true,"3:15":true,"0:12":true,"15:11":true,"12:9":[120,121],"9:0":234,"6:3":[110,231],"7:0":234,"13:3":true,"11:7":[116,120],"5:8":[118,122],"13:4":true,"12:7":[114,120],"6:2":232,"7:6":true,"4:8":true,"2:11":true,"6:5":[112,190],"3:8":true,"2:2":true,"0:8":true,"1:0":true,"5:12":true,"8:0":234,"14:2":true,"13:11":true,"4:15":true,"0:1":true,"15:2":true,"8:6":true,"4:12":true,"3:1":true,"13:5":true,"5:15":true,"2:3":true,"15:0":true,"10:5":true,"9:11":true,"5:10":true,"3:7":true,"1:3":true,"10:11":true,"9:5":true,"4:10":true,"8:2":232,"14:0":true,"2:0":true,"12:15":true,"8:4":true,"5:13":true,"1:2":true,"7:5":[115,190],"3:9":true,"11:15":true,"8:3":[109,231],"0:9":true,"2:6":true} \ No newline at end of file +{ + "15:9": [ + 116, + 232 + ], + "12:11": true, + "1:1": true, + "11:5": true, + "2:7": true, + "8:8": 123, + "6:10": 125, + "7:15": true, + "14:9": 118, + "11:11": true, + "2:9": true, + "15:7": [ + 116, + 184 + ], + "3:0": true, + "9:15": true, + "0:0": true, + "14:7": [ + 109, + 184 + ], + "8:1": 233, + "3:6": true, + "10:15": true, + "1:8": true, + "14:1": true, + "13:15": true, + "8:7": [ + 118, + 165 + ], + "5:5": [ + 112, + 113 + ], + "4:11": true, + "0:2": true, + "2:8": true, + "5:11": true, + "4:5": 112, + "3:2": 123, + "15:1": true, + "1:9": true, + "15:8": true, + "0:3": true, + "8:9": 124, + "7:10": 125, + "6:12": true, + "1:7": true, + "6:15": true, + "14:8": true, + "2:1": true, + "11:0": [ + 234, + 237 + ], + "12:6": [ + 111, + 115 + ], + "4:3": [ + 188, + 223 + ], + "5:4": 111, + "10:9": [ + 122, + 123 + ], + "7:7": true, + "2:15": true, + "1:10": true, + "13:8": 119, + "12:0": true, + "9:9": [ + 123, + 124 + ], + "6:1": 233, + "11:6": [ + 112, + 120 + ], + "4:4": 111, + "10:7": [ + 116, + 189 + ], + "7:9": 124, + "6:8": [ + 120, + 123 + ], + "14:15": true, + "13:1": true, + "4:2": [ + 171, + 224 + ], + "0:11": true, + "15:15": true, + "9:7": [ + 117, + 121 + ], + "11:4": true, + "9:1": 233, + "7:8": 123, + "6:9": [ + 123, + 124 + ], + "4:6": 113, + "15:10": [ + 117, + 118 + ], + "14:10": [ + 118, + 119 + ], + "10:1": true, + "5:6": [ + 113, + 117 + ], + "13:7": [ + 114, + 184 + ], + "11:3": true, + "8:15": true, + "4:0": [ + 174, + 226 + ], + "2:10": true, + "1:15": true, + "10:8": [ + 121, + 166 + ], + "6:7": [ + 117, + 120 + ], + "11:2": true, + "1:12": true, + "13:9": 120, + "9:8": [ + 122, + 164 + ], + "7:1": 233, + "9:3": true, + "6:0": 234, + "1:11": true, + "10:4": true, + "5:9": [ + 121, + 122 + ], + "10:3": true, + "0:13": true, + "7:2": 232, + "6:6": 116, + "4:9": 119, + "11:1": true, + "9:4": true, + "8:5": true, + "5:7": [ + 117, + 121 + ], + "3:10": true, + "11:8": [ + 120, + 167 + ], + "7:4": true, + "13:6": [ + 110, + 182 + ], + "9:2": true, + "13:0": true, + "4:7": 118, + "10:2": true, + "0:10": true, + "12:8": [ + 120, + 166 + ], + "7:3": [ + 110, + 231 + ], + "14:11": true, + "13:2": true, + "9:6": true, + "4:1": [ + 123, + 225 + ], + "3:12": true, + "11:9": 122, + "6:4": [ + 111, + 230 + ], + "10:0": 234, + "10:6": true, + "3:15": true, + "0:12": true, + "15:11": true, + "12:9": [ + 120, + 121 + ], + "9:0": 234, + "6:3": [ + 110, + 231 + ], + "7:0": 234, + "13:3": true, + "11:7": [ + 116, + 120 + ], + "5:8": [ + 118, + 122 + ], + "13:4": true, + "12:7": [ + 114, + 120 + ], + "6:2": 232, + "7:6": true, + "4:8": true, + "2:11": true, + "6:5": [ + 112, + 190 + ], + "3:8": true, + "2:2": true, + "0:8": true, + "1:0": true, + "5:12": true, + "8:0": 234, + "14:2": true, + "13:11": true, + "4:15": true, + "0:1": true, + "15:2": true, + "8:6": true, + "4:12": true, + "3:1": true, + "13:5": true, + "5:15": true, + "2:3": true, + "15:0": true, + "10:5": true, + "9:11": true, + "5:10": true, + "3:7": true, + "1:3": true, + "10:11": true, + "9:5": true, + "4:10": true, + "8:2": 232, + "14:0": true, + "2:0": true, + "12:15": true, + "8:4": true, + "5:13": true, + "1:2": true, + "7:5": [ + 115, + 190 + ], + "3:9": true, + "11:15": true, + "8:3": [ + 109, + 231 + ], + "0:9": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/7_-1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/7_-1.json index 96e0e727..beb62e5f 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/7_-1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/7_-1.json @@ -1 +1,4 @@ -{"12:1":true,"9:0":233} \ No newline at end of file +{ + "12:1": true, + "9:0": 233 +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/7_-2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/7_-2.json index 3200d788..471796ed 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/7_-2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/7_-2.json @@ -1 +1,22 @@ -{"14:1":true,"4:11":true,"15:1":true,"0:3":true,"0:4":true,"12:0":true,"13:1":true,"0:5":true,"12:2":228,"1:5":true,"11:1":228,"15:4":true,"15:3":true,"5:12":true,"14:2":true,"15:2":true,"15:0":true,"4:10":true,"5:13":true,"2:6":true} \ No newline at end of file +{ + "14:1": true, + "4:11": true, + "15:1": true, + "0:3": true, + "0:4": true, + "12:0": true, + "13:1": true, + "0:5": true, + "12:2": 228, + "1:5": true, + "11:1": 228, + "15:4": true, + "15:3": true, + "5:12": true, + "14:2": true, + "15:2": true, + "15:0": true, + "4:10": true, + "5:13": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/7_-3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/7_-3.json index 5d043173..3e1ceb41 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/7_-3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/7_-3.json @@ -1 +1,28 @@ -{"11:11":true,"15:7":true,"12:8":222,"11:9":222,"15:11":true,"15:8":true,"10:9":[222,223],"12:10":true,"15:14":true,"9:9":[222,223],"11:13":true,"15:12":true,"15:15":true,"12:13":true,"15:10":true,"15:6":true,"15:13":true,"12:15":true,"12:12":true,"11:15":true} \ No newline at end of file +{ + "11:11": true, + "15:7": true, + "12:8": 222, + "11:9": 222, + "15:11": true, + "15:8": true, + "10:9": [ + 222, + 223 + ], + "12:10": true, + "15:14": true, + "9:9": [ + 222, + 223 + ], + "11:13": true, + "15:12": true, + "15:15": true, + "12:13": true, + "15:10": true, + "15:6": true, + "15:13": true, + "12:15": true, + "12:12": true, + "11:15": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/7_0.json b/src/main/resources/assets/notenoughupdates/dwarven_data/7_0.json index eda3d134..91d97e1c 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/7_0.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/7_0.json @@ -1 +1,24 @@ -{"9:14":true,"10:14":true,"7:15":true,"9:15":true,"10:15":true,"7:14":true,"13:15":true,"13:14":true,"14:14":true,"15:14":true,"15:15":true,"1:14":true,"8:15":true,"1:15":true,"8:14":true,"9:6":true,"0:15":true,"0:14":true,"12:14":true,"11:14":true,"12:15":true,"11:15":true} \ No newline at end of file +{ + "9:14": true, + "10:14": true, + "7:15": true, + "9:15": true, + "10:15": true, + "7:14": true, + "13:15": true, + "13:14": true, + "14:14": true, + "15:14": true, + "15:15": true, + "1:14": true, + "8:15": true, + "1:15": true, + "8:14": true, + "9:6": true, + "0:15": true, + "0:14": true, + "12:14": true, + "11:14": true, + "12:15": true, + "11:15": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/7_1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/7_1.json index f0ae8c33..984bdc75 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/7_1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/7_1.json @@ -1 +1,115 @@ -{"12:11":true,"9:14":true,"1:1":true,"11:5":true,"8:8":254,"7:12":true,"13:13":true,"12:5":true,"10:14":true,"7:15":true,"11:11":true,"9:15":true,"0:6":true,"0:0":true,"8:1":true,"10:15":true,"7:14":true,"10:10":true,"0:2":true,"7:13":true,"15:1":true,"0:3":true,"0:4":true,"9:13":true,"11:0":true,"14:14":true,"12:6":true,"8:13":true,"10:9":true,"1:10":true,"15:14":true,"12:0":true,"9:9":true,"11:6":[181,254],"10:7":true,"0:11":true,"15:15":true,"9:7":true,"1:13":true,"0:5":true,"1:14":true,"9:1":true,"11:4":true,"8:12":true,"10:1":true,"12:4":true,"11:3":true,"8:15":true,"15:13":true,"1:15":true,"10:8":254,"8:14":true,"1:12":true,"9:8":254,"7:1":true,"14:13":true,"9:3":true,"1:11":true,"1:5":true,"0:13":true,"7:2":true,"11:1":true,"11:8":[183,254],"7:4":true,"9:2":true,"13:0":true,"10:2":true,"0:10":true,"12:8":true,"7:3":true,"0:15":true,"11:9":true,"10:0":true,"10:6":254,"0:12":true,"12:9":true,"9:0":true,"7:0":true,"13:3":true,"11:7":true,"0:14":true,"12:7":254,"14:3":true,"1:6":true,"11:10":true,"12:10":true,"15:3":true,"1:0":true,"11:13":true,"8:0":true,"14:2":true,"0:1":true,"15:2":true,"15:0":true,"1:3":true,"11:14":true,"8:2":true,"1:4":true,"14:0":true,"11:12":true,"8:4":true,"1:2":true,"7:5":254,"12:12":true,"11:15":true,"8:3":true,"7:11":true} \ No newline at end of file +{ + "12:11": true, + "9:14": true, + "1:1": true, + "11:5": true, + "8:8": 254, + "7:12": true, + "13:13": true, + "12:5": true, + "10:14": true, + "7:15": true, + "11:11": true, + "9:15": true, + "0:6": true, + "0:0": true, + "8:1": true, + "10:15": true, + "7:14": true, + "10:10": true, + "0:2": true, + "7:13": true, + "15:1": true, + "0:3": true, + "0:4": true, + "9:13": true, + "11:0": true, + "14:14": true, + "12:6": true, + "8:13": true, + "10:9": true, + "1:10": true, + "15:14": true, + "12:0": true, + "9:9": true, + "11:6": [ + 181, + 254 + ], + "10:7": true, + "0:11": true, + "15:15": true, + "9:7": true, + "1:13": true, + "0:5": true, + "1:14": true, + "9:1": true, + "11:4": true, + "8:12": true, + "10:1": true, + "12:4": true, + "11:3": true, + "8:15": true, + "15:13": true, + "1:15": true, + "10:8": 254, + "8:14": true, + "1:12": true, + "9:8": 254, + "7:1": true, + "14:13": true, + "9:3": true, + "1:11": true, + "1:5": true, + "0:13": true, + "7:2": true, + "11:1": true, + "11:8": [ + 183, + 254 + ], + "7:4": true, + "9:2": true, + "13:0": true, + "10:2": true, + "0:10": true, + "12:8": true, + "7:3": true, + "0:15": true, + "11:9": true, + "10:0": true, + "10:6": 254, + "0:12": true, + "12:9": true, + "9:0": true, + "7:0": true, + "13:3": true, + "11:7": true, + "0:14": true, + "12:7": 254, + "14:3": true, + "1:6": true, + "11:10": true, + "12:10": true, + "15:3": true, + "1:0": true, + "11:13": true, + "8:0": true, + "14:2": true, + "0:1": true, + "15:2": true, + "15:0": true, + "1:3": true, + "11:14": true, + "8:2": true, + "1:4": true, + "14:0": true, + "11:12": true, + "8:4": true, + "1:2": true, + "7:5": 254, + "12:12": true, + "11:15": true, + "8:3": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/7_2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/7_2.json index 98887d05..daccb954 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/7_2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/7_2.json @@ -1 +1,66 @@ -{"9:14":true,"1:1":true,"11:5":true,"10:14":true,"7:15":254,"11:11":true,"9:15":254,"0:0":true,"8:1":true,"10:15":true,"7:14":254,"13:15":true,"0:2":true,"15:1":true,"13:14":true,"11:0":true,"14:14":true,"15:14":true,"12:0":true,"11:6":true,"13:1":true,"15:15":true,"11:4":true,"9:1":true,"1:14":254,"10:1":true,"11:3":true,"8:15":254,"12:2":true,"1:15":true,"11:2":true,"8:14":254,"7:1":true,"12:1":true,"7:2":true,"11:1":true,"11:8":true,"9:2":true,"13:0":true,"10:2":true,"13:2":true,"0:15":true,"11:9":true,"10:0":true,"9:0":true,"7:0":true,"11:7":true,"0:14":254,"11:10":true,"1:0":true,"11:13":true,"8:0":true,"14:2":true,"0:1":true,"15:2":true,"12:14":true,"15:0":true,"11:14":true,"8:2":true,"14:0":true,"12:15":true,"11:12":true,"1:2":true,"11:15":true} \ No newline at end of file +{ + "9:14": true, + "1:1": true, + "11:5": true, + "10:14": true, + "7:15": 254, + "11:11": true, + "9:15": 254, + "0:0": true, + "8:1": true, + "10:15": true, + "7:14": 254, + "13:15": true, + "0:2": true, + "15:1": true, + "13:14": true, + "11:0": true, + "14:14": true, + "15:14": true, + "12:0": true, + "11:6": true, + "13:1": true, + "15:15": true, + "11:4": true, + "9:1": true, + "1:14": 254, + "10:1": true, + "11:3": true, + "8:15": 254, + "12:2": true, + "1:15": true, + "11:2": true, + "8:14": 254, + "7:1": true, + "12:1": true, + "7:2": true, + "11:1": true, + "11:8": true, + "9:2": true, + "13:0": true, + "10:2": true, + "13:2": true, + "0:15": true, + "11:9": true, + "10:0": true, + "9:0": true, + "7:0": true, + "11:7": true, + "0:14": 254, + "11:10": true, + "1:0": true, + "11:13": true, + "8:0": true, + "14:2": true, + "0:1": true, + "15:2": true, + "12:14": true, + "15:0": true, + "11:14": true, + "8:2": true, + "14:0": true, + "12:15": true, + "11:12": true, + "1:2": true, + "11:15": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/7_3.json b/src/main/resources/assets/notenoughupdates/dwarven_data/7_3.json index c58be254..8dfb29e5 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/7_3.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/7_3.json @@ -1 +1,135 @@ -{"12:11":true,"9:14":true,"1:1":254,"11:5":true,"8:8":true,"7:12":true,"13:13":true,"12:5":true,"10:14":true,"7:15":true,"11:11":true,"9:15":true,"0:6":true,"0:0":254,"8:1":true,"10:15":true,"7:14":true,"10:10":true,"0:2":254,"7:13":true,"15:1":true,"0:3":true,"0:4":254,"9:13":true,"11:0":[181,254],"14:14":true,"12:6":true,"8:13":true,"10:9":true,"2:15":155,"1:10":true,"15:14":true,"12:0":true,"9:9":true,"11:6":true,"10:7":true,"13:1":true,"0:11":254,"15:15":true,"9:7":true,"2:14":[155,156],"1:13":[157,254],"0:5":254,"11:4":true,"9:1":true,"8:12":true,"1:14":254,"10:1":true,"12:4":true,"11:3":true,"8:15":true,"15:13":true,"1:15":true,"10:8":true,"11:2":[183,184],"8:14":true,"1:12":[158,254],"9:8":true,"7:1":true,"14:13":true,"9:3":254,"1:11":[159,254],"1:5":254,"0:13":254,"7:2":true,"11:1":[182,254],"11:8":true,"7:4":254,"9:2":254,"10:2":254,"0:10":[160,254],"12:8":true,"7:3":254,"0:15":true,"11:9":true,"10:0":254,"10:6":true,"0:12":254,"12:9":true,"9:0":254,"7:0":254,"13:3":true,"11:7":true,"0:14":254,"12:7":true,"14:3":true,"1:6":254,"11:10":true,"12:10":true,"15:3":true,"1:0":254,"11:13":true,"8:0":254,"14:2":true,"0:1":254,"15:2":true,"15:0":true,"1:3":true,"11:14":true,"8:2":254,"1:4":true,"11:12":true,"8:4":true,"1:2":true,"7:5":true,"12:12":true,"11:15":true,"8:3":254,"7:11":true} \ No newline at end of file +{ + "12:11": true, + "9:14": true, + "1:1": 254, + "11:5": true, + "8:8": true, + "7:12": true, + "13:13": true, + "12:5": true, + "10:14": true, + "7:15": true, + "11:11": true, + "9:15": true, + "0:6": true, + "0:0": 254, + "8:1": true, + "10:15": true, + "7:14": true, + "10:10": true, + "0:2": 254, + "7:13": true, + "15:1": true, + "0:3": true, + "0:4": 254, + "9:13": true, + "11:0": [ + 181, + 254 + ], + "14:14": true, + "12:6": true, + "8:13": true, + "10:9": true, + "2:15": 155, + "1:10": true, + "15:14": true, + "12:0": true, + "9:9": true, + "11:6": true, + "10:7": true, + "13:1": true, + "0:11": 254, + "15:15": true, + "9:7": true, + "2:14": [ + 155, + 156 + ], + "1:13": [ + 157, + 254 + ], + "0:5": 254, + "11:4": true, + "9:1": true, + "8:12": true, + "1:14": 254, + "10:1": true, + "12:4": true, + "11:3": true, + "8:15": true, + "15:13": true, + "1:15": true, + "10:8": true, + "11:2": [ + 183, + 184 + ], + "8:14": true, + "1:12": [ + 158, + 254 + ], + "9:8": true, + "7:1": true, + "14:13": true, + "9:3": 254, + "1:11": [ + 159, + 254 + ], + "1:5": 254, + "0:13": 254, + "7:2": true, + "11:1": [ + 182, + 254 + ], + "11:8": true, + "7:4": 254, + "9:2": 254, + "10:2": 254, + "0:10": [ + 160, + 254 + ], + "12:8": true, + "7:3": 254, + "0:15": true, + "11:9": true, + "10:0": 254, + "10:6": true, + "0:12": 254, + "12:9": true, + "9:0": 254, + "7:0": 254, + "13:3": true, + "11:7": true, + "0:14": 254, + "12:7": true, + "14:3": true, + "1:6": 254, + "11:10": true, + "12:10": true, + "15:3": true, + "1:0": 254, + "11:13": true, + "8:0": 254, + "14:2": true, + "0:1": 254, + "15:2": true, + "15:0": true, + "1:3": true, + "11:14": true, + "8:2": 254, + "1:4": true, + "11:12": true, + "8:4": true, + "1:2": true, + "7:5": true, + "12:12": true, + "11:15": true, + "8:3": 254, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/7_4.json b/src/main/resources/assets/notenoughupdates/dwarven_data/7_4.json index c3b7ea88..9c649007 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/7_4.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/7_4.json @@ -1 +1,122 @@ -{"9:14":true,"1:1":true,"11:5":true,"8:8":true,"10:14":true,"7:15":true,"11:11":true,"10:12":true,"2:9":true,"9:15":true,"0:6":true,"0:0":true,"9:12":true,"8:1":true,"10:15":true,"7:14":true,"1:8":true,"13:15":true,"10:10":true,"0:2":true,"9:10":true,"15:1":true,"1:9":true,"13:14":true,"10:13":true,"9:13":true,"11:0":true,"14:14":true,"4:3":true,"8:13":true,"2:12":true,"10:9":true,"5:3":true,"1:10":true,"15:14":true,"12:0":true,"9:9":true,"11:6":true,"10:7":true,"14:15":true,"13:1":true,"0:11":true,"15:15":true,"9:7":true,"3:11":true,"2:14":true,"1:13":true,"0:5":true,"11:4":true,"9:1":true,"8:12":true,"2:13":true,"1:14":true,"10:1":true,"12:4":true,"11:3":true,"8:15":true,"12:2":true,"2:10":true,"1:15":true,"10:8":true,"11:2":true,"8:14":true,"1:12":true,"9:8":true,"7:1":true,"12:1":true,"1:11":true,"10:3":true,"0:13":true,"7:2":true,"11:1":true,"9:4":true,"3:10":true,"11:8":true,"9:2":true,"13:0":true,"10:2":true,"0:10":true,"7:3":true,"13:2":true,"3:12":true,"0:15":true,"11:9":true,"10:0":true,"0:12":true,"9:0":true,"7:0":true,"13:3":true,"11:7":true,"0:14":true,"2:11":true,"15:4":true,"14:3":true,"11:10":true,"0:8":true,"15:3":true,"1:0":true,"14:4":true,"11:13":true,"8:0":true,"14:2":true,"0:1":true,"15:2":true,"15:0":true,"12:14":true,"9:11":true,"10:11":true,"11:14":true,"8:2":true,"0:7":true,"14:0":true,"2:0":true,"12:15":true,"11:12":true,"8:4":true,"1:2":true,"11:15":true,"8:3":true,"0:9":true} \ No newline at end of file +{ + "9:14": true, + "1:1": true, + "11:5": true, + "8:8": true, + "10:14": true, + "7:15": true, + "11:11": true, + "10:12": true, + "2:9": true, + "9:15": true, + "0:6": true, + "0:0": true, + "9:12": true, + "8:1": true, + "10:15": true, + "7:14": true, + "1:8": true, + "13:15": true, + "10:10": true, + "0:2": true, + "9:10": true, + "15:1": true, + "1:9": true, + "13:14": true, + "10:13": true, + "9:13": true, + "11:0": true, + "14:14": true, + "4:3": true, + "8:13": true, + "2:12": true, + "10:9": true, + "5:3": true, + "1:10": true, + "15:14": true, + "12:0": true, + "9:9": true, + "11:6": true, + "10:7": true, + "14:15": true, + "13:1": true, + "0:11": true, + "15:15": true, + "9:7": true, + "3:11": true, + "2:14": true, + "1:13": true, + "0:5": true, + "11:4": true, + "9:1": true, + "8:12": true, + "2:13": true, + "1:14": true, + "10:1": true, + "12:4": true, + "11:3": true, + "8:15": true, + "12:2": true, + "2:10": true, + "1:15": true, + "10:8": true, + "11:2": true, + "8:14": true, + "1:12": true, + "9:8": true, + "7:1": true, + "12:1": true, + "1:11": true, + "10:3": true, + "0:13": true, + "7:2": true, + "11:1": true, + "9:4": true, + "3:10": true, + "11:8": true, + "9:2": true, + "13:0": true, + "10:2": true, + "0:10": true, + "7:3": true, + "13:2": true, + "3:12": true, + "0:15": true, + "11:9": true, + "10:0": true, + "0:12": true, + "9:0": true, + "7:0": true, + "13:3": true, + "11:7": true, + "0:14": true, + "2:11": true, + "15:4": true, + "14:3": true, + "11:10": true, + "0:8": true, + "15:3": true, + "1:0": true, + "14:4": true, + "11:13": true, + "8:0": true, + "14:2": true, + "0:1": true, + "15:2": true, + "15:0": true, + "12:14": true, + "9:11": true, + "10:11": true, + "11:14": true, + "8:2": true, + "0:7": true, + "14:0": true, + "2:0": true, + "12:15": true, + "11:12": true, + "8:4": true, + "1:2": true, + "11:15": true, + "8:3": true, + "0:9": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/7_5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/7_5.json index 106d07c3..898cca1f 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/7_5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/7_5.json @@ -1 +1,120 @@ -{"12:11":true,"9:14":true,"1:1":true,"11:5":[182,254],"8:8":true,"7:12":254,"13:13":true,"12:5":true,"10:14":true,"7:15":true,"11:11":true,"9:15":true,"0:6":true,"0:0":true,"8:1":254,"10:15":true,"7:14":true,"10:10":true,"0:2":254,"7:13":true,"15:1":true,"0:3":254,"0:4":254,"9:13":true,"11:0":true,"14:14":true,"12:6":true,"8:13":true,"10:9":true,"1:10":254,"15:14":true,"12:0":true,"9:9":254,"11:6":true,"10:7":true,"0:11":254,"15:15":true,"9:7":true,"1:13":true,"0:5":254,"11:4":[181,182],"9:1":254,"8:12":true,"1:14":true,"10:1":254,"12:4":true,"11:3":true,"8:15":true,"15:13":true,"1:15":true,"10:8":true,"11:2":[156,165],"8:14":true,"1:12":true,"9:8":254,"7:1":254,"14:13":true,"9:3":254,"1:11":true,"1:5":254,"0:13":true,"7:2":254,"11:1":[156,254],"11:8":true,"7:4":254,"9:2":254,"10:2":254,"0:10":254,"12:8":true,"7:3":254,"0:15":true,"11:9":true,"10:0":true,"10:6":true,"0:12":254,"12:9":true,"9:0":254,"7:0":254,"13:3":true,"11:7":true,"0:14":true,"12:7":true,"14:3":true,"1:6":true,"11:10":true,"12:10":true,"15:3":true,"1:0":true,"11:13":true,"8:0":254,"14:2":true,"0:1":true,"15:2":true,"15:0":true,"1:3":254,"11:14":true,"8:2":254,"1:4":true,"11:12":true,"8:4":254,"1:2":254,"7:5":254,"12:12":true,"11:15":true,"8:3":254,"7:11":true} \ No newline at end of file +{ + "12:11": true, + "9:14": true, + "1:1": true, + "11:5": [ + 182, + 254 + ], + "8:8": true, + "7:12": 254, + "13:13": true, + "12:5": true, + "10:14": true, + "7:15": true, + "11:11": true, + "9:15": true, + "0:6": true, + "0:0": true, + "8:1": 254, + "10:15": true, + "7:14": true, + "10:10": true, + "0:2": 254, + "7:13": true, + "15:1": true, + "0:3": 254, + "0:4": 254, + "9:13": true, + "11:0": true, + "14:14": true, + "12:6": true, + "8:13": true, + "10:9": true, + "1:10": 254, + "15:14": true, + "12:0": true, + "9:9": 254, + "11:6": true, + "10:7": true, + "0:11": 254, + "15:15": true, + "9:7": true, + "1:13": true, + "0:5": 254, + "11:4": [ + 181, + 182 + ], + "9:1": 254, + "8:12": true, + "1:14": true, + "10:1": 254, + "12:4": true, + "11:3": true, + "8:15": true, + "15:13": true, + "1:15": true, + "10:8": true, + "11:2": [ + 156, + 165 + ], + "8:14": true, + "1:12": true, + "9:8": 254, + "7:1": 254, + "14:13": true, + "9:3": 254, + "1:11": true, + "1:5": 254, + "0:13": true, + "7:2": 254, + "11:1": [ + 156, + 254 + ], + "11:8": true, + "7:4": 254, + "9:2": 254, + "10:2": 254, + "0:10": 254, + "12:8": true, + "7:3": 254, + "0:15": true, + "11:9": true, + "10:0": true, + "10:6": true, + "0:12": 254, + "12:9": true, + "9:0": 254, + "7:0": 254, + "13:3": true, + "11:7": true, + "0:14": true, + "12:7": true, + "14:3": true, + "1:6": true, + "11:10": true, + "12:10": true, + "15:3": true, + "1:0": true, + "11:13": true, + "8:0": 254, + "14:2": true, + "0:1": true, + "15:2": true, + "15:0": true, + "1:3": 254, + "11:14": true, + "8:2": 254, + "1:4": true, + "11:12": true, + "8:4": 254, + "1:2": 254, + "7:5": 254, + "12:12": true, + "11:15": true, + "8:3": 254, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/7_6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/7_6.json index 6b6caa51..54740b3d 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/7_6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/7_6.json @@ -1 +1,179 @@ -{"15:9":true,"12:11":true,"1:1":true,"11:5":true,"2:7":true,"13:13":true,"7:15":[187,223],"14:9":true,"11:11":true,"2:9":[112,236],"15:7":true,"9:15":true,"0:0":true,"14:7":true,"8:1":true,"13:10":true,"10:15":true,"1:8":114,"13:15":true,"10:10":true,"8:7":true,"4:11":[189,221],"0:2":true,"5:11":[192,219],"13:12":true,"15:1":true,"1:9":[110,236],"15:8":true,"13:14":true,"6:12":[109,110],"1:7":true,"6:15":[187,223],"14:8":true,"11:0":true,"14:14":true,"2:12":true,"10:9":true,"7:7":true,"2:15":true,"1:10":[114,115],"13:8":true,"15:14":true,"12:0":true,"9:9":true,"11:6":true,"10:7":true,"8:10":true,"15:12":true,"14:15":true,"13:1":true,"0:11":true,"15:15":true,"14:12":true,"9:7":true,"3:11":[109,222],"11:4":true,"9:1":true,"15:10":true,"14:10":true,"10:1":true,"13:7":true,"11:3":true,"8:15":[187,230],"15:13":true,"12:2":true,"2:10":[110,113],"1:15":true,"6:7":true,"11:2":true,"13:9":true,"7:1":true,"14:13":true,"12:1":true,"1:11":true,"5:9":true,"7:2":true,"4:9":true,"11:1":true,"5:7":true,"9:2":true,"4:7":true,"10:2":true,"0:10":116,"12:8":true,"14:11":true,"13:2":true,"3:12":113,"0:15":true,"11:9":true,"10:0":true,"3:15":true,"15:11":true,"12:9":true,"9:0":true,"7:0":true,"11:7":true,"12:7":true,"2:11":[112,223],"11:10":true,"12:10":true,"0:8":true,"1:0":true,"5:12":[108,111],"8:0":true,"14:2":true,"13:11":true,"4:15":[187,223],"0:1":true,"15:2":true,"4:12":[110,112],"5:15":[187,223],"15:0":true,"3:7":184,"10:11":true,"8:2":true,"0:7":[115,184],"15:6":true,"12:15":true,"1:2":true,"3:9":true,"12:12":true,"11:15":true,"0:9":[111,233]} \ No newline at end of file +{ + "15:9": true, + "12:11": true, + "1:1": true, + "11:5": true, + "2:7": true, + "13:13": true, + "7:15": [ + 187, + 223 + ], + "14:9": true, + "11:11": true, + "2:9": [ + 112, + 236 + ], + "15:7": true, + "9:15": true, + "0:0": true, + "14:7": true, + "8:1": true, + "13:10": true, + "10:15": true, + "1:8": 114, + "13:15": true, + "10:10": true, + "8:7": true, + "4:11": [ + 189, + 221 + ], + "0:2": true, + "5:11": [ + 192, + 219 + ], + "13:12": true, + "15:1": true, + "1:9": [ + 110, + 236 + ], + "15:8": true, + "13:14": true, + "6:12": [ + 109, + 110 + ], + "1:7": true, + "6:15": [ + 187, + 223 + ], + "14:8": true, + "11:0": true, + "14:14": true, + "2:12": true, + "10:9": true, + "7:7": true, + "2:15": true, + "1:10": [ + 114, + 115 + ], + "13:8": true, + "15:14": true, + "12:0": true, + "9:9": true, + "11:6": true, + "10:7": true, + "8:10": true, + "15:12": true, + "14:15": true, + "13:1": true, + "0:11": true, + "15:15": true, + "14:12": true, + "9:7": true, + "3:11": [ + 109, + 222 + ], + "11:4": true, + "9:1": true, + "15:10": true, + "14:10": true, + "10:1": true, + "13:7": true, + "11:3": true, + "8:15": [ + 187, + 230 + ], + "15:13": true, + "12:2": true, + "2:10": [ + 110, + 113 + ], + "1:15": true, + "6:7": true, + "11:2": true, + "13:9": true, + "7:1": true, + "14:13": true, + "12:1": true, + "1:11": true, + "5:9": true, + "7:2": true, + "4:9": true, + "11:1": true, + "5:7": true, + "9:2": true, + "4:7": true, + "10:2": true, + "0:10": 116, + "12:8": true, + "14:11": true, + "13:2": true, + "3:12": 113, + "0:15": true, + "11:9": true, + "10:0": true, + "3:15": true, + "15:11": true, + "12:9": true, + "9:0": true, + "7:0": true, + "11:7": true, + "12:7": true, + "2:11": [ + 112, + 223 + ], + "11:10": true, + "12:10": true, + "0:8": true, + "1:0": true, + "5:12": [ + 108, + 111 + ], + "8:0": true, + "14:2": true, + "13:11": true, + "4:15": [ + 187, + 223 + ], + "0:1": true, + "15:2": true, + "4:12": [ + 110, + 112 + ], + "5:15": [ + 187, + 223 + ], + "15:0": true, + "3:7": 184, + "10:11": true, + "8:2": true, + "0:7": [ + 115, + 184 + ], + "15:6": true, + "12:15": true, + "1:2": true, + "3:9": true, + "12:12": true, + "11:15": true, + "0:9": [ + 111, + 233 + ] +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/8_-1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/8_-1.json index e6dc6263..4a306305 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/8_-1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/8_-1.json @@ -1 +1,29 @@ -{"10:4":true,"9:4":true,"9:2":true,"13:0":true,"14:7":true,"8:1":true,"10:2":true,"9:6":true,"10:0":true,"15:11":true,"9:0":true,"7:0":true,"12:7":true,"11:0":true,"12:6":true,"13:8":true,"12:0":true,"11:6":true,"10:7":true,"15:12":186,"15:0":true,"14:6":true,"10:5":true,"14:10":true,"10:1":true,"14:0":true,"13:9":true} \ No newline at end of file +{ + "10:4": true, + "9:4": true, + "9:2": true, + "13:0": true, + "14:7": true, + "8:1": true, + "10:2": true, + "9:6": true, + "10:0": true, + "15:11": true, + "9:0": true, + "7:0": true, + "12:7": true, + "11:0": true, + "12:6": true, + "13:8": true, + "12:0": true, + "11:6": true, + "10:7": true, + "15:12": 186, + "15:0": true, + "14:6": true, + "10:5": true, + "14:10": true, + "10:1": true, + "14:0": true, + "13:9": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/8_-2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/8_-2.json index 3dbb3534..613e25ff 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/8_-2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/8_-2.json @@ -1 +1,50 @@ -{"12:11":true,"1:1":true,"8:8":true,"7:12":true,"13:13":true,"7:15":true,"11:11":true,"3:0":true,"10:15":true,"10:10":true,"13:15":true,"8:7":true,"4:11":186,"0:2":true,"13:12":true,"6:14":true,"14:14":true,"9:9":true,"15:15":true,"9:7":true,"0:5":true,"5:0":true,"10:8":true,"9:8":true,"8:5":true,"7:4":true,"8:11":true,"7:3":true,"9:6":true,"4:1":true,"11:9":true,"6:4":true,"5:1":true,"6:2":true,"7:6":true,"1:6":186,"11:10":true,"6:5":true,"2:2":true,"5:12":186,"0:1":true,"8:6":true,"3:1":true,"12:14":true,"12:15":true,"5:13":true,"7:5":true,"3:9":true} \ No newline at end of file +{ + "12:11": true, + "1:1": true, + "8:8": true, + "7:12": true, + "13:13": true, + "7:15": true, + "11:11": true, + "3:0": true, + "10:15": true, + "10:10": true, + "13:15": true, + "8:7": true, + "4:11": 186, + "0:2": true, + "13:12": true, + "6:14": true, + "14:14": true, + "9:9": true, + "15:15": true, + "9:7": true, + "0:5": true, + "5:0": true, + "10:8": true, + "9:8": true, + "8:5": true, + "7:4": true, + "8:11": true, + "7:3": true, + "9:6": true, + "4:1": true, + "11:9": true, + "6:4": true, + "5:1": true, + "6:2": true, + "7:6": true, + "1:6": 186, + "11:10": true, + "6:5": true, + "2:2": true, + "5:12": 186, + "0:1": true, + "8:6": true, + "3:1": true, + "12:14": true, + "12:15": true, + "5:13": true, + "7:5": true, + "3:9": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/8_0.json b/src/main/resources/assets/notenoughupdates/dwarven_data/8_0.json index da92c247..a4650235 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/8_0.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/8_0.json @@ -1 +1,21 @@ -{"9:14":true,"4:14":true,"10:14":true,"5:14":true,"7:15":true,"14:15":true,"9:15":true,"10:15":true,"5:15":true,"7:14":true,"13:15":true,"11:14":true,"8:15":true,"6:14":true,"12:15":true,"1:15":true,"11:15":true,"8:14":true,"6:15":true} \ No newline at end of file +{ + "9:14": true, + "4:14": true, + "10:14": true, + "5:14": true, + "7:15": true, + "14:15": true, + "9:15": true, + "10:15": true, + "5:15": true, + "7:14": true, + "13:15": true, + "11:14": true, + "8:15": true, + "6:14": true, + "12:15": true, + "1:15": true, + "11:15": true, + "8:14": true, + "6:15": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/8_1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/8_1.json index 4b3610ad..917a084f 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/8_1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/8_1.json @@ -1 +1,144 @@ -{"9:14":true,"1:1":true,"11:5":[163,254],"8:8":true,"7:12":true,"6:10":true,"10:14":true,"7:15":true,"11:11":true,"10:12":254,"3:0":true,"9:15":true,"0:0":true,"8:1":true,"10:15":true,"7:14":true,"14:1":true,"8:7":true,"0:2":true,"7:13":true,"3:2":true,"15:1":true,"10:13":true,"0:3":true,"8:9":254,"7:10":[184,254],"6:12":true,"3:3":true,"9:13":true,"2:1":true,"11:0":true,"4:3":true,"7:7":true,"5:3":true,"2:15":true,"12:0":true,"9:9":true,"8:10":254,"7:9":[184,254],"6:8":true,"13:1":true,"4:2":true,"9:7":true,"2:14":true,"1:13":true,"11:4":[163,254],"1:14":true,"9:1":true,"7:8":[183,254],"6:9":254,"2:13":true,"5:0":true,"10:1":true,"11:3":true,"8:15":true,"4:0":true,"12:2":true,"1:15":true,"10:8":true,"6:7":254,"11:2":true,"8:14":true,"9:8":true,"7:1":true,"12:1":true,"9:3":true,"6:0":true,"10:4":true,"3:13":true,"10:3":true,"0:13":true,"7:2":true,"6:6":true,"11:1":true,"7:4":true,"9:2":true,"13:0":true,"10:2":true,"7:3":true,"13:2":true,"0:15":true,"6:4":true,"10:0":true,"3:15":true,"9:0":true,"7:0":true,"13:3":true,"0:14":true,"13:4":[165,167],"3:14":true,"7:6":true,"15:4":[159,166],"14:3":true,"4:14":true,"6:5":true,"2:2":true,"15:3":true,"6:11":true,"1:0":true,"14:4":true,"11:13":254,"8:0":true,"14:2":true,"0:1":true,"15:2":true,"8:6":true,"3:1":true,"2:3":true,"15:0":true,"1:3":true,"11:14":true,"8:2":true,"14:0":true,"2:0":true,"11:12":254,"5:13":true,"1:2":true,"7:5":true,"11:15":true,"7:11":true,"4:13":true} \ No newline at end of file +{ + "9:14": true, + "1:1": true, + "11:5": [ + 163, + 254 + ], + "8:8": true, + "7:12": true, + "6:10": true, + "10:14": true, + "7:15": true, + "11:11": true, + "10:12": 254, + "3:0": true, + "9:15": true, + "0:0": true, + "8:1": true, + "10:15": true, + "7:14": true, + "14:1": true, + "8:7": true, + "0:2": true, + "7:13": true, + "3:2": true, + "15:1": true, + "10:13": true, + "0:3": true, + "8:9": 254, + "7:10": [ + 184, + 254 + ], + "6:12": true, + "3:3": true, + "9:13": true, + "2:1": true, + "11:0": true, + "4:3": true, + "7:7": true, + "5:3": true, + "2:15": true, + "12:0": true, + "9:9": true, + "8:10": 254, + "7:9": [ + 184, + 254 + ], + "6:8": true, + "13:1": true, + "4:2": true, + "9:7": true, + "2:14": true, + "1:13": true, + "11:4": [ + 163, + 254 + ], + "1:14": true, + "9:1": true, + "7:8": [ + 183, + 254 + ], + "6:9": 254, + "2:13": true, + "5:0": true, + "10:1": true, + "11:3": true, + "8:15": true, + "4:0": true, + "12:2": true, + "1:15": true, + "10:8": true, + "6:7": 254, + "11:2": true, + "8:14": true, + "9:8": true, + "7:1": true, + "12:1": true, + "9:3": true, + "6:0": true, + "10:4": true, + "3:13": true, + "10:3": true, + "0:13": true, + "7:2": true, + "6:6": true, + "11:1": true, + "7:4": true, + "9:2": true, + "13:0": true, + "10:2": true, + "7:3": true, + "13:2": true, + "0:15": true, + "6:4": true, + "10:0": true, + "3:15": true, + "9:0": true, + "7:0": true, + "13:3": true, + "0:14": true, + "13:4": [ + 165, + 167 + ], + "3:14": true, + "7:6": true, + "15:4": [ + 159, + 166 + ], + "14:3": true, + "4:14": true, + "6:5": true, + "2:2": true, + "15:3": true, + "6:11": true, + "1:0": true, + "14:4": true, + "11:13": 254, + "8:0": true, + "14:2": true, + "0:1": true, + "15:2": true, + "8:6": true, + "3:1": true, + "2:3": true, + "15:0": true, + "1:3": true, + "11:14": true, + "8:2": true, + "14:0": true, + "2:0": true, + "11:12": 254, + "5:13": true, + "1:2": true, + "7:5": true, + "11:15": true, + "7:11": true, + "4:13": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/9_-1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/9_-1.json index 4887712a..979a9b2f 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/9_-1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/9_-1.json @@ -1 +1,35 @@ -{"9:14":true,"1:6":true,"8:13":true,"7:12":true,"6:10":true,"5:9":true,"1:5":true,"0:13":true,"4:9":true,"3:5":true,"2:4":true,"9:15":true,"0:1":true,"0:0":true,"4:7":true,"3:6":true,"7:14":true,"5:10":true,"1:3":true,"1:14":186,"7:13":true,"5:11":[220,221],"8:15":true,"0:7":true,"1:2":true,"1:15":true,"6:12":true,"5:8":true,"7:11":true,"2:6":true} \ No newline at end of file +{ + "9:14": true, + "1:6": true, + "8:13": true, + "7:12": true, + "6:10": true, + "5:9": true, + "1:5": true, + "0:13": true, + "4:9": true, + "3:5": true, + "2:4": true, + "9:15": true, + "0:1": true, + "0:0": true, + "4:7": true, + "3:6": true, + "7:14": true, + "5:10": true, + "1:3": true, + "1:14": 186, + "7:13": true, + "5:11": [ + 220, + 221 + ], + "8:15": true, + "0:7": true, + "1:2": true, + "1:15": true, + "6:12": true, + "5:8": true, + "7:11": true, + "2:6": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/9_1.json b/src/main/resources/assets/notenoughupdates/dwarven_data/9_1.json index c4fd1b66..f957a1ba 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/9_1.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/9_1.json @@ -1 +1,280 @@ -{"1:1":true,"8:8":true,"6:10":true,"13:13":true,"3:0":true,"0:0":true,"3:6":true,"14:1":true,"13:15":true,"10:10":true,"8:7":true,"5:5":true,"4:11":254,"0:2":true,"9:10":true,"5:11":[182,186],"4:5":true,"13:12":true,"3:2":true,"13:14":true,"3:4":true,"0:3":true,"8:9":true,"7:10":true,"3:3":true,"0:4":true,"2:1":true,"14:14":true,"4:3":true,"5:4":true,"2:12":true,"10:9":true,"7:7":true,"5:3":true,"2:15":true,"15:14":true,"9:9":true,"4:4":true,"10:7":true,"8:10":true,"7:9":true,"6:8":true,"3:5":true,"15:12":true,"14:15":true,"4:2":true,"15:15":true,"14:12":true,"9:7":true,"3:11":true,"5:2":true,"2:14":true,"1:13":true,"2:13":true,"7:8":true,"6:9":true,"4:6":true,"1:14":true,"5:0":true,"5:6":true,"4:0":true,"15:13":true,"1:15":254,"10:8":true,"6:7":true,"1:12":true,"9:8":true,"14:13":true,"1:11":true,"3:13":true,"1:5":true,"11:8":true,"12:8":true,"14:11":true,"4:1":true,"3:12":true,"11:9":true,"15:5":[157,158],"14:5":true,"5:1":true,"3:15":true,"15:11":true,"12:9":true,"11:7":true,"2:5":true,"12:7":true,"3:14":true,"2:11":true,"14:3":true,"4:14":true,"1:6":254,"11:10":[160,236],"12:10":[159,236],"5:14":true,"2:2":true,"1:0":true,"14:4":true,"5:12":[182,186],"2:4":true,"14:2":true,"13:11":true,"4:15":true,"0:1":true,"4:12":true,"3:1":true,"13:5":true,"5:15":true,"2:3":true,"14:6":true,"1:3":true,"1:4":true,"15:6":[155,158],"14:0":true,"2:0":true,"5:13":true,"1:2":true,"4:13":true,"2:6":true,"15:9":[154,156],"12:11":true,"9:14":[172,236],"11:5":true,"7:12":[236,251],"12:5":true,"10:14":true,"7:15":true,"14:9":[157,233],"11:11":[159,236],"10:12":true,"6:13":true,"15:7":[155,158],"9:15":true,"14:7":[232,233],"9:12":true,"8:1":true,"10:15":true,"7:14":true,"7:13":[236,252],"6:14":true,"15:8":[155,157],"10:13":true,"6:15":true,"14:8":[158,233],"9:13":true,"11:0":true,"12:6":true,"8:13":[174,236],"1:10":true,"12:0":true,"11:6":true,"11:4":true,"9:1":true,"8:12":true,"12:3":true,"15:10":true,"14:10":[169,232],"10:1":true,"12:4":true,"11:3":true,"8:15":[176,235],"12:2":true,"2:10":254,"11:2":true,"8:14":[175,236],"13:9":[159,160],"7:1":true,"12:1":true,"9:3":true,"10:4":true,"5:9":true,"10:3":true,"7:2":true,"11:1":true,"9:4":true,"8:5":true,"5:7":true,"3:10":254,"7:4":true,"9:2":true,"8:11":true,"10:2":true,"7:3":true,"9:6":true,"10:0":true,"10:6":true,"9:0":true,"7:0":true,"5:8":true,"7:6":true,"6:11":true,"11:13":true,"8:0":true,"8:6":true,"12:13":true,"12:14":true,"10:5":true,"9:11":true,"5:10":[157,186],"3:7":true,"10:11":true,"9:5":true,"4:10":254,"11:14":true,"8:2":true,"12:15":true,"11:12":true,"8:4":true,"7:5":true,"12:12":true,"11:15":true,"8:3":true,"7:11":true} \ No newline at end of file +{ + "1:1": true, + "8:8": true, + "6:10": true, + "13:13": true, + "3:0": true, + "0:0": true, + "3:6": true, + "14:1": true, + "13:15": true, + "10:10": true, + "8:7": true, + "5:5": true, + "4:11": 254, + "0:2": true, + "9:10": true, + "5:11": [ + 182, + 186 + ], + "4:5": true, + "13:12": true, + "3:2": true, + "13:14": true, + "3:4": true, + "0:3": true, + "8:9": true, + "7:10": true, + "3:3": true, + "0:4": true, + "2:1": true, + "14:14": true, + "4:3": true, + "5:4": true, + "2:12": true, + "10:9": true, + "7:7": true, + "5:3": true, + "2:15": true, + "15:14": true, + "9:9": true, + "4:4": true, + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": true, + "3:5": true, + "15:12": true, + "14:15": true, + "4:2": true, + "15:15": true, + "14:12": true, + "9:7": true, + "3:11": true, + "5:2": true, + "2:14": true, + "1:13": true, + "2:13": true, + "7:8": true, + "6:9": true, + "4:6": true, + "1:14": true, + "5:0": true, + "5:6": true, + "4:0": true, + "15:13": true, + "1:15": 254, + "10:8": true, + "6:7": true, + "1:12": true, + "9:8": true, + "14:13": true, + "1:11": true, + "3:13": true, + "1:5": true, + "11:8": true, + "12:8": true, + "14:11": true, + "4:1": true, + "3:12": true, + "11:9": true, + "15:5": [ + 157, + 158 + ], + "14:5": true, + "5:1": true, + "3:15": true, + "15:11": true, + "12:9": true, + "11:7": true, + "2:5": true, + "12:7": true, + "3:14": true, + "2:11": true, + "14:3": true, + "4:14": true, + "1:6": 254, + "11:10": [ + 160, + 236 + ], + "12:10": [ + 159, + 236 + ], + "5:14": true, + "2:2": true, + "1:0": true, + "14:4": true, + "5:12": [ + 182, + 186 + ], + "2:4": true, + "14:2": true, + "13:11": true, + "4:15": true, + "0:1": true, + "4:12": true, + "3:1": true, + "13:5": true, + "5:15": true, + "2:3": true, + "14:6": true, + "1:3": true, + "1:4": true, + "15:6": [ + 155, + 158 + ], + "14:0": true, + "2:0": true, + "5:13": true, + "1:2": true, + "4:13": true, + "2:6": true, + "15:9": [ + 154, + 156 + ], + "12:11": true, + "9:14": [ + 172, + 236 + ], + "11:5": true, + "7:12": [ + 236, + 251 + ], + "12:5": true, + "10:14": true, + "7:15": true, + "14:9": [ + 157, + 233 + ], + "11:11": [ + 159, + 236 + ], + "10:12": true, + "6:13": true, + "15:7": [ + 155, + 158 + ], + "9:15": true, + "14:7": [ + 232, + 233 + ], + "9:12": true, + "8:1": true, + "10:15": true, + "7:14": true, + "7:13": [ + 236, + 252 + ], + "6:14": true, + "15:8": [ + 155, + 157 + ], + "10:13": true, + "6:15": true, + "14:8": [ + 158, + 233 + ], + "9:13": true, + "11:0": true, + "12:6": true, + "8:13": [ + 174, + 236 + ], + "1:10": true, + "12:0": true, + "11:6": true, + "11:4": true, + "9:1": true, + "8:12": true, + "12:3": true, + "15:10": true, + "14:10": [ + 169, + 232 + ], + "10:1": true, + "12:4": true, + "11:3": true, + "8:15": [ + 176, + 235 + ], + "12:2": true, + "2:10": 254, + "11:2": true, + "8:14": [ + 175, + 236 + ], + "13:9": [ + 159, + 160 + ], + "7:1": true, + "12:1": true, + "9:3": true, + "10:4": true, + "5:9": true, + "10:3": true, + "7:2": true, + "11:1": true, + "9:4": true, + "8:5": true, + "5:7": true, + "3:10": 254, + "7:4": true, + "9:2": true, + "8:11": true, + "10:2": true, + "7:3": true, + "9:6": true, + "10:0": true, + "10:6": true, + "9:0": true, + "7:0": true, + "5:8": true, + "7:6": true, + "6:11": true, + "11:13": true, + "8:0": true, + "8:6": true, + "12:13": true, + "12:14": true, + "10:5": true, + "9:11": true, + "5:10": [ + 157, + 186 + ], + "3:7": true, + "10:11": true, + "9:5": true, + "4:10": 254, + "11:14": true, + "8:2": true, + "12:15": true, + "11:12": true, + "8:4": true, + "7:5": true, + "12:12": true, + "11:15": true, + "8:3": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/9_2.json b/src/main/resources/assets/notenoughupdates/dwarven_data/9_2.json index c7c85d2d..77777607 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/9_2.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/9_2.json @@ -1 +1,217 @@ -{"1:1":true,"8:8":true,"6:10":true,"3:0":true,"0:6":true,"3:6":true,"14:1":true,"13:15":true,"10:10":true,"8:7":true,"5:5":true,"9:10":true,"5:11":true,"4:5":true,"3:2":true,"15:1":true,"3:4":true,"8:9":true,"7:10":true,"2:1":true,"14:14":true,"4:3":true,"5:4":true,"10:9":true,"7:7":true,"5:3":true,"2:15":true,"9:9":true,"4:4":true,"10:7":true,"8:10":true,"7:9":true,"6:8":true,"3:5":true,"14:15":true,"13:1":true,"4:2":true,"9:7":true,"5:2":true,"2:14":true,"7:8":true,"6:9":true,"1:14":true,"5:0":[182,186],"5:6":true,"4:0":254,"1:15":true,"10:8":true,"6:7":true,"9:8":true,"14:13":true,"11:8":true,"13:6":true,"13:0":true,"12:8":true,"13:2":true,"4:1":true,"11:9":true,"15:5":true,"14:5":true,"5:1":[182,186],"3:15":true,"12:9":true,"13:3":true,"11:7":true,"2:5":true,"12:7":true,"3:14":true,"15:4":true,"14:3":true,"4:14":true,"1:6":true,"5:14":true,"2:2":true,"15:3":true,"1:0":true,"14:4":true,"5:12":true,"14:2":true,"4:15":true,"15:2":true,"3:1":true,"13:5":true,"5:15":true,"15:0":true,"14:6":true,"15:6":true,"14:0":true,"2:0":254,"5:13":true,"1:2":true,"2:6":true,"15:9":true,"12:11":true,"9:14":true,"11:5":true,"2:7":true,"7:12":true,"12:5":true,"10:14":true,"7:15":true,"14:9":true,"11:11":true,"10:12":true,"6:13":true,"15:7":true,"9:15":true,"14:7":true,"9:12":true,"8:1":[177,233],"10:15":true,"7:14":true,"1:8":true,"7:13":true,"6:14":true,"15:8":true,"10:13":true,"6:12":true,"1:7":true,"6:15":true,"14:8":true,"9:13":true,"11:0":true,"12:6":true,"8:13":true,"13:8":true,"12:0":true,"6:1":182,"11:6":true,"12:3":true,"11:4":true,"9:1":[132,233],"8:12":true,"10:1":true,"13:7":true,"12:4":true,"11:3":true,"8:15":true,"12:2":true,"11:2":true,"8:14":true,"13:9":true,"7:1":[181,251],"12:1":true,"9:3":true,"6:0":true,"10:4":true,"5:9":true,"10:3":true,"7:2":true,"6:6":true,"11:1":true,"9:4":true,"8:5":true,"5:7":true,"7:4":true,"9:2":true,"8:11":true,"10:2":true,"7:3":true,"9:6":true,"6:4":true,"10:0":true,"10:6":true,"9:0":[174,240],"6:3":true,"7:0":true,"5:8":true,"6:2":true,"7:6":true,"6:5":true,"0:8":true,"6:11":true,"11:13":true,"8:0":[177,240],"8:6":true,"12:13":true,"12:14":true,"10:5":true,"9:11":true,"5:10":true,"10:11":true,"9:5":true,"11:14":true,"8:2":true,"0:7":true,"12:15":true,"11:12":true,"8:4":true,"7:5":true,"12:12":true,"11:15":true,"8:3":true,"7:11":true} \ No newline at end of file +{ + "1:1": true, + "8:8": true, + "6:10": true, + "3:0": true, + "0:6": true, + "3:6": true, + "14:1": true, + "13:15": true, + "10:10": true, + "8:7": true, + "5:5": true, + "9:10": true, + "5:11": true, + "4:5": true, + "3:2": true, + "15:1": true, + "3:4": true, + "8:9": true, + "7:10": true, + "2:1": true, + "14:14": true, + "4:3": true, + "5:4": true, + "10:9": true, + "7:7": true, + "5:3": true, + "2:15": true, + "9:9": true, + "4:4": true, + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": true, + "3:5": true, + "14:15": true, + "13:1": true, + "4:2": true, + "9:7": true, + "5:2": true, + "2:14": true, + "7:8": true, + "6:9": true, + "1:14": true, + "5:0": [ + 182, + 186 + ], + "5:6": true, + "4:0": 254, + "1:15": true, + "10:8": true, + "6:7": true, + "9:8": true, + "14:13": true, + "11:8": true, + "13:6": true, + "13:0": true, + "12:8": true, + "13:2": true, + "4:1": true, + "11:9": true, + "15:5": true, + "14:5": true, + "5:1": [ + 182, + 186 + ], + "3:15": true, + "12:9": true, + "13:3": true, + "11:7": true, + "2:5": true, + "12:7": true, + "3:14": true, + "15:4": true, + "14:3": true, + "4:14": true, + "1:6": true, + "5:14": true, + "2:2": true, + "15:3": true, + "1:0": true, + "14:4": true, + "5:12": true, + "14:2": true, + "4:15": true, + "15:2": true, + "3:1": true, + "13:5": true, + "5:15": true, + "15:0": true, + "14:6": true, + "15:6": true, + "14:0": true, + "2:0": 254, + "5:13": true, + "1:2": true, + "2:6": true, + "15:9": true, + "12:11": true, + "9:14": true, + "11:5": true, + "2:7": true, + "7:12": true, + "12:5": true, + "10:14": true, + "7:15": true, + "14:9": true, + "11:11": true, + "10:12": true, + "6:13": true, + "15:7": true, + "9:15": true, + "14:7": true, + "9:12": true, + "8:1": [ + 177, + 233 + ], + "10:15": true, + "7:14": true, + "1:8": true, + "7:13": true, + "6:14": true, + "15:8": true, + "10:13": true, + "6:12": true, + "1:7": true, + "6:15": true, + "14:8": true, + "9:13": true, + "11:0": true, + "12:6": true, + "8:13": true, + "13:8": true, + "12:0": true, + "6:1": 182, + "11:6": true, + "12:3": true, + "11:4": true, + "9:1": [ + 132, + 233 + ], + "8:12": true, + "10:1": true, + "13:7": true, + "12:4": true, + "11:3": true, + "8:15": true, + "12:2": true, + "11:2": true, + "8:14": true, + "13:9": true, + "7:1": [ + 181, + 251 + ], + "12:1": true, + "9:3": true, + "6:0": true, + "10:4": true, + "5:9": true, + "10:3": true, + "7:2": true, + "6:6": true, + "11:1": true, + "9:4": true, + "8:5": true, + "5:7": true, + "7:4": true, + "9:2": true, + "8:11": true, + "10:2": true, + "7:3": true, + "9:6": true, + "6:4": true, + "10:0": true, + "10:6": true, + "9:0": [ + 174, + 240 + ], + "6:3": true, + "7:0": true, + "5:8": true, + "6:2": true, + "7:6": true, + "6:5": true, + "0:8": true, + "6:11": true, + "11:13": true, + "8:0": [ + 177, + 240 + ], + "8:6": true, + "12:13": true, + "12:14": true, + "10:5": true, + "9:11": true, + "5:10": true, + "10:11": true, + "9:5": true, + "11:14": true, + "8:2": true, + "0:7": true, + "12:15": true, + "11:12": true, + "8:4": true, + "7:5": true, + "12:12": true, + "11:15": true, + "8:3": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/9_5.json b/src/main/resources/assets/notenoughupdates/dwarven_data/9_5.json index 51fce837..03686205 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/9_5.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/9_5.json @@ -1 +1,253 @@ -{"1:1":true,"8:8":true,"6:10":true,"13:13":true,"3:0":true,"0:0":true,"3:6":true,"14:1":true,"13:15":172,"10:10":true,"8:7":true,"5:5":true,"4:11":true,"0:2":true,"9:10":true,"5:11":true,"4:5":true,"13:12":true,"3:2":true,"15:1":true,"13:14":true,"3:4":true,"0:3":true,"8:9":true,"7:10":true,"3:3":true,"2:1":true,"14:14":[172,228],"4:3":true,"5:4":true,"2:12":true,"10:9":true,"7:7":true,"5:3":true,"2:15":true,"15:14":[158,171],"9:9":true,"4:4":true,"10:7":true,"8:10":true,"7:9":true,"6:8":true,"3:5":true,"15:12":[172,173],"14:15":[158,227],"13:1":true,"4:2":true,"15:15":[164,170],"14:12":true,"9:7":true,"3:11":true,"5:2":true,"2:14":true,"1:13":true,"2:13":true,"7:8":true,"6:9":true,"4:6":true,"1:14":true,"5:0":true,"5:6":true,"4:0":true,"15:13":[171,172],"1:15":true,"10:8":true,"6:7":true,"1:12":true,"9:8":true,"14:13":[173,229],"1:11":true,"3:13":true,"1:5":true,"11:8":true,"13:6":true,"13:0":true,"12:8":true,"14:11":true,"13:2":true,"4:1":true,"3:12":true,"11:9":true,"15:5":true,"14:5":true,"5:1":true,"3:15":true,"15:11":true,"12:9":true,"13:3":true,"11:7":true,"2:5":true,"13:4":true,"12:7":true,"3:14":true,"2:11":true,"15:4":true,"14:3":true,"4:14":true,"1:6":true,"11:10":true,"12:10":true,"5:14":true,"2:2":true,"15:3":true,"1:0":true,"14:4":true,"5:12":true,"2:4":true,"14:2":true,"13:11":true,"4:15":true,"15:2":true,"4:12":true,"3:1":true,"13:5":true,"5:15":true,"2:3":true,"15:0":true,"14:6":true,"1:3":true,"1:4":true,"14:0":true,"2:0":true,"5:13":true,"1:2":true,"4:13":true,"2:6":true,"15:9":true,"12:11":true,"9:14":true,"11:5":true,"7:12":true,"12:5":true,"10:14":true,"7:15":true,"14:9":true,"11:11":true,"10:12":true,"6:13":true,"15:7":true,"9:15":true,"14:7":true,"9:12":true,"8:1":true,"13:10":true,"10:15":true,"7:14":true,"7:13":true,"6:14":true,"15:8":true,"10:13":true,"6:12":true,"6:15":true,"14:8":true,"9:13":true,"11:0":true,"12:6":true,"8:13":true,"1:10":true,"13:8":true,"12:0":true,"6:1":true,"11:6":true,"11:4":true,"9:1":true,"8:12":true,"12:3":true,"15:10":true,"14:10":true,"10:1":true,"13:7":true,"12:4":true,"11:3":true,"8:15":true,"12:2":true,"2:10":true,"11:2":true,"8:14":true,"13:9":true,"7:1":true,"12:1":true,"9:3":true,"6:0":true,"10:4":true,"5:9":true,"10:3":true,"7:2":true,"6:6":true,"11:1":true,"9:4":true,"8:5":true,"5:7":true,"3:10":true,"7:4":true,"9:2":true,"8:11":true,"10:2":true,"7:3":true,"9:6":true,"6:4":true,"10:0":true,"10:6":true,"9:0":true,"6:3":true,"7:0":true,"5:8":true,"6:2":true,"7:6":true,"6:5":true,"6:11":true,"11:13":true,"8:0":true,"8:6":true,"12:13":true,"12:14":true,"10:5":true,"9:11":true,"5:10":true,"10:11":true,"9:5":true,"4:10":true,"11:14":true,"8:2":true,"12:15":true,"11:12":true,"8:4":true,"7:5":true,"12:12":true,"11:15":true,"8:3":true,"7:11":true} \ No newline at end of file +{ + "1:1": true, + "8:8": true, + "6:10": true, + "13:13": true, + "3:0": true, + "0:0": true, + "3:6": true, + "14:1": true, + "13:15": 172, + "10:10": true, + "8:7": true, + "5:5": true, + "4:11": true, + "0:2": true, + "9:10": true, + "5:11": true, + "4:5": true, + "13:12": true, + "3:2": true, + "15:1": true, + "13:14": true, + "3:4": true, + "0:3": true, + "8:9": true, + "7:10": true, + "3:3": true, + "2:1": true, + "14:14": [ + 172, + 228 + ], + "4:3": true, + "5:4": true, + "2:12": true, + "10:9": true, + "7:7": true, + "5:3": true, + "2:15": true, + "15:14": [ + 158, + 171 + ], + "9:9": true, + "4:4": true, + "10:7": true, + "8:10": true, + "7:9": true, + "6:8": true, + "3:5": true, + "15:12": [ + 172, + 173 + ], + "14:15": [ + 158, + 227 + ], + "13:1": true, + "4:2": true, + "15:15": [ + 164, + 170 + ], + "14:12": true, + "9:7": true, + "3:11": true, + "5:2": true, + "2:14": true, + "1:13": true, + "2:13": true, + "7:8": true, + "6:9": true, + "4:6": true, + "1:14": true, + "5:0": true, + "5:6": true, + "4:0": true, + "15:13": [ + 171, + 172 + ], + "1:15": true, + "10:8": true, + "6:7": true, + "1:12": true, + "9:8": true, + "14:13": [ + 173, + 229 + ], + "1:11": true, + "3:13": true, + "1:5": true, + "11:8": true, + "13:6": true, + "13:0": true, + "12:8": true, + "14:11": true, + "13:2": true, + "4:1": true, + "3:12": true, + "11:9": true, + "15:5": true, + "14:5": true, + "5:1": true, + "3:15": true, + "15:11": true, + "12:9": true, + "13:3": true, + "11:7": true, + "2:5": true, + "13:4": true, + "12:7": true, + "3:14": true, + "2:11": true, + "15:4": true, + "14:3": true, + "4:14": true, + "1:6": true, + "11:10": true, + "12:10": true, + "5:14": true, + "2:2": true, + "15:3": true, + "1:0": true, + "14:4": true, + "5:12": true, + "2:4": true, + "14:2": true, + "13:11": true, + "4:15": true, + "15:2": true, + "4:12": true, + "3:1": true, + "13:5": true, + "5:15": true, + "2:3": true, + "15:0": true, + "14:6": true, + "1:3": true, + "1:4": true, + "14:0": true, + "2:0": true, + "5:13": true, + "1:2": true, + "4:13": true, + "2:6": true, + "15:9": true, + "12:11": true, + "9:14": true, + "11:5": true, + "7:12": true, + "12:5": true, + "10:14": true, + "7:15": true, + "14:9": true, + "11:11": true, + "10:12": true, + "6:13": true, + "15:7": true, + "9:15": true, + "14:7": true, + "9:12": true, + "8:1": true, + "13:10": true, + "10:15": true, + "7:14": true, + "7:13": true, + "6:14": true, + "15:8": true, + "10:13": true, + "6:12": true, + "6:15": true, + "14:8": true, + "9:13": true, + "11:0": true, + "12:6": true, + "8:13": true, + "1:10": true, + "13:8": true, + "12:0": true, + "6:1": true, + "11:6": true, + "11:4": true, + "9:1": true, + "8:12": true, + "12:3": true, + "15:10": true, + "14:10": true, + "10:1": true, + "13:7": true, + "12:4": true, + "11:3": true, + "8:15": true, + "12:2": true, + "2:10": true, + "11:2": true, + "8:14": true, + "13:9": true, + "7:1": true, + "12:1": true, + "9:3": true, + "6:0": true, + "10:4": true, + "5:9": true, + "10:3": true, + "7:2": true, + "6:6": true, + "11:1": true, + "9:4": true, + "8:5": true, + "5:7": true, + "3:10": true, + "7:4": true, + "9:2": true, + "8:11": true, + "10:2": true, + "7:3": true, + "9:6": true, + "6:4": true, + "10:0": true, + "10:6": true, + "9:0": true, + "6:3": true, + "7:0": true, + "5:8": true, + "6:2": true, + "7:6": true, + "6:5": true, + "6:11": true, + "11:13": true, + "8:0": true, + "8:6": true, + "12:13": true, + "12:14": true, + "10:5": true, + "9:11": true, + "5:10": true, + "10:11": true, + "9:5": true, + "4:10": true, + "11:14": true, + "8:2": true, + "12:15": true, + "11:12": true, + "8:4": true, + "7:5": true, + "12:12": true, + "11:15": true, + "8:3": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/9_6.json b/src/main/resources/assets/notenoughupdates/dwarven_data/9_6.json index fab5a1e8..1cad6220 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/9_6.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/9_6.json @@ -1 +1,129 @@ -{"1:1":true,"11:5":true,"2:7":true,"8:8":true,"12:5":true,"7:15":true,"2:9":true,"3:0":true,"9:15":true,"8:1":true,"10:15":true,"14:1":true,"13:15":true,"8:7":true,"5:5":true,"4:11":true,"5:11":true,"3:2":true,"15:1":true,"1:9":true,"1:7":true,"6:15":true,"2:1":true,"11:0":true,"12:6":true,"5:4":true,"5:3":true,"2:15":true,"12:0":234,"6:1":true,"11:6":true,"10:7":true,"14:15":true,"13:1":true,"4:2":true,"0:11":true,"15:15":true,"9:7":true,"3:11":true,"5:2":true,"12:3":true,"11:4":true,"9:1":true,"7:8":true,"5:0":true,"10:1":true,"5:6":true,"12:4":true,"11:3":true,"8:15":true,"4:0":true,"12:2":true,"1:15":true,"10:8":true,"11:2":true,"9:8":true,"7:1":true,"12:1":true,"9:3":true,"6:0":true,"1:11":true,"10:4":true,"10:3":true,"0:13":true,"7:2":true,"11:1":true,"9:4":true,"8:5":true,"5:7":true,"7:4":true,"13:6":true,"9:2":true,"13:0":172,"8:11":true,"4:7":true,"10:2":true,"7:3":true,"13:2":true,"9:6":true,"4:1":true,"0:15":true,"10:0":true,"14:5":true,"10:6":true,"5:1":true,"3:15":true,"9:0":true,"7:0":true,"13:3":true,"11:7":true,"0:14":true,"13:4":true,"12:7":true,"2:11":true,"15:4":true,"14:3":true,"2:2":true,"15:3":true,"6:11":true,"1:0":true,"14:4":true,"8:0":true,"14:2":true,"4:15":true,"15:2":true,"8:6":true,"3:1":true,"13:5":true,"5:15":true,"15:0":true,"10:5":true,"9:11":true,"3:7":true,"9:5":true,"8:2":true,"0:7":true,"14:0":true,"2:0":true,"12:15":true,"8:4":true,"1:2":true,"7:5":true,"3:9":true,"11:15":true,"8:3":true,"0:9":true,"7:11":true} \ No newline at end of file +{ + "1:1": true, + "11:5": true, + "2:7": true, + "8:8": true, + "12:5": true, + "7:15": true, + "2:9": true, + "3:0": true, + "9:15": true, + "8:1": true, + "10:15": true, + "14:1": true, + "13:15": true, + "8:7": true, + "5:5": true, + "4:11": true, + "5:11": true, + "3:2": true, + "15:1": true, + "1:9": true, + "1:7": true, + "6:15": true, + "2:1": true, + "11:0": true, + "12:6": true, + "5:4": true, + "5:3": true, + "2:15": true, + "12:0": 234, + "6:1": true, + "11:6": true, + "10:7": true, + "14:15": true, + "13:1": true, + "4:2": true, + "0:11": true, + "15:15": true, + "9:7": true, + "3:11": true, + "5:2": true, + "12:3": true, + "11:4": true, + "9:1": true, + "7:8": true, + "5:0": true, + "10:1": true, + "5:6": true, + "12:4": true, + "11:3": true, + "8:15": true, + "4:0": true, + "12:2": true, + "1:15": true, + "10:8": true, + "11:2": true, + "9:8": true, + "7:1": true, + "12:1": true, + "9:3": true, + "6:0": true, + "1:11": true, + "10:4": true, + "10:3": true, + "0:13": true, + "7:2": true, + "11:1": true, + "9:4": true, + "8:5": true, + "5:7": true, + "7:4": true, + "13:6": true, + "9:2": true, + "13:0": 172, + "8:11": true, + "4:7": true, + "10:2": true, + "7:3": true, + "13:2": true, + "9:6": true, + "4:1": true, + "0:15": true, + "10:0": true, + "14:5": true, + "10:6": true, + "5:1": true, + "3:15": true, + "9:0": true, + "7:0": true, + "13:3": true, + "11:7": true, + "0:14": true, + "13:4": true, + "12:7": true, + "2:11": true, + "15:4": true, + "14:3": true, + "2:2": true, + "15:3": true, + "6:11": true, + "1:0": true, + "14:4": true, + "8:0": true, + "14:2": true, + "4:15": true, + "15:2": true, + "8:6": true, + "3:1": true, + "13:5": true, + "5:15": true, + "15:0": true, + "10:5": true, + "9:11": true, + "3:7": true, + "9:5": true, + "8:2": true, + "0:7": true, + "14:0": true, + "2:0": true, + "12:15": true, + "8:4": true, + "1:2": true, + "7:5": true, + "3:9": true, + "11:15": true, + "8:3": true, + "0:9": true, + "7:11": true +} diff --git a/src/main/resources/assets/notenoughupdates/dwarven_data/all.json b/src/main/resources/assets/notenoughupdates/dwarven_data/all.json index 18d6bee9..a0831fbf 100644 --- a/src/main/resources/assets/notenoughupdates/dwarven_data/all.json +++ b/src/main/resources/assets/notenoughupdates/dwarven_data/all.json @@ -1 +1,206 @@ -{"1_-6":true,"0_-1":true,"8_8":true,"6_10":true,"-1_-2":true,"-9_5":true,"-2_-9":true,"-1_4":true,"-7_10":true,"-2_5":true,"10_10":true,"-1_6":true,"5_11":true,"4_5":true,"0_-5":true,"0_-3":true,"-1_-4":true,"-3_-10":true,"2_12":true,"5_4":true,"0_-9":true,"7_7":true,"-1_-8":true,"9_9":true,"8_10":true,"7_9":true,"6_8":true,"-4_-9":true,"9_7":true,"-3_-8":true,"0_5":true,"-1_-10":true,"-11_1":true,"5_6":true,"-13_1":true,"10_8":true,"1_11":true,"-9_1":true,"7_16":true,"4_-7":true,"-13_-3":true,"9_16":true,"-12_11":true,"12_8":true,"11_9":true,"1_-8":true,"-13_-1":true,"2_-9":true,"-11_-1":true,"11_7":true,"2_5":true,"1_-10":true,"1_6":true,"-14_11":true,"6_17":true,"12_10":true,"-10_11":true,"-12_0":true,"1_-4":true,"4_12":true,"2_-3":true,"10_17":true,"-1_-6":true,"1_4":true,"-4_-7":true,"-12_-2":true,"0_-7":true,"-3_-6":true,"7_15":true,"11_11":true,"10_12":true,"9_15":true,"7_13":true,"-11_10":true,"6_14":true,"-12_9":true,"6_12":true,"-5_-7":true,"-13_10":true,"9_13":true,"5_16":true,"8_12":true,"6_-7":true,"-10_9":true,"-7_-7":true,"8_14":true,"11_2":true,"2_-11":true,"-5_-9":true,"9_4":true,"8_5":true,"0_-11":true,"-6_11":true,"9_0":true,"-7_-9":true,"11_13":true,"-7_5":true,"-2_-11":true,"9_11":true,"12_12":true,"8_3":true,"7_11":true,"8_-3":true,"0_-4":true,"-1_-3":true,"0_6":true,"-12_1":true,"-1_-5":true,"8_7":true,"4_11":true,"5_5":true,"-2_-10":true,"1_-7":true,"9_10":true,"-1_-1":true,"8_9":true,"7_10":true,"0_4":true,"2_-6":true,"0_-2":true,"-9_6":true,"10_9":true,"-10_1":true,"4_4":true,"10_7":true,"0_11":true,"7_8":true,"6_9":true,"-4_-8":true,"0_-10":true,"-1_5":true,"-3_-9":true,"0_-8":true,"-1_-9":true,"6_7":true,"9_8":true,"5_-7":true,"2_-10":true,"-11_-2":true,"1_5":true,"-11_4":true,"1_-9":true,"-13_-2":true,"10_16":true,"-2_-6":true,"3_12":true,"-11_0":true,"12_9":true,"12_7":true,"6_16":true,"-13_0":true,"2_11":true,"-10_5":true,"11_10":true,"-12_-1":true,"-1_-7":true,"5_12":true,"0_-6":true,"-3_-7":true,"-11_11":true,"9_17":true,"8_16":true,"-13_11":true,"1_-5":true,"-12_-3":true,"-10_10":true,"12_11":true,"9_14":true,"11_5":true,"7_12":true,"-6_-7":true,"6_13":true,"9_12":true,"7_14":true,"5_17":true,"10_13":true,"6_15":true,"1_-11":true,"8_13":true,"-11_9":true,"6_-6":true,"-12_10":true,"8_15":true,"9_3":true,"-5_11":true,"3_-11":true,"8_11":true,"10_2":true,"-1_-11":true,"6_4":true,"10_6":true,"-5_-8":true,"-6_-9":true,"-6_3":true,"6_11":true,"8_6":true,"12_13":true,"-7_11":true,"10_11":true,"8_2":true,"11_12":true,"8_4":true,"-7_-8":true,"-8_10":true} \ No newline at end of file +{ + "1_-6": true, + "0_-1": true, + "8_8": true, + "6_10": true, + "-1_-2": true, + "-9_5": true, + "-2_-9": true, + "-1_4": true, + "-7_10": true, + "-2_5": true, + "10_10": true, + "-1_6": true, + "5_11": true, + "4_5": true, + "0_-5": true, + "0_-3": true, + "-1_-4": true, + "-3_-10": true, + "2_12": true, + "5_4": true, + "0_-9": true, + "7_7": true, + "-1_-8": true, + "9_9": true, + "8_10": true, + "7_9": true, + "6_8": true, + "-4_-9": true, + "9_7": true, + "-3_-8": true, + "0_5": true, + "-1_-10": true, + "-11_1": true, + "5_6": true, + "-13_1": true, + "10_8": true, + "1_11": true, + "-9_1": true, + "7_16": true, + "4_-7": true, + "-13_-3": true, + "9_16": true, + "-12_11": true, + "12_8": true, + "11_9": true, + "1_-8": true, + "-13_-1": true, + "2_-9": true, + "-11_-1": true, + "11_7": true, + "2_5": true, + "1_-10": true, + "1_6": true, + "-14_11": true, + "6_17": true, + "12_10": true, + "-10_11": true, + "-12_0": true, + "1_-4": true, + "4_12": true, + "2_-3": true, + "10_17": true, + "-1_-6": true, + "1_4": true, + "-4_-7": true, + "-12_-2": true, + "0_-7": true, + "-3_-6": true, + "7_15": true, + "11_11": true, + "10_12": true, + "9_15": true, + "7_13": true, + "-11_10": true, + "6_14": true, + "-12_9": true, + "6_12": true, + "-5_-7": true, + "-13_10": true, + "9_13": true, + "5_16": true, + "8_12": true, + "6_-7": true, + "-10_9": true, + "-7_-7": true, + "8_14": true, + "11_2": true, + "2_-11": true, + "-5_-9": true, + "9_4": true, + "8_5": true, + "0_-11": true, + "-6_11": true, + "9_0": true, + "-7_-9": true, + "11_13": true, + "-7_5": true, + "-2_-11": true, + "9_11": true, + "12_12": true, + "8_3": true, + "7_11": true, + "8_-3": true, + "0_-4": true, + "-1_-3": true, + "0_6": true, + "-12_1": true, + "-1_-5": true, + "8_7": true, + "4_11": true, + "5_5": true, + "-2_-10": true, + "1_-7": true, + "9_10": true, + "-1_-1": true, + "8_9": true, + "7_10": true, + "0_4": true, + "2_-6": true, + "0_-2": true, + "-9_6": true, + "10_9": true, + "-10_1": true, + "4_4": true, + "10_7": true, + "0_11": true, + "7_8": true, + "6_9": true, + "-4_-8": true, + "0_-10": true, + "-1_5": true, + "-3_-9": true, + "0_-8": true, + "-1_-9": true, + "6_7": true, + "9_8": true, + "5_-7": true, + "2_-10": true, + "-11_-2": true, + "1_5": true, + "-11_4": true, + "1_-9": true, + "-13_-2": true, + "10_16": true, + "-2_-6": true, + "3_12": true, + "-11_0": true, + "12_9": true, + "12_7": true, + "6_16": true, + "-13_0": true, + "2_11": true, + "-10_5": true, + "11_10": true, + "-12_-1": true, + "-1_-7": true, + "5_12": true, + "0_-6": true, + "-3_-7": true, + "-11_11": true, + "9_17": true, + "8_16": true, + "-13_11": true, + "1_-5": true, + "-12_-3": true, + "-10_10": true, + "12_11": true, + "9_14": true, + "11_5": true, + "7_12": true, + "-6_-7": true, + "6_13": true, + "9_12": true, + "7_14": true, + "5_17": true, + "10_13": true, + "6_15": true, + "1_-11": true, + "8_13": true, + "-11_9": true, + "6_-6": true, + "-12_10": true, + "8_15": true, + "9_3": true, + "-5_11": true, + "3_-11": true, + "8_11": true, + "10_2": true, + "-1_-11": true, + "6_4": true, + "10_6": true, + "-5_-8": true, + "-6_-9": true, + "-6_3": true, + "6_11": true, + "8_6": true, + "12_13": true, + "-7_11": true, + "10_11": true, + "8_2": true, + "11_12": true, + "8_4": true, + "-7_-8": true, + "-8_10": true +} diff --git a/src/main/resources/assets/notenoughupdates/dynamic_54/style1/dynamic_config.json b/src/main/resources/assets/notenoughupdates/dynamic_54/style1/dynamic_config.json index 05dbf61a..43135433 100644 --- a/src/main/resources/assets/notenoughupdates/dynamic_54/style1/dynamic_config.json +++ b/src/main/resources/assets/notenoughupdates/dynamic_54/style1/dynamic_config.json @@ -1,3 +1,3 @@ { - "text-colour": "FF000000" -} \ No newline at end of file + "text-colour": "FF000000" +} diff --git a/src/main/resources/assets/notenoughupdates/dynamic_54/style2/dynamic_config.json b/src/main/resources/assets/notenoughupdates/dynamic_54/style2/dynamic_config.json index 05dbf61a..43135433 100644 --- a/src/main/resources/assets/notenoughupdates/dynamic_54/style2/dynamic_config.json +++ b/src/main/resources/assets/notenoughupdates/dynamic_54/style2/dynamic_config.json @@ -1,3 +1,3 @@ { - "text-colour": "FF000000" -} \ No newline at end of file + "text-colour": "FF000000" +} diff --git a/src/main/resources/assets/notenoughupdates/dynamic_54/style3/dynamic_config.json b/src/main/resources/assets/notenoughupdates/dynamic_54/style3/dynamic_config.json index 5ae75066..11b64060 100644 --- a/src/main/resources/assets/notenoughupdates/dynamic_54/style3/dynamic_config.json +++ b/src/main/resources/assets/notenoughupdates/dynamic_54/style3/dynamic_config.json @@ -1,3 +1,3 @@ { - "text-colour": "FFC8C8C8" -} \ No newline at end of file + "text-colour": "FFC8C8C8" +} diff --git a/src/main/resources/assets/notenoughupdates/invbuttons/extraicons.json b/src/main/resources/assets/notenoughupdates/invbuttons/extraicons.json index 5a99f3f0..d4e501c4 100644 --- a/src/main/resources/assets/notenoughupdates/invbuttons/extraicons.json +++ b/src/main/resources/assets/notenoughupdates/invbuttons/extraicons.json @@ -1,18 +1,18 @@ { - "baubles ring": "baubles", - "baubles gold ring": "baubles_gold", - "cross x": "cross", - "green check mark": "green_check", - "white check mark": "white_check", - "question mark help": "question", - "settings cog config": "settings", - "accessory ring": "accessory", - "accessory ring gold": "accessory_gold", - "armor chestplate": "armor", - "armor gold chestplate": "armor_gold", - "pet cat": "pet", - "pet cat gold": "pet_gold", - "skyblock menu": "skyblock_menu", - "recipe book": "recipe", - "search glass": "search" -} \ No newline at end of file + "baubles ring": "baubles", + "baubles gold ring": "baubles_gold", + "cross x": "cross", + "green check mark": "green_check", + "white check mark": "white_check", + "question mark help": "question", + "settings cog config": "settings", + "accessory ring": "accessory", + "accessory ring gold": "accessory_gold", + "armor chestplate": "armor", + "armor gold chestplate": "armor_gold", + "pet cat": "pet", + "pet cat gold": "pet_gold", + "skyblock menu": "skyblock_menu", + "recipe book": "recipe", + "search glass": "search" +} diff --git a/src/main/resources/assets/notenoughupdates/invbuttons/presets.json b/src/main/resources/assets/notenoughupdates/invbuttons/presets.json index d3065f30..4de328ae 100644 --- a/src/main/resources/assets/notenoughupdates/invbuttons/presets.json +++ b/src/main/resources/assets/notenoughupdates/invbuttons/presets.json @@ -1,2739 +1,2739 @@ { - "Empty":[ - { - "x":87, - "y":63, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":0, - "command":"", - "icon":"" - }, - { - "x":108, - "y":63, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":0, - "command":"", - "icon":"" - }, - { - "x":129, - "y":63, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":0, - "command":"", - "icon":"" - }, - { - "x":150, - "y":63, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":0, - "command":"", - "icon":"" - }, - { - "x":87, - "y":5, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":0, - "command":"" - }, - { - "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":"" - }, - { - "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":"" - }, - { - "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":"" - }, - { - "x":2, - "y":22, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":false, - "backgroundIndex":0, - "command":"" - }, - { - "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":"" - }, - { - "x":2, - "y":-64, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":true, - "backgroundIndex":0, - "command":"", - "icon":"" - }, - { - "x":2, - "y":-44, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":2, - "y":-24, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "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":"" - }, - { - "x":25, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":46, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":67, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":88, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":109, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":130, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":151, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - } - ], - "Empty (Dark)":[ - { - "x":87, - "y":63, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"", - "icon":"" - }, - { - "x":108, - "y":63, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"", - "icon":"" - }, - { - "x":129, - "y":63, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"", - "icon":"" - }, - { - "x":150, - "y":63, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"", - "icon":"" - }, - { - "x":87, - "y":5, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":108, - "y":5, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":129, - "y":5, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":150, - "y":5, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":87, - "y":25, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":105, - "y":25, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":87, - "y":43, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":105, - "y":43, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":143, - "y":35, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":60, - "y":8, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"", - "icon":"" - }, - { - "x":60, - "y":60, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":26, - "y":8, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":26, - "y":60, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":2, - "y":2, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":2, - "y":22, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":2, - "y":42, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":2, - "y":62, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":2, - "y":-84, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":true, - "backgroundIndex":1, - "command":"" - }, - { - "x":2, - "y":-64, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":true, - "backgroundIndex":1, - "command":"", - "icon":"" - }, - { - "x":2, - "y":-44, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":true, - "backgroundIndex":1, - "command":"" - }, - { - "x":2, - "y":-24, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":true, - "backgroundIndex":1, - "command":"" - }, - { - "x":4, - "y":-19, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":25, - "y":-19, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":46, - "y":-19, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":67, - "y":-19, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":88, - "y":-19, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":109, - "y":-19, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":130, - "y":-19, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":151, - "y":-19, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":-19, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":-19, - "y":22, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":-19, - "y":42, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":-19, - "y":62, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":1, - "command":"" - }, - { - "x":-19, - "y":-84, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":1, - "command":"" - }, - { - "x":-19, - "y":-64, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":1, - "command":"" - }, - { - "x":-19, - "y":-44, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":1, - "command":"" - }, - { - "x":-19, - "y":-24, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":1, - "command":"" - }, - { - "x":4, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":1, - "command":"" - }, - { - "x":25, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":1, - "command":"" - }, - { - "x":46, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":1, - "command":"" - }, - { - "x":67, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":1, - "command":"" - }, - { - "x":88, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":1, - "command":"" - }, - { - "x":109, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":1, - "command":"" - }, - { - "x":130, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":1, - "command":"" - }, - { - "x":151, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":1, - "command":"" - } - ], - "Simple":[ - { - "x":87, - "y":63, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":0, - "command":"/warp home", - "icon":"skull:c9c8881e42915a9d29bb61a16fb26d059913204d265df5b439b3d792acd56" - }, - { - "x":108, - "y":63, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":0, - "command":"/warp hub", - "icon":"skull:d7cc6687423d0570d556ac53e0676cb563bbdd9717cd8269bdebed6f6d4e7bf8" - }, - { - "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":"/pets", - "icon":"extra:pet_gold" - }, - { - "x":87, - "y":5, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":0, - "command":"" - }, - { - "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":"" - }, - { - "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":2, - "command":"/wardrobe", - "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":"" - }, - { - "x":2, - "y":22, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":false, - "backgroundIndex":0, - "command":"" - }, - { - "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":"" - }, - { - "x":2, - "y":-64, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":true, - "backgroundIndex":0, - "command":"", - "icon":"BONE" - }, - { - "x":2, - "y":-44, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":2, - "y":-24, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "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":"" - }, - { - "x":25, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":46, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":67, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":88, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":109, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":130, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":151, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - } - ], - "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": "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":[ - { - "x":87, - "y":63, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":0, - "command":"/sbmenu", - "icon":"SKYBLOCK_MENU" - }, - { - "x":108, - "y":63, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":0, - "command":"enderchest", - "icon":"ENDER_CHEST" - }, - { - "x":129, - "y":63, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":0, - "command":"pets", - "icon":"BONE" - }, - { - "x":150, - "y":63, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":0, - "command":"effects", - "icon":"POTION" - }, - { - "x":87, - "y":5, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":0, - "command":"/recipes", - "icon":"extra:recipe" - }, - { - "x":108, - "y":5, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":0, - "command":"/collections", - "icon":"PAINTING" - }, - { - "x":129, - "y":5, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":0, - "command":"/scg", - "icon":"BOOK" - }, - { - "x":150, - "y":5, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":0, - "command":"/calendar", - "icon":"BOOK_AND_QUILL" - }, - { - "x":87, - "y":25, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":0, - "command":"", - "icon":"CHEST" - }, - { - "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":"craft", - "icon":"WORKBENCH" - }, - { - "x":60, - "y":8, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":2, - "command":"/wardrobe", - "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":"/warp hub", - "icon":"skull:d7cc6687423d0570d556ac53e0676cb563bbdd9717cd8269bdebed6f6d4e7bf8" - }, - { - "x":2, - "y":22, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":false, - "backgroundIndex":0, - "command":"/warp home", - "icon":"skull:c9c8881e42915a9d29bb61a16fb26d059913204d265df5b439b3d792acd56" - }, - { - "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":"", - "icon":"" - }, - { - "x":2, - "y":-64, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":true, - "backgroundIndex":0, - "command":"", - "icon":"BONE" - }, - { - "x":2, - "y":-44, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":2, - "y":-24, - "playerInvOnly":false, - "anchorRight":true, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "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":"/ah", - "icon":"GOLD_BLOCK" - }, - { - "x":-19, - "y":22, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":0, - "command":"/bz", - "icon":"GOLD_BARDING" - }, - { - "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":"" - }, - { - "x":25, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":46, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":67, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":88, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":109, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":130, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - }, - { - "x":151, - "y":2, - "playerInvOnly":false, - "anchorRight":false, - "anchorBottom":true, - "backgroundIndex":0, - "command":"" - } - ], - "Dungeons":[ - { - "x":87, - "y":63, - "playerInvOnly":true, - "anchorRight":false, - "anchorBottom":false, - "backgroundIndex":0, - "command":"", - "icon":"" - }, - { - "x": 108, - "y": 63, - "playerInvOnly": true, - "anchorRight": false, - "anchorBottom": false, - "backgroundIndex": 0, - "command": "warp dungeon_hub", - "icon": "skull:9b56895b9659896ad647f58599238af532d46db9c1b0389b8bbeb70999dab33d" - }, - { - "x": 129, - "y": 63, - "playerInvOnly": true, - "anchorRight": false, - "anchorBottom": false, - "backgroundIndex": 0, - "command": "reparty", - "icon": "COMMAND" - }, - { - "x": 150, - "y": 63, - "playerInvOnly": true, - "anchorRight": false, - "anchorBottom": false, - "backgroundIndex": 0, - "command": "pets", - "icon": "extra:pet_gold" - }, - { - "x": 87, - "y": 5, - "playerInvOnly": true, - "anchorRight": false, - "anchorBottom": false, - "backgroundIndex": 0, - "command": "" - }, - { - "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": "" - }, - { - "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": 2, - "command": "/wardrobe", - "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": "" - }, - { - "x": 2, - "y": 22, - "playerInvOnly": false, - "anchorRight": true, - "anchorBottom": false, - "backgroundIndex": 0, - "command": "" - }, - { - "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": "" - }, - { - "x": 2, - "y": -64, - "playerInvOnly": false, - "anchorRight": true, - "anchorBottom": true, - "backgroundIndex": 0, - "command": "", - "icon": "" - }, - { - "x": 2, - "y": -44, - "playerInvOnly": false, - "anchorRight": true, - "anchorBottom": true, - "backgroundIndex": 0, - "command": "" - }, - { - "x": 2, - "y": -24, - "playerInvOnly": false, - "anchorRight": true, - "anchorBottom": true, - "backgroundIndex": 0, - "command": "" - }, - { - "x": 4, - "y": -19, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": false, - "backgroundIndex": 0, - "command": "joindungeon master_catacombs 1", - "icon": "DIAMOND_BONZO_HEAD" - }, - { - "x": 25, - "y": -19, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": false, - "backgroundIndex": 0, - "command": "joindungeon master_catacombs 2", - "icon": "DIAMOND_SCARF_HEAD" - }, - { - "x": 46, - "y": -19, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": false, - "backgroundIndex": 0, - "command": "joindungeon master_catacombs 3", - "icon": "DIAMOND_PROFESSOR_HEAD" - }, - { - "x": 67, - "y": -19, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": false, - "backgroundIndex": 0, - "command": "joindungeon master_catacombs 4", - "icon": "DIAMOND_THORN_HEAD" - }, - { - "x": 88, - "y": -19, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": false, - "backgroundIndex": 0, - "command": "joindungeon master_catacombs 5", - "icon": "DIAMOND_LIVID_HEAD" - }, - { - "x": 109, - "y": -19, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": false, - "backgroundIndex": 0, - "command": "joindungeon master_catacombs 6", - "icon": "DIAMOND_SADAN_HEAD" - }, - { - "x": 130, - "y": -19, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": false, - "backgroundIndex": 0, - "command": "joindungeon master_catacombs 7", - "icon": "DIAMOND_NECRON_HEAD" - }, - { - "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": "joindungeon catacombs 1", - "icon": "GOLD_BONZO_HEAD" - }, - { - "x": -19, - "y": 22, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": false, - "backgroundIndex": 0, - "command": "joindungeon catacombs 2", - "icon": "GOLD_SCARF_HEAD" - }, - { - "x": -19, - "y": 42, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": false, - "backgroundIndex": 0, - "command": "joindungeon catacombs 3", - "icon": "GOLD_PROFESSOR_HEAD" - }, - { - "x": -19, - "y": 62, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": false, - "backgroundIndex": 0, - "command": "joindungeon catacombs 4", - "icon": "GOLD_THORN_HEAD" - }, - { - "x": -19, - "y": -84, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": true, - "backgroundIndex": 0, - "command": "joindungeon catacombs 5", - "icon": "GOLD_LIVID_HEAD" - }, - { - "x": -19, - "y": -64, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": true, - "backgroundIndex": 0, - "command": "/joindungeon catacombs 6", - "icon": "GOLD_SADAN_HEAD" - }, - { - "x": -19, - "y": -44, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": true, - "backgroundIndex": 0, - "command": "joindungeon catacombs 7", - "icon": "GOLD_NECRON_HEAD" - }, - { - "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": "" - }, - { - "x": 25, - "y": 2, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": true, - "backgroundIndex": 0, - "command": "" - }, - { - "x": 46, - "y": 2, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": true, - "backgroundIndex": 0, - "command": "" - }, - { - "x": 67, - "y": 2, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": true, - "backgroundIndex": 0, - "command": "" - }, - { - "x": 88, - "y": 2, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": true, - "backgroundIndex": 0, - "command": "" - }, - { - "x": 109, - "y": 2, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": true, - "backgroundIndex": 0, - "command": "" - }, - { - "x": 130, - "y": 2, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": true, - "backgroundIndex": 0, - "command": "" - }, - { - "x": 151, - "y": 2, - "playerInvOnly": false, - "anchorRight": false, - "anchorBottom": true, - "backgroundIndex": 0, - "command": "" - } - ] + "Empty": [ + { + "x": 87, + "y": 63, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "", + "icon": "" + }, + { + "x": 108, + "y": 63, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "", + "icon": "" + }, + { + "x": 129, + "y": 63, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "", + "icon": "" + }, + { + "x": 150, + "y": 63, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "", + "icon": "" + }, + { + "x": 87, + "y": 5, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "" + }, + { + "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": "" + }, + { + "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": "" + }, + { + "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": "" + }, + { + "x": 2, + "y": 22, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "" + }, + { + "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": "" + }, + { + "x": 2, + "y": -64, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "", + "icon": "" + }, + { + "x": 2, + "y": -44, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 2, + "y": -24, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "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": "" + }, + { + "x": 25, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 46, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 67, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 88, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 109, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 130, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 151, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + } + ], + "Empty (Dark)": [ + { + "x": 87, + "y": 63, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "", + "icon": "" + }, + { + "x": 108, + "y": 63, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "", + "icon": "" + }, + { + "x": 129, + "y": 63, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "", + "icon": "" + }, + { + "x": 150, + "y": 63, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "", + "icon": "" + }, + { + "x": 87, + "y": 5, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 108, + "y": 5, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 129, + "y": 5, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 150, + "y": 5, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 87, + "y": 25, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 105, + "y": 25, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 87, + "y": 43, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 105, + "y": 43, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 143, + "y": 35, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 60, + "y": 8, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "", + "icon": "" + }, + { + "x": 60, + "y": 60, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 26, + "y": 8, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 26, + "y": 60, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 2, + "y": 2, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 2, + "y": 22, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 2, + "y": 42, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 2, + "y": 62, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 2, + "y": -84, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": true, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 2, + "y": -64, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": true, + "backgroundIndex": 1, + "command": "", + "icon": "" + }, + { + "x": 2, + "y": -44, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": true, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 2, + "y": -24, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": true, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 4, + "y": -19, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 25, + "y": -19, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 46, + "y": -19, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 67, + "y": -19, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 88, + "y": -19, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 109, + "y": -19, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 130, + "y": -19, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 151, + "y": -19, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": -19, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": -19, + "y": 22, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": -19, + "y": 42, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": -19, + "y": 62, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 1, + "command": "" + }, + { + "x": -19, + "y": -84, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 1, + "command": "" + }, + { + "x": -19, + "y": -64, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 1, + "command": "" + }, + { + "x": -19, + "y": -44, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 1, + "command": "" + }, + { + "x": -19, + "y": -24, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 4, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 25, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 46, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 67, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 88, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 109, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 130, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 1, + "command": "" + }, + { + "x": 151, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 1, + "command": "" + } + ], + "Simple": [ + { + "x": 87, + "y": 63, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "/warp home", + "icon": "skull:c9c8881e42915a9d29bb61a16fb26d059913204d265df5b439b3d792acd56" + }, + { + "x": 108, + "y": 63, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "/warp hub", + "icon": "skull:d7cc6687423d0570d556ac53e0676cb563bbdd9717cd8269bdebed6f6d4e7bf8" + }, + { + "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": "/pets", + "icon": "extra:pet_gold" + }, + { + "x": 87, + "y": 5, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "" + }, + { + "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": "" + }, + { + "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": 2, + "command": "/wardrobe", + "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": "" + }, + { + "x": 2, + "y": 22, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "" + }, + { + "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": "" + }, + { + "x": 2, + "y": -64, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "", + "icon": "BONE" + }, + { + "x": 2, + "y": -44, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 2, + "y": -24, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "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": "" + }, + { + "x": 25, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 46, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 67, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 88, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 109, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 130, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 151, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + } + ], + "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": "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": [ + { + "x": 87, + "y": 63, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "/sbmenu", + "icon": "SKYBLOCK_MENU" + }, + { + "x": 108, + "y": 63, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "enderchest", + "icon": "ENDER_CHEST" + }, + { + "x": 129, + "y": 63, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "pets", + "icon": "BONE" + }, + { + "x": 150, + "y": 63, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "effects", + "icon": "POTION" + }, + { + "x": 87, + "y": 5, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "/recipes", + "icon": "extra:recipe" + }, + { + "x": 108, + "y": 5, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "/collections", + "icon": "PAINTING" + }, + { + "x": 129, + "y": 5, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "/scg", + "icon": "BOOK" + }, + { + "x": 150, + "y": 5, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "/calendar", + "icon": "BOOK_AND_QUILL" + }, + { + "x": 87, + "y": 25, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "", + "icon": "CHEST" + }, + { + "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": "craft", + "icon": "WORKBENCH" + }, + { + "x": 60, + "y": 8, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 2, + "command": "/wardrobe", + "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": "/warp hub", + "icon": "skull:d7cc6687423d0570d556ac53e0676cb563bbdd9717cd8269bdebed6f6d4e7bf8" + }, + { + "x": 2, + "y": 22, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "/warp home", + "icon": "skull:c9c8881e42915a9d29bb61a16fb26d059913204d265df5b439b3d792acd56" + }, + { + "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": "", + "icon": "" + }, + { + "x": 2, + "y": -64, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "", + "icon": "BONE" + }, + { + "x": 2, + "y": -44, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 2, + "y": -24, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "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": "/ah", + "icon": "GOLD_BLOCK" + }, + { + "x": -19, + "y": 22, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "/bz", + "icon": "GOLD_BARDING" + }, + { + "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": "" + }, + { + "x": 25, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 46, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 67, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 88, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 109, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 130, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 151, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + } + ], + "Dungeons": [ + { + "x": 87, + "y": 63, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "", + "icon": "" + }, + { + "x": 108, + "y": 63, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "warp dungeon_hub", + "icon": "skull:9b56895b9659896ad647f58599238af532d46db9c1b0389b8bbeb70999dab33d" + }, + { + "x": 129, + "y": 63, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "reparty", + "icon": "COMMAND" + }, + { + "x": 150, + "y": 63, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "pets", + "icon": "extra:pet_gold" + }, + { + "x": 87, + "y": 5, + "playerInvOnly": true, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "" + }, + { + "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": "" + }, + { + "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": 2, + "command": "/wardrobe", + "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": "" + }, + { + "x": 2, + "y": 22, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "" + }, + { + "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": "" + }, + { + "x": 2, + "y": -64, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "", + "icon": "" + }, + { + "x": 2, + "y": -44, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 2, + "y": -24, + "playerInvOnly": false, + "anchorRight": true, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 4, + "y": -19, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "joindungeon master_catacombs 1", + "icon": "DIAMOND_BONZO_HEAD" + }, + { + "x": 25, + "y": -19, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "joindungeon master_catacombs 2", + "icon": "DIAMOND_SCARF_HEAD" + }, + { + "x": 46, + "y": -19, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "joindungeon master_catacombs 3", + "icon": "DIAMOND_PROFESSOR_HEAD" + }, + { + "x": 67, + "y": -19, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "joindungeon master_catacombs 4", + "icon": "DIAMOND_THORN_HEAD" + }, + { + "x": 88, + "y": -19, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "joindungeon master_catacombs 5", + "icon": "DIAMOND_LIVID_HEAD" + }, + { + "x": 109, + "y": -19, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "joindungeon master_catacombs 6", + "icon": "DIAMOND_SADAN_HEAD" + }, + { + "x": 130, + "y": -19, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "joindungeon master_catacombs 7", + "icon": "DIAMOND_NECRON_HEAD" + }, + { + "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": "joindungeon catacombs 1", + "icon": "GOLD_BONZO_HEAD" + }, + { + "x": -19, + "y": 22, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "joindungeon catacombs 2", + "icon": "GOLD_SCARF_HEAD" + }, + { + "x": -19, + "y": 42, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "joindungeon catacombs 3", + "icon": "GOLD_PROFESSOR_HEAD" + }, + { + "x": -19, + "y": 62, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": false, + "backgroundIndex": 0, + "command": "joindungeon catacombs 4", + "icon": "GOLD_THORN_HEAD" + }, + { + "x": -19, + "y": -84, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "joindungeon catacombs 5", + "icon": "GOLD_LIVID_HEAD" + }, + { + "x": -19, + "y": -64, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "/joindungeon catacombs 6", + "icon": "GOLD_SADAN_HEAD" + }, + { + "x": -19, + "y": -44, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "joindungeon catacombs 7", + "icon": "GOLD_NECRON_HEAD" + }, + { + "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": "" + }, + { + "x": 25, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 46, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 67, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 88, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 109, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 130, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + }, + { + "x": 151, + "y": 2, + "playerInvOnly": false, + "anchorRight": false, + "anchorBottom": true, + "backgroundIndex": 0, + "command": "" + } + ] } diff --git a/src/main/resources/assets/notenoughupdates/official-wiki.css b/src/main/resources/assets/notenoughupdates/official-wiki.css index a9f82a32..f942a3f0 100644 --- a/src/main/resources/assets/notenoughupdates/official-wiki.css +++ b/src/main/resources/assets/notenoughupdates/official-wiki.css @@ -1 +1,22622 @@ -.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} +/* + * 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 . + */ + +.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 +} diff --git a/src/main/resources/assets/notenoughupdates/shaders/program/blur.json b/src/main/resources/assets/notenoughupdates/shaders/program/blur.json index 9da3c2e8..01c0578d 100644 --- a/src/main/resources/assets/notenoughupdates/shaders/program/blur.json +++ b/src/main/resources/assets/notenoughupdates/shaders/program/blur.json @@ -1,21 +1,85 @@ { - "blend": { - "func": "add", - "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha" + }, + "vertex": "sobel", + "fragment": "blur2", + "attributes": [ + "Position" + ], + "samplers": [ + { + "name": "DiffuseSampler" + } + ], + "uniforms": [ + { + "name": "ProjMat", + "type": "matrix4x4", + "count": 16, + "values": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ] }, - "vertex": "sobel", - "fragment": "blur2", - "attributes": [ "Position" ], - "samplers": [ - { "name": "DiffuseSampler" } - ], - "uniforms": [ - { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "InSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "BlurDir", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "Radius", "type": "float", "count": 1, "values": [ 5.0 ] }, - { "name": "AlphaMult", "type": "float", "count": 1, "values": [ 1.0 ] } - ] + { + "name": "InSize", + "type": "float", + "count": 2, + "values": [ + 1.0, + 1.0 + ] + }, + { + "name": "OutSize", + "type": "float", + "count": 2, + "values": [ + 1.0, + 1.0 + ] + }, + { + "name": "BlurDir", + "type": "float", + "count": 2, + "values": [ + 1.0, + 1.0 + ] + }, + { + "name": "Radius", + "type": "float", + "count": 1, + "values": [ + 5.0 + ] + }, + { + "name": "AlphaMult", + "type": "float", + "count": 1, + "values": [ + 1.0 + ] + } + ] } diff --git a/src/main/resources/assets/notenoughupdates/shaders/program/dungeonmap.json b/src/main/resources/assets/notenoughupdates/shaders/program/dungeonmap.json index bb41ffd5..a8a3fc79 100644 --- a/src/main/resources/assets/notenoughupdates/shaders/program/dungeonmap.json +++ b/src/main/resources/assets/notenoughupdates/shaders/program/dungeonmap.json @@ -6,14 +6,63 @@ }, "vertex": "dungeonmap", "fragment": "dungeonmap", - "attributes": [ "Position" ], + "attributes": [ + "Position" + ], "samplers": [ - { "name": "DiffuseSampler" } + { + "name": "DiffuseSampler" + } ], "uniforms": [ - { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "InSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, - { "name": "radiusSq", "type": "float", "count": 1, "values": [ 1.0 ] } + { + "name": "ProjMat", + "type": "matrix4x4", + "count": 16, + "values": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ] + }, + { + "name": "OutSize", + "type": "float", + "count": 2, + "values": [ + 1.0, + 1.0 + ] + }, + { + "name": "InSize", + "type": "float", + "count": 2, + "values": [ + 1.0, + 1.0 + ] + }, + { + "name": "radiusSq", + "type": "float", + "count": 1, + "values": [ + 1.0 + ] + } ] } diff --git a/src/main/resources/assets/notenoughupdates/shaders/program/grayscale.json b/src/main/resources/assets/notenoughupdates/shaders/program/grayscale.json index 048ceb9f..2878f3ed 100644 --- a/src/main/resources/assets/notenoughupdates/shaders/program/grayscale.json +++ b/src/main/resources/assets/notenoughupdates/shaders/program/grayscale.json @@ -6,12 +6,46 @@ }, "vertex": "blit", "fragment": "grayscale", - "attributes": [ "Position" ], + "attributes": [ + "Position" + ], "samplers": [ - { "name": "DiffuseSampler" } + { + "name": "DiffuseSampler" + } ], "uniforms": [ - { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] } + { + "name": "ProjMat", + "type": "matrix4x4", + "count": 16, + "values": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ] + }, + { + "name": "OutSize", + "type": "float", + "count": 2, + "values": [ + 1.0, + 1.0 + ] + } ] } diff --git a/src/main/resources/assets/notenoughupdates/shaders/program/setrgbtoalpha.json b/src/main/resources/assets/notenoughupdates/shaders/program/setrgbtoalpha.json index 653764fb..3bd50d8b 100644 --- a/src/main/resources/assets/notenoughupdates/shaders/program/setrgbtoalpha.json +++ b/src/main/resources/assets/notenoughupdates/shaders/program/setrgbtoalpha.json @@ -6,12 +6,46 @@ }, "vertex": "blit", "fragment": "setrgbtoalpha", - "attributes": [ "Position" ], + "attributes": [ + "Position" + ], "samplers": [ - { "name": "DiffuseSampler" } + { + "name": "DiffuseSampler" + } ], "uniforms": [ - { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "OutSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] } + { + "name": "ProjMat", + "type": "matrix4x4", + "count": 16, + "values": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ] + }, + { + "name": "OutSize", + "type": "float", + "count": 2, + "values": [ + 1.0, + 1.0 + ] + } ] } diff --git a/src/main/resources/assets/notenoughupdates/sounds.json b/src/main/resources/assets/notenoughupdates/sounds.json index 6d827876..5a3b5528 100644 --- a/src/main/resources/assets/notenoughupdates/sounds.json +++ b/src/main/resources/assets/notenoughupdates/sounds.json @@ -71,7 +71,6 @@ } ] }, - "titanium.break": { "category": "block", "sounds": [ diff --git a/src/main/resources/assets/notenoughupdates/sounds/gemstoneamberbreak.json b/src/main/resources/assets/notenoughupdates/sounds/gemstoneamberbreak.json index b02ee0c7..e46a3897 100644 --- a/src/main/resources/assets/notenoughupdates/sounds/gemstoneamberbreak.json +++ b/src/main/resources/assets/notenoughupdates/sounds/gemstoneamberbreak.json @@ -1 +1,3 @@ -{ "debouncer": 20 } +{ + "debouncer": 20 +} diff --git a/src/main/resources/assets/notenoughupdates/sounds/gemstoneamethystbreak.json b/src/main/resources/assets/notenoughupdates/sounds/gemstoneamethystbreak.json index b02ee0c7..e46a3897 100644 --- a/src/main/resources/assets/notenoughupdates/sounds/gemstoneamethystbreak.json +++ b/src/main/resources/assets/notenoughupdates/sounds/gemstoneamethystbreak.json @@ -1 +1,3 @@ -{ "debouncer": 20 } +{ + "debouncer": 20 +} diff --git a/src/main/resources/assets/notenoughupdates/sounds/gemstonejadebreak.json b/src/main/resources/assets/notenoughupdates/sounds/gemstonejadebreak.json index b02ee0c7..e46a3897 100644 --- a/src/main/resources/assets/notenoughupdates/sounds/gemstonejadebreak.json +++ b/src/main/resources/assets/notenoughupdates/sounds/gemstonejadebreak.json @@ -1 +1,3 @@ -{ "debouncer": 20 } +{ + "debouncer": 20 +} diff --git a/src/main/resources/assets/notenoughupdates/sounds/gemstonejasperbreak.json b/src/main/resources/assets/notenoughupdates/sounds/gemstonejasperbreak.json index b02ee0c7..e46a3897 100644 --- a/src/main/resources/assets/notenoughupdates/sounds/gemstonejasperbreak.json +++ b/src/main/resources/assets/notenoughupdates/sounds/gemstonejasperbreak.json @@ -1 +1,3 @@ -{ "debouncer": 20 } +{ + "debouncer": 20 +} diff --git a/src/main/resources/assets/notenoughupdates/sounds/gemstonerubybreak.json b/src/main/resources/assets/notenoughupdates/sounds/gemstonerubybreak.json index b02ee0c7..e46a3897 100644 --- a/src/main/resources/assets/notenoughupdates/sounds/gemstonerubybreak.json +++ b/src/main/resources/assets/notenoughupdates/sounds/gemstonerubybreak.json @@ -1 +1,3 @@ -{ "debouncer": 20 } +{ + "debouncer": 20 +} diff --git a/src/main/resources/assets/notenoughupdates/sounds/gemstonesapphirebreak.json b/src/main/resources/assets/notenoughupdates/sounds/gemstonesapphirebreak.json index b02ee0c7..e46a3897 100644 --- a/src/main/resources/assets/notenoughupdates/sounds/gemstonesapphirebreak.json +++ b/src/main/resources/assets/notenoughupdates/sounds/gemstonesapphirebreak.json @@ -1 +1,3 @@ -{ "debouncer": 20 } +{ + "debouncer": 20 +} diff --git a/src/main/resources/assets/notenoughupdates/sounds/gemstonetopazbreak.json b/src/main/resources/assets/notenoughupdates/sounds/gemstonetopazbreak.json index b02ee0c7..e46a3897 100644 --- a/src/main/resources/assets/notenoughupdates/sounds/gemstonetopazbreak.json +++ b/src/main/resources/assets/notenoughupdates/sounds/gemstonetopazbreak.json @@ -1 +1,3 @@ -{ "debouncer": 20 } +{ + "debouncer": 20 +} diff --git a/src/main/resources/assets/notenoughupdates/sounds/mithrilbreak.json b/src/main/resources/assets/notenoughupdates/sounds/mithrilbreak.json index b02ee0c7..e46a3897 100644 --- a/src/main/resources/assets/notenoughupdates/sounds/mithrilbreak.json +++ b/src/main/resources/assets/notenoughupdates/sounds/mithrilbreak.json @@ -1 +1,3 @@ -{ "debouncer": 20 } +{ + "debouncer": 20 +} diff --git a/src/main/resources/assets/notenoughupdates/sounds/titaniumbreak.json b/src/main/resources/assets/notenoughupdates/sounds/titaniumbreak.json index b02ee0c7..e46a3897 100644 --- a/src/main/resources/assets/notenoughupdates/sounds/titaniumbreak.json +++ b/src/main/resources/assets/notenoughupdates/sounds/titaniumbreak.json @@ -1 +1,3 @@ -{ "debouncer": 20 } +{ + "debouncer": 20 +} diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index d20efafe..70f63a48 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -1,16 +1,18 @@ [ -{ - "modid": "notenoughupdates", - "name": "NotEnoughUpdates", - "description": "Mod that shows recipes and useful info for Hypixel's Skyblock gamemode.", - "version": "${version}", - "mcversion": "${mcversion}", - "url": "https://github.com/Moulberry/NotEnoughUpdates/", - "updateUrl": "https://github.com/Moulberry/NotEnoughUpdates/releases", - "authorList": ["Moulberry"], - "credits": "", - "logoFile": "", - "screenshots": [], - "dependencies": [] -} + { + "modid": "notenoughupdates", + "name": "NotEnoughUpdates", + "description": "Mod that shows recipes and useful info for Hypixel's Skyblock gamemode.", + "version": "${version}", + "mcversion": "${mcversion}", + "url": "https://github.com/NotEnoughUpdates/NotEnoughUpdates/", + "updateUrl": "https://github.com/NotEnoughUpdates/NotEnoughUpdates/releases", + "authorList": [ + "Moulberry" + ], + "credits": "", + "logoFile": "", + "screenshots": [], + "dependencies": [] + } ] diff --git a/src/main/resources/mixins.notenoughupdates.json b/src/main/resources/mixins.notenoughupdates.json index ab2c705e..63b8211b 100644 --- a/src/main/resources/mixins.notenoughupdates.json +++ b/src/main/resources/mixins.notenoughupdates.json @@ -4,51 +4,47 @@ "minVersion": "0.7", "compatibilityLevel": "JAVA_8", "mixins": [ - "AccessorEntityAgeable", - "AccessorEntityArmorStand", - "AccessorGuiPlayerTabOverlay", - "MixinAbstractClientPlayer", - "MixinContainer", - "MixinEffectRenderer", - "MixinEntity", - "MixinEntityAgeable", - "MixinEntityHorse", - "MixinEntityPlayer", - "MixinEntityPlayerSP", - "MixinEntityRenderer", - "MixinEntitySkeleton", - "MixinGuiChest", - "MixinGuiContainer", - "MixinGuiIngame", - "MixinGuiInventory", - "MixinGuiScreen", - "MixinInventoryEffectRenderer", - "MixinInventoryPlayer", - "MixinItemCameraTransforms", - "MixinItemRenderer", - "MixinItemStack", - "MixinLayerArmorBase", - "MixinLayerCustomHead", - "MixinMinecraft", - "MixinMouseHelper", - "MixinNetHandlerPlayClient", - "MixinPlayerControllerMP", - "MixinRender", - "MixinRendererLivingEntity", - "MixinRenderFish", - "MixinRenderGlobal", - "MixinRenderItem", - "MixinRenderList", - "MixinTextureManager", - "MixinTileEntitySkullRenderer", - "MixinTileEntitySpecialRenderer", - "MixinVboRenderList", - "MixinWorld", - "MixinWorldClient" + "AccessorEntityAgeable", + "AccessorEntityArmorStand", + "AccessorGuiPlayerTabOverlay", + "MixinAbstractClientPlayer", + "MixinContainer", + "MixinEffectRenderer", + "MixinEntity", + "MixinEntityAgeable", + "MixinEntityHorse", + "MixinEntityPlayer", + "MixinEntityPlayerSP", + "MixinEntityRenderer", + "MixinEntitySkeleton", + "MixinGuiChest", + "MixinGuiContainer", + "MixinGuiIngame", + "MixinGuiInventory", + "MixinGuiScreen", + "MixinInventoryEffectRenderer", + "MixinInventoryPlayer", + "MixinItemCameraTransforms", + "MixinItemRenderer", + "MixinItemStack", + "MixinLayerArmorBase", + "MixinLayerCustomHead", + "MixinMinecraft", + "MixinMouseHelper", + "MixinNetHandlerPlayClient", + "MixinPlayerControllerMP", + "MixinRender", + "MixinRendererLivingEntity", + "MixinRenderFish", + "MixinRenderGlobal", + "MixinRenderItem", + "MixinRenderList", + "MixinTextureManager", + "MixinTileEntitySkullRenderer", + "MixinTileEntitySpecialRenderer", + "MixinVboRenderList", + "MixinWorld", + "MixinWorldClient" ], - "client": [ - "AccessorGuiContainer", - "AccessorGuiEditSign", - "AccessorMinecraft" - ] + "client": ["AccessorGuiContainer", "AccessorGuiEditSign", "AccessorMinecraft"] } diff --git a/src/test/java/io/github/moulberry/notenoughupdates/core/util/Vec3ComparableTest.java b/src/test/java/io/github/moulberry/notenoughupdates/core/util/Vec3ComparableTest.java index c0b451e3..12645152 100644 --- a/src/test/java/io/github/moulberry/notenoughupdates/core/util/Vec3ComparableTest.java +++ b/src/test/java/io/github/moulberry/notenoughupdates/core/util/Vec3ComparableTest.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; diff --git a/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolverTest.java b/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolverTest.java index 58233410..123f5bf3 100644 --- a/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolverTest.java +++ b/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolverTest.java @@ -1,12 +1,31 @@ +/* + * 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.core.util.Vec3Comparable; import io.github.moulberry.notenoughupdates.miscfeatures.CrystalMetalDetectorSolver.SolutionState; import io.github.moulberry.notenoughupdates.util.NEUDebugLogger; import net.minecraft.util.BlockPos; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.Assertions; import java.util.ArrayList; @@ -17,10 +36,12 @@ class CrystalMetalDetectorSolverTest { SolutionState expectedState; boolean centerKnown; - public Location(double distance, - Vec3Comparable playerPosition, - SolutionState expectedState, - boolean centerKnown) { + public Location( + double distance, + Vec3Comparable playerPosition, + SolutionState expectedState, + boolean centerKnown + ) { this.distance = distance; this.playerPosition = playerPosition; this.expectedState = expectedState; @@ -38,7 +59,7 @@ class CrystalMetalDetectorSolverTest { void setUp() { CrystalMetalDetectorSolver.initWorld(); CrystalMetalDetectorSolver.treasureAllowedPredicate = blockPos -> true; - NEUDebugLogger.logMethod = CrystalMetalDetectorSolverTest::neuDebugLog; + NEUDebugLogger.logMethod = CrystalMetalDetectorSolverTest::neuDebugLog; NEUDebugLogger.allFlagsEnabled = true; } @@ -59,9 +80,11 @@ class CrystalMetalDetectorSolverTest { } else { findPossibleSolutionsTwice(loc, false); } - Assertions.assertEquals(loc.expectedState, + Assertions.assertEquals( + loc.expectedState, CrystalMetalDetectorSolver.currentState, - "Location index " + index); + "Location index " + index + ); index++; } @@ -70,30 +93,38 @@ class CrystalMetalDetectorSolverTest { @Test void findPossibleSolutions_single_location_sample_is_ignored() { - Location location = new Location(37.3, + Location location = new Location( + 37.3, new Vec3Comparable(779.1057116115207, 70.5, 502.2997937667801), SolutionState.MULTIPLE, - false); + false + ); CrystalMetalDetectorSolver.findPossibleSolutions(location.distance, location.playerPosition, false); Assertions.assertEquals(SolutionState.NOT_STARTED, CrystalMetalDetectorSolver.previousState, - "Previous state"); + "Previous state" + ); Assertions.assertEquals(SolutionState.NOT_STARTED, CrystalMetalDetectorSolver.currentState, - "Current state"); + "Current state" + ); } @Test void findPossibleSolutions_currentState_becomes_previousState() { - Location location = new Location(37.3, + Location location = new Location( + 37.3, new Vec3Comparable(779.1057116115207, 70.5, 502.2997937667801), SolutionState.MULTIPLE, - false); + false + ); findPossibleSolutionsTwice(location, false); Assertions.assertEquals(SolutionState.NOT_STARTED, CrystalMetalDetectorSolver.previousState, - "Previous state"); + "Previous state" + ); Assertions.assertEquals(location.expectedState, CrystalMetalDetectorSolver.currentState, - "Current state"); + "Current state" + ); } @Test @@ -101,15 +132,19 @@ class CrystalMetalDetectorSolverTest { Solution solution = new Solution(); solution.center = new BlockPos(736, 88, 547); solution.expectedSolution = new BlockPos(722, 67, 590); - solution.locations.add(new Location(67.5, + solution.locations.add(new Location( + 67.5, new Vec3Comparable(757.8235166144441, 68.0, 532.8037800566217), SolutionState.FOUND_KNOWN, - true)); + true + )); // slightly different player position with invalid distance - solution.locations.add(new Location(4.0, + solution.locations.add(new Location( + 4.0, new Vec3Comparable(757.8235166144441, 69.0, 532.8037800566217), SolutionState.INVALID, - true)); + true + )); checkSolution(solution); } @@ -117,14 +152,18 @@ class CrystalMetalDetectorSolverTest { void findPossibleSolutions_state_is_failed_when_second_location_eliminates_all_blocks() { Solution solution = new Solution(); solution.center = new BlockPos(736, 88, 547); - solution.locations.add(new Location(29.4, + solution.locations.add(new Location( + 29.4, new Vec3Comparable(721.5979761606153, 68.0, 590.9056839507032), SolutionState.MULTIPLE_KNOWN, - true)); - solution.locations.add(new Location(4.0, // actual distance should be 38.2 + true + )); + solution.locations.add(new Location( + 4.0, // actual distance should be 38.2 new Vec3Comparable(711.858759313838, 67.0, 590.3583935310772), SolutionState.FAILED, - true)); + true + )); checkSolution(solution); } @@ -132,10 +171,12 @@ class CrystalMetalDetectorSolverTest { void findPossibleSolutions_state_is_found_known_when_center_found_after_location() { Solution solution = new Solution(); solution.center = new BlockPos(736, 88, 547); - solution.locations.add(new Location(67.5, + solution.locations.add(new Location( + 67.5, new Vec3Comparable(757.8235166144441, 68.0, 532.8037800566217), SolutionState.MULTIPLE, - false)); + false + )); checkSolution(solution); solution.locations.get(0).centerKnown = true; @@ -149,24 +190,30 @@ class CrystalMetalDetectorSolverTest { Solution solution = new Solution(); solution.center = new BlockPos(736, 88, 547); solution.expectedSolution = new BlockPos(722, 67, 590); - solution.locations.add(new Location(67.5, + solution.locations.add(new Location( + 67.5, new Vec3Comparable(757.8235166144441, 68.0, 532.8037800566217), SolutionState.FOUND_KNOWN, - true)); + true + )); checkSolution(solution); } @Test void findPossibleSolutions_states_are_correct_using_multiple_locations_with_unknown_center() { Solution solution = new Solution(); - solution.locations.add(new Location(37.3, + solution.locations.add(new Location( + 37.3, new Vec3Comparable(779.1057116115207, 70.5, 502.2997937667801), SolutionState.MULTIPLE, - false)); - solution.locations.add(new Location(34.8, + false + )); + solution.locations.add(new Location( + 34.8, new Vec3Comparable(782.6999999880791, 71.0, 508.69999998807907), SolutionState.FOUND, - false)); + false + )); solution.expectedSolution = new BlockPos(758, 67, 533); checkSolution(solution); @@ -177,14 +224,18 @@ class CrystalMetalDetectorSolverTest { Solution solution = new Solution(); // First, validate that the solution doesn't work without the center - solution.locations.add(new Location(29.4, + solution.locations.add(new Location( + 29.4, new Vec3Comparable(721.5979761606153, 68.0, 590.9056839507032), SolutionState.MULTIPLE, - false)); - solution.locations.add(new Location(38.2, + false + )); + solution.locations.add(new Location( + 38.2, new Vec3Comparable(711.858759313838, 67.0, 590.3583935310772), SolutionState.MULTIPLE, - false)); + false + )); checkSolution(solution); // Now validate that the solution works with the center diff --git a/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolverTest.java b/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolverTest.java index dff8749c..5cf5fa90 100644 --- a/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolverTest.java +++ b/src/test/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalWishingCompassSolverTest.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.core.util.Vec3Comparable; @@ -17,7 +36,10 @@ import java.util.Arrays; import java.util.Collections; import java.util.EnumSet; -import static io.github.moulberry.notenoughupdates.miscfeatures.CrystalWishingCompassSolver.*; +import static io.github.moulberry.notenoughupdates.miscfeatures.CrystalWishingCompassSolver.ALL_PARTICLES_MAX_MILLIS; +import static io.github.moulberry.notenoughupdates.miscfeatures.CrystalWishingCompassSolver.Crystal; +import static io.github.moulberry.notenoughupdates.miscfeatures.CrystalWishingCompassSolver.HollowsZone; +import static io.github.moulberry.notenoughupdates.miscfeatures.CrystalWishingCompassSolver.getInstance; class CrystalWishingCompassSolverTest { private static final CrystalWishingCompassSolver solver = getInstance(); @@ -51,7 +73,8 @@ class CrystalWishingCompassSolverTest { new ParticleSpawn(new Vec3Comparable(754.333618, 138.527710, 239.197800), 55) )), HandleCompassResult.SUCCESS, - SolverState.NEED_SECOND_COMPASS); + SolverState.NEED_SECOND_COMPASS + ); private final CompassUse minesOfDivanCompassUse2 = new CompassUse( DELAY_AFTER_FIRST_COMPASS_LAST_PARTICLE, @@ -80,7 +103,8 @@ class CrystalWishingCompassSolverTest { new ParticleSpawn(new Vec3Comparable(759.636658, 135.522827, 266.186371), 0) )), HandleCompassResult.SUCCESS, - SolverState.SOLVED); + SolverState.SOLVED + ); Vec3i minesOfDivanSolution = new Vec3i(735, 98, 451); @@ -110,7 +134,8 @@ class CrystalWishingCompassSolverTest { new ParticleSpawn(new Vec3Comparable(454.183441, 88.616600, 775.803040), 54) )), HandleCompassResult.SUCCESS, - SolverState.NEED_SECOND_COMPASS); + SolverState.NEED_SECOND_COMPASS + ); private final CompassUse goblinHoldoutCompassUse2 = new CompassUse( DELAY_AFTER_FIRST_COMPASS_LAST_PARTICLE, @@ -139,7 +164,8 @@ class CrystalWishingCompassSolverTest { new ParticleSpawn(new Vec3Comparable(439.108551, 86.620811, 776.031067), 0) )), HandleCompassResult.SUCCESS, - SolverState.SOLVED); + SolverState.SOLVED + ); Vec3i goblinHoldoutKingSolution = new Vec3i(377, 87, 550); Vec3i goblinHoldoutQueenSolution = new Vec3i(322, 139, 769); @@ -171,7 +197,8 @@ class CrystalWishingCompassSolverTest { new ParticleSpawn(new Vec3Comparable(570.372192, 121.631874, 565.694946), 0) )), HandleCompassResult.SUCCESS, - SolverState.NEED_SECOND_COMPASS); + SolverState.NEED_SECOND_COMPASS + ); private final CompassUse precursorCityCompassUse2 = new CompassUse( DELAY_AFTER_FIRST_COMPASS_LAST_PARTICLE, @@ -200,7 +227,8 @@ class CrystalWishingCompassSolverTest { new ParticleSpawn(new Vec3Comparable(590.766357, 137.556885, 579.791565), 0) )), HandleCompassResult.SUCCESS, - SolverState.SOLVED); + SolverState.SOLVED + ); Vec3i precursorCitySolution = new Vec3i(604, 124, 681); @@ -231,7 +259,8 @@ class CrystalWishingCompassSolverTest { new ParticleSpawn(new Vec3Comparable(453.975647, 122.920158, 458.668488), 0) )), HandleCompassResult.SUCCESS, - SolverState.NEED_SECOND_COMPASS); + SolverState.NEED_SECOND_COMPASS + ); private final CompassUse jungleCompassUse2 = new CompassUse( DELAY_AFTER_FIRST_COMPASS_LAST_PARTICLE, @@ -260,13 +289,15 @@ class CrystalWishingCompassSolverTest { new ParticleSpawn(new Vec3Comparable(437.732666, 127.385803, 467.381592), 1) )), HandleCompassResult.SUCCESS, - SolverState.SOLVED); + SolverState.SOLVED + ); Vec3i jungleSolution = new Vec3i(343, 72, 424); Vec3i jungleSolutionTempleDoor = new Vec3i( jungleSolution.getX() - 57, jungleSolution.getY() + 36, - jungleSolution.getZ() -21); + jungleSolution.getZ() - 21 + ); private final CompassUse magmaCompassUse1 = new CompassUse( 1647745029814L, @@ -295,7 +326,8 @@ class CrystalWishingCompassSolverTest { new ParticleSpawn(new Vec3Comparable(462.221954, 59.614719, 550.019165), 0) )), HandleCompassResult.SUCCESS, - SolverState.NEED_SECOND_COMPASS); + SolverState.NEED_SECOND_COMPASS + ); private final CompassUse magmaCompassUse2 = new CompassUse( DELAY_AFTER_FIRST_COMPASS_LAST_PARTICLE, @@ -323,7 +355,8 @@ class CrystalWishingCompassSolverTest { new ParticleSpawn(new Vec3Comparable(449.110443, 54.623035, 556.079163), 49) )), HandleCompassResult.SUCCESS, - SolverState.SOLVED); + SolverState.SOLVED + ); Vec3i magmaSolution = new Vec3i(737, 56, 444); @@ -336,7 +369,8 @@ class CrystalWishingCompassSolverTest { new BlockPos(512, 106, 512), null, HandleCompassResult.PLAYER_IN_NUCLEUS, - SolverState.NOT_STARTED); + SolverState.NOT_STARTED + ); private void resetSolverState() { solver.initWorld(); @@ -351,7 +385,7 @@ class CrystalWishingCompassSolverTest { @BeforeEach void setUp() { - NEUDebugLogger.logMethod = CrystalWishingCompassSolverTest::neuDebugLog; + NEUDebugLogger.logMethod = CrystalWishingCompassSolverTest::neuDebugLog; NEUDebugLogger.allFlagsEnabled = true; resetSolverState(); } @@ -361,9 +395,11 @@ class CrystalWishingCompassSolverTest { for (CompassUse compassUse : solution.compassUses) { systemTimeMillis += compassUse.timeIncrementMillis; HandleCompassResult handleCompassResult = solver.handleCompassUse(compassUse.playerPos); - Assertions.assertEquals(compassUse.expectedHandleCompassUseResult, + Assertions.assertEquals( + compassUse.expectedHandleCompassUseResult, handleCompassResult, - "CompassUse index " + index); + "CompassUse index " + index + ); for (ParticleSpawn particle : compassUse.particles) { systemTimeMillis += particle.timeIncrementMillis; @@ -371,15 +407,20 @@ class CrystalWishingCompassSolverTest { particle.spawnLocation.xCoord, particle.spawnLocation.yCoord, particle.spawnLocation.zCoord, - systemTimeMillis); + systemTimeMillis + ); } - Assertions.assertEquals(compassUse.expectedSolverState, + Assertions.assertEquals( + compassUse.expectedSolverState, solver.getSolverState(), - "CompassUse index " + index); + "CompassUse index " + index + ); if (compassUse.expectedSolverState == SolverState.SOLVED) { - Assertions.assertEquals(solution.expectedSolutionCoords, - solver.getSolutionCoords()); + Assertions.assertEquals( + solution.expectedSolutionCoords, + solver.getSolutionCoords() + ); } index++; @@ -395,7 +436,8 @@ class CrystalWishingCompassSolverTest { Solution solution = new Solution( new ArrayList<>(Collections.singletonList(compassUse)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); // Act & Assert checkSolution(solution); @@ -409,7 +451,8 @@ class CrystalWishingCompassSolverTest { processingFirstUseCompassUse.expectedSolverState = SolverState.PROCESSING_FIRST_USE; Solution processingFirstUseSolution = new Solution( new ArrayList<>(Collections.singletonList(processingFirstUseCompassUse)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); checkSolution(processingFirstUseSolution); Assertions.assertEquals(SolverState.PROCESSING_FIRST_USE, solver.getSolverState()); @@ -419,7 +462,8 @@ class CrystalWishingCompassSolverTest { resetStateCompassUse.expectedSolverState = SolverState.FAILED_TIMEOUT_NO_REPEATING; Solution goodSolution = new Solution( new ArrayList<>(Collections.singletonList(resetStateCompassUse)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); // Act & Assert checkSolution(goodSolution); @@ -430,7 +474,8 @@ class CrystalWishingCompassSolverTest { // Arrange Solution solution = new Solution( new ArrayList<>(Collections.singletonList(minesOfDivanCompassUse1)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); // Act & Assert checkSolution(solution); @@ -441,7 +486,8 @@ class CrystalWishingCompassSolverTest { // Arrange Solution solution = new Solution( new ArrayList<>(Collections.singletonList(nucleusCompass)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); // Act & Assert checkSolution(solution); @@ -457,7 +503,8 @@ class CrystalWishingCompassSolverTest { new ParticleSpawn(new Vec3Comparable(754.358459, 138.536407, 239.200928), 137) )), HandleCompassResult.SUCCESS, - SolverState.PROCESSING_FIRST_USE); + SolverState.PROCESSING_FIRST_USE + ); // STILL_PROCESSING_FIRST_USE is expected instead of LOCATION_TOO_CLOSE since the solver // isn't ready for the second compass use, which includes the location check @@ -467,7 +514,8 @@ class CrystalWishingCompassSolverTest { Solution solution = new Solution( new ArrayList<>(Arrays.asList(compassUse1, compassUse2)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); // Act & Assert checkSolution(solution); @@ -477,13 +525,14 @@ class CrystalWishingCompassSolverTest { void missing_repeating_particles_sets_state_to_failed_timeout_no_repeating() { // Arrange CompassUse compassUse = new CompassUse(minesOfDivanCompassUse1); - compassUse.particles.remove(compassUse.particles.size()-1); - compassUse.particles.get(compassUse.particles.size()-1).timeIncrementMillis += ALL_PARTICLES_MAX_MILLIS; + compassUse.particles.remove(compassUse.particles.size() - 1); + compassUse.particles.get(compassUse.particles.size() - 1).timeIncrementMillis += ALL_PARTICLES_MAX_MILLIS; compassUse.expectedSolverState = SolverState.FAILED_TIMEOUT_NO_REPEATING; Solution solution = new Solution( new ArrayList<>(Collections.singletonList(compassUse)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); // Act & Assert checkSolution(solution); @@ -498,11 +547,12 @@ class CrystalWishingCompassSolverTest { null, HandleCompassResult.LOCATION_TOO_CLOSE, SolverState.NEED_SECOND_COMPASS - ); + ); Solution solution = new Solution( new ArrayList<>(Arrays.asList(minesOfDivanCompassUse1, secondCompassUse)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); // Act & Assert checkSolution(solution); @@ -557,7 +607,7 @@ class CrystalWishingCompassSolverTest { // reverse the direction of the particles, moving the repeat particle // to "new" end - compassUse2.particles.remove(compassUse2.particles.size()-1); + compassUse2.particles.remove(compassUse2.particles.size() - 1); Collections.reverse(compassUse2.particles); // add a new repeat particle compassUse2.particles.add(new ParticleSpawn(compassUse2.particles.get(0))); @@ -567,7 +617,8 @@ class CrystalWishingCompassSolverTest { compassUse2.expectedSolverState = SolverState.FAILED_INVALID_SOLUTION; Solution solution = new Solution( new ArrayList<>(Arrays.asList(minesOfDivanCompassUse1, compassUse2)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); // Act & Assert checkSolution(solution); @@ -584,7 +635,7 @@ class CrystalWishingCompassSolverTest { // Arrange CompassUse compassUse1 = new CompassUse(minesOfDivanCompassUse1); CompassUse compassUse2 = new CompassUse(minesOfDivanCompassUse2); - double invalidYOffset = -(minesOfDivanSolution.getY() - (CH_LOWEST_VALID_Y -1)); + double invalidYOffset = -(minesOfDivanSolution.getY() - (CH_LOWEST_VALID_Y - 1)); Vec3 offset = new Vec3(0.0, invalidYOffset, 0.0); compassUse1.playerPos = compassUse1.playerPos.add(offset.xCoord, offset.yCoord, offset.zCoord); @@ -600,7 +651,8 @@ class CrystalWishingCompassSolverTest { Solution solution = new Solution( new ArrayList<>(Arrays.asList(compassUse1, compassUse2)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); // Act & Assert checkSolution(solution); @@ -646,7 +698,8 @@ class CrystalWishingCompassSolverTest { compassUse.particles.get(2).spawnLocation.addVector(100.0, 100.0, 100.0); Solution solution = new Solution( new ArrayList<>(Collections.singletonList(minesOfDivanCompassUse1)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); // Act & Assert checkSolution(solution); @@ -657,7 +710,8 @@ class CrystalWishingCompassSolverTest { // Arrange Solution solution = new Solution( new ArrayList<>(Collections.singletonList(goblinHoldoutCompassUse1)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); solver.kingsScentPresent = () -> true; // Act @@ -674,7 +728,8 @@ class CrystalWishingCompassSolverTest { // Arrange Solution solution = new Solution( new ArrayList<>(Collections.singletonList(goblinHoldoutCompassUse1)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); solver.kingsScentPresent = () -> false; // Act @@ -691,7 +746,8 @@ class CrystalWishingCompassSolverTest { // Arrange Solution solution = new Solution( new ArrayList<>(Collections.singletonList(jungleCompassUse1)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); solver.keyInInventory = () -> true; // Act @@ -708,7 +764,8 @@ class CrystalWishingCompassSolverTest { // Arrange Solution solution = new Solution( new ArrayList<>(Collections.singletonList(jungleCompassUse1)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); solver.keyInInventory = () -> false; // Act @@ -725,7 +782,8 @@ class CrystalWishingCompassSolverTest { // Arrange Solution solution = new Solution( new ArrayList<>(Collections.singletonList(precursorCityCompassUse1)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); solver.foundCrystals = () -> EnumSet.noneOf(Crystal.class); solver.keyInInventory = () -> false; solver.kingsScentPresent = () -> false; @@ -747,14 +805,16 @@ class CrystalWishingCompassSolverTest { } private void CheckExcludedTargetsForCrystals( - CompassUse compassUseToExecute, - ArrayList excludedTargets, - EnumSet foundCrystals) { + CompassUse compassUseToExecute, + ArrayList excludedTargets, + EnumSet foundCrystals + ) { // Arrange EnumSet targets; Solution solution = new Solution( new ArrayList<>(Collections.singletonList(compassUseToExecute)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); // Act checkSolution(solution); @@ -796,7 +856,8 @@ class CrystalWishingCompassSolverTest { // Arrange ArrayList excludedTargets = new ArrayList<>(Arrays.asList( CompassTarget.ODAWA, - CompassTarget.JUNGLE_TEMPLE)); + CompassTarget.JUNGLE_TEMPLE + )); // Act & Assert CheckExcludedTargetsForCrystals(jungleCompassUse1, excludedTargets, EnumSet.of(Crystal.AMETHYST)); @@ -837,7 +898,8 @@ class CrystalWishingCompassSolverTest { // Arrange Solution solution = new Solution( new ArrayList<>(Collections.singletonList(minesOfDivanCompassUse1)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); // Act checkSolution(solution); @@ -855,12 +917,13 @@ class CrystalWishingCompassSolverTest { // Arrange Solution solution = new Solution( new ArrayList<>(Collections.singletonList(minesOfDivanCompassUse1)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); // Act checkSolution(solution); systemTimeMillis += minesOfDivanCompassUse2.timeIncrementMillis; - BlockPos newLocation = minesOfDivanCompassUse2.playerPos.add(-400, 0 ,0); + BlockPos newLocation = minesOfDivanCompassUse2.playerPos.add(-400, 0, 0); HandleCompassResult handleCompassResult = solver.handleCompassUse(newLocation); // Assert @@ -873,7 +936,8 @@ class CrystalWishingCompassSolverTest { // Arrange Solution solution = new Solution( new ArrayList<>(Collections.singletonList(jungleCompassUse1)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); // Act solver.keyInInventory = () -> false; @@ -892,7 +956,8 @@ class CrystalWishingCompassSolverTest { // Arrange Solution solution = new Solution( new ArrayList<>(Collections.singletonList(goblinHoldoutCompassUse1)), - Vec3i.NULL_VECTOR); + Vec3i.NULL_VECTOR + ); // Act solver.kingsScentPresent = () -> false; @@ -980,17 +1045,19 @@ class CrystalWishingCompassSolverTest { } EnumSet GetSolutionTargetsHelper( - HollowsZone compassUsedZone, - EnumSet foundCrystals, - EnumSet possibleTargets, - Vec3Comparable solutionCoords, - int expectedSolutionCount) { + HollowsZone compassUsedZone, + EnumSet foundCrystals, + EnumSet possibleTargets, + Vec3Comparable solutionCoords, + int expectedSolutionCount + ) { EnumSet solutionTargets = CrystalWishingCompassSolver.getSolutionTargets( compassUsedZone, foundCrystals, possibleTargets, - solutionCoords); + solutionCoords + ); Assertions.assertEquals(expectedSolutionCount, solutionTargets.size()); return solutionTargets; } @@ -1003,7 +1070,8 @@ class CrystalWishingCompassSolverTest { EnumSet.noneOf(Crystal.class), EnumSet.allOf(CompassTarget.class), new Vec3Comparable(minesOfDivanSolution), - 1); + 1 + ); // Assert Assertions.assertFalse(solutionTargets.contains(CompassTarget.CRYSTAL_NUCLEUS)); @@ -1021,7 +1089,8 @@ class CrystalWishingCompassSolverTest { EnumSet.of(Crystal.AMBER), possibleTargets, new Vec3Comparable(202, 72, 513), // upper left of Goblin Holdout - 2); + 2 + ); // Assert Assertions.assertTrue(solutionTargets.contains(CompassTarget.JUNGLE_TEMPLE)); @@ -1036,7 +1105,8 @@ class CrystalWishingCompassSolverTest { EnumSet.noneOf(Crystal.class), EnumSet.allOf(CompassTarget.class), kingOdawaMinesOrNucleusCoordsInRemnants, - 3); + 3 + ); // Assert Assertions.assertTrue(solutionTargets.contains(CompassTarget.GOBLIN_KING)); @@ -1057,7 +1127,8 @@ class CrystalWishingCompassSolverTest { EnumSet.noneOf(Crystal.class), possibleTargets, queenKingOdawaOrCityNucleusCoordsInMithrilDeposits, - 2); + 2 + ); // Assert Assertions.assertTrue(solutionTargets.contains(CompassTarget.GOBLIN_QUEEN)); @@ -1067,7 +1138,7 @@ class CrystalWishingCompassSolverTest { @Test void solutionPossibleTargets_excludes_jungle_temple_from_other_zone_when_not_overlapping() { // Arrange - Vec3Comparable notOverlapping = new Vec3Comparable(202, 72, 513+110); // upper left of Goblin Holdout + Vec3Comparable notOverlapping = new Vec3Comparable(202, 72, 513 + 110); // upper left of Goblin Holdout EnumSet possibleTargets = EnumSet.allOf(CompassTarget.class); possibleTargets.remove(CompassTarget.ODAWA); @@ -1077,7 +1148,8 @@ class CrystalWishingCompassSolverTest { EnumSet.of(Crystal.AMBER), possibleTargets, notOverlapping, - 1); + 1 + ); // Assert Assertions.assertTrue(solutionTargets.contains(CompassTarget.BAL)); @@ -1094,7 +1166,8 @@ class CrystalWishingCompassSolverTest { EnumSet.noneOf(Crystal.class), EnumSet.allOf(CompassTarget.class), notOverlapping, - 0); + 0 + ); } @Test @@ -1111,7 +1184,8 @@ class CrystalWishingCompassSolverTest { EnumSet.noneOf(Crystal.class), possibleTargets, notOverlapping, - 0); + 0 + ); } @Test @@ -1126,7 +1200,8 @@ class CrystalWishingCompassSolverTest { EnumSet.noneOf(Crystal.class), possibleTargets, new Vec3Comparable(goblinHoldoutKingSolution), - 1); + 1 + ); // Assert Assertions.assertTrue(solutionTargets.contains(CompassTarget.GOBLIN_KING)); @@ -1144,7 +1219,8 @@ class CrystalWishingCompassSolverTest { EnumSet.noneOf(Crystal.class), possibleTargets, new Vec3Comparable(odawaSolution), - 1); + 1 + ); // Assert Assertions.assertTrue(solutionTargets.contains(CompassTarget.ODAWA)); @@ -1162,7 +1238,8 @@ class CrystalWishingCompassSolverTest { EnumSet.noneOf(Crystal.class), possibleTargets, new Vec3Comparable(minesOfDivanSolution), - 1); + 1 + ); // Assert Assertions.assertTrue(solutionTargets.contains(CompassTarget.MINES_OF_DIVAN)); @@ -1182,7 +1259,8 @@ class CrystalWishingCompassSolverTest { EnumSet.noneOf(Crystal.class), possibleTargets, new Vec3Comparable(jungleSolution), - 1); + 1 + ); // Assert Assertions.assertTrue(solutionTargets.contains(CompassTarget.JUNGLE_TEMPLE)); @@ -1201,7 +1279,8 @@ class CrystalWishingCompassSolverTest { EnumSet.noneOf(Crystal.class), possibleTargets, new Vec3Comparable(goblinHoldoutQueenSolution), - 1); + 1 + ); // Assert Assertions.assertTrue(solutionTargets.contains(CompassTarget.GOBLIN_QUEEN)); @@ -1219,7 +1298,8 @@ class CrystalWishingCompassSolverTest { EnumSet.noneOf(Crystal.class), possibleTargets, new Vec3Comparable(precursorCitySolution), - 1); + 1 + ); // Assert Assertions.assertTrue(solutionTargets.contains(CompassTarget.PRECURSOR_CITY)); @@ -1233,7 +1313,8 @@ class CrystalWishingCompassSolverTest { EnumSet.noneOf(Crystal.class), EnumSet.allOf(CompassTarget.class), new Vec3Comparable(magmaSolution), - 1); + 1 + ); // Assert Assertions.assertTrue(solutionTargets.contains(CompassTarget.BAL)); @@ -1269,11 +1350,13 @@ class CrystalWishingCompassSolverTest { HandleCompassResult expectedHandleCompassUseResult; SolverState expectedSolverState; - CompassUse(long timeIncrementMillis, - BlockPos playerPos, - ArrayList particles, - HandleCompassResult expectedHandleCompassUseResult, - SolverState expectedState) { + CompassUse( + long timeIncrementMillis, + BlockPos playerPos, + ArrayList particles, + HandleCompassResult expectedHandleCompassUseResult, + SolverState expectedState + ) { this.timeIncrementMillis = timeIncrementMillis; this.playerPos = playerPos; this.particles = particles != null ? particles : new ArrayList<>(); @@ -1296,7 +1379,11 @@ class CrystalWishingCompassSolverTest { Solution(ArrayList compassUses, Vec3i expectedSolutionCoords) { this.compassUses = compassUses; - this.expectedSolutionCoords = new Vec3i(expectedSolutionCoords.getX(), expectedSolutionCoords.getY(), expectedSolutionCoords.getZ()); + this.expectedSolutionCoords = new Vec3i( + expectedSolutionCoords.getX(), + expectedSolutionCoords.getY(), + expectedSolutionCoords.getZ() + ); } } diff --git a/src/test/resources/log4j2-test.xml b/src/test/resources/log4j2-test.xml index 25209eae..61ee1966 100644 --- a/src/test/resources/log4j2-test.xml +++ b/src/test/resources/log4j2-test.xml @@ -2,13 +2,13 @@ - + - + -- cgit From ce23654aff4c315fde75d57c0cfde5b9e2d4bfe0 Mon Sep 17 00:00:00 2001 From: efefury <69400149+efefury@users.noreply.github.com> Date: Sat, 11 Jun 2022 21:18:41 +0200 Subject: Trophy Fishing Tab (#163) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * trophy fishing cool stuff Co-Authored-By: jani270 <69345714+jani270@users.noreply.github.com> * noob * yep bugs: - not uploading when swapping profiles - while hovering over lowest slot, left skulls have light issue Co-Authored-By: jani270 <69345714+jani270@users.noreply.github.com> * change when switching profiles * things lighting bugs add trophy page to pageLayout on startup disable dungeon map on startup * map message * 🤡 but ok Co-authored-by: IRONM00N <64110067+IRONM00N@users.noreply.github.com> * i hate you iron Co-authored-by: jani270 <69345714+jani270@users.noreply.github.com> Co-authored-by: Lulonaut Co-authored-by: IRONM00N <64110067+IRONM00N@users.noreply.github.com> --- Update Notes/2.1.md | 1 + .../notenoughupdates/NotEnoughUpdates.java | 11 + .../commands/dungeon/MapCommand.java | 6 + .../options/seperateSections/DungeonMapConfig.java | 2 +- .../options/seperateSections/ProfileViewer.java | 9 +- .../profileviewer/GuiProfileViewer.java | 22 +- .../profileviewer/trophy/TrophyFish.java | 74 ++++ .../profileviewer/trophy/TrophyFishingPage.java | 429 +++++++++++++++++++++ .../assets/notenoughupdates/pv_trophy_fish_tab.png | Bin 0 -> 4057 bytes 9 files changed, 541 insertions(+), 13 deletions(-) create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFish.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFishingPage.java create mode 100644 src/main/resources/assets/notenoughupdates/pv_trophy_fish_tab.png (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index e3c16382..1a5e1aef 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -6,6 +6,7 @@ - Added fishing skill overlay - Added combat skill overlay - Added slayer overlay +- Added trophy fishing pv tab - efefury - [Added mining tab in /pv](https://cdn.discordapp.com/attachments/832652653292027904/903619242384056370/unknown.png) - Big thanks to kwev1n for some math and jani for the texture - Added blocking clicks back to the enchanting minigames (because apparently, it's not bannable?) diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index 9f7a98b1..bd54dfba 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -232,6 +232,17 @@ public class NotEnoughUpdates { config.apiData.apiKey = config.apiKey.apiKey; config.apiKey = null; } + + if (config.dungeonMap.dmEnable && + !NotEnoughUpdates.INSTANCE.config.hidden.dev) { + config.dungeonMap.dmEnable = false; + } + + //add the trophy fishing tab to the config + if (config.profileViewer.pageLayout.size() == 8) { + config.profileViewer.pageLayout.add(8); + } + saveConfig(); } MinecraftForge.EVENT_BUS.register(this); 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 3789a09d..529f8e57 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 @@ -50,6 +50,12 @@ public class MapCommand extends ClientCommandBase { @Override public void processCommand(ICommandSender sender, String[] args) throws CommandException { + if (!NotEnoughUpdates.INSTANCE.config.hidden.dev) { + Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText( + EnumChatFormatting.RED + "[NEU] The map does not work right now. You can use the map from other mods, for example: SkyblockAddons, DungeonsGuide, or Skytils ")); + return; + } + if (NotEnoughUpdates.INSTANCE.colourMap == null) { try ( BufferedReader reader = new BufferedReader(new InputStreamReader(Minecraft 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 8e211bd6..4397c02e 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 @@ -73,7 +73,7 @@ public class DungeonMapConfig { name = "Show Dungeon Map", desc = "Show/hide the NEU dungeon map" ) - public boolean dmEnable = true; + public boolean dmEnable = false; @Expose @ConfigOption( diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java index 5d3b6532..49385d02 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java @@ -20,11 +20,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.ConfigEditorButton; -import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorDraggableList; -import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorFSR; -import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigOption; +import io.github.moulberry.notenoughupdates.core.config.annotations.*; import java.util.ArrayList; import java.util.Arrays; @@ -71,10 +67,11 @@ public class ProfileViewer { "\u00a7ePets", "\u00a7eMining", "\u00a7eBingo", + "\u00a7eTrophy Fish", }, allowDeleting = false ) - public List pageLayout = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7)); + public List pageLayout = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8)); @Expose @ConfigOption( 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 ba3b97f8..e4014ca3 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java @@ -29,6 +29,7 @@ import com.mojang.authlib.GameProfile; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.cosmetics.ShaderManager; import io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField; +import io.github.moulberry.notenoughupdates.profileviewer.trophy.TrophyFishingPage; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.SBInfo; import io.github.moulberry.notenoughupdates.util.Utils; @@ -199,7 +200,7 @@ public class GuiProfileViewer extends GuiScreen { "personal_vault_contents", Utils.editItemStackInfo(NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager .getItemInformation() - .get("IRON_CHEST")), EnumChatFormatting.GRAY + "Personal vault", true) + .get("IRON_CHEST")), EnumChatFormatting.GRAY + "Personal Vault", true) ); put("talisman_bag", Utils.createItemStack(Items.golden_apple, EnumChatFormatting.GRAY + "Accessory Bag")); put("wardrobe_contents", Utils.createItemStack(Items.leather_chestplate, EnumChatFormatting.GRAY + "Wardrobe")); @@ -223,7 +224,7 @@ public class GuiProfileViewer extends GuiScreen { private static int floorTime = 7; private static int guiLeft; private static int guiTop; - private static ProfileViewer.Profile profile = null; + private static ProfileViewer.Profile profile; private final GuiElementTextField playerNameTextField; private final HashMap levelObjCatas = new HashMap<>(); private final HashMap levelObjhotms = new HashMap<>(); @@ -251,7 +252,7 @@ public class GuiProfileViewer extends GuiScreen { private long lastTime = 0; private long startTime = 0; private List tooltipToDisplay = null; - private String profileId = null; + private static String profileId = null; private boolean profileDropdownSelected = false; private ItemStack selectedCollectionCategory = null; private int floorLevelTo = -1; @@ -282,9 +283,10 @@ public class GuiProfileViewer extends GuiScreen { private boolean showBingoPage; public GuiProfileViewer(ProfileViewer.Profile profile) { - this.profile = profile; + GuiProfileViewer.profile = profile; + GuiProfileViewer.profileId = profile.getLatestProfile(); String name = ""; - if (profile != null && profile.getHypixelProfile() != null) { + if (profile.getHypixelProfile() != null) { name = profile.getHypixelProfile().get("displayname").getAsString(); } playerNameTextField = new GuiElementTextField( @@ -466,6 +468,10 @@ public class GuiProfileViewer extends GuiScreen { return profile; } + public static String getProfileId() { + return profileId; + } + @Override public void drawScreen(int mouseX, int mouseY, float partialTicks) { currentTime = System.currentTimeMillis(); @@ -708,6 +714,9 @@ public class GuiProfileViewer extends GuiScreen { case BINGO: BingoPage.renderPage(mouseX, mouseY); break; + case TROPHY_FISH: + TrophyFishingPage.renderPage(mouseX, mouseY); + break; case LOADING: String str = EnumChatFormatting.YELLOW + "Loading player profiles."; long currentTimeMod = System.currentTimeMillis() % 1000; @@ -5354,7 +5363,8 @@ public class GuiProfileViewer extends GuiScreen { COLLECTIONS(4, Items.painting, "Collections"), PETS(5, Items.bone, "Pets"), MINING(6, Items.iron_pickaxe, "Heart of the Mountain"), - BINGO(7, Items.filled_map, "Bingo"); + BINGO(7, Items.filled_map, "Bingo"), + TROPHY_FISH(8, Items.fishing_rod, "Trophy Fish"); public final ItemStack stack; public final int id; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFish.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFish.java new file mode 100644 index 00000000..9951511d --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFish.java @@ -0,0 +1,74 @@ +/* + * 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.profileviewer.trophy; + +import java.util.Map; + +public class TrophyFish { + + private final String name; + + private int total = 0; + + public final Map trophyFishRarityIntegerMap; + + public TrophyFish(String name, Map trophyFishRarityIntegerMap) { + this.name = name; + this.trophyFishRarityIntegerMap = trophyFishRarityIntegerMap; + } + + public void addTotal(int n) { + total +=n; + } + + public int getTotal() { + return total; + } + + public void removeTotal(int n) { + total -=n; + } + + public String getName() { + return name; + } + + public Map getTrophyFishRarityIntegerMap() { + return trophyFishRarityIntegerMap; + } + + public void add(TrophyFishRarity rarity, int value) { + if(!trophyFishRarityIntegerMap.containsKey(rarity)) { + trophyFishRarityIntegerMap.put(rarity, value); + } + } + + public enum TrophyFishRarity { + BRONZE, + SILVER, + GOLD, + DIAMOND; + } + + public String getInternalName() { + return name.toLowerCase().replace(" ", "_"); + } +} + diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFishingPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFishingPage.java new file mode 100644 index 00000000..6063dee0 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFishingPage.java @@ -0,0 +1,429 @@ +/* + * 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.profileviewer.trophy; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; +import io.github.moulberry.notenoughupdates.util.Utils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import org.apache.commons.lang3.text.WordUtils; +import org.apache.commons.lang3.tuple.Pair; +import org.lwjgl.opengl.GL11; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class TrophyFishingPage { + + public static Map internalTrophyFish = new HashMap() { + { + put("gusher", EnumChatFormatting.WHITE); + put("flyfish", EnumChatFormatting.GREEN); + put("moldfin", EnumChatFormatting.DARK_PURPLE); + put("vanille", EnumChatFormatting.BLUE); + put("blobfish", EnumChatFormatting.WHITE); + put("mana_ray", EnumChatFormatting.BLUE); + put("slugfish", EnumChatFormatting.GREEN); + put("soul_fish", EnumChatFormatting.DARK_PURPLE); + put("lava_horse", EnumChatFormatting.BLUE); + put("golden_fish", EnumChatFormatting.GOLD); + put("karate_fish", EnumChatFormatting.DARK_PURPLE); + put("skeleton_fish", EnumChatFormatting.DARK_PURPLE); + put("sulphur_skitter", EnumChatFormatting.WHITE); + put("obfuscated_fish_1", EnumChatFormatting.WHITE); + put("obfuscated_fish_2", EnumChatFormatting.GREEN); + put("obfuscated_fish_3", EnumChatFormatting.BLUE); + put("volcanic_stonefish", EnumChatFormatting.BLUE); + put("steaming_hot_flounder", EnumChatFormatting.WHITE); + } + }; + + private static LinkedHashMap> armorHelmets = + new LinkedHashMap>() { + { + put(NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager + .getItemInformation() + .get("BRONZE_HUNTER_HELMET")), Pair.of(EnumChatFormatting.GREEN + "Novice Fisher", 1)); + put(NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager + .getItemInformation() + .get("SILVER_HUNTER_HELMET")), Pair.of(EnumChatFormatting.BLUE + "Adept Fisher", 2)); + put(NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager + .getItemInformation() + .get("GOLD_HUNTER_HELMET")), Pair.of(EnumChatFormatting.DARK_PURPLE + "Expert Fisher", 3)); + put(NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager + .getItemInformation() + .get("DIAMOND_HUNTER_HELMET")), Pair.of(EnumChatFormatting.GOLD + "Master Fisher", 4)); + } + }; + + private static Map> slotLocations = new HashMap>() { + { + put(0, Pair.of(277, 46)); + put(1, Pair.of(253, 58)); + put(2, Pair.of(301, 58)); + put(3, Pair.of(229, 70)); + put(4, Pair.of(325, 70)); + put(5, Pair.of(277, 70)); + put(6, Pair.of(253, 82)); + put(7, Pair.of(301, 82)); + put(8, Pair.of(229, 94)); + put(9, Pair.of(325, 94)); + put(10, Pair.of(253, 106)); + put(11, Pair.of(301, 106)); + put(12, Pair.of(277, 118)); + put(13, Pair.of(229, 118)); + put(14, Pair.of(325, 118)); + put(15, Pair.of(253, 130)); + put(16, Pair.of(301, 130)); + put(17, Pair.of(277, 142)); + } + }; + private static long totalCount = 0; + private static int guiLeft; + private static int guiTop; + + private static final ResourceLocation TROPHY_FISH_TEXTURE = new ResourceLocation( + "notenoughupdates:pv_trophy_fish_tab.png"); + private static final Map trophyFishList = new HashMap<>(); + + private static final Map total = new HashMap<>(); + + public static void renderPage(int mouseX, int mouseY) { + guiLeft = GuiProfileViewer.getGuiLeft(); + guiTop = GuiProfileViewer.getGuiTop(); + JsonObject trophyInformation = getTrophyInformation(); + if (trophyInformation == null) { + Utils.drawStringCentered(EnumChatFormatting.RED + "No data found", + Minecraft.getMinecraft().fontRendererObj, + guiLeft + 431 / 2f, + guiTop + 101, + true, + 0 + ); + return; + } + + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + int width = scaledResolution.getScaledWidth(); + int height = scaledResolution.getScaledHeight(); + + Minecraft.getMinecraft().getTextureManager().bindTexture(TROPHY_FISH_TEXTURE); + Utils.drawTexturedRect(guiLeft, guiTop, 431, 202, GL11.GL_NEAREST); + + GlStateManager.color(1, 1, 1, 1); + GlStateManager.disableLighting(); + RenderHelper.enableGUIStandardItemLighting(); + + JsonObject stats = trophyInformation.get("stats").getAsJsonObject(); + + int thunderKills = 0; + if (stats.has("kills_thunder")) { + thunderKills = stats.getAsJsonObject().get("kills_thunder").getAsInt(); + } + ItemStack thunder_sc = NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager + .getItemInformation() + .get("THUNDER_SC")); + Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI(thunder_sc, guiLeft + 16, guiTop + 108); + + Utils.drawStringF( + EnumChatFormatting.AQUA + "Thunder Kills: §f" + thunderKills, + Minecraft.getMinecraft().fontRendererObj, + guiLeft + 36, + guiTop + 112, + true, + 0 + ); + + ItemStack lord_jawbus_sc = NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager + .getItemInformation() + .get("LORD_JAWBUS_SC")); + Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI(lord_jawbus_sc, guiLeft + 16, guiTop + 120); + int jawbusKills = 0; + if (stats.has("kills_lord_jawbus")) { + jawbusKills = stats.getAsJsonObject().get("kills_lord_jawbus").getAsInt(); + } + + Utils.drawStringF( + EnumChatFormatting.AQUA + "Lord Jawbus Kills: §f" + jawbusKills, + Minecraft.getMinecraft().fontRendererObj, + guiLeft + 36, + guiTop + 124, + true, + 0 + ); + + ItemStack fishing_rod = NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager + .getItemInformation() + .get("FISHING_ROD")); + Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI(fishing_rod, guiLeft + 20, guiTop + 21); + + Utils.drawStringF( + EnumChatFormatting.AQUA + "Total Caught: §f" + totalCount, + Minecraft.getMinecraft().fontRendererObj, + guiLeft + 38, + guiTop + 25, + true, + 0 + ); + + ArrayList arrayList = new ArrayList<>(trophyFishList.values()); + arrayList.sort((c1, c2) -> { + if (c1.getTotal() > c2.getTotal()) return -1; + if (c1.getTotal() < c2.getTotal()) return 1; + return 0; + }); + + int x; + int y; + for (TrophyFish value : arrayList) { + RenderHelper.enableGUIStandardItemLighting(); + x = guiLeft + slotLocations.get(arrayList.indexOf(value)).getLeft(); + y = guiTop + slotLocations.get(arrayList.indexOf(value)).getRight(); + Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI( + getItem(value.getName()), + x, + y + ); + + if (mouseX >= x && mouseX < x + 24) { + if (mouseY >= y && mouseY <= y + 24) { + Utils.drawHoveringText( + getTooltip(value), + mouseX, + mouseY, + width, + height, + -1, + Minecraft.getMinecraft().fontRendererObj + ); + } + } + } + + if (arrayList.size() != internalTrophyFish.size()) { + List clonedList = new ArrayList<>(internalTrophyFish.size()); + clonedList.addAll(internalTrophyFish.keySet()); + clonedList.removeAll(fixStringName(new ArrayList<>(trophyFishList.keySet()))); + for (String difference : clonedList) { + RenderHelper.enableGUIStandardItemLighting(); + x = guiLeft + slotLocations.get(clonedList.indexOf(difference) + (trophyFishList.keySet().size())).getLeft(); + y = guiTop + slotLocations.get(clonedList.indexOf(difference) + (trophyFishList.keySet().size())).getRight(); + ItemStack itemStack = new ItemStack(Items.dye, 1, 8); + Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI( + itemStack, + x, + y + ); + if (mouseX >= x && mouseX < x + 24) { + if (mouseY >= y && mouseY <= y + 24) { + Utils.drawHoveringText( + getTooltipIfNotFound(difference), + mouseX, + mouseY, + width, + height, + -1, + Minecraft.getMinecraft().fontRendererObj + ); + } + + } + } + } + + int i = 0; + if (!trophyInformation.has("trophy_fish") && + !trophyInformation.get("trophy_fish").getAsJsonObject().has("rewards")) { + return; + } + + JsonArray rewards = trophyInformation.get("trophy_fish").getAsJsonObject().get("rewards").getAsJsonArray(); + for (ItemStack itemStack : armorHelmets.keySet()) { + RenderHelper.enableGUIStandardItemLighting(); + int integer = armorHelmets.get(itemStack).getRight(); + x = guiLeft + 18; + y = guiTop + 50 + i; + + Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI(itemStack, x, y); + Utils.drawStringF(armorHelmets.get(itemStack).getLeft(), Minecraft.getMinecraft().fontRendererObj, + x + 20, y + 4, true, 0 + ); + try { + JsonElement jsonElement = rewards.get(integer - 1); + if (!jsonElement.isJsonNull()) { + Utils.drawStringF(check, Minecraft.getMinecraft().fontRendererObj, + x + 100, y + 2, true, 0 + ); + } else { + Utils.drawStringF(checkX, Minecraft.getMinecraft().fontRendererObj, + x + 100, y + 4, true, 0 + ); + } + } catch (IndexOutOfBoundsException exception) { + Utils.drawStringF(checkX, Minecraft.getMinecraft().fontRendererObj, + x + 100, y + 4, true, 0 + ); + } + i += 10; + } + + GlStateManager.enableLighting(); + } + + private static List getTooltip(TrophyFish fish) { + List tooltip = new ArrayList<>(); + tooltip.add( + internalTrophyFish.get(fish.getInternalName()) + WordUtils.capitalize(fish.getName().replace("_", " "))); + Map trophyFishRarityIntegerMap = fish.getTrophyFishRarityIntegerMap(); + tooltip.add(" "); + tooltip.add(display(trophyFishRarityIntegerMap, TrophyFish.TrophyFishRarity.DIAMOND, EnumChatFormatting.AQUA)); + tooltip.add(display(trophyFishRarityIntegerMap, TrophyFish.TrophyFishRarity.GOLD, EnumChatFormatting.GOLD)); + tooltip.add(display(trophyFishRarityIntegerMap, TrophyFish.TrophyFishRarity.SILVER, EnumChatFormatting.GRAY)); + tooltip.add(display(trophyFishRarityIntegerMap, TrophyFish.TrophyFishRarity.BRONZE, EnumChatFormatting.DARK_GRAY + )); + return tooltip; + } + + private static List getTooltipIfNotFound(String name) { + List tooltip = new ArrayList<>(); + tooltip.add( + internalTrophyFish.get(name.toLowerCase().replace(" ", "_")) + WordUtils.capitalize(name.replace("_", " "))); + tooltip.add(" "); + tooltip.add(EnumChatFormatting.RED + checkX + " Not Discovered"); + tooltip.add(" "); + tooltip.add(display(null, TrophyFish.TrophyFishRarity.DIAMOND, EnumChatFormatting.AQUA)); + tooltip.add(display(null, TrophyFish.TrophyFishRarity.GOLD, EnumChatFormatting.GOLD)); + tooltip.add(display(null, TrophyFish.TrophyFishRarity.SILVER, EnumChatFormatting.GRAY)); + tooltip.add(display(null, TrophyFish.TrophyFishRarity.BRONZE, EnumChatFormatting.DARK_GRAY)); + return tooltip; + } + + private static final String checkX = "§c✖"; + private static final String check = "§a✔"; + + private static String display( + Map trophyFishRarityIntegerMap, + TrophyFish.TrophyFishRarity rarity, EnumChatFormatting color + ) { + String name = WordUtils.capitalize(rarity.name().toLowerCase()); + if (trophyFishRarityIntegerMap == null) { + return color + name + ": " + checkX; + } + + if (trophyFishRarityIntegerMap.containsKey(rarity)) { + return color + name + ": " + EnumChatFormatting.GOLD + + trophyFishRarityIntegerMap.get(rarity); + } else { + return color + name + ": " + checkX; + } + } + + private static ItemStack getItem(String name) { + String repoName = name.toUpperCase().replace(" ", "_") + "_BRONZE"; + JsonObject jsonItem = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(repoName); + return NotEnoughUpdates.INSTANCE.manager.jsonToStack(jsonItem); + } + + private static JsonObject getTrophyInformation() { + trophyFishList.clear(); + + JsonObject trophyFishInformation = GuiProfileViewer.getProfile().getProfileInformation(GuiProfileViewer.getProfileId()); + if (trophyFishInformation == null || !trophyFishInformation.has("trophy_fish")) { + return null; + } + JsonObject trophyObject = trophyFishInformation.get("trophy_fish").getAsJsonObject(); + Map>> trophyFishRarityIntegerMap = new HashMap<>(); + for (Map.Entry stringJsonElementEntry : trophyObject.entrySet()) { + String key = stringJsonElementEntry.getKey(); + if (key.equalsIgnoreCase("rewards") || key.equalsIgnoreCase("total_caught")) { + if (key.equalsIgnoreCase("total_caught")) { + totalCount = stringJsonElementEntry.getValue().getAsInt(); + } + continue; + } + + String[] s = key.split("_"); + String type = s[s.length - 1]; + TrophyFish.TrophyFishRarity trophyFishRarity; + int value = stringJsonElementEntry.getValue().getAsInt(); + + if (key.startsWith("golden_fish_")) { + type = s[2]; + } + try { + trophyFishRarity = TrophyFish.TrophyFishRarity.valueOf(type.toUpperCase()); + } catch (IllegalArgumentException ignored) { + total.put(WordUtils.capitalize(key), value); + continue; + } + + String replace = key.replace("_" + type, ""); + String name = WordUtils.capitalize(replace); + List> pairs; + + if (trophyFishRarityIntegerMap.containsKey(name)) { + pairs = trophyFishRarityIntegerMap.get(name); + } else { + pairs = new ArrayList<>(); + } + pairs.add(Pair.of(trophyFishRarity, value)); + trophyFishRarityIntegerMap.put(name, pairs); + } + + trophyFishRarityIntegerMap.forEach((name, pair) -> { + if (!TrophyFishingPage.trophyFishList.containsKey(name)) { + TrophyFish trophyFish = new TrophyFish(name, new HashMap<>()); + trophyFish.addTotal(TrophyFishingPage.total.get(name)); + for (Pair pair1 : pair) { + + trophyFish.add(pair1.getKey(), pair1.getValue()); + } + trophyFishList.put(name, trophyFish); + } else { + TrophyFish trophyFish = trophyFishList.get(name); + for (Pair pair1 : pair) { + trophyFish.add(pair1.getKey(), pair1.getValue()); + } + } + }); + return trophyFishInformation; + } + + private static List fixStringName(List list) { + List fixedList = new ArrayList<>(); + for (String s : list) { + fixedList.add(s.toLowerCase().replace(" ", "_")); + } + return fixedList; + } +} diff --git a/src/main/resources/assets/notenoughupdates/pv_trophy_fish_tab.png b/src/main/resources/assets/notenoughupdates/pv_trophy_fish_tab.png new file mode 100644 index 00000000..669bc489 Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/pv_trophy_fish_tab.png differ -- cgit From b3a62c57c3bb5f2e2bb033bb08e085a30be8e570 Mon Sep 17 00:00:00 2001 From: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> Date: Sun, 12 Jun 2022 05:21:52 +1000 Subject: added social and equipment to pv (#158) * Added equippment to pv * not working :thumn up :trollface: * working i think * i forgot * 2.1md gaming * Fixing offset i think? * Rename social_xp -> social * thank you hy pixel for making equipemnt in a different order to armoru Co-authored-by: jani270 Co-authored-by: jani270 <69345714+jani270@users.noreply.github.com> Co-authored-by: kr45732 <52721908+kr45732@users.noreply.github.com> --- Update Notes/2.1.md | 30 ++++++++++++--------- .../notenoughupdates/listener/ChatListener.java | 1 + .../profileviewer/GuiProfileViewer.java | 28 +++++++++++++++++++ .../profileviewer/ProfileViewer.java | 22 ++++++++++++--- .../resources/assets/notenoughupdates/pv_invs.png | Bin 4446 -> 2426 bytes 5 files changed, 65 insertions(+), 16 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 1a5e1aef..fe32ed69 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -6,30 +6,40 @@ - Added fishing skill overlay - Added combat skill overlay - Added slayer overlay -- Added trophy fishing pv tab - efefury -- [Added mining tab in /pv](https://cdn.discordapp.com/attachments/832652653292027904/903619242384056370/unknown.png) -- Big thanks to kwev1n for some math and jani for the texture - 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 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 +- Added and fixed various things in the profile viewer: + - [Added mining tab](https://cdn.discordapp.com/attachments/832652653292027904/903619242384056370/unknown.png) + - Big thanks to kwev1n for some math and jani for the texture + - [Added bingo tab](https://cdn.discordapp.com/attachments/702456294874808330/951909539383500820/unknown.png) - Lulonaut + - [Added bingo and Stranded profile icons to /pv](https://cdn.discordapp.com/attachments/832652653292027904/915844465372065842/unknown.png) + - Added trophy fishing tab - efefury + - Added equipment + - Added blaze slayer level and kills + - Added social level + - Added various new collections and minions + - Added mastermode catacombs xp to level calculator + - Added profile viewer settings to /neu + - Added an unknown icon if neu doesn't recognize your profile type + - Added total xp to catacombs level - efefury + - 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 ### **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 - Added some info panels to some settings in /neu - Added Kat Level After Upgrade Estimator - nea89 -- 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) @@ -54,14 +64,11 @@ - Turns off inv search mode after 2 minutes - Made /neustats modlist show normal /neustats if under 15 mods - 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 - Added a warning in the tooltip when price info couldn't be found/is outdated - Lulonaut - 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 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 @@ -69,7 +76,6 @@ - Added a config option to hide the reforge stats for Legendary items from Hypixel on reforge stones - Lulonaut - Added an option to alert you if you put something for too much onto ah (default 50%) - Lowest bin alert triggers if lowest bin isnt found -- Made the order of the tabs in /pv changeable - Lulonaut - Crystal Hollows crystal states are now updated when the Heart of the Mountain menu is opened - CraftyOldMiner - Added /neudiag command to enable/disable debug logging and dump diagnostic data - CraftyOldMiner - Added NBT data to Profile Viewer HOTM tree icons - whalker @@ -116,8 +122,6 @@ - Fixed what hypxiel broke in dungeons - Fixed the dungeon map on f1 - Minikloon - 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 - Fixed some vanilla Minecraft keybinds not working in NEU GUIs - Fixed crash with spamming remove enchant in /neuec @@ -134,4 +138,4 @@ ### **Previous change log** -https://github.com/NotEnoughUpdates/NotEnoughUpdates/blob/master/Update%20Notes/2.0-Pre31-Release.md +https://github.com/NotEnoughUpdates/NotEnoughUpdates/blob/master/Update%20Notes/2.0-Pre31-Release.md \ No newline at end of file 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 408c8a6d..0aade4b0 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java @@ -174,6 +174,7 @@ public class ChatListener { ); Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText( EnumChatFormatting.YELLOW + "[NEU] API Key automatically configured")); + NotEnoughUpdates.INSTANCE.saveConfig(); } else if (unformatted.startsWith("Player List Info is now disabled!")) { SBInfo.getInstance().hasNewTab = false; } else if (unformatted.startsWith("Player List Info is now enabled!")) { 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 e4014ca3..3f131465 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java @@ -265,6 +265,7 @@ public class GuiProfileViewer extends GuiScreen { private ItemStack[] bestWeapons = null; private ItemStack[] bestRods = null; private ItemStack[] armorItems = null; + private ItemStack[] equipmentItems = null; private HashMap inventoryItems = new HashMap<>(); private String selectedInventory = "inv_contents"; private int currentInventoryIndex = 0; @@ -2936,6 +2937,32 @@ public class GuiProfileViewer extends GuiScreen { } } + if (equipmentItems == null) { + equipmentItems = new ItemStack[4]; + JsonArray equippment = Utils.getElement(inventoryInfo, "equippment_contents").getAsJsonArray(); + for (int i = 0; i < equippment.size(); i++) { + if (equippment.get(i) == null || !equippment.get(i).isJsonObject()) continue; + equipmentItems[i] = NotEnoughUpdates.INSTANCE.manager.jsonToStack(equippment.get(i).getAsJsonObject(), false); + } + } + + for (int i = 0; i < equipmentItems.length; i++) { + ItemStack stack = equipmentItems[i]; + if (stack != null) { + Utils.drawItemStack(stack, guiLeft + 192, guiTop + 13 + 18 * i); + if (stack != fillerStack) { + if (mouseX >= guiLeft + 192 - 1 && mouseX <= guiLeft + 192 + 16 + 1) { + if (mouseY >= guiTop + 13 + 18 * i - 1 && mouseY <= guiTop + 13 + 18 * i + 16 + 1) { + tooltipToDisplay = stack.getTooltip( + Minecraft.getMinecraft().thePlayer, + Minecraft.getMinecraft().gameSettings.advancedItemTooltips + ); + } + } + } + } + } + ItemStack[][][] inventories = getItemsForInventory(inventoryInfo, selectedInventory); if (currentInventoryIndex >= inventories.length) currentInventoryIndex = inventories.length - 1; if (currentInventoryIndex < 0) currentInventoryIndex = 0; @@ -5236,6 +5263,7 @@ public class GuiProfileViewer extends GuiScreen { bestWeapons = null; bestRods = null; armorItems = null; + equipmentItems = null; inventoryItems = new HashMap<>(); currentInventoryIndex = 0; arrowCount = -1; 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 5ed84b03..9da55d64 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java @@ -84,6 +84,7 @@ public class ProfileViewer { "skill_runecrafting", Utils.createItemStack(Items.magma_cream, EnumChatFormatting.DARK_PURPLE + "Runecrafting") ); + put("skill_social2", Utils.createItemStack(Items.emerald, EnumChatFormatting.DARK_GREEN + "Social")); // put("skill_catacombs", Utils.createItemStack(Item.getItemFromBlock(Blocks.deadbush), EnumChatFormatting.GOLD+"Catacombs")); put("slayer_zombie", Utils.createItemStack(Items.rotten_flesh, EnumChatFormatting.GOLD + "Rev Slayer")); put("slayer_spider", Utils.createItemStack(Items.spider_eye, EnumChatFormatting.GOLD + "Tara Slayer")); @@ -883,6 +884,8 @@ public class ProfileViewer { Utils.getElementAsFloat(Utils.getElement(profileInfo, "experience_skill_alchemy"), 0); float experience_skill_runecrafting = Utils.getElementAsFloat(Utils.getElement(profileInfo, "experience_skill_runecrafting"), 0); + float experience_skill_social = + Utils.getElementAsFloat(Utils.getElement(profileInfo, "experience_skill_social2"), 0); float experience_skill_hotm = Utils.getElementAsFloat(Utils.getElement(profileInfo, "mining_core.experience"), 0); float experience_skill_catacombs = @@ -901,7 +904,7 @@ public class ProfileViewer { float totalSkillXP = experience_skill_taming + experience_skill_mining + experience_skill_foraging + experience_skill_enchanting + experience_skill_carpentry + experience_skill_farming + experience_skill_combat + experience_skill_fishing + experience_skill_alchemy - + experience_skill_runecrafting; + + experience_skill_runecrafting + experience_skill_social; if (totalSkillXP <= 0) { return null; @@ -919,6 +922,7 @@ public class ProfileViewer { skillInfo.addProperty("experience_skill_fishing", experience_skill_fishing); skillInfo.addProperty("experience_skill_alchemy", experience_skill_alchemy); skillInfo.addProperty("experience_skill_runecrafting", experience_skill_runecrafting); + skillInfo.addProperty("experience_skill_social2", experience_skill_social); skillInfo.addProperty("experience_skill_hotm", experience_skill_hotm); skillInfo.addProperty("experience_skill_catacombs", experience_skill_catacombs); @@ -948,6 +952,9 @@ public class ProfileViewer { Level level_skill_runecrafting = getLevel(Utils.getElement(leveling, "runecrafting_xp").getAsJsonArray(), experience_skill_runecrafting, getCap(leveling, "runecrafting"), false ); + Level level_skill_social = getLevel(Utils.getElement(leveling, "social").getAsJsonArray(), + experience_skill_social, getCap(leveling, "social"), false + ); Level level_skill_catacombs = getLevel(Utils.getElement(leveling, "catacombs").getAsJsonArray(), experience_skill_catacombs, getCap(leveling, "catacombs"), false ); @@ -978,6 +985,7 @@ public class ProfileViewer { skillInfo.addProperty("level_skill_fishing", level_skill_fishing.level); skillInfo.addProperty("level_skill_alchemy", level_skill_alchemy.level); skillInfo.addProperty("level_skill_runecrafting", level_skill_runecrafting.level); + skillInfo.addProperty("level_skill_social2", level_skill_social.level); skillInfo.addProperty("level_skill_catacombs", level_skill_catacombs.level); @@ -997,6 +1005,7 @@ public class ProfileViewer { skillInfo.addProperty("maxed_skill_fishing", level_skill_fishing.maxed); skillInfo.addProperty("maxed_skill_alchemy", level_skill_alchemy.maxed); skillInfo.addProperty("maxed_skill_runecrafting", level_skill_runecrafting.maxed); + skillInfo.addProperty("maxed_skill_social2", level_skill_social.maxed); skillInfo.addProperty("maxed_skill_catacombs", level_skill_catacombs.maxed); @@ -1016,6 +1025,7 @@ public class ProfileViewer { skillInfo.addProperty("maxxp_skill_fishing", level_skill_fishing.maxXpForLevel); skillInfo.addProperty("maxxp_skill_alchemy", level_skill_alchemy.maxXpForLevel); skillInfo.addProperty("maxxp_skill_runecrafting", level_skill_runecrafting.maxXpForLevel); + skillInfo.addProperty("maxxp_skill_social2", level_skill_social.maxXpForLevel); skillInfo.addProperty("maxxp_skill_catacombs", level_skill_catacombs.maxXpForLevel); @@ -1079,6 +1089,10 @@ public class ProfileViewer { Utils.getElement(profileInfo, "candy_inventory_contents.data"), "Hz8IAAAAAAAAAD9iYD9kYD9kAAMAPwI/Gw0AAAA=" ); + String equipment_contents_bytes = Utils.getElementAsString( + Utils.getElement(profileInfo, "equippment_contents.data"), + "Hz8IAAAAAAAAAD9iYD9kYD9kAAMAPwI/Gw0AAAA=" + ); JsonObject inventoryInfo = new JsonObject(); @@ -1093,7 +1107,8 @@ public class ProfileViewer { "potion_bag", "inv_contents", "talisman_bag", - "candy_inventory_contents" + "candy_inventory_contents", + "equippment_contents" }; String[] inv_bytes = new String[]{ inv_armor_bytes, @@ -1106,7 +1121,8 @@ public class ProfileViewer { potion_bag_bytes, inv_contents_bytes, talisman_bag_bytes, - candy_inventory_contents_bytes + candy_inventory_contents_bytes, + equipment_contents_bytes }; for (int i = 0; i < inv_bytes.length; i++) { try { diff --git a/src/main/resources/assets/notenoughupdates/pv_invs.png b/src/main/resources/assets/notenoughupdates/pv_invs.png index 881078d2..46c7b0e9 100644 Binary files a/src/main/resources/assets/notenoughupdates/pv_invs.png and b/src/main/resources/assets/notenoughupdates/pv_invs.png differ -- cgit From c8500921b28240f6fdae902a5efe8d81ca916d9f Mon Sep 17 00:00:00 2001 From: Lulonaut <67191924+Lulonaut@users.noreply.github.com> Date: Sun, 12 Jun 2022 05:48:25 +0200 Subject: Only level 100 option in ah search overlay (#160) --- .idea/copyright/NotEnoughUpdates.xml | 2 +- Update Notes/2.1.md | 1 + .../overlays/AuctionSearchOverlay.java | 61 ++++++++++++++-------- 3 files changed, 40 insertions(+), 24 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/.idea/copyright/NotEnoughUpdates.xml b/.idea/copyright/NotEnoughUpdates.xml index ea087768..8dd67ac4 100644 --- a/.idea/copyright/NotEnoughUpdates.xml +++ b/.idea/copyright/NotEnoughUpdates.xml @@ -1,7 +1,7 @@ \ No newline at end of file diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index fe32ed69..933b907a 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -95,6 +95,7 @@ - Added support for attributes in neuec - Added Heavy Pearls to todo overlay - cobble8 - Added Booster Cookie Warning - 2stinkysocks +- Added an option to only search for Level 100 pets in the auction house search overlay - Lulonaut ### **Bug Fixes:** 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 a493d201..aee47db2 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/AuctionSearchOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/AuctionSearchOverlay.java @@ -59,8 +59,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 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); @@ -73,6 +72,7 @@ public class AuctionSearchOverlay { private static int selectedStars = 0; private static boolean atLeast = true; + private static boolean onlyLevel100 = false; private static final int AUTOCOMPLETE_HEIGHT = 118; @@ -156,15 +156,22 @@ public class AuctionSearchOverlay { Utils.drawTexturedRect(width / 2 + 108 + 10 * i, topY + 29, 9, 10, GL11.GL_NEAREST); } - 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 - ); + if (selectedStars < 6) { + 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); + Minecraft.getMinecraft().fontRendererObj.drawString("At Least?", width / 2 + 117, topY + 43, 0xffffff); + + if (atLeast) { + Gui.drawRect(width / 2 + 108, topY + 44, width / 2 + 113, topY + 49, 0xffffffff); + } + } + + Gui.drawRect(width / 2 + 106, topY + 53, width / 2 + 115, topY + 62, 0xffffffff); + Gui.drawRect(width / 2 + 107, topY + 54, width / 2 + 114, topY + 61, 0xff000000); + if (onlyLevel100) { + Gui.drawRect(width / 2 + 108, topY + 55, width / 2 + 113, topY + 60, 0xffffffff); + } + Minecraft.getMinecraft().fontRendererObj.drawString("Level 100 pets only?", width / 2 + 117, topY + 54, 0xffffff); Minecraft.getMinecraft().fontRendererObj.drawString("Enter Query:", width / 2 - 100, topY - 10, 0xdddddd, true); @@ -293,17 +300,13 @@ public class AuctionSearchOverlay { } String searchString = autocompletedItems.toArray()[i].toString(); JsonObject repoObject = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(searchString); - String displayname = repoObject.get("displayname").getAsString(); - if (displayname.contains("Enchanted Book")) { - String lore = repoObject.get("lore").getAsJsonArray().get(0).getAsString(); - String name = lore.substring(0, lore.lastIndexOf(" ")); - return Utils.cleanColour(name); - } else { - return Utils.cleanColour(displayname); + if (repoObject != null) { + ItemStack stack = NotEnoughUpdates.INSTANCE.manager.jsonToStack(repoObject); + return Utils.cleanColour(stack.getDisplayName().replaceAll("\\[.+]", "")); } - } else { - return null; + } + return null; } public static void close() { @@ -321,10 +324,16 @@ public class AuctionSearchOverlay { TileEntitySign tes = ((AccessorGuiEditSign) Minecraft.getMinecraft().currentScreen).getTileSign(); - String search = searchString.trim(); - if (searchStringExtra != null && !searchStringExtra.isEmpty()) { - search += " " + searchStringExtra.trim(); + StringBuilder stringBuilder = new StringBuilder(searchString.trim()); + if (!searchStringExtra.isEmpty()) { + stringBuilder.append(searchStringExtra.trim()); } + if (onlyLevel100) { + stringBuilder.insert(0, "[Lvl 100] "); + } + + String search = stringBuilder.toString(); + if (search.length() <= 15) { tes.signText[0] = new ChatComponentText(search.substring(0, Math.min(search.length(), 15))); } else { @@ -565,6 +574,12 @@ public class AuctionSearchOverlay { return; } + if (Mouse.getEventButtonState() && mouseX >= width / 2 + 106 && mouseX <= width / 2 + 116 && + mouseY >= topY + 53 && mouseY <= topY + 62) { + onlyLevel100 = !onlyLevel100; + return; + } + if (!Mouse.getEventButtonState() && Mouse.getEventButton() == -1 && searchFieldClicked) { textField.mouseClickMove(mouseX - 2, topY + 10, 0, 0); } -- cgit From 439fc22ff04b0f5b0201c2d982bceb18d82fd553 Mon Sep 17 00:00:00 2001 From: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> Date: Thu, 16 Jun 2022 11:41:19 +0000 Subject: added colours to fishing tab (#166) * Added color background to the back of the fishing tab * Fixed missing enchants not working with shiny items * added my name to everything i had done in 2.1.md cos idk why i didnt before --- Update Notes/2.1.md | 115 +++++++++++---------- .../listener/ItemTooltipListener.java | 2 +- .../profileviewer/trophy/TrophyFishingPage.java | 29 ++++-- .../assets/notenoughupdates/pv_trophy_fish_tab.png | Bin 4057 -> 2839 bytes 4 files changed, 81 insertions(+), 65 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 933b907a..6b95d546 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -2,32 +2,32 @@ ### **Major Changes:** -- Added mining skill overlay -- Added fishing skill overlay -- Added combat skill overlay -- Added slayer overlay +- Added mining skill overlay - nopo +- Added fishing skill overlay - nopo +- Added combat skill overlay - nopo +- Added slayer overlay - nopo - 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 +- Fixed pet overlay not updating when going into /pets - nopo - [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 +- Added a pet overlay that shows your active pet in your inventory - nopo - [Price graph for items on /ah and /bz](https://cdn.discordapp.com/attachments/896407218151366687/926968296929107999/unknown.png) - DeDiamondPro - 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 - Added and fixed various things in the profile viewer: - - [Added mining tab](https://cdn.discordapp.com/attachments/832652653292027904/903619242384056370/unknown.png) + - [Added mining tab](https://cdn.discordapp.com/attachments/832652653292027904/903619242384056370/unknown.png) - nopo - Big thanks to kwev1n for some math and jani for the texture - [Added bingo tab](https://cdn.discordapp.com/attachments/702456294874808330/951909539383500820/unknown.png) - Lulonaut - - [Added bingo and Stranded profile icons to /pv](https://cdn.discordapp.com/attachments/832652653292027904/915844465372065842/unknown.png) + - [Added bingo and Stranded profile icons to /pv](https://cdn.discordapp.com/attachments/832652653292027904/915844465372065842/unknown.png) - nopo - Added trophy fishing tab - efefury - - Added equipment - - Added blaze slayer level and kills - - Added social level - - Added various new collections and minions - - Added mastermode catacombs xp to level calculator - - Added profile viewer settings to /neu - - Added an unknown icon if neu doesn't recognize your profile type + - Added equipment - nopo + - Added blaze slayer level and kills - nopo + - Added social level - nopo + - Added various new collections and minions - nopo + - Added mastermode catacombs xp to level calculator - nopo + - Added profile viewer settings to /neu - nopo + - Added an unknown icon if neu doesn't recognize your profile type - nopo - Added total xp to catacombs level - efefury - 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 @@ -38,44 +38,44 @@ - Add mob drop viewer in the recipe viewer - nea89 - Add Stranded Villager Trades to the item list - nea89 - 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 some info panels to some settings in /neu - nopo - Added Kat Level After Upgrade Estimator - nea89 -- Added pitch and coins/m as options in farming skill overlay +- Added pitch and coins/m as options in farming skill overlay - nopo - 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) +- Added a toggle for enchant glint in storage gui (ty ery for texture) - nopo - Fairy soul beacons now change color based on their distance - Separated settings for fairy soul tracking from showing beacons. Tracking is turned on by default. -- Added fairy souls option to /neu misc +- Added fairy souls option to /neu misc - nopo - Make it so fairy souls are tracked independently for each profile - Lulonaut -- Added a button in the storage gui to open the settings -- Added an option to change the click names for /pv to /ah +- Added a button in the storage gui to open the settings - nopo +- Added an option to change the click names for /pv to /ah - nopo - Added a help menu to /neuec -- Made it so treecap shows foraging xp instead of farming xp on the farming overlay -- Made it so a jungle axe with cult will show the "farming" overlay +- Made it so treecap shows foraging xp instead of farming xp on the farming overlay - nopo +- Made it so a jungle axe with cult will show the "farming" overlay - nopo - 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 dirt wand overlay -- Added a config option for hoe of tilling -- Added an option to use short numbers (1.5mil) for price tooltips +- Changed "NEUAH is DISABLED! Enable in /neusettings." to /neu - nopo +- Changed misc overlays tab to todo overlays - nopo +- Added a config option for npc retexturing - nopo +- Added a config option for dirt wand overlay - nopo +- Added a config option for hoe of tilling - nopo +- Added an option to use short numbers (1.5mil) for price tooltips - nopo - Added Drills and Gauntlet to the itemlist tools category - jani -- 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 an option to turn off showing next click in chronomatron - nopo +- Turns off inv search mode after 2 minutes - nopo +- Made /neustats modlist show normal /neustats if under 15 mods - nopo - Added max enchant book and max attribute shard to /neuec - Dokm -- Fixed pet overlay not resetting pet when making new profile +- Fixed pet overlay not resetting pet when making new profile - nopo - Added a warning in the tooltip when price info couldn't be found/is outdated - Lulonaut -- Added "Has Advanced Tab" to /neustats +- Added "Has Advanced Tab" to /neustats - nopo - Added custom runes and crab hat system - jani -- Removed unused textures +- Removed unused textures - nopo - 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 - Added custom biomes for crystal hollow areas - nopo - Added a config option to hide the reforge stats for Legendary items from Hypixel on reforge stones - Lulonaut -- Added an option to alert you if you put something for too much onto ah (default 50%) -- Lowest bin alert triggers if lowest bin isnt found +- Added an option to alert you if you put something for too much onto ah (default 50%) - nopo +- Lowest bin alert triggers if lowest bin isnt found - nopo - Crystal Hollows crystal states are now updated when the Heart of the Mountain menu is opened - CraftyOldMiner - Added /neudiag command to enable/disable debug logging and dump diagnostic data - CraftyOldMiner - Added NBT data to Profile Viewer HOTM tree icons - whalker @@ -90,9 +90,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 6-10 stars to the auction search overlay - nopo +- Added 6-10 stars to /neucustomize - nopo +- Added support for attributes in neuec - nopo - Added Heavy Pearls to todo overlay - cobble8 - Added Booster Cookie Warning - 2stinkysocks - Added an option to only search for Level 100 pets in the auction house search overlay - Lulonaut @@ -100,31 +100,32 @@ ### **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) -- Made etherwarp block overlay config option +- Made titanium overlay and waypoints work with dwarven overlay off - nopo +- "fixed" divan rarity in NEUAH (scuffed) - nopo +- Made etherwarp block overlay config option - nopo - Fixed ram usage in crystal hollows - Dokm -- Made skills not show int limit when at max level in skill overlays +- Made skills not show int limit when at max level in skill overlays - nopo - Fixed space cape texture - Microcontrollers -- Make it so you can hold down keys in sign GUIs -- Added entrance to "floor one" + made blur limit at 100 -- Fixed screenshot key in /et overlay -- Fixed api key autofill with dg copy chat feature -- Made missing enchants not show on an item if its not missing any enchants +- Make it so you can hold down keys in sign GUIs - nopo +- Added entrance to "floor one" + made blur limit at 100 - nopo +- Fixed screenshot key in /et overlay - nopo +- Fixed api key autofill with dg copy chat feature - nopo +- Made missing enchants not show on an item if its not missing any enchants - nopo - Fixed Mining overlay 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 fetchur for the 75th time - nopo +- [Made an error if you have new tab list off](https://cdn.discordapp.com/attachments/896407218151366687/913681097605398528/unknown.png) - nopo +- Fixed lava fishing with the fishing alert - nopo - 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 - nopo - Fixed /neuec presets not applying the strikethrough attribute - Lulonaut -- Fixed what hypxiel broke in dungeons +- Fixed what hypxiel broke in dungeons - nopo - Fixed the dungeon map on f1 - Minikloon -- Added checks for chat messages for dungeon win overlay -- Fixed some vanilla Minecraft keybinds not working in NEU GUIs +- Added checks for chat messages for dungeon win overlay - nopo +- Fixed some vanilla Minecraft keybinds not working in NEU GUIs - nopo - Fixed crash with spamming remove enchant in /neuec +- Fixed missing enchants not working with shiny items - nopo ### **Other:** @@ -139,4 +140,4 @@ ### **Previous change log** -https://github.com/NotEnoughUpdates/NotEnoughUpdates/blob/master/Update%20Notes/2.0-Pre31-Release.md \ No newline at end of file +https://github.com/NotEnoughUpdates/NotEnoughUpdates/blob/master/Update%20Notes/2.0-Pre31-Release.md 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 fab02bf9..e7da8628 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java @@ -155,7 +155,7 @@ public class ItemTooltipListener { for (int j = 0; j < Utils.rarityArrC.length; j++) { for (Map.Entry entry : enchantsObj.entrySet()) { if (line.contains(Utils.rarityArrC[j] + " " + entry.getKey()) || line.contains( - Utils.rarityArrC[j] + " DUNGEON " + entry.getKey())) { + Utils.rarityArrC[j] + " DUNGEON " + entry.getKey()) || line.contains("SHINY " + Utils.rarityArrC[j].replaceAll("§.§.","") + " DUNGEON " + entry.getKey())) { allItemEnchs = entry.getValue().getAsJsonArray(); break out; } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFishingPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFishingPage.java index 6063dee0..ece6f275 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFishingPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFishingPage.java @@ -114,6 +114,7 @@ public class TrophyFishingPage { private static final ResourceLocation TROPHY_FISH_TEXTURE = new ResourceLocation( "notenoughupdates:pv_trophy_fish_tab.png"); + public static final ResourceLocation pv_elements = new ResourceLocation("notenoughupdates:pv_elements.png"); private static final Map trophyFishList = new HashMap<>(); private static final Map total = new HashMap<>(); @@ -197,18 +198,30 @@ public class TrophyFishingPage { ); ArrayList arrayList = new ArrayList<>(trophyFishList.values()); - arrayList.sort((c1, c2) -> { - if (c1.getTotal() > c2.getTotal()) return -1; - if (c1.getTotal() < c2.getTotal()) return 1; - return 0; - }); + arrayList.sort((c1, c2) -> Integer.compare(c2.getTotal(), c1.getTotal())); int x; int y; for (TrophyFish value : arrayList) { - RenderHelper.enableGUIStandardItemLighting(); x = guiLeft + slotLocations.get(arrayList.indexOf(value)).getLeft(); y = guiTop + slotLocations.get(arrayList.indexOf(value)).getRight(); + RenderHelper.enableGUIStandardItemLighting(); + Minecraft.getMinecraft().getTextureManager().bindTexture(pv_elements); + Map trophyFishRarityIntegerMap = value.getTrophyFishRarityIntegerMap(); + if (trophyFishRarityIntegerMap.containsKey(TrophyFish.TrophyFishRarity.BRONZE)) { + GlStateManager.color(255/255f, 130/255f, 0/255f, 1); + } + if (trophyFishRarityIntegerMap.containsKey(TrophyFish.TrophyFishRarity.SILVER)) { + GlStateManager.color(192/255f, 192/255f, 192/255f, 1); + } + if (trophyFishRarityIntegerMap.containsKey(TrophyFish.TrophyFishRarity.GOLD)) { + GlStateManager.color(1, 0.82F, 0, 1); + } + if (trophyFishRarityIntegerMap.containsKey(TrophyFish.TrophyFishRarity.DIAMOND)) { + GlStateManager.color(31/255f, 216/255f, 241/255f, 1); + } + Utils.drawTexturedRect(x - 2 , y - 2, 20, 20, 0, 20 / 256f, 0, 20 / 256f, GL11.GL_NEAREST); + GlStateManager.color(1, 1, 1, 1); Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI( getItem(value.getName()), x, @@ -255,9 +268,11 @@ public class TrophyFishingPage { -1, Minecraft.getMinecraft().fontRendererObj ); + GlStateManager.color(1, 1, 1, 1); } - } + Minecraft.getMinecraft().getTextureManager().bindTexture(pv_elements); + Utils.drawTexturedRect(x - 2 , y - 2, 20, 20, 0, 20 / 256f, 0, 20 / 256f, GL11.GL_NEAREST); } } diff --git a/src/main/resources/assets/notenoughupdates/pv_trophy_fish_tab.png b/src/main/resources/assets/notenoughupdates/pv_trophy_fish_tab.png index 669bc489..d42446c1 100644 Binary files a/src/main/resources/assets/notenoughupdates/pv_trophy_fish_tab.png and b/src/main/resources/assets/notenoughupdates/pv_trophy_fish_tab.png differ -- cgit From 39983fc847e2ee34aca9ccf14c833fbcb281fa2e Mon Sep 17 00:00:00 2001 From: jani270 <69345714+jani270@users.noreply.github.com> Date: Tue, 28 Jun 2022 14:46:52 +0200 Subject: A few changes (#176) --- README.md | 1 - Update Notes/2.1.md | 62 +++++++++++----------- .../profileviewer/GuiProfileViewer.java | 9 ---- 3 files changed, 32 insertions(+), 40 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/README.md b/README.md index 4249abc8..1dc49f19 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,6 @@ NotEnoughUpdates (NEU) is a feature rich 1.8.9 Minecraft forge mod for Hypixel S ## Features - An [item list](https://github.com/NotEnoughUpdates/NotEnoughUpdates-REPO) containing information and recipes about every item in skyblock. -- A dungeons minimap. - Dungeon loot profit checker. - Item overlays for Treecapitator, Builder's Wand, Block Zapper, and Bonemerang. - An in-game skyblock profile viewer accessed with `/pv [player]`. diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 6b95d546..7a3a069f 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -8,6 +8,7 @@ - Added slayer overlay - nopo - 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) + - Made it if you hold shift in the enchant solvers it overrides prevent missclicks - nopo - Fixed pet overlay not updating when going into /pets - nopo - [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 - nopo @@ -16,11 +17,11 @@ - 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 - Added and fixed various things in the profile viewer: - - [Added mining tab](https://cdn.discordapp.com/attachments/832652653292027904/903619242384056370/unknown.png) - nopo + - [Added hotm tab](https://media.discordapp.net/attachments/659613194066722833/991115131507441724/unknown.png) - nopo - Big thanks to kwev1n for some math and jani for the texture - - [Added bingo tab](https://cdn.discordapp.com/attachments/702456294874808330/951909539383500820/unknown.png) - Lulonaut + - [Added bingo tab](https://media.discordapp.net/attachments/659613194066722833/991115625772625980/unknown.png) - Lulonaut - [Added bingo and Stranded profile icons to /pv](https://cdn.discordapp.com/attachments/832652653292027904/915844465372065842/unknown.png) - nopo - - Added trophy fishing tab - efefury + - [Added trophy fishing tab](https://media.discordapp.net/attachments/659613194066722833/991114639150698567/unknown.png) - efefury - Added equipment - nopo - Added blaze slayer level and kills - nopo - Added social level - nopo @@ -34,34 +35,35 @@ ### **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 +- Added built-in recipes for forge crafts - nea89 +- Added mob drop viewer in the recipe viewer - nea89 +- Added stranded villager trades to the item list - nea89 +- Added npc shop trades in the recipe viewer - nea89 - Added a config option to hide Dwarven Mines waypoints when already at the location - Lulonaut - Added some info panels to some settings in /neu - nopo - Added Kat Level After Upgrade Estimator - nea89 - Added pitch and coins/m as options in farming skill overlay - nopo - 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) - nopo -- Fairy soul beacons now change color based on their distance -- Separated settings for fairy soul tracking from showing beacons. Tracking is turned on by default. - Added fairy souls option to /neu misc - nopo + - Added separated settings for fairy soul tracking from showing beacons. Tracking is turned on by default. - CraftyOldMiner +- Added fairy souls beacons changing color based on their distance - CraftyOldMiner - Make it so fairy souls are tracked independently for each profile - Lulonaut - Added a button in the storage gui to open the settings - nopo - Added an option to change the click names for /pv to /ah - nopo -- Added a help menu to /neuec +- Added a help menu to /neuec - nopo - Made it so treecap shows foraging xp instead of farming xp on the farming overlay - nopo - Made it so a jungle axe with cult will show the "farming" overlay - nopo -- 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 - nopo - Changed misc overlays tab to todo overlays - nopo - Added a config option for npc retexturing - nopo - Added a config option for dirt wand overlay - nopo - Added a config option for hoe of tilling - nopo +- Added a config option for etherwarp block overlay - nopo - Added an option to use short numbers (1.5mil) for price tooltips - nopo -- Added Drills and Gauntlet to the itemlist tools category - jani +- Added Drills, Gauntlets and Flares to the itemlist tools category - jani - Added an option to turn off showing next click in chronomatron - nopo -- Turns off inv search mode after 2 minutes - nopo +- Made inv search mode automatically turn off after 2 minutes - nopo - Made /neustats modlist show normal /neustats if under 15 mods - nopo - Added max enchant book and max attribute shard to /neuec - Dokm - Fixed pet overlay not resetting pet when making new profile - nopo @@ -78,9 +80,6 @@ - Lowest bin alert triggers if lowest bin isnt found - nopo - Crystal Hollows crystal states are now updated when the Heart of the Mountain menu is opened - CraftyOldMiner - Added /neudiag command to enable/disable debug logging and dump diagnostic data - CraftyOldMiner -- Added NBT data to Profile Viewer HOTM tree icons - whalker -- Added NBT data to Profile Viewer Tab Icons - whalker -- Added NBT data to Profile Viewer XP Bar Icons - whalker - Added Blaze Slayer information - whalker - Added subcommand to /neupackdev allowing you to get NBT data from nearby mob(s) - whalker - Added subcommand to /neupackdev allowing you to get NBT data from nearby armor stand(s) - whalker @@ -89,42 +88,38 @@ - Added a subcommand to /neupackdev to get the NBT of the closest mob, armor stand, and npc in a radius in the loaded world - whalker - 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 - nopo - Added 6-10 stars to /neucustomize - nopo - Added support for attributes in neuec - nopo -- Added Heavy Pearls to todo overlay - cobble8 +- Added Heavy Pearls to todo overlay - Cobble8 - Added Booster Cookie Warning - 2stinkysocks - Added an option to only search for Level 100 pets in the auction house search overlay - Lulonaut +- [Added an error if you have new tab list off](https://cdn.discordapp.com/attachments/896407218151366687/913681097605398528/unknown.png) - nopo +- Added Fishing Timer over bobber - nea89 ### **Bug Fixes:** -- Fix wiki pages freezing the entire game - nea89 -- Made titanium overlay and waypoints work with dwarven overlay off - nopo +- Fixed wiki pages freezing the entire game - nea89 +- Fixed titanium overlay and waypoints working while having dwarven overlay disabled - nopo - "fixed" divan rarity in NEUAH (scuffed) - nopo -- Made etherwarp block overlay config option - nopo -- Fixed ram usage in crystal hollows - Dokm +- Fixed ram usage in crystal hollows - DokM - Made skills not show int limit when at max level in skill overlays - nopo - Fixed space cape texture - Microcontrollers - Make it so you can hold down keys in sign GUIs - nopo -- Added entrance to "floor one" + made blur limit at 100 - nopo -- Fixed screenshot key in /et overlay - nopo - Fixed api key autofill with dg copy chat feature - nopo - Made missing enchants not show on an item if its not missing any enchants - nopo -- Fixed Mining overlay crash - Dokm -- Fixed pet crash - Dokm +- Fixed Mining overlay crash - DokM +- Fixed pet crash - DokM - Fixed fetchur for the 75th time - nopo -- [Made an error if you have new tab list off](https://cdn.discordapp.com/attachments/896407218151366687/913681097605398528/unknown.png) - nopo -- Fixed lava fishing with the fishing alert - nopo +- Fixed fishing alert triggering a bit to early / not working with lava fishing - nopo & nea89 - 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 - nopo - Fixed /neuec presets not applying the strikethrough attribute - Lulonaut -- Fixed what hypxiel broke in dungeons - nopo -- Fixed the dungeon map on f1 - Minikloon +- Fixed dungeon detection - nopo - Added checks for chat messages for dungeon win overlay - nopo - Fixed some vanilla Minecraft keybinds not working in NEU GUIs - nopo -- Fixed crash with spamming remove enchant in /neuec +- Fixed crash with spamming remove enchant in /neuec - nopo - Fixed missing enchants not working with shiny items - nopo ### **Other:** @@ -137,6 +132,13 @@ - Code Cleanup - IRONM00N - Renamed Keebler408 to CraftyOldMiner - Added JUnit unit tests for metal detector and wishing compass solver +- Custom biome names for crystal hollows: + - NeucrystalHollowsPrecursorRemnants + - NeucrystalHollowsMithrilDeposit + - NeucrystalHollowsGoblinHoldout + - NeucrystalHollowsJungle + - NeucrystalHollowsMagmaFields + - NeucrystalHollowsCrystalNucleus ### **Previous change log** 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 fef2868c..af56ec1f 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java @@ -3481,8 +3481,6 @@ public class GuiProfileViewer extends GuiScreen { Utils.getElementAsFloat(Utils.getElement(profileInfo, "stats.items_fished_treasure"), 0); float items_fished_large_treasure = Utils.getElementAsFloat(Utils.getElement(profileInfo, "stats.items_fished_large_treasure"), 0); - float items_fished_trophy_fish = - Utils.getElementAsFloat(Utils.getElement(profileInfo, "stats.items_fished_trophy_fish"), 0); Utils.renderAlignedString( EnumChatFormatting.GREEN + "Ores Mined", @@ -3520,13 +3518,6 @@ public class GuiProfileViewer extends GuiScreen { guiTop + yStartTop + yOffset * 5, 76 ); - Utils.renderAlignedString( - EnumChatFormatting.GREEN + "Trophy Fish Fished", - EnumChatFormatting.WHITE.toString() + (int) items_fished_trophy_fish, - guiLeft + xStart + xOffset * 2, - guiTop + yStartTop + yOffset * 6, - 76 - ); if (topKills == null) { topKills = new TreeMap<>(); -- cgit From a2ad09ee13cee2ef70268336b9df41368574f45a Mon Sep 17 00:00:00 2001 From: Roman / Nea Date: Thu, 7 Jul 2022 18:07:08 +0200 Subject: Added a calculator (#180) * Added a calculator * Remove stuff * also add t * Update Misc.java * On by default * add x for multiplication, fixed - not working and quick math solver Co-authored-by: nopo --- Update Notes/2.1.md | 1 + .../notenoughupdates/NotEnoughUpdates.java | 3 +- .../notenoughupdates/commands/Commands.java | 2 + .../commands/help/HelpCommand.java | 1 + .../commands/misc/CalculatorCommand.java | 72 +++++ .../notenoughupdates/events/SignSubmitEvent.java | 40 +++ .../notenoughupdates/listener/ChatListener.java | 8 + .../notenoughupdates/miscgui/SignCalculator.java | 107 ++++++++ .../notenoughupdates/mixins/MixinGuiEditSign.java | 50 ++++ .../options/seperateSections/Misc.java | 8 + .../notenoughupdates/util/Calculator.java | 300 +++++++++++++++++++++ src/main/resources/mixins.notenoughupdates.json | 7 +- .../notenoughupdates/util/CalculatorTest.java | 41 +++ 13 files changed, 638 insertions(+), 2 deletions(-) create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/commands/misc/CalculatorCommand.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/events/SignSubmitEvent.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscgui/SignCalculator.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiEditSign.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/util/Calculator.java create mode 100644 src/test/java/io/github/moulberry/notenoughupdates/util/CalculatorTest.java (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 7a3a069f..81ead5ec 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -16,6 +16,7 @@ - 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 +- Added a calculator (/neucalc help), that also works in the auction house / bazaar - nea89o - Added and fixed various things in the profile viewer: - [Added hotm tab](https://media.discordapp.net/attachments/659613194066722833/991115131507441724/unknown.png) - nopo - Big thanks to kwev1n for some math and jani for the texture diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index bd54dfba..d372602e 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -57,6 +57,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.miscgui.SignCalculator; import io.github.moulberry.notenoughupdates.mixins.AccessorMinecraft; import io.github.moulberry.notenoughupdates.options.NEUConfig; import io.github.moulberry.notenoughupdates.overlays.FuelBar; @@ -277,7 +278,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(new SignCalculator()); MinecraftForge.EVENT_BUS.register(navigation); if (Minecraft.getMinecraft().getResourceManager() instanceof IReloadableResourceManager) { 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 86411f4f..b152bc09 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/commands/Commands.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/Commands.java @@ -37,6 +37,7 @@ 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.CalculatorCommand; import io.github.moulberry.notenoughupdates.commands.misc.CalendarCommand; import io.github.moulberry.notenoughupdates.commands.misc.CosmeticsCommand; import io.github.moulberry.notenoughupdates.commands.misc.CustomizeCommand; @@ -91,6 +92,7 @@ public class Commands { ClientCommandHandler.instance.registerCommand(new ScreenCommand("neuoverlay", NEUOverlayPlacements::new)); //ClientCommandHandler.instance.registerCommand(new ScreenCommand("neututorial", NeuTutorial::new)); ClientCommandHandler.instance.registerCommand(new AhCommand()); + ClientCommandHandler.instance.registerCommand(new CalculatorCommand()); ClientCommandHandler.instance.registerCommand(new CalendarCommand()); // Fairy Soul Commands 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 ba49221e..a52fcd1d 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 @@ -52,6 +52,7 @@ public class HelpCommand extends ClientCommandBase { "\u00a76/neuah \u00a7r\u00a77- Opens neu's custom ah GUI.", "\u00a76/neumap \u00a7r\u00a77- Opens the dungeon map GUI.", "\u00a76/neucalendar \u00a7r\u00a77- Opens neu's custom calendar GUI.", + "\u00a76/neucalc \u00a7r\u00a77- Run calculations.", "", "\u00a76\u00a7lOld commands:", "\u00a76/peek \u00a7b?{user} \u00a72\u2D35 \u00a7r\u00a77- Shows quickly stats for a user.", diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/CalculatorCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/CalculatorCommand.java new file mode 100644 index 00000000..e73e3b32 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/CalculatorCommand.java @@ -0,0 +1,72 @@ +/* + * 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; +import io.github.moulberry.notenoughupdates.util.Calculator; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +public class CalculatorCommand extends ClientCommandBase { + public CalculatorCommand() { + super("neucalc"); + } + + @Override + public List getCommandAliases() { + return Arrays.asList("neucalculator"); + } + + @Override + public void processCommand(ICommandSender sender, String[] args) throws CommandException { + if ((args.length == 1 && Objects.equals(args[0], "help")) || args.length == 0) { + sender.addChatMessage(new ChatComponentText( + "\n§e[NEU] §5Its a calculator.\n" + + "§eFor Example §b/neucalc 3m*7k§e.\n" + + "§eYou can also use suffixes (k, m, b, t, s)§e.\n" + + "§eThe \"s\" suffix acts as 64.\n" + + "§eTurn on Sign Calculator in /neu misc to also support this in sign popups.\n")); + return; + } + String source = String.join(" ", args); + try { + BigDecimal calculate = Calculator.calculate(source); + sender.addChatMessage(new ChatComponentText( + EnumChatFormatting.YELLOW + "[NEU] " + EnumChatFormatting.WHITE + source + " = " + EnumChatFormatting.GREEN + + calculate.toPlainString() + )); + } catch (Calculator.CalculatorException e) { + sender.addChatMessage(new ChatComponentText( + EnumChatFormatting.YELLOW + "[NEU] " + EnumChatFormatting.RED + "Error during calculation: " + + e.getMessage() + "\n" + + EnumChatFormatting.WHITE + source.substring(0, e.getOffset()) + EnumChatFormatting.DARK_RED + + source.substring(e.getOffset(), e.getLength() + e.getOffset()) + EnumChatFormatting.GRAY + + source.substring(e.getLength() + e.getOffset()) + )); + } + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/events/SignSubmitEvent.java b/src/main/java/io/github/moulberry/notenoughupdates/events/SignSubmitEvent.java new file mode 100644 index 00000000..9bc7b8b0 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/events/SignSubmitEvent.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2022 NotEnoughUpdates contributors + * + * This file is part of NotEnoughUpdates. + * + * NotEnoughUpdates is free software: you can redistribute it + * and/or modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * NotEnoughUpdates is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with NotEnoughUpdates. If not, see . + */ + +package io.github.moulberry.notenoughupdates.events; + +import net.minecraft.client.gui.inventory.GuiEditSign; + +public class SignSubmitEvent extends NEUEvent { + public final GuiEditSign sign; + public final String[] lines; + + public SignSubmitEvent(GuiEditSign sign, String[] hehe) { + this.sign = sign; + this.lines = hehe; + } + + public GuiEditSign getSign() { + return sign; + } + + public String[] getLines() { + return lines; + } +} 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 0aade4b0..457042ee 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java @@ -35,6 +35,7 @@ import net.minecraft.util.ChatComponentText; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IChatComponent; +import net.minecraftforge.client.ClientCommandHandler; import net.minecraftforge.client.event.ClientChatReceivedEvent; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -213,6 +214,13 @@ public class ChatListener { SlayerOverlay.unloadOverlayTimer = System.currentTimeMillis(); } else if (unformatted.startsWith("You consumed a Booster Cookie!")) { CookieWarning.resetNotification(); + } else if (unformatted.startsWith("QUICK MATHS! Solve:")) { + if (Math.random() < 0.2) { + ClientCommandHandler.instance.executeCommand( + Minecraft.getMinecraft().thePlayer, + "/neucalc " + unformatted.substring("QUICK MATHS! Solve: ".length()) + ); + } } 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/miscgui/SignCalculator.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/SignCalculator.java new file mode 100644 index 00000000..115458c9 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/SignCalculator.java @@ -0,0 +1,107 @@ +/* + * 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.miscgui; + +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.events.SignSubmitEvent; +import io.github.moulberry.notenoughupdates.mixins.AccessorGuiEditSign; +import io.github.moulberry.notenoughupdates.util.Calculator; +import io.github.moulberry.notenoughupdates.util.Utils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.inventory.GuiEditSign; +import net.minecraft.tileentity.TileEntitySign; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.client.event.GuiScreenEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +import java.math.BigDecimal; +import java.util.Objects; + +public class SignCalculator { + + String lastSource = null; + BigDecimal lastResult = null; + Calculator.CalculatorException lastException = null; + + private boolean isEnabled() { + return NotEnoughUpdates.INSTANCE.config.misc.calculationMode != 0; + } + + @SubscribeEvent + public void onSignDrawn(GuiScreenEvent.DrawScreenEvent.Post event) { + if (!(event.gui instanceof GuiEditSign)) + return; + if (!isEnabled()) return; + GuiEditSign guiEditSign = (GuiEditSign) event.gui; + TileEntitySign tileSign = ((AccessorGuiEditSign) guiEditSign).getTileSign(); + if (!tileSign.signText[1].getUnformattedText().equals("^^^^^^^^^^^^^^^")) return; + refresh(tileSign.signText[0].getUnformattedText()); + Utils.drawStringCentered( + getRenderedString(), + Minecraft.getMinecraft().fontRendererObj, + guiEditSign.width / 2F, + guiEditSign.height / 4F - 120, + false, + 0x808080FF + ); + } + + @SubscribeEvent + public void onSignSubmitted(SignSubmitEvent event) { + if (!isEnabled()) return; + if (Objects.equals(event.lines[1], "^^^^^^^^^^^^^^^")) { + refresh(event.lines[0]); + if (lastResult != null) { + event.lines[0] = lastResult.toPlainString(); + } + } + } + + public String getRenderedString() { + if (lastResult != null) { + String lr = lastResult.toPlainString(); + if (Minecraft.getMinecraft().fontRendererObj.getStringWidth(lr) > 90) { + return EnumChatFormatting.WHITE + lastSource + " = " + EnumChatFormatting.RED + "Result too long"; + } + return EnumChatFormatting.WHITE + lastSource + " = " + EnumChatFormatting.GREEN + lr; + } else if (lastException != null) { + return EnumChatFormatting.RED + lastException.getMessage(); + } + return EnumChatFormatting.RED + "No calculation has been done."; + } + + private void refresh(String source) { + if (Objects.equals(source, lastSource)) return; + lastSource = source; + int calculationMode = NotEnoughUpdates.INSTANCE.config.misc.calculationMode; + if (source.isEmpty() || calculationMode == 0 || (calculationMode == 1 && !source.startsWith("!"))) { + lastResult = null; + lastException = null; + return; + } + try { + lastResult = Calculator.calculate(calculationMode == 1 ? source.substring(1) : source); + lastException = null; + } catch (Calculator.CalculatorException ex) { + lastException = ex; + lastResult = null; + } + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiEditSign.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiEditSign.java new file mode 100644 index 00000000..bfdf05ab --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiEditSign.java @@ -0,0 +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.mixins; + +import io.github.moulberry.notenoughupdates.events.SignSubmitEvent; +import net.minecraft.client.gui.inventory.GuiEditSign; +import net.minecraft.tileentity.TileEntitySign; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.IChatComponent; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(GuiEditSign.class) +public class MixinGuiEditSign { + + @Redirect(method = "onGuiClosed", at = @At(value = "FIELD", opcode = Opcodes.GETFIELD, target = "Lnet/minecraft/tileentity/TileEntitySign;signText:[Lnet/minecraft/util/IChatComponent;")) + public IChatComponent[] onOnGuiClosed(TileEntitySign instance) { + String[] x = new String[4]; + for (int i = 0; i < 4; i++) { + x[i] = instance.signText[i].getUnformattedText(); + } + SignSubmitEvent signSubmitEvent = new SignSubmitEvent((GuiEditSign) (Object) this, x); + signSubmitEvent.post(); + IChatComponent[] arr = new IChatComponent[4]; + for (int i = 0; i < 4; i++) { + arr[i] = new ChatComponentText(signSubmitEvent.lines[i]); + } + return arr; + } + +} 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 c0f4e8c9..08ae5745 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 @@ -215,4 +215,12 @@ public class Misc { @ConfigEditorBoolean public boolean warpTwice = true; + @Expose + @ConfigOption( + name = "Sign Calculator", + desc = "§7Replace calculations like §9\"1+2\"§7 with the calculation result in sign popups (AH/BZ)" + ) + @ConfigEditorDropdown(values = {"Off", "Enabled with ! Prefix", "Always enabled"}) + public int calculationMode = 2; + } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/Calculator.java b/src/main/java/io/github/moulberry/notenoughupdates/util/Calculator.java new file mode 100644 index 00000000..45d7c051 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/Calculator.java @@ -0,0 +1,300 @@ +/* + * 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.util; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Deque; +import java.util.List; +import java.util.NoSuchElementException; + +public class Calculator { + public static BigDecimal calculate(String source) throws CalculatorException { + return evaluate(shuntingYard(lex(source))); + } + + /// + public enum TokenType { + NUMBER, BINOP, LPAREN, RPAREN, POSTOP + } + + public static class Token { + public TokenType type; + String operatorValue; + long numericValue; + int exponent; + int tokenStart; + int tokenLength; + } + + static String binops = "+-*/x"; + static String postops = "mkbts"; + static String digits = "0123456789"; + + static void readDigitsInto(Token token, String source, boolean decimals) { + int startIndex = token.tokenStart + token.tokenLength; + for (int j = 0; j + startIndex < source.length(); j++) { + char d = source.charAt(j + startIndex); + int d0 = digits.indexOf(d); + if (d0 != -1) { + if (decimals) + token.exponent--; + token.numericValue *= 10; + token.numericValue += d0; + token.tokenLength += 1; + } else { + return; + } + } + } + + public static class CalculatorException extends Exception { + int offset, length; + + public CalculatorException(String message, int offset, int length) { + super(message); + this.offset = offset; + this.length = length; + } + + public int getLength() { + return length; + } + + public int getOffset() { + return offset; + } + } + + public static List lex(String source) throws CalculatorException { + List tokens = new ArrayList<>(); + for (int i = 0; i < source.length(); ) { + char c = source.charAt(i); + if (Character.isWhitespace(c)) { + i++; + continue; + } + Token token = new Token(); + token.tokenStart = i; + if (binops.indexOf(c) != -1) { + token.tokenLength = 1; + token.type = TokenType.BINOP; + token.operatorValue = c + ""; + } else if (postops.indexOf(c) != -1) { + token.tokenLength = 1; + token.type = TokenType.POSTOP; + token.operatorValue = c + ""; + } else if (c == ')') { + token.tokenLength = 1; + token.type = TokenType.RPAREN; + token.operatorValue = ")"; + } else if (c == '(') { + token.tokenLength = 1; + token.type = TokenType.LPAREN; + token.operatorValue = "("; + } else if ('.' == c) { + token.tokenLength = 1; + token.type = TokenType.NUMBER; + readDigitsInto(token, source, true); + if (token.tokenLength == 1) { + throw new CalculatorException("Invalid number literal", i, 1); + } + } else if (digits.indexOf(c) != -1) { + token.type = TokenType.NUMBER; + readDigitsInto(token, source, false); + if (i + token.tokenLength < source.length()) { + char p = source.charAt(i + token.tokenLength); + if ('.' == p) { + token.tokenLength++; + readDigitsInto(token, source, true); + } + } + } else { + throw new CalculatorException("Unknown thing " + c, i, 1); + } + tokens.add(token); + i += token.tokenLength; + } + return tokens; + } + /// + + /// + static int getPrecedence(Token token) throws CalculatorException { + switch (token.operatorValue.intern()) { + case "+": + case "-": + return 0; + case "*": + case "/": + case "x": + return 1; + } + throw new CalculatorException("Unknown operator " + token.operatorValue, token.tokenStart, token.tokenLength); + } + + public static List shuntingYard(List toShunt) throws CalculatorException { + // IT'S SHUNTING TIME + // This is an implementation of the shunting yard algorithm + + Deque op = new ArrayDeque<>(); + List out = new ArrayList<>(); + + for (Token currentlyShunting : toShunt) { + switch (currentlyShunting.type) { + case NUMBER: + out.add(currentlyShunting); + break; + case BINOP: + int p = getPrecedence(currentlyShunting); + while (!op.isEmpty()) { + Token l = op.peek(); + if (l.type == TokenType.LPAREN) + break; + assert (l.type == TokenType.BINOP); + int pl = getPrecedence(l); + if (pl > p) { + out.add(op.pop()); + } else { + break; + } + } + op.push(currentlyShunting); + break; + case LPAREN: + op.push(currentlyShunting); + break; + case RPAREN: + while (1 > 0) { + if (op.isEmpty()) + throw new CalculatorException( + "Unbalanced right parenthesis", + currentlyShunting.tokenStart, + currentlyShunting.tokenLength + ); + Token l = op.pop(); + if (l.type == TokenType.LPAREN) { + break; + } + out.add(l); + } + break; + case POSTOP: + out.add(currentlyShunting); + break; + } + } + while (!op.isEmpty()) { + Token l = op.pop(); + if (l.type == TokenType.LPAREN) + throw new CalculatorException("Unbalanced left parenthesis", l.tokenStart, l.tokenLength); + out.add(l); + } + return out; + } + + /// + + /// + + public static BigDecimal evaluate(List rpnTokens) throws CalculatorException { + Deque values = new ArrayDeque<>(); + try { + for (Token command : rpnTokens) { + switch (command.type) { + case NUMBER: + values.push(new BigDecimal(command.numericValue).scaleByPowerOfTen(command.exponent)); + break; + case BINOP: + BigDecimal right = values.pop().setScale(2, RoundingMode.HALF_UP); + BigDecimal left = values.pop().setScale(2, RoundingMode.HALF_UP); + switch (command.operatorValue.intern()) { + case "x": + case "*": + values.push(left.multiply(right).setScale(2, RoundingMode.HALF_UP)); + break; + case "/": + try { + values.push(left.divide(right, RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP)); + } catch (ArithmeticException e) { + throw new CalculatorException("Encountered division by 0", command.tokenStart, command.tokenLength); + } + break; + case "+": + values.push(left.add(right).setScale(2, RoundingMode.HALF_UP)); + break; + case "-": + values.push(left.subtract(right).setScale(2, RoundingMode.HALF_UP)); + break; + default: + throw new CalculatorException( + "Unknown operation " + command.operatorValue, + command.tokenStart, + command.tokenLength + ); + } + break; + case LPAREN: + case RPAREN: + throw new CalculatorException( + "Did not expect unshunted token in RPN", + command.tokenStart, + command.tokenLength + ); + case POSTOP: + BigDecimal p = values.pop(); + switch (command.operatorValue.intern()) { + case "s": + values.push(p.multiply(new BigDecimal(64)).setScale(2, RoundingMode.HALF_UP)); + break; + case "k": + values.push(p.multiply(new BigDecimal(1_000)).setScale(2, RoundingMode.HALF_UP)); + break; + case "m": + values.push(p.multiply(new BigDecimal(1_000_000)).setScale(2, RoundingMode.HALF_UP)); + break; + case "b": + values.push(p.multiply(new BigDecimal(1_000_000_000)).setScale(2, RoundingMode.HALF_UP)); + break; + case "t": + values.push(p.multiply(new BigDecimal("1000000000000")).setScale(2, RoundingMode.HALF_UP)); + break; + default: + throw new CalculatorException( + "Unknown operation " + command.operatorValue, + command.tokenStart, + command.tokenLength + ); + } + break; + } + } + BigDecimal peek = values.pop(); + return peek.stripTrailingZeros(); + } catch (NoSuchElementException e) { + throw new CalculatorException("Unfinished expression", 0, 0); + } + } + + /// + +} diff --git a/src/main/resources/mixins.notenoughupdates.json b/src/main/resources/mixins.notenoughupdates.json index 63b8211b..8b1d4559 100644 --- a/src/main/resources/mixins.notenoughupdates.json +++ b/src/main/resources/mixins.notenoughupdates.json @@ -46,5 +46,10 @@ "MixinWorld", "MixinWorldClient" ], - "client": ["AccessorGuiContainer", "AccessorGuiEditSign", "AccessorMinecraft"] + "client": [ + "AccessorGuiContainer", + "AccessorGuiEditSign", + "AccessorMinecraft", + "MixinGuiEditSign" + ] } diff --git a/src/test/java/io/github/moulberry/notenoughupdates/util/CalculatorTest.java b/src/test/java/io/github/moulberry/notenoughupdates/util/CalculatorTest.java new file mode 100644 index 00000000..66ba5442 --- /dev/null +++ b/src/test/java/io/github/moulberry/notenoughupdates/util/CalculatorTest.java @@ -0,0 +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.util; + +import java.math.BigDecimal; +import java.util.List; + +public class CalculatorTest { + public static void main(String[] args) throws Calculator.CalculatorException { + List lex = Calculator.lex("10k + 3 * 4m"); + List shunted = Calculator.shuntingYard(lex); + for (Calculator.Token rawToken : shunted) { + System.out.printf( + "%s(%s)", + rawToken.type, + rawToken.operatorValue == null ? rawToken.numericValue + " * 10 ^ " + rawToken.exponent : rawToken.operatorValue + ); + } + System.out.println(); + BigDecimal evaluate = Calculator.evaluate(shunted); + System.out.println("Eval: " + evaluate); + } + +} -- cgit From 6e40cd5d2426eee681b091acc6e0822d4d7c45b5 Mon Sep 17 00:00:00 2001 From: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> Date: Fri, 8 Jul 2022 02:07:38 +1000 Subject: Added bestiary tab to pv (#177) * some progress - missing be mobs from crimson and dungeons * fix id's * works :tm: * working mobs levels (for hub and island because lazy * idk seems right * Added bestiary texture, fixed name bug, added changelog i hope i didnt mess up anything. * i did smth * use 2.1.md from master because yes * L europe * Finished be tab * hi im just putting it here because too lazy to open a pr for this k, thanks bye * unbelievable * fix crash * fix crash with old repo * stfu infer * europe wins * l o n g Co-authored-by: jani270 --- Update Notes/2.1.md | 3 +- .../notenoughupdates/ItemPriceInformation.java | 8 +- .../moulberry/notenoughupdates/NEUManager.java | 21 + .../notenoughupdates/NotEnoughUpdates.java | 3 + .../listener/ItemTooltipListener.java | 8 +- .../options/seperateSections/ProfileViewer.java | 3 +- .../profileviewer/CollectionPage.java | 338 ++++++ .../profileviewer/GuiProfileViewer.java | 292 +----- .../profileviewer/bestiary/BestiaryData.java | 1089 ++++++++++++++++++++ .../profileviewer/bestiary/BestiaryPage.java | 279 +++++ .../assets/notenoughupdates/pv_bestiary_tab.png | Bin 0 -> 628 bytes .../notenoughupdates/textures/gui/navigation.png | Bin 1028 -> 984 bytes 12 files changed, 1760 insertions(+), 284 deletions(-) create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/CollectionPage.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryData.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java create mode 100644 src/main/resources/assets/notenoughupdates/pv_bestiary_tab.png (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 81ead5ec..5ab5ec19 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -21,8 +21,9 @@ - [Added hotm tab](https://media.discordapp.net/attachments/659613194066722833/991115131507441724/unknown.png) - nopo - Big thanks to kwev1n for some math and jani for the texture - [Added bingo tab](https://media.discordapp.net/attachments/659613194066722833/991115625772625980/unknown.png) - Lulonaut - - [Added bingo and Stranded profile icons to /pv](https://cdn.discordapp.com/attachments/832652653292027904/915844465372065842/unknown.png) - nopo + - [Added bingo and stranded profile icons](https://cdn.discordapp.com/attachments/832652653292027904/915844465372065842/unknown.png) - nopo - [Added trophy fishing tab](https://media.discordapp.net/attachments/659613194066722833/991114639150698567/unknown.png) - efefury + - [Added bestiary tab](https://cdn.discordapp.com/attachments/832652653292027904/991927854776459324/unknown.png) - nopo - Added equipment - nopo - Added blaze slayer level and kills - nopo - Added social level - nopo diff --git a/src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java b/src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java index e1a3b3ee..4b5630bc 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java @@ -145,7 +145,7 @@ public class ItemPriceInformation { tooltip.add(EnumChatFormatting.DARK_GRAY + "[SHIFT show x" + shiftStackMultiplier + "]"); added = true; } - int bazaarBuyPrice = (int) bazaarInfo.get("avg_buy").getAsFloat() * stackMultiplier; + long bazaarBuyPrice = (long) bazaarInfo.get("avg_buy").getAsFloat() * stackMultiplier; tooltip.add(EnumChatFormatting.YELLOW.toString() + EnumChatFormatting.BOLD + "Bazaar Buy: " + EnumChatFormatting.GOLD + EnumChatFormatting.BOLD + (shortNumber && bazaarBuyPrice > 1000 ? Utils.shortNumberFormat(bazaarBuyPrice, 0) @@ -160,7 +160,7 @@ public class ItemPriceInformation { tooltip.add(EnumChatFormatting.DARK_GRAY + "[SHIFT show x" + shiftStackMultiplier + "]"); added = true; } - int bazaarSellPrice = (int) bazaarInfo.get("avg_sell").getAsFloat() * stackMultiplier; + long bazaarSellPrice = (long) bazaarInfo.get("avg_sell").getAsFloat() * stackMultiplier; tooltip.add(EnumChatFormatting.YELLOW.toString() + EnumChatFormatting.BOLD + "Bazaar Sell: " + EnumChatFormatting.GOLD + EnumChatFormatting.BOLD + (shortNumber && bazaarSellPrice > 1000 ? Utils.shortNumberFormat(bazaarSellPrice, 0) @@ -175,7 +175,7 @@ public class ItemPriceInformation { tooltip.add(EnumChatFormatting.DARK_GRAY + "[SHIFT show x" + shiftStackMultiplier + "]"); added = true; } - int bazaarInstantBuyPrice = (int) bazaarInfo.get("curr_buy").getAsFloat() * stackMultiplier; + long bazaarInstantBuyPrice = (long) bazaarInfo.get("curr_buy").getAsFloat() * stackMultiplier; tooltip.add(EnumChatFormatting.YELLOW.toString() + EnumChatFormatting.BOLD + "Bazaar Insta-Buy: " + EnumChatFormatting.GOLD + EnumChatFormatting.BOLD + (shortNumber && bazaarInstantBuyPrice > 1000 ? Utils.shortNumberFormat(bazaarInstantBuyPrice, 0) @@ -191,7 +191,7 @@ public class ItemPriceInformation { tooltip.add(EnumChatFormatting.DARK_GRAY + "[SHIFT show x" + shiftStackMultiplier + "]"); added = true; } - int bazaarInstantSellPrice = (int) bazaarInfo.get("curr_sell").getAsFloat() * stackMultiplier; + long bazaarInstantSellPrice = (long) bazaarInfo.get("curr_sell").getAsFloat() * stackMultiplier; tooltip.add(EnumChatFormatting.YELLOW.toString() + EnumChatFormatting.BOLD + "Bazaar Insta-Sell: " + EnumChatFormatting.GOLD + EnumChatFormatting.BOLD + (shortNumber && bazaarInstantSellPrice > 1000 ? Utils.shortNumberFormat( diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java index 18d756d8..cd0d08b5 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java @@ -662,6 +662,22 @@ public class NEUManager { return uuid; } + public String getSkullValueFromNBT(NBTTagCompound tag) { + if (tag != null && tag.hasKey("SkullOwner", 10)) { + NBTTagCompound ea = tag.getCompoundTag("SkullOwner"); + NBTTagCompound ea3 = tag.getCompoundTag("display"); + + if (ea.hasKey("Properties", 10)) { + NBTTagCompound ea2 = ea; + ea = ea.getCompoundTag("Properties"); + ea = ea.getTagList("textures", 10).getCompoundTagAt(0); + String name = ea3.getString("Name").replaceAll(" M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$", ""); + return "put(\"ID\", Utils.createSkull(EnumChatFormatting.AQUA + \"" + name + "\" ,\"" + ea2.getString("Id") + "\", \"" + ea.getString("Value") +"\"));"; + } + } + return null; + } + public String getInternalnameFromNBT(NBTTagCompound tag) { String internalname = null; if (tag != null && tag.hasKey("ExtraAttributes", 10)) { @@ -891,6 +907,11 @@ public class NEUManager { return json; } + public String getSkullValueForItem(ItemStack stack) { + if (stack == null) return null; + NBTTagCompound tag = stack.getTagCompound(); + return getSkullValueFromNBT(tag); + } public String getInternalNameForItem(ItemStack stack) { if (stack == null) return null; NBTTagCompound tag = stack.getTagCompound(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index d372602e..59e7c392 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -243,6 +243,9 @@ public class NotEnoughUpdates { if (config.profileViewer.pageLayout.size() == 8) { config.profileViewer.pageLayout.add(8); } + if (config.profileViewer.pageLayout.size() == 9) { + config.profileViewer.pageLayout.add(9); + } saveConfig(); } 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 e7da8628..1dc45cf8 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java @@ -26,6 +26,7 @@ import com.google.gson.JsonPrimitive; import com.mojang.authlib.GameProfile; import com.mojang.authlib.minecraft.MinecraftProfileTexture; import io.github.moulberry.notenoughupdates.ItemPriceInformation; +import io.github.moulberry.notenoughupdates.NEUManager; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.core.util.MiscUtils; import io.github.moulberry.notenoughupdates.miscfeatures.PetInfoOverlay; @@ -900,6 +901,11 @@ public class ItemTooltipListener { boolean k = Keyboard.isKeyDown(Keyboard.KEY_K); boolean m = Keyboard.isKeyDown(Keyboard.KEY_M); boolean n = Keyboard.isKeyDown(Keyboard.KEY_N); + boolean f = Keyboard.isKeyDown(Keyboard.KEY_F); + + if (!copied && f && NotEnoughUpdates.INSTANCE.config.hidden.dev) { + MiscUtils.copyToClipboard(NotEnoughUpdates.INSTANCE.manager.getSkullValueForItem(event.itemStack)); + } event.toolTip.add( EnumChatFormatting.AQUA + "Internal Name: " + EnumChatFormatting.GRAY + internal + EnumChatFormatting.GOLD + @@ -938,7 +944,7 @@ public class ItemTooltipListener { } } - copied = k || m || n; + copied = k || m || n || f; } } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java index 49385d02..ee1abf46 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ProfileViewer.java @@ -68,10 +68,11 @@ public class ProfileViewer { "\u00a7eMining", "\u00a7eBingo", "\u00a7eTrophy Fish", + "\u00a7eBestiary", }, allowDeleting = false ) - public List pageLayout = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8)); + public List pageLayout = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)); @Expose @ConfigOption( diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/CollectionPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/CollectionPage.java new file mode 100644 index 00000000..c15190a1 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/CollectionPage.java @@ -0,0 +1,338 @@ +/* + * 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.profileviewer; + +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.util.Constants; +import io.github.moulberry.notenoughupdates.util.Utils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.GL11; + +import java.awt.*; +import java.io.IOException; +import java.text.NumberFormat; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; + +public class CollectionPage { + + private static int guiLeft; + private static int guiTop; + private static int sizeX = 413; + private static int sizeY = 202; + public static final ResourceLocation pv_cols = new ResourceLocation("notenoughupdates:pv_cols.png"); + public static final ResourceLocation pv_elements = new ResourceLocation("notenoughupdates:pv_elements.png"); + private static final int COLLS_XCOUNT = 5; + private static final int COLLS_YCOUNT = 4; + private static final float COLLS_XPADDING = (190 - COLLS_XCOUNT * 20) / (float) (COLLS_XCOUNT + 1); + private static final float COLLS_YPADDING = (202 - COLLS_YCOUNT * 20) / (float) (COLLS_YCOUNT + 1); + private static final String[] romans = new String[]{ + "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", + "XII", "XIII", "XIV", "XV", "XVI", "XVII", "XIX", "XX" + }; + private static List tooltipToDisplay = null; + private static final NumberFormat numberFormat = NumberFormat.getInstance(Locale.US); + private static ItemStack selectedCollectionCategory = null; + public static void drawColsPage(int mouseX, int mouseY, int width, int height) { + guiLeft = GuiProfileViewer.getGuiLeft(); + guiTop = GuiProfileViewer.getGuiTop(); + Minecraft.getMinecraft().getTextureManager().bindTexture(pv_cols); + Utils.drawTexturedRect(guiLeft, guiTop, sizeX, sizeY, GL11.GL_NEAREST); + + JsonObject collectionInfo = GuiProfileViewer.getProfile().getCollectionInfo(GuiProfileViewer.getProfileId()); + if (collectionInfo == null) { + Utils.drawStringCentered( + EnumChatFormatting.RED + "Collection API not enabled!", + Minecraft.getMinecraft().fontRendererObj, + guiLeft + 134, + guiTop + 101, + true, + 0 + ); + return; + } + JsonObject resourceCollectionInfo = ProfileViewer.getResourceCollectionInformation(); + if (resourceCollectionInfo == null) return; + + int collectionCatSize = ProfileViewer.getCollectionCatToCollectionMap().size(); + int collectionCatYSize = (int) (162f / (collectionCatSize - 1 + 0.0000001f)); + { + int yIndex = 0; + for (ItemStack stack : ProfileViewer.getCollectionCatToCollectionMap().keySet()) { + if (selectedCollectionCategory == null) selectedCollectionCategory = stack; + Minecraft.getMinecraft().getTextureManager().bindTexture(pv_elements); + if (stack == selectedCollectionCategory) { + Utils.drawTexturedRect(guiLeft + 7, guiTop + 10 + collectionCatYSize * yIndex, 20, 20, + 20 / 256f, 0, 20 / 256f, 0, GL11.GL_NEAREST + ); + Utils.drawItemStackWithText( + stack, + guiLeft + 10, + guiTop + 13 + collectionCatYSize * yIndex, + "" + (yIndex + 1) + ); + } else { + Utils.drawTexturedRect(guiLeft + 7, guiTop + 10 + collectionCatYSize * yIndex, 20, 20, + 0, 20 / 256f, 0, 20 / 256f, GL11.GL_NEAREST + ); + Utils.drawItemStackWithText(stack, guiLeft + 9, guiTop + 12 + collectionCatYSize * yIndex, "" + (yIndex + 1)); + } + yIndex++; + } + } + + Utils.drawStringCentered( + selectedCollectionCategory.getDisplayName() + " Collections", + Minecraft.getMinecraft().fontRendererObj, + guiLeft + 134, + guiTop + 14, + true, + 4210752 + ); + + JsonObject minionTiers = collectionInfo.get("minion_tiers").getAsJsonObject(); + JsonObject collectionTiers = collectionInfo.get("collection_tiers").getAsJsonObject(); + JsonObject maxAmounts = collectionInfo.get("max_amounts").getAsJsonObject(); + JsonObject totalAmounts = collectionInfo.get("total_amounts").getAsJsonObject(); + JsonObject personalAmounts = collectionInfo.get("personal_amounts").getAsJsonObject(); + + List collections = ProfileViewer.getCollectionCatToCollectionMap().get(selectedCollectionCategory); + if (collections != null) { + for (int i = 0; i < collections.size(); i++) { + String collection = collections.get(i); + if (collection != null) { + ItemStack collectionItem = ProfileViewer.getCollectionToCollectionDisplayMap().get(collection); + if (collectionItem != null) { + int xIndex = i % COLLS_XCOUNT; + int yIndex = i / COLLS_XCOUNT; + + float x = 39 + COLLS_XPADDING + (COLLS_XPADDING + 20) * xIndex; + float y = 7 + COLLS_YPADDING + (COLLS_YPADDING + 20) * yIndex; + + String tierString; + int tier = (int) Utils.getElementAsFloat(collectionTiers.get(collection), 0); + if (tier > 20 || tier < 0) { + tierString = String.valueOf(tier); + } else { + tierString = romans[tier]; + } + float amount = Utils.getElementAsFloat(totalAmounts.get(collection), 0); + float maxAmount = Utils.getElementAsFloat(maxAmounts.get(collection), 0); + Color color = new Color(128, 128, 128, 255); + int tierStringColour = color.getRGB(); + float completedness = 0; + if (maxAmount > 0) { + completedness = amount / maxAmount; + } + completedness = Math.min(1, completedness); + if (maxAmounts.has(collection) && completedness >= 1) { + tierStringColour = new Color(255, 215, 0).getRGB(); + } + + GlStateManager.color(1, 1, 1, 1); + Minecraft.getMinecraft().getTextureManager().bindTexture(pv_elements); + Utils.drawTexturedRect(guiLeft + x, guiTop + y, 20, 20 * (1 - completedness), + 0, 20 / 256f, 0, 20 * (1 - completedness) / 256f, GL11.GL_NEAREST + ); + GlStateManager.color(1, 185 / 255f, 0, 1); + Minecraft.getMinecraft().getTextureManager().bindTexture(pv_elements); + Utils.drawTexturedRect(guiLeft + x, guiTop + y + 20 * (1 - completedness), 20, 20 * (completedness), + 0, 20 / 256f, 20 * (1 - completedness) / 256f, 20 / 256f, GL11.GL_NEAREST + ); + Utils.drawItemStack(collectionItem, guiLeft + (int) x + 2, guiTop + (int) y + 2); + + if (mouseX > guiLeft + (int) x + 2 && mouseX < guiLeft + (int) x + 18) { + if (mouseY > guiTop + (int) y + 2 && mouseY < guiTop + (int) y + 18) { + tooltipToDisplay = new ArrayList<>(); + tooltipToDisplay.add(collectionItem.getDisplayName() + " " + + (completedness >= 1 ? EnumChatFormatting.GOLD : EnumChatFormatting.GRAY) + tierString); + tooltipToDisplay.add( + "Collected: " + numberFormat.format(Utils.getElementAsFloat(personalAmounts.get(collection), 0))); + tooltipToDisplay.add("Total Collected: " + numberFormat.format(amount)); + } + } + + GlStateManager.color(1, 1, 1, 1); + if (tier >= 0) { + Utils.drawStringCentered(tierString, Minecraft.getMinecraft().fontRendererObj, + guiLeft + x + 10, guiTop + y - 4, true, + tierStringColour + ); + } + + Utils.drawStringCentered(GuiProfileViewer.shortNumberFormat(amount, 0) + "", Minecraft.getMinecraft().fontRendererObj, + guiLeft + x + 10, guiTop + y + 26, true, + color.getRGB() + ); + } + } + } + } + + Utils.drawStringCentered( + selectedCollectionCategory.getDisplayName() + " Minions", + Minecraft.getMinecraft().fontRendererObj, + guiLeft + 326, + guiTop + 14, + true, + 4210752 + ); + + List minions = ProfileViewer.getCollectionCatToMinionMap().get(selectedCollectionCategory); + if (minions != null) { + for (int i = 0; i < minions.size(); i++) { + String minion = minions.get(i); + if (minion != null) { + JsonObject misc = Constants.MISC; + float MAX_MINION_TIER = + Utils.getElementAsFloat(Utils.getElement(misc, "minions." + minion + "_GENERATOR"), 11); + + int tier = (int) Utils.getElementAsFloat(minionTiers.get(minion), 0); + JsonObject minionJson; + if (tier == 0) { + minionJson = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(minion + "_GENERATOR_1"); + } else { + minionJson = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(minion + "_GENERATOR_" + tier); + } + + if (minionJson != null) { + int xIndex = i % COLLS_XCOUNT; + int yIndex = i / COLLS_XCOUNT; + + float x = 231 + COLLS_XPADDING + (COLLS_XPADDING + 20) * xIndex; + float y = 7 + COLLS_YPADDING + (COLLS_YPADDING + 20) * yIndex; + + String tierString; + + if (tier - 1 >= romans.length || tier - 1 < 0) { + tierString = String.valueOf(tier); + } else { + tierString = romans[tier - 1]; + } + + Color color = new Color(128, 128, 128, 255); + int tierStringColour = color.getRGB(); + float completedness = tier / MAX_MINION_TIER; + + completedness = Math.min(1, completedness); + if (completedness >= 1) { + tierStringColour = new Color(255, 215, 0).getRGB(); + } + + GlStateManager.color(1, 1, 1, 1); + Minecraft.getMinecraft().getTextureManager().bindTexture(pv_elements); + Utils.drawTexturedRect(guiLeft + x, guiTop + y, 20, 20 * (1 - completedness), + 0, 20 / 256f, 0, 20 * (1 - completedness) / 256f, GL11.GL_NEAREST + ); + GlStateManager.color(1, 185 / 255f, 0, 1); + Minecraft.getMinecraft().getTextureManager().bindTexture(pv_elements); + Utils.drawTexturedRect(guiLeft + x, guiTop + y + 20 * (1 - completedness), 20, 20 * (completedness), + 0, 20 / 256f, 20 * (1 - completedness) / 256f, 20 / 256f, GL11.GL_NEAREST + ); + + Utils.drawItemStack( + NotEnoughUpdates.INSTANCE.manager.jsonToStack(minionJson), + guiLeft + (int) x + 2, + guiTop + (int) y + 2 + ); + + if (mouseX > guiLeft + (int) x + 2 && mouseX < guiLeft + (int) x + 18) { + if (mouseY > guiTop + (int) y + 2 && mouseY < guiTop + (int) y + 18) { + tooltipToDisplay = NotEnoughUpdates.INSTANCE.manager.jsonToStack(minionJson) + .getTooltip( + Minecraft.getMinecraft().thePlayer, + false + ); + } + } + + GlStateManager.color(1, 1, 1, 1); + if (tier >= 0) { + Utils.drawStringCentered(tierString, Minecraft.getMinecraft().fontRendererObj, + guiLeft + x + 10, guiTop + y - 4, true, + tierStringColour + ); + } + } + } + } + } + + if (tooltipToDisplay != null) { + List grayTooltip = new ArrayList<>(tooltipToDisplay.size()); + for (String line : tooltipToDisplay) { + grayTooltip.add(EnumChatFormatting.GRAY + line); + } + Utils.drawHoveringText(grayTooltip, mouseX, mouseY, width, height, -1, Minecraft.getMinecraft().fontRendererObj); + tooltipToDisplay = null; + } + } + + protected static void keyTypedCols(char typedChar, int keyCode) throws IOException { + ItemStack stack = null; + Iterator items = ProfileViewer.getCollectionCatToCollectionMap().keySet().iterator(); + switch (keyCode) { + case Keyboard.KEY_5: + case Keyboard.KEY_NUMPAD5: + stack = items.next(); + case Keyboard.KEY_4: + case Keyboard.KEY_NUMPAD4: + stack = items.next(); + case Keyboard.KEY_3: + case Keyboard.KEY_NUMPAD3: + stack = items.next(); + case Keyboard.KEY_2: + case Keyboard.KEY_NUMPAD2: + stack = items.next(); + case Keyboard.KEY_1: + case Keyboard.KEY_NUMPAD1: + stack = items.next(); + } + if (stack != null) { + selectedCollectionCategory = stack; + } + Utils.playPressSound(); + } + + public static void mouseReleasedCols(int mouseX, int mouseY, int mouseButton) { + int collectionCatSize = ProfileViewer.getCollectionCatToCollectionMap().size(); + int collectionCatYSize = (int) (162f / (collectionCatSize - 1 + 0.0000001f)); + int yIndex = 0; + for (ItemStack stack : ProfileViewer.getCollectionCatToCollectionMap().keySet()) { + if (mouseX > guiLeft + 7 && mouseX < guiLeft + 7 + 20) { + if (mouseY > guiTop + 10 + collectionCatYSize * yIndex && + mouseY < guiTop + 10 + collectionCatYSize * yIndex + 20) { + selectedCollectionCategory = stack; + Utils.playPressSound(); + return; + } + } + yIndex++; + } + } +} 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 90ad36c0..457f7c34 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java @@ -29,6 +29,7 @@ import com.mojang.authlib.GameProfile; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.cosmetics.ShaderManager; import io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField; +import io.github.moulberry.notenoughupdates.profileviewer.bestiary.BestiaryPage; import io.github.moulberry.notenoughupdates.profileviewer.trophy.TrophyFishingPage; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.SBInfo; @@ -81,7 +82,6 @@ import java.util.Arrays; import java.util.Base64; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; @@ -105,7 +105,7 @@ public class GuiProfileViewer extends GuiScreen { public static final ResourceLocation pv_extra = new ResourceLocation("notenoughupdates:pv_extra.png"); public static final ResourceLocation pv_mining = new ResourceLocation("notenoughupdates:pv_mining.png"); public static final ResourceLocation pv_invs = new ResourceLocation("notenoughupdates:pv_invs.png"); - public static final ResourceLocation pv_cols = new ResourceLocation("notenoughupdates:pv_cols.png"); + public static final ResourceLocation pv_pets = new ResourceLocation("notenoughupdates:pv_pets.png"); public static final ResourceLocation pv_dropdown = new ResourceLocation("notenoughupdates:pv_dropdown.png"); public static final ResourceLocation pv_bg = new ResourceLocation("notenoughupdates:pv_bg.png"); @@ -230,10 +230,7 @@ public class GuiProfileViewer extends GuiScreen { private final HashMap levelObjhotms = new HashMap<>(); private final HashMap> levelObjClasseses = new HashMap<>(); private final GuiElementTextField dungeonLevelTextField = new GuiElementTextField("", GuiElementTextField.SCALE_TEXT); - private final String[] romans = new String[]{ - "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", - "XII", "XIII", "XIV", "XV", "XVI", "XVII", "XIX", "XX" - }; + private final int COLLS_XCOUNT = 5; private final int COLLS_YCOUNT = 4; private final float COLLS_XPADDING = (190 - COLLS_XCOUNT * 20) / (float) (COLLS_XCOUNT + 1); @@ -254,7 +251,6 @@ public class GuiProfileViewer extends GuiScreen { private List tooltipToDisplay = null; private static String profileId = null; private boolean profileDropdownSelected = false; - private ItemStack selectedCollectionCategory = null; private int floorLevelTo = -1; private long floorLevelToXP = -1; private boolean onMasterMode = false; @@ -704,7 +700,7 @@ public class GuiProfileViewer extends GuiScreen { drawInvsPage(mouseX, mouseY); break; case COLLECTIONS: - drawColsPage(mouseX, mouseY, partialTicks); + CollectionPage.drawColsPage(mouseX, mouseY, width, height); break; case PETS: drawPetsPage(mouseX, mouseY, partialTicks); @@ -718,6 +714,9 @@ public class GuiProfileViewer extends GuiScreen { case TROPHY_FISH: TrophyFishingPage.renderPage(mouseX, mouseY); break; + case BESTIARY: + BestiaryPage.renderPage(mouseX, mouseY); + break; case LOADING: String str = EnumChatFormatting.YELLOW + "Loading player profiles."; long currentTimeMod = System.currentTimeMillis() % 1000; @@ -1093,7 +1092,7 @@ public class GuiProfileViewer extends GuiScreen { inventoryTextField.keyTyped(typedChar, keyCode); break; case COLLECTIONS: - keyTypedCols(typedChar, keyCode); + CollectionPage.keyTypedCols(typedChar, keyCode); break; case DUNGEON: keyTypedDung(typedChar, keyCode); @@ -1120,10 +1119,13 @@ public class GuiProfileViewer extends GuiScreen { mouseReleasedInvs(mouseX, mouseY, mouseButton); break; case COLLECTIONS: - mouseReleasedCols(mouseX, mouseY, mouseButton); + CollectionPage.mouseReleasedCols(mouseX, mouseY, mouseButton); break; case PETS: mouseReleasedPets(mouseX, mouseY, mouseButton); + break; + case BESTIARY: + BestiaryPage.mouseReleased(mouseX, mouseY, mouseButton); } } @@ -1209,31 +1211,7 @@ public class GuiProfileViewer extends GuiScreen { Utils.playPressSound(); } - protected void keyTypedCols(char typedChar, int keyCode) throws IOException { - ItemStack stack = null; - Iterator items = ProfileViewer.getCollectionCatToCollectionMap().keySet().iterator(); - switch (keyCode) { - case Keyboard.KEY_5: - case Keyboard.KEY_NUMPAD5: - stack = items.next(); - case Keyboard.KEY_4: - case Keyboard.KEY_NUMPAD4: - stack = items.next(); - case Keyboard.KEY_3: - case Keyboard.KEY_NUMPAD3: - stack = items.next(); - case Keyboard.KEY_2: - case Keyboard.KEY_NUMPAD2: - stack = items.next(); - case Keyboard.KEY_1: - case Keyboard.KEY_NUMPAD1: - stack = items.next(); - } - if (stack != null) { - selectedCollectionCategory = stack; - } - Utils.playPressSound(); - } + private void mouseReleasedPets(int mouseX, int mouseY, int mouseButton) { if (mouseY > guiTop + 6 && mouseY < guiTop + 22) { @@ -1300,22 +1278,6 @@ public class GuiProfileViewer extends GuiScreen { } } - private void mouseReleasedCols(int mouseX, int mouseY, int mouseButton) { - int collectionCatSize = ProfileViewer.getCollectionCatToCollectionMap().size(); - int collectionCatYSize = (int) (162f / (collectionCatSize - 1 + 0.0000001f)); - int yIndex = 0; - for (ItemStack stack : ProfileViewer.getCollectionCatToCollectionMap().keySet()) { - if (mouseX > guiLeft + 7 && mouseX < guiLeft + 7 + 20) { - if (mouseY > guiTop + 10 + collectionCatYSize * yIndex && - mouseY < guiTop + 10 + collectionCatYSize * yIndex + 20) { - selectedCollectionCategory = stack; - Utils.playPressSound(); - return; - } - } - yIndex++; - } - } private void calculateFloorLevelXP() { JsonObject leveling = Constants.LEVELING; @@ -2433,232 +2395,7 @@ public class GuiProfileViewer extends GuiScreen { } } - private void drawColsPage(int mouseX, int mouseY, float partialTicks) { - Minecraft.getMinecraft().getTextureManager().bindTexture(pv_cols); - Utils.drawTexturedRect(guiLeft, guiTop, sizeX, sizeY, GL11.GL_NEAREST); - JsonObject collectionInfo = profile.getCollectionInfo(profileId); - if (collectionInfo == null) { - Utils.drawStringCentered( - EnumChatFormatting.RED + "Collection API not enabled!", - Minecraft.getMinecraft().fontRendererObj, - guiLeft + 134, - guiTop + 101, - true, - 0 - ); - return; - } - JsonObject resourceCollectionInfo = ProfileViewer.getResourceCollectionInformation(); - if (resourceCollectionInfo == null) return; - - int collectionCatSize = ProfileViewer.getCollectionCatToCollectionMap().size(); - int collectionCatYSize = (int) (162f / (collectionCatSize - 1 + 0.0000001f)); - { - int yIndex = 0; - for (ItemStack stack : ProfileViewer.getCollectionCatToCollectionMap().keySet()) { - if (selectedCollectionCategory == null) selectedCollectionCategory = stack; - Minecraft.getMinecraft().getTextureManager().bindTexture(pv_elements); - if (stack == selectedCollectionCategory) { - Utils.drawTexturedRect(guiLeft + 7, guiTop + 10 + collectionCatYSize * yIndex, 20, 20, - 20 / 256f, 0, 20 / 256f, 0, GL11.GL_NEAREST - ); - Utils.drawItemStackWithText( - stack, - guiLeft + 10, - guiTop + 13 + collectionCatYSize * yIndex, - "" + (yIndex + 1) - ); - } else { - Utils.drawTexturedRect(guiLeft + 7, guiTop + 10 + collectionCatYSize * yIndex, 20, 20, - 0, 20 / 256f, 0, 20 / 256f, GL11.GL_NEAREST - ); - Utils.drawItemStackWithText(stack, guiLeft + 9, guiTop + 12 + collectionCatYSize * yIndex, "" + (yIndex + 1)); - } - yIndex++; - } - } - - Utils.drawStringCentered( - selectedCollectionCategory.getDisplayName() + " Collections", - Minecraft.getMinecraft().fontRendererObj, - guiLeft + 134, - guiTop + 14, - true, - 4210752 - ); - - JsonObject minionTiers = collectionInfo.get("minion_tiers").getAsJsonObject(); - JsonObject collectionTiers = collectionInfo.get("collection_tiers").getAsJsonObject(); - JsonObject maxAmounts = collectionInfo.get("max_amounts").getAsJsonObject(); - JsonObject totalAmounts = collectionInfo.get("total_amounts").getAsJsonObject(); - JsonObject personalAmounts = collectionInfo.get("personal_amounts").getAsJsonObject(); - - List collections = ProfileViewer.getCollectionCatToCollectionMap().get(selectedCollectionCategory); - if (collections != null) { - for (int i = 0; i < collections.size(); i++) { - String collection = collections.get(i); - if (collection != null) { - ItemStack collectionItem = ProfileViewer.getCollectionToCollectionDisplayMap().get(collection); - if (collectionItem != null) { - int xIndex = i % COLLS_XCOUNT; - int yIndex = i / COLLS_XCOUNT; - - float x = 39 + COLLS_XPADDING + (COLLS_XPADDING + 20) * xIndex; - float y = 7 + COLLS_YPADDING + (COLLS_YPADDING + 20) * yIndex; - - String tierString; - int tier = (int) Utils.getElementAsFloat(collectionTiers.get(collection), 0); - if (tier > 20 || tier < 0) { - tierString = String.valueOf(tier); - } else { - tierString = romans[tier]; - } - float amount = Utils.getElementAsFloat(totalAmounts.get(collection), 0); - float maxAmount = Utils.getElementAsFloat(maxAmounts.get(collection), 0); - Color color = new Color(128, 128, 128, 255); - int tierStringColour = color.getRGB(); - float completedness = 0; - if (maxAmount > 0) { - completedness = amount / maxAmount; - } - completedness = Math.min(1, completedness); - if (maxAmounts.has(collection) && completedness >= 1) { - tierStringColour = new Color(255, 215, 0).getRGB(); - } - - GlStateManager.color(1, 1, 1, 1); - Minecraft.getMinecraft().getTextureManager().bindTexture(pv_elements); - Utils.drawTexturedRect(guiLeft + x, guiTop + y, 20, 20 * (1 - completedness), - 0, 20 / 256f, 0, 20 * (1 - completedness) / 256f, GL11.GL_NEAREST - ); - GlStateManager.color(1, 185 / 255f, 0, 1); - Minecraft.getMinecraft().getTextureManager().bindTexture(pv_elements); - Utils.drawTexturedRect(guiLeft + x, guiTop + y + 20 * (1 - completedness), 20, 20 * (completedness), - 0, 20 / 256f, 20 * (1 - completedness) / 256f, 20 / 256f, GL11.GL_NEAREST - ); - Utils.drawItemStack(collectionItem, guiLeft + (int) x + 2, guiTop + (int) y + 2); - - if (mouseX > guiLeft + (int) x + 2 && mouseX < guiLeft + (int) x + 18) { - if (mouseY > guiTop + (int) y + 2 && mouseY < guiTop + (int) y + 18) { - tooltipToDisplay = new ArrayList<>(); - tooltipToDisplay.add(collectionItem.getDisplayName() + " " + - (completedness >= 1 ? EnumChatFormatting.GOLD : EnumChatFormatting.GRAY) + tierString); - tooltipToDisplay.add( - "Collected: " + numberFormat.format(Utils.getElementAsFloat(personalAmounts.get(collection), 0))); - tooltipToDisplay.add("Total Collected: " + numberFormat.format(amount)); - } - } - - GlStateManager.color(1, 1, 1, 1); - if (tier >= 0) { - Utils.drawStringCentered(tierString, fontRendererObj, - guiLeft + x + 10, guiTop + y - 4, true, - tierStringColour - ); - } - - Utils.drawStringCentered( - shortNumberFormat(amount, 0) + "", fontRendererObj, - guiLeft + x + 10, guiTop + y + 26, true, - color.getRGB() - ); - } - } - } - } - - Utils.drawStringCentered( - selectedCollectionCategory.getDisplayName() + " Minions", - Minecraft.getMinecraft().fontRendererObj, - guiLeft + 326, - guiTop + 14, - true, - 4210752 - ); - - List minions = ProfileViewer.getCollectionCatToMinionMap().get(selectedCollectionCategory); - if (minions != null) { - for (int i = 0; i < minions.size(); i++) { - String minion = minions.get(i); - if (minion != null) { - JsonObject misc = Constants.MISC; - float MAX_MINION_TIER = - Utils.getElementAsFloat(Utils.getElement(misc, "minions." + minion + "_GENERATOR"), 11); - - int tier = (int) Utils.getElementAsFloat(minionTiers.get(minion), 0); - JsonObject minionJson; - if (tier == 0) { - minionJson = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(minion + "_GENERATOR_1"); - } else { - minionJson = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(minion + "_GENERATOR_" + tier); - } - - if (minionJson != null) { - int xIndex = i % COLLS_XCOUNT; - int yIndex = i / COLLS_XCOUNT; - - float x = 231 + COLLS_XPADDING + (COLLS_XPADDING + 20) * xIndex; - float y = 7 + COLLS_YPADDING + (COLLS_YPADDING + 20) * yIndex; - - String tierString; - - if (tier - 1 >= romans.length || tier - 1 < 0) { - tierString = String.valueOf(tier); - } else { - tierString = romans[tier - 1]; - } - - Color color = new Color(128, 128, 128, 255); - int tierStringColour = color.getRGB(); - float completedness = tier / MAX_MINION_TIER; - - completedness = Math.min(1, completedness); - if (completedness >= 1) { - tierStringColour = new Color(255, 215, 0).getRGB(); - } - - GlStateManager.color(1, 1, 1, 1); - Minecraft.getMinecraft().getTextureManager().bindTexture(pv_elements); - Utils.drawTexturedRect(guiLeft + x, guiTop + y, 20, 20 * (1 - completedness), - 0, 20 / 256f, 0, 20 * (1 - completedness) / 256f, GL11.GL_NEAREST - ); - GlStateManager.color(1, 185 / 255f, 0, 1); - Minecraft.getMinecraft().getTextureManager().bindTexture(pv_elements); - Utils.drawTexturedRect(guiLeft + x, guiTop + y + 20 * (1 - completedness), 20, 20 * (completedness), - 0, 20 / 256f, 20 * (1 - completedness) / 256f, 20 / 256f, GL11.GL_NEAREST - ); - - Utils.drawItemStack( - NotEnoughUpdates.INSTANCE.manager.jsonToStack(minionJson), - guiLeft + (int) x + 2, - guiTop + (int) y + 2 - ); - - if (mouseX > guiLeft + (int) x + 2 && mouseX < guiLeft + (int) x + 18) { - if (mouseY > guiTop + (int) y + 2 && mouseY < guiTop + (int) y + 18) { - tooltipToDisplay = NotEnoughUpdates.INSTANCE.manager.jsonToStack(minionJson) - .getTooltip( - Minecraft.getMinecraft().thePlayer, - false - ); - } - } - - GlStateManager.color(1, 1, 1, 1); - if (tier >= 0) { - Utils.drawStringCentered(tierString, fontRendererObj, - guiLeft + x + 10, guiTop + y - 4, true, - tierStringColour - ); - } - } - } - } - } - - //190 - } public int countItemsInInventory( String internalname, @@ -5399,7 +5136,8 @@ public class GuiProfileViewer extends GuiScreen { PETS(5, Items.bone, "Pets"), MINING(6, Items.iron_pickaxe, "Heart of the Mountain"), BINGO(7, Items.filled_map, "Bingo"), - TROPHY_FISH(8, Items.fishing_rod, "Trophy Fish"); + TROPHY_FISH(8, Items.fishing_rod, "Trophy Fish"), + BESTIARY(9, Items.iron_sword, "Bestiary"); public final ItemStack stack; public final int id; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryData.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryData.java new file mode 100644 index 00000000..1e18f825 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryData.java @@ -0,0 +1,1089 @@ +/* + * 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.profileviewer.bestiary; + +import io.github.moulberry.notenoughupdates.util.Utils; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +import java.util.LinkedHashMap; +import java.util.List; + +public class BestiaryData { + private static final LinkedHashMap> bestiaryLocations = + new LinkedHashMap>() {{ + put( + Utils.createSkull( + EnumChatFormatting.AQUA + "Private Island", + "bdee7687-9c85-4e7a-b789-b55e90d21d68", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0=" + ), + Utils.createList( + "family_cave_spider", + "family_enderman_private", + "family_skeleton", + "family_slime", + "family_spider", + "family_witch", + "family_zombie" + ) + ); + put( + Utils.createSkull( + EnumChatFormatting.AQUA + "Hub", + "88208736-41cd-4ed8-8ed7-53179140a7fa", + "eyJ0aW1lc3RhbXAiOjE1NTkyMTU0MTY5MDksInByb2ZpbGVJZCI6IjQxZDNhYmMyZDc0OTQwMGM5MDkwZDU0MzRkMDM4MzFiIiwicHJvZmlsZU5hbWUiOiJNZWdha2xvb24iLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2Q3Y2M2Njg3NDIzZDA1NzBkNTU2YWM1M2UwNjc2Y2I1NjNiYmRkOTcxN2NkODI2OWJkZWJlZDZmNmQ0ZTdiZjgifX19" + ), + Utils.createList( + "family_unburried_zombie", + "family_old_wolf", + "family_ruin_wolf", + "family_zombie_villager" + ) + ); + put(Utils.createSkull( + EnumChatFormatting.AQUA + "Spiders Den", + "acbeaf98-2081-40c5-b5a3-221a2957d532", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzc1NDMxOGEzMzc2ZjQ3MGU0ODFkZmNkNmM4M2E1OWFhNjkwYWQ0YjRkZDc1NzdmZGFkMWMyZWYwOGQ4YWVlNiJ9fX0" + ), Utils.createList( + "family_arachne", + "family_arachne_brood", + "family_arachne_keeper", + "family_brood_mother_spider", + "family_dasher_spider", + "family_respawning_skeleton", + "family_random_slime", + "family_spider_jockey", + "family_splitter_spider", + "family_voracious_spider", + "family_weaver_spider" + )); + put(Utils.createSkull( + EnumChatFormatting.AQUA + "The End", + "e39ea8b1-a267-48a9-907a-1b97b85342bc", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzg0MGI4N2Q1MjI3MWQyYTc1NWRlZGM4Mjg3N2UwZWQzZGY2N2RjYzQyZWE0NzllYzE0NjE3NmIwMjc3OWE1In19fQ" + ), Utils.createList( + "family_dragon", + "family_enderman", + "family_endermite", + "family_corrupted_protector", + "family_obsidian_wither", + "family_voidling_extremist", + "family_voidling_fanatic", + "family_watcher", + "family_zealot_enderman" + )); + put(Utils.createSkull( + EnumChatFormatting.AQUA + "Crimson Isles", + "d8489bfe-dcd7-41f0-bfbd-fb482bf61ecb", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzM2ODdlMjVjNjMyYmNlOGFhNjFlMGQ2NGMyNGU2OTRjM2VlYTYyOWVhOTQ0ZjRjZjMwZGNmYjRmYmNlMDcxIn19fQ" + ), Utils.createList( + "family_ashfang", + "family_barbarian_duke_x", + "family_bladesoul", + "family_blaze", + "family_flaming_spider", + "family_ghast", + "family_mage_outlaw", + "family_magma_cube", + "family_magma_cube_boss", + "family_matcho", + "family_charging_mushroom_cow", + "family_pigman", + "family_wither_skeleton", + "family_wither_spectre" + )); + put(Utils.createSkull( + EnumChatFormatting.AQUA + "Deep Caverns", + "896b5137-a2dd-4de2-8c63-d5a5649bfc70", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTY5YTFmMTE0MTUxYjQ1MjEzNzNmMzRiYzE0YzI5NjNhNTAxMWNkYzI1YTY1NTRjNDhjNzA4Y2Q5NmViZmMifX19" + ), Utils.createList( + "family_automaton", + "family_butterfly", + "family_emerald_slime", + "family_caverns_ghost", + "family_goblin", + "family_team_treasurite", + "family_ice_walker", + "family_lapis_zombie", + "family_diamond_skeleton", + "family_diamond_zombie", + "family_redstone_pigman", + "family_sludge", + "family_invisible_creeper", + "family_thyst", + "family_treasure_hoarder", + "family_worms", + "family_yog" + )); + put(Utils.createSkull( + EnumChatFormatting.AQUA + "The Park", + "6473b2ff-0575-4aec-811f-5f0dca2131b6", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTIyMWY4MTNkYWNlZTBmZWY4YzU5Zjc2ODk0ZGJiMjY0MTU0NzhkOWRkZmM0NGMyZTcwOGE2ZDNiNzU0OWIifX19" + ), Utils.createList("family_howling_spirit", "family_pack_spirit", "family_soul_of_the_alpha" + )); + put(Utils.createItemStack(Item.getItemFromBlock(Blocks.lit_pumpkin), EnumChatFormatting.AQUA + "Spooky" + ), Utils.createList( + "family_batty_witch", + "family_headless_horseman", + "family_phantom_spirit", + "family_scary_jerry", + "family_trick_or_treater", + "family_wither_gourd", + "family_wraith" + )); + put(Utils.createSkull( + EnumChatFormatting.AQUA + "Catacombs", + "00b3837d-9275-304c-8bf9-656659087e6b", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTY0ZTFjM2UzMTVjOGQ4ZmZmYzM3OTg1YjY2ODFjNWJkMTZhNmY5N2ZmZDA3MTk5ZThhMDVlZmJlZjEwMzc5MyJ9fX0" + ), Utils.createList( + "family_diamond_guy", + "family_cellar_spider", + "family_crypt_dreadlord", + "family_crypt_lurker", + "family_crypt_souleater", + "family_king_midas", + "family_lonely_spider", + "family_lost_adventurer", + "family_scared_skeleton", + "family_shadow_assassin", + "family_skeleton_grunt", + "family_skeleton_master", + "family_skeleton_soldier", + "family_skeletor", + "family_sniper_skeleton", + "family_super_archer", + "family_super_tank_zombie", + "family_crypt_tank_zombie", + "family_watcher_summon_undead", + "family_dungeon_respawning_skeleton", + "family_crypt_witherskeleton", + "family_zombie_commander", + "family_zombie_grunt", + "family_zombie_knight", + "family_zombie_soldier" + )); + }}; + + public static LinkedHashMap> getBestiaryLocations() { + return bestiaryLocations; + } + + private static final LinkedHashMap bestiaryMobs = + new LinkedHashMap() {{ + // Private Island + put( + "family_cave_spider", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aCave Spider", + "a8aee72d-0d1d-3db7-8cf8-be1ce6ec2dc4", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDE2NDVkZmQ3N2QwOTkyMzEwN2IzNDk2ZTk0ZWViNWMzMDMyOWY5N2VmYzk2ZWQ3NmUyMjZlOTgyMjQifX19" + ) + ); + put( + "family_enderman_private", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aEnderman", + "2005daad-730b-363c-abae-e6f3830816fb", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTZjMGIzNmQ1M2ZmZjY5YTQ5YzdkNmYzOTMyZjJiMGZlOTQ4ZTAzMjIyNmQ1ZTgwNDVlYzU4NDA4YTM2ZTk1MSJ9fX0=" + ) + ); + put( + "family_skeleton", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aSkeleton", + "53924f1a-87e6-4709-8e53-f1c7d13dc239", + "ewogICJ0aW1lc3RhbXAiIDogMTY1NTYzMTgzNjcwNCwKICAicHJvZmlsZUlkIiA6ICI1MzkyNGYxYTg3ZTY0NzA5OGU1M2YxYzdkMTNkYzIzOSIsCiAgInByb2ZpbGVOYW1lIiA6ICJUaHJvd3BvIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzg4ZWI2OGE0ZDM4ZTlmNDQ2YjhlOTkyNzVmMTYwMzAyZjM2NmVmMTAyMTZhYmY5NDg0ODdlNTgyNTEyYmQwZjMiCiAgICB9CiAgfQp9=" + ) + ); + put( + "family_slime", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aSlime", + "3b70a2f3-319c-38d5-b7d1-5b2425770184", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODk1YWVlYzZiODQyYWRhODY2OWY4NDZkNjViYzQ5NzYyNTk3ODI0YWI5NDRmMjJmNDViZjNiYmI5NDFhYmU2YyJ9fX0=" + ) + ); + put( + "family_spider", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aSpider", + "7c63f3cf-a963-311a-aeca-3a075b417806", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2Q1NDE1NDFkYWFmZjUwODk2Y2QyNThiZGJkZDRjZjgwYzNiYTgxNjczNTcyNjA3OGJmZTM5MzkyN2U1N2YxIn19fQ==" + ) + ); + put( + "family_witch", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aWitch", + "cf4f97d7-2e1f-3678-9ca3-4a7b9666cc28", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmNlNjYwNDE1N2ZjNGFiNTU5MWU0YmNmNTA3YTc0OTkxOGVlOWM0MWUzNTdkNDczNzZlMGVlNzM0MjA3NGM5MCJ9fX0=" + ) + ); + put( + "family_zombie", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aZombie", + "9673d491-d589-44cb-b63e-5f8b3148b3df", + "ewogICJ0aW1lc3RhbXAiIDogMTY0Njc1NjU2MzM1MiwKICAicHJvZmlsZUlkIiA6ICJkYmQ4MDQ2M2EwMzY0Y2FjYjI3OGNhODBhMDBkZGIxMyIsCiAgInByb2ZpbGVOYW1lIiA6ICJ4bG9nMjEiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjM2NjZkMWJkZjQ1NThiMGQxNjk5MGIyNDFlODE4NWNiZjU4YzNlMDNjMjRkOTA0NTQ0ZThjYzY1YjFjMzhkMSIKICAgIH0KICB9Cn0=\", \"n8vct7fj3NdiODy/h6PJhjxSR2U7d8gQxHjdVq553HqG60SSczt1Tl9XhvQbZP14ZrJGWxCziauuYb/HjZza0ugNAhfwh9z8hqR1PjBJGdvp+wpxoWpP2wd5RT9i5/GYEqpiAIAt9vHY1YeyejFqKZhXaGgp7gZZNjOQWQqB0SZzTUTAPzRW9FiY8x2re7H7Y1POThRXOvvkeQ6qWdPV6Hk5hTumV0rfEGm971jQRIbfdzBZDJRcro+8y+dlje/NpF5qf0JLy78Xr4hc2cwbT9+wqOeoUTcM/r9mwL15OKgFLjB44jszauKRHNfoqb6B3+1fNQEJrJK/7hIyvswpde7C5uOxkE7oMFib6X68VVEhb6PGC1+HWNaMaGjI0wWEkCahp48ihN9+sBEBFXOxIAhXG/pvJcbEi742/cBS1CTtOI8qui6JSL9MKX5jmyhtjjibOYRZbacosqayCnwsJAdMmwS7zIxc8jGhpfKECiSni/baS4zRla0bns4hfEM0l7ASv0Dh99WQD0We2ZMqltmix8lMEaAILXJVBln3CFrjYvncfku2hrSaqu1lNAtfMYYSITEUCBJ7McVAVmUHOrER0XGoVs9L237H0BQNSLqlGGEQ7OM8HV6G0YfXGlbNgNBx6O9k8ZijuK60JeEoJapcmbNj/LVHEU+dsgcFAbo=" + ) + ); + + // Hub + put( + "family_unburried_zombie", + Utils.createItemStack(Items.golden_sword, EnumChatFormatting.AQUA + "§aCrypt Ghoul") + ); + put( + "family_old_wolf", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aOld Wolf", + "26e6f2d9-8a27-3a77-965c-5bd2b5d2dc93", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDM1OTUzN2MxNTUzNGY2MWMxY2Q4ODZiYzExODc3NGVkMjIyODBlN2NkYWI2NjEzODcwMTYwYWFkNGNhMzkifX19" + ) + ); + put( + "family_ruin_wolf", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aWolf", + "7e9af289-f295-3f8c-bd54-58b7667d5759", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjlkMWQzMTEzZWM0M2FjMjk2MWRkNTlmMjgxNzVmYjQ3MTg4NzNjNmM0NDhkZmNhODcyMjMxN2Q2NyJ9fX0=" + ) + ); + put( + "family_zombie_villager", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aZombie Villager", + "3acb9940-fc42-328e-91e8-c9a9a57e8698", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTVlMDhhODc3NmMxNzY0YzNmZTZhNmRkZDQxMmRmY2I4N2Y0MTMzMWRhZDQ3OWFjOTZjMjFkZjRiZjNhYzg5YyJ9fX0=" + ) + ); + + // Spiders Den + put( + "family_arachne", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aArachne", + "7c63f3cf-a963-311a-aeca-3a075b417806", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2Q1NDE1NDFkYWFmZjUwODk2Y2QyNThiZGJkZDRjZjgwYzNiYTgxNjczNTcyNjA3OGJmZTM5MzkyN2U1N2YxIn19fQ==" + ) + ); + put( + "family_arachne_brood", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aArachne's Brood", + "7c63f3cf-a963-311a-aeca-3a075b417806", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2Q1NDE1NDFkYWFmZjUwODk2Y2QyNThiZGJkZDRjZjgwYzNiYTgxNjczNTcyNjA3OGJmZTM5MzkyN2U1N2YxIn19fQ==" + ) + ); + put( + "family_arachne_keeper", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aArachne's Keeper", + "7c63f3cf-a963-311a-aeca-3a075b417806", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2Q1NDE1NDFkYWFmZjUwODk2Y2QyNThiZGJkZDRjZjgwYzNiYTgxNjczNTcyNjA3OGJmZTM5MzkyN2U1N2YxIn19fQ==" + ) + ); + put( + "family_brood_mother_spider", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aBrood Mother", + "d7390e70-1e99-3c24-9b1c-bb098e0bbef1", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2YwNjIyYjM5OThkNDJiMzRkNWJjNzYwYmIyYzgzZmRiYzZlNjhmYWIwNWI3ZWExN2IzNTA5N2VkODExOTBkNiJ9fX0=" + ) + ); + put( + "family_dasher_spider", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aDasher Spider", + "7c63f3cf-a963-311a-aeca-3a075b417806", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2Q1NDE1NDFkYWFmZjUwODk2Y2QyNThiZGJkZDRjZjgwYzNiYTgxNjczNTcyNjA3OGJmZTM5MzkyN2U1N2YxIn19fQ==" + ) + ); + put( + "family_respawning_skeleton", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aGravel Skeleton", + "53924f1a-87e6-4709-8e53-f1c7d13dc239", + "ewogICJ0aW1lc3RhbXAiIDogMTY1NTYzMTgzNjcwNCwKICAicHJvZmlsZUlkIiA6ICI1MzkyNGYxYTg3ZTY0NzA5OGU1M2YxYzdkMTNkYzIzOSIsCiAgInByb2ZpbGVOYW1lIiA6ICJUaHJvd3BvIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzg4ZWI2OGE0ZDM4ZTlmNDQ2YjhlOTkyNzVmMTYwMzAyZjM2NmVmMTAyMTZhYmY5NDg0ODdlNTgyNTEyYmQwZjMiCiAgICB9CiAgfQp9=" + ) + ); + put( + "family_random_slime", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aRain Slime", + "3b70a2f3-319c-38d5-b7d1-5b2425770184", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODk1YWVlYzZiODQyYWRhODY2OWY4NDZkNjViYzQ5NzYyNTk3ODI0YWI5NDRmMjJmNDViZjNiYmI5NDFhYmU2YyJ9fX0=" + ) + ); + put( + "family_spider_jockey", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aSpider Jockey", + "4eb8745c-80d2-356b-b4fa-f3ffa74082e7", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzA5MzkzNzNjYWZlNGIxZjUzOTdhYWZkMDlmM2JiMTY2M2U3YjYyOWE0MWE3NWZiZGMxODYwYjZiZjhiNDc1ZiJ9fX0=" + ) + ); + put( + "family_splitter_spider", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aSplitter Spider", + "50010472-fa22-3519-b941-2d6d22f47bf1", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmFjZjY5ZmM3YWY1NDk3YTE3NDE4OTFkMWU1YmYzMmI5NmFlMGQ2YzBiYmQzYzE0NzU4ZWE0NGEwM2M1NzI4MyJ9fX0=" + ) + ); + put( + "family_voracious_spider", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aVoracious Spider", + "3e5474d4-4365-3ea7-b4bc-b4edc54da341", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODMwMDk4NmVkMGEwNGVhNzk5MDRmNmFlNTNmNDllZDNhMGZmNWIxZGY2MmJiYTYyMmVjYmQzNzc3ZjE1NmRmOCJ9fX0=" + ) + ); + put( + "family_weaver_spider", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aWeaver Spider", + "97414c0c-623b-3df3-b1f6-bbcaddafc7fc", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTIxNDM4ZjY0NmRjMDQ1MTU5NjdlODE5NWNjYzNkMzFlMjNiMDJmOWFhMGFjOTE0ZWRjMjgyMmY5ODM5NGI4NiJ9fX0=" + ) + ); + + // The End + put( + "family_dragon", + Utils.createItemStack(Item.getItemFromBlock(Blocks.dragon_egg), EnumChatFormatting.AQUA + "§aDragon") + ); + put( + "family_enderman", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aEnderman", + "2005daad-730b-363c-abae-e6f3830816fb", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTZjMGIzNmQ1M2ZmZjY5YTQ5YzdkNmYzOTMyZjJiMGZlOTQ4ZTAzMjIyNmQ1ZTgwNDVlYzU4NDA4YTM2ZTk1MSJ9fX0=" + ) + ); + put( + "family_endermite", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aEndermite", + "b3224e56-73d2-32f9-9081-a23b7512035b", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNWJjN2I5ZDM2ZmI5MmI2YmYyOTJiZTczZDMyYzZjNWIwZWNjMjViNDQzMjNhNTQxZmFlMWYxZTY3ZTM5M2EzZSJ9fX0=" + ) + ); + put( + "family_corrupted_protector", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aEndstone Protector", + "a46a9adf-60a3-38f2-a3dd-335d85f1cc10", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjJiY2FjZWViNDE2MmY0MDBkNDQ3NDMzMTU5MzJhYzgyMGQzMTE5YWM4OTg2YTAxNjFhNzI2MTYxY2NjOTNmYyJ9fX0=" + ) + ); + put( + "family_obsidian_wither", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aObsidian Defender", + "d0e05de7-6067-454d-beae-c6d19d886191", + "ewogICJ0aW1lc3RhbXAiIDogMTY1NTYzMjg1MTE1NCwKICAicHJvZmlsZUlkIiA6ICJkMGUwNWRlNzYwNjc0NTRkYmVhZWM2ZDE5ZDg4NjE5MSIsCiAgInByb2ZpbGVOYW1lIiA6ICJNb3VsYmVycnkiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmNlMTU1MjI0ZWE0YmM0OWE4ZTkxOTA3MzdjYjA0MTdkOGE3YzM4YTAzN2Q4ZDAzODJkZGU0ODI5YzEwMzU5MCIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9" + ) + ); + put( + "family_voidling_extremist", + Utils.createSkull( + EnumChatFormatting.AQUA + "§a§dVoidling Extremist", + "159dcb01-74e3-382c-87d6-3afa022fb379", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWIwNzU5NGUyZGYyNzM5MjFhNzdjMTAxZDBiZmRmYTExMTVhYmVkNWI5YjIwMjllYjQ5NmNlYmE5YmRiYjRiMyJ9fX0=" + ) + ); + put( + "family_voidling_fanatic", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aVoidling Fanatic", + "e86aab24-6245-3967-bf3d-07e31999b602", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTUzYjdiY2Q1NmYwYjk1Zjg3ZGQ3OWVkMTc2MzZiZWI5ZDgzNDY3NDQwMTQyMjhlYTJmNmIxMTBiMTQ4YzEifX19" + ) + ); + put( + "family_watcher", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aWatcher", + "00a702b9-7bad-3205-a04b-52478d8c0e7f", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGFhOGZjOGRlNjQxN2I0OGQ0OGM4MGI0NDNjZjUzMjZlM2Q5ZGE0ZGJlOWIyNWZjZDQ5NTQ5ZDk2MTY4ZmMwIn19fQ==" + ) + ); + put( + "family_zealot_enderman", + Utils.createItemStack(Item.getItemFromBlock(Blocks.ender_chest), EnumChatFormatting.AQUA + "§aZealot") + ); + + // Crimson Isle + put( + "family_ashfang", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aAshfang", + "1bc8810e-2b57-3a89-8e00-a47a057d6ecc", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2QyYTViNGIxMDliZDc4OGVkYmEwMTcxZDBhYWI4YTU1MzA1YWMyZjU2MTg0ZGY3MGEzMTljZDQ4OGEzNmMzZSJ9fX0=" + ) + ); + put( + "family_barbarian_duke_x", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aBarbarian Duke X", + "6ddece1d-8227-35f3-b9ca-476a9f6cd8c5", + "ewogICJ0aW1lc3RhbXAiIDogMTY0MTI0OTYyNTU3NSwKICAicHJvZmlsZUlkIiA6ICIyNzZlMDQ2YjI0MDM0M2VkOTk2NmU0OTRlN2U2Y2IzNCIsCiAgInByb2ZpbGVOYW1lIiA6ICJBRFJBTlM3MTAiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmVlOWZjN2MxODFlMmY2MzBmNmIxYWY4NWQ0OTUxMzU5Y2FmY2ZhODJmZjVlYTNiYzI4M2UwZTYwODhjNmU1NCIKICAgIH0KICB9Cn0" + ) + ); + put( + "family_bladesoul", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aBladesoul", + "9a1699a4-9b61-37a5-be7a-ca23a1f092a1", + "ewogICJ0aW1lc3RhbXAiIDogMTY0NDA4Mjg1NzcxMCwKICAicHJvZmlsZUlkIiA6ICIwNTVhOTk2NTk2M2E0YjRmOGMwMjRmMTJmNDFkMmNmMiIsCiAgInByb2ZpbGVOYW1lIiA6ICJUaGVWb3hlbGxlIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzdmNWYzMzg0Mzg0ZDdmMDNiZjk3YTczMDk5YjBiYWZiNzJjNTM4ZmMwNDE1YWM4NjEzYjY2NGY4NzU3OWEzNzkiCiAgICB9CiAgfQp9" + ) + ); + put( + "family_blaze", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aBlaze", + "118fe834-28aa-3b0d-afe6-f0c52d01afe8", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjc4ZWYyZTRjZjJjNDFhMmQxNGJmZGU5Y2FmZjEwMjE5ZjViMWJmNWIzNWE0OWViNTFjNjQ2Nzg4MmNiNWYwIn19fQ==" + ) + ); + put( + "family_flaming_spider", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aFlaming Spider", + "d27e14a2-f35e-3c7b-8062-089fa201a533", + "ewogICJ0aW1lc3RhbXAiIDogMTY0NDQ5OTUzOTQ2NywKICAicHJvZmlsZUlkIiA6ICJhYTZhNzUwNWVkYmU0NjNiYjk1NWYyMWY0MjNiYTM1NCIsCiAgInByb2ZpbGVOYW1lIiA6ICJub3RhbmR5d2FyaG9sIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzVhNjVlZjIzZWEzNTA0NzE1MGQzMzg4MDQ3M2E0N2ZlNjM1ZjBjMGUzYzgyM2JkNzZkYzg0OWNiMDI0NDE2NTUiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==" + ) + ); + put( + "family_ghast", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aGhast", + "69725d7d-1933-3dea-87bd-a3052482ab2c", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGU4YTM4ZTlhZmJkM2RhMTBkMTliNTc3YzU1YzdiZmQ2YjRmMmU0MDdlNDRkNDAxN2IyM2JlOTE2N2FiZmYwMiJ9fX0=" + ) + ); + put( + "family_mage_outlaw", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aMage Outlaw", + "1d16c26c-d937-336f-821a-371968d050c2", + "ewogICJ0aW1lc3RhbXAiIDogMTY0NDA4Mjg3Mzk2NywKICAicHJvZmlsZUlkIiA6ICJiNzQ3OWJhZTI5YzQ0YjIzYmE1NjI4MzM3OGYwZTNjNiIsCiAgInByb2ZpbGVOYW1lIiA6ICJTeWxlZXgiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWJlYzk5YjNhMDUwZmQyNzc1Mjg0MDc2NzYzNjZlMjBiOTIwMDZhZDg4ZDE0NzI3YTRkOTllYjhjYjI3M2I2MiIKICAgIH0KICB9Cn0" + ) + ); + put( + "family_magma_cube", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aMagma Cube", + "35f02923-7bec-3869-9ef5-b42a4794cac8", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzg5NTdkNTAyM2M5MzdjNGM0MWFhMjQxMmQ0MzQxMGJkYTIzY2Y3OWE5ZjZhYjM2Yjc2ZmVmMmQ3YzQyOSJ9fX0=" + ) + ); + put( + "family_magma_cube_boss", + Utils.createSkull( + EnumChatFormatting.AQUA + "§a§6§lMagma Cube Boss", + "35f02923-7bec-3869-9ef5-b42a4794cac8", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzg5NTdkNTAyM2M5MzdjNGM0MWFhMjQxMmQ0MzQxMGJkYTIzY2Y3OWE5ZjZhYjM2Yjc2ZmVmMmQ3YzQyOSJ9fX0=" + ) + ); + put( + "family_matcho", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aMatcho", + "61db73be-677f-554a-9450-e306a7ff0449", + "e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWYyZGFhYmI3OGExZjdhYTEyZDE0NWQ4OGMwY2E0NmI5ZTg1NmY1NTM0ZTkyODZlNTU1ZmFmMGMyOTFmNGZkNSJ9fX0=" + ) + ); + put( + "family_charging_mushroom_cow", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aMushroom Bull", + "2b9eb675-2097-4b51-8fec-c1a51562f19c", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTE2M2JjNDE2YjhlNjA1OGY5MmIyMzFlOWE1MjRiN2ZlMTE4ZWI2ZTdlZWFiNGFkMTZkMWI1MmEzZWMwNGZjZCJ9fX0=" + ) + ); + put( + "family_pigman", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aPigman", + "3fc29372-e78e-3ad6-b0b0-05ca0a84babd", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzRlOWM2ZTk4NTgyZmZkOGZmOGZlYjMzMjJjZDE4NDljNDNmYjE2YjE1OGFiYjExY2E3YjQyZWRhNzc0M2ViIn19fQ==" + ) + ); + put( + "family_wither_skeleton", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aWither Skeleton", + "2141b934-c877-3db1-bc6c-7c9a347ffa95", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzk1M2I2YzY4NDQ4ZTdlNmI2YmY4ZmIyNzNkNzIwM2FjZDhlMWJlMTllODE0ODFlYWQ1MWY0NWRlNTlhOCJ9fX0=" + ) + ); + put( + "family_wither_spectre", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aWither Spectre", + "9a1699a4-9b61-37a5-be7a-ca23a1f092a1", + "ewogICJ0aW1lc3RhbXAiIDogMTY0NDA4Mjg1NzcxMCwKICAicHJvZmlsZUlkIiA6ICIwNTVhOTk2NTk2M2E0YjRmOGMwMjRmMTJmNDFkMmNmMiIsCiAgInByb2ZpbGVOYW1lIiA6ICJUaGVWb3hlbGxlIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzdmNWYzMzg0Mzg0ZDdmMDNiZjk3YTczMDk5YjBiYWZiNzJjNTM4ZmMwNDE1YWM4NjEzYjY2NGY4NzU3OWEzNzkiCiAgICB9CiAgfQp9" + ) + ); + + // Deep Caverns + put( + "family_automaton", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aAutomaton", + "a46a9adf-60a3-38f2-a3dd-335d85f1cc10", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjJiY2FjZWViNDE2MmY0MDBkNDQ3NDMzMTU5MzJhYzgyMGQzMTE5YWM4OTg2YTAxNjFhNzI2MTYxY2NjOTNmYyJ9fX0=" + ) + ); + put( + "family_butterfly", + Utils.createSkull( + EnumChatFormatting.AQUA + "§a§eButterfly", + "9dd11ec6-cfea-34df-9336-416c946567bc", + "ewogICJ0aW1lc3RhbXAiIDogMTYyNTUxMjE4ODY3NCwKICAicHJvZmlsZUlkIiA6ICI3MzgyZGRmYmU0ODU0NTVjODI1ZjkwMGY4OGZkMzJmOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJJb3lhbCIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS85ZmQ4MDZkZWZkZmRmNTliMWYyNjA5YzhlZTM2NDY2NmRlNjYxMjdhNjIzNDE1YjU0MzBjOTM1OGM2MDFlZjdjIgogICAgfQogIH0KfQ==" + ) + ); + put( + "family_emerald_slime", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aEmerald Slime", + "cb762e0d-a1e6-3888-8c05-eddabbbe49a2", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTc3NGU4NmFhNGNmZjc5MjM5NWI3N2FkZDU3YjAwYmIxYTEwMmY4ZjBmMDk4MGY0ZDU1YjNkN2FmZjFlNmRhOSJ9fX0=" + ) + ); + put( + "family_caverns_ghost", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aGhost", + "c5752211-7503-3e77-9890-d1cf6ba1d0e7", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTgxOTc3OTE4YTExODBlMGRlYzg3OWU2YmNkMWFhMzk0OTQ5NzdiYjkxM2JlMmFiMDFhZmYxZGIxZmE0In19fQ==" + ) + ); + put( + "family_goblin", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aGoblin", + "7c7d07db-4911-31f1-9a19-1589899cfe25", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjZiOTcyZTMyZDc2MWIxOTI2MjZlNWQ2ZDAxZWRjMDk0OTQwOTEwMTAzY2VhNWUyZTJkMWYyMzFhZGI3NTVkNSJ9fX0=" + ) + ); + put( + "family_team_treasurite", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aGrunt", + "a64ccd19-2a64-39a4-b2f5-cb6799c12a99", + "ewogICJ0aW1lc3RhbXAiIDogMTYxODE5NTA2MDUwMCwKICAicHJvZmlsZUlkIiA6ICI0ZTMwZjUwZTdiYWU0M2YzYWZkMmE3NDUyY2ViZTI5YyIsCiAgInByb2ZpbGVOYW1lIiA6ICJfdG9tYXRvel8iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWY1ZTAzYjhkZTExOWY4NTg5YTgwODIyNGNiZWE3MzdmNWRjZjI0MjM1Nzk5YjczNzhhYzViZjA2YWJmNmRkNCIKICAgIH0KICB9Cn0=" + ) + ); + put( + "family_ice_walker", + Utils.createItemStack(Item.getItemFromBlock(Blocks.packed_ice), EnumChatFormatting.AQUA + "§aIce Walker") + ); + put("family_lapis_zombie", Utils.createItemStack(Items.dye, EnumChatFormatting.AQUA + "§aLapis Zombie", 4)); + put( + "family_diamond_skeleton", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aMiner Skeleton", + "39c843e6-237b-36b2-8a7b-c5ff5d3ebf99", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODM2YmJjNDIxNWNlYTFiNmE0ODRlODkzYjExNmU3MzQ1OWVmMzZiZmZjNjIyNzQxZTU3N2U5NDkzYTQxZTZlIn19fQ==" + ) + ); + put( + "family_diamond_zombie", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aMiner Zombie", + "468210c9-f4bd-34c7-aa8d-2c3d0d5e05c1", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDI4ZDlmZjU0MTg4YTFhZmVlNjViOTRmM2JmY2NlMzIxYzY0M2EzNDU5MGMxNGIxOTJiMmUzZWMyZjUyNWQzIn19fQ==" + ) + ); + put( + "family_redstone_pigman", + Utils.createItemStack(Items.redstone, EnumChatFormatting.AQUA + "§aRedstone Pigman") + ); + put( + "family_sludge", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aSludge", + "3b70a2f3-319c-38d5-b7d1-5b2425770184", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODk1YWVlYzZiODQyYWRhODY2OWY4NDZkNjViYzQ5NzYyNTk3ODI0YWI5NDRmMjJmNDViZjNiYmI5NDFhYmU2YyJ9fX0=" + ) + ); + put( + "family_invisible_creeper", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aSneaky Creeper", + "81fb1385-b2fc-4d4f-b5bb-0fe9b1d37d60", + "ewogICJ0aW1lc3RhbXAiIDogMTYxOTE5MjI5MzI5OCwKICAicHJvZmlsZUlkIiA6ICI0ZjU2ZTg2ODk2OGU0ZWEwYmNjM2M2NzRlNzQ3ODdjOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJDVUNGTDE1IiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2E2ODIyNGNmOGVkNGMwM2I0NTdiZjQ5YmViNmY1NDQxOTM2NzkyNjhiODQyMWIwMWZmY2U2ZDI3YjI1YWMzMmQiCiAgICB9CiAgfQp9" + ) + ); + put( + "family_thyst", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aThyst", + "b3224e56-73d2-32f9-9081-a23b7512035b", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNWJjN2I5ZDM2ZmI5MmI2YmYyOTJiZTczZDMyYzZjNWIwZWNjMjViNDQzMjNhNTQxZmFlMWYxZTY3ZTM5M2EzZSJ9fX0=" + ) + ); + put( + "family_treasure_hoarder", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aTreasure Hoarder", + "b0f13fc2-07a5-3964-8303-784f802e5f0f", + "ewogICJ0aW1lc3RhbXAiIDogMTU5MDE1NjYzNDYzOCwKICAicHJvZmlsZUlkIiA6ICI5MWZlMTk2ODdjOTA0NjU2YWExZmMwNTk4NmRkM2ZlNyIsCiAgInByb2ZpbGVOYW1lIiA6ICJoaGphYnJpcyIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9iMmIxMmE4MTRjZWQ4YWYwMmNkZGYyOWEzN2U3ZjMwMTFlNDMwZThhMThiMzhiNzA2ZjI3YzZiZDMxNjUwYjY1IgogICAgfQogIH0KfQ==" + ) + ); + put( + "family_worms", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aWorm", + "29f95759-1a6f-3e85-9941-91a7a2275274", + "ewogICJ0aW1lc3RhbXAiIDogMTYyMDQ0NTc2NDQ1MSwKICAicHJvZmlsZUlkIiA6ICJmNDY0NTcxNDNkMTU0ZmEwOTkxNjBlNGJmNzI3ZGNiOSIsCiAgInByb2ZpbGVOYW1lIiA6ICJSZWxhcGFnbzA1IiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2RmMDNhZDk2MDkyZjNmNzg5OTAyNDM2NzA5Y2RmNjlkZTZiNzI3YzEyMWIzYzJkYWVmOWZmYTFjY2FlZDE4NmMiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==" + ) + ); + put( + "family_yog", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aYog", + "35f02923-7bec-3869-9ef5-b42a4794cac8", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzg5NTdkNTAyM2M5MzdjNGM0MWFhMjQxMmQ0MzQxMGJkYTIzY2Y3OWE5ZjZhYjM2Yjc2ZmVmMmQ3YzQyOSJ9fX0=" + ) + ); + + // The Park + put( + "family_howling_spirit", + Utils.createSkull( + EnumChatFormatting.AQUA + "§a§bHowling Spirit", + "802a167c-cbcd-3a1f-becd-5b1a25a4cf15", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjdjOGJlZjZiZWI3N2UyOWFmODYyN2VjZGMzOGQ4NmFhMmZlYTdjY2QxNjNkYzczYzAwZjlmMjU4ZjlhMTQ1NyJ9fX0=" + ) + ); + put( + "family_pack_spirit", + Utils.createSkull( + EnumChatFormatting.AQUA + "§a§bPack Spirit", + "802a167c-cbcd-3a1f-becd-5b1a25a4cf15", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjdjOGJlZjZiZWI3N2UyOWFmODYyN2VjZGMzOGQ4NmFhMmZlYTdjY2QxNjNkYzczYzAwZjlmMjU4ZjlhMTQ1NyJ9fX0=" + ) + ); + put( + "family_soul_of_the_alpha", + Utils.createSkull( + EnumChatFormatting.AQUA + "§a§3Soul of the Alpha", + "802a167c-cbcd-3a1f-becd-5b1a25a4cf15", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjdjOGJlZjZiZWI3N2UyOWFmODYyN2VjZGMzOGQ4NmFhMmZlYTdjY2QxNjNkYzczYzAwZjlmMjU4ZjlhMTQ1NyJ9fX0=" + ) + ); + + // Spooky + put( + "family_batty_witch", + Utils.createSkull( + EnumChatFormatting.AQUA + "§a§8Crazy Witch", + "cf4f97d7-2e1f-3678-9ca3-4a7b9666cc28", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmNlNjYwNDE1N2ZjNGFiNTU5MWU0YmNmNTA3YTc0OTkxOGVlOWM0MWUzNTdkNDczNzZlMGVlNzM0MjA3NGM5MCJ9fX0=" + ) + ); + put( + "family_headless_horseman", + Utils.createSkull( + EnumChatFormatting.AQUA + "§a§6Headless Horseman", + "2594a979-1302-3d6e-a1da-c9dbf0959539", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGM2NTcwZjEyNDI5OTJmNmViYTIzZWU1ODI1OThjMzllM2U3NDUzODMyNzNkZWVmOGIzOTc3NTgzZmUzY2Y1In19fQ==" + ) + ); + put( + "family_phantom_spirit", + Utils.createSkull( + EnumChatFormatting.AQUA + "§a§cPhantom Spirit", + "805d7035-5f25-37ea-8530-7c0d09156c8e", + "ewogICJ0aW1lc3RhbXAiIDogMTYwMzcyMjc5NzYzNywKICAicHJvZmlsZUlkIiA6ICJhMmY4MzQ1OTVjODk0YTI3YWRkMzA0OTcxNmNhOTEwYyIsCiAgInByb2ZpbGVOYW1lIiA6ICJiUHVuY2giLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjUzYjJmN2M1ZTE3N2JkNjdjZWFkMzBkMGVlNTM0MjVjNzY4NGM5NzVjOGMyYTUyNzNhMDljYTQ5YTFmNmNkZCIKICAgIH0KICB9Cn0=" + ) + ); + put( + "family_scary_jerry", + Utils.createSkull( + EnumChatFormatting.AQUA + "§a§6Scary Jerry", + "127e3dec-4ab7-3798-9410-5fce3f227632", + "ewogICJ0aW1lc3RhbXAiIDogMTYwMzczMzU4OTcxOSwKICAicHJvZmlsZUlkIiA6ICJhMmY4MzQ1OTVjODk0YTI3YWRkMzA0OTcxNmNhOTEwYyIsCiAgInByb2ZpbGVOYW1lIiA6ICJiUHVuY2giLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGYyMDJkYzI0ZDE1ZjdjZTM2ZTAyZmI0YjNlODE1M2IxNDZhYjljMTcyNGFhYTVkNDg0Yzc0MWRhMGVlYjZmZCIKICAgIH0KICB9Cn0=" + ) + ); + put( + "family_trick_or_treater", + Utils.createSkull( + EnumChatFormatting.AQUA + "§a§eTrick or Treater", + "79dd9434-1fde-3aac-87a7-bb09d91eba77", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDdjYmUwNjFiNDQ1Yjg4Y2IyZGY1OWFjY2M4ZDJjMWMxMjExOGZlMGIyMTI3ZTZlNzU4MTM1NTBhZGFjNjdjZiJ9fX0=" + ) + ); + put( + "family_wither_gourd", + Utils.createSkull( + EnumChatFormatting.AQUA + "§a§6Wither Gourd", + "3263c14e-c555-365e-a244-0ee97a8b2056", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjhmMmZmYzZmYjRlOTk1OWI5YTdhMzE3ZjUxYTY3NzVhMTU5ZGRjMjI0MWRiZDZjNzc0ZDNhYzA4YjYifX19" + ) + ); + put( + "family_wraith", + Utils.createSkull( + EnumChatFormatting.AQUA + "§a§8Wraith", + "bca22b11-8e4c-386a-8824-7b2bd6364cde", + "ewogICJ0aW1lc3RhbXAiIDogMTYwMzczMzcxNjI0MiwKICAicHJvZmlsZUlkIiA6ICJhMmY4MzQ1OTVjODk0YTI3YWRkMzA0OTcxNmNhOTEwYyIsCiAgInByb2ZpbGVOYW1lIiA6ICJiUHVuY2giLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYWVhYmMzMDc1Y2Y0MWYzOGU2ZGYxMjM2Yjk1Y2FhZmNiYTFiZWUyMmM0OWQ4MDRiOTQyNzQ4OGMyZjZlMGVmYyIKICAgIH0KICB9Cn0=" + ) + ); + + // Dungeons + put( + "family_diamond_guy", + Utils.createSkull( + EnumChatFormatting.AQUA + "§a§d§lAngry Archeologist", + "db784d7a-fae1-3d60-9a5a-42a1814037f8", + "eyJ0aW1lc3RhbXAiOjE1NzU0NzAzOTQwMzEsInByb2ZpbGVJZCI6IjdkYTJhYjNhOTNjYTQ4ZWU4MzA0OGFmYzNiODBlNjhlIiwicHJvZmlsZU5hbWUiOiJHb2xkYXBmZWwiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2M0OGM3ODM0NThlNGNmODUxOGU4YWI1ODYzZmJjNGNiOTQ4ZjkwNTY4ZWViOWE2MGQxNmM0ZmRlMmI5NmMwMzMifX19" + ) + ); + put( + "family_cellar_spider", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aCellar Spider", + "a8aee72d-0d1d-3db7-8cf8-be1ce6ec2dc4", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDE2NDVkZmQ3N2QwOTkyMzEwN2IzNDk2ZTk0ZWViNWMzMDMyOWY5N2VmYzk2ZWQ3NmUyMjZlOTgyMjQifX19" + ) + ); + put( + "family_crypt_dreadlord", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aCrypt Dreadlord", + "68b4c885-7447-3382-b86b-b661b464d76e", + "eyJ0aW1lc3RhbXAiOjE1NjI0Mjc0MTA5MTQsInByb2ZpbGVJZCI6ImIwZDczMmZlMDBmNzQwN2U5ZTdmNzQ2MzAxY2Q5OGNhIiwicHJvZmlsZU5hbWUiOiJPUHBscyIsInNpZ25hdHVyZVJlcXVpcmVkIjp0cnVlLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjZmMzQ5MjcwYTNiODUxODk2Y2RhZDg0MmY1ZWVjNmUxNDBiZDkxMTliNzVjMDc0OTU1YzNiZTc4NjVlMjdjNyJ9fX0=" + ) + ); + put( + "family_crypt_lurker", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aCrypt Lurker", + "9673d491-d589-44cb-b63e-5f8b3148b3df", + "ewogICJ0aW1lc3RhbXAiIDogMTY0Njc1NjU2MzM1MiwKICAicHJvZmlsZUlkIiA6ICJkYmQ4MDQ2M2EwMzY0Y2FjYjI3OGNhODBhMDBkZGIxMyIsCiAgInByb2ZpbGVOYW1lIiA6ICJ4bG9nMjEiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjM2NjZkMWJkZjQ1NThiMGQxNjk5MGIyNDFlODE4NWNiZjU4YzNlMDNjMjRkOTA0NTQ0ZThjYzY1YjFjMzhkMSIKICAgIH0KICB9Cn0=\", \"n8vct7fj3NdiODy/h6PJhjxSR2U7d8gQxHjdVq553HqG60SSczt1Tl9XhvQbZP14ZrJGWxCziauuYb/HjZza0ugNAhfwh9z8hqR1PjBJGdvp+wpxoWpP2wd5RT9i5/GYEqpiAIAt9vHY1YeyejFqKZhXaGgp7gZZNjOQWQqB0SZzTUTAPzRW9FiY8x2re7H7Y1POThRXOvvkeQ6qWdPV6Hk5hTumV0rfEGm971jQRIbfdzBZDJRcro+8y+dlje/NpF5qf0JLy78Xr4hc2cwbT9+wqOeoUTcM/r9mwL15OKgFLjB44jszauKRHNfoqb6B3+1fNQEJrJK/7hIyvswpde7C5uOxkE7oMFib6X68VVEhb6PGC1+HWNaMaGjI0wWEkCahp48ihN9+sBEBFXOxIAhXG/pvJcbEi742/cBS1CTtOI8qui6JSL9MKX5jmyhtjjibOYRZbacosqayCnwsJAdMmwS7zIxc8jGhpfKECiSni/baS4zRla0bns4hfEM0l7ASv0Dh99WQD0We2ZMqltmix8lMEaAILXJVBln3CFrjYvncfku2hrSaqu1lNAtfMYYSITEUCBJ7McVAVmUHOrER0XGoVs9L237H0BQNSLqlGGEQ7OM8HV6G0YfXGlbNgNBx6O9k8ZijuK60JeEoJapcmbNj/LVHEU+dsgcFAbo=" + ) + ); + put( + "family_crypt_souleater", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aCrypt Souleater", + "68b4c885-7447-3382-b86b-b661b464d76e", + "eyJ0aW1lc3RhbXAiOjE1NjI0Mjc0MTA5MTQsInByb2ZpbGVJZCI6ImIwZDczMmZlMDBmNzQwN2U5ZTdmNzQ2MzAxY2Q5OGNhIiwicHJvZmlsZU5hbWUiOiJPUHBscyIsInNpZ25hdHVyZVJlcXVpcmVkIjp0cnVlLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjZmMzQ5MjcwYTNiODUxODk2Y2RhZDg0MmY1ZWVjNmUxNDBiZDkxMTliNzVjMDc0OTU1YzNiZTc4NjVlMjdjNyJ9fX0=" + ) + ); + put( + "family_king_midas", + Utils.createSkull( + EnumChatFormatting.AQUA + "§a§d§lKing Midas", + "1a85d923-f8dd-35b8-899a-8f13b9469b0c", + "ewogICJ0aW1lc3RhbXAiIDogMTU5MTU3NjA3MDMwMCwKICAicHJvZmlsZUlkIiA6ICJkYTQ5OGFjNGU5Mzc0ZTVjYjYxMjdiMzgwODU1Nzk4MyIsCiAgInByb2ZpbGVOYW1lIiA6ICJOaXRyb2hvbGljXzIiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjJiY2EwODU3NTAwNDM1MDNmNWRmOWY3ZGVmODI0YTJlM2FjZmMyNzg0MmJjZDA5ZDJiNjY5NTg4MWU4MzJmNSIKICAgIH0KICB9Cn0=" + ) + ); + put( + "family_lonely_spider", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aLonely Spider", + "7c63f3cf-a963-311a-aeca-3a075b417806", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2Q1NDE1NDFkYWFmZjUwODk2Y2QyNThiZGJkZDRjZjgwYzNiYTgxNjczNTcyNjA3OGJmZTM5MzkyN2U1N2YxIn19fQ==" + ) + ); + put( + "family_lost_adventurer", + Utils.createSkull( + EnumChatFormatting.AQUA + "§a§d§lLost Adventurer", + "f69ba621-a8b6-31a7-8de1-dc7ade140e1d", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHBzOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzFlMDMyOWY0MjE5MmVlN2MxYTBjNzA0ZjgyZGJiYmU3YzAwZmJmYTNmMDIwYzEwNjdhMjA4NjMwYjk5MWI5ODgifX19" + ) + ); + put( + "family_scared_skeleton", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aScared Skeleton", + "53924f1a-87e6-4709-8e53-f1c7d13dc239", + "ewogICJ0aW1lc3RhbXAiIDogMTY1NTYzMTgzNjcwNCwKICAicHJvZmlsZUlkIiA6ICI1MzkyNGYxYTg3ZTY0NzA5OGU1M2YxYzdkMTNkYzIzOSIsCiAgInByb2ZpbGVOYW1lIiA6ICJUaHJvd3BvIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzg4ZWI2OGE0ZDM4ZTlmNDQ2YjhlOTkyNzVmMTYwMzAyZjM2NmVmMTAyMTZhYmY5NDg0ODdlNTgyNTEyYmQwZjMiCiAgICB9CiAgfQp9=" + ) + ); + put( + "family_shadow_assassin", + Utils.createSkull( + EnumChatFormatting.AQUA + "§a§d§lShadow Assassin", + "ef18719c-db6a-3ffb-97ca-4ed764ce9464", + "ewogICJ0aW1lc3RhbXAiIDogMTU5MjI2ODE3MDkxMSwKICAicHJvZmlsZUlkIiA6ICJkYTQ5OGFjNGU5Mzc0ZTVjYjYxMjdiMzgwODU1Nzk4MyIsCiAgInByb2ZpbGVOYW1lIiA6ICJOaXRyb2hvbGljXzIiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzM5OWUwMGY0MDQ0MTFlNDY1ZDc0Mzg4ZGYxMzJkNTFmZTg2OGVjZjg2ZjFjMDczZmFmZmExZDkxNzJlYzBmMyIKICAgIH0KICB9Cn0=" + ) + ); + put( + "family_skeleton_grunt", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aSkeleton Grunt", + "dfed3415-919e-3358-b563-0abd0513f74c", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzA0NzE2NzdiMzdhZTg0MmMyYmQyMzJlMTZlZWI4NGQ1YTQ5MzIzMWVlY2VjMDcyZGEzOGJlMzEyN2RkNWM4In19fQ==" + ) + ); + put( + "family_skeleton_master", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aSkeleton Master", + "ce22e0d7-c78e-3c8d-907a-2368c927808c", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzRlOTVlMWI3ZGM4MmJhNzg0NWE2OGZjNmEzMTJmNGNkOTBlZTJmNmNjZTI2YTY4Yzg4YjA0YjEwNzJkODc5In19fQ==" + ) + ); + put( + "family_skeleton_soldier", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aSkeleton Soldier", + "cab75065-c896-338e-a399-c4a6da16d678", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjE5Njg4ZTBjMmYwNWFlYjk3OWQ2YTFiOGM5MTE5NTdiN2QzNjU3ZTE0YjU3YWY5M2M1ZWY2ZjZhNTk1NjlkZCJ9fX0=" + ) + ); + put( + "family_skeletor", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aSkeletor", + "49fcfb3e-da7e-3fda-b4f9-37df5ac8fbd3", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODlkMDc0YWQ5Yjk5NzE4NzllYjMyNWJkZGZmMzY3NWY3MjI0ODU2YmQ2ZDU2OWZjOGQ0ODNjMTMzZDczMDA1ZCJ9fX0K" + ) + ); + put( + "family_sniper_skeleton", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aSniper", + "848130dc-9c46-3818-a099-b429cb2f1d75", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjE4YzA3MWYwODBkYmE1MGE2MmE2MjYzZmY3MjRlZGMxNTdjZTRmYjQ4ODNjY2VmZjI0OTFkNWJiZGU4MzBjMSJ9fX0K" + ) + ); + put( + "family_super_archer", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aSuper Archer", + "8ebf155b-7b8f-386f-91f1-2e425db4230f", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGNhZTZkYjBiNTlhNjQzMDUwNzZkOTY2ZDhlN2I5YTk3YmU0NmRhZTNhODA3NzE0ZmE4NmQzNzg0OGY2In19fQ==" + ) + ); + put( + "family_super_tank_zombie", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aSuper Tank Zombie", + "9673d491-d589-44cb-b63e-5f8b3148b3df", + "ewogICJ0aW1lc3RhbXAiIDogMTY0Njc1NjU2MzM1MiwKICAicHJvZmlsZUlkIiA6ICJkYmQ4MDQ2M2EwMzY0Y2FjYjI3OGNhODBhMDBkZGIxMyIsCiAgInByb2ZpbGVOYW1lIiA6ICJ4bG9nMjEiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjM2NjZkMWJkZjQ1NThiMGQxNjk5MGIyNDFlODE4NWNiZjU4YzNlMDNjMjRkOTA0NTQ0ZThjYzY1YjFjMzhkMSIKICAgIH0KICB9Cn0=\", \"n8vct7fj3NdiODy/h6PJhjxSR2U7d8gQxHjdVq553HqG60SSczt1Tl9XhvQbZP14ZrJGWxCziauuYb/HjZza0ugNAhfwh9z8hqR1PjBJGdvp+wpxoWpP2wd5RT9i5/GYEqpiAIAt9vHY1YeyejFqKZhXaGgp7gZZNjOQWQqB0SZzTUTAPzRW9FiY8x2re7H7Y1POThRXOvvkeQ6qWdPV6Hk5hTumV0rfEGm971jQRIbfdzBZDJRcro+8y+dlje/NpF5qf0JLy78Xr4hc2cwbT9+wqOeoUTcM/r9mwL15OKgFLjB44jszauKRHNfoqb6B3+1fNQEJrJK/7hIyvswpde7C5uOxkE7oMFib6X68VVEhb6PGC1+HWNaMaGjI0wWEkCahp48ihN9+sBEBFXOxIAhXG/pvJcbEi742/cBS1CTtOI8qui6JSL9MKX5jmyhtjjibOYRZbacosqayCnwsJAdMmwS7zIxc8jGhpfKECiSni/baS4zRla0bns4hfEM0l7ASv0Dh99WQD0We2ZMqltmix8lMEaAILXJVBln3CFrjYvncfku2hrSaqu1lNAtfMYYSITEUCBJ7McVAVmUHOrER0XGoVs9L237H0BQNSLqlGGEQ7OM8HV6G0YfXGlbNgNBx6O9k8ZijuK60JeEoJapcmbNj/LVHEU+dsgcFAbo=" + ) + ); + put( + "family_crypt_tank_zombie", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aTank Zombie", + "9673d491-d589-44cb-b63e-5f8b3148b3df", + "ewogICJ0aW1lc3RhbXAiIDogMTY0Njc1NjU2MzM1MiwKICAicHJvZmlsZUlkIiA6ICJkYmQ4MDQ2M2EwMzY0Y2FjYjI3OGNhODBhMDBkZGIxMyIsCiAgInByb2ZpbGVOYW1lIiA6ICJ4bG9nMjEiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjM2NjZkMWJkZjQ1NThiMGQxNjk5MGIyNDFlODE4NWNiZjU4YzNlMDNjMjRkOTA0NTQ0ZThjYzY1YjFjMzhkMSIKICAgIH0KICB9Cn0=\", \"n8vct7fj3NdiODy/h6PJhjxSR2U7d8gQxHjdVq553HqG60SSczt1Tl9XhvQbZP14ZrJGWxCziauuYb/HjZza0ugNAhfwh9z8hqR1PjBJGdvp+wpxoWpP2wd5RT9i5/GYEqpiAIAt9vHY1YeyejFqKZhXaGgp7gZZNjOQWQqB0SZzTUTAPzRW9FiY8x2re7H7Y1POThRXOvvkeQ6qWdPV6Hk5hTumV0rfEGm971jQRIbfdzBZDJRcro+8y+dlje/NpF5qf0JLy78Xr4hc2cwbT9+wqOeoUTcM/r9mwL15OKgFLjB44jszauKRHNfoqb6B3+1fNQEJrJK/7hIyvswpde7C5uOxkE7oMFib6X68VVEhb6PGC1+HWNaMaGjI0wWEkCahp48ihN9+sBEBFXOxIAhXG/pvJcbEi742/cBS1CTtOI8qui6JSL9MKX5jmyhtjjibOYRZbacosqayCnwsJAdMmwS7zIxc8jGhpfKECiSni/baS4zRla0bns4hfEM0l7ASv0Dh99WQD0We2ZMqltmix8lMEaAILXJVBln3CFrjYvncfku2hrSaqu1lNAtfMYYSITEUCBJ7McVAVmUHOrER0XGoVs9L237H0BQNSLqlGGEQ7OM8HV6G0YfXGlbNgNBx6O9k8ZijuK60JeEoJapcmbNj/LVHEU+dsgcFAbo=" + ) + ); + put( + "family_watcher_summon_undead", + Utils.createSkull( + EnumChatFormatting.AQUA + "§a§4§lUndead", + "0ac53e90-4e60-388c-a754-092dd4578592", + "eyJ0aW1lc3RhbXAiOjE1ODYwNDAyMDM1NzMsInByb2ZpbGVJZCI6ImRhNDk4YWM0ZTkzNzRlNWNiNjEyN2IzODA4NTU3OTgzIiwicHJvZmlsZU5hbWUiOiJOaXRyb2hvbGljXzIiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2Y0NjI0YTlhOGM2OWNhMjA0NTA0YWJiMDQzZDQ3NDU2Y2Q5YjA5NzQ5YTM2MzU3NDYyMzAzZjI3NmEyMjlkNCJ9fX0=" + ) + ); + put( + "family_dungeon_respawning_skeleton", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aUndead Skeleton", + "53924f1a-87e6-4709-8e53-f1c7d13dc239", + "ewogICJ0aW1lc3RhbXAiIDogMTY1NTYzMTgzNjcwNCwKICAicHJvZmlsZUlkIiA6ICI1MzkyNGYxYTg3ZTY0NzA5OGU1M2YxYzdkMTNkYzIzOSIsCiAgInByb2ZpbGVOYW1lIiA6ICJUaHJvd3BvIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzg4ZWI2OGE0ZDM4ZTlmNDQ2YjhlOTkyNzVmMTYwMzAyZjM2NmVmMTAyMTZhYmY5NDg0ODdlNTgyNTEyYmQwZjMiCiAgICB9CiAgfQp9=" + ) + ); + put( + "family_crypt_witherskeleton", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aWithermancer", + "d0e05de7-6067-454d-beae-c6d19d886191", + "ewogICJ0aW1lc3RhbXAiIDogMTY1NTYzMjg1MTE1NCwKICAicHJvZmlsZUlkIiA6ICJkMGUwNWRlNzYwNjc0NTRkYmVhZWM2ZDE5ZDg4NjE5MSIsCiAgInByb2ZpbGVOYW1lIiA6ICJNb3VsYmVycnkiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmNlMTU1MjI0ZWE0YmM0OWE4ZTkxOTA3MzdjYjA0MTdkOGE3YzM4YTAzN2Q4ZDAzODJkZGU0ODI5YzEwMzU5MCIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9" + ) + ); + put( + "family_zombie_commander", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aZombie Commander", + "9673d491-d589-44cb-b63e-5f8b3148b3df", + "ewogICJ0aW1lc3RhbXAiIDogMTY0Njc1NjU2MzM1MiwKICAicHJvZmlsZUlkIiA6ICJkYmQ4MDQ2M2EwMzY0Y2FjYjI3OGNhODBhMDBkZGIxMyIsCiAgInByb2ZpbGVOYW1lIiA6ICJ4bG9nMjEiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjM2NjZkMWJkZjQ1NThiMGQxNjk5MGIyNDFlODE4NWNiZjU4YzNlMDNjMjRkOTA0NTQ0ZThjYzY1YjFjMzhkMSIKICAgIH0KICB9Cn0=\", \"n8vct7fj3NdiODy/h6PJhjxSR2U7d8gQxHjdVq553HqG60SSczt1Tl9XhvQbZP14ZrJGWxCziauuYb/HjZza0ugNAhfwh9z8hqR1PjBJGdvp+wpxoWpP2wd5RT9i5/GYEqpiAIAt9vHY1YeyejFqKZhXaGgp7gZZNjOQWQqB0SZzTUTAPzRW9FiY8x2re7H7Y1POThRXOvvkeQ6qWdPV6Hk5hTumV0rfEGm971jQRIbfdzBZDJRcro+8y+dlje/NpF5qf0JLy78Xr4hc2cwbT9+wqOeoUTcM/r9mwL15OKgFLjB44jszauKRHNfoqb6B3+1fNQEJrJK/7hIyvswpde7C5uOxkE7oMFib6X68VVEhb6PGC1+HWNaMaGjI0wWEkCahp48ihN9+sBEBFXOxIAhXG/pvJcbEi742/cBS1CTtOI8qui6JSL9MKX5jmyhtjjibOYRZbacosqayCnwsJAdMmwS7zIxc8jGhpfKECiSni/baS4zRla0bns4hfEM0l7ASv0Dh99WQD0We2ZMqltmix8lMEaAILXJVBln3CFrjYvncfku2hrSaqu1lNAtfMYYSITEUCBJ7McVAVmUHOrER0XGoVs9L237H0BQNSLqlGGEQ7OM8HV6G0YfXGlbNgNBx6O9k8ZijuK60JeEoJapcmbNj/LVHEU+dsgcFAbo=" + ) + ); + put( + "family_zombie_grunt", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aZombie Grunt", + "9673d491-d589-44cb-b63e-5f8b3148b3df", + "ewogICJ0aW1lc3RhbXAiIDogMTY0Njc1NjU2MzM1MiwKICAicHJvZmlsZUlkIiA6ICJkYmQ4MDQ2M2EwMzY0Y2FjYjI3OGNhODBhMDBkZGIxMyIsCiAgInByb2ZpbGVOYW1lIiA6ICJ4bG9nMjEiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjM2NjZkMWJkZjQ1NThiMGQxNjk5MGIyNDFlODE4NWNiZjU4YzNlMDNjMjRkOTA0NTQ0ZThjYzY1YjFjMzhkMSIKICAgIH0KICB9Cn0=\", \"n8vct7fj3NdiODy/h6PJhjxSR2U7d8gQxHjdVq553HqG60SSczt1Tl9XhvQbZP14ZrJGWxCziauuYb/HjZza0ugNAhfwh9z8hqR1PjBJGdvp+wpxoWpP2wd5RT9i5/GYEqpiAIAt9vHY1YeyejFqKZhXaGgp7gZZNjOQWQqB0SZzTUTAPzRW9FiY8x2re7H7Y1POThRXOvvkeQ6qWdPV6Hk5hTumV0rfEGm971jQRIbfdzBZDJRcro+8y+dlje/NpF5qf0JLy78Xr4hc2cwbT9+wqOeoUTcM/r9mwL15OKgFLjB44jszauKRHNfoqb6B3+1fNQEJrJK/7hIyvswpde7C5uOxkE7oMFib6X68VVEhb6PGC1+HWNaMaGjI0wWEkCahp48ihN9+sBEBFXOxIAhXG/pvJcbEi742/cBS1CTtOI8qui6JSL9MKX5jmyhtjjibOYRZbacosqayCnwsJAdMmwS7zIxc8jGhpfKECiSni/baS4zRla0bns4hfEM0l7ASv0Dh99WQD0We2ZMqltmix8lMEaAILXJVBln3CFrjYvncfku2hrSaqu1lNAtfMYYSITEUCBJ7McVAVmUHOrER0XGoVs9L237H0BQNSLqlGGEQ7OM8HV6G0YfXGlbNgNBx6O9k8ZijuK60JeEoJapcmbNj/LVHEU+dsgcFAbo=" + ) + ); + put( + "family_zombie_knight", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aZombie Knight", + "34af9e21-dff4-3b94-9fb5-07816e41af75", + "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjVkMmYzMWJhMTYyZmU2MjcyZTgzMWFlZDE3ZjUzMjEzZGI2ZmExYzRjYmU0ZmM4MjdmMzk2M2NjOThiOSJ9fX0=" + ) + ); + put( + "family_zombie_soldier", + Utils.createSkull( + EnumChatFormatting.AQUA + "§aZombie Soldier", + "9673d491-d589-44cb-b63e-5f8b3148b3df", + "ewogICJ0aW1lc3RhbXAiIDogMTY0Njc1NjU2MzM1MiwKICAicHJvZmlsZUlkIiA6ICJkYmQ4MDQ2M2EwMzY0Y2FjYjI3OGNhODBhMDBkZGIxMyIsCiAgInByb2ZpbGVOYW1lIiA6ICJ4bG9nMjEiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjM2NjZkMWJkZjQ1NThiMGQxNjk5MGIyNDFlODE4NWNiZjU4YzNlMDNjMjRkOTA0NTQ0ZThjYzY1YjFjMzhkMSIKICAgIH0KICB9Cn0=\", \"n8vct7fj3NdiODy/h6PJhjxSR2U7d8gQxHjdVq553HqG60SSczt1Tl9XhvQbZP14ZrJGWxCziauuYb/HjZza0ugNAhfwh9z8hqR1PjBJGdvp+wpxoWpP2wd5RT9i5/GYEqpiAIAt9vHY1YeyejFqKZhXaGgp7gZZNjOQWQqB0SZzTUTAPzRW9FiY8x2re7H7Y1POThRXOvvkeQ6qWdPV6Hk5hTumV0rfEGm971jQRIbfdzBZDJRcro+8y+dlje/NpF5qf0JLy78Xr4hc2cwbT9+wqOeoUTcM/r9mwL15OKgFLjB44jszauKRHNfoqb6B3+1fNQEJrJK/7hIyvswpde7C5uOxkE7oMFib6X68VVEhb6PGC1+HWNaMaGjI0wWEkCahp48ihN9+sBEBFXOxIAhXG/pvJcbEi742/cBS1CTtOI8qui6JSL9MKX5jmyhtjjibOYRZbacosqayCnwsJAdMmwS7zIxc8jGhpfKECiSni/baS4zRla0bns4hfEM0l7ASv0Dh99WQD0We2ZMqltmix8lMEaAILXJVBln3CFrjYvncfku2hrSaqu1lNAtfMYYSITEUCBJ7McVAVmUHOrER0XGoVs9L237H0BQNSLqlGGEQ7OM8HV6G0YfXGlbNgNBx6O9k8ZijuK60JeEoJapcmbNj/LVHEU+dsgcFAbo=" + ) + ); + }}; + + public static LinkedHashMap getBestiaryMobs() { + return bestiaryMobs; + } + + private static final LinkedHashMap mobTypeMap = + new LinkedHashMap() {{ + // Island + put("family_cave_spider", "ISLAND"); + put("family_enderman_private", "ISLAND"); + put("family_skeleton", "ISLAND"); + put("family_slime", "ISLAND"); + put("family_spider", "ISLAND"); + put("family_witch", "ISLAND"); + put("family_zombie", "ISLAND"); + + // Hub + put("family_unburried_zombie", "MOB"); + put("family_old_wolf", "MOB"); + put("family_ruin_wolf", "MOB"); + put("family_zombie_villager", "MOB"); + + // Spiders Den + put("family_arachne", "BOSS"); + put("family_arachne_brood", "MOB"); + put("family_arachne_keeper", "MOB"); + put("family_brood_mother_spider", "BOSS"); + put("family_dasher_spider", "MOB"); + put("family_respawning_skeleton", "MOB"); + put("family_random_slime", "MOB"); + put("family_spider_jockey", "MOB"); + put("family_splitter_spider", "MOB"); + put("family_voracious_spider", "MOB"); + put("family_weaver_spider", "MOB"); + + // The End + put("family_dragon", "BOSS"); + put("family_enderman", "MOB"); + put("family_endermite", "MOB"); + put("family_corrupted_protector", "BOSS"); + put("family_obsidian_wither", "MOB"); + put("family_voidling_extremist", "MOB"); + put("family_voidling_fanatic", "MOB"); + put("family_watcher", "MOB"); + put("family_zealot_enderman", "MOB"); + + // Crimson Isles + put("family_ashfang", "BOSS"); + put("family_barbarian_duke_x", "BOSS"); + put("family_bladesoul", "BOSS"); + put("family_blaze", "MOB"); + put("family_flaming_spider", "MOB"); + put("family_ghast", "MOB"); + put("family_mage_outlaw", "BOSS"); + put("family_magma_cube", "MOB"); + put("family_magma_cube_boss", "BOSS"); + put("family_matcho", "MOB"); + put("family_charging_mushroom_cow", "MOB"); + put("family_pigman", "MOB"); + put("family_wither_skeleton", "MOB"); + put("family_wither_spectre", "MOB"); + + // Deep Caverns + put("family_automaton", "MOB"); + put("family_butterfly", "MOB"); + put("family_emerald_slime", "MOB"); + put("family_caverns_ghost", "MOB"); + put("family_goblin", "MOB"); + put("family_team_treasurite", "MOB"); + put("family_ice_walker", "MOB"); + put("family_lapis_zombie", "MOB"); + put("family_diamond_skeleton", "MOB"); + put("family_diamond_zombie", "MOB"); + put("family_redstone_pigman", "MOB"); + put("family_sludge", "MOB"); + put("family_invisible_creeper", "MOB"); + put("family_thyst", "MOB"); + put("family_treasure_hoarder", "MOB"); + put("family_worms", "MOB"); + put("family_yog", "MOB"); + + // The Park + put("family_howling_spirit", "MOB"); + put("family_pack_spirit", "MOB"); + put("family_soul_of_the_alpha", "MOB"); + + // Spooky + put("family_batty_witch", "MOB"); + put("family_headless_horseman", "BOSS"); + put("family_phantom_spirit", "MOB"); + put("family_scary_jerry", "MOB"); + put("family_trick_or_treater", "MOB"); + put("family_wither_gourd", "MOB"); + put("family_wraith", "MOB"); + + // Catacombs + put("family_diamond_guy", "MOB"); + put("family_cellar_spider", "MOB"); + put("family_crypt_dreadlord", "MOB"); + put("family_crypt_lurker", "MOB"); + put("family_crypt_souleater", "MOB"); + put("family_king_midas", "MOB"); + put("family_lonely_spider", "MOB"); + put("family_lost_adventurer", "MOB"); + put("family_scared_skeleton", "MOB"); + put("family_shadow_assassin", "MOB"); + put("family_skeleton_grunt", "MOB"); + put("family_skeleton_master", "MOB"); + put("family_skeleton_soldier", "MOB"); + put("family_skeletor", "MOB"); + put("family_sniper_skeleton", "MOB"); + put("family_super_archer", "MOB"); + put("family_super_tank_zombie", "MOB"); + put("family_crypt_tank_zombie", "MOB"); + put("family_watcher_summon_undead", "MOB"); + put("family_dungeon_respawning_skeleton", "MOB"); + put("family_crypt_witherskeleton", "MOB"); + put("family_zombie_commander", "MOB"); + put("family_zombie_grunt", "MOB"); + put("family_zombie_knight", "MOB"); + put("family_zombie_soldier", "MOB"); + + }}; + + public static LinkedHashMap getMobType() { + return mobTypeMap; + } + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java new file mode 100644 index 00000000..1bd3770a --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java @@ -0,0 +1,279 @@ +/* + * 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.profileviewer.bestiary; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; +import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; +import io.github.moulberry.notenoughupdates.util.Constants; +import io.github.moulberry.notenoughupdates.util.Utils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +import java.awt.*; +import java.text.NumberFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +public class BestiaryPage { + + private static int guiLeft; + private static int guiTop; + private static final ResourceLocation BESTIARY_TEXTURE = new ResourceLocation( + "notenoughupdates:pv_bestiary_tab.png"); + public static final ResourceLocation pv_elements = new ResourceLocation("notenoughupdates:pv_elements.png"); + private static ItemStack selectedBestiaryLocation = null; + private static List tooltipToDisplay = null; + private static final NumberFormat numberFormat = NumberFormat.getInstance(Locale.US); + private static final int XCOUNT = 7; + private static final int YCOUNT = 5; + private static final float XPADDING = (190 - XCOUNT * 20) / (float) (XCOUNT + 1); + private static final float YPADDING = (202 - YCOUNT * 20) / (float) (YCOUNT + 1); + + public static void renderPage(int mouseX, int mouseY) { + guiLeft = GuiProfileViewer.getGuiLeft(); + guiTop = GuiProfileViewer.getGuiTop(); + JsonObject profileInfo = GuiProfileViewer.getProfile().getProfileInformation(GuiProfileViewer.getProfileId()); + + int bestiarySize = BestiaryData.getBestiaryLocations().size(); + int bestiaryXSize = (int) (350f / (bestiarySize - 1 + 0.0000001f)); + + { + int yIndex = 0; + for (ItemStack stack : BestiaryData.getBestiaryLocations().keySet()) { + Minecraft.getMinecraft().getTextureManager().bindTexture(pv_elements); + if (stack == selectedBestiaryLocation) { + Utils.drawTexturedRect(guiLeft + 30 + bestiaryXSize * yIndex, guiTop + 10, 20, 20, + 20 / 256f, 0, 20 / 256f, 0, GL11.GL_NEAREST + ); + Utils.drawItemStack( + stack, + guiLeft + 32 + bestiaryXSize * yIndex, + guiTop + 12 + ); + } else { + Utils.drawTexturedRect(guiLeft + 30 + bestiaryXSize * yIndex, guiTop + 10, 20, 20, + 0, 20 / 256f, 0, 20 / 256f, GL11.GL_NEAREST + ); + Utils.drawItemStack(stack, guiLeft + 32 + bestiaryXSize * yIndex, guiTop + 12); + } + yIndex++; + } + } + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + int width = scaledResolution.getScaledWidth(); + int height = scaledResolution.getScaledHeight(); + + Minecraft.getMinecraft().getTextureManager().bindTexture(BESTIARY_TEXTURE); + Utils.drawTexturedRect(guiLeft, guiTop, 431, 202, GL11.GL_NEAREST); + + GlStateManager.color(1, 1, 1, 1); + GlStateManager.disableLighting(); + RenderHelper.enableGUIStandardItemLighting(); + + List mobs = BestiaryData.getBestiaryLocations().get(selectedBestiaryLocation); + Color color = new Color(128, 128, 128, 255); + if (mobs != null) { + for (int i = 0; i < mobs.size(); i++) { + + String mob = mobs.get(i); + if (mob != null) { + ItemStack mobItem = BestiaryData.getBestiaryMobs().get(mob); + if (mobItem != null) { + int xIndex = i % XCOUNT; + int yIndex = i / XCOUNT; + + float x = 23 + XPADDING + (XPADDING + 20) * xIndex; + float y = 30 + YPADDING + (YPADDING + 20) * yIndex; + + float completedness = 0; + + GlStateManager.color(1, 1, 1, 1); + Minecraft.getMinecraft().getTextureManager().bindTexture(pv_elements); + Utils.drawTexturedRect(guiLeft + x, guiTop + y, 20, 20 * (1 - completedness), + 0, 20 / 256f, 0, 20 * (1 - completedness) / 256f, GL11.GL_NEAREST + ); + GlStateManager.color(1, 185 / 255f, 0, 1); + Minecraft.getMinecraft().getTextureManager().bindTexture(pv_elements); + Utils.drawTexturedRect(guiLeft + x, guiTop + y + 20 * (1 - completedness), 20, 20 * (completedness), + 0, 20 / 256f, 20 * (1 - completedness) / 256f, 20 / 256f, GL11.GL_NEAREST + ); + Utils.drawItemStack(mobItem, guiLeft + (int) x + 2, guiTop + (int) y + 2); + float kills = Utils.getElementAsFloat(Utils.getElement(profileInfo, "bestiary.kills_" + mob), 0); + float deaths = Utils.getElementAsFloat(Utils.getElement(profileInfo, "bestiary.deaths_" + mob), 0); + + String type; + if (BestiaryData.getMobType().get(mob) != null) { + type = BestiaryData.getMobType().get(mob); + } else { + type = "MOB"; + } + JsonObject leveling = Constants.LEVELING; + ProfileViewer.Level level = null; + if (leveling != null && Utils.getElement(leveling, "bestiary." + type) != null) { + JsonArray levelingArray = Utils.getElement(leveling, "bestiary." + type).getAsJsonArray(); + int levelCap = Utils.getElementAsInt(Utils.getElement(leveling, "bestiary.caps." + type), 0); + level = ProfileViewer.getLevel(levelingArray, kills, levelCap, false); + } else { + Utils.showOutdatedRepoNotification(); + } + + float levelNum = -1; + if (level != null) { + levelNum = level.level; + } + if (mouseX > guiLeft + (int) x + 2 && mouseX < guiLeft + (int) x + 18) { + if (mouseY > guiTop + (int) y + 2 && mouseY < guiTop + (int) y + 18) { + tooltipToDisplay = new ArrayList<>(); + tooltipToDisplay.add(mobItem.getDisplayName() + " " + ((levelNum == -1) ? "?" : (int) Math.floor(levelNum))); + tooltipToDisplay.add(EnumChatFormatting.GRAY + "Kills: " + EnumChatFormatting.GREEN + numberFormat.format(kills)); + tooltipToDisplay.add(EnumChatFormatting.GRAY + "Deaths: " + EnumChatFormatting.GREEN + numberFormat.format(deaths)); + if (level != null) { + tooltipToDisplay.add(EnumChatFormatting.GRAY + "Progress: " + EnumChatFormatting.AQUA + + GuiProfileViewer.shortNumberFormat(Math.round((levelNum % 1) * level.maxXpForLevel), 0) + "/" + + GuiProfileViewer.shortNumberFormat(level.maxXpForLevel, 0)); + } + } + } + + GlStateManager.color(1, 1, 1, 1); +// if (tier >= 0) { +// Utils.drawStringCentered(tierString, Minecraft.getMinecraft().fontRendererObj, +// guiLeft + x + 10, guiTop + y - 4, true, +// tierStringColour +// ); +// } + Utils.drawStringCentered((int) Math.floor(levelNum) + "", Minecraft.getMinecraft().fontRendererObj, + guiLeft + x + 10, guiTop + y + 26, true, + color.getRGB() + ); + } + } + Utils.renderAlignedString(EnumChatFormatting.RED + "Bestiary Level: ", + EnumChatFormatting.GRAY + "" + (float) getBeTiers(profileInfo) / 10, + guiLeft + 220, guiTop + 50, 110 + ); + } + } + if (tooltipToDisplay != null) { + List grayTooltip = new ArrayList<>(tooltipToDisplay.size()); + for (String line : tooltipToDisplay) { + grayTooltip.add(EnumChatFormatting.GRAY + line); + } + Utils.drawHoveringText(grayTooltip, mouseX, mouseY, width, height, -1, Minecraft.getMinecraft().fontRendererObj); + tooltipToDisplay = null; + } + } + + public static void mouseReleased(int mouseX, int mouseY, int mouseButton) { + int bestiarySize = BestiaryData.getBestiaryLocations().size(); + int bestiaryYSize = (int) (350f / (bestiarySize - 1 + 0.0000001f)); + int yIndex = 0; + for (ItemStack stack : BestiaryData.getBestiaryLocations().keySet()) { + if (mouseX > guiLeft + 30 + bestiaryYSize * yIndex && + mouseX < guiLeft + 30 + bestiaryYSize * yIndex + 20) { + if (mouseY > guiTop + 10 && mouseY < guiTop + 10 + 20) { + selectedBestiaryLocation = stack; + Utils.playPressSound(); + return; + } + } + yIndex++; + } + } + + public static int getBeTiers(JsonObject profileInfo) { + int beLevel = 0; + for (ItemStack items : BestiaryData.getBestiaryLocations().keySet()) { + List mobs = BestiaryData.getBestiaryLocations().get(items); + if (mobs != null) { + for (int i = 0; i < mobs.size(); i++) { + + String mob = mobs.get(i); + if (mob != null) { + float kills = Utils.getElementAsFloat(Utils.getElement(profileInfo, "bestiary.kills_" + mob), 0); + String type; + if (BestiaryData.getMobType().get(mob) != null) { + type = BestiaryData.getMobType().get(mob); + } else { + type = "MOB"; + } + JsonObject leveling = Constants.LEVELING; + ProfileViewer.Level level = null; + if (leveling != null && Utils.getElement(leveling, "bestiary." + type) != null) { + JsonArray levelingArray = Utils.getElement(leveling, "bestiary." + type).getAsJsonArray(); + int levelCap = Utils.getElementAsInt(Utils.getElement(leveling, "bestiary.caps." + type), 0); + level = ProfileViewer.getLevel(levelingArray, kills, levelCap, false); + } + + float levelNum = 0; + if (level != null) { + levelNum = level.level; + } + beLevel += (int) Math.floor(levelNum); + } + } + } + } + return beLevel; + } + + public static int getBeTiersFromPage(JsonObject profileInfo) { + int beLevel = 0; + List mobs = BestiaryData.getBestiaryLocations().get(selectedBestiaryLocation); + if (mobs != null) { + for (int i = 0; i < mobs.size(); i++) { + + String mob = mobs.get(i); + if (mob != null) { + float kills = Utils.getElementAsFloat(Utils.getElement(profileInfo, "bestiary.kills_" + mob), 0); + String type; + if (BestiaryData.getMobType().get(mob) != null) { + type = BestiaryData.getMobType().get(mob); + } else { + type = "MOB"; + } + JsonObject leveling = Constants.LEVELING; + ProfileViewer.Level level = null; + if (leveling != null) { + JsonArray levelingArray = Utils.getElement(leveling, "bestiary." + type).getAsJsonArray(); + int levelCap = Utils.getElementAsInt(Utils.getElement(leveling, "bestiary.caps." + type), 0); + level = ProfileViewer.getLevel(levelingArray, kills, levelCap, false); + } + + float levelNum = 0; + if (level != null) { + levelNum = level.level; + } + beLevel += (int) Math.floor(levelNum); + } + } + } + return beLevel; + } +} diff --git a/src/main/resources/assets/notenoughupdates/pv_bestiary_tab.png b/src/main/resources/assets/notenoughupdates/pv_bestiary_tab.png new file mode 100644 index 00000000..620c156b Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/pv_bestiary_tab.png differ diff --git a/src/main/resources/assets/notenoughupdates/textures/gui/navigation.png b/src/main/resources/assets/notenoughupdates/textures/gui/navigation.png index b8eb26e4..628f3a47 100644 Binary files a/src/main/resources/assets/notenoughupdates/textures/gui/navigation.png and b/src/main/resources/assets/notenoughupdates/textures/gui/navigation.png differ -- cgit From 04d6f54c067a5cdab61186eb37f67fef11affa57 Mon Sep 17 00:00:00 2001 From: efefury <69400149+efefury@users.noreply.github.com> Date: Sun, 10 Jul 2022 16:04:00 +0200 Subject: ah profit cool gui display (#178) Co-authored-by: Lulonaut Co-authored-by: nopo --- Update Notes/2.1.md | 3 +- .../notenoughupdates/NotEnoughUpdates.java | 2 + .../commands/dungeon/MapCommand.java | 2 +- .../commands/help/HelpCommand.java | 1 - .../commands/profile/PeekCommand.java | 1 + .../notenoughupdates/listener/RenderListener.java | 16 ++ .../miscfeatures/AuctionProfit.java | 177 +++++++++++++++++++++ .../notenoughupdates/miscfeatures/SunTzu.java | 3 +- .../options/seperateSections/AHTweaks.java | 9 ++ .../options/seperateSections/ApiData.java | 2 +- .../options/seperateSections/Dungeons.java | 3 + .../notenoughupdates/overlays/TimersOverlay.java | 1 - .../profileviewer/GuiProfileViewer.java | 18 +++ .../profileviewer/PlayerStats.java | 3 +- .../profileviewer/ProfileViewer.java | 1 + .../moulberry/notenoughupdates/util/Utils.java | 6 +- .../notenoughupdates/util/XPInformation.java | 12 ++ .../assets/notenoughupdates/auction_profit.png | Bin 0 -> 595 bytes 18 files changed, 249 insertions(+), 11 deletions(-) create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionProfit.java create mode 100644 src/main/resources/assets/notenoughupdates/auction_profit.png (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 5ab5ec19..4d43844a 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -98,7 +98,8 @@ - Added an option to only search for Level 100 pets in the auction house search overlay - Lulonaut - [Added an error if you have new tab list off](https://cdn.discordapp.com/attachments/896407218151366687/913681097605398528/unknown.png) - nopo - Added Fishing Timer over bobber - nea89 - +- [Auction Profit Viewer Overlay](https://cdn.discordapp.com/attachments/848901833119629332/993191851400101918/176946124-28ddf336-1ec7-460b-b22a-5fe2733b46a3.png) +- ### **Bug Fixes:** - Fixed wiki pages freezing the entire game - nea89 diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index 59e7c392..3ef305f2 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -33,6 +33,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.AuctionProfit; import io.github.moulberry.notenoughupdates.miscfeatures.CookieWarning; import io.github.moulberry.notenoughupdates.miscfeatures.CrystalOverlay; import io.github.moulberry.notenoughupdates.miscfeatures.CrystalWishingCompassSolver; @@ -267,6 +268,7 @@ public class NotEnoughUpdates { MinecraftForge.EVENT_BUS.register(new ItemCooldowns()); MinecraftForge.EVENT_BUS.register(new DwarvenMinesWaypoints()); MinecraftForge.EVENT_BUS.register(new FuelBar()); + MinecraftForge.EVENT_BUS.register(new AuctionProfit()); MinecraftForge.EVENT_BUS.register(XPInformation.getInstance()); MinecraftForge.EVENT_BUS.register(OverlayManager.petInfoOverlay); MinecraftForge.EVENT_BUS.register(OverlayManager.timersOverlay); 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 529f8e57..83db26bb 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 @@ -52,7 +52,7 @@ public class MapCommand extends ClientCommandBase { public void processCommand(ICommandSender sender, String[] args) throws CommandException { if (!NotEnoughUpdates.INSTANCE.config.hidden.dev) { Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText( - EnumChatFormatting.RED + "[NEU] The map does not work right now. You can use the map from other mods, for example: SkyblockAddons, DungeonsGuide, or Skytils ")); + EnumChatFormatting.RED + "[NEU] The map does not work right now. You can use the map from other mods, for example: SkyblockAddons, DungeonsGuide or Skytils.")); return; } 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 a52fcd1d..7655f561 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 @@ -50,7 +50,6 @@ public class HelpCommand extends ClientCommandBase { "\u00a76/neulinks \u00a7r\u00a77- Shows links to neu/moulberry.", "\u00a76/neuoverlay \u00a7r\u00a77- Opens GUI Editor for quickcommands and searchbar.", "\u00a76/neuah \u00a7r\u00a77- Opens neu's custom ah GUI.", - "\u00a76/neumap \u00a7r\u00a77- Opens the dungeon map GUI.", "\u00a76/neucalendar \u00a7r\u00a77- Opens neu's custom calendar GUI.", "\u00a76/neucalc \u00a7r\u00a77- Run calculations.", "", 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 3133edf5..21afff87 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 @@ -102,6 +102,7 @@ public class PeekCommand extends ClientCommandBase { boolean isMe = name.equalsIgnoreCase("moulberry"); PlayerStats.Stats stats = profile.getStats(null); + if (stats == null) return; JsonObject skill = profile.getSkillInfo(null); Minecraft.getMinecraft().ingameGUI 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 aedca6e3..459a7231 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java @@ -35,6 +35,7 @@ import io.github.moulberry.notenoughupdates.core.GuiScreenElementWrapper; import io.github.moulberry.notenoughupdates.dungeons.DungeonWin; import io.github.moulberry.notenoughupdates.itemeditor.NEUItemEditor; import io.github.moulberry.notenoughupdates.miscfeatures.AuctionBINWarning; +import io.github.moulberry.notenoughupdates.miscfeatures.AuctionProfit; import io.github.moulberry.notenoughupdates.miscfeatures.BetterContainers; import io.github.moulberry.notenoughupdates.miscfeatures.CrystalMetalDetectorSolver; import io.github.moulberry.notenoughupdates.miscfeatures.StorageManager; @@ -501,6 +502,11 @@ public class RenderListener { x += 80 + 28; } } + if (AuctionProfit.inAuctionPage()) { + if (x + 18 > guiLeft + xSize && x + 18 < guiLeft + xSize + 4 + 28 + 20 && y > guiTop - 180 && y < guiTop + 56) { + x -= 68 - 200; + } + } if (NEUOverlay.isRenderingArmorHud()) { if (x < guiLeft + xSize - 150 && x > guiLeft + xSize - 200 && y > guiTop && y < guiTop + 84) { x -= 25; @@ -608,6 +614,11 @@ public class RenderListener { x += 80 + 28; } } + if (AuctionProfit.inAuctionPage()) { + if (x + 18 > guiLeft + xSize && x + 18 < guiLeft + xSize + 4 + 28 + 20 && y > guiTop - 180 && y < guiTop + 56) { + x -= 68 - 200; + } + } if (NEUOverlay.isRenderingArmorHud()) { if (x < guiLeft + xSize - 150 && x > guiLeft + xSize - 200 && y > guiTop && y < guiTop + 84) { x -= 25; @@ -1005,6 +1016,11 @@ public class RenderListener { x += 80 + 28; } } + if (AuctionProfit.inAuctionPage()) { + if (x + 18 > guiLeft + xSize && x + 18 < guiLeft + xSize + 4 + 28 + 20 && y > guiTop - 180 && y < guiTop + 56) { + x -= 68 - 200; + } + } if (NEUOverlay.isRenderingArmorHud()) { if (x < guiLeft + xSize - 150 && x > guiLeft + xSize - 200 && y > guiTop && y < guiTop + 84) { x -= 25; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionProfit.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionProfit.java new file mode 100644 index 00000000..03f19bd8 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionProfit.java @@ -0,0 +1,177 @@ +/* + * 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; +import io.github.moulberry.notenoughupdates.miscfeatures.entityviewer.InvisibleModifier; +import io.github.moulberry.notenoughupdates.mixins.AccessorGuiContainer; +import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; +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.renderer.GlStateManager; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ContainerChest; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.GuiScreenEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import org.lwjgl.opengl.GL11; + +public class AuctionProfit { + + public static final ResourceLocation auctionProfitImage = + new ResourceLocation("notenoughupdates:auction_profit.png"); + + @SubscribeEvent + public void onDrawBackground(GuiScreenEvent.BackgroundDrawnEvent event) { + if(!inAuctionPage()) return; + + Minecraft minecraft = Minecraft.getMinecraft(); + Container inventoryContainer = minecraft.thePlayer.openContainer; + + Gui gui = event.gui; + int xSize = ((AccessorGuiContainer) gui).getXSize(); + int guiLeft = ((AccessorGuiContainer) gui).getGuiLeft(); + int guiTop = ((AccessorGuiContainer) gui).getGuiTop(); + minecraft.getTextureManager().bindTexture(auctionProfitImage); + GL11.glColor4f(1, 1, 1, 1); + GlStateManager.disableLighting(); + Utils.drawTexturedRect(guiLeft + xSize + 4, guiTop, 180, 101, 0, 180 / 256f, 0, 101 / 256f, GL11.GL_NEAREST); + + double coinsToCollect = 0; + double coinsIfAllSold = 0; + int expiredAuctions = 0; + int unclaimedAuctions = 0; + for (ItemStack itemStack : inventoryContainer.getInventory()) { + boolean isBin = false; + if (itemStack == null || !itemStack.hasTagCompound()) continue; + + NBTTagCompound tag = itemStack.getTagCompound(); + if (tag == null) continue; + NBTTagCompound display = tag.getCompoundTag("display"); + if (!display.hasKey("Lore", 9)) continue; + NBTTagList lore = itemStack.getTagCompound().getCompoundTag("display").getTagList("Lore", 8); + + int coinsToCheck = 0; + for (int i = 0; i < lore.tagCount(); i++) { + String line = lore.getStringTagAt(i); + if (line.contains("§7Buy it now")) { + isBin = true; + String s = line.split("§7Buy it now: ")[1]; + String coinsString = s.split("coins")[0]; + int coins = tryParse(EnumChatFormatting.getTextWithoutFormattingCodes(coinsString.trim())); + if (coins != 0) { + coinsToCheck += coins; + } + } + + if (line.contains("§7Top bid: ")) { + String s = line.split("§7Top bid: ")[1]; + String coinsString = s.split("coins")[0]; + String textWithoutFormattingCodes = EnumChatFormatting.getTextWithoutFormattingCodes(coinsString.trim()); + int coins = tryParse(textWithoutFormattingCodes); + if (coins != 0) { + coinsToCheck += coins; + } + } + + if (line.contains("§7Sold for: ")) { + String s = line.split("§7Sold for: ")[1]; + String coinsString = s.split("coins")[0]; + int coins = tryParse(EnumChatFormatting.getTextWithoutFormattingCodes(coinsString.trim())); + if (coins != 0) { + if (coins > 1000000) { + coins /= 1.1; + } + coinsToCollect += coins; + } + } + + if (line.contains("§7Status: §aSold!") || line.contains("§7Status: §aEnded!")) { + if (coinsToCheck != 0) { + if (coinsToCheck > 1000000) { + coinsToCheck /= 1.1; + } + coinsToCollect += coinsToCheck; + coinsToCheck = 0; + } + unclaimedAuctions++; + } else if (line.contains("§7Status: §cExpired!")) { + expiredAuctions++; + } + + if (isBin && line.contains("§7Ends in") && coinsToCheck != 0) { + coinsIfAllSold += coinsToCheck; + coinsToCheck = 0; + } + + } + + } + int a = guiLeft + xSize + 4; + String unclaimedAuctionsStr = EnumChatFormatting.DARK_GREEN.toString() + + unclaimedAuctions + EnumChatFormatting.BOLD + EnumChatFormatting.DARK_GRAY + " Unclaimed auctions"; + String expiredAuctionsStr = + EnumChatFormatting.RED.toString() + expiredAuctions + EnumChatFormatting.BOLD + EnumChatFormatting.DARK_GRAY + + " Expired auctions"; + + FontRenderer fontRendererObj = minecraft.fontRendererObj; + fontRendererObj.drawString(unclaimedAuctionsStr, a + 6, guiTop + 6, -1, false); + fontRendererObj.drawString(expiredAuctionsStr, a + 6, guiTop + 16, -1, false); + + String coinsToCollectStr = + EnumChatFormatting.BOLD + EnumChatFormatting.DARK_GRAY.toString() + "Coins to collect: " + + EnumChatFormatting.RESET + EnumChatFormatting.DARK_GREEN + "" + + GuiProfileViewer.shortNumberFormat(coinsToCollect, 0); + String valueIfSoldStr = EnumChatFormatting.BOLD + EnumChatFormatting.DARK_GRAY.toString() + "Value if all sold: " + + EnumChatFormatting.RESET + EnumChatFormatting.DARK_GREEN + "" + + GuiProfileViewer.shortNumberFormat(coinsIfAllSold, 0); + + fontRendererObj.drawString(coinsToCollectStr, a + 6, guiTop + 32, -1, false); + fontRendererObj.drawString(valueIfSoldStr, a + 6, guiTop + 42, -1, false); + } + + public static Integer tryParse(String s) { + try { + return Integer.parseInt(s.replace(",", "")); + } catch (NumberFormatException exception) { + return 0; + } + } + + public static boolean inAuctionPage() { + if (!NotEnoughUpdates.INSTANCE.config.ahTweaks.enableAhSellValue + || !NotEnoughUpdates.INSTANCE.isOnSkyblock()) return false; + + Minecraft minecraft = Minecraft.getMinecraft(); + if (minecraft == null || minecraft.thePlayer == null) return false; + + Container inventoryContainer = minecraft.thePlayer.openContainer; + if (!(inventoryContainer instanceof ContainerChest)) return false; + ContainerChest containerChest = (ContainerChest) inventoryContainer; + return containerChest.getLowerChestInventory().getDisplayName() + .getUnformattedText().equalsIgnoreCase("Manage Auctions"); + } +} 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 9c2549b8..7fc8beba 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SunTzu.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SunTzu.java @@ -56,7 +56,8 @@ public class SunTzu { "The wise warrior avoids the battle.", "Great results, can be achieved with small forces.", "Attack is the secret of defense; defense is the planning of an attack.", - "Subscribe to Moulberry on YouTube." + "Subscribe to Moulberry on YouTube.", + "Technoblade never dies!" }; public static void setEnabled(boolean enabled) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHTweaks.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHTweaks.java index 7c8446b0..298ddeda 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHTweaks.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/AHTweaks.java @@ -137,4 +137,13 @@ public class AHTweaks { @ConfigEditorBoolean @ConfigAccordionId(id = 2) public boolean enableSortWarning = true; + + @Expose + @ConfigOption( + name = "Enable AH Sell Value", + desc = "Display profit information (coins to collect, value if all sold, expired and unclaimed auctions)" + ) + @ConfigEditorBoolean + public boolean enableAhSellValue = true; + } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ApiData.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ApiData.java index 3fc72db5..9ed09ac3 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ApiData.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/ApiData.java @@ -62,7 +62,7 @@ public class ApiData { public int setRepositoryToDefaultButton = 0; @ConfigAccordionId(id = 1) - @ConfigOption(name = "Use dangerous Repository", desc = "The latest, most up to date item list for the NEU prereleases.\n§4Use §lonly§r§4 with the prereleases.") + @ConfigOption(name = "Use pre-release repository", desc = "The latest, most up to date item list for the NEU pre-releases.\n§4Use §lonly§r§4 with the pre-releases.") @ConfigEditorButton(runnableId = 24, buttonText = "Use") public int setRepositoryToDangerousButton = 0; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Dungeons.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Dungeons.java index 1c825cdf..8f7bc15c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Dungeons.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Dungeons.java @@ -31,6 +31,7 @@ import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditor import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigOption; public class Dungeons { + /* @ConfigOption( name = "Dungeon Map", desc = "" @@ -38,6 +39,8 @@ public class Dungeons { @ConfigEditorAccordion(id = 0) public boolean dungeonMapAccordion = false; + */ + @Expose @ConfigOption( name = "\u00A7cWarning", 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 5510023c..411a56d8 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/TimersOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/TimersOverlay.java @@ -879,4 +879,3 @@ public class TimersOverlay extends TextOverlay { ALWAYS, } } - 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 457f7c34..87bab220 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java @@ -46,6 +46,7 @@ import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.resources.DefaultPlayerSkin; import net.minecraft.client.shader.Framebuffer; import net.minecraft.client.shader.Shader; +import net.minecraft.enchantment.Enchantment; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EnumPlayerModelParts; import net.minecraft.init.Blocks; @@ -300,6 +301,11 @@ public class GuiProfileViewer extends GuiScreen { private static JsonObject getPetInfo(String pet_name, String rarity) { JsonObject petInfo = new JsonObject(); + if (Constants.PETS == null) { + Utils.showOutdatedRepoNotification(); + return null; + } + if (Constants.PETS.has("custom_pet_leveling") && Constants.PETS.getAsJsonObject("custom_pet_leveling").has(pet_name)) { JsonObject pet = Constants.PETS.getAsJsonObject("custom_pet_leveling").getAsJsonObject(pet_name); @@ -346,6 +352,9 @@ public class GuiProfileViewer extends GuiScreen { public static PetLevel getPetLevel(String pet_name, String rarity, float exp) { JsonObject petInfo = getPetInfo(pet_name, rarity); + if (petInfo == null) { + return null; + } int offset = petInfo.get("offset").getAsInt(); int maxPetLevel = petInfo.get("max_level").getAsInt(); JsonArray levels = petInfo.getAsJsonArray("pet_levels"); @@ -4647,6 +4656,15 @@ public class GuiProfileViewer extends GuiScreen { String locationStr = null; if (profile.getUuid().equals("20934ef9488c465180a78f861586b4cf")) { locationStr = "Ignoring DMs"; + } else if(profile.getUuid().equals("b876ec32e396476ba1158438d83c67d4")) { + statusStr = EnumChatFormatting.LIGHT_PURPLE + "Long live Potato King"; + ItemStack potato_crown = NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager + .getItemInformation() + .get("POTATO_CROWN")); + potato_crown.addEnchantment(Enchantment.unbreaking, 1656638942); // this number may be useful + Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI(new ItemStack(Items.potato), guiLeft + 35, guiTop + 160); + Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI(potato_crown, guiLeft + 50, guiTop + 162); + Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI(new ItemStack(Items.potato), guiLeft + 63, guiTop + 160); } else { locationStr = NotEnoughUpdates.INSTANCE.navigation.getNameForAreaModeOrUnknown(location); } 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 8d24a082..19668019 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PlayerStats.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PlayerStats.java @@ -559,7 +559,7 @@ public class PlayerStats { } GuiProfileViewer.PetLevel levelObj = GuiProfileViewer.getPetLevel(petname, tier, exp); - + if (levelObj == null) return null; float level = levelObj.level; float currentLevelRequirement = levelObj.currentLevelRequirement; float maxXP = levelObj.maxXP; @@ -702,6 +702,7 @@ public class PlayerStats { } Stats petBonus = getPetStatBonuses(petsInfo); + if (petBonus == null) return null; stats = stats.add(passiveBonuses).add(armorBonuses).add(talismanBonuses).add(petBonus).add(hotmBonuses); 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 d8e47fa3..7ed3a799 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java @@ -1418,6 +1418,7 @@ public class ProfileViewer { PlayerStats.getStats(getSkillInfo(profileId), getInventoryInfo(profileId), getCollectionInfo(profileId), getPetsInfo(profileId), profileInfo ); + if (stats == null) return null; this.stats.put(profileId, stats); return stats; } 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 3745d72e..f45b840c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java @@ -1937,10 +1937,8 @@ public class Utils { NotificationHandler.displayNotification(Lists.newArrayList( EnumChatFormatting.RED + EnumChatFormatting.BOLD.toString() + "Missing repo data", EnumChatFormatting.RED + "Data used for many NEU features is not up to date, this should normally not be the case.", - EnumChatFormatting.RED + "You can try " + EnumChatFormatting.BOLD + "/neuresetrepo" + EnumChatFormatting.RESET + - EnumChatFormatting.RED + " to see if that fixes the issue.", - EnumChatFormatting.RED + "If the problem persists please join " + EnumChatFormatting.BOLD + - "discord.gg/moulberry" + + EnumChatFormatting.RED + "You can try " + EnumChatFormatting.BOLD + "/neuresetrepo" + EnumChatFormatting.RESET + EnumChatFormatting.RED +" and restart your game" + + " to see if that fixes the issue.", EnumChatFormatting.RED + "If the problem persists please join " + EnumChatFormatting.BOLD + "discord.gg/moulberry" + EnumChatFormatting.RESET + EnumChatFormatting.RED + " and message in " + EnumChatFormatting.BOLD + "#neu-support" + EnumChatFormatting.RESET + EnumChatFormatting.RED + " to get support" ), diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/XPInformation.java b/src/main/java/io/github/moulberry/notenoughupdates/util/XPInformation.java index 158f9917..80027aff 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/XPInformation.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/XPInformation.java @@ -249,9 +249,21 @@ public class XPInformation { } public double getPetLevel(String petId, double exp, String rarity) { + if (Constants.PETS == null || !Constants.PETS.has("pet_levels")) { + Utils.showOutdatedRepoNotification(); + return 0; + } Stream pet_levels = StreamSupport.stream(Constants.PETS.get("pet_levels").getAsJsonArray().spliterator(), false); + if (!Constants.PETS.has("pet_rarity_offset")) { + Utils.showOutdatedRepoNotification(); + return 0; + } int pet_rarity_offset = Constants.PETS.getAsJsonObject("pet_rarity_offset").get(rarity).getAsInt(); + if (!Constants.PETS.has("custom_pet_leveling")) { + Utils.showOutdatedRepoNotification(); + return 0; + } JsonObject custom_pet_leveling = Constants.PETS.getAsJsonObject("custom_pet_leveling").getAsJsonObject(petId); List xpLevelsRequired = pet_levels.skip(pet_rarity_offset).limit(100).map(JsonElement::getAsInt).collect(Collectors.toList()); diff --git a/src/main/resources/assets/notenoughupdates/auction_profit.png b/src/main/resources/assets/notenoughupdates/auction_profit.png new file mode 100644 index 00000000..80e06c10 Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/auction_profit.png differ -- cgit From 8209ae8cc7dc6476a96547534efe991049e8b49b Mon Sep 17 00:00:00 2001 From: hannibal2 <24389977+hannibal00212@users.noreply.github.com> Date: Wed, 20 Jul 2022 13:24:57 +0200 Subject: Added trophy reward overlay (#192) * added trophy reward overlay * (hopefully) fixed infer "no crash" ~ jani * fix efe code Co-authored-by: Lorenz Co-authored-by: nopo --- Update Notes/2.1.md | 5 +- .../notenoughupdates/NotEnoughUpdates.java | 2 + .../notenoughupdates/listener/RenderListener.java | 19 ++ .../miscfeatures/AuctionProfit.java | 7 +- .../miscgui/TrophyRewardOverlay.java | 276 +++++++++++++++++++++ .../options/seperateSections/Fishing.java | 25 ++ .../moulberry/notenoughupdates/util/Constants.java | 2 + .../assets/notenoughupdates/trophy_profit.png | Bin 0 -> 375 bytes 8 files changed, 331 insertions(+), 5 deletions(-) create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscgui/TrophyRewardOverlay.java create mode 100644 src/main/resources/assets/notenoughupdates/trophy_profit.png (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 4d43844a..71350dc7 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -98,8 +98,9 @@ - Added an option to only search for Level 100 pets in the auction house search overlay - Lulonaut - [Added an error if you have new tab list off](https://cdn.discordapp.com/attachments/896407218151366687/913681097605398528/unknown.png) - nopo - Added Fishing Timer over bobber - nea89 -- [Auction Profit Viewer Overlay](https://cdn.discordapp.com/attachments/848901833119629332/993191851400101918/176946124-28ddf336-1ec7-460b-b22a-5fe2733b46a3.png) -- +- Added [Auction Profit Viewer Overlay](https://cdn.discordapp.com/attachments/848901833119629332/993191851400101918/176946124-28ddf336-1ec7-460b-b22a-5fe2733b46a3.png) - efefury +- Added Trophy Reward Overlay - hannibal2 + ### **Bug Fixes:** - Fixed wiki pages freezing the entire game - nea89 diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index 76387844..8c23aa60 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -58,6 +58,7 @@ import io.github.moulberry.notenoughupdates.miscfeatures.customblockzones.Dwarve import io.github.moulberry.notenoughupdates.miscgui.CalendarOverlay; import io.github.moulberry.notenoughupdates.miscgui.InventoryStorageSelector; import io.github.moulberry.notenoughupdates.miscgui.SignCalculator; +import io.github.moulberry.notenoughupdates.miscgui.TrophyRewardOverlay; import io.github.moulberry.notenoughupdates.mixins.AccessorMinecraft; import io.github.moulberry.notenoughupdates.options.NEUConfig; import io.github.moulberry.notenoughupdates.overlays.FuelBar; @@ -285,6 +286,7 @@ public class NotEnoughUpdates { MinecraftForge.EVENT_BUS.register(new RenderListener(this)); MinecraftForge.EVENT_BUS.register(new OldAnimationChecker()); MinecraftForge.EVENT_BUS.register(new SignCalculator()); + MinecraftForge.EVENT_BUS.register(TrophyRewardOverlay.getInstance()); MinecraftForge.EVENT_BUS.register(navigation); if (Minecraft.getMinecraft().getResourceManager() instanceof IReloadableResourceManager) { 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 459a7231..794282f1 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java @@ -46,6 +46,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.miscgui.TrophyRewardOverlay; import io.github.moulberry.notenoughupdates.mixins.AccessorGuiContainer; import io.github.moulberry.notenoughupdates.options.NEUConfig; import io.github.moulberry.notenoughupdates.overlays.AuctionSearchOverlay; @@ -502,6 +503,12 @@ public class RenderListener { x += 80 + 28; } } + if (TrophyRewardOverlay.inTrophyFishingInventory()) { + int diffX = 162; + if (x > guiLeft + xSize && x < guiLeft + xSize + diffX + 5 && y > guiTop - 18 && y < guiTop + 120) { + x += diffX; + } + } if (AuctionProfit.inAuctionPage()) { if (x + 18 > guiLeft + xSize && x + 18 < guiLeft + xSize + 4 + 28 + 20 && y > guiTop - 180 && y < guiTop + 56) { x -= 68 - 200; @@ -614,6 +621,12 @@ public class RenderListener { x += 80 + 28; } } + if (TrophyRewardOverlay.inTrophyFishingInventory()) { + int diffX = 162; + if (x > guiLeft + xSize && x < guiLeft + xSize + diffX + 5 && y > guiTop - 18 && y < guiTop + 120) { + x += diffX; + } + } if (AuctionProfit.inAuctionPage()) { if (x + 18 > guiLeft + xSize && x + 18 < guiLeft + xSize + 4 + 28 + 20 && y > guiTop - 180 && y < guiTop + 56) { x -= 68 - 200; @@ -1016,6 +1029,12 @@ public class RenderListener { x += 80 + 28; } } + if (TrophyRewardOverlay.inTrophyFishingInventory()) { + int diffX = 162; + if (x > guiLeft + xSize && x < guiLeft + xSize + diffX + 5 && y > guiTop - 18 && y < guiTop + 120) { + x += diffX; + } + } if (AuctionProfit.inAuctionPage()) { if (x + 18 > guiLeft + xSize && x + 18 < guiLeft + xSize + 4 + 28 + 20 && y > guiTop - 180 && y < guiTop + 56) { x -= 68 - 200; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionProfit.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionProfit.java index 03f19bd8..e1024eab 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionProfit.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionProfit.java @@ -20,13 +20,13 @@ package io.github.moulberry.notenoughupdates.miscfeatures; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import io.github.moulberry.notenoughupdates.miscfeatures.entityviewer.InvisibleModifier; import io.github.moulberry.notenoughupdates.mixins.AccessorGuiContainer; import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; 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.inventory.GuiChest; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.inventory.Container; import net.minecraft.inventory.ContainerChest; @@ -46,11 +46,12 @@ public class AuctionProfit { @SubscribeEvent public void onDrawBackground(GuiScreenEvent.BackgroundDrawnEvent event) { - if(!inAuctionPage()) return; + if (!inAuctionPage()) return; Minecraft minecraft = Minecraft.getMinecraft(); Container inventoryContainer = minecraft.thePlayer.openContainer; + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiChest)) return; Gui gui = event.gui; int xSize = ((AccessorGuiContainer) gui).getXSize(); int guiLeft = ((AccessorGuiContainer) gui).getGuiLeft(); @@ -172,6 +173,6 @@ public class AuctionProfit { if (!(inventoryContainer instanceof ContainerChest)) return false; ContainerChest containerChest = (ContainerChest) inventoryContainer; return containerChest.getLowerChestInventory().getDisplayName() - .getUnformattedText().equalsIgnoreCase("Manage Auctions"); + .getUnformattedText().equalsIgnoreCase("Manage Auctions"); } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TrophyRewardOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TrophyRewardOverlay.java new file mode 100644 index 00000000..df635d5c --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TrophyRewardOverlay.java @@ -0,0 +1,276 @@ +/* + * 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.miscgui; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.events.RepositoryReloadEvent; +import io.github.moulberry.notenoughupdates.mixins.AccessorGuiContainer; +import io.github.moulberry.notenoughupdates.util.Constants; +import io.github.moulberry.notenoughupdates.util.Utils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.inventory.GuiChest; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ContainerChest; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.GuiScreenEvent; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import org.lwjgl.opengl.GL11; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class TrophyRewardOverlay { + private static TrophyRewardOverlay instance = null; + + private final Map data = new HashMap<>(); + private boolean reloadNeeded = true; + + public static final ResourceLocation trophyProfitImage = + new ResourceLocation("notenoughupdates:trophy_profit.png"); + + public static TrophyRewardOverlay getInstance() { + if (instance == null) { + instance = new TrophyRewardOverlay(); + } + return instance; + } + + /** + * This adds support for the /neureloadrepo command + */ + @SubscribeEvent(priority = EventPriority.LOWEST) + public void reload(RepositoryReloadEvent event) { + reloadNeeded = true; + } + + @SubscribeEvent(priority = EventPriority.LOW) + public void onItemTooltipLow(ItemTooltipEvent event) { + if (!inTrophyFishingInventory()) return; + if (!NotEnoughUpdates.INSTANCE.config.fishing.trophyRewardTooltips) return; + + ItemStack itemStack = event.itemStack; + if (itemStack == null) return; + if (!"§aFillet Trophy Fish".equals(itemStack.getDisplayName())) return; + + event.toolTip.add(4, getToolTip()); + event.toolTip.add(4, ""); + } + + private String getToolTip() { + List line = createText(); + if (line.size() == 1) { + return line.get(0); + } + + return line.get(1); + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public void onDrawBackground(GuiScreenEvent.BackgroundDrawnEvent event) { + if (!inTrophyFishingInventory()) return; + if (!NotEnoughUpdates.INSTANCE.config.fishing.trophyRewardOverlay) return; + + GuiScreen screen = Minecraft.getMinecraft().currentScreen; + if (!(screen instanceof GuiChest)) return; + Gui gui = event.gui; + int xSize = ((AccessorGuiContainer) gui).getXSize(); + int guiLeft = ((AccessorGuiContainer) gui).getGuiLeft(); + int guiTop = ((AccessorGuiContainer) gui).getGuiTop(); + + List list = createText(); + int removed = 0; + if (list.size() > 11) { + while (list.size() > 10) { + removed++; + list.remove(9); + } + list.add("§8And " + removed + " more.."); + } + renderBasicOverlay(event, guiLeft + xSize + 3, guiTop, list); + } + + private void load() { + data.clear(); + + JsonObject jsonObject = Constants.TROPHYFISH; + if (jsonObject == null) { + return; + } + + String[] tiers = new String[]{"_BRONZE", "_SILVER", "_GOLD", "_DIAMOND"}; + + for (Map.Entry entry : jsonObject.entrySet()) { + String name = entry.getKey(); + + int i = 0; + for (JsonElement element : entry.getValue().getAsJsonArray()) { + int price = element.getAsInt(); + data.put(name + tiers[i], price); + i++; + } + } + } + + private List createText() { + if (reloadNeeded) { + load(); + reloadNeeded = false; + } + + List texts = new ArrayList<>(); + if (data.isEmpty()) { + texts.add("§cNo data in Repo found!"); + return texts; + } + + Map totalAmount = new HashMap<>(); + Map totalExchange = new HashMap<>(); + readInventory(totalAmount, totalExchange); + + int total = totalExchange.values().stream().mapToInt(value -> value).sum(); + texts.add("Trophy Fish Exchange"); + texts.add("Magma Fish: §e" + total); + + for (Map.Entry entry : sortByValue(totalExchange).entrySet()) { + String name = entry.getKey(); + int amount = totalAmount.get(name); + String[] split = name.split(" "); + String rarity = split[split.length - 1]; + name = name.substring(0, name.length() - rarity.length() - 1); + + if (name.length() > 20) { + name = name.substring(0, 18) + ".."; + } + + String rarityColor = rarity.replace("§l", "").substring(0, 2); + texts.add(String.format("%s%dx §r%s§f: §e%d", rarityColor, amount, name, entry.getValue())); + } + + return texts; + } + + private void readInventory(Map totalAmount, Map totalExchange) { + if (Minecraft.getMinecraft().thePlayer.openContainer instanceof ContainerChest) { + + for (Slot slot : Minecraft.getMinecraft().thePlayer.openContainer.inventorySlots) { + if (!slot.getHasStack()) continue; + ItemStack stack = slot.getStack(); + if (stack != null) { + String internalId = NotEnoughUpdates.INSTANCE.manager.getInternalNameForItem(stack); + if (data.containsKey(internalId)) { + String displayName = stack.getDisplayName(); + int stackSize = stack.stackSize; + + int amount = totalAmount.getOrDefault(displayName, 0) + stackSize; + totalAmount.put(displayName, amount); + + int exchangeRate = data.get(internalId); + int exchangeValue = totalExchange.getOrDefault(displayName, 0) + exchangeRate * stackSize; + totalExchange.put(displayName, exchangeValue); + } + } + } + } + } + + //TODO move into utils class maybe? + public static > Map sortByValue(Map map) { + List> list = new ArrayList<>(map.entrySet()); + list.sort(Map.Entry.comparingByValue()); + Collections.reverse(list); + + Map result = new LinkedHashMap<>(); + for (Map.Entry entry : list) { + result.put(entry.getKey(), entry.getValue()); + } + + return result; + } + + private void renderBasicOverlay( + GuiScreenEvent.BackgroundDrawnEvent event, + int x, + int y, + List texts + ) { + + Gui gui = event.gui; + int xSize = ((AccessorGuiContainer) gui).getXSize(); + int guiLeft = ((AccessorGuiContainer) gui).getGuiLeft(); + int guiTop = ((AccessorGuiContainer) gui).getGuiTop(); + Minecraft minecraft = Minecraft.getMinecraft(); + minecraft.getTextureManager().bindTexture(trophyProfitImage); + GL11.glColor4f(1, 1, 1, 1); + GlStateManager.disableLighting(); + + Utils.drawTexturedRect(guiLeft + xSize + 4, guiTop, 158, 128, 0, 1, 0, 1, GL11.GL_NEAREST); + + int a = guiLeft + xSize + 4; + FontRenderer fontRendererObj = minecraft.fontRendererObj; + + //Render first two header lines + int i = 0; + for (String text : texts) { + fontRendererObj.drawString("§8" + text, a + 10, guiTop + 6 + i, -1, false); + i += 10; + if (i == 20) break; + } + + //Render all other lines + i = 25; + int index = 0; + for (String text : texts) { + if (index > 1) { + fontRendererObj.drawString(text, a + 10, guiTop + 6 + i, -1, false); + i += 10; + } else { + index++; + } + } + } + + public static boolean inTrophyFishingInventory() { + if (!NotEnoughUpdates.INSTANCE.isOnSkyblock()) return false; + + Minecraft minecraft = Minecraft.getMinecraft(); + if (minecraft == null || minecraft.thePlayer == null) return false; + + Container inventoryContainer = minecraft.thePlayer.openContainer; + if (!(inventoryContainer instanceof ContainerChest)) return false; + ContainerChest containerChest = (ContainerChest) inventoryContainer; + return containerChest.getLowerChestInventory().getDisplayName() + .getUnformattedText().equalsIgnoreCase("Trophy Fishing"); + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Fishing.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Fishing.java index 513474ca..b6075794 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Fishing.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Fishing.java @@ -273,4 +273,29 @@ public class Fishing { @ConfigAccordionId(id = 6) public boolean fishingSound30Sec = true; + @ConfigOption( + name = "Trophy Reward", + desc = "" + ) + @ConfigEditorAccordion(id = 7) + public boolean trophyReward = false; + + @Expose + @ConfigOption( + name = "Trophy Reward Overlay", + desc = "Displays an overlay at Odger that shows information about your trophies" + ) + @ConfigEditorBoolean + @ConfigAccordionId(id = 7) + public boolean trophyRewardOverlay = true; + + @Expose + @ConfigOption( + name = "Trophy Reward Tooltips", + desc = "Displays the exchange of your trophies as a tooltip in the Odger Inventory" + ) + @ConfigEditorBoolean + @ConfigAccordionId(id = 7) + public boolean trophyRewardTooltips = true; + } 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 3230714a..5279ed73 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/Constants.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/Constants.java @@ -69,6 +69,7 @@ public class Constants { public static JsonObject ESSENCECOSTS; public static JsonObject FAIRYSOULS; public static JsonObject REFORGESTONES; + public static JsonObject TROPHYFISH; private static final ReentrantLock lock = new ReentrantLock(); @@ -88,6 +89,7 @@ public class Constants { ESSENCECOSTS = Utils.getConstant("essencecosts", gson); FAIRYSOULS = Utils.getConstant("fairy_souls", gson); REFORGESTONES = Utils.getConstant("reforgestones", gson); + TROPHYFISH = Utils.getConstant("trophyfish", gson); } catch (Exception ex) { ex.printStackTrace(); } finally { diff --git a/src/main/resources/assets/notenoughupdates/trophy_profit.png b/src/main/resources/assets/notenoughupdates/trophy_profit.png new file mode 100644 index 00000000..2965f1dc Binary files /dev/null and b/src/main/resources/assets/notenoughupdates/trophy_profit.png differ -- cgit From 5bcf7cc19df3ff59385b1de06cc3e2e827f5e2b6 Mon Sep 17 00:00:00 2001 From: hannibal2 <24389977+hannibal00212@users.noreply.github.com> Date: Tue, 26 Jul 2022 14:00:45 +0200 Subject: Added power stone feature (#194) Co-authored-by: Lorenz --- Update Notes/2.1.md | 1 + .../notenoughupdates/NotEnoughUpdates.java | 2 + .../notenoughupdates/core/util/StringUtils.java | 10 ++ .../miscfeatures/PowerStoneStatsDisplay.java | 168 +++++++++++++++++++++ .../notenoughupdates/options/NEUConfig.java | 2 + .../options/seperateSections/TooltipTweaks.java | 8 + 6 files changed, 191 insertions(+) create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PowerStoneStatsDisplay.java (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 71350dc7..57ad2bbb 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -100,6 +100,7 @@ - Added Fishing Timer over bobber - nea89 - Added [Auction Profit Viewer Overlay](https://cdn.discordapp.com/attachments/848901833119629332/993191851400101918/176946124-28ddf336-1ec7-460b-b22a-5fe2733b46a3.png) - efefury - Added Trophy Reward Overlay - hannibal2 +- Added power stone feature - hannibal2 ### **Bug Fixes:** diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index 8c23aa60..6bf6d86b 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -49,6 +49,7 @@ 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.PowerStoneStatsDisplay; import io.github.moulberry.notenoughupdates.miscfeatures.SlotLocking; import io.github.moulberry.notenoughupdates.miscfeatures.StorageManager; import io.github.moulberry.notenoughupdates.miscfeatures.SunTzu; @@ -287,6 +288,7 @@ public class NotEnoughUpdates { MinecraftForge.EVENT_BUS.register(new OldAnimationChecker()); MinecraftForge.EVENT_BUS.register(new SignCalculator()); MinecraftForge.EVENT_BUS.register(TrophyRewardOverlay.getInstance()); + MinecraftForge.EVENT_BUS.register(PowerStoneStatsDisplay.getInstance()); MinecraftForge.EVENT_BUS.register(navigation); if (Minecraft.getMinecraft().getResourceManager() instanceof IReloadableResourceManager) { 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 41f2742f..d52f9ba1 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 @@ -53,4 +53,14 @@ public class StringUtils { return trim; } + + public static String substringBetween(String str, String open, String close) { + return org.apache.commons.lang3.StringUtils.substringBetween(str, open, close); + } + + public static int cleanAndParseInt(String str) { + str = cleanColour(str); + str = str.replace(",", ""); + return Integer.parseInt(str); + } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PowerStoneStatsDisplay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PowerStoneStatsDisplay.java new file mode 100644 index 00000000..e62e572d --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PowerStoneStatsDisplay.java @@ -0,0 +1,168 @@ +/* + * 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; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; +import io.github.moulberry.notenoughupdates.options.NEUConfig; +import io.github.moulberry.notenoughupdates.util.ItemUtils; +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.inventory.Container; +import net.minecraft.inventory.ContainerChest; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; + +import java.text.NumberFormat; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; + +public class PowerStoneStatsDisplay { + private static PowerStoneStatsDisplay instance = null; + NumberFormat format = NumberFormat.getInstance(Locale.US); + + public static PowerStoneStatsDisplay getInstance() { + if (instance == null) { + instance = new PowerStoneStatsDisplay(); + } + return instance; + } + + @SubscribeEvent + public void onTick(TickEvent event) { + GuiScreen currentScreen = Minecraft.getMinecraft().currentScreen; + if (currentScreen == null) return; + if (!(currentScreen instanceof GuiChest)) return; + ContainerChest container = (ContainerChest) ((GuiChest) currentScreen).inventorySlots; + IInventory menu = container.getLowerChestInventory(); + String title = menu.getDisplayName().getUnformattedText(); + + if (!title.equals("SkyBlock Menu")) return; + + EntityPlayerSP p = Minecraft.getMinecraft().thePlayer; + Container openContainer = p.openContainer; + for (Slot slot : openContainer.inventorySlots) { + ItemStack stack = slot.getStack(); + if (stack == null) continue; + + String displayName = stack.getDisplayName(); + if (!"§aAccessory Bag".equals(displayName)) continue; + + for (String line : ItemUtils.getLore(stack)) { + if (line.startsWith("§7Magical Power: ")) { + String rawNumber = line.split("§6")[1].replace(",", ""); + NEUConfig.HiddenProfileSpecific configProfileSpecific = NotEnoughUpdates.INSTANCE.config.getProfileSpecific(); + if (configProfileSpecific == null) return; + configProfileSpecific.magicalPower = Integer.parseInt(rawNumber); + } + } + } + } + + @SubscribeEvent + public void onItemTooltipLow(ItemTooltipEvent event) { + if (!NotEnoughUpdates.INSTANCE.config.tooltipTweaks.powerStoneStats) return; + + ItemStack itemStack = event.itemStack; + if (itemStack == null) return; + List lore = ItemUtils.getLore(itemStack); + + boolean isPowerStone = false; + for (String line : lore) { + if (line.equals("§8Power Stone")) { + isPowerStone = true; + break; + } + } + + if (!isPowerStone) return; + + NEUConfig.HiddenProfileSpecific configProfileSpecific = NotEnoughUpdates.INSTANCE.config.getProfileSpecific(); + if (configProfileSpecific == null) return; + + int magicalPower = configProfileSpecific.magicalPower; + if (magicalPower < 1) return; + + double scaledMagicalPower = scalePower(magicalPower); + double scaledCurrentPower = 0.0; + + int index = 0; + boolean foundMagicalPower = false; + for (String line : new LinkedList<>(lore)) { + index++; + line = line.replace("§k", ""); + + if (line.startsWith("§7At ")) { + + String rawNumber = StringUtils.substringBetween(StringUtils.cleanColour(line), "At ", " Magical"); + if (rawNumber == null) return; + + //This ignores old repo entries in the item browser from neu + if (rawNumber.equals("mmm")) return; + + try { + scaledCurrentPower = scalePower(StringUtils.cleanAndParseInt(rawNumber)); + } catch (NumberFormatException ignored) { + return; + } + + event.toolTip.set(index, "§7At §6" + format.format((double) magicalPower) + " Magical Power§7:"); + foundMagicalPower = true; + continue; + } + + if (!foundMagicalPower) continue; + + String cleanLine = StringUtils.cleanColour(line); + if (cleanLine.equals("")) { + break; + } + + for (String operator : new String[]{"+", "-"}) { + if (!cleanLine.startsWith(operator)) continue; + String rawStat = StringUtils.cleanColour(StringUtils.substringBetween(line, operator, " ")); + + double currentStat; + try { + currentStat = 0.0 + StringUtils.cleanAndParseInt(rawStat.substring(0, rawStat.length() - 1)); + } catch (NumberFormatException ignored) { + continue; + } + double realStat = (currentStat / scaledCurrentPower) * scaledMagicalPower; + + String format = this.format.format((double) Math.round(realStat)); + format += rawStat.substring(rawStat.length() - 1); + + event.toolTip.set(index, line.replace(rawStat, format)); + } + } + } + + private double scalePower(int magicalPower) { + return Math.pow(29.97 * (Math.log(0.0019 * magicalPower + 1)), 1.2); + } +} 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 e1848382..ade9edfe 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java @@ -564,6 +564,8 @@ public class NEUConfig extends Config { public long dailyHeavyPearlCompleted = 0L; @Expose public HashMap savedEquipment = new HashMap<>(); + @Expose + public int magicalPower = 0; } public HiddenLocationSpecific getLocationSpecific() { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TooltipTweaks.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TooltipTweaks.java index d1660e68..bcb7e8a7 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TooltipTweaks.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TooltipTweaks.java @@ -172,4 +172,12 @@ public class TooltipTweaks { minStep = 1f ) public int tooltipBorderOpacity = 200; + + @Expose + @ConfigOption( + name = "Power Stone Stats", + desc = "Show your real magical power and real stat increase on power stones" + ) + @ConfigEditorBoolean + public boolean powerStoneStats = true; } -- cgit From 6d2c47744663309c4297a93ff9311e9074251fa1 Mon Sep 17 00:00:00 2001 From: kr45732 <52721908+kr45732@users.noreply.github.com> Date: Fri, 5 Aug 2022 14:53:17 -0400 Subject: Add weight to pv (#201) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Finished senither weight * Fixed lily weight * move file and add senither weight * Impl weight * Remove unnecessary stuff * undo nw change * fix stuff * Update 2.1.md * why on earth would you do this 🙂 Co-authored-by: nopo --- .gitignore | 1 + Update Notes/2.1.md | 1 + .../profileviewer/GuiProfileViewer.java | 63 ++++++++- .../profileviewer/ProfileViewer.java | 15 +++ .../weight/lily/LilyDungeonsWeight.java | 145 +++++++++++++++++++++ .../weight/lily/LilySkillsWeight.java | 101 ++++++++++++++ .../weight/lily/LilySlayerWeight.java | 91 +++++++++++++ .../profileviewer/weight/lily/LilyWeight.java | 48 +++++++ .../weight/senither/SenitherDungeonsWeight.java | 80 ++++++++++++ .../weight/senither/SenitherSkillsWeight.java | 66 ++++++++++ .../weight/senither/SenitherSlayerWeight.java | 66 ++++++++++ .../weight/senither/SenitherWeight.java | 50 +++++++ .../weight/weight/DungeonsWeight.java | 41 ++++++ .../profileviewer/weight/weight/SkillsWeight.java | 39 ++++++ .../profileviewer/weight/weight/SlayerWeight.java | 39 ++++++ .../profileviewer/weight/weight/Weight.java | 67 ++++++++++ .../profileviewer/weight/weight/WeightStruct.java | 54 ++++++++ .../moulberry/notenoughupdates/util/Constants.java | 2 + .../moulberry/notenoughupdates/util/Utils.java | 4 + 19 files changed, 972 insertions(+), 1 deletion(-) create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilyDungeonsWeight.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilySkillsWeight.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilySlayerWeight.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilyWeight.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherDungeonsWeight.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherSkillsWeight.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherSlayerWeight.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherWeight.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/DungeonsWeight.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/SkillsWeight.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/SlayerWeight.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/Weight.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/WeightStruct.java (limited to 'Update Notes/2.1.md') diff --git a/.gitignore b/.gitignore index 030ecff7..e02d8fc4 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ run .vscode infer-out/ ciwork/ +.DS_STORE diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 57ad2bbb..269f87a7 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -34,6 +34,7 @@ - Added total xp to catacombs level - efefury - 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 + - Added senither and lily weight - CrypticPlasma ### **Minor Changes:** 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 455bbf36..a21145d1 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java @@ -31,6 +31,8 @@ import io.github.moulberry.notenoughupdates.cosmetics.ShaderManager; import io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField; import io.github.moulberry.notenoughupdates.profileviewer.bestiary.BestiaryPage; import io.github.moulberry.notenoughupdates.profileviewer.trophy.TrophyFishingPage; +import io.github.moulberry.notenoughupdates.profileviewer.weight.lily.LilyWeight; +import io.github.moulberry.notenoughupdates.profileviewer.weight.senither.SenitherWeight; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.SBInfo; import io.github.moulberry.notenoughupdates.util.Utils; @@ -100,6 +102,8 @@ import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static io.github.moulberry.notenoughupdates.util.Utils.roundToNearestInt; + public class GuiProfileViewer extends GuiScreen { public static final ResourceLocation pv_basic = new ResourceLocation("notenoughupdates:pv_basic.png"); public static final ResourceLocation pv_dung = new ResourceLocation("notenoughupdates:pv_dung.png"); @@ -4621,7 +4625,6 @@ public class GuiProfileViewer extends GuiScreen { .get("avg_buy") .getAsDouble()); String networthIRLMoney = Long.toString(Math.round(((networthInCookies * 325) / 675) * 4.99)); - if (mouseX > guiLeft + 8 && mouseX < guiLeft + 8 + fontRendererObj.getStringWidth("Net Worth: " + numberFormat.format(networth))) { if (mouseY > guiTop + 32 && mouseY < guiTop + 32 + fontRendererObj.FONT_HEIGHT) { @@ -4945,6 +4948,64 @@ public class GuiProfileViewer extends GuiScreen { 0 ); } + + renderWeight(mouseX, mouseY, skillInfo, profileInfo); + } + + private void renderWeight(int mouseX, int mouseY, JsonObject skillInfo, JsonObject profileInfo) { + if (skillInfo == null) { + return; + } + + if(Constants.WEIGHT == null) { + Utils.showOutdatedRepoNotification(); + return; + } + + FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; + + SenitherWeight senitherWeight = new SenitherWeight(skillInfo); + LilyWeight lilyWeight = new LilyWeight(skillInfo, profileInfo); + + Utils.drawStringCentered( + EnumChatFormatting.GREEN + "Senither Weight: " + EnumChatFormatting.GOLD + numberFormat.format(roundToNearestInt(senitherWeight.getTotalWeight().getRaw())), + fr, + guiLeft + 63, + guiTop + 18, + true, + 0 + ); + + int textWidth = fontRendererObj.getStringWidth("Senither Weight: " + numberFormat.format(roundToNearestInt(senitherWeight.getTotalWeight().getRaw()))); + if (mouseX > guiLeft + 63 - textWidth / 2 && + mouseX < guiLeft + 63 + textWidth / 2) { + if (mouseY > guiTop + 12 && mouseY < guiTop + 12 + fontRendererObj.FONT_HEIGHT) { + tooltipToDisplay = new ArrayList<>(); + tooltipToDisplay.add(EnumChatFormatting.GREEN + "Skills: " + EnumChatFormatting.GOLD + numberFormat.format(roundToNearestInt(senitherWeight.getSkillsWeight().getWeightStruct().getRaw()))); + tooltipToDisplay.add(EnumChatFormatting.GREEN + "Slayer: " + EnumChatFormatting.GOLD + numberFormat.format(roundToNearestInt(senitherWeight.getSlayerWeight().getWeightStruct().getRaw()))); + tooltipToDisplay.add(EnumChatFormatting.GREEN + "Dungeons: " + EnumChatFormatting.GOLD + numberFormat.format(roundToNearestInt(senitherWeight.getDungeonsWeight().getWeightStruct().getRaw()))); + } + } + + Utils.drawStringCentered( + EnumChatFormatting.GREEN + "Lily Weight: " + EnumChatFormatting.GOLD + numberFormat.format(roundToNearestInt(lilyWeight.getTotalWeight().getRaw())), + fr, + guiLeft + 63, + guiTop + 28, + true, + 0 + ); + + int fontWidth = fontRendererObj.getStringWidth("Lily Weight: " + numberFormat.format(roundToNearestInt(lilyWeight.getTotalWeight().getRaw()))); + if (mouseX > guiLeft + 63 - fontWidth / 2 && + mouseX < guiLeft + 63 + fontWidth / 2) { + if (mouseY > guiTop + 22 && mouseY < guiTop + 22 + fontRendererObj.FONT_HEIGHT) { + tooltipToDisplay = new ArrayList<>(); + tooltipToDisplay.add(EnumChatFormatting.GREEN + "Skills: " + EnumChatFormatting.GOLD + numberFormat.format(roundToNearestInt(lilyWeight.getSkillsWeight().getWeightStruct().getRaw()))); + tooltipToDisplay.add(EnumChatFormatting.GREEN + "Slayer: " + EnumChatFormatting.GOLD + numberFormat.format(roundToNearestInt(lilyWeight.getSlayerWeight().getWeightStruct().getRaw()))); + tooltipToDisplay.add(EnumChatFormatting.GREEN + "Dungeons: " + EnumChatFormatting.GOLD + numberFormat.format(roundToNearestInt(lilyWeight.getDungeonsWeight().getWeightStruct().getRaw()))); + } + } } private void renderGoldBar(float x, float y, float xSize) { 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 4797254d..68dca09c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java @@ -892,6 +892,16 @@ public class ProfileViewer { float experience_skill_catacombs = Utils.getElementAsFloat(Utils.getElement(profileInfo, "dungeons.dungeon_types.catacombs.experience"), 0); + float experience_skill_healer = + Utils.getElementAsFloat(Utils.getElement(profileInfo, "dungeons.player_classes.healer.experience"), 0); + float experience_skill_archer = + Utils.getElementAsFloat(Utils.getElement(profileInfo, "dungeons.player_classes.archer.experience"), 0); + float experience_skill_tank = + Utils.getElementAsFloat(Utils.getElement(profileInfo, "dungeons.player_classes.tank.experience"), 0); + float experience_skill_mage = + Utils.getElementAsFloat(Utils.getElement(profileInfo, "dungeons.player_classes.mage.experience"), 0); + float experience_skill_berserk = + Utils.getElementAsFloat(Utils.getElement(profileInfo, "dungeons.player_classes.berserk.experience"), 0); float experience_slayer_zombie = Utils.getElementAsFloat(Utils.getElement(profileInfo, "slayer_bosses.zombie.xp"), 0); @@ -928,6 +938,11 @@ public class ProfileViewer { skillInfo.addProperty("experience_skill_hotm", experience_skill_hotm); skillInfo.addProperty("experience_skill_catacombs", experience_skill_catacombs); + skillInfo.addProperty("experience_skill_healer", experience_skill_healer); + skillInfo.addProperty("experience_skill_tank", experience_skill_tank); + skillInfo.addProperty("experience_skill_mage", experience_skill_mage); + skillInfo.addProperty("experience_skill_archer", experience_skill_archer); + skillInfo.addProperty("experience_skill_berserk", experience_skill_berserk); skillInfo.addProperty("experience_slayer_zombie", experience_slayer_zombie); skillInfo.addProperty("experience_slayer_spider", experience_slayer_spider); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilyDungeonsWeight.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilyDungeonsWeight.java new file mode 100644 index 00000000..31748535 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilyDungeonsWeight.java @@ -0,0 +1,145 @@ +/* + * 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.profileviewer.weight.lily; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.DungeonsWeight; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.WeightStruct; +import io.github.moulberry.notenoughupdates.util.Constants; +import io.github.moulberry.notenoughupdates.util.Utils; +import java.util.Map; + +public class LilyDungeonsWeight extends DungeonsWeight { + + private final JsonObject profileJson; + + public LilyDungeonsWeight(JsonObject player, JsonObject profileJson) { + super(player); + this.profileJson = profileJson; + } + + @Override + public void getDungeonWeight() { + double level = Utils.getElementAsFloat(Utils.getElement(player, "level_skill_catacombs"), 0); + float cataXP = Utils.getElementAsFloat(Utils.getElement(player, "experience_skill_catacombs"), 0); + + double extra = 0; + double n = 0; + if (cataXP < 569809640) { + n = 0.2 * Math.pow(level / 50, 1.538679118869934); + } else { + extra = 500.0 * Math.pow((cataXP - CATACOMBS_LEVEL_50_XP) / 142452410.0, 1.0 / 1.781925776625157); + } + + if (level != 0) { + if (cataXP < 569809640) { + weightStruct.add( + new WeightStruct(1.2733079672009226 * ((Math.pow(1.18340401286164044, (level + 1)) - 1.05994990217254) * (1 + n))) + ); + } else { + weightStruct.add(new WeightStruct((4100 + extra) * 2)); + } + } + } + + public void getDungeonCompletionWeight(String cataMode) { + double max1000 = 0; + double mMax1000 = 0; + JsonObject dungeonsCompletionWorth = Utils.getElement(Constants.WEIGHT, "lily.dungeons.completion_worth").getAsJsonObject(); + for (Map.Entry dcwEntry : dungeonsCompletionWorth.entrySet()) { + if (dcwEntry.getKey().startsWith("catacombs_")) { + max1000 += dcwEntry.getValue().getAsDouble(); + } else { + mMax1000 += dcwEntry.getValue().getAsDouble(); + } + } + max1000 *= 1000; + mMax1000 *= 1000; + double upperBound = 1500; + if (cataMode.equals("normal")) { + if (Utils.getElement(profileJson, "dungeons.dungeon_types.catacombs.tier_completions") == null) { + return; + } + + double score = 0; + for (Map.Entry normalFloor : Utils + .getElement(profileJson, "dungeons.dungeon_types.catacombs.tier_completions") + .getAsJsonObject() + .entrySet()) { + int amount = normalFloor.getValue().getAsInt(); + double excess = 0; + if (amount > 1000) { + excess = amount - 1000; + amount = 1000; + } + + double floorScore = amount * dungeonsCompletionWorth.get("catacombs_" + normalFloor.getKey()).getAsDouble(); + if (excess > 0) floorScore *= Math.log(excess / 1000 + 1) / Math.log(7.5) + 1; + score += floorScore; + } + + weightStruct.add(new WeightStruct(score / max1000 * upperBound * 2)); + } else { + JsonObject dungeonsCompletionBuffs = Utils.getElement(Constants.WEIGHT, "lily.dungeons.completion_buffs").getAsJsonObject(); + + if (Utils.getElement(profileJson, "dungeons.dungeon_types.master_catacombs.tier_completions") == null) { + return; + } + + for (Map.Entry masterFloor : Utils + .getElement(profileJson, "dungeons.dungeon_types.master_catacombs.tier_completions") + .getAsJsonObject() + .entrySet()) { + if (dungeonsCompletionBuffs.get(masterFloor.getKey()) != null) { + int amount = masterFloor.getValue().getAsInt(); + double threshold = 20; + if (amount >= threshold) { + upperBound += dungeonsCompletionBuffs.get(masterFloor.getKey()).getAsInt(); + } else { + upperBound += + dungeonsCompletionBuffs.get(masterFloor.getKey()).getAsInt() * Math.pow((amount / threshold), 1.840896416); + } + } + } + + double masterScore = 0; + for (Map.Entry masterFloor : Utils + .getElement(profileJson, "dungeons.dungeon_types.master_catacombs.tier_completions") + .getAsJsonObject() + .entrySet()) { + int amount = masterFloor.getValue().getAsInt(); + double excess = 0; + if (amount > 1000) { + excess = amount - 1000; + amount = 1000; + } + + double floorScore = amount * dungeonsCompletionWorth.get("master_catacombs_" + masterFloor.getKey()).getAsDouble(); + if (excess > 0) { + floorScore *= (Math.log((excess / 1000) + 1) / Math.log(6)) + 1; + } + masterScore += floorScore; + } + + weightStruct.add(new WeightStruct((masterScore / mMax1000) * upperBound * 2)); + } + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilySkillsWeight.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilySkillsWeight.java new file mode 100644 index 00000000..bbe07a5a --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilySkillsWeight.java @@ -0,0 +1,101 @@ +/* + * 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.profileviewer.weight.lily; + +import static io.github.moulberry.notenoughupdates.profileviewer.weight.weight.Weight.SKILL_NAMES; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.SkillsWeight; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.WeightStruct; +import io.github.moulberry.notenoughupdates.util.Constants; +import io.github.moulberry.notenoughupdates.util.Utils; + +public class LilySkillsWeight extends SkillsWeight { + + public LilySkillsWeight(JsonObject player) { + super(player); + } + + @Override + public void getSkillsWeight(String skillName) { + double skillAverage = 0; + for (String skill : SKILL_NAMES) { + skillAverage += + (int) ProfileViewer.getLevel( + Utils.getElement(Constants.LEVELING, "leveling_xp").getAsJsonArray(), + Utils.getElementAsInt(Utils.getElement(player, "experience_skill_" + skill), 0), + 60, + false + ) + .level; + } + skillAverage /= SKILL_NAMES.size(); + + float currentExp = Utils.getElementAsFloat(Utils.getElement(player, "experience_skill_" + skillName), 0); + int currentLevel = (int) ProfileViewer.getLevel( + Utils.getElement(Constants.LEVELING, "leveling_xp").getAsJsonArray(), + currentExp, + 60, + false + ) + .level; + + JsonArray srwTable = Utils.getElement(Constants.WEIGHT, "lily.skills.ratio_weight." + skillName).getAsJsonArray(); + double base = + ( + (12 * Math.pow((skillAverage / 60), 2.44780217148309)) * + srwTable.get(currentLevel).getAsDouble() * + srwTable.get(srwTable.size() - 1).getAsDouble() + ) + + (srwTable.get(srwTable.size() - 1).getAsDouble() * Math.pow(currentLevel / 60.0, Math.pow(2, 0.5))); + base *= 1.8162162162162162; + double overflow = 0; + if (currentExp > 111672425) { + double factor = Utils.getElementAsFloat(Utils.getElement(Constants.WEIGHT, "lily.skills.factors." + skillName), 0); + double effectiveOver = effectiveXP(currentExp - 111672425, factor); + double t = + (effectiveOver / 111672425) * + Utils.getElementAsFloat(Utils.getElement(Constants.WEIGHT, "lily.skills.overflow_multipliers." + skillName), 0); + if (t > 0) { + overflow += 1.8162162162162162 * t; + } + } + + weightStruct.add(new WeightStruct(base, overflow)); + } + + private double effectiveXP(double xp, double factor) { + if (xp < 111672425) { + return xp; + } else { + double remainingXP = xp; + double z = 0; + for (int i = 0; i <= (int) (xp / 111672425); i++) { + if (remainingXP >= 111672425) { + remainingXP -= 111672425; + z += Math.pow(factor, i); + } + } + return z * 111672425; + } + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilySlayerWeight.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilySlayerWeight.java new file mode 100644 index 00000000..5c55633a --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilySlayerWeight.java @@ -0,0 +1,91 @@ +/* + * 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.profileviewer.weight.lily; + +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.SlayerWeight; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.WeightStruct; +import io.github.moulberry.notenoughupdates.util.Constants; +import io.github.moulberry.notenoughupdates.util.Utils; + +public class LilySlayerWeight extends SlayerWeight { + + public LilySlayerWeight(JsonObject player) { + super(player); + } + + public void getSlayerWeight(String slayerName) { + int currentSlayerXp = Utils.getElementAsInt(Utils.getElement(player, "experience_slayer_" + slayerName), 0); + + double score; + double d = currentSlayerXp / 100000.0; + if (currentSlayerXp >= 6416) { + double D = (d - Math.pow(3, (-5.0 / 2))) * (d + Math.pow(3, -5.0 / 2)); + double u = Math.cbrt(3 * (d + Math.sqrt(D))); + double v = Math.cbrt(3 * (d - Math.sqrt(D))); + score = u + v - 1; + } else { + score = Math.sqrt(4.0 / 3) * Math.cos(Math.acos(d * Math.pow(3, 5.0 / 2)) / 3) - 1; + } + + double scaleFactor = Utils.getElementAsFloat( + Utils.getElement(Constants.WEIGHT, "lily.slayer.deprecation_scaling." + slayerName), + 0 + ); + int intScore = (int) score; + double distance = currentSlayerXp - actualInt(intScore); + double effectiveDistance = distance * Math.pow(scaleFactor, intScore); + double effectiveScore = effectiveInt(intScore, scaleFactor) + effectiveDistance; + double weight; + switch (slayerName) { + case "zombie": + weight = (effectiveScore / 8390.64) + (currentSlayerXp / 1000000.0); + break; + case "spider": + weight = (effectiveScore / 7019.57) + ((currentSlayerXp * 1.6) / 1000000); + break; + case "wolf": + weight = (effectiveScore / 2982.06) + ((currentSlayerXp * 3.6) / 1000000); + break; + case "enderman": + weight = (effectiveScore / 1118.81) + ((currentSlayerXp * 10.0) / 1000000); + break; + case "blaze": + weight = (effectiveScore / 751.281) + ((currentSlayerXp * 15.0) / 1000000); + break; + default: + return; + } + + weightStruct.add(new WeightStruct(2 * weight)); + } + + private double actualInt(int intScore) { + return (((Math.pow(intScore, 3) / 6) + (Math.pow(intScore, 2) / 2) + (intScore / 3.0)) * 100000); + } + + private double effectiveInt(int intScore, double scaleFactor) { + double total = 0; + for (int k = 0; k < intScore; k++) { + total += (Math.pow((k + 1), 2) + (k + 1)) * Math.pow(scaleFactor, (k + 1)); + } + return 1000000 * total * (0.05 / scaleFactor); + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilyWeight.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilyWeight.java new file mode 100644 index 00000000..9a851f12 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilyWeight.java @@ -0,0 +1,48 @@ +/* + * 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.profileviewer.weight.lily; + +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.Weight; + +public class LilyWeight extends Weight { + + public LilyWeight(JsonObject player, JsonObject profileJson) { + super(new LilySlayerWeight(player), new LilySkillsWeight(player), new LilyDungeonsWeight(player, profileJson)); + } + + @Override + public void calculateWeight() { + slayerWeight.getWeightStruct().reset(); + skillsWeight.getWeightStruct().reset(); + dungeonsWeight.getWeightStruct().reset(); + + for (String slayerName : SLAYER_NAMES) { + slayerWeight.getSlayerWeight(slayerName); + } + for (String skillName : SKILL_NAMES) { + skillsWeight.getSkillsWeight(skillName); + } + + dungeonsWeight.getDungeonWeight(); + ((LilyDungeonsWeight) dungeonsWeight).getDungeonCompletionWeight("normal"); + ((LilyDungeonsWeight) dungeonsWeight).getDungeonCompletionWeight("master"); + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherDungeonsWeight.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherDungeonsWeight.java new file mode 100644 index 00000000..198d34c8 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherDungeonsWeight.java @@ -0,0 +1,80 @@ +/* + * 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.profileviewer.weight.senither; + +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.DungeonsWeight; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.WeightStruct; +import io.github.moulberry.notenoughupdates.util.Constants; +import io.github.moulberry.notenoughupdates.util.Utils; + +public class SenitherDungeonsWeight extends DungeonsWeight { + + public SenitherDungeonsWeight(JsonObject player) { + super(player); + } + + public void getClassWeight(String className) { + float currentClassXp = Utils.getElementAsFloat(Utils.getElement(player, "experience_skill_" + className), 0); + double currentClassLevel = ProfileViewer.getLevel( + Utils.getElement(Constants.LEVELING, "catacombs").getAsJsonArray(), + currentClassXp, + Utils.getElementAsInt(Utils.getElement(Constants.LEVELING, "leveling_caps.catacombs"), 50), + false + ) + .level; + double base = + Math.pow(currentClassLevel, 4.5) * + Utils.getElementAsFloat(Utils.getElement(Constants.WEIGHT, "senither.dungeons.classes." + className), 0); + + if (currentClassXp <= CATACOMBS_LEVEL_50_XP) { + weightStruct.add(new WeightStruct(base)); + return; + } + + double remaining = currentClassXp - CATACOMBS_LEVEL_50_XP; + double splitter = (4 * CATACOMBS_LEVEL_50_XP) / base; + weightStruct.add(new WeightStruct(Math.floor(base), Math.pow(remaining / splitter, 0.968))); + } + + @Override + public void getDungeonWeight() { + float catacombsSkillXp = Utils.getElementAsFloat(Utils.getElement(player, "experience_skill_catacombs"), 0); + + double level = ProfileViewer.getLevel( + Utils.getElement(Constants.LEVELING, "catacombs").getAsJsonArray(), + catacombsSkillXp, + Utils.getElementAsInt(Utils.getElement(Constants.LEVELING, "leveling_caps.catacombs"), 50), + false + ) + .level; + double base = Math.pow(level, 4.5) * Utils.getElementAsFloat(Utils.getElement(Constants.WEIGHT, "senither.dungeons.catacombs"), 0); + + if (catacombsSkillXp <= CATACOMBS_LEVEL_50_XP) { + weightStruct.add(new WeightStruct(base)); + return; + } + + double remaining = catacombsSkillXp - CATACOMBS_LEVEL_50_XP; + double splitter = (4 * CATACOMBS_LEVEL_50_XP) / base; + weightStruct.add(new WeightStruct(Math.floor(base), Math.pow(remaining / splitter, 0.968))); + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherSkillsWeight.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherSkillsWeight.java new file mode 100644 index 00000000..081cab6d --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherSkillsWeight.java @@ -0,0 +1,66 @@ +/* + * 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.profileviewer.weight.senither; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.SkillsWeight; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.WeightStruct; +import io.github.moulberry.notenoughupdates.util.Constants; +import io.github.moulberry.notenoughupdates.util.Utils; + +public class SenitherSkillsWeight extends SkillsWeight { + + public SenitherSkillsWeight(JsonObject player) { + super(player); + } + + @Override + public void getSkillsWeight(String skillName) { + JsonArray curWeights = Utils.getElement(Constants.WEIGHT, "senither.skills." + skillName).getAsJsonArray(); + double exponent = curWeights.get(0).getAsDouble(); + double divider = curWeights.get(1).getAsDouble(); + + float currentSkillXp = Utils.getElementAsFloat(Utils.getElement(player, "experience_skill_" + skillName), 0); + + if (currentSkillXp > 0) { + int maxLevel = skillName.equals("farming") + ? 60 + : Utils.getElementAsInt(Utils.getElement(Constants.LEVELING, "leveling_caps." + skillName), 50); + double level = ProfileViewer.getLevel( + Utils.getElement(Constants.LEVELING, "leveling_xp").getAsJsonArray(), + currentSkillXp, + maxLevel, + false + ) + .level; + + double maxLevelExp = maxLevel == 50 ? 55172425 : 111672425; + double base = Math.pow(level * 10, 0.5 + exponent + (level / 100)) / 1250; + if (currentSkillXp <= maxLevelExp) { + weightStruct.add(new WeightStruct(base)); + return; + } + + weightStruct.add(new WeightStruct(Math.round(base), Math.pow((currentSkillXp - maxLevelExp) / divider, 0.968))); + } + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherSlayerWeight.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherSlayerWeight.java new file mode 100644 index 00000000..3b7b2498 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherSlayerWeight.java @@ -0,0 +1,66 @@ +/* + * 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.profileviewer.weight.senither; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.SlayerWeight; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.WeightStruct; +import io.github.moulberry.notenoughupdates.util.Constants; +import io.github.moulberry.notenoughupdates.util.Utils; + +public class SenitherSlayerWeight extends SlayerWeight { + + public SenitherSlayerWeight(JsonObject player) { + super(player); + } + + public void getSlayerWeight(String slayerName) { + if (slayerName.equals("blaze")) { + return; + } + + JsonArray curWeights = Utils.getElement(Constants.WEIGHT, "senither.slayer." + slayerName).getAsJsonArray(); + double divider = curWeights.get(0).getAsDouble(); + double modifier = curWeights.get(1).getAsDouble(); + + int currentSlayerXp = Utils.getElementAsInt(Utils.getElement(player, "experience_slayer_" + slayerName), 0); + + if (currentSlayerXp <= 1000000) { + weightStruct.add(new WeightStruct(currentSlayerXp == 0 ? 0 : currentSlayerXp / divider)); + return; + } + + double base = 1000000 / divider; + double remaining = currentSlayerXp - 1000000; + double overflow = 0; + double initialModifier = modifier; + + while (remaining > 0) { + double left = Math.min(remaining, 1000000); + + overflow += Math.pow(left / (divider * (1.5 + modifier)), 0.942); + modifier += initialModifier; + remaining -= left; + } + + weightStruct.add(new WeightStruct(base, overflow)); + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherWeight.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherWeight.java new file mode 100644 index 00000000..e0a2cf36 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherWeight.java @@ -0,0 +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.profileviewer.weight.senither; + +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.Weight; + +public class SenitherWeight extends Weight { + + public SenitherWeight(JsonObject player) { + super(new SenitherSlayerWeight(player), new SenitherSkillsWeight(player), new SenitherDungeonsWeight(player)); + } + + @Override + public void calculateWeight() { + slayerWeight.getWeightStruct().reset(); + skillsWeight.getWeightStruct().reset(); + dungeonsWeight.getWeightStruct().reset(); + + for (String slayerName : SLAYER_NAMES) { + slayerWeight.getSlayerWeight(slayerName); + } + + for (String skillName : SKILL_NAMES) { + skillsWeight.getSkillsWeight(skillName); + } + + dungeonsWeight.getDungeonWeight(); + for (String dungeonClassName : DUNGEON_CLASS_NAMES) { + ((SenitherDungeonsWeight) dungeonsWeight).getClassWeight(dungeonClassName); + } + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/DungeonsWeight.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/DungeonsWeight.java new file mode 100644 index 00000000..bab0346c --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/DungeonsWeight.java @@ -0,0 +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.profileviewer.weight.weight; + +import com.google.gson.JsonObject; + +public abstract class DungeonsWeight { + + protected static final long CATACOMBS_LEVEL_50_XP = 569809640; + + protected final JsonObject player; + protected final WeightStruct weightStruct; + + public DungeonsWeight(JsonObject player) { + this.player = player; + this.weightStruct = new WeightStruct(); + } + + public WeightStruct getWeightStruct() { + return weightStruct; + } + + public abstract void getDungeonWeight(); +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/SkillsWeight.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/SkillsWeight.java new file mode 100644 index 00000000..b5e4e2b5 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/SkillsWeight.java @@ -0,0 +1,39 @@ +/* + * 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.profileviewer.weight.weight; + +import com.google.gson.JsonObject; + +public abstract class SkillsWeight { + + protected final JsonObject player; + protected final WeightStruct weightStruct; + + public SkillsWeight(JsonObject player) { + this.player = player; + this.weightStruct = new WeightStruct(); + } + + public WeightStruct getWeightStruct() { + return weightStruct; + } + + public abstract void getSkillsWeight(String skillName); +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/SlayerWeight.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/SlayerWeight.java new file mode 100644 index 00000000..1ec83689 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/SlayerWeight.java @@ -0,0 +1,39 @@ +/* + * 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.profileviewer.weight.weight; + +import com.google.gson.JsonObject; + +public abstract class SlayerWeight { + + protected final JsonObject player; + protected final WeightStruct weightStruct; + + public SlayerWeight(JsonObject player) { + this.player = player; + this.weightStruct = new WeightStruct(); + } + + public WeightStruct getWeightStruct() { + return weightStruct; + } + + public abstract void getSlayerWeight(String slayerName); +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/Weight.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/Weight.java new file mode 100644 index 00000000..f3e0cef3 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/Weight.java @@ -0,0 +1,67 @@ +/* + * 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.profileviewer.weight.weight; + +import java.util.Arrays; +import java.util.List; + +public abstract class Weight { + + protected static final List SLAYER_NAMES = Arrays.asList("wolf", "zombie", "spider", "enderman", "blaze"); + protected static final List DUNGEON_CLASS_NAMES = Arrays.asList("healer", "mage", "berserk", "archer", "tank"); + public static final List SKILL_NAMES = Arrays.asList( + "taming", + "mining", + "foraging", + "enchanting", + "farming", + "combat", + "fishing", + "alchemy" + ); + protected final SlayerWeight slayerWeight; + protected final SkillsWeight skillsWeight; + protected final DungeonsWeight dungeonsWeight; + + public Weight(SlayerWeight slayerWeight, SkillsWeight skillsWeight, DungeonsWeight dungeonsWeight) { + this.slayerWeight = slayerWeight; + this.skillsWeight = skillsWeight; + this.dungeonsWeight = dungeonsWeight; + this.calculateWeight(); + } + + public WeightStruct getTotalWeight() { + return new WeightStruct().add(slayerWeight.getWeightStruct()).add(skillsWeight.getWeightStruct()).add(dungeonsWeight.getWeightStruct()); + } + + public SlayerWeight getSlayerWeight() { + return slayerWeight; + } + + public SkillsWeight getSkillsWeight() { + return skillsWeight; + } + + public DungeonsWeight getDungeonsWeight() { + return dungeonsWeight; + } + + protected abstract void calculateWeight(); +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/WeightStruct.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/WeightStruct.java new file mode 100644 index 00000000..924dcb40 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/WeightStruct.java @@ -0,0 +1,54 @@ +/* + * 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.profileviewer.weight.weight; + +public class WeightStruct { + + private double base; + private double overflow; + + public WeightStruct() { + this(0, 0); + } + + public WeightStruct(double base) { + this(base, 0); + } + + public WeightStruct(double base, double overflow) { + this.base = base; + this.overflow = overflow; + } + + public WeightStruct add(WeightStruct o) { + this.base += o.base; + this.overflow += o.overflow; + return this; + } + + public double getRaw() { + return base + overflow; + } + + public void reset() { + this.base = 0; + this.overflow = 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 5279ed73..1d226dc8 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/Constants.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/Constants.java @@ -70,6 +70,7 @@ public class Constants { public static JsonObject FAIRYSOULS; public static JsonObject REFORGESTONES; public static JsonObject TROPHYFISH; + public static JsonObject WEIGHT; private static final ReentrantLock lock = new ReentrantLock(); @@ -90,6 +91,7 @@ public class Constants { FAIRYSOULS = Utils.getConstant("fairy_souls", gson); REFORGESTONES = Utils.getConstant("reforgestones", gson); TROPHYFISH = Utils.getConstant("trophyfish", gson); + WEIGHT = Utils.getConstant("weight", gson); } catch (Exception ex) { ex.printStackTrace(); } finally { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java b/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java index f45b840c..4d546505 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java @@ -668,6 +668,10 @@ public class Utils { return (float) Math.round(value * scale) / scale; } + public static int roundToNearestInt(double value) { + return (int) Math.round(value); + } + // Parses Roman numerals, allowing for single character irregular subtractive notation (e.g. IL is 49, IIL is invalid) public static int parseRomanNumeral(String input) { int prevVal = 0; -- cgit From fe37f119bb381f3e8ad7cd8afb44739efcfc7e59 Mon Sep 17 00:00:00 2001 From: hannibal2 <24389977+hannibal00212@users.noreply.github.com> Date: Sun, 7 Aug 2022 16:50:30 +0200 Subject: added abiphone warning (#202) --- Update Notes/2.1.md | 1 + .../notenoughupdates/listener/RenderListener.java | 15 ++ .../miscfeatures/AbiphoneWarning.java | 215 +++++++++++++++++++++ .../notenoughupdates/mixins/MixinGuiContainer.java | 7 + .../options/seperateSections/Misc.java | 8 + 5 files changed, 246 insertions(+) create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AbiphoneWarning.java (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 269f87a7..47c66c18 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -102,6 +102,7 @@ - Added [Auction Profit Viewer Overlay](https://cdn.discordapp.com/attachments/848901833119629332/993191851400101918/176946124-28ddf336-1ec7-460b-b22a-5fe2733b46a3.png) - efefury - Added Trophy Reward Overlay - hannibal2 - Added power stone feature - hannibal2 +- Added abiphone warning - hannibal2 ### **Bug Fixes:** 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 35a3581a..02c25333 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java @@ -34,6 +34,7 @@ import io.github.moulberry.notenoughupdates.commands.profile.ViewProfileCommand; import io.github.moulberry.notenoughupdates.core.GuiScreenElementWrapper; import io.github.moulberry.notenoughupdates.dungeons.DungeonWin; import io.github.moulberry.notenoughupdates.itemeditor.NEUItemEditor; +import io.github.moulberry.notenoughupdates.miscfeatures.AbiphoneWarning; import io.github.moulberry.notenoughupdates.miscfeatures.AuctionBINWarning; import io.github.moulberry.notenoughupdates.miscfeatures.AuctionProfit; import io.github.moulberry.notenoughupdates.miscfeatures.BetterContainers; @@ -681,6 +682,10 @@ public class RenderListener { if (AuctionBINWarning.getInstance().shouldShow()) { AuctionBINWarning.getInstance().render(); } + + if (AbiphoneWarning.getInstance().shouldShow()) { + AbiphoneWarning.getInstance().render(); + } } private void renderDungeonChestOverlay(GuiScreen gui) { @@ -922,6 +927,11 @@ public class RenderListener { event.setCanceled(true); return; } + if (AbiphoneWarning.getInstance().shouldShow()) { + AbiphoneWarning.getInstance().mouseInput(mouseX, mouseY); + event.setCanceled(true); + return; + } if (!event.isCanceled()) { Utils.scrollTooltip(Mouse.getEventDWheel()); @@ -1390,6 +1400,11 @@ public class RenderListener { event.setCanceled(true); return; } + if (AbiphoneWarning.getInstance().shouldShow()) { + AbiphoneWarning.getInstance().keyboardInput(); + event.setCanceled(true); + return; + } if (AuctionSearchOverlay.shouldReplace()) { AuctionSearchOverlay.keyEvent(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AbiphoneWarning.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AbiphoneWarning.java new file mode 100644 index 00000000..c806feeb --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AbiphoneWarning.java @@ -0,0 +1,215 @@ +/* + * 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; +import io.github.moulberry.notenoughupdates.core.GuiElement; +import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils; +import io.github.moulberry.notenoughupdates.core.util.render.TextRenderUtils; +import io.github.moulberry.notenoughupdates.util.ItemUtils; +import io.github.moulberry.notenoughupdates.util.SBInfo; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.gui.inventory.GuiChest; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.List; + +public class AbiphoneWarning extends GuiElement { + private static final AbiphoneWarning INSTANCE = new AbiphoneWarning(); + + private boolean showWarning = false; + private String contactName = null; + private int contactSlot = -1; + + public static AbiphoneWarning getInstance() { + return INSTANCE; + } + + private boolean shouldPerformCheck() { + if (!NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard()) { + showWarning = false; + return false; + } + + if (Minecraft.getMinecraft().currentScreen instanceof GuiChest && + SBInfo.getInstance().lastOpenContainerName.startsWith("Abiphone ")) { + return true; + } else { + showWarning = false; + return false; + } + } + + public boolean shouldShow() { + return shouldPerformCheck() && showWarning; + } + + public boolean onMouseClick(Slot slotIn, int slotId, int clickedButton, int clickType) { + if (!shouldPerformCheck()) return false; + if (!NotEnoughUpdates.INSTANCE.config.misc.abiphoneWarning) return false; + if (slotId == -999) return false; + if (clickedButton == 0) return false; + + GuiChest chest = (GuiChest) Minecraft.getMinecraft().currentScreen; + + ItemStack clickedContact = chest.inventorySlots.getSlot(slotId).getStack(); + if (clickedContact == null) return false; + + List list = ItemUtils.getLore(clickedContact); + if (list.isEmpty()) return false; + + String last = list.get(list.size() - 1); + if (last.contains("Right-click to remove contact!")) { + showWarning = true; + contactName = clickedContact.getDisplayName(); + contactSlot = slotId; + return true; + } + + return false; + } + + public void overrideIsMouseOverSlot(Slot slot, int mouseX, int mouseY, CallbackInfoReturnable cir) { + if (shouldShow()) { + cir.setReturnValue(false); + } + } + + @Override + public void render() { + final ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + final int width = scaledResolution.getScaledWidth(); + final int height = scaledResolution.getScaledHeight(); + + GlStateManager.disableLighting(); + + GlStateManager.pushMatrix(); + GlStateManager.translate(0, 0, 500); + + Gui.drawRect(0, 0, width, height, 0x80000000); + + RenderUtils.drawFloatingRectDark(width / 2 - 90, height / 2 - 45, 180, 90); + + int neuLength = Minecraft.getMinecraft().fontRendererObj.getStringWidth("\u00a7lNEU"); + Minecraft.getMinecraft().fontRendererObj.drawString( + "\u00a7lNEU", + width / 2 + 90 - neuLength - 3, + height / 2 - 45 + 4, + 0xff000000 + ); + + TextRenderUtils.drawStringCenteredScaledMaxWidth("Are you SURE?", Minecraft.getMinecraft().fontRendererObj, + width / 2, height / 2 - 45 + 10, false, 170, 0xffff4040 + ); + + String sellLine = "\u00a77[ \u00a7r" + contactName + "\u00a77 ]"; + + TextRenderUtils.drawStringCenteredScaledMaxWidth(sellLine, Minecraft.getMinecraft().fontRendererObj, + width / 2, height / 2 - 45 + 25, false, 170, 0xffffffff + ); + + TextRenderUtils.drawStringCenteredScaledMaxWidth( + "Continue removing the contact?", + Minecraft.getMinecraft().fontRendererObj, + width / 2, + height / 2 - 45 + 50, + false, + 170, + 0xffa0a0a0 + ); + + RenderUtils.drawFloatingRectDark(width / 2 - 43, height / 2 + 23, 40, 16, false); + RenderUtils.drawFloatingRectDark(width / 2 + 3, height / 2 + 23, 40, 16, false); + + TextRenderUtils.drawStringCenteredScaledMaxWidth( + EnumChatFormatting.GREEN + "[Y]es", + Minecraft.getMinecraft().fontRendererObj, + width / 2 - 23, + height / 2 + 31, + true, + 36, + 0xff00ff00 + ); + TextRenderUtils.drawStringCenteredScaledMaxWidth( + EnumChatFormatting.RED + "[N]o", + Minecraft.getMinecraft().fontRendererObj, + width / 2 + 23, + height / 2 + 31, + true, + 36, + 0xffff0000 + ); + + GlStateManager.popMatrix(); + } + + @Override + public boolean mouseInput(int mouseX, int mouseY) { + final ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + final int width = scaledResolution.getScaledWidth(); + final int height = scaledResolution.getScaledHeight(); + + if (Mouse.getEventButtonState()) { + if (mouseY >= height / 2 + 23 && mouseY <= height / 2 + 23 + 16) { + if (mouseX >= width / 2 - 43 && mouseX <= width / 2 - 3) { + makeClick(); + } + showWarning = false; + } + + if (mouseX < width / 2 - 90 || mouseX > width / 2 + 90 || + mouseY < height / 2 - 45 || mouseY > height / 2 + 45) { + showWarning = false; + } + } + + return false; + } + + @Override + public boolean keyboardInput() { + if (!Keyboard.getEventKeyState()) { + if (Keyboard.getEventKey() == Keyboard.KEY_Y || Keyboard.getEventKey() == Keyboard.KEY_RETURN) { + makeClick(); + } + showWarning = false; + } + + return false; + } + + private void makeClick() { + if (contactSlot != -1) { + GuiChest chest = (GuiChest) Minecraft.getMinecraft().currentScreen; + Minecraft.getMinecraft().playerController.windowClick(chest.inventorySlots.windowId, + contactSlot, 1, 0, Minecraft.getMinecraft().thePlayer + ); + contactSlot = -1; + } + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java index e3741ac7..3bc92a9c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java @@ -22,6 +22,7 @@ package io.github.moulberry.notenoughupdates.mixins; import io.github.moulberry.notenoughupdates.NEUOverlay; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.listener.RenderListener; +import io.github.moulberry.notenoughupdates.miscfeatures.AbiphoneWarning; import io.github.moulberry.notenoughupdates.miscfeatures.AuctionBINWarning; import io.github.moulberry.notenoughupdates.miscfeatures.AuctionSortModeWarning; import io.github.moulberry.notenoughupdates.miscfeatures.BetterContainers; @@ -189,6 +190,7 @@ public abstract class MixinGuiContainer extends GuiScreen { StorageOverlay.getInstance().overrideIsMouseOverSlot(slotIn, mouseX, mouseY, cir); GuiCustomEnchant.getInstance().overrideIsMouseOverSlot(slotIn, mouseX, mouseY, cir); AuctionBINWarning.getInstance().overrideIsMouseOverSlot(slotIn, mouseX, mouseY, cir); + AbiphoneWarning.getInstance().overrideIsMouseOverSlot(slotIn, mouseX, mouseY, cir); } @Redirect(method = "drawScreen", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/inventory/GuiContainer;drawGradientRect(IIIIII)V")) @@ -305,6 +307,11 @@ public abstract class MixinGuiContainer extends GuiScreen { return; } + if (AbiphoneWarning.getInstance().onMouseClick(slotIn, slotId, clickedButton, clickType)) { + ci.cancel(); + return; + } + AtomicBoolean ret = new AtomicBoolean(false); SlotLocking.getInstance().onWindowClick(slotIn, slotId, clickedButton, clickType, (tuple) -> { ci.cancel(); 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 b0e4c60b..c0033cde 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 @@ -223,4 +223,12 @@ public class Misc { @ConfigEditorDropdown(values = {"Off", "Enabled with ! Prefix", "Always enabled"}) public int calculationMode = 2; + @Expose + @ConfigOption( + name = "Enable Abiphone Warning", + desc = "Asks for confirmation when removing a contact in the abiphone" + ) + @ConfigEditorBoolean + public boolean abiphoneWarning = true; + } -- cgit From 197e463ad2909708e78e693ba1f9a820295cea5a Mon Sep 17 00:00:00 2001 From: jani270 <69345714+jani270@users.noreply.github.com> Date: Tue, 9 Aug 2022 23:48:06 +0200 Subject: prerelease changes (#215) --- README.md | 1 + Update Notes/2.1.md | 1 + .../notenoughupdates/NotEnoughUpdates.java | 6 ++--- .../dungeons/GuiDungeonMapEditor.java | 2 +- .../notenoughupdates/miscgui/CalendarOverlay.java | 26 +++++++++++----------- 5 files changed, 19 insertions(+), 17 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/README.md b/README.md index 1dc49f19..4249abc8 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,7 @@ NotEnoughUpdates (NEU) is a feature rich 1.8.9 Minecraft forge mod for Hypixel S ## Features - An [item list](https://github.com/NotEnoughUpdates/NotEnoughUpdates-REPO) containing information and recipes about every item in skyblock. +- A dungeons minimap. - Dungeon loot profit checker. - Item overlays for Treecapitator, Builder's Wand, Block Zapper, and Bonemerang. - An in-game skyblock profile viewer accessed with `/pv [player]`. diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 47c66c18..f76d3e75 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -103,6 +103,7 @@ - Added Trophy Reward Overlay - hannibal2 - Added power stone feature - hannibal2 - Added abiphone warning - hannibal2 +- Added blur limit at 100 - nopo ### **Bug Fixes:** diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index 9931f945..a1eb03d1 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -111,9 +111,9 @@ import java.util.Set; public class NotEnoughUpdates { public static final String MODID = "notenoughupdates"; public static final String VERSION = "2.1.0-REL"; - public static final int VERSION_ID = 20200; - public static final int PRE_VERSION_ID = 0; - public static final int HOTFIX_VERSION_ID = 1; + public static final int VERSION_ID = 20000; + public static final int PRE_VERSION_ID = 1; + public static final int HOTFIX_VERSION_ID = 0; /** * Registers the biomes for the crystal hollows here so optifine knows they exists */ 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 47e85023..8ce9d505 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/GuiDungeonMapEditor.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/GuiDungeonMapEditor.java @@ -284,7 +284,7 @@ public class GuiDungeonMapEditor extends GuiScreen { break; case 8: mapDesc = "Simple gray border"; - mapCredit = "TomEngMaster"; + mapCredit = "Lucy"; break; case 9: mapDesc = "Viney wood border"; 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 64396905..2905a941 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/CalendarOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/CalendarOverlay.java @@ -865,8 +865,8 @@ public class CalendarOverlay { SBEvent firstEvent = null; List nextFavourites = new ArrayList<>(); List nextFavouritesTime = new ArrayList<>(); - long timeUntilMajor = 0; - SBEvent nextMajorEvent = null; + long timeUntilMayor = 0; + SBEvent nextMayorEvent = null; List eventFavourites = NotEnoughUpdates.INSTANCE.config.hidden.eventFavourites; @@ -889,10 +889,10 @@ public class CalendarOverlay { } } - if (nextMajorEvent == null && !sbEvent.id.split(":")[0].equals("jacob_farming") && + if (nextMayorEvent == null && !sbEvent.id.split(":")[0].equals("jacob_farming") && !sbEvent.id.equals("dark_auction")) { - nextMajorEvent = sbEvent; - timeUntilMajor = timeUntilMillis; + nextMayorEvent = sbEvent; + timeUntilMayor = timeUntilMillis; } if (firstEvent == null) { @@ -919,7 +919,7 @@ public class CalendarOverlay { } } - if (nextFavourites.size() >= 3 && nextMajorEvent != null) { + if (nextFavourites.size() >= 3 && nextMayorEvent != null) { break out; } } @@ -1000,18 +1000,18 @@ public class CalendarOverlay { if (sbEvent.id.split(":")[0].equals("jacob_farming") && sbEvent.desc != null) { tooltipToDisplay.addAll(sbEvent.desc); } - if (nextMajorEvent != null || i < nextFavourites.size() - 1) { + if (nextMayorEvent != null || i < nextFavourites.size() - 1) { tooltipToDisplay.add(""); } } - if (nextMajorEvent != null) { - tooltipToDisplay.add(EnumChatFormatting.YELLOW.toString() + EnumChatFormatting.BOLD + "Next Major:"); - tooltipToDisplay.add(nextMajorEvent.display); + if (nextMayorEvent != null) { + tooltipToDisplay.add(EnumChatFormatting.YELLOW.toString() + EnumChatFormatting.BOLD + "Next Mayor:"); + tooltipToDisplay.add(nextMayorEvent.display); tooltipToDisplay.add(EnumChatFormatting.GRAY + "Starts in: " + EnumChatFormatting.YELLOW + - prettyTime(timeUntilMajor, false)); - if (nextMajorEvent.lastsFor >= 0) { + prettyTime(timeUntilMayor, false)); + if (nextMayorEvent.lastsFor >= 0) { tooltipToDisplay.add(EnumChatFormatting.GRAY + "Lasts for: " + EnumChatFormatting.YELLOW + - prettyTime(nextMajorEvent.lastsFor, true)); + prettyTime(nextMayorEvent.lastsFor, true)); } } -- cgit From 4d48d36976dae85fcd46a605408b006857f1f9fd Mon Sep 17 00:00:00 2001 From: Roman / Nea Date: Thu, 11 Aug 2022 13:18:16 +0200 Subject: Autoupdate (#191) Co-authored-by: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> --- CONTRIBUTING.md | 5 +- Update Notes/2.1.md | 2 + build.gradle.kts | 3 + .../moulberry/notenoughupdates/NEUManager.java | 10 +- .../moulberry/notenoughupdates/NEUOverlay.java | 4 +- .../notenoughupdates/NotEnoughUpdates.java | 2 + .../notenoughupdates/commands/Commands.java | 3 + .../commands/misc/UpdateCommand.java | 96 ++++++++ .../listener/NEUEventListener.java | 69 +----- .../miscfeatures/updater/AutoUpdater.java | 257 +++++++++++++++++++++ .../miscfeatures/updater/LinuxBasedUpdater.java | 47 ++++ .../miscfeatures/updater/SCUCompatUpdater.java | 100 ++++++++ .../miscfeatures/updater/UpdateLoader.java | 141 +++++++++++ .../moulberry/notenoughupdates/util/NetUtils.java | 51 ++++ .../moulberry/notenoughupdates/util/Utils.java | 12 +- 15 files changed, 723 insertions(+), 79 deletions(-) create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/commands/misc/UpdateCommand.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/AutoUpdater.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/LinuxBasedUpdater.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/SCUCompatUpdater.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/UpdateLoader.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/util/NetUtils.java (limited to 'Update Notes/2.1.md') diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a5fa2b6a..c478982f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -74,6 +74,7 @@ public static final int HOTFIX_VERSION_ID = 0; /* Reset the HOTFIX_VERSION_ID ba "pre_version": "0.0", /* Reset to 0.0 */ "pre_version_id": 0, /* Reset to 0 */ "update_link": "https://github.com/NotEnoughUpdates/NotEnoughUpdates/releases/tag/", /* Change download link to the github release */ + "update_direct": "https://github.com/NotEnoughUpdates/NotEnoughUpdates/releases/download//NotEnoughUpdates-.jar", /* Change direct link to a direct download link */ } ``` @@ -104,7 +105,8 @@ public static final int PRE_VERSION_ID = 1; /* Increment the PRE_VERSION_ID */ "pre_update_msg": "§7§m§l--------------------§5§l[§c§lNEU§5§l]§7§m§l--------------------\n\n§7A new pre-release, v§52.0-PRE{pre_version}§7, is now available!\n ", /* Update the version name. Remove old patch notes; Optionally add in a short new patch note. */ "pre_version": "0.0", /* Set to a new string (preferably increase the major version every time, except for hotfixes on the prerelease stream) */ "pre_version_id": 0, /* Set to PRE_VERSION_ID from java */ - "update_link": "https://github.com/NotEnoughUpdates/NotEnoughUpdates/releases/tag/", /* Change download link to the github release */ + "pre_update_link": "https://github.com/NotEnoughUpdates/NotEnoughUpdates/releases/tag/", /* Change download link to the github release */ + "pre_update_direct": "https://github.com/NotEnoughUpdates/NotEnoughUpdates/releases/download//NotEnoughUpdates-.jar", /* Change direct link to a direct download link */ } ``` @@ -136,6 +138,7 @@ public static final int HOTFIX_VERSION_ID = 1; /* Increment the HOTFIX_VERSION_I "version_id": 20100, /* Same as version */ "update_msg": "§7§m§l--------------------§6§l[§c§lNEU§6§l]§7§m§l--------------------\n\n§7A new version, v§6{version}§7, is now available!\n ", /* Update the version name. Don't remove old patch notes; Optionally add in a short new patch note. Indicate that there is a hotfix present */ "update_link": "https://github.com/NotEnoughUpdates/NotEnoughUpdates/releases/tag/", /* Change download link to the github release */ + "update_direct": "https://github.com/NotEnoughUpdates/NotEnoughUpdates/releases/download//NotEnoughUpdates-.jar", /* Change direct link to a direct download link */ } ``` diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index f76d3e75..c41b9ccb 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -101,10 +101,12 @@ - Added Fishing Timer over bobber - nea89 - Added [Auction Profit Viewer Overlay](https://cdn.discordapp.com/attachments/848901833119629332/993191851400101918/176946124-28ddf336-1ec7-460b-b22a-5fe2733b46a3.png) - efefury - Added Trophy Reward Overlay - hannibal2 +- Add Auto-Updater (linux and scu only) - nea89 - Added power stone feature - hannibal2 - Added abiphone warning - hannibal2 - Added blur limit at 100 - nopo + ### **Bug Fixes:** - Fixed wiki pages freezing the entire game - nea89 diff --git a/build.gradle.kts b/build.gradle.kts index 90ee7d94..581816e2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -92,6 +92,7 @@ repositories { mavenCentral() mavenLocal() maven("https://repo.spongepowered.org/maven/") + maven("https://pkgs.dev.azure.com/djtheredstoner/DevAuth/_packaging/public/maven/v1") maven("https://jitpack.io") } @@ -107,6 +108,8 @@ dependencies { testImplementation("org.junit.jupiter:junit-jupiter:5.8.2") testAnnotationProcessor("org.spongepowered:mixin:0.8.4-SNAPSHOT") // modImplementation("io.github.notenoughupdates:MoulConfig:0.0.1") + + modRuntimeOnly("me.djtheredstoner:DevAuth-forge-legacy:1.1.0") } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java index 9140120a..4e5c5b7d 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java @@ -672,7 +672,8 @@ public class NEUManager { ea = ea.getCompoundTag("Properties"); ea = ea.getTagList("textures", 10).getCompoundTagAt(0); String name = ea3.getString("Name").replaceAll(" M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$", ""); - return "put(\"ID\", Utils.createSkull(EnumChatFormatting.AQUA + \"" + name + "\" ,\"" + ea2.getString("Id") + "\", \"" + ea.getString("Value") +"\"));"; + return "put(\"ID\", Utils.createSkull(EnumChatFormatting.AQUA + \"" + name + "\" ,\"" + ea2.getString("Id") + + "\", \"" + ea.getString("Value") + "\"));"; } } return null; @@ -912,6 +913,7 @@ public class NEUManager { NBTTagCompound tag = stack.getTagCompound(); return getSkullValueFromNBT(tag); } + public String getInternalNameForItem(ItemStack stack) { if (stack == null) return null; NBTTagCompound tag = stack.getTagCompound(); @@ -948,8 +950,7 @@ public class NEUManager { if (!usagesMap.containsKey(internalName)) return false; List usages = getAvailableUsagesFor(internalName); if (usages.isEmpty()) return false; - Minecraft.getMinecraft().displayGuiScreen( - new GuiItemRecipe(usages, this)); + NotEnoughUpdates.INSTANCE.openGui = (new GuiItemRecipe(usages, this)); return true; } @@ -957,8 +958,7 @@ public class NEUManager { if (!recipesMap.containsKey(internalName)) return false; List recipes = getAvailableRecipesFor(internalName); if (recipes.isEmpty()) return false; - Minecraft.getMinecraft().displayGuiScreen( - new GuiItemRecipe(recipes, this)); + NotEnoughUpdates.INSTANCE.openGui = (new GuiItemRecipe(recipes, this)); return true; } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java index e51f118e..19f5a780 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java @@ -813,7 +813,7 @@ public class NEUOverlay extends Gui { /** * Handles the mouse input, cancelling the forge event if a NEU gui element is clicked. */ - public boolean mouseInput() { + public synchronized boolean mouseInput() { if (disabled) { return false; } @@ -1483,7 +1483,7 @@ public class NEUOverlay extends Gui { * Returns an index-able array containing the elements in searchedItems. * Whenever searchedItems is updated in updateSearch(), the array is recreated here. */ - public List getSearchedItems() { + public synchronized List getSearchedItems() { if (searchedItems == null) { updateSearch(); return new ArrayList<>(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index a1eb03d1..25f72fe9 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -57,6 +57,7 @@ import io.github.moulberry.notenoughupdates.miscfeatures.SunTzu; import io.github.moulberry.notenoughupdates.miscfeatures.customblockzones.CustomBiomes; import io.github.moulberry.notenoughupdates.miscfeatures.customblockzones.CustomBlockSounds; import io.github.moulberry.notenoughupdates.miscfeatures.customblockzones.DwarvenMinesTextures; +import io.github.moulberry.notenoughupdates.miscfeatures.updater.AutoUpdater; import io.github.moulberry.notenoughupdates.miscgui.CalendarOverlay; import io.github.moulberry.notenoughupdates.miscgui.InventoryStorageSelector; import io.github.moulberry.notenoughupdates.miscgui.SignCalculator; @@ -172,6 +173,7 @@ public class NotEnoughUpdates { public Commands commands; public boolean packDevEnabled = false; public Color[][] colourMap = null; + public AutoUpdater autoUpdater = new AutoUpdater(this); private File configFile; private long lastChatMessage = 0; private long secondLastChatMessage = 0; 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 b152bc09..917185ab 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/commands/Commands.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/Commands.java @@ -19,6 +19,7 @@ package io.github.moulberry.notenoughupdates.commands; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.commands.dev.DevTestCommand; import io.github.moulberry.notenoughupdates.commands.dev.DiagCommand; import io.github.moulberry.notenoughupdates.commands.dev.DungeonWinTestCommand; @@ -41,6 +42,7 @@ import io.github.moulberry.notenoughupdates.commands.misc.CalculatorCommand; import io.github.moulberry.notenoughupdates.commands.misc.CalendarCommand; import io.github.moulberry.notenoughupdates.commands.misc.CosmeticsCommand; import io.github.moulberry.notenoughupdates.commands.misc.CustomizeCommand; +import io.github.moulberry.notenoughupdates.commands.misc.UpdateCommand; import io.github.moulberry.notenoughupdates.commands.profile.CataCommand; import io.github.moulberry.notenoughupdates.commands.profile.PeekCommand; import io.github.moulberry.notenoughupdates.commands.profile.PvCommand; @@ -94,6 +96,7 @@ public class Commands { ClientCommandHandler.instance.registerCommand(new AhCommand()); ClientCommandHandler.instance.registerCommand(new CalculatorCommand()); ClientCommandHandler.instance.registerCommand(new CalendarCommand()); + ClientCommandHandler.instance.registerCommand(new UpdateCommand(NotEnoughUpdates.INSTANCE)); // Fairy Soul Commands ClientCommandHandler.instance.registerCommand(new FairySouls.FairySoulsCommand()); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/UpdateCommand.java b/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/UpdateCommand.java new file mode 100644 index 00000000..36443b27 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/commands/misc/UpdateCommand.java @@ -0,0 +1,96 @@ +/* + * 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; +import io.github.moulberry.notenoughupdates.commands.ClientCommandBase; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.util.ChatComponentText; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +public class UpdateCommand extends ClientCommandBase { + NotEnoughUpdates neu; + + public UpdateCommand(NotEnoughUpdates neu) { + super("neuupdate"); + this.neu = neu; + } + + @Override + public List getCommandAliases() { + return Arrays.asList("neuupdates", "enoughupdates"); + } + + public void displayHelp(ICommandSender sender) { + sender.addChatMessage(new ChatComponentText( + "" + + "§e[NEU] §b/neuupdate help - View help.\n" + + "§e[NEU] §b/neuupdate check - Check for updates.\n" + + "§e[NEU] §b/neuupdate url - Load an update from an direct download URL.\n" + + " §cONLY DO THIS WITH TRUSTED URLS OR IT MIGHT RESULT IN A RAT!\n" + + "§e[NEU] §b/neuupdate fromartifact - Load an update from an artifact.\n" + + " §cIf you don't know what this is, don't use it.\n" + + "" + )); + + } + + @Override + public void processCommand(ICommandSender sender, String[] args) throws CommandException { + if ((args.length == 1 && Objects.equals(args[0], "help")) || args.length == 0) { + displayHelp(sender); + return; + } + switch (args[0].toLowerCase().intern()) { + case "check": + neu.autoUpdater.displayUpdateMessageIfOutOfDate(); + break; + case "url": + if (args.length != 2) { + sender.addChatMessage(new ChatComponentText("§e[NEU] §cPlease provide an URL")); + } + URL url; + try { + url = new URL(args[1]); + } catch (MalformedURLException e) { + e.printStackTrace(); + sender.addChatMessage(new ChatComponentText("§e[NEU] §cInvalid URL")); + return; + } + neu.autoUpdater.updateFromURL(url); + break; + case "scheduledownload": + neu.autoUpdater.scheduleDownload(); + break; + case "updatemodes": + sender.addChatMessage(new ChatComponentText("§e[NEU] §bTo ensure we do not accidentally corrupt your mod folder, we can only offer support for autoupdates on system with certain capabilities for file deletions (specifically unix systems). You can still manually update your files")); + break; + default: + displayHelp(sender); + + } + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/listener/NEUEventListener.java b/src/main/java/io/github/moulberry/notenoughupdates/listener/NEUEventListener.java index 26c2d1f9..041da446 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/NEUEventListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/NEUEventListener.java @@ -80,73 +80,6 @@ public class NEUEventListener { this.neu = neu; } - private void displayUpdateMessage(JsonObject updateJson, String updateMessage, String downloadLink) { - int firstWidth = -1; - - for (String line : Iterables.concat(Arrays.asList(updateMessage.split("\n")), Arrays.asList("Download here"))) { - FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; - boolean isDownloadLink = line.equals("Download here"); - int width = fr.getStringWidth(line); - if (firstWidth == -1) { - firstWidth = width; - } - int missingLen = firstWidth - width; - if (missingLen > 0) { - StringBuilder sb = new StringBuilder(missingLen / 4 / 2 +line.length()); - for (int i = 0; i < missingLen / 4 / 2; i++) { /* fr.getCharWidth(' ') == 4 */ - sb.append(" "); - } - sb.append(line); - line = sb.toString(); - } - ChatComponentText cp = new ChatComponentText(line); - if (isDownloadLink) - cp.setChatStyle(Utils.createClickStyle(ClickEvent.Action.OPEN_URL, downloadLink)); - Minecraft.getMinecraft().thePlayer.addChatMessage(cp); - } - neu.displayLinks(updateJson, firstWidth); - NotificationHandler.displayNotification(Arrays.asList( - "§eThere is a new version of NotEnoughUpdates available.", - "§eCheck the chat for more information" - ), true); - } - - private void displayUpdateMessageIfOutOfDate() { - File repo = neu.manager.repoLocation; - if (repo.exists()) { - File updateJson = new File(repo, "update.json"); - try { - JsonObject o = neu.manager.getJsonFromFile(updateJson); - - int fullReleaseVersion = - o.has("version_id") && o.get("version_id").isJsonPrimitive() ? o.get("version_id").getAsInt() : -1; - int preReleaseVersion = - o.has("version_id") && o.get("version_id").isJsonPrimitive() ? o.get("version_id").getAsInt() : -1; - int hotfixVersion = - o.has("hotfix_id") && o.get("hotfix_id").isJsonPrimitive() ? o.get("hotfix_id").getAsInt() : -1; - - boolean hasFullReleaseAvailableForUpgrade = fullReleaseVersion > NotEnoughUpdates.VERSION_ID; - boolean hasHotfixAvailableForUpgrade = - fullReleaseVersion == NotEnoughUpdates.VERSION_ID && hotfixVersion > NotEnoughUpdates.HOTFIX_VERSION_ID; - boolean hasPreReleaseAvailableForUpdate = - fullReleaseVersion == NotEnoughUpdates.VERSION_ID && preReleaseVersion > NotEnoughUpdates.PRE_VERSION_ID; - - int updateChannel = NotEnoughUpdates.INSTANCE.config.notifications.updateChannel; /* 1 = Full, 2 = Pre */ - if (hasFullReleaseAvailableForUpgrade || (hasHotfixAvailableForUpgrade && updateChannel == 1)) { - displayUpdateMessage(o, o.get("update_msg").getAsString(), o.get("update_link").getAsString()); - } else if (hasPreReleaseAvailableForUpdate && updateChannel == 2) { - displayUpdateMessage(o, o.get("pre_update_msg").getAsString(), o.get("pre_update_link").getAsString()); - } - } catch (Exception e) { - e.printStackTrace(); - Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText( - "§e[NEU] §cThere has been an error checking for updates. Check the log or join the discord for more information.").setChatStyle( - Utils.createClickStyle( - ClickEvent.Action.OPEN_URL, "https://discord.gg/moulberry"))); - } - } - } - @SubscribeEvent public void onWorldLoad(WorldEvent.Unload event) { NotEnoughUpdates.INSTANCE.saveConfig(); @@ -266,7 +199,7 @@ public class NEUEventListener { joinedSB = true; if (NotEnoughUpdates.INSTANCE.config.notifications.updateChannel != 0) { - displayUpdateMessageIfOutOfDate(); + NotEnoughUpdates.INSTANCE.autoUpdater.displayUpdateMessageIfOutOfDate(); } if (NotEnoughUpdates.INSTANCE.config.notifications.doRamNotif) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/AutoUpdater.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/AutoUpdater.java new file mode 100644 index 00000000..7869225d --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/AutoUpdater.java @@ -0,0 +1,257 @@ +/* + * 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.updater; + +import com.google.common.collect.Iterables; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSyntaxException; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.util.NotificationHandler; +import io.github.moulberry.notenoughupdates.util.Utils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.event.ClickEvent; +import net.minecraft.event.HoverEvent; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChatStyle; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; +import net.minecraftforge.fml.common.Loader; +import org.apache.commons.lang3.SystemUtils; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Arrays; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +public class AutoUpdater { + + NotEnoughUpdates neu; + + public AutoUpdater(NotEnoughUpdates neu) { + this.neu = neu; + } + + public void logProgress(String str) { + logProgress(new ChatComponentText(str)); + } + + public void logProgress(IChatComponent chatComponent) { + Minecraft.getMinecraft().addScheduledTask(() -> { + IChatComponent chatComponent1 = new ChatComponentText(""); + chatComponent1.setChatStyle(new ChatStyle().setColor(EnumChatFormatting.AQUA)); + chatComponent1.appendSibling(chatComponent); + Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§e[NEU-AutoUpdater] ").appendSibling( + chatComponent1)); + }); + } + + public UpdateLoader getUpdateLoader(URL url) { + if (SystemUtils.IS_OS_UNIX) { + return new LinuxBasedUpdater(this, url); + } + if (Loader.isModLoaded("skyblockclientupdater") && SCUCompatUpdater.IS_ENABLED) { + return SCUCompatUpdater.tryCreate(this, url); + } + return null; + } + + UpdateLoader updateLoader; + + public void updateFromURL(URL url) { + if (updateLoader != null) { + logProgress( + "There is already an update in progress, so the auto updater cannot process this update (as it might already be installed or is currently being downloaded). Please restart your client to install another update"); + return; + } + if (!"https".equals(url.getProtocol())) { + logProgress("§cInvalid protocol in url: " + url + ". Only https is a valid protocol."); + return; + } + updateLoader = getUpdateLoader(url); + if (updateLoader == null) { + logProgress(new ChatComponentText( + "Your system does not support auto updates. Please download this update manually. Click here to read more about auto update compatibility (or the link above for manual downloads)") + .setChatStyle( + new ChatStyle() + .setChatHoverEvent(new HoverEvent( + HoverEvent.Action.SHOW_TEXT, + new ChatComponentText("Click here to read about auto update modalities") + )) + .setChatClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/neuupdate updatemodes")) + )); + return; + } + updateLoader.greet(); + logProgress(new ChatComponentText("[Start download now]") + .setChatStyle(new ChatStyle() + .setColor(EnumChatFormatting.GREEN) + .setChatHoverEvent(new HoverEvent( + HoverEvent.Action.SHOW_TEXT, + new ChatComponentText("Click to start download.") + )) + .setChatClickEvent(new ClickEvent( + ClickEvent.Action.RUN_COMMAND, + "/neuupdate scheduleDownload" + )))); + } + + public void scheduleDownload() { + if (updateLoader == null) { + logProgress("§cNo update found. Try running /neuupdate check first"); + return; + } + if (updateLoader.getState() != UpdateLoader.State.NOTHING) { + logProgress("§cUpdate download already started. No need to start the download again."); + return; + } + logProgress("Download started."); + updateLoader.scheduleDownload(); + } + + private void displayUpdateMessage( + JsonObject updateJson, + String updateMessage, + String downloadLink, + String directDownload + ) { + int firstWidth = -1; + + for (String line : Iterables.concat(Arrays.asList(updateMessage.split("\n")), Arrays.asList("Download here"))) { + FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; + boolean isDownloadLink = line.equals("Download here"); + int width = fr.getStringWidth(line); + if (firstWidth == -1) { + firstWidth = width; + } + int missingLen = firstWidth - width; + if (missingLen > 0) { + StringBuilder sb = new StringBuilder(missingLen / 4 / 2 + line.length()); + for (int i = 0; i < missingLen / 4 / 2; i++) { /* fr.getCharWidth(' ') == 4 */ + sb.append(" "); + } + sb.append(line); + line = sb.toString(); + } + ChatComponentText cp = new ChatComponentText(line); + if (isDownloadLink) + cp.setChatStyle(Utils.createClickStyle(ClickEvent.Action.OPEN_URL, downloadLink)); + Minecraft.getMinecraft().thePlayer.addChatMessage(cp); + } + neu.displayLinks(updateJson, firstWidth); + NotificationHandler.displayNotification(Arrays.asList( + "", + "§eThere is a new version of NotEnoughUpdates available.", + "§eCheck the chat for more information" + ), true); + try { + if (directDownload != null) + updateFromURL(new URL(directDownload)); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + } + + public void displayUpdateMessageIfOutOfDate() { + File repo = neu.manager.repoLocation; + if (repo.exists()) { + File updateJson = new File(repo, "update.json"); + try { + JsonObject o = neu.manager.getJsonFromFile(updateJson); + + int fullReleaseVersion = + o.has("version_id") && o.get("version_id").isJsonPrimitive() ? o.get("version_id").getAsInt() : -1; + int preReleaseVersion = + o.has("version_id") && o.get("version_id").isJsonPrimitive() ? o.get("version_id").getAsInt() : -1; + int hotfixVersion = + o.has("hotfix_id") && o.get("hotfix_id").isJsonPrimitive() ? o.get("hotfix_id").getAsInt() : -1; + + boolean hasFullReleaseAvailableForUpgrade = fullReleaseVersion > NotEnoughUpdates.VERSION_ID; + boolean hasHotfixAvailableForUpgrade = + fullReleaseVersion == NotEnoughUpdates.VERSION_ID && hotfixVersion > NotEnoughUpdates.HOTFIX_VERSION_ID; + boolean hasPreReleaseAvailableForUpdate = + fullReleaseVersion == NotEnoughUpdates.VERSION_ID && preReleaseVersion > NotEnoughUpdates.PRE_VERSION_ID; + + int updateChannel = NotEnoughUpdates.INSTANCE.config.notifications.updateChannel; /* 1 = Full, 2 = Pre */ + if (hasFullReleaseAvailableForUpgrade || (hasHotfixAvailableForUpgrade && updateChannel == 1)) { + displayUpdateMessage( + o, + o.get("update_msg").getAsString(), + o.get("update_link").getAsString(), + o.has("update_direct") ? o.get("update_direct").getAsString() : null + ); + } else if (hasPreReleaseAvailableForUpdate && updateChannel == 2) { + displayUpdateMessage( + o, + o.get("pre_update_msg").getAsString(), + o.get("pre_update_link").getAsString(), + o.has("pre_update_direct") ? o.get("pre_update_direct").getAsString() : null + ); + } + } catch (Exception e) { + e.printStackTrace(); + Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText( + "§e[NEU] §cThere has been an error checking for updates. Check the log or join the discord for more information.").setChatStyle( + Utils.createClickStyle( + ClickEvent.Action.OPEN_URL, "https://discord.gg/moulberry"))); + } + } + } + + private boolean validateMcModInfo(JsonArray array) { + if (array.size() != 1) return false; + JsonElement jsonElement = array.get(0); + if (!jsonElement.isJsonObject()) return false; + JsonObject jsonObject = jsonElement.getAsJsonObject(); + if (!jsonObject.has("modid")) return false; + JsonElement modid = jsonObject.get("modid"); + if (!modid.isJsonPrimitive()) return false; + JsonPrimitive primitive = modid.getAsJsonPrimitive(); + if (!primitive.isString()) return false; + return "notenoughupdates".equals(primitive.getAsString()); + } + + public boolean isNeuJar(File sus) { + try (ZipFile zipFile = new ZipFile(sus)) { + ZipEntry entry = zipFile.getEntry("mcmod.info"); + if (entry == null) { + return false; + } + try (InputStream inputStream = zipFile.getInputStream(entry)) { + JsonArray jsonArray = neu.manager.gson.fromJson( + new InputStreamReader(inputStream), + JsonArray.class + ); + return validateMcModInfo(jsonArray); + } + } catch (IOException | JsonSyntaxException e) { + e.printStackTrace(); + } + return false; + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/LinuxBasedUpdater.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/LinuxBasedUpdater.java new file mode 100644 index 00000000..3118b135 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/LinuxBasedUpdater.java @@ -0,0 +1,47 @@ +/* + * 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.updater; + +import java.io.File; +import java.net.URL; +import java.util.List; + +class LinuxBasedUpdater /* Based on what? */ extends UpdateLoader { + + LinuxBasedUpdater(AutoUpdater updater, URL url) { + super(updater, url); + } + + @Override + public void greet() { + updater.logProgress( + "Welcome Aristocrat! Your superior linux system configuration is supported for NEU auto updates."); + } + + @Override + public void deleteFiles(List toDelete) { + for (File toDel : toDelete) { + if (!toDel.delete()) { + updater.logProgress("§cCould not delete old version of NEU: " + toDel + ". Please manually delete file."); + state = State.FAILED; + } + } + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/SCUCompatUpdater.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/SCUCompatUpdater.java new file mode 100644 index 00000000..3cb600cb --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/SCUCompatUpdater.java @@ -0,0 +1,100 @@ +/* + * 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.updater; + +import java.io.File; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.net.URL; +import java.util.List; + +/* + * Legal considerations: Skyblock Client Updater is licensed under the GNU AGPL v3.0 or later (with modifications). + * https://github.com/My-Name-Is-Jeff/SkyblockClient-Updater/blob/main/LICENSE + * + * However, even tho the AGPL License does not allow conveying covered work in combination with LGPL licensed code + * (such as our own), we do not perceive ourselves as conveying neither an unmodified version of Skyblock Client Updater + * nor a work based on Skyblock Client Updater (modified work) since our work is usable and functional in its entirety + * without presence of Skyblock Client Updater and is not to be distributed along a copy of Skyblock Client Updater + * unless that combined work is licensed with respect of both the LGPL and the AGPL, therefore is not adapting any part + * of Skyblock Client Updater unless already part of a whole distribution. + * + * In case the Copyright owner (Lily aka My-Name-Is-Jeff on Github) disagrees, we are willing to take down this module + * (or only convey this component of our work under a pure GPL license) with or without them providing legal grounds + * for this request. However, due to them not being able to be reached for comment, we will include this + * component for the time being. + * */ +public class SCUCompatUpdater extends UpdateLoader { + + public static final boolean IS_ENABLED = false; + + private SCUCompatUpdater(AutoUpdater updater, URL url) { + super(updater, url); + } + + @Override + public void greet() { + updater.logProgress("Skyblock Client Updater compatibility layer loaded."); + } + + @Override + public void deleteFiles(List toDelete) { + try { + for (File f : toDelete) + ReflectionHolder.deleteFileOnShutdownHandle.invoke(ReflectionHolder.updateCheckerInstance, f, ""); + } catch (Throwable e) { + e.printStackTrace(); + updater.logProgress("Invoking SCU failed. Check the log for more info."); + state = State.FAILED; + } + } + + static class ReflectionHolder { + static boolean isSCUFullyPresent = false; + static Class updateChecker; + static Object updateCheckerInstance; + static Method deleteFileOnShutdown; + static MethodHandle deleteFileOnShutdownHandle; + + static { + try { + updateChecker = Class.forName("mynameisjeff.skyblockclientupdater.utils.UpdateChecker"); + Field instanceField = updateChecker.getDeclaredField("INSTANCE"); + instanceField.setAccessible(true); + updateCheckerInstance = instanceField.get(null); + deleteFileOnShutdown = updateChecker.getDeclaredMethod("deleteFileOnShutdown", File.class, String.class); + deleteFileOnShutdownHandle = MethodHandles.publicLookup().unreflect(deleteFileOnShutdown); + isSCUFullyPresent = true; + } catch (NoSuchFieldException | ClassNotFoundException | IllegalAccessException | NoSuchMethodException e) { + e.printStackTrace(); + } + } + } + + public static UpdateLoader tryCreate(AutoUpdater updater, URL url) { + if (!ReflectionHolder.isSCUFullyPresent) { + updater.logProgress("§cFound Skyclient Updater Mod, however our hooks did not function properly."); + return null; + } + return new SCUCompatUpdater(updater, url); + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/UpdateLoader.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/UpdateLoader.java new file mode 100644 index 00000000..1a1a8504 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/UpdateLoader.java @@ -0,0 +1,141 @@ +/* + * 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.updater; + +import io.github.moulberry.notenoughupdates.util.NetUtils; +import net.minecraft.client.Minecraft; +import org.apache.commons.io.IOUtils; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.List; + +abstract class UpdateLoader { + + enum State { + NOTHING, DOWNLOAD_STARTED, DOWNLOAD_FINISHED, INSTALLED, FAILED + } + + URL url; + AutoUpdater updater; + + State state = State.NOTHING; + + UpdateLoader(AutoUpdater updater, URL url) { + this.url = url; + this.updater = updater; + } + + public State getState() { + return state; + } + + public void setState(State state) { + this.state = state; + } + + public URL getUrl() { + return url; + } + + public void scheduleDownload() { + state = State.DOWNLOAD_STARTED; + try { + NetUtils.downloadAsync(url, File.createTempFile("NotEnoughUpdates-update", ".jar")) + .handle( + (f, exc) -> { + if (exc != null) { + state = State.FAILED; + updater.logProgress("§cError while downloading. Check your logs for more info."); + exc.printStackTrace(); + return null; + } + state = State.DOWNLOAD_FINISHED; + + updater.logProgress("Download completed. Trying to install"); + launchUpdate(f); + return null; + }); + } catch (IOException e) { + state = State.FAILED; + updater.logProgress("§cError while creating download. Check your logs for more info."); + e.printStackTrace(); + } + } + + public abstract void greet(); + + public void launchUpdate(File file) { + + if (state != State.DOWNLOAD_FINISHED) { + updater.logProgress("§cUpdate is invalid state " + state + " to start update."); + state = State.FAILED; + return; + } + File mcDataDir = new File(Minecraft.getMinecraft().mcDataDir, "mods"); + if (!mcDataDir.exists() || !mcDataDir.isDirectory() || !mcDataDir.canRead()) { + updater.logProgress("§cCould not find mods folder. Searched: " + mcDataDir); + state = State.FAILED; + return; + } + ArrayList toDelete = new ArrayList<>(); + File[] modFiles = mcDataDir.listFiles(); + if (modFiles == null) { + updater.logProgress("§cCould not list minecraft mod folder (" + mcDataDir + ")"); + state = State.FAILED; + return; + } + for (File sus : modFiles) { + if (sus.getName().endsWith(".jar")) { + if (updater.isNeuJar(sus)) { + updater.logProgress("Found old NEU file: " + sus + ". Deleting later."); + toDelete.add(sus); + } + } + } + File dest = new File(mcDataDir, file.getName()); + try ( + InputStream i = Files.newInputStream(file.toPath()); + OutputStream o = Files.newOutputStream(dest.toPath()); + ) { + IOUtils.copyLarge(i, o); + } catch (IOException e) { + e.printStackTrace(); + updater.logProgress( + "§cFailed to copy release JAR. Not making any changes to your mod folder. Consult your logs for more info."); + state = State.FAILED; + } + deleteFiles(toDelete); + if (state != State.FAILED) { + state = State.INSTALLED; + updater.logProgress("Update successful. Thank you for your time."); + return; + } + updater.logProgress("§cFailure to delete some files. Please delte the old NEU version manually from your mods folder."); + } + + public abstract void deleteFiles(List toDelete); + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/NetUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/util/NetUtils.java new file mode 100644 index 00000000..b09dd839 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/NetUtils.java @@ -0,0 +1,51 @@ +/* + * 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.util; + +import org.apache.commons.io.IOUtils; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.nio.file.Files; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; + +public class NetUtils { + + public static CompletableFuture downloadAsync(URL httpURL, File outputFile) { + return CompletableFuture.supplyAsync(() -> { + try { + try ( + InputStream from = httpURL.openStream(); + OutputStream to = Files.newOutputStream(outputFile.toPath()); + ) { + IOUtils.copyLarge(from, to); + } + return outputFile; + } catch (IOException e) { + throw new CompletionException(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 a99e4e7a..9713b69a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java @@ -877,6 +877,8 @@ public class Utils { String... lore ) { NBTTagCompound tag = itemStack.getTagCompound(); + if (tag == null) + tag = new NBTTagCompound(); NBTTagCompound display = tag.getCompoundTag("display"); NBTTagList Lore = new NBTTagList(); @@ -1940,9 +1942,13 @@ public class Utils { public static void showOutdatedRepoNotification() { NotificationHandler.displayNotification(Lists.newArrayList( EnumChatFormatting.RED + EnumChatFormatting.BOLD.toString() + "Missing repo data", - EnumChatFormatting.RED + "Data used for many NEU features is not up to date, this should normally not be the case.", - EnumChatFormatting.RED + "You can try " + EnumChatFormatting.BOLD + "/neuresetrepo" + EnumChatFormatting.RESET + EnumChatFormatting.RED +" and restart your game" + - " to see if that fixes the issue.", EnumChatFormatting.RED + "If the problem persists please join " + EnumChatFormatting.BOLD + "discord.gg/moulberry" + + EnumChatFormatting.RED + + "Data used for many NEU features is not up to date, this should normally not be the case.", + EnumChatFormatting.RED + "You can try " + EnumChatFormatting.BOLD + "/neuresetrepo" + EnumChatFormatting.RESET + + EnumChatFormatting.RED + " and restart your game" + + " to see if that fixes the issue.", + EnumChatFormatting.RED + "If the problem persists please join " + EnumChatFormatting.BOLD + + "discord.gg/moulberry" + EnumChatFormatting.RESET + EnumChatFormatting.RED + " and message in " + EnumChatFormatting.BOLD + "#neu-support" + EnumChatFormatting.RESET + EnumChatFormatting.RED + " to get support" ), -- cgit From 2641d9a09af3a7c3cdb130de34c5561a9b30f7d4 Mon Sep 17 00:00:00 2001 From: Lulonaut <67191924+Lulonaut@users.noreply.github.com> Date: Sat, 13 Aug 2022 10:14:39 +0200 Subject: quiver info in pv (#210) Co-authored-by: nopo Co-authored-by: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> --- Update Notes/2.1.md | 1 + .../miscfeatures/BazaarSacksProfit.java | 8 +- .../profileviewer/GuiProfileViewer.java | 93 ++++++++++----------- .../profileviewer/InventoriesPage.java | 36 ++++---- .../profileviewer/PlayerStats.java | 95 +++++++++++++++------- .../profileviewer/info/QuiverInfo.java | 62 ++++++++++++++ 6 files changed, 202 insertions(+), 93 deletions(-) create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/profileviewer/info/QuiverInfo.java (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index c41b9ccb..774ce075 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -35,6 +35,7 @@ - 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 - Added senither and lily weight - CrypticPlasma + - Added info about the Quiver when hovering over the arrow in the inventory tab of /pv - Lulonaut ### **Minor Changes:** diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/BazaarSacksProfit.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/BazaarSacksProfit.java index c323cd2e..3137fb90 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/BazaarSacksProfit.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/BazaarSacksProfit.java @@ -146,6 +146,8 @@ public class BazaarSacksProfit { map.put("§a" + formatter.format(amount) + "§7x §f" + name + " §7for §6" + priceFormat + " coins", extraPrice); } + + event.toolTip.add(4, ""); if (showSellOrderPrice) { event.toolTip.add(4, "§7Sell order price: §6" + formatter.format(totalPrice)); } else { @@ -153,14 +155,18 @@ public class BazaarSacksProfit { } event.toolTip.add(4, ""); + event.toolTip.removeIf(line -> line.equals("§5§o")); + int index = 4; for (String name : invalidNames) { + index++; event.toolTip.add(4, name + " §cMissing repo data!"); } for (String text : TrophyRewardOverlay.sortByValue(map).keySet()) { + index++; event.toolTip.add(4, text); } + event.toolTip.add(index, ""); - event.toolTip.add(""); if (!showSellOrderPrice) { event.toolTip.add("§8[Press SHIFT to show sell order price]"); } else { 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 0ab67595..5093b036 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java @@ -29,17 +29,6 @@ import io.github.moulberry.notenoughupdates.profileviewer.bestiary.BestiaryPage; import io.github.moulberry.notenoughupdates.profileviewer.trophy.TrophyFishPage; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; -import java.awt.*; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Optional; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityOtherPlayerMP; import net.minecraft.client.gui.GuiScreen; @@ -61,6 +50,18 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL14; import org.lwjgl.opengl.GL20; +import java.awt.*; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.text.NumberFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; + public class GuiProfileViewer extends GuiScreen { public static final ResourceLocation pv_dropdown = new ResourceLocation("notenoughupdates:pv_dropdown.png"); @@ -354,8 +355,8 @@ public class GuiProfileViewer extends GuiScreen { } else { showBingoPage = currProfileInfo != null && - currProfileInfo.has("game_mode") && - currProfileInfo.get("game_mode").getAsString().equals("bingo"); + currProfileInfo.has("game_mode") && + currProfileInfo.get("game_mode").getAsString().equals("bingo"); } if (!showBingoPage && currentPage == ProfileViewerPage.BINGO) currentPage = ProfileViewerPage.BASIC; @@ -407,8 +408,8 @@ public class GuiProfileViewer extends GuiScreen { //ironman icon if ( currProfileInfo != null && - currProfileInfo.has("game_mode") && - currProfileInfo.get("game_mode").getAsString().equals("ironman") + currProfileInfo.has("game_mode") && + currProfileInfo.get("game_mode").getAsString().equals("ironman") ) { GlStateManager.color(1, 1, 1, 1); Minecraft.getMinecraft().getTextureManager().bindTexture(pv_ironman); @@ -417,8 +418,8 @@ public class GuiProfileViewer extends GuiScreen { //bingo! icon if ( currProfileInfo != null && - currProfileInfo.has("game_mode") && - currProfileInfo.get("game_mode").getAsString().equals("bingo") + currProfileInfo.has("game_mode") && + currProfileInfo.get("game_mode").getAsString().equals("bingo") ) { GlStateManager.color(1, 1, 1, 1); Minecraft.getMinecraft().getTextureManager().bindTexture(pv_bingo); @@ -427,8 +428,8 @@ public class GuiProfileViewer extends GuiScreen { //stranded icon if ( currProfileInfo != null && - currProfileInfo.has("game_mode") && - currProfileInfo.get("game_mode").getAsString().equals("island") + currProfileInfo.has("game_mode") && + currProfileInfo.get("game_mode").getAsString().equals("island") ) { GlStateManager.color(1, 1, 1, 1); Minecraft.getMinecraft().getTextureManager().bindTexture(pv_stranded); @@ -437,10 +438,10 @@ public class GuiProfileViewer extends GuiScreen { //icon if game mode is unknown if ( currProfileInfo != null && - currProfileInfo.has("game_mode") && - !currProfileInfo.get("game_mode").getAsString().equals("island") && - !currProfileInfo.get("game_mode").getAsString().equals("bingo") && - !currProfileInfo.get("game_mode").getAsString().equals("ironman") + currProfileInfo.has("game_mode") && + !currProfileInfo.get("game_mode").getAsString().equals("island") && + !currProfileInfo.get("game_mode").getAsString().equals("bingo") && + !currProfileInfo.get("game_mode").getAsString().equals("ironman") ) { GlStateManager.color(1, 1, 1, 1); Minecraft.getMinecraft().getTextureManager().bindTexture(pv_unknown); @@ -505,8 +506,8 @@ public class GuiProfileViewer extends GuiScreen { currProfileInfo = profile.getProfileInformation(otherProfileId); if ( currProfileInfo != null && - currProfileInfo.has("game_mode") && - currProfileInfo.get("game_mode").getAsString().equals("ironman") + currProfileInfo.has("game_mode") && + currProfileInfo.get("game_mode").getAsString().equals("ironman") ) { GlStateManager.color(1, 1, 1, 1); Minecraft.getMinecraft().getTextureManager().bindTexture(pv_ironman); @@ -520,8 +521,8 @@ public class GuiProfileViewer extends GuiScreen { } if ( currProfileInfo != null && - currProfileInfo.has("game_mode") && - currProfileInfo.get("game_mode").getAsString().equals("bingo") + currProfileInfo.has("game_mode") && + currProfileInfo.get("game_mode").getAsString().equals("bingo") ) { GlStateManager.color(1, 1, 1, 1); Minecraft.getMinecraft().getTextureManager().bindTexture(pv_bingo); @@ -535,8 +536,8 @@ public class GuiProfileViewer extends GuiScreen { } if ( currProfileInfo != null && - currProfileInfo.has("game_mode") && - currProfileInfo.get("game_mode").getAsString().equals("island") + currProfileInfo.has("game_mode") && + currProfileInfo.get("game_mode").getAsString().equals("island") ) { GlStateManager.color(1, 1, 1, 1); Minecraft.getMinecraft().getTextureManager().bindTexture(pv_stranded); @@ -550,10 +551,10 @@ public class GuiProfileViewer extends GuiScreen { } if ( currProfileInfo != null && - currProfileInfo.has("game_mode") && - !currProfileInfo.get("game_mode").getAsString().equals("island") && - !currProfileInfo.get("game_mode").getAsString().equals("bingo") && - !currProfileInfo.get("game_mode").getAsString().equals("ironman") + currProfileInfo.has("game_mode") && + !currProfileInfo.get("game_mode").getAsString().equals("island") && + !currProfileInfo.get("game_mode").getAsString().equals("bingo") && + !currProfileInfo.get("game_mode").getAsString().equals("ironman") ) { GlStateManager.color(1, 1, 1, 1); Minecraft.getMinecraft().getTextureManager().bindTexture(pv_unknown); @@ -671,9 +672,9 @@ public class GuiProfileViewer extends GuiScreen { if (timeDiff > 1800000) { Utils.drawStringCentered( EnumChatFormatting.RED + - "" + - EnumChatFormatting.BOLD + - "You don't know what's gonna happen to you", + "" + + EnumChatFormatting.BOLD + + "You don't know what's gonna happen to you", Minecraft.getMinecraft().fontRendererObj, guiLeft + sizeX / 2f, guiTop + 191, @@ -692,9 +693,9 @@ public class GuiProfileViewer extends GuiScreen { if (timeDiff > 3300000) { Utils.drawStringCentered( EnumChatFormatting.DARK_RED + - "" + - EnumChatFormatting.BOLD + - "OW LORD FORGIVE ME FOR THIS", + "" + + EnumChatFormatting.BOLD + + "OW LORD FORGIVE ME FOR THIS", Minecraft.getMinecraft().fontRendererObj, guiLeft + sizeX / 2f, guiTop + 71, @@ -856,10 +857,10 @@ public class GuiProfileViewer extends GuiScreen { } if ( mouseX > guiLeft + 106 && - mouseX < guiLeft + 106 + 100 && - profile != null && - !profile.getProfileNames().isEmpty() && - profileId != null + mouseX < guiLeft + 106 + 100 && + profile != null && + !profile.getProfileNames().isEmpty() && + profileId != null ) { if (mouseY > guiTop + sizeY + 3 && mouseY < guiTop + sizeY + 23) { try { @@ -997,9 +998,9 @@ public class GuiProfileViewer extends GuiScreen { int maxXp = (int) levelObj.maxXpForLevel; levelStr = EnumChatFormatting.DARK_PURPLE + - shortNumberFormat(Math.round((level % 1) * maxXp), 0) + - "/" + - shortNumberFormat(maxXp, 0); + shortNumberFormat(Math.round((level % 1) * maxXp), 0) + + "/" + + shortNumberFormat(maxXp, 0); } if (totalXpStr != null) { tooltipToDisplay = Utils.createList(levelStr, totalXpStr); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/InventoriesPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/InventoriesPage.java index 4c60a8ca..8bba9c76 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/InventoriesPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/InventoriesPage.java @@ -19,24 +19,12 @@ package io.github.moulberry.notenoughupdates.profileviewer; -import static io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer.pv_elements; - import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.profileviewer.info.QuiverInfo; import io.github.moulberry.notenoughupdates.util.Utils; -import java.awt.*; -import java.io.IOException; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.GlStateManager; @@ -52,6 +40,20 @@ import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; +import java.awt.*; +import java.io.IOException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.TreeMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer.pv_elements; + public class InventoriesPage extends GuiProfileViewerPage { public static final ResourceLocation pv_invs = new ResourceLocation("notenoughupdates:pv_invs.png"); @@ -334,8 +336,12 @@ public class InventoriesPage extends GuiProfileViewerPage { if (mouseX > guiLeft + 173 && mouseX < guiLeft + 173 + 16) { if (mouseY > guiTop + 101 && mouseY < guiTop + 137 + 16) { if (mouseY < guiTop + 101 + 17) { - getInstance().tooltipToDisplay = - Utils.createList(EnumChatFormatting.WHITE + "Arrow " + EnumChatFormatting.GRAY + "x" + arrowCount); + QuiverInfo quiverInfo = PlayerStats.getQuiverInfo(inventoryInfo, profile.getProfileInformation(profileId)); + if (quiverInfo == null) { + getInstance().tooltipToDisplay = Utils.createList(EnumChatFormatting.RED + "Error checking Quiver"); + } else { + getInstance().tooltipToDisplay = quiverInfo.generateProfileViewerTooltip(); + } } else if (mouseY < guiTop + 119 + 17) { getInstance().tooltipToDisplay = Utils.createList(EnumChatFormatting.GREEN + "Green Candy " + EnumChatFormatting.GRAY + "x" + greenCandyCount); 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 b32aad61..b0cc930a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PlayerStats.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PlayerStats.java @@ -24,9 +24,18 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.profileviewer.info.QuiverInfo; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.JsonUtils; import io.github.moulberry.notenoughupdates.util.Utils; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.JsonToNBT; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.EnumChatFormatting; +import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.Nullable; + import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.AbstractMap; @@ -41,14 +50,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import net.minecraft.nbt.CompressedStreamTools; -import net.minecraft.nbt.JsonToNBT; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.util.EnumChatFormatting; -import org.apache.commons.lang3.StringUtils; -import org.jetbrains.annotations.Nullable; - public class PlayerStats { public static final String HEALTH = "health"; @@ -300,12 +301,12 @@ public class PlayerStats { bonuses.addStat(HEALTH, 60); break; case "EMERALD_ARMOR_": - { - int bonus = (int) Math.floor(Utils.getElementAsFloat(Utils.getElement(collectionInfo, "EMERALD"), 0) / 3000); - bonuses.addStat(HEALTH, bonus); - bonuses.addStat(DEFENCE, bonus); - } - break; + { + int bonus = (int) Math.floor(Utils.getElementAsFloat(Utils.getElement(collectionInfo, "EMERALD"), 0) / 3000); + bonuses.addStat(HEALTH, bonus); + bonuses.addStat(DEFENCE, bonus); + } + break; case "FAIRY_": bonuses.addStat(HEALTH, Utils.getElementAsFloat(Utils.getElement(profile, "fairy_souls_collected"), 0)); break; @@ -457,18 +458,18 @@ public class PlayerStats { if ( petsInfo != null && - petsInfo.has("active_pet") && - petsInfo.get("active_pet") != null && - petsInfo.get("active_pet").isJsonObject() + petsInfo.has("active_pet") && + petsInfo.get("active_pet") != null && + petsInfo.get("active_pet").isJsonObject() ) { JsonObject pet = petsInfo.get("active_pet").getAsJsonObject(); if ( pet.has("type") && - pet.get("type") != null && - pet.has("tier") && - pet.get("tier") != null && - pet.has("exp") && - pet.get("exp") != null + pet.get("type") != null && + pet.has("tier") && + pet.get("tier") != null && + pet.has("exp") && + pet.get("exp") != null ) { String petname = pet.get("type").getAsString(); String tier = pet.get("tier").getAsString(); @@ -484,8 +485,8 @@ public class PlayerStats { if ( pet.has("heldItem") && - !pet.get("heldItem").isJsonNull() && - pet.get("heldItem").getAsString().equals("PET_ITEM_TIER_BOOST") + !pet.get("heldItem").isJsonNull() && + pet.get("heldItem").getAsString().equals("PET_ITEM_TIER_BOOST") ) { tierNum = "" + (Integer.parseInt(tierNum) + 1); } @@ -601,8 +602,8 @@ public class PlayerStats { for (Map.Entry statEntry : stats.statsJson.entrySet()) { if ( statEntry.getKey().equals(CRIT_DAMAGE) || - statEntry.getKey().equals(INTELLIGENCE) || - statEntry.getKey().equals(BONUS_ATTACK_SPEED) + statEntry.getKey().equals(INTELLIGENCE) || + statEntry.getKey().equals(BONUS_ATTACK_SPEED) ) continue; stats.statsJson.add(statEntry.getKey(), new JsonPrimitive(Math.max(0, statEntry.getValue().getAsFloat()))); } @@ -662,7 +663,7 @@ public class PlayerStats { } Map accessories = JsonUtils.getJsonArrayAsStream(inventoryInfo.get("talisman_bag").getAsJsonArray()) - .map(o -> { + .map(o -> { try { return JsonToNBT.getTagFromJson(o.getAsJsonObject().get("nbttag").getAsString()); } catch (Exception ignored) { @@ -680,7 +681,7 @@ public class PlayerStats { tag.getCompoundTag("ExtraAttributes").getString("id"), Utils.getRarityFromLore(lastElementJsonArray) ); - }).sorted(Comparator.comparingInt(e -> -e.getValue())).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1,v2)->v1, LinkedHashMap::new)); + }).sorted(Comparator.comparingInt(e -> -e.getValue())).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2)->v1, LinkedHashMap::new)); Set ignoredTalismans = new HashSet<>(); int powderAmount = 0; @@ -742,9 +743,9 @@ public class PlayerStats { if ( profileInfo == null || - !profileInfo.has(abs) || - !profileInfo.get(abs).isJsonObject() || - !profileInfo.get(abs).getAsJsonObject().has("selected_power") + !profileInfo.has(abs) || + !profileInfo.get(abs).isJsonObject() || + !profileInfo.get(abs).getAsJsonObject().has("selected_power") ) { return null; } @@ -752,6 +753,38 @@ public class PlayerStats { return selectedPower.substring(0, 1).toUpperCase() + selectedPower.substring(1); } + public static @Nullable QuiverInfo getQuiverInfo(JsonObject inventoryInfo, JsonObject profileInfo) { + if (inventoryInfo == null + || !inventoryInfo.has("quiver") + || !inventoryInfo.get("quiver").isJsonArray()) { + return null; + } + QuiverInfo quiverInfo = new QuiverInfo(); + quiverInfo.arrows = new HashMap<>(); + + JsonArray quiver = inventoryInfo.getAsJsonArray("quiver"); + for (JsonElement quiverEntry : quiver) { + if (quiverEntry == null || quiverEntry.isJsonNull() || !quiverEntry.isJsonObject()) { + continue; + } + JsonObject stack = quiverEntry.getAsJsonObject(); + if (!stack.has("internalname") || !stack.has("count")) { + continue; + } + String internalName = stack.get("internalname").getAsString(); + int count = stack.get("count").getAsInt(); + + quiverInfo.arrows.computeIfPresent(internalName, (key, existing) -> existing + count); + quiverInfo.arrows.putIfAbsent(internalName, count); + } + + if (profileInfo.has("favorite_arrow")) { + quiverInfo.selectedArrow = profileInfo.get("favorite_arrow").getAsString(); + } + + return quiverInfo; + } + public static class Stats { JsonObject statsJson = new JsonObject(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/info/QuiverInfo.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/info/QuiverInfo.java new file mode 100644 index 00000000..b4d92325 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/info/QuiverInfo.java @@ -0,0 +1,62 @@ +/* + * 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.profileviewer.info; + +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import net.minecraft.util.EnumChatFormatting; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class QuiverInfo { + public String selectedArrow; + public Map arrows; + + public List generateProfileViewerTooltip() { + List list = new ArrayList<>(); + int totalCount = 0; + list.add(EnumChatFormatting.AQUA + "Quiver:"); + for (Map.Entry arrow : arrows.entrySet()) { + JsonObject repoInfo = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(arrow.getKey()); + if (repoInfo == null || repoInfo.isJsonNull()) { + continue; + } + list.add( + " " + repoInfo.get("displayname").getAsString() + EnumChatFormatting.RESET + ": " + EnumChatFormatting.GREEN + + EnumChatFormatting.BOLD + arrow.getValue()); + totalCount += arrow.getValue(); + } + + list.add(""); + list.add(EnumChatFormatting.AQUA + "Total: " + EnumChatFormatting.GREEN + EnumChatFormatting.BOLD + totalCount); + if (selectedArrow != null) { + JsonObject repoInfo = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(selectedArrow); + if (repoInfo == null) { + list.add(EnumChatFormatting.AQUA + "Selected Arrow: " + EnumChatFormatting.RED + "ERROR"); + } else { + list.add(EnumChatFormatting.AQUA + "Selected Arrow: " + repoInfo.get("displayname").getAsString()); + } + } + + return list; + } +} -- cgit From 445d0c69f3eb384aba032e3cf0e379bb53ea61df Mon Sep 17 00:00:00 2001 From: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> Date: Sat, 20 Aug 2022 09:21:21 +1000 Subject: Make be level show without island selected (#228) Co-authored-by: jani270 --- Update Notes/2.1.md | 14 +++++++++----- .../moulberry/notenoughupdates/NotEnoughUpdates.java | 4 ++-- .../notenoughupdates/miscfeatures/updater/AutoUpdater.java | 4 ++-- .../profileviewer/bestiary/BestiaryPage.java | 14 +++++++------- 4 files changed, 20 insertions(+), 16 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 774ce075..90ebbf87 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -16,7 +16,7 @@ - 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 -- Added a calculator (/neucalc help), that also works in the auction house / bazaar - nea89o +- Added a calculator (/neucalc help), that also works in the auction house / bazaar - nea89 - Added and fixed various things in the profile viewer: - [Added hotm tab](https://media.discordapp.net/attachments/659613194066722833/991115131507441724/unknown.png) - nopo - Big thanks to kwev1n for some math and jani for the texture @@ -27,7 +27,7 @@ - Added equipment - nopo - Added blaze slayer level and kills - nopo - Added social level - nopo - - Added various new collections and minions - nopo + - Added various new collections and minions - nopo & CrypticPlasma & hannibal2 - Added mastermode catacombs xp to level calculator - nopo - Added profile viewer settings to /neu - nopo - Added an unknown icon if neu doesn't recognize your profile type - nopo @@ -35,7 +35,8 @@ - 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 - Added senither and lily weight - CrypticPlasma - - Added info about the Quiver when hovering over the arrow in the inventory tab of /pv - Lulonaut + - Added the Quiver Info when hovering in inventory tab over Arrows display - Lulonaut + - Added the Magical Power Info when hovering in inventory tab over Accessory Bag display - Lulonaut ### **Minor Changes:** @@ -102,10 +103,12 @@ - Added Fishing Timer over bobber - nea89 - Added [Auction Profit Viewer Overlay](https://cdn.discordapp.com/attachments/848901833119629332/993191851400101918/176946124-28ddf336-1ec7-460b-b22a-5fe2733b46a3.png) - efefury - Added Trophy Reward Overlay - hannibal2 -- Add Auto-Updater (linux and scu only) - nea89 +- Add Auto-Updater (linux only) - nea89 - Added power stone feature - hannibal2 - Added abiphone warning - hannibal2 -- Added blur limit at 100 - nopo +- Added blur limit to map at 100 - nopo +- Added bazaar sacks profit feature - hannibal2 +- Added an option to disable etherwarp overlay when TP is denied - hannibal2 ### **Bug Fixes:** @@ -132,6 +135,7 @@ - Fixed some vanilla Minecraft keybinds not working in NEU GUIs - nopo - Fixed crash with spamming remove enchant in /neuec - nopo - Fixed missing enchants not working with shiny items - nopo +- Fixed golden dragon not working in pet overlay - CrypticPlasma ### **Other:** diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index d22b93f5..dd4c01af 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -112,8 +112,8 @@ import java.util.Set; public class NotEnoughUpdates { public static final String MODID = "notenoughupdates"; public static final String VERSION = "2.1.0-REL"; - public static final int VERSION_ID = 20000; - public static final int PRE_VERSION_ID = 1; + public static final int VERSION_ID = 20100; + public static final int PRE_VERSION_ID = 0; public static final int HOTFIX_VERSION_ID = 0; /** * Registers the biomes for the crystal hollows here so optifine knows they exists diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/AutoUpdater.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/AutoUpdater.java index 7869225d..e7ada16f 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/AutoUpdater.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/AutoUpdater.java @@ -179,8 +179,8 @@ public class AutoUpdater { public void displayUpdateMessageIfOutOfDate() { File repo = neu.manager.repoLocation; - if (repo.exists()) { - File updateJson = new File(repo, "update.json"); + File updateJson = new File(repo, "update.json"); + if (updateJson.exists()) { try { JsonObject o = neu.manager.getJsonFromFile(updateJson); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java index 7ca3e6a8..b37aa73f 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java @@ -112,6 +112,13 @@ public class BestiaryPage extends GuiProfileViewerPage { List mobs = BestiaryData.getBestiaryLocations().get(selectedBestiaryLocation); Color color = new Color(128, 128, 128, 255); + Utils.renderAlignedString( + EnumChatFormatting.RED + "Bestiary Level: ", + EnumChatFormatting.GRAY + "" + (float) getBestiaryTiers(profileInfo) / 10, + guiLeft + 220, + guiTop + 50, + 110 + ); if (mobs != null) { for (int i = 0; i < mobs.size(); i++) { String mob = mobs.get(i); @@ -218,13 +225,6 @@ public class BestiaryPage extends GuiProfileViewerPage { ); } } - Utils.renderAlignedString( - EnumChatFormatting.RED + "Bestiary Level: ", - EnumChatFormatting.GRAY + "" + (float) getBestiaryTiers(profileInfo) / 10, - guiLeft + 220, - guiTop + 50, - 110 - ); } } if (tooltipToDisplay != null) { -- cgit From c671d5c03fb5d0410645d8b6edc56adeda3d94a7 Mon Sep 17 00:00:00 2001 From: Roman / Linnea Gräf Date: Thu, 8 Sep 2022 14:12:03 +0200 Subject: Add item ids to Books in more places (#256) * Add item ids to Books in more places Add item ids to Enchanted Books in the Bazaar and in the Experimentation Table. Add ItemResolutionQuery as a new way to query items and item ids. Co-authored-by: romangraef * Update 2.1.md * Infer found a bug that already existed before. * add support for animated crab hats Co-authored-by: hannibal00212 <24389977+hannibal00212@users.noreply.github.com> Co-authored-by: nopo --- Update Notes/2.1.md | 1 + .../moulberry/notenoughupdates/NEUManager.java | 108 +++------- .../notenoughupdates/auction/APIManager.java | 1 + .../notenoughupdates/core/util/StringUtils.java | 8 + .../listener/ItemTooltipListener.java | 31 +-- .../miscfeatures/EnchantingSolvers.java | 4 +- .../notenoughupdates/util/ItemResolutionQuery.java | 239 +++++++++++++++++++++ .../moulberry/notenoughupdates/util/ItemUtils.java | 14 +- 8 files changed, 312 insertions(+), 94 deletions(-) create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/util/ItemResolutionQuery.java (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 90ebbf87..b5853248 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -109,6 +109,7 @@ - Added blur limit to map at 100 - nopo - Added bazaar sacks profit feature - hannibal2 - Added an option to disable etherwarp overlay when TP is denied - hannibal2 +- Added bazaar prices to enchants in the enchantment table - hannibal2 / nea89 ### **Bug Fixes:** diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java index 4e5c5b7d..35385f38 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java @@ -36,6 +36,8 @@ import io.github.moulberry.notenoughupdates.recipes.NeuRecipe; 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.ItemResolutionQuery; +import io.github.moulberry.notenoughupdates.util.ItemUtils; import io.github.moulberry.notenoughupdates.util.SBInfo; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; @@ -679,82 +681,18 @@ public class NEUManager { return null; } + /** + * Replaced with {@link #createItemResolutionQuery()} + */ + @Deprecated public String getInternalnameFromNBT(NBTTagCompound tag) { - String internalname = null; - if (tag != null && tag.hasKey("ExtraAttributes", 10)) { - NBTTagCompound ea = tag.getCompoundTag("ExtraAttributes"); - - if (ea.hasKey("id", 8)) { - internalname = ea.getString("id").replaceAll(":", "-"); - } else { - return null; - } - - if ("PET".equals(internalname)) { - String petInfo = ea.getString("petInfo"); - if (petInfo.length() > 0) { - JsonObject petInfoObject = gson.fromJson(petInfo, JsonObject.class); - internalname = petInfoObject.get("type").getAsString(); - String tier = petInfoObject.get("tier").getAsString(); - switch (tier) { - case "COMMON": - internalname += ";0"; - break; - case "UNCOMMON": - internalname += ";1"; - break; - case "RARE": - internalname += ";2"; - break; - case "EPIC": - internalname += ";3"; - break; - case "LEGENDARY": - internalname += ";4"; - break; - case "MYTHIC": - internalname += ";5"; - break; - } - } - } - if ("ENCHANTED_BOOK".equals(internalname) && ea.hasKey("enchantments", 10)) { - NBTTagCompound enchants = ea.getCompoundTag("enchantments"); - - for (String enchname : enchants.getKeySet()) { - internalname = enchname.toUpperCase() + ";" + enchants.getInteger(enchname); - break; - } - } - if ("RUNE".equals(internalname) && ea.hasKey("runes", 10)) { - NBTTagCompound rune = ea.getCompoundTag("runes"); - - for (String runename : rune.getKeySet()) { - internalname = runename.toUpperCase() + "_RUNE" + ";" + rune.getInteger(runename); - break; - } - } - if ("PARTY_HAT_CRAB".equals(internalname) && (ea.getString("party_hat_color") != null)) { - String crabhat = ea.getString("party_hat_color"); - internalname = "PARTY_HAT_CRAB" + "_" + crabhat.toUpperCase(); - } - } - - return internalname; + return createItemResolutionQuery() + .withItemNBT(tag) + .resolveInternalName(); } public String[] getLoreFromNBT(NBTTagCompound tag) { - String[] lore = new String[0]; - NBTTagCompound display = tag.getCompoundTag("display"); - - if (display.hasKey("Lore", 9)) { - NBTTagList list = display.getTagList("Lore", 8); - lore = new String[list.tagCount()]; - for (int k = 0; k < list.tagCount(); k++) { - lore[k] = list.getStringTagAt(k); - } - } - return lore; + return ItemUtils.getLore(tag).toArray(new String[0]); } public JsonObject getJsonFromNBT(NBTTagCompound tag) { @@ -914,10 +852,18 @@ public class NEUManager { return getSkullValueFromNBT(tag); } + public ItemResolutionQuery createItemResolutionQuery() { + return new ItemResolutionQuery(this); + } + + /** + * Replaced with {@link #createItemResolutionQuery()} + */ + @Deprecated public String getInternalNameForItem(ItemStack stack) { - if (stack == null) return null; - NBTTagCompound tag = stack.getTagCompound(); - return getInternalnameFromNBT(tag); + return createItemResolutionQuery() + .withItemStack(stack) + .resolveInternalName(); } public String getUUIDForItem(ItemStack stack) { @@ -1573,9 +1519,13 @@ public class NEUManager { return comp; } - public ItemStack createItem(String internalname) { - JsonObject jsonObject = itemMap.get(internalname); - if (jsonObject == null) return null; - return jsonToStack(jsonObject); + public ItemStack createItem(String internalName) { + return createItemResolutionQuery() + .withKnownInternalName(internalName) + .resolveToItemStack(); + } + + public boolean isValidInternalName(String internalName) { + return itemMap.containsKey(internalName); } } 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 c3999fb6..74ef2483 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/auction/APIManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/auction/APIManager.java @@ -168,6 +168,7 @@ public class APIManager { return stack; } else { JsonObject item = manager.getJsonFromNBT(item_tag); + if (item == null) return null; ItemStack stack = manager.jsonToStack(item, false); JsonObject itemDefault = manager.getItemInformation().get(item.get("internalname").getAsString()); 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 ecb4cd8b..6143085c 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 @@ -74,4 +74,12 @@ public class StringUtils { throw new RuntimeException(e); // UTF 8 should always be present } } + + /** + * taken and modified from https://stackoverflow.com/a/23326014/5507634 + */ + public static String replaceLast(String string, String toReplace, String replacement) { + int start = string.lastIndexOf(toReplace); + return string.substring(0, start) + replacement + string.substring(start + toReplace.length()); + } } 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 f3ed8e7c..e5c3324f 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java @@ -28,6 +28,7 @@ import com.mojang.authlib.minecraft.MinecraftProfileTexture; import io.github.moulberry.notenoughupdates.ItemPriceInformation; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.core.util.MiscUtils; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.miscfeatures.PetInfoOverlay; import io.github.moulberry.notenoughupdates.miscgui.GuiEnchantColour; import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; @@ -42,7 +43,6 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTUtil; import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.StringUtils; import net.minecraftforge.event.entity.player.ItemTooltipEvent; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.eventhandler.EventPriority; @@ -104,8 +104,13 @@ public class ItemTooltipListener { public void onItemTooltipLow(ItemTooltipEvent event) { if (!NotEnoughUpdates.INSTANCE.isOnSkyblock()) return; - String internalname = NotEnoughUpdates.INSTANCE.manager.getInternalNameForItem(event.itemStack); - if (internalname == null) { + String internalName = NotEnoughUpdates.INSTANCE.manager + .createItemResolutionQuery() + .withCurrentGuiContext() + .withItemStack(event.itemStack) + .resolveInternalName(); + + if (internalName == null) { return; } petToolTipXPExtendPetMenu(event); @@ -155,7 +160,8 @@ public class ItemTooltipListener { for (int j = 0; j < Utils.rarityArrC.length; j++) { for (Map.Entry entry : enchantsObj.entrySet()) { if (line.contains(Utils.rarityArrC[j] + " " + entry.getKey()) || line.contains( - Utils.rarityArrC[j] + " DUNGEON " + entry.getKey()) || line.contains("SHINY " + Utils.rarityArrC[j].replaceAll("§.§.","") + " DUNGEON " + entry.getKey())) { + Utils.rarityArrC[j] + " DUNGEON " + entry.getKey()) || line.contains( + "SHINY " + Utils.rarityArrC[j].replaceAll("§.§.", "") + " DUNGEON " + entry.getKey())) { allItemEnchs = entry.getValue().getAsJsonArray(); break out; } @@ -180,7 +186,7 @@ public class ItemTooltipListener { NotEnoughUpdates.INSTANCE.config.tooltipTweaks.showReforgeStats) { JsonObject reforgeStones = Constants.REFORGESTONES; - if (reforgeStones != null && reforgeStones.has(internalname)) { + if (reforgeStones != null && reforgeStones.has(internalName)) { boolean shift = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT); if (!pressedShiftLast && shift) { showReforgeStoneStats = !showReforgeStoneStats; @@ -195,7 +201,7 @@ public class ItemTooltipListener { newTooltip.add(EnumChatFormatting.DARK_GRAY + "[Press SHIFT to hide extra info]"); } - JsonObject reforgeInfo = reforgeStones.get(internalname).getAsJsonObject(); + JsonObject reforgeInfo = reforgeStones.get(internalName).getAsJsonObject(); JsonArray requiredRaritiesArray = reforgeInfo.get("requiredRarities").getAsJsonArray(); if (showReforgeStoneStats && requiredRaritiesArray.size() > 0) { @@ -526,7 +532,7 @@ public class ItemTooltipListener { newTooltip.add(""); newTooltip.add(EnumChatFormatting.GRAY + "[SHIFT for Price Info]"); } else { - ItemPriceInformation.addToTooltip(newTooltip, internalname, event.itemStack); + ItemPriceInformation.addToTooltip(newTooltip, internalName, event.itemStack); } } } @@ -583,9 +589,10 @@ public class ItemTooltipListener { JsonObject auctionInfo = neu.manager.auctionManager.getItemAuctionInfo(internal); if (auctionInfo != null) { if (auctionInfo.has("clean_price")) { - worth = (long)auctionInfo.get("clean_price").getAsDouble(); + worth = (long) auctionInfo.get("clean_price").getAsDouble(); } else { - worth = (long) (auctionInfo.get("price").getAsDouble() / auctionInfo.get("count").getAsDouble()); + worth = + (long) (auctionInfo.get("price").getAsDouble() / auctionInfo.get("count").getAsDouble()); } } break; @@ -703,7 +710,7 @@ public class ItemTooltipListener { event.toolTip.addAll(newTooltip); if (NotEnoughUpdates.INSTANCE.config.tooltipTweaks.showPriceInfoInvItem) { - ItemPriceInformation.addToTooltip(event.toolTip, internalname, event.itemStack); + ItemPriceInformation.addToTooltip(event.toolTip, internalName, event.itemStack); } if (event.itemStack.getTagCompound() != null && event.itemStack.getTagCompound().getBoolean("NEUHIDEPETTOOLTIP") && @@ -824,14 +831,14 @@ public class ItemTooltipListener { if (event.toolTip == null) return; if (event.toolTip.size() > 2 && NotEnoughUpdates.INSTANCE.config.tooltipTweaks.hideDefaultReforgeStats) { - String secondLine = StringUtils.stripControlCodes(event.toolTip.get(1)); + String secondLine = StringUtils.cleanColour(event.toolTip.get(1)); if (secondLine.equals("Reforge Stone")) { Integer startIndex = null; Integer cutoffIndex = null; //loop from the back of the List to find the wanted index sooner for (int i = event.toolTip.size() - 1; i >= 0; i--) { //rarity or mining level requirement - String line = StringUtils.stripControlCodes(event.toolTip.get(i)); + String line = StringUtils.cleanColour(event.toolTip.get(i)); if (line.contains("REFORGE STONE") || line.contains("Requires Mining Skill Level")) { cutoffIndex = i; } 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 6b541256..558917fe 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/EnchantingSolvers.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/EnchantingSolvers.java @@ -45,9 +45,9 @@ import java.util.List; import java.util.Map; public class EnchantingSolvers { - private static SolverType currentSolver = SolverType.NONE; + public static SolverType currentSolver = SolverType.NONE; - private enum SolverType { + public enum SolverType { NONE, CHRONOMATRON, ULTRASEQUENCER, diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/ItemResolutionQuery.java b/src/main/java/io/github/moulberry/notenoughupdates/util/ItemResolutionQuery.java new file mode 100644 index 00000000..1ff659ac --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/ItemResolutionQuery.java @@ -0,0 +1,239 @@ +/* + * 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.util; + +import com.google.common.collect.Iterables; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import io.github.moulberry.notenoughupdates.NEUManager; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +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.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +import javax.annotation.Nullable; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ItemResolutionQuery { + + private static final Pattern ENCHANTED_BOOK_NAME_PATTERN = Pattern.compile("^((?:§.)+)([^§]+) ([IVXL]+)$"); + private static final String EXTRA_ATTRIBUTES = "ExtraAttributes"; + private static final List PET_RARITIES = Arrays.asList( + "COMMON", + "UNCOMMON", + "RARE", + "EPIC", + "LEGENDARY", + "MYTHIC" + ); + private final NEUManager manager; + private NBTTagCompound compound; + private Item itemType; + private int stackSize = -1; + private Gui guiContext; + private String knownInternalName; + + public ItemResolutionQuery(NEUManager manager) { + this.manager = manager; + } + + public ItemResolutionQuery withItemNBT(NBTTagCompound compound) { + this.compound = compound; + return this; + } + + public ItemResolutionQuery withItemStack(ItemStack stack) { + if (stack == null) return this; + this.itemType = stack.getItem(); + this.compound = stack.getTagCompound(); + this.stackSize = stack.stackSize; + return this; + } + + public ItemResolutionQuery withGuiContext(Gui gui) { + this.guiContext = gui; + return this; + } + + public ItemResolutionQuery withCurrentGuiContext() { + this.guiContext = Minecraft.getMinecraft().currentScreen; + return this; + } + + public ItemResolutionQuery withKnownInternalName(String knownInternalName) { + this.knownInternalName = knownInternalName; + return this; + } + + @Nullable + public String resolveInternalName() { + if (knownInternalName != null) { + return knownInternalName; + } + String resolvedName = resolveFromSkyblock(); + if (resolvedName == null) { + resolvedName = resolveContextualName(); + } else { + switch (resolvedName.intern()) { + case "PET": + resolvedName = resolvePetName(); + break; + case "RUNE": + resolvedName = resolveRuneName(); + break; + case "ENCHANTED_BOOK": + resolvedName = resolveEnchantedBookNameFromNBT(); + break; + case "PARTY_HAT_CRAB": + case "PARTY_HAT_CRAB_ANIMATED": + resolvedName = resolveCrabHatName(); + break; + } + } + + return resolvedName; + } + + @Nullable + public JsonObject resolveToItemListJson() { + String internalName = resolveInternalName(); + if (internalName == null) { + return null; + } + return manager.getItemInformation().get(internalName); + } + + @Nullable + public ItemStack resolveToItemStack() { + JsonObject jsonObject = resolveToItemListJson(); + if (jsonObject == null) return null; + return manager.jsonToStack(jsonObject); + } + + // + private boolean isBazaar(IInventory chest) { + if (chest.getDisplayName().getFormattedText().startsWith("Bazaar ➜ ")) { + return true; + } + int bazaarSlot = chest.getSizeInventory() - 5; + if (bazaarSlot < 0) return false; + ItemStack stackInSlot = chest.getStackInSlot(bazaarSlot); + if (stackInSlot == null || stackInSlot.stackSize == 0) return false; + // NBT lore, we do not care about rendered lore + List lore = ItemUtils.getLore(stackInSlot); + return lore.contains("§7To Bazaar"); + } + + private String resolveContextualName() { + if (!(guiContext instanceof GuiChest)) { + return null; + } + GuiChest chest = (GuiChest) guiContext; + ContainerChest inventorySlots = (ContainerChest) chest.inventorySlots; + String guiName = inventorySlots.getLowerChestInventory().getDisplayName().getUnformattedText(); + boolean isOnBazaar = isBazaar(inventorySlots.getLowerChestInventory()); + String displayName = ItemUtils.getDisplayName(compound); + if (displayName == null) return null; + if (itemType == Items.enchanted_book && isOnBazaar && compound != null) { + return resolveEnchantmentByName(displayName); + } + if (displayName.endsWith("Enchanted Book") && guiName.startsWith("Superpairs")) { + for (String loreLine : ItemUtils.getLore(compound)) { + String enchantmentIdCandidate = resolveEnchantmentByName(loreLine); + if (enchantmentIdCandidate != null) return enchantmentIdCandidate; + } + return null; + } + return null; + } + + private String resolveEnchantmentByName(String name) { + Matcher matcher = ENCHANTED_BOOK_NAME_PATTERN.matcher(name); + if (!matcher.matches()) return null; + String format = matcher.group(1).toLowerCase(Locale.ROOT); + String enchantmentName = matcher.group(2).trim(); + String romanLevel = matcher.group(3); + boolean ultimate = (format.contains("§l")); + + return (ultimate ? "ULTIMATE_" : "") + + enchantmentName.replace(" ", "_").toUpperCase(Locale.ROOT) + + ";" + Utils.parseRomanNumeral(romanLevel); + } + + private String resolveCrabHatName() { + int crabHatYear = getExtraAttributes().getInteger("party_hat_year"); + String color = getExtraAttributes().getString("party_hat_color"); + return "PARTY_HAT_CRAB_" + color.toUpperCase(Locale.ROOT) + (crabHatYear == 2022 ? "_ANIMATED" : ""); + } + + private String resolveEnchantedBookNameFromNBT() { + NBTTagCompound enchantments = getExtraAttributes().getCompoundTag("enchantments"); + String enchantName = Iterables.getOnlyElement(enchantments.getKeySet(), null); + if (enchantName == null || enchantName.isEmpty()) return null; + return enchantName.toUpperCase(Locale.ROOT) + ";" + enchantments.getInteger(enchantName); + } + + private String resolveRuneName() { + NBTTagCompound runes = getExtraAttributes().getCompoundTag("runes"); + String runeName = Iterables.getOnlyElement(runes.getKeySet(), null); + if (runeName == null || runeName.isEmpty()) return null; + return runeName.toUpperCase(Locale.ROOT) + "_RUNE;" + runes.getInteger(runeName); + } + + private String resolvePetName() { + String petInfo = getExtraAttributes().getString("petInfo"); + if (petInfo == null || petInfo.isEmpty()) return null; + try { + JsonObject petInfoObject = manager.gson.fromJson(petInfo, JsonObject.class); + String petId = petInfoObject.get("type").getAsString(); + String petTier = petInfoObject.get("tier").getAsString(); + int rarityIndex = PET_RARITIES.indexOf(petTier); + return petId.toUpperCase(Locale.ROOT) + ";" + rarityIndex; + } catch (JsonParseException | ClassCastException ex) { + /* This happens if Hypixel changed the pet json format; + I still log this exception, since this case *is* exceptional and cannot easily be recovered from */ + ex.printStackTrace(); + return null; + } + } + + private NBTTagCompound getExtraAttributes() { + if (compound == null) return new NBTTagCompound(); + return compound.getCompoundTag(EXTRA_ATTRIBUTES); + } + + private String resolveFromSkyblock() { + String internalName = getExtraAttributes().getString("id"); + if (internalName == null || internalName.isEmpty()) return null; + return internalName.toUpperCase(Locale.ROOT); + } + + // + +} 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 3a2db0fb..cffdd164 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java @@ -73,7 +73,10 @@ public class ItemUtils { } public static List getLore(ItemStack is) { - NBTTagCompound tagCompound = is.getTagCompound(); + return getLore(is.getTagCompound()); + } + + public static List getLore(NBTTagCompound tagCompound) { if (tagCompound == null) { return Collections.emptyList(); } @@ -84,4 +87,13 @@ public class ItemUtils { } return list; } + + public static String getDisplayName(NBTTagCompound compound) { + if (compound == null) return null; + String string = compound.getCompoundTag("display").getString("Name"); + if (string == null || string.isEmpty()) + return null; + return string; + } + } -- cgit From d3805f080af87eb2bc7d2a2eac6c3f8db539324f Mon Sep 17 00:00:00 2001 From: hannibal2 <24389977+hannibal00212@users.noreply.github.com> Date: Thu, 8 Sep 2022 17:00:49 +0200 Subject: 0.14 - Finished :) (#233) Co-authored-by: nopo Co-authored-by: jani270 <69345714+jani270@users.noreply.github.com> Co-authored-by: Ascynx <78341107+Ascynx@users.noreply.github.com> Co-authored-by: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> Co-authored-by: Lulonaut --- Update Notes/2.1.md | 13 +- .../moulberry/notenoughupdates/NEUOverlay.java | 4 +- .../notenoughupdates/NotEnoughUpdates.java | 4 + .../notenoughupdates/auction/APIManager.java | 13 +- .../notenoughupdates/core/util/StringUtils.java | 20 + .../events/RepositoryReloadEvent.java | 2 +- .../notenoughupdates/listener/ChatListener.java | 4 +- .../listener/ItemTooltipEssenceShopListener.java | 84 +++ .../listener/ItemTooltipListener.java | 3 +- .../listener/ItemTooltipRngListener.java | 330 ++++++++++++ .../notenoughupdates/listener/RenderListener.java | 36 +- .../miscfeatures/AuctionProfit.java | 6 +- .../miscfeatures/BazaarSacksProfit.java | 9 +- .../miscfeatures/DamageCommas.java | 29 +- .../miscgui/AccessoryBagOverlay.java | 4 +- .../miscgui/TrophyRewardOverlay.java | 2 +- .../notenoughupdates/mixins/MixinGuiContainer.java | 2 +- .../notenoughupdates/mixins/MixinRenderItem.java | 6 +- .../mixins/MixinSkyclientCosmetics.java | 39 ++ .../notenoughupdates/options/NEUConfig.java | 10 + .../options/seperateSections/BazaarTweaks.java | 81 +++ .../options/seperateSections/Dungeons.java | 9 + .../options/seperateSections/Misc.java | 8 +- .../options/seperateSections/SkillOverlays.java | 9 +- .../options/seperateSections/TooltipTweaks.java | 40 +- .../overlays/AuctionSearchOverlay.java | 2 +- .../overlays/BazaarSearchOverlay.java | 572 +++++++++++++++++++++ .../overlays/CombatSkillOverlay.java | 82 ++- .../notenoughupdates/profileviewer/BasicPage.java | 5 +- .../profileviewer/CollectionsPage.java | 18 +- .../profileviewer/DungeonPage.java | 32 +- .../notenoughupdates/profileviewer/ExtraPage.java | 84 ++- .../profileviewer/GuiProfileViewer.java | 20 +- .../profileviewer/InventoriesPage.java | 108 ++-- .../notenoughupdates/profileviewer/MiningPage.java | 20 +- .../notenoughupdates/profileviewer/PetsPage.java | 24 +- .../profileviewer/bestiary/BestiaryPage.java | 18 +- .../notenoughupdates/util/Calculator.java | 2 + src/main/resources/mixins.notenoughupdates.json | 1 + 39 files changed, 1576 insertions(+), 179 deletions(-) create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipEssenceShopListener.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipRngListener.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinSkyclientCosmetics.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/BazaarTweaks.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/overlays/BazaarSearchOverlay.java (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index b5853248..050eaa93 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -37,6 +37,9 @@ - Added senither and lily weight - CrypticPlasma - Added the Quiver Info when hovering in inventory tab over Arrows display - Lulonaut - Added the Magical Power Info when hovering in inventory tab over Accessory Bag display - Lulonaut + - Added carpentry skill to skill average - hannibal2 + - Fixed sort order of fishing rods in profile viewer page - hannibal2 + - Changing sort logic from strength plus damage to bin price for best weapons in pv inventory page - hannibal2 ### **Minor Changes:** @@ -106,9 +109,13 @@ - Add Auto-Updater (linux only) - nea89 - Added power stone feature - hannibal2 - Added abiphone warning - hannibal2 -- Added blur limit to map at 100 - nopo +- Added blur limit at 100 - nopo - Added bazaar sacks profit feature - hannibal2 - Added an option to disable etherwarp overlay when TP is denied - hannibal2 +- Added bazaar search overlay - hannibal2 +- Added fraction display instead of percentage in slayer and dungeon RNG meter inventory - hannibal2 +- Added profit per score/XP to RNG meter - hannibal2 +- Added showing the amount of dungeon runs or slayer bosses needed for the rng meter to fill up - hannibal2 - Added bazaar prices to enchants in the enchantment table - hannibal2 / nea89 @@ -137,6 +144,9 @@ - Fixed crash with spamming remove enchant in /neuec - nopo - Fixed missing enchants not working with shiny items - nopo - Fixed golden dragon not working in pet overlay - CrypticPlasma +- Fixed shortened damage - nopo +- Fixed bazaar prices sorting order in neu item list - hannibal2 +- Fixed priceless items showing first in the missing tab of the accessory bag overlay - nopo ### **Other:** @@ -155,6 +165,7 @@ - NeucrystalHollowsJungle - NeucrystalHollowsMagmaFields - NeucrystalHollowsCrystalNucleus +- Disabled Skyclient cosmetics disabling neu map - nopo ### **Previous change log** diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java index 19f5a780..18be69e6 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java @@ -1265,8 +1265,8 @@ public class NEUOverlay extends Gui { String internal1 = o1.get("internalname").getAsString(); String internal2 = o2.get("internalname").getAsString(); - double cost1 = manager.auctionManager.getLowestBin(internal1); - double cost2 = manager.auctionManager.getLowestBin(internal2); + double cost1 = manager.auctionManager.getBazaarOrBin(internal1); + double cost2 = manager.auctionManager.getBazaarOrBin(internal2); if (cost1 < cost2) return mult; if (cost1 > cost2) return -mult; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index dd4c01af..6732336c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -29,7 +29,9 @@ 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.ItemTooltipEssenceShopListener; import io.github.moulberry.notenoughupdates.listener.ItemTooltipListener; +import io.github.moulberry.notenoughupdates.listener.ItemTooltipRngListener; import io.github.moulberry.notenoughupdates.listener.NEUEventListener; import io.github.moulberry.notenoughupdates.listener.OldAnimationChecker; import io.github.moulberry.notenoughupdates.listener.RenderListener; @@ -283,6 +285,8 @@ public class NotEnoughUpdates { MinecraftForge.EVENT_BUS.register(CustomBiomes.INSTANCE); MinecraftForge.EVENT_BUS.register(new ChatListener(this)); MinecraftForge.EVENT_BUS.register(new ItemTooltipListener(this)); + MinecraftForge.EVENT_BUS.register(new ItemTooltipRngListener(this)); + MinecraftForge.EVENT_BUS.register(new ItemTooltipEssenceShopListener(this)); MinecraftForge.EVENT_BUS.register(new RenderListener(this)); MinecraftForge.EVENT_BUS.register(new OldAnimationChecker()); MinecraftForge.EVENT_BUS.register(new SignCalculator()); 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 74ef2483..2dc02b7e 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/auction/APIManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/auction/APIManager.java @@ -807,9 +807,18 @@ public class APIManager { return keys; } - public JsonObject getBazaarInfo(String internalname) { + public double getBazaarOrBin(String internalName) { + JsonObject bazaarInfo = manager.auctionManager.getBazaarInfo(internalName); + if (bazaarInfo != null && bazaarInfo.get("curr_buy") != null) { + return bazaarInfo.get("curr_buy").getAsFloat(); + } else { + return manager.auctionManager.getLowestBin(internalName); + } + } + + public JsonObject getBazaarInfo(String internalName) { if (bazaarJson == null) return null; - JsonElement e = bazaarJson.get(internalname); + JsonElement e = bazaarJson.get(internalName); if (e == null) { return null; } 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 6143085c..a4f814d1 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 @@ -67,6 +67,26 @@ public class StringUtils { return Integer.parseInt(str); } + public static String shortNumberFormat(double n) { + return shortNumberFormat(n, 0); + } + + private static final char[] c = new char[] { 'k', 'm', 'b', 't' }; + + public static String shortNumberFormat(double n, int iteration) { + if (n < 1000) { + if (n % 1 == 0) { + return Integer.toString((int) n); + } else { + return String.format("%.2f", n); + } + } + + double d = ((long) n / 100) / 10.0; + boolean isRound = (d * 10) % 10 == 0; + return d < 1000 ? (isRound || d > 9.99 ? (int) d * 10 / 10 : d + "") + "" + c[iteration] : shortNumberFormat(d, iteration + 1); + } + public static String urlEncode(String something) { try { return URLEncoder.encode(something, StandardCharsets.UTF_8.name()); 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 bf6448a2..ab650c54 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/events/RepositoryReloadEvent.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/events/RepositoryReloadEvent.java @@ -23,7 +23,7 @@ import java.io.File; public class RepositoryReloadEvent extends NEUEvent { private final File baseFile; - private boolean isFirstLoad; + private final boolean isFirstLoad; public RepositoryReloadEvent(File baseFile, boolean isFirstLoad) { this.baseFile = baseFile; 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 5bd47f3a..b59eaf17 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ChatListener.java @@ -198,8 +198,8 @@ public class ChatListener { timeSinceLastBoss2 = timeSinceLastBoss; timeSinceLastBoss = System.currentTimeMillis(); } - } else if (unformatted.startsWith(" RNGesus Meter:")) { - RNGMeter = unformatted.substring(" RNGesus Meter: -------------------- ".length()); + } else if (unformatted.startsWith(" RNG Meter")) { + RNGMeter = unformatted.substring(" RNG Meter - ".length()); } else if (matcher.matches()) { //matcher.group(1); SlayerOverlay.slayerLVL = matcher.group(2); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipEssenceShopListener.java b/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipEssenceShopListener.java new file mode 100644 index 00000000..4b380c2f --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipEssenceShopListener.java @@ -0,0 +1,84 @@ +/* + * 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; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; +import io.github.moulberry.notenoughupdates.util.Utils; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ItemTooltipEssenceShopListener { + private final NotEnoughUpdates neu; + + private final Pattern ESSENCE_PATTERN = Pattern.compile("§5§o§d([\\d,]+) (.+) Essence"); + + public ItemTooltipEssenceShopListener(NotEnoughUpdates neu) { + this.neu = neu; + } + + @SubscribeEvent + public void onItemTooltip(ItemTooltipEvent event) { + if (!neu.isOnSkyblock()) return; + if (event.toolTip == null) return; + if (!Utils.getOpenChestName().endsWith(" Essence Shop")) return; + if (!NotEnoughUpdates.INSTANCE.config.tooltipTweaks.essencePriceInEssenceShop) return; + + List newToolTip = new ArrayList<>(); + boolean next = false; + for (String line : event.toolTip) { + + if (next) { + next = false; + Matcher matcher = ESSENCE_PATTERN.matcher(line); + if (matcher.matches()) { + String rawNumber = matcher.group(1).replace(",", ""); + int amount = Integer.parseInt(rawNumber); + String type = matcher.group(2); + + String essenceName = "ESSENCE_" + type.toUpperCase(); + JsonObject bazaarInfo = neu.manager.auctionManager.getBazaarInfo(essenceName); + + if (bazaarInfo != null && bazaarInfo.has("curr_sell")) { + float bazaarPrice = bazaarInfo.get("curr_sell").getAsFloat(); + double price = bazaarPrice * amount; + String format = StringUtils.shortNumberFormat(price); + newToolTip.add(line + " §7(§6" + format + " coins§7)"); + continue; + } + } + } + + if (line.contains("Cost")) { + next = true; + } + newToolTip.add(line); + } + + event.toolTip.clear(); + event.toolTip.addAll(newToolTip); + } +} 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 e5c3324f..3936ad74 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java @@ -266,8 +266,7 @@ public class ItemTooltipListener { newTooltip.add(""); } - newTooltip.add(EnumChatFormatting.BLUE + "Stats for " + rarityFormatted + - "\u00a79: [\u00a7l\u00a7m< \u00a79Switch\u00a7l\u27a1\u00a79]"); + newTooltip.add(EnumChatFormatting.BLUE + "Stats for " + rarityFormatted + "§9: [§l§m< §9Switch§l➡§9]"); if (statsE != null && statsE.isJsonObject()) { JsonObject stats = statsE.getAsJsonObject(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipRngListener.java b/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipRngListener.java new file mode 100644 index 00000000..bbbb9049 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipRngListener.java @@ -0,0 +1,330 @@ +/* + * 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.JsonElement; +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; +import io.github.moulberry.notenoughupdates.events.RepositoryReloadEvent; +import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; +import io.github.moulberry.notenoughupdates.util.Calculator; +import io.github.moulberry.notenoughupdates.util.Constants; +import io.github.moulberry.notenoughupdates.util.Utils; +import net.minecraft.item.ItemStack; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import org.lwjgl.input.Keyboard; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ItemTooltipRngListener { + private final NotEnoughUpdates neu; + private boolean showSlayerRngFractions = false; + private boolean pressedShiftLast = false; + private int currentSelected = 0; + private boolean pressedArrowLast = false; + private boolean repoReloadNeeded = true; + + private final Pattern ODDS_PATTERN = Pattern.compile("§5§o§7Odds: (.+) §7\\(§7(.*)%\\)"); + private final Pattern ODDS_SELECTED_PATTERN = Pattern.compile("§5§o§7Odds: (.+) §7\\(§8§m(.*)%§r §7(.+)%\\)"); + + private final Pattern RUNS_PATTERN = Pattern.compile("§5§o§7(Dungeon Score|Slayer XP): §d(.*)§5/§d(.+)"); + private final Pattern RUNS_SELECTED_PATTERN = Pattern.compile("§5§o§d-(.+)- §d(.*)§5/§d(.+)"); + + private final Pattern SLAYER_INVENTORY_TITLE_PATTERN = Pattern.compile("(.+) RNG Meter"); + + private final Map dungeonData = new LinkedHashMap<>(); + private final Map> slayerData = new LinkedHashMap<>(); + + public ItemTooltipRngListener(NotEnoughUpdates neu) { + this.neu = neu; + } + + @SubscribeEvent + public void onItemTooltip(ItemTooltipEvent event) { + if (!neu.isOnSkyblock()) return; + if (event.toolTip == null) return; + if (!Utils.getOpenChestName().endsWith(" RNG Meter") && !slayerData.containsKey(Utils.getOpenChestName())) return; + + List newToolTip = new ArrayList<>(); + + boolean nextLineProgress = false; + for (String line : event.toolTip) { + + if (line.contains("Odds:")) { + if (NotEnoughUpdates.INSTANCE.config.tooltipTweaks.rngMeterFractionDisplay) { + fractionDisplay(newToolTip, line); + continue; + } + } + + if (nextLineProgress || line.contains("Dungeon Score:") || line.contains("Slayer XP:")) { + Matcher matcher = RUNS_PATTERN.matcher(line); + Matcher matcherSelected = RUNS_SELECTED_PATTERN.matcher(line); + Matcher m = null; + if (matcher.matches()) { + m = matcher; + } else if (matcherSelected.matches()) { + m = matcherSelected; + } + + if (m != null) { + int having; + try { + having = Calculator.calculate(m.group(2).replace(",", "")).intValue(); + } catch (Calculator.CalculatorException e) { + having = -1; + } + + int needed; + try { + needed = Calculator.calculate(m.group(3).replace(",", "")).intValue(); + } catch (Calculator.CalculatorException e) { + needed = -1; + } + if (NotEnoughUpdates.INSTANCE.config.tooltipTweaks.rngMeterRunsNeeded) { + runsRequired(newToolTip, having, needed, nextLineProgress, event.itemStack); + } + + if (NotEnoughUpdates.INSTANCE.config.tooltipTweaks.rngMeterProfitPerUnit) { + if (!NotEnoughUpdates.INSTANCE.config.tooltipTweaks.rngMeterRunsNeeded) { + String name = Utils.getOpenChestName().contains("Catacombs") ? "Score" : "XP"; + String formatCoinsPer = getFormatCoinsPer(event.itemStack, needed, 1, name); + if (formatCoinsPer != null) { + newToolTip.add(line); + newToolTip.add(formatCoinsPer); + continue; + } + } + } + } + nextLineProgress = false; + } + + if (line.contains("Progress:")) { + nextLineProgress = true; + } + newToolTip.add(line); + } + + event.toolTip.clear(); + event.toolTip.addAll(newToolTip); + } + + private String getFormatCoinsPer(ItemStack stack, int needed, int multiplier, String name) { + String internalName = neu.manager.getInternalNameForItem(stack); + double bin = neu.manager.auctionManager.getBazaarOrBin(internalName); + if (bin <= 0) return null; + + double coinsPer = (bin / needed) * multiplier; + String format = StringUtils.shortNumberFormat(coinsPer); + return "§7Coins per " + name + ": §6" + format + " coins"; + } + + private void fractionDisplay(List newToolTip, String line) { + boolean shift = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT); + if (!pressedShiftLast && shift) { + showSlayerRngFractions = !showSlayerRngFractions; + } + pressedShiftLast = shift; + + String result; + Matcher matcher = ODDS_PATTERN.matcher(line); + Matcher matcherSelected = ODDS_SELECTED_PATTERN.matcher(line); + if (matcher.matches()) { + String odds = matcher.group(1); + int baseChance = calculateChance(matcher.group(2)); + String baseFormat = GuiProfileViewer.numberFormat.format(baseChance); + + String fractionFormat = "§7(1/" + baseFormat + ")"; + result = odds + " " + fractionFormat; + } else if (matcherSelected.matches()) { + String odds = matcherSelected.group(1); + int baseChance = calculateChance(matcherSelected.group(2)); + String baseFormat = GuiProfileViewer.numberFormat.format(baseChance); + + int increasedChance = calculateChance(matcherSelected.group(3)); + String increased = GuiProfileViewer.numberFormat.format(increasedChance); + String fractionFormat = "§7(§8§m1/" + baseFormat + "§r §71/" + increased + ")"; + + result = odds + " " + fractionFormat; + } else { + return; + } + + if (showSlayerRngFractions) { + newToolTip.add("§7Odds: " + result); + newToolTip.add("§8[Press SHIFT to show odds as percentages]"); + } else { + newToolTip.add(line); + newToolTip.add("§8[Press SHIFT to show odds as fractions]"); + } + } + + /** + * This adds support for the /neureloadrepo command + */ + @SubscribeEvent(priority = EventPriority.LOWEST) + public void onRepoReload(RepositoryReloadEvent event) { + repoReloadNeeded = true; + } + + public void checkUpdateData() { + if (repoReloadNeeded) { + updateRepoData(); + } + } + + private void updateRepoData() { + slayerData.clear(); + dungeonData.clear(); + + JsonObject leveling = Constants.LEVELING; + if (!leveling.has("slayer_boss_xp") || + !leveling.has("slayer_highest_tier") || + !leveling.has("slayer_tier_colors") || + !leveling.has("rng_meter_dungeon_score")) { + Utils.showOutdatedRepoNotification(); + return; + } + + List slayerExp = new ArrayList<>(); + for (JsonElement element : leveling.get("slayer_boss_xp").getAsJsonArray()) { + slayerExp.add(element.getAsInt()); + } + + List slayerColors = new ArrayList<>(); + for (JsonElement element : leveling.get("slayer_tier_colors").getAsJsonArray()) { + slayerColors.add(element.getAsString()); + } + + for (Map.Entry entry : leveling.get("slayer_highest_tier").getAsJsonObject().entrySet()) { + String slayerName = entry.getKey(); + int maxTier = entry.getValue().getAsInt(); + LinkedHashMap singleSlayerData = new LinkedHashMap<>(); + for (int i = 0; i < maxTier; i++) { + String name = slayerColors.get(i) + "Tier " + (i + 1); + singleSlayerData.put(name, slayerExp.get(i)); + } + slayerData.put(slayerName, singleSlayerData); + } + + for (Map.Entry entry : leveling.get("rng_meter_dungeon_score").getAsJsonObject().entrySet()) { + String dungeonScore = entry.getKey(); + int score = entry.getValue().getAsInt(); + dungeonData.put(dungeonScore, score); + } + + repoReloadNeeded = false; + } + + private void runsRequired( + List toolTip, + int having, + int needed, + boolean nextLineProgress, + ItemStack stack + ) { + checkUpdateData(); + if (repoReloadNeeded) return; + + String openChestName = Utils.getOpenChestName(); + Map runsData; + String labelPlural; + String labelSingular; + if (openChestName.contains("Catacombs")) { + runsData = dungeonData; + labelPlural = "Runs"; + labelSingular = "Run"; + } else { // Slayer + Matcher matcher = SLAYER_INVENTORY_TITLE_PATTERN.matcher(openChestName); + if (!matcher.matches()) { + //Happens for the first 4-5 ticks after inventory opens. Thanks hypixel + return; + } + + String slayerName = matcher.group(1); + runsData = slayerData.get(slayerName); + labelPlural = "Bosses"; + labelSingular = "Boss"; + } + + handleArrowKeys(runsData); + + if (currentSelected >= runsData.keySet().size()) { + currentSelected = 0; + } + + String name = (String) runsData.keySet().toArray()[currentSelected]; + int gainPerRun = runsData.get(name); + + int runsNeeded = needed / gainPerRun; + int runsHaving = having / gainPerRun; + String runsNeededFormat = GuiProfileViewer.numberFormat.format(runsNeeded); + String runsHavingFormat = GuiProfileViewer.numberFormat.format(runsHaving); + + String progressString = null; + if (nextLineProgress) { + progressString = toolTip.remove(toolTip.size() - 1); + } + + toolTip.add("§9Stats for " + name + "§9: [§l§m< §9Switch§l➡§9]"); + toolTip.add( + " §7" + labelPlural + " completed: §e" + runsHavingFormat + " §7(of §e" + runsNeededFormat + " §7needed)"); + + if (NotEnoughUpdates.INSTANCE.config.tooltipTweaks.rngMeterProfitPerUnit) { + String formatCoinsPer = getFormatCoinsPer(stack, needed, gainPerRun, labelSingular); + if (formatCoinsPer != null) { + toolTip.add(" " + formatCoinsPer); + } + } + + toolTip.add(" "); + if (progressString != null) { + toolTip.add(progressString); + } + } + + private void handleArrowKeys(Map runsData) { + boolean left = Keyboard.isKeyDown(Keyboard.KEY_LEFT); + boolean right = Keyboard.isKeyDown(Keyboard.KEY_RIGHT); + if (!pressedArrowLast && (left || right)) { + if (Utils.getOpenChestName().contains("Catacombs") ? right : left) { + currentSelected--; + } else { + currentSelected++; + } + if (currentSelected < 0) currentSelected = 0; + if (currentSelected >= runsData.size()) currentSelected = runsData.size() - 1; + } + pressedArrowLast = left || right; + } + + private int calculateChance(String string) { + return (int) (100.0 / Double.parseDouble(string)); + } +} 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 54b647e9..166e46d0 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java @@ -53,6 +53,7 @@ import io.github.moulberry.notenoughupdates.miscgui.TrophyRewardOverlay; 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.BazaarSearchOverlay; import io.github.moulberry.notenoughupdates.overlays.OverlayManager; import io.github.moulberry.notenoughupdates.overlays.RancherBootOverlay; import io.github.moulberry.notenoughupdates.overlays.TextOverlay; @@ -119,6 +120,8 @@ import java.util.TreeMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; import static io.github.moulberry.notenoughupdates.util.GuiTextures.dungeon_chest_worth; @@ -146,6 +149,8 @@ public class RenderListener { private boolean inDungeonPage = false; private final NumberFormat format = new DecimalFormat("#,##0.#", new DecimalFormatSymbols(Locale.US)); + private final Pattern ESSENCE_PATTERN = Pattern.compile("§d(.+) Essence §8x([\\d,]+)"); + public RenderListener(NotEnoughUpdates neu) { this.neu = neu; } @@ -420,6 +425,11 @@ public class RenderListener { event.setCanceled(true); return; } + if (BazaarSearchOverlay.shouldReplace()) { + BazaarSearchOverlay.render(); + event.setCanceled(true); + return; + } if (RancherBootOverlay.shouldReplace()) { RancherBootOverlay.render(); event.setCanceled(true); @@ -736,7 +746,7 @@ public class RenderListener { StringBuilder cost = new StringBuilder(); for (int i = 0; i < line6.length(); i++) { char c = line6.charAt(i); - if ("0123456789".indexOf(c) >= 0) { + if (Character.isDigit(c)) { cost.append(c); } } @@ -752,6 +762,20 @@ public class RenderListener { for (int i = 0; i < 5; i++) { ItemStack item = lower.getStackInSlot(11 + i); String internal = neu.manager.getInternalNameForItem(item); + String displayName = item.getDisplayName(); + Matcher matcher = ESSENCE_PATTERN.matcher(displayName); + if (neu.config.dungeons.useEssenceCostFromBazaar && matcher.matches()) { + String type = matcher.group(1).toUpperCase(); + JsonObject bazaarInfo = neu.manager.auctionManager.getBazaarInfo("ESSENCE_" + type); + if (bazaarInfo != null && bazaarInfo.has("curr_sell")) { + float bazaarPrice = bazaarInfo.get("curr_sell").getAsFloat(); + int amount = Integer.parseInt(matcher.group(2)); + double price = bazaarPrice * amount; + itemValues.put(displayName, price); + totalValue += price; + } + continue; + } if (internal != null) { internal = internal.replace("\u00CD", "I").replace("\u0130", "I"); float bazaarPrice = -1; @@ -986,6 +1010,11 @@ public class RenderListener { event.setCanceled(true); return; } + if (BazaarSearchOverlay.shouldReplace()) { + BazaarSearchOverlay.mouseEvent(); + event.setCanceled(true); + return; + } if (RancherBootOverlay.shouldReplace()) { RancherBootOverlay.mouseEvent(); event.setCanceled(true); @@ -1466,6 +1495,11 @@ public class RenderListener { event.setCanceled(true); return; } + if (BazaarSearchOverlay.shouldReplace()) { + BazaarSearchOverlay.keyEvent(); + event.setCanceled(true); + return; + } if (RancherBootOverlay.shouldReplace()) { RancherBootOverlay.keyEvent(); event.setCanceled(true); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionProfit.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionProfit.java index e1024eab..88ca0cc8 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionProfit.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/AuctionProfit.java @@ -20,8 +20,8 @@ package io.github.moulberry.notenoughupdates.miscfeatures; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.mixins.AccessorGuiContainer; -import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; @@ -145,10 +145,10 @@ public class AuctionProfit { String coinsToCollectStr = EnumChatFormatting.BOLD + EnumChatFormatting.DARK_GRAY.toString() + "Coins to collect: " + EnumChatFormatting.RESET + EnumChatFormatting.DARK_GREEN + "" + - GuiProfileViewer.shortNumberFormat(coinsToCollect, 0); + StringUtils.shortNumberFormat(coinsToCollect); String valueIfSoldStr = EnumChatFormatting.BOLD + EnumChatFormatting.DARK_GRAY.toString() + "Value if all sold: " + EnumChatFormatting.RESET + EnumChatFormatting.DARK_GREEN + "" + - GuiProfileViewer.shortNumberFormat(coinsIfAllSold, 0); + StringUtils.shortNumberFormat(coinsIfAllSold); fontRendererObj.drawString(coinsToCollectStr, a + 6, guiTop + 32, -1, false); fontRendererObj.drawString(valueIfSoldStr, a + 6, guiTop + 42, -1, false); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/BazaarSacksProfit.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/BazaarSacksProfit.java index 084fd03f..7007f39b 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/BazaarSacksProfit.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/BazaarSacksProfit.java @@ -68,7 +68,7 @@ public class BazaarSacksProfit { @SubscribeEvent(priority = EventPriority.LOW) public void onItemTooltipLow(ItemTooltipEvent event) { - if (!NotEnoughUpdates.INSTANCE.config.tooltipTweaks.bazaarSacksProfit) return; + if (!NotEnoughUpdates.INSTANCE.config.bazaarTweaks.bazaarSacksProfit) return; if (!inBazaar()) return; ItemStack itemStack = event.itemStack; @@ -89,6 +89,11 @@ public class BazaarSacksProfit { out: for (String line : ItemUtils.getLore(itemStack)) { + + if (line.equals("§8Loading...")) { + dirty = true; + return; + } if (line.contains("§7x ")) { String[] split = line.split("§7x "); String rawAmount = StringUtils.cleanColour(split[0]).replace(",", "").substring(1); @@ -108,7 +113,7 @@ public class BazaarSacksProfit { } } } - System.out.println("no bazaar item in repo found for '" + bazaarName + "'"); + System.err.println("no bazaar item in repo found for '" + bazaarName + "'"); invalidNames.add(bazaarName); } } 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 127edcde..b1ab11c1 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/DamageCommas.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/DamageCommas.java @@ -45,15 +45,18 @@ public class DamageCommas { }; private static final char STAR = '\u2727'; + private static final char OVERLOAD_STAR = '\u272F'; private static final Pattern PATTERN_CRIT = Pattern.compile( - "\u00a7f" + STAR + "((?:\u00a7.\\d)+)\u00a7." + STAR + "(.*)"); - private static final Pattern PATTERN_NO_CRIT = Pattern.compile("\u00a77(\\d+)(.*)"); + "\u00a7f" + STAR + "((?:\u00a7.\\d(?:§.,)?)+)\u00a7." + STAR + "(.*)"); + private static final Pattern PATTERN_NO_CRIT = Pattern.compile("(\u00a7.)([\\d+,]*)(.*)"); + private static final Pattern OVERLOAD_PATTERN = Pattern.compile("(\u00a7.)" + OVERLOAD_STAR + "((?:\u00a7.[\\d,])+)(\u00a7.)" + OVERLOAD_STAR + "\u00a7r"); public static IChatComponent replaceName(EntityLivingBase entity) { if (!entity.hasCustomName()) return entity.getDisplayName(); IChatComponent name = entity.getDisplayName(); - if (NotEnoughUpdates.INSTANCE.config.misc.damageIndicatorStyle == 0) return name; + if (!NotEnoughUpdates.INSTANCE.config.misc.damageIndicatorStyle2) return name; + if (!NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard()) return name; if (replacementMap.containsKey(entity)) { ChatComponentText component = replacementMap.get(entity); @@ -69,17 +72,23 @@ public class DamageCommas { String suffix; Matcher matcherCrit = PATTERN_CRIT.matcher(formatted); + Matcher matcherOverload = OVERLOAD_PATTERN.matcher(formatted); if (matcherCrit.matches()) { crit = true; - numbers = StringUtils.cleanColour(matcherCrit.group(1)); + numbers = StringUtils.cleanColour(matcherCrit.group(1)).replace(",", ""); prefix = "\u00a7f" + STAR; suffix = "\u00a7f" + STAR + matcherCrit.group(2); - } else { + } else if (matcherOverload.matches()) { + crit = true; + numbers = StringUtils.cleanColour(matcherOverload.group(2)).replace(",", ""); + prefix = matcherOverload.group(1) + OVERLOAD_STAR; + suffix = matcherOverload.group(3) + OVERLOAD_STAR + "\u00a7r"; + } else { Matcher matcherNoCrit = PATTERN_NO_CRIT.matcher(formatted); if (matcherNoCrit.matches()) { - numbers = matcherNoCrit.group(1); - prefix = "\u00A77"; - suffix = "\u00A7r" + matcherNoCrit.group(2); + numbers = matcherNoCrit.group(2).replace(",", ""); + prefix = matcherNoCrit.group(1); + suffix = "\u00A7r" + matcherNoCrit.group(3); } else { replacementMap.put(entity, null); return name; @@ -91,10 +100,10 @@ public class DamageCommas { try { int number = Integer.parseInt(numbers); - if (number > 999 && NotEnoughUpdates.INSTANCE.config.misc.damageIndicatorStyle == 2) { + if (number > 999) { newFormatted.append(Utils.shortNumberFormat(number, 0)); } else { - newFormatted.append(NumberFormat.getIntegerInstance().format(number)); + return name; } } catch (NumberFormatException e) { replacementMap.put(entity, null); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/AccessoryBagOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/AccessoryBagOverlay.java index b6c3e763..530dcfd1 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/AccessoryBagOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/AccessoryBagOverlay.java @@ -847,7 +847,7 @@ public class AccessoryBagOverlay { if (info != null) cost1 = info.craftCost; else - cost1 = 0; + cost1 = -1; } double cost2; JsonObject o2Auc = NotEnoughUpdates.INSTANCE.manager.auctionManager.getItemAuctionInfo(o2); @@ -858,7 +858,7 @@ public class AccessoryBagOverlay { if (info != null) cost2 = info.craftCost; else - cost2 = 0; + cost2 = -1; } if (cost1 == -1 && cost2 == -1) return o1.compareTo(o2); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TrophyRewardOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TrophyRewardOverlay.java index 2b600d2e..e6c4dc74 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TrophyRewardOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TrophyRewardOverlay.java @@ -70,7 +70,7 @@ public class TrophyRewardOverlay { * This adds support for the /neureloadrepo command */ @SubscribeEvent(priority = EventPriority.LOWEST) - public void reload(RepositoryReloadEvent event) { + public void onRepoReload(RepositoryReloadEvent event) { reloadNeeded = true; } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java index 06512fa8..7c3414fa 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java @@ -125,7 +125,7 @@ public abstract class MixinGuiContainer extends GuiScreen { else if (!($this instanceof GuiChest)) BetterContainers.profileViewerStackIndex = -1; - if (slot.getStack() == null && NotEnoughUpdates.INSTANCE.overlay.searchMode && RenderListener.drawingGuiScreen) { + if (slot.getStack() == null && NotEnoughUpdates.INSTANCE.overlay.searchMode && RenderListener.drawingGuiScreen && NotEnoughUpdates.INSTANCE.isOnSkyblock()) { GlStateManager.pushMatrix(); GlStateManager.translate(0, 0, 100 + Minecraft.getMinecraft().getRenderItem().zLevel); GlStateManager.depthMask(false); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderItem.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderItem.java index 4f193c98..dc59c0bb 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderItem.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderItem.java @@ -195,7 +195,7 @@ public abstract class MixinRenderItem { @Inject(method = "renderItemIntoGUI", at = @At("HEAD")) public void renderItemHead(ItemStack stack, int x, int y, CallbackInfo ci) { - if (NotEnoughUpdates.INSTANCE.overlay.searchMode && RenderListener.drawingGuiScreen) { + if (NotEnoughUpdates.INSTANCE.overlay.searchMode && RenderListener.drawingGuiScreen && NotEnoughUpdates.INSTANCE.isOnSkyblock()) { boolean matches = false; GuiTextField textField = NotEnoughUpdates.INSTANCE.overlay.getTextField(); @@ -221,7 +221,7 @@ public abstract class MixinRenderItem { @Inject(method = "renderItemIntoGUI", at = @At("RETURN")) public void renderItemReturn(ItemStack stack, int x, int y, CallbackInfo ci) { if (stack != null && stack.stackSize != 1) return; - if (NotEnoughUpdates.INSTANCE.overlay.searchMode && RenderListener.drawingGuiScreen) { + if (NotEnoughUpdates.INSTANCE.overlay.searchMode && RenderListener.drawingGuiScreen && NotEnoughUpdates.INSTANCE.isOnSkyblock()) { boolean matches = false; GuiTextField textField = NotEnoughUpdates.INSTANCE.overlay.getTextField(); @@ -252,7 +252,7 @@ public abstract class MixinRenderItem { CallbackInfo ci ) { if (stack != null && stack.stackSize != 1) { - if (NotEnoughUpdates.INSTANCE.overlay.searchMode && RenderListener.drawingGuiScreen) { + if (NotEnoughUpdates.INSTANCE.overlay.searchMode && RenderListener.drawingGuiScreen && NotEnoughUpdates.INSTANCE.isOnSkyblock()) { boolean matches = false; GuiTextField textField = NotEnoughUpdates.INSTANCE.overlay.getTextField(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinSkyclientCosmetics.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinSkyclientCosmetics.java new file mode 100644 index 00000000..32c9f418 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinSkyclientCosmetics.java @@ -0,0 +1,39 @@ +/* + * 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.mixins; + +import net.minecraftforge.event.world.WorldEvent; +import org.spongepowered.asm.mixin.Dynamic; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Pseudo +@Mixin(targets = "co.skyclient.scc.SkyclientCosmetics") +public class MixinSkyclientCosmetics { + + @Dynamic + @Inject(method = "onWorldLoad", at = @At("HEAD"), cancellable = true, remap = false) + public void onWorldLoad(WorldEvent.Load event, CallbackInfo ci) { + ci.cancel(); + } +} 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 ade9edfe..4d04bfbc 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java @@ -37,6 +37,7 @@ import io.github.moulberry.notenoughupdates.options.seperateSections.AHGraph; import io.github.moulberry.notenoughupdates.options.seperateSections.AHTweaks; import io.github.moulberry.notenoughupdates.options.seperateSections.AccessoryBag; import io.github.moulberry.notenoughupdates.options.seperateSections.ApiData; +import io.github.moulberry.notenoughupdates.options.seperateSections.BazaarTweaks; import io.github.moulberry.notenoughupdates.options.seperateSections.Calendar; import io.github.moulberry.notenoughupdates.options.seperateSections.CustomArmour; import io.github.moulberry.notenoughupdates.options.seperateSections.DungeonMapConfig; @@ -369,6 +370,13 @@ public class NEUConfig extends Config { ) public AHTweaks ahTweaks = new AHTweaks(); + @Expose + @Category( + name = "Bazaar Tweaks", + desc = "Tweaks for the Bazaar" + ) + public BazaarTweaks bazaarTweaks = new BazaarTweaks(); + @Expose @Category( name = "AH/BZ Graph", @@ -445,6 +453,8 @@ public class NEUConfig extends Config { @Expose public ArrayList previousAuctionSearches = new ArrayList<>(); @Expose + public ArrayList previousBazaarSearches = new ArrayList<>(); + @Expose public ArrayList eventFavourites = new ArrayList<>(); @Expose public ArrayList quickCommands = createDefaultQuickCommands(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/BazaarTweaks.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/BazaarTweaks.java new file mode 100644 index 00000000..2ba0b718 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/BazaarTweaks.java @@ -0,0 +1,81 @@ +/* + * 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.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.ConfigOption; + +public class BazaarTweaks { + + @ConfigOption( + name = "Search GUI", + desc = "" + ) + @ConfigEditorAccordion(id = 0) + public boolean searchAccordion = false; + + @Expose + @ConfigOption( + name = "Enable Search GUI", + desc = "Use the advanced search GUI with autocomplete and history instead of the normal sign GUI" + ) + @ConfigEditorBoolean + @ConfigAccordionId(id = 0) + public boolean enableSearchOverlay = true; + + @Expose + @ConfigOption( + name = "Keep Previous Search", + desc = "Don't clear the search bar after closing the GUI" + ) + @ConfigEditorBoolean + @ConfigAccordionId(id = 0) + public boolean keepPreviousSearch = false; + + @Expose + @ConfigOption( + name = "Past Searches", + desc = "Show past searches below the autocomplete box" + ) + @ConfigEditorBoolean + @ConfigAccordionId(id = 0) + public boolean showPastSearches = true; + + @Expose + @ConfigOption( + name = "ESC to Full Close", + desc = "Make pressing ESCAPE close the search GUI without opening up the Bazaar again\n" + + "ENTER can still be used to search" + ) + @ConfigEditorBoolean + @ConfigAccordionId(id = 0) + public boolean escFullClose = true; + + @Expose + @ConfigOption( + name = "Bazaar Sacks Profit", + desc = "Orders the items in your sacks in the bazaar inventory and adding buy order toggle" + ) + @ConfigEditorBoolean + public boolean bazaarSacksProfit = true; +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Dungeons.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Dungeons.java index e080db7d..c94bd181 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Dungeons.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/Dungeons.java @@ -114,6 +114,15 @@ public class Dungeons { @ConfigAccordionId(id = 1) public boolean useKismetOnDungeonProfit = true; + @Expose + @ConfigOption( + name = "Include Essence Cost", + desc = "Include Bazaar Essence Sell Cost in the Profit Calculation for Dungeon Chests" + ) + @ConfigEditorBoolean + @ConfigAccordionId(id = 1) + public boolean useEssenceCostFromBazaar = true; + @Expose @ConfigOption( name = "Warning if Derpy active", 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 d87082b4..84e2322e 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 @@ -126,13 +126,11 @@ public class Misc { @Expose @ConfigOption( name = "Damage Indicator Style", - desc = "Change the style of Skyblock damage indicators to be easier to read\n" + + desc = "Change Skyblock damage indicators to use shortened numbers\n" + "\u00A7cSome old animations mods break this feature" ) - @ConfigEditorDropdown( - values = {"Off", "Commas", "Shortened"} - ) - public int damageIndicatorStyle = 1; + @ConfigEditorBoolean + public boolean damageIndicatorStyle2 = false; @Expose @ConfigOption( diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/SkillOverlays.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/SkillOverlays.java index 8b7002f9..943417e6 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/SkillOverlays.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/SkillOverlays.java @@ -274,7 +274,7 @@ public class SkillOverlays { @Expose @ConfigOption( name = "\u00A7cWarning", - desc = "The combat display will only show if you have a Book of Stats on the item you are using" + desc = "The combat display will only show if you have a Book of Stats or the Champion enchant" ) @ConfigEditorFSR( runnableId = 12, @@ -305,11 +305,12 @@ public class SkillOverlays { "\u00a7bCurrent XP: \u00a7e6,734", "\u00a7bRemaining XP: \u00a7e3,265", "\u00a7bXP/h: \u00a7e238,129", - "\u00a7bETA: \u00a7e13h12m" + "\u00a7bETA: \u00a7e13h12m", + "\u00a7bChampion XP: \u00a7e3,523" } ) @ConfigAccordionId(id = 4) - public List combatText = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5)); + public List combatText = new ArrayList<>(Arrays.asList(0, 6, 1, 2, 3, 4, 5)); @Expose @ConfigOption( @@ -337,7 +338,7 @@ public class SkillOverlays { @Expose @ConfigOption( name = "Always show combat overlay", - desc = "Shows combat overlay even if you dont have Book of Stats" + desc = "Shows combat overlay even if you dont have Book of Stats or the Champion enchant" ) @ConfigEditorBoolean @ConfigAccordionId(id = 4) diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TooltipTweaks.java b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TooltipTweaks.java index 0729df97..1edc0921 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TooltipTweaks.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/seperateSections/TooltipTweaks.java @@ -181,11 +181,45 @@ public class TooltipTweaks { @ConfigEditorBoolean public boolean powerStoneStats = true; + @ConfigOption( + name = "RNG Meter", + desc = "" + ) + @ConfigEditorAccordion(id = 1) + public boolean rngMeter = false; + + @Expose + @ConfigOption( + name = "Fraction Display", + desc = "Show the fraction instead of the percentage in the slayer and dungeon rng meter inventory" + ) + @ConfigEditorBoolean + @ConfigAccordionId(id = 1) + public boolean rngMeterFractionDisplay = true; + + @Expose + @ConfigOption( + name = " Profit Per Score/XP", + desc = "Show the amount of coins per Score/XP in the rng meter inventory" + ) + @ConfigEditorBoolean + @ConfigAccordionId(id = 1) + public boolean rngMeterProfitPerUnit = true; + + @Expose + @ConfigOption( + name = "Dungeon/Slayer Needed Counter", + desc = "Show the amount of dungeon runs or slayer bosses needed for the rng meter to fill up" + ) + @ConfigEditorBoolean + @ConfigAccordionId(id = 1) + public boolean rngMeterRunsNeeded = true; + @Expose @ConfigOption( - name = "Bazaar Sacks Profit", - desc = "Orders the items in your sacks in the bazaar inventory and adding buy order toggle" + name = "Essence Price In Shop", + desc = "Show the essence price in the essence shop in the dungeon hub" ) @ConfigEditorBoolean - public boolean bazaarSacksProfit = true; + public boolean essencePriceInEssenceShop = 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 8ff3218a..fcea79dd 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/AuctionSearchOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/AuctionSearchOverlay.java @@ -607,7 +607,7 @@ public class AuctionSearchOverlay { close(); Minecraft.getMinecraft().thePlayer.sendQueue.addToSendQueue(new C0DPacketCloseWindow(Minecraft.getMinecraft().thePlayer.openContainer.windowId)); NotEnoughUpdates.INSTANCE.openGui = new GuiScreenElementWrapper(new NEUConfigEditor( - NotEnoughUpdates.INSTANCE.config, "AH Search GUI")); + NotEnoughUpdates.INSTANCE.config, "AH Tweaks")); } } } else if (Mouse.getEventButton() == 0) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/BazaarSearchOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/BazaarSearchOverlay.java new file mode 100644 index 00000000..66dacda3 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/BazaarSearchOverlay.java @@ -0,0 +1,572 @@ +/* + * 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.overlays; + +import com.google.common.base.Splitter; +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.Utils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.gui.inventory.GuiEditSign; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.item.ItemStack; +import net.minecraft.network.play.client.C0DPacketCloseWindow; +import net.minecraft.tileentity.TileEntitySign; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicInteger; + +public class BazaarSearchOverlay { + private static final ResourceLocation SEARCH_OVERLAY_TEXTURE = new ResourceLocation( + "notenoughupdates:auc_search/ah_search_overlay.png"); + private static final ResourceLocation SEARCH_OVERLAY_TEXTURE_TAB_COMPLETED = new ResourceLocation( + "notenoughupdates:auc_search/ah_search_overlay_tab_completed.png"); + + private static final GuiElementTextField textField = new GuiElementTextField("", 200, 20, 0); + private static boolean searchFieldClicked = false; + private static String searchString = ""; + private static String searchStringExtra = ""; + private static final Splitter SPACE_SPLITTER = Splitter.on(" ").omitEmptyStrings().trimResults(); + private static boolean tabCompleted = false; + private static int tabCompletionIndex = -1; + + private static final int AUTOCOMPLETE_HEIGHT = 118; + + private static final Set autocompletedItems = new LinkedHashSet<>(); + + private static final Comparator salesComparator = (o1, o2) -> { + JsonObject bazaarInfo1 = NotEnoughUpdates.INSTANCE.manager.auctionManager.getBazaarInfo(o1); + JsonObject bazaarInfo2 = NotEnoughUpdates.INSTANCE.manager.auctionManager.getBazaarInfo(o2); + + boolean auc1Invalid = bazaarInfo1 == null || !bazaarInfo1.has("curr_sell"); + boolean auc2Invalid = bazaarInfo2 == null || !bazaarInfo2.has("curr_sell"); + + if (auc1Invalid && auc2Invalid) return o1.compareTo(o2); + if (auc1Invalid) return -1; + if (auc2Invalid) return 1; + + int sales1 = bazaarInfo1.get("curr_sell").getAsInt(); + int sales2 = bazaarInfo2.get("curr_sell").getAsInt(); + + if (sales1 == sales2) return o1.compareTo(o2); + if (sales1 > sales2) return -1; + return 1; + }; + + public static boolean shouldReplace() { + if (!NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard()) return false; + if (!NotEnoughUpdates.INSTANCE.config.bazaarTweaks.enableSearchOverlay) return false; + + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiEditSign)) { + if (!NotEnoughUpdates.INSTANCE.config.bazaarTweaks.keepPreviousSearch) searchString = ""; + return false; + } + + String lastContainer = Utils.getLastOpenChestName(); + if (!lastContainer.startsWith("Bazaar ➜ ")) return false; + + TileEntitySign tes = ((AccessorGuiEditSign) Minecraft.getMinecraft().currentScreen).getTileSign(); + + if (tes == null) return false; + if (tes.getPos().getY() != 0) return false; + if (!tes.signText[2].getUnformattedText().equals("^^^^^^^^^^^^^^^")) return false; + return tes.signText[3].getUnformattedText().equals("Enter query"); + } + + public static void render() { + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + int width = scaledResolution.getScaledWidth(); + int height = scaledResolution.getScaledHeight(); + int mouseX = Mouse.getX() * width / Minecraft.getMinecraft().displayWidth; + int mouseY = height - Mouse.getY() * height / Minecraft.getMinecraft().displayHeight - 1; + + Utils.drawGradientRect(0, 0, width, height, -1072689136, -804253680); + + int h = NotEnoughUpdates.INSTANCE.config.bazaarTweaks.showPastSearches ? 219 : 145; + + int topY = height / 4; + if (scaledResolution.getScaleFactor() >= 4) { + topY = height / 2 - h / 2 + 5; + } + + Minecraft.getMinecraft().getTextureManager().bindTexture(SEARCH_OVERLAY_TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(width / 2 - 100, topY - 1, 203, h, 0, 203 / 512f, 0, h / 256f, GL11.GL_NEAREST); + + Minecraft.getMinecraft().fontRendererObj.drawString("Enter Query:", width / 2 - 100, topY - 10, 0xdddddd, true); + + textField.setFocus(true); + textField.setText(searchString); + textField.setSize(149, 20); + textField.setCustomBorderColour(0xffffff); + textField.render(width / 2 - 100 + 1, topY + 1); + + if (textField.getText().trim().isEmpty()) autocompletedItems.clear(); + + List tooltipToDisplay = null; + + int num = 0; + synchronized (autocompletedItems) { + String[] autoCompletedItemsArray = autocompletedItems.toArray(new String[0]); + for (int i = 0; i < autoCompletedItemsArray.length; i++) { + String str = autoCompletedItemsArray[i]; + JsonObject obj = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(str); + if (obj != null) { + ItemStack stack = NotEnoughUpdates.INSTANCE.manager.jsonToStack(obj); + if (i == tabCompletionIndex) { + Minecraft.getMinecraft().getTextureManager().bindTexture(SEARCH_OVERLAY_TEXTURE_TAB_COMPLETED); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect( + width / 2 - 96 + 1, + topY + 30 + num * 22 + 1, + 193, + 21, + 0 / 512f, + 193 / 512f, + 0, + 21 / 256f, + GL11.GL_NEAREST + ); + } else { + Minecraft.getMinecraft().getTextureManager().bindTexture(SEARCH_OVERLAY_TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect( + width / 2 - 96 + 1, + topY + 30 + num * 22 + 1, + 193, + 21, + 214 / 512f, + 407 / 512f, + 0, + 21 / 256f, + GL11.GL_NEAREST + ); + + } + String itemName = Utils.trimIgnoreColour(stack.getDisplayName().replaceAll("\\[.+]", "")); + if (itemName.contains("Enchanted Book") && str.contains(";")) { + String[] lore = NotEnoughUpdates.INSTANCE.manager.getLoreFromNBT(stack.getTagCompound()); + itemName = lore[0].trim(); + } + + Minecraft.getMinecraft().fontRendererObj.drawString(Minecraft.getMinecraft().fontRendererObj.trimStringToWidth( + itemName, + 165 + ), + width / 2 - 74, topY + 35 + num * 22 + 1, 0xdddddd, true + ); + + GlStateManager.enableDepth(); + Utils.drawItemStack(stack, width / 2 - 94 + 2, topY + 32 + num * 22 + 1); + + if (mouseX > width / 2 - 96 && mouseX < width / 2 + 96 && mouseY > topY + 30 + num * 22 && + mouseY < topY + 30 + num * 22 + 20) { + tooltipToDisplay = stack.getTooltip(Minecraft.getMinecraft().thePlayer, false); + } + + if (++num >= 5) break; + } + } + } + + if (NotEnoughUpdates.INSTANCE.config.bazaarTweaks.showPastSearches) { + Minecraft.getMinecraft().fontRendererObj.drawString( + "Past Searches:", + width / 2 - 100, + topY + 25 + AUTOCOMPLETE_HEIGHT + 5, + 0xdddddd, + true + ); + + for (int i = 0; i < 5; i++) { + if (i >= NotEnoughUpdates.INSTANCE.config.hidden.previousBazaarSearches.size()) break; + + String s = NotEnoughUpdates.INSTANCE.config.hidden.previousBazaarSearches.get(i); + Minecraft.getMinecraft().fontRendererObj.drawString( + s, + width / 2 - 95 + 1, + topY + 45 + AUTOCOMPLETE_HEIGHT + i * 10 + 2, + 0xdddddd, + true + ); + } + + if (tooltipToDisplay != null) { + Utils.drawHoveringText( + tooltipToDisplay, + mouseX, + mouseY, + width, + height, + -1, + Minecraft.getMinecraft().fontRendererObj + ); + } + } + + } + + private static final ExecutorService searchES = Executors.newSingleThreadExecutor(); + private static final AtomicInteger searchId = new AtomicInteger(0); + + private static String getItemIdAtIndex(int i) { + if (!autocompletedItems.isEmpty()) { + if ((i > autocompletedItems.size() - 1) || i < 0 || i > 4) { + return ""; + } + String searchString = autocompletedItems.toArray()[i].toString(); + JsonObject repoObject = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(searchString); + if (repoObject != null) { + ItemStack stack = NotEnoughUpdates.INSTANCE.manager.jsonToStack(repoObject); + return Utils.cleanColour(stack.getDisplayName().replaceAll("\\[.+]", "")); + } + + } + return null; + } + + public static void close() { + if (tabCompleted) { + tabCompletionIndex = -1; + tabCompleted = false; + } + if (NotEnoughUpdates.INSTANCE.config.bazaarTweaks.keepPreviousSearch) { + search(); + } else { + synchronized (autocompletedItems) { + autocompletedItems.clear(); + } + } + + TileEntitySign tes = ((AccessorGuiEditSign) Minecraft.getMinecraft().currentScreen).getTileSign(); + + StringBuilder stringBuilder = new StringBuilder(searchString.trim()); + if (!searchStringExtra.isEmpty()) { + stringBuilder.append(searchStringExtra); + } + + String search = stringBuilder.toString(); + + if (search.length() <= 15) { + tes.signText[0] = new ChatComponentText(search.substring(0, Math.min(search.length(), 15))); + } else { + List words = SPACE_SPLITTER.splitToList(search); + + StringBuilder line0 = new StringBuilder(); + StringBuilder line1 = new StringBuilder(); + + int currentLine = 0; + for (String word : words) { + if (currentLine == 0) { + if (line0.length() + word.length() > 15) { + currentLine++; + } else { + line0.append(word); + if (line0.length() >= 15) { + currentLine++; + continue; + } else { + line0.append(" "); + } + } + } + if (currentLine == 1) { + if (line1.length() + word.length() > 15) { + line1.append(word, 0, 15 - line1.length()); + break; + } else { + line1.append(word); + if (line1.length() >= 15) { + break; + } else { + line1.append(" "); + } + } + } + if (line1.length() >= 15) break; + } + + tes.signText[0] = new ChatComponentText(line0.toString().trim()); + tes.signText[1] = new ChatComponentText(line1.toString().trim()); + } + + if (!searchString.trim().isEmpty()) { + List previousBazaarSearches = NotEnoughUpdates.INSTANCE.config.hidden.previousBazaarSearches; + previousBazaarSearches.remove(searchString); + previousBazaarSearches.remove(searchString); + previousBazaarSearches.add(0, searchString); + while (previousBazaarSearches.size() > 5) { + previousBazaarSearches.remove(previousBazaarSearches.size() - 1); + } + } + + Minecraft.getMinecraft().displayGuiScreen(null); + + if (Minecraft.getMinecraft().currentScreen == null) { + Minecraft.getMinecraft().setIngameFocus(); + } + } + + private static boolean updateTabCompletedSearch(int key) { + String id; + if (key == Keyboard.KEY_DOWN || key == Keyboard.KEY_TAB) { + id = getItemIdAtIndex(tabCompletionIndex + 1); + if (id == null) { + textField.setFocus(true); + textField.setText(searchString); + tabCompleted = false; + tabCompletionIndex = -1; + return true; + } else if (id.equals("")) { + tabCompletionIndex = 0; + return true; + } else { + searchString = id; + tabCompletionIndex += 1; + return true; + } + } else if (key == Keyboard.KEY_UP) { + id = getItemIdAtIndex(tabCompletionIndex - 1); + if (id == null) { + textField.setFocus(true); + textField.setText(searchString); + tabCompleted = false; + tabCompletionIndex = -1; + return true; + } else if (id.equals("")) { + if (autocompletedItems.size() > 4) tabCompletionIndex = 4; + else tabCompletionIndex = autocompletedItems.size() - 1; + tabCompletionIndex = autocompletedItems.size() - 1; + return true; + } else { + searchString = id; + tabCompletionIndex -= 1; + return true; + } + } + return false; + } + + public static void search() { + final int thisSearchId = searchId.incrementAndGet(); + + searchES.submit(() -> { + if (thisSearchId != searchId.get()) return; + + List title = new ArrayList<>(NotEnoughUpdates.INSTANCE.manager.search("title:" + searchString.trim())); + + if (thisSearchId != searchId.get()) return; + + if (!searchString.trim().contains(" ")) { + StringBuilder sb = new StringBuilder(); + for (char c : searchString.toCharArray()) { + sb.append(c).append(" "); + } + title.addAll(NotEnoughUpdates.INSTANCE.manager.search("title:" + sb.toString().trim())); + } + + if (thisSearchId != searchId.get()) return; + + List desc = new ArrayList<>(NotEnoughUpdates.INSTANCE.manager.search("desc:" + searchString.trim())); + desc.removeAll(title); + + if (thisSearchId != searchId.get()) return; + + Set bazaarItems = NotEnoughUpdates.INSTANCE.manager.auctionManager.getBazaarKeySet(); + // Amalgamated Crimsonite (Old) // TODO remove from repo + bazaarItems.remove("AMALGAMATED_CRIMSONITE"); + + title.retainAll(bazaarItems); + desc.retainAll(bazaarItems); + + title.sort(salesComparator); + desc.sort(salesComparator); + + if (thisSearchId != searchId.get()) return; + + synchronized (autocompletedItems) { + autocompletedItems.clear(); + autocompletedItems.addAll(title); + autocompletedItems.addAll(desc); + } + }); + } + + public static void keyEvent() { + boolean ignoreKey = false; + + if (Keyboard.getEventKey() == Keyboard.KEY_ESCAPE) { + searchStringExtra = ""; + close(); + if (NotEnoughUpdates.INSTANCE.config.bazaarTweaks.escFullClose) { + Minecraft.getMinecraft().thePlayer.sendQueue.addToSendQueue(new C0DPacketCloseWindow(Minecraft.getMinecraft().thePlayer.openContainer.windowId)); + } + return; + } else if (Keyboard.getEventKey() == Keyboard.KEY_RETURN) { + searchStringExtra = ""; + close(); + return; + } else if (Keyboard.getEventKey() == Keyboard.KEY_TAB) { + //autocomplete to first item in the list + if (!tabCompleted) { + tabCompleted = true; + ignoreKey = true; + String id = getItemIdAtIndex(0); + if (id == null) { + tabCompleted = false; + textField.setFocus(true); + textField.setText(searchString); + } else { + tabCompletionIndex = 0; + searchString = id; + } + } + } + + if (Keyboard.getEventKeyState()) { + if (tabCompleted) { + if (!ignoreKey) { + boolean success = updateTabCompletedSearch(Keyboard.getEventKey()); + if (success) return; + textField.setFocus(true); + textField.setText(searchString); + tabCompleted = false; + tabCompletionIndex = -1; + } else return; + + } + textField.setFocus(true); + textField.setText(searchString); + textField.keyTyped(Keyboard.getEventCharacter(), Keyboard.getEventKey()); + searchString = textField.getText(); + + search(); + } + } + + public static void mouseEvent() { + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + int width = scaledResolution.getScaledWidth(); + int height = scaledResolution.getScaledHeight(); + int mouseX = Mouse.getX() * width / Minecraft.getMinecraft().displayWidth; + int mouseY = height - Mouse.getY() * height / Minecraft.getMinecraft().displayHeight - 1; + + int h = NotEnoughUpdates.INSTANCE.config.bazaarTweaks.showPastSearches ? 219 : 145; + + int topY = height / 4; + if (scaledResolution.getScaleFactor() >= 4) { + topY = height / 2 - h / 2 + 5; + } + + if (!Mouse.getEventButtonState() && Mouse.getEventButton() == -1 && searchFieldClicked) { + textField.mouseClickMove(mouseX - 2, topY + 10, 0, 0); + } + + if (Mouse.getEventButton() != -1) { + searchFieldClicked = false; + } + + if (Mouse.getEventButtonState()) { + if (mouseY > topY && mouseY < topY + 20) { + if (mouseX > width / 2 - 100) { + if (mouseX < width / 2 + 49) { + searchFieldClicked = true; + textField.mouseClicked(mouseX - 2, mouseY, Mouse.getEventButton()); + + if (Mouse.getEventButton() == 1) { + searchString = ""; + synchronized (autocompletedItems) { + autocompletedItems.clear(); + } + } + } else if (mouseX < width / 2 + 75) { + searchStringExtra = ""; + close(); + } else if (mouseX < width / 2 + 100) { + searchStringExtra = ""; + close(); + Minecraft.getMinecraft().thePlayer.sendQueue.addToSendQueue(new C0DPacketCloseWindow(Minecraft.getMinecraft().thePlayer.openContainer.windowId)); + NotEnoughUpdates.INSTANCE.openGui = new GuiScreenElementWrapper(new NEUConfigEditor( + NotEnoughUpdates.INSTANCE.config, "Bazaar Tweaks")); + } + } + } else if (Mouse.getEventButton() == 0) { + int num = 0; + synchronized (autocompletedItems) { + for (String str : autocompletedItems) { + JsonObject obj = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(str); + if (obj != null) { + ItemStack stack = NotEnoughUpdates.INSTANCE.manager.jsonToStack(obj); + if (mouseX >= width / 2 - 96 && mouseX <= width / 2 + 96 && mouseY >= topY + 30 + num * 22 && + mouseY <= topY + 30 + num * 22 + 20) { + searchString = Utils.cleanColour(stack.getDisplayName().replaceAll("\\[.+]", "")).trim(); + if (searchString.contains("Enchanted Book") && str.contains(";")) { + String[] lore = NotEnoughUpdates.INSTANCE.manager.getLoreFromNBT(stack.getTagCompound()); + if (lore != null) { + searchString = Utils.cleanColour(lore[0]); + } + } + + searchStringExtra = " "; + + close(); + return; + } + + if (++num >= 5) break; + } + } + } + + if (NotEnoughUpdates.INSTANCE.config.bazaarTweaks.showPastSearches) { + for (int i = 0; i < 5; i++) { + if (i >= NotEnoughUpdates.INSTANCE.config.hidden.previousBazaarSearches.size()) break; + + String s = NotEnoughUpdates.INSTANCE.config.hidden.previousBazaarSearches.get(i); + if (mouseX >= width / 2 - 95 && mouseX <= width / 2 + 95 && + mouseY >= topY + 45 + AUTOCOMPLETE_HEIGHT + i * 10 && + mouseY <= topY + 45 + AUTOCOMPLETE_HEIGHT + i * 10 + 10) { + searchString = s; + searchStringExtra = ""; + close(); + return; + } + } + } + } + } + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/CombatSkillOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/CombatSkillOverlay.java index 250be27d..4ad6767d 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/CombatSkillOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/CombatSkillOverlay.java @@ -41,6 +41,10 @@ public class CombatSkillOverlay private long lastUpdate = -1; private int killLast = -1; private int kill = -1; + private int championTier = -1; + private String championTierAmount = "1"; + private int championXp = -1; + private int championXpLast = -1; private final LinkedList killQueue = new LinkedList<>(); private XPInformation.SkillInfo skillInfo = null; @@ -84,6 +88,7 @@ public class CombatSkillOverlay lastUpdate = System.currentTimeMillis(); killLast = kill; + championXpLast = championXp; xpGainHourLast = xpGainHour; kill = -1; @@ -100,9 +105,67 @@ public class CombatSkillOverlay kill = ea.getInteger("stats_book"); killQueue.add(0, kill); } + if (ea.hasKey("champion_combat_xp", 99)) { + championXp = (int) ea.getDouble("champion_combat_xp"); + } } } + if (championXp < 50000) { + championTier = 1; + } else if (championXp < 100000) { + championTier = 2; + } else if (championXp < 250000) { + championTier = 3; + } else if (championXp < 500000) { + championTier = 4; + } else if (championXp < 1000000) { + championTier = 5; + } else if (championXp < 1500000) { + championTier = 6; + } else if (championXp < 2000000) { + championTier = 7; + } else if (championXp < 2500000) { + championTier = 8; + } else if (championXp < 3000000) { + championTier = 9; + } else if (championXp > 3000000) { + championTier = 10; + } + + switch (championTier) { + case 1: + championTierAmount = "50,000"; + break; + case 2: + championTierAmount = "100,000"; + break; + case 3: + championTierAmount = "250,000"; + break; + case 4: + championTierAmount = "500,000"; + break; + case 5: + championTierAmount = "1,000,000"; + break; + case 6: + championTierAmount = "1,500,000"; + break; + case 7: + championTierAmount = "2,000,000"; + break; + case 8: + championTierAmount = "2,500,000"; + break; + case 9: + championTierAmount = "3,000,000"; + break; + case 10: + championTierAmount = "Maxed"; + break; + } + String internalname = NotEnoughUpdates.INSTANCE.manager.getInternalNameForItem(stack); skillInfoLast = skillInfo; @@ -165,7 +228,7 @@ public class CombatSkillOverlay public void updateFrequent() { super.updateFrequent(); - if (kill < 0 && !NotEnoughUpdates.INSTANCE.config.skillOverlays.alwaysShowCombatOverlay) { + if ((kill < 0 || championXp < 0) && !NotEnoughUpdates.INSTANCE.config.skillOverlays.alwaysShowCombatOverlay) { overlayStrings = null; } else { HashMap lineMap = new HashMap<>(); @@ -180,6 +243,23 @@ public class CombatSkillOverlay lineMap.put(0, EnumChatFormatting.AQUA + "Kills: " + EnumChatFormatting.YELLOW + format.format(counterInterp)); } + if (championTier <= 9) { + int counterInterp = (int) interp(championXp, championXpLast); + lineMap.put( + 6, + EnumChatFormatting.AQUA + "Champion: " + EnumChatFormatting.YELLOW + format.format(counterInterp) + "/" + + championTierAmount + ); + } + if (championTier == 10) { + int counterInterp = (int) interp(championXp, championXpLast); + lineMap.put( + 6, + EnumChatFormatting.AQUA + "Champion: " + EnumChatFormatting.YELLOW + format.format(counterInterp) + " " + + EnumChatFormatting.RED + championTierAmount + ); + } + float xpInterp = xpGainHour; if (xpGainHourLast == xpGainHour && xpGainHour <= 0) { lineMap.put(4, EnumChatFormatting.AQUA + "XP/h: " + EnumChatFormatting.YELLOW + "N/A"); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BasicPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BasicPage.java index dcbcb9e4..a72e0a24 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BasicPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BasicPage.java @@ -25,6 +25,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.mojang.authlib.GameProfile; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.profileviewer.weight.lily.LilyWeight; import io.github.moulberry.notenoughupdates.profileviewer.weight.senither.SenitherWeight; import io.github.moulberry.notenoughupdates.util.Constants; @@ -617,9 +618,9 @@ public class BasicPage extends GuiProfileViewerPage { EnumChatFormatting.GRAY + "Progress: " + EnumChatFormatting.DARK_PURPLE + - GuiProfileViewer.shortNumberFormat(Math.round((level % 1) * maxXp), 0) + + StringUtils.shortNumberFormat(Math.round((level % 1) * maxXp)) + "/" + - GuiProfileViewer.shortNumberFormat(maxXp, 0) + StringUtils.shortNumberFormat(maxXp) ); } String totalXpS = GuiProfileViewer.numberFormat.format((int) skyblockInfo.get(entry.getKey()).totalXp); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/CollectionsPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/CollectionsPage.java index b227c815..554e204c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/CollectionsPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/CollectionsPage.java @@ -21,15 +21,9 @@ package io.github.moulberry.notenoughupdates.profileviewer; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; -import java.awt.*; -import java.io.IOException; -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.item.ItemStack; @@ -39,6 +33,14 @@ import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; +import java.awt.*; +import java.io.IOException; +import java.text.NumberFormat; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; + public class CollectionsPage extends GuiProfileViewerPage { public static final ResourceLocation pv_cols = new ResourceLocation("notenoughupdates:pv_cols.png"); @@ -290,7 +292,7 @@ public class CollectionsPage extends GuiProfileViewerPage { } Utils.drawStringCentered( - GuiProfileViewer.shortNumberFormat(amount, 0) + "", + StringUtils.shortNumberFormat(amount) + "", Minecraft.getMinecraft().fontRendererObj, guiLeft + x + 10, guiTop + y + 26, diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/DungeonPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/DungeonPage.java index 73bbd295..c707f7fc 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/DungeonPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/DungeonPage.java @@ -25,14 +25,10 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; -import java.io.IOException; -import java.util.Base64; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.UUID; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.GlStateManager; @@ -48,6 +44,12 @@ import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL14; +import java.io.IOException; +import java.util.Base64; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.UUID; + public class DungeonPage extends GuiProfileViewerPage { private static final ResourceLocation pv_dung = new ResourceLocation("notenoughupdates:pv_dung.png"); @@ -172,7 +174,7 @@ public class DungeonPage extends GuiProfileViewerPage { Utils.renderAlignedString( EnumChatFormatting.YELLOW + "Until Cata " + floorLevelTo + ": ", - EnumChatFormatting.WHITE + GuiProfileViewer.shortNumberFormat(floorLevelToXP, 0), + EnumChatFormatting.WHITE + StringUtils.shortNumberFormat((double) floorLevelToXP), x, y + 16, sectionWidth @@ -222,9 +224,9 @@ public class DungeonPage extends GuiProfileViewerPage { getInstance().tooltipToDisplay = Lists.newArrayList( - String.format("# F5 Runs (%s xp) : %d", GuiProfileViewer.shortNumberFormat(xpF5, 0), runsF5), - String.format("# F6 Runs (%s xp) : %d", GuiProfileViewer.shortNumberFormat(xpF6, 0), runsF6), - String.format("# F7 Runs (%s xp) : %d", GuiProfileViewer.shortNumberFormat(xpF7, 0), runsF7), + String.format("# F5 Runs (%s xp) : %d", StringUtils.shortNumberFormat(xpF5), runsF5), + String.format("# F6 Runs (%s xp) : %d", StringUtils.shortNumberFormat(xpF6), runsF6), + String.format("# F7 Runs (%s xp) : %d", StringUtils.shortNumberFormat(xpF7), runsF7), "" ); boolean hasTime = false; @@ -352,10 +354,10 @@ public class DungeonPage extends GuiProfileViewerPage { getInstance().tooltipToDisplay = Lists.newArrayList( - String.format("# M3 Runs (%s xp) : %d", GuiProfileViewer.shortNumberFormat(xpM3, 0), runsM3), - String.format("# M4 Runs (%s xp) : %d", GuiProfileViewer.shortNumberFormat(xpM4, 0), runsM4), - String.format("# M5 Runs (%s xp) : %d", GuiProfileViewer.shortNumberFormat(xpM5, 0), runsM5), - String.format("# M6 Runs (%s xp) : %d", GuiProfileViewer.shortNumberFormat(xpM6, 0), runsM6), + String.format("# M3 Runs (%s xp) : %d", StringUtils.shortNumberFormat(xpM3), runsM3), + String.format("# M4 Runs (%s xp) : %d", StringUtils.shortNumberFormat(xpM4), runsM4), + String.format("# M5 Runs (%s xp) : %d", StringUtils.shortNumberFormat(xpM5), runsM5), + String.format("# M6 Runs (%s xp) : %d", StringUtils.shortNumberFormat(xpM6), runsM6), "" ); boolean hasTime = false; @@ -482,7 +484,7 @@ public class DungeonPage extends GuiProfileViewerPage { ); Utils.renderAlignedString( EnumChatFormatting.YELLOW + "Secrets (Total) ", - EnumChatFormatting.WHITE + GuiProfileViewer.shortNumberFormat(secrets, 0), + EnumChatFormatting.WHITE + StringUtils.shortNumberFormat(secrets), x, miscTopY + 20, sectionWidth @@ -496,7 +498,7 @@ public class DungeonPage extends GuiProfileViewerPage { ); Utils.renderAlignedString( EnumChatFormatting.YELLOW + "Mob Kills (Total) ", - EnumChatFormatting.WHITE + GuiProfileViewer.shortNumberFormat(mobKills, 0), + EnumChatFormatting.WHITE + StringUtils.shortNumberFormat(mobKills), x, miscTopY + 40, sectionWidth diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ExtraPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ExtraPage.java index 3cbd944d..63a4df2c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ExtraPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ExtraPage.java @@ -22,10 +22,15 @@ package io.github.moulberry.notenoughupdates.profileviewer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; -import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.util.Constants; -import io.github.moulberry.notenoughupdates.util.PronounDB; import io.github.moulberry.notenoughupdates.util.Utils; +import net.minecraft.client.Minecraft; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import org.apache.commons.lang3.text.WordUtils; +import org.lwjgl.opengl.GL11; + import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; @@ -34,15 +39,9 @@ import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.TimeZone; import java.util.TreeMap; -import net.minecraft.client.Minecraft; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.ResourceLocation; -import org.apache.commons.lang3.text.WordUtils; -import org.lwjgl.opengl.GL11; public class ExtraPage extends GuiProfileViewerPage { @@ -79,14 +78,14 @@ public class ExtraPage extends GuiProfileViewerPage { Utils.renderAlignedString( EnumChatFormatting.GOLD + "Bank Balance", - EnumChatFormatting.WHITE + GuiProfileViewer.shortNumberFormat(bankBalance, 0), + EnumChatFormatting.WHITE + StringUtils.shortNumberFormat(bankBalance), guiLeft + xStart, guiTop + yStartTop, 76 ); Utils.renderAlignedString( EnumChatFormatting.GOLD + "Purse", - EnumChatFormatting.WHITE + GuiProfileViewer.shortNumberFormat(purseBalance, 0), + EnumChatFormatting.WHITE + StringUtils.shortNumberFormat(purseBalance), guiLeft + xStart, guiTop + yStartTop + yOffset, 76 @@ -161,7 +160,17 @@ public class ExtraPage extends GuiProfileViewerPage { float totalSlayerCount = 0; float totalSlayerXP = 0; - List skills = Arrays.asList("taming", "mining", "foraging", "enchanting", "farming", "combat", "fishing", "alchemy"); + List skills = Arrays.asList( + "taming", + "mining", + "foraging", + "enchanting", + "farming", + "combat", + "fishing", + "alchemy", + "carpentry" + ); List slayers = Arrays.asList("zombie", "spider", "wolf", "enderman", "blaze"); for (Map.Entry entry : skyblockInfo.entrySet()) { @@ -206,7 +215,7 @@ public class ExtraPage extends GuiProfileViewerPage { Utils.renderAlignedString( EnumChatFormatting.RED + "Total Slayer XP", - EnumChatFormatting.WHITE + GuiProfileViewer.shortNumberFormat(totalSlayerXP, 0), + EnumChatFormatting.WHITE + StringUtils.shortNumberFormat(totalSlayerXP), guiLeft + xStart, guiTop + yStartBottom + yOffset * 4, 76 @@ -214,11 +223,17 @@ public class ExtraPage extends GuiProfileViewerPage { } float auctions_bids = Utils.getElementAsFloat(Utils.getElement(profileInfo, "stats.auctions_bids"), 0); - float auctions_highest_bid = Utils.getElementAsFloat(Utils.getElement(profileInfo, "stats.auctions_highest_bid"), 0); + float auctions_highest_bid = Utils.getElementAsFloat( + Utils.getElement(profileInfo, "stats.auctions_highest_bid"), + 0 + ); float auctions_won = Utils.getElementAsFloat(Utils.getElement(profileInfo, "stats.auctions_won"), 0); float auctions_created = Utils.getElementAsFloat(Utils.getElement(profileInfo, "stats.auctions_created"), 0); float auctions_gold_spent = Utils.getElementAsFloat(Utils.getElement(profileInfo, "stats.auctions_gold_spent"), 0); - float auctions_gold_earned = Utils.getElementAsFloat(Utils.getElement(profileInfo, "stats.auctions_gold_earned"), 0); + float auctions_gold_earned = Utils.getElementAsFloat( + Utils.getElement(profileInfo, "stats.auctions_gold_earned"), + 0 + ); Utils.renderAlignedString( EnumChatFormatting.DARK_PURPLE + "Auction Bids", @@ -229,7 +244,7 @@ public class ExtraPage extends GuiProfileViewerPage { ); Utils.renderAlignedString( EnumChatFormatting.DARK_PURPLE + "Highest Bid", - EnumChatFormatting.WHITE + GuiProfileViewer.shortNumberFormat(auctions_highest_bid, 0), + EnumChatFormatting.WHITE + StringUtils.shortNumberFormat(auctions_highest_bid), guiLeft + xStart + xOffset, guiTop + yStartTop + yOffset, 76 @@ -250,14 +265,14 @@ public class ExtraPage extends GuiProfileViewerPage { ); Utils.renderAlignedString( EnumChatFormatting.DARK_PURPLE + "Gold Spent", - EnumChatFormatting.WHITE + GuiProfileViewer.shortNumberFormat(auctions_gold_spent, 0), + EnumChatFormatting.WHITE + StringUtils.shortNumberFormat(auctions_gold_spent), guiLeft + xStart + xOffset, guiTop + yStartTop + yOffset * 4, 76 ); Utils.renderAlignedString( EnumChatFormatting.DARK_PURPLE + "Gold Earned", - EnumChatFormatting.WHITE + GuiProfileViewer.shortNumberFormat(auctions_gold_earned, 0), + EnumChatFormatting.WHITE + StringUtils.shortNumberFormat(auctions_gold_earned), guiLeft + xStart + xOffset, guiTop + yStartTop + yOffset * 5, 76 @@ -276,8 +291,14 @@ public class ExtraPage extends GuiProfileViewerPage { Utils.getElement(profileInfo, "slayer_bosses.zombie.boss_kills_tier_4"), 0 ); - float wolf_boss_kills_tier_2 = Utils.getElementAsFloat(Utils.getElement(profileInfo, "slayer_bosses.wolf.boss_kills_tier_2"), 0); - float wolf_boss_kills_tier_3 = Utils.getElementAsFloat(Utils.getElement(profileInfo, "slayer_bosses.wolf.boss_kills_tier_3"), 0); + float wolf_boss_kills_tier_2 = Utils.getElementAsFloat(Utils.getElement( + profileInfo, + "slayer_bosses.wolf.boss_kills_tier_2" + ), 0); + float wolf_boss_kills_tier_3 = Utils.getElementAsFloat(Utils.getElement( + profileInfo, + "slayer_bosses.wolf.boss_kills_tier_3" + ), 0); float spider_boss_kills_tier_2 = Utils.getElementAsFloat( Utils.getElement(profileInfo, "slayer_bosses.spider.boss_kills_tier_2"), 0 @@ -294,8 +315,14 @@ public class ExtraPage extends GuiProfileViewerPage { 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); + 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", @@ -376,15 +403,24 @@ public class ExtraPage extends GuiProfileViewerPage { 76 ); - float pet_milestone_ores_mined = Utils.getElementAsFloat(Utils.getElement(profileInfo, "stats.pet_milestone_ores_mined"), 0); + float pet_milestone_ores_mined = Utils.getElementAsFloat(Utils.getElement( + profileInfo, + "stats.pet_milestone_ores_mined" + ), 0); float pet_milestone_sea_creatures_killed = Utils.getElementAsFloat( Utils.getElement(profileInfo, "stats.pet_milestone_sea_creatures_killed"), 0 ); float items_fished = Utils.getElementAsFloat(Utils.getElement(profileInfo, "stats.items_fished"), 0); - float items_fished_treasure = Utils.getElementAsFloat(Utils.getElement(profileInfo, "stats.items_fished_treasure"), 0); - float items_fished_large_treasure = Utils.getElementAsFloat(Utils.getElement(profileInfo, "stats.items_fished_large_treasure"), 0); + float items_fished_treasure = Utils.getElementAsFloat( + Utils.getElement(profileInfo, "stats.items_fished_treasure"), + 0 + ); + float items_fished_large_treasure = Utils.getElementAsFloat(Utils.getElement( + profileInfo, + "stats.items_fished_large_treasure" + ), 0); Utils.renderAlignedString( EnumChatFormatting.GREEN + "Ores Mined", 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 59373952..0f9d1b4a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java @@ -23,6 +23,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.cosmetics.ShaderManager; import io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField; import io.github.moulberry.notenoughupdates.miscfeatures.PetInfoOverlay; @@ -283,20 +284,9 @@ public class GuiProfileViewer extends GuiScreen { return levelObj; } + @Deprecated public static String shortNumberFormat(double n, int iteration) { - if (n < 1000) { - if (n % 1 == 0) { - return Integer.toString((int) n); - } else { - return String.format("%.2f", n); - } - } - - double d = ((long) n / 100) / 10.0; - boolean isRound = (d * 10) % 10 == 0; - return d < 1000 ? (isRound || d > 9.99 ? (int) d * 10 / 10 : d + "") + "" + c[iteration] : shortNumberFormat( - d, - iteration + 1 + return StringUtils.shortNumberFormat(n, iteration ); } @@ -1013,9 +1003,9 @@ public class GuiProfileViewer extends GuiScreen { int maxXp = (int) levelObj.maxXpForLevel; levelStr = EnumChatFormatting.DARK_PURPLE + - shortNumberFormat(Math.round((level % 1) * maxXp), 0) + + StringUtils.shortNumberFormat(Math.round((level % 1) * maxXp)) + "/" + - shortNumberFormat(maxXp, 0); + StringUtils.shortNumberFormat(maxXp); } if (totalXpStr != null) { tooltipToDisplay = Utils.createList(levelStr, totalXpStr); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/InventoriesPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/InventoriesPage.java index 8bba9c76..c98792ee 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/InventoriesPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/InventoriesPage.java @@ -23,6 +23,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.profileviewer.info.QuiverInfo; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; @@ -57,13 +58,15 @@ import static io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewe public class InventoriesPage extends GuiProfileViewerPage { public static final ResourceLocation pv_invs = new ResourceLocation("notenoughupdates:pv_invs.png"); - private static final Pattern DAMAGE_PATTERN = Pattern.compile("^Damage: \\+(\\d+)"); - private static final ResourceLocation CHEST_GUI_TEXTURE = new ResourceLocation("textures/gui/container/generic_54.png"); - private static final Pattern STRENGTH_PATTERN = Pattern.compile("^Strength: \\+(\\d+)"); - private static final Pattern FISHSPEED_PATTERN = Pattern.compile("^Increases fishing speed by \\+(\\d+)"); + private static final ResourceLocation CHEST_GUI_TEXTURE = + new ResourceLocation("textures/gui/container/generic_54.png"); + private static final Pattern FISHING_SPEED_PATTERN = Pattern.compile("^Fishing Speed: \\+(\\d+)"); private static final LinkedHashMap invNameToDisplayMap = new LinkedHashMap() { { - put("inv_contents", Utils.createItemStack(Item.getItemFromBlock(Blocks.chest), EnumChatFormatting.GRAY + "Inventory")); + put( + "inv_contents", + Utils.createItemStack(Item.getItemFromBlock(Blocks.chest), EnumChatFormatting.GRAY + "Inventory") + ); put( "ender_chest_contents", Utils.createItemStack(Item.getItemFromBlock(Blocks.ender_chest), EnumChatFormatting.GRAY + "Ender Chest") @@ -82,7 +85,9 @@ public class InventoriesPage extends GuiProfileViewerPage { put( "personal_vault_contents", Utils.editItemStackInfo( - NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager.getItemInformation().get("IRON_CHEST")), + NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager + .getItemInformation() + .get("IRON_CHEST")), EnumChatFormatting.GRAY + "Personal Vault", true ) @@ -263,21 +268,18 @@ public class InventoriesPage extends GuiProfileViewerPage { findBestItems( inventoryInfo, 6, - new String[] { "inv_contents", "ender_chest_contents" }, - new String[] { "SWORD", "BOW" }, - DAMAGE_PATTERN, - STRENGTH_PATTERN + new String[]{"inv_contents", "ender_chest_contents"}, + new String[]{"SWORD", "BOW"} ); } if (bestRods == null) { - bestRods = - findBestItems( - inventoryInfo, - 3, - new String[] { "inv_contents", "ender_chest_contents" }, - new String[] { "FISHING ROD" }, - FISHSPEED_PATTERN - ); + bestRods = findBestItems( + inventoryInfo, + 3, + new String[]{"inv_contents", "ender_chest_contents"}, + new String[]{"FISHING ROD", "FISHING WEAPON"}, + FISHING_SPEED_PATTERN + ); } for (int i = 0; i < bestWeapons.length; i++) { @@ -313,21 +315,27 @@ public class InventoriesPage extends GuiProfileViewerPage { } Utils.drawItemStackWithText( - NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager.getItemInformation().get("ARROW")), + NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager + .getItemInformation() + .get("ARROW")), guiLeft + 173, guiTop + 101, - "" + (arrowCount > 999 ? GuiProfileViewer.shortNumberFormat(arrowCount, 0) : arrowCount), + "" + (arrowCount > 999 ? StringUtils.shortNumberFormat(arrowCount) : arrowCount), true ); Utils.drawItemStackWithText( - NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager.getItemInformation().get("GREEN_CANDY")), + NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager + .getItemInformation() + .get("GREEN_CANDY")), guiLeft + 173, guiTop + 119, "" + greenCandyCount, true ); Utils.drawItemStackWithText( - NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager.getItemInformation().get("PURPLE_CANDY")), + NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.manager + .getItemInformation() + .get("PURPLE_CANDY")), guiLeft + 173, guiTop + 137, "" + purpleCandyCount, @@ -344,7 +352,8 @@ public class InventoriesPage extends GuiProfileViewerPage { } } else if (mouseY < guiTop + 119 + 17) { getInstance().tooltipToDisplay = - Utils.createList(EnumChatFormatting.GREEN + "Green Candy " + EnumChatFormatting.GRAY + "x" + greenCandyCount); + Utils.createList( + EnumChatFormatting.GREEN + "Green Candy " + EnumChatFormatting.GRAY + "x" + greenCandyCount); } else { getInstance().tooltipToDisplay = Utils.createList( @@ -431,11 +440,14 @@ public class InventoriesPage extends GuiProfileViewerPage { if ( getInstance().inventoryTextField.getText() != null && - !getInstance().inventoryTextField.getText().isEmpty() && - ( - stack == null || - !NotEnoughUpdates.INSTANCE.manager.doesStackMatchSearch(stack, getInstance().inventoryTextField.getText()) - ) + !getInstance().inventoryTextField.getText().isEmpty() && + ( + stack == null || + !NotEnoughUpdates.INSTANCE.manager.doesStackMatchSearch( + stack, + getInstance().inventoryTextField.getText() + ) + ) ) { GlStateManager.translate(0, 0, 50); GuiScreen.drawRect( @@ -585,7 +597,12 @@ public class InventoriesPage extends GuiProfileViewerPage { purpleCandyCount = -1; } - private int countItemsInInventory(String internalname, JsonObject inventoryInfo, boolean specific, String... invsToSearch) { + private int countItemsInInventory( + String internalname, + JsonObject inventoryInfo, + boolean specific, + String... invsToSearch + ) { int count = 0; for (String inv : invsToSearch) { JsonArray invItems = inventoryInfo.get(inv).getAsJsonArray(); @@ -594,7 +611,7 @@ public class InventoriesPage extends GuiProfileViewerPage { JsonObject item = invItems.get(i).getAsJsonObject(); if ( (specific && item.get("internalname").getAsString().equals(internalname)) || - (!specific && item.get("internalname").getAsString().contains(internalname)) + (!specific && item.get("internalname").getAsString().contains(internalname)) ) { if (item.has("count")) { count += item.get("count").getAsInt(); @@ -615,7 +632,7 @@ public class InventoriesPage extends GuiProfileViewerPage { Pattern... importantPatterns ) { ItemStack[] bestItems = new ItemStack[numItems]; - TreeMap> map = new TreeMap<>(); + TreeMap> map = new TreeMap<>(); for (String inv : invsToSearch) { JsonArray invItems = inventoryInfo.get(inv).getAsJsonArray(); for (int i = 0; i < invItems.size(); i++) { @@ -623,22 +640,33 @@ public class InventoriesPage extends GuiProfileViewerPage { JsonObject item = invItems.get(i).getAsJsonObject(); JsonArray lore = item.get("lore").getAsJsonArray(); if (Utils.checkItemType(lore, true, typeMatches) >= 0) { - int importance = 0; - for (int j = 0; j < lore.size(); j++) { - String line = lore.get(j).getAsString(); - for (Pattern pattern : importantPatterns) { - Matcher matcher = pattern.matcher(Utils.cleanColour(line)); - if (matcher.find()) { - importance += Integer.parseInt(matcher.group(1)); + long importance = 0; + int id = 0; + if (importantPatterns.length == 0) { + String internalName = item.get("internalname").getAsString(); + importance += NotEnoughUpdates.INSTANCE.manager.auctionManager.getLowestBin(internalName); + importance += ++id; + } else { + for (int j = 0; j < lore.size(); j++) { + String line = lore.get(j).getAsString(); + for (Pattern pattern : importantPatterns) { + Matcher matcher = pattern.matcher(Utils.cleanColour(line)); + if (matcher.find()) { + importance += Integer.parseInt(matcher.group(1)); + } } } } - map.computeIfAbsent(importance, k -> new HashSet<>()).add(NotEnoughUpdates.INSTANCE.manager.jsonToStack(item, false)); + map.computeIfAbsent(importance, k -> new HashSet<>()).add(NotEnoughUpdates.INSTANCE.manager.jsonToStack( + item, + false + )); } } } int i = 0; - outer:for (int key : map.descendingKeySet()) { + outer: + for (long key : map.descendingKeySet()) { Set items = map.get(key); for (ItemStack item : items) { bestItems[i] = item; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/MiningPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/MiningPage.java index c4c788e7..c32310b7 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/MiningPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/MiningPage.java @@ -22,12 +22,9 @@ package io.github.moulberry.notenoughupdates.profileviewer; import com.google.common.collect.Lists; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Objects; -import java.util.function.Supplier; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderHelper; @@ -39,6 +36,11 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Objects; +import java.util.function.Supplier; + public class MiningPage extends GuiProfileViewerPage { public static final ResourceLocation pv_mining = new ResourceLocation("notenoughupdates:pv_mining.png"); @@ -222,28 +224,28 @@ public class MiningPage extends GuiProfileViewerPage { //Powder Utils.renderAlignedString( EnumChatFormatting.DARK_GREEN + "Mithril Powder", - EnumChatFormatting.WHITE + GuiProfileViewer.shortNumberFormat(mithrilPowder, 0), + EnumChatFormatting.WHITE + StringUtils.shortNumberFormat(mithrilPowder), guiLeft + xStart, guiTop + yStartTop + 24, 115 ); Utils.renderAlignedString( EnumChatFormatting.LIGHT_PURPLE + "Gemstone Powder", - EnumChatFormatting.WHITE + GuiProfileViewer.shortNumberFormat(gemstonePowder, 0), + EnumChatFormatting.WHITE + StringUtils.shortNumberFormat(gemstonePowder), guiLeft + xStart, guiTop + yStartTop + 44, 115 ); Utils.renderAlignedString( EnumChatFormatting.DARK_GREEN + "Total Mithril Powder", - EnumChatFormatting.WHITE + GuiProfileViewer.shortNumberFormat(mithrilPowderTotal + mithrilPowder, 0), + EnumChatFormatting.WHITE + StringUtils.shortNumberFormat(mithrilPowderTotal + mithrilPowder), guiLeft + xStart, guiTop + yStartTop + 34, 115 ); Utils.renderAlignedString( EnumChatFormatting.LIGHT_PURPLE + "Total Gemstone Powder", - EnumChatFormatting.WHITE + GuiProfileViewer.shortNumberFormat(gemstonePowderTotal + gemstonePowder, 0), + EnumChatFormatting.WHITE + StringUtils.shortNumberFormat(gemstonePowderTotal + gemstonePowder), guiLeft + xStart, guiTop + yStartTop + 54, 115 @@ -300,7 +302,7 @@ public class MiningPage extends GuiProfileViewerPage { ); Utils.renderAlignedString( EnumChatFormatting.BLUE + "Total Placed Crystals:", - EnumChatFormatting.WHITE + GuiProfileViewer.shortNumberFormat(crystalPlacedAmount, 0), + EnumChatFormatting.WHITE + StringUtils.shortNumberFormat(crystalPlacedAmount), guiLeft + xStart, guiTop + yStartTop + 149, 110 diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PetsPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PetsPage.java index 4214371c..25751ab8 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PetsPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PetsPage.java @@ -24,17 +24,10 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.SBInfo; import io.github.moulberry.notenoughupdates.util.Utils; -import java.awt.*; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Base64; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.GlStateManager; @@ -50,6 +43,15 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; +import java.awt.*; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Base64; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + public class PetsPage extends GuiProfileViewerPage { public static final ResourceLocation pv_pets = new ResourceLocation("notenoughupdates:pv_pets.png"); @@ -497,21 +499,21 @@ public class PetsPage extends GuiProfileViewerPage { Utils.renderAlignedString( EnumChatFormatting.YELLOW + "Total XP", - EnumChatFormatting.WHITE + GuiProfileViewer.shortNumberFormat(exp, 0), + EnumChatFormatting.WHITE + StringUtils.shortNumberFormat(exp), guiLeft + 319, guiTop + 125, 98 ); Utils.renderAlignedString( EnumChatFormatting.YELLOW + "Current LVL XP", - EnumChatFormatting.WHITE + GuiProfileViewer.shortNumberFormat((level % 1) * currentLevelRequirement, 0), + EnumChatFormatting.WHITE + StringUtils.shortNumberFormat((level % 1) * currentLevelRequirement), guiLeft + 319, guiTop + 143, 98 ); Utils.renderAlignedString( EnumChatFormatting.YELLOW + "Required LVL XP", - EnumChatFormatting.WHITE + GuiProfileViewer.shortNumberFormat(currentLevelRequirement, 0), + EnumChatFormatting.WHITE + StringUtils.shortNumberFormat(currentLevelRequirement), guiLeft + 319, guiTop + 161, 98 diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java index 3dc97a85..efa94ee5 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java @@ -21,16 +21,12 @@ package io.github.moulberry.notenoughupdates.profileviewer.bestiary; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewerPage; import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; -import java.awt.*; -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.GlStateManager; @@ -40,6 +36,12 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; +import java.awt.*; +import java.text.NumberFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + public class BestiaryPage extends GuiProfileViewerPage { public static final ResourceLocation pv_elements = new ResourceLocation("notenoughupdates:pv_elements.png"); @@ -200,10 +202,10 @@ public class BestiaryPage extends GuiProfileViewerPage { if (level.maxed) { progressStr = EnumChatFormatting.GOLD + "MAXED!"; } else { - progressStr = EnumChatFormatting.AQUA + - GuiProfileViewer.shortNumberFormat(Math.round((levelNum % 1) * level.maxXpForLevel), 0) + + progressStr =EnumChatFormatting.AQUA + + StringUtils.shortNumberFormat(Math.round((levelNum % 1) * level.maxXpForLevel)) + "/" + - GuiProfileViewer.shortNumberFormat(level.maxXpForLevel, 0); + StringUtils.shortNumberFormat(level.maxXpForLevel); } tooltipToDisplay.add(EnumChatFormatting.GRAY + "Progress: " + progressStr); } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/Calculator.java b/src/main/java/io/github/moulberry/notenoughupdates/util/Calculator.java index 7d378a03..10bfa6a9 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/Calculator.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/Calculator.java @@ -25,10 +25,12 @@ import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List; +import java.util.Locale; import java.util.NoSuchElementException; public class Calculator { public static BigDecimal calculate(String source) throws CalculatorException { + source = source.toLowerCase(Locale.ROOT); return evaluate(shuntingYard(lex(source))); } diff --git a/src/main/resources/mixins.notenoughupdates.json b/src/main/resources/mixins.notenoughupdates.json index ed1ba55a..0a547b4b 100644 --- a/src/main/resources/mixins.notenoughupdates.json +++ b/src/main/resources/mixins.notenoughupdates.json @@ -40,6 +40,7 @@ "MixinRenderGlobal", "MixinRenderItem", "MixinRenderList", + "MixinSkyclientCosmetics", "MixinTextureManager", "MixinTileEntitySkullRenderer", "MixinTileEntitySpecialRenderer", -- cgit From 47af0b3eee70a5c8d7c86fff19155a97a9204708 Mon Sep 17 00:00:00 2001 From: efefury <69400149+efefury@users.noreply.github.com> Date: Sun, 11 Sep 2022 09:31:27 +0000 Subject: cleaned up neu overlay (#241) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * made equipment overlay own class lmk if there's any bugs * fix infer (i think) * fuck infer * First refactoringering * Fix more stuff * itemlisting * NEU 3.0 release notes * fixed nea bug https://imgur.com/a/Sg3iw74 * whitespace * fixed equipment overlay not working ? and caching * nopoing idk what im doing * FHJNX GHD trwsmokürtsew tze jiozterdgjjiüzetr jipztr * Revert "FHJNX GHD" This reverts commit 24eceba3db5e500be296f5a96412bd8b95647a22. * Revert "nopoing" This reverts commit bee07cb98f8b9672c2e1bc192c6c3e5ae8b02b95. * Revert "fixed equipment overlay" This reverts commit b15376f934a738900e2dd98efdb0d4a7ec131dfa. * idk i think this works maybe * ??? ????????? * no more black lines * equipment cache * Fix lag with optifine and removal of unused field. Removed onMouseClick as it was triggered more than once per tick when optifine is installed. Removed tooltipsToDisplay field (as it was replaced by a local variable). * this should be true by default to keep old behaviour * itemList now doesn't close when clicking the searchbar itemList will now only close when searchMode is triggered. * Infer moment hoping this doesn't trigger it. Co-authored-by: nea Co-authored-by: Lulonaut Co-authored-by: Ascynx <78341107+Ascynx@users.noreply.github.com> Co-authored-by: nopo Co-authored-by: Ascynx Co-authored-by: Roman / Linnea Gräf Co-authored-by: Lorenz --- Update Notes/2.1.md | 1 + .../moulberry/notenoughupdates/NEUOverlay.java | 440 +-------------------- .../notenoughupdates/NotEnoughUpdates.java | 10 +- .../events/GuiInventoryBackgroundDrawnEvent.java | 40 ++ .../notenoughupdates/listener/RenderListener.java | 13 +- .../miscfeatures/PetInfoOverlay.java | 36 +- .../notenoughupdates/mixins/MixinGuiInventory.java | 7 + .../options/seperateSections/Itemlist.java | 9 + .../overlays/EquipmentOverlay.java | 431 ++++++++++++++++++++ .../moulberry/notenoughupdates/util/ItemUtils.java | 7 + 10 files changed, 543 insertions(+), 451 deletions(-) create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/events/GuiInventoryBackgroundDrawnEvent.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/overlays/EquipmentOverlay.java (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 050eaa93..b820ee79 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -117,6 +117,7 @@ - Added profit per score/XP to RNG meter - hannibal2 - Added showing the amount of dungeon runs or slayer bosses needed for the rng meter to fill up - hannibal2 - Added bazaar prices to enchants in the enchantment table - hannibal2 / nea89 +- Added an option to not open the item list when searching containers - Lulonaut ### **Bug Fixes:** diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java index 18be69e6..308bd63e 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java @@ -23,7 +23,6 @@ import com.google.common.collect.Lists; 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.CustomAHGui; import io.github.moulberry.notenoughupdates.core.BackgroundBlur; import io.github.moulberry.notenoughupdates.core.GuiScreenElementWrapper; @@ -37,7 +36,6 @@ import io.github.moulberry.notenoughupdates.mbgui.MBGuiElement; import io.github.moulberry.notenoughupdates.mbgui.MBGuiGroupAligned; import io.github.moulberry.notenoughupdates.mbgui.MBGuiGroupFloating; import io.github.moulberry.notenoughupdates.miscfeatures.EnchantingSolvers; -import io.github.moulberry.notenoughupdates.miscfeatures.PetInfoOverlay; import io.github.moulberry.notenoughupdates.miscfeatures.SunTzu; import io.github.moulberry.notenoughupdates.miscgui.GuiPriceGraph; import io.github.moulberry.notenoughupdates.miscgui.NeuSearchCalculator; @@ -46,17 +44,13 @@ 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.SBInfo; import io.github.moulberry.notenoughupdates.util.SpecialColour; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.Gui; -import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiTextField; -import net.minecraft.client.gui.inventory.GuiChest; import net.minecraft.client.gui.inventory.GuiContainer; -import net.minecraft.client.gui.inventory.GuiInventory; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderHelper; @@ -72,8 +66,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityLivingBase; import net.minecraft.init.Items; -import net.minecraft.inventory.ContainerChest; -import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -101,7 +93,6 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Set; import java.util.TreeSet; import java.util.UUID; @@ -120,48 +111,6 @@ public class NEUOverlay extends Gui { private static final ResourceLocation SEARCH_BAR = new ResourceLocation("notenoughupdates:search_bar.png"); private static final ResourceLocation SEARCH_BAR_GOLD = new ResourceLocation("notenoughupdates:search_bar_gold.png"); - private static final ResourceLocation ARMOR_DISPLAY = new ResourceLocation( - "notenoughupdates:armordisplay/armordisplay.png"); - private static final ResourceLocation ARMOR_DISPLAY_GREY = new ResourceLocation( - "notenoughupdates:armordisplay/armordisplay_grey.png"); - private static final ResourceLocation ARMOR_DISPLAY_DARK = new ResourceLocation( - "notenoughupdates:armordisplay/armordisplay_phq_dark.png"); - private static final ResourceLocation ARMOR_DISPLAY_FSR = new ResourceLocation( - "notenoughupdates:armordisplay/armordisplay_fsr.png"); - private static final ResourceLocation ARMOR_DISPLAY_TRANSPARENT = new ResourceLocation( - "notenoughupdates:armordisplay/armordisplay_transparent.png"); - private static final ResourceLocation ARMOR_DISPLAY_TRANSPARENT_PET = new ResourceLocation( - "notenoughupdates:armordisplay/armordisplay_transparent_pet.png"); - - private static final ResourceLocation QUESTION_MARK = new ResourceLocation("notenoughupdates:pv_unknown.png"); - - private static final ResourceLocation PET_DISPLAY = new ResourceLocation( - "notenoughupdates:petdisplay/petdisplaysolo.png"); - private static final ResourceLocation PET_DISPLAY_GREY = new ResourceLocation( - "notenoughupdates:petdisplay/petdisplaysolo_dark.png"); - private static final ResourceLocation PET_DISPLAY_DARK = new ResourceLocation( - "notenoughupdates:petdisplay/petdisplaysolo_phqdark.png"); - private static final ResourceLocation PET_DISPLAY_FSR = new ResourceLocation( - "notenoughupdates:petdisplay/petdisplaysolo_fsr.png"); - private static final ResourceLocation PET_DISPLAY_TRANSPARENT = new ResourceLocation( - "notenoughupdates:petdisplay/petdisplaysolo_transparent.png"); - - private static final ResourceLocation PET_ARMOR_DISPLAY = new ResourceLocation( - "notenoughupdates:petdisplay/petdisplayarmor.png"); - private static final ResourceLocation PET_ARMOR_DISPLAY_GREY = new ResourceLocation( - "notenoughupdates:petdisplay/petdisplayarmor_dark.png"); - private static final ResourceLocation PET_ARMOR_DISPLAY_DARK = new ResourceLocation( - "notenoughupdates:petdisplay/petdisplayarmor_phqdark.png"); - private static final ResourceLocation PET_ARMOR_DISPLAY_FSR = new ResourceLocation( - "notenoughupdates:petdisplay/petdisplayarmor_fsr.png"); - private static final ResourceLocation PET_ARMOR_DISPLAY_TRANSPARENT = new ResourceLocation( - "notenoughupdates:petdisplay/petdisplayarmor_transparent.png"); - - private static boolean renderingArmorHud; - private static boolean renderingPetHud; - public static boolean shouldUseCachedPet; - public static long cachedPetTimer; - private final NEUManager manager; private final String mobRegex = ".*?((_MONSTER)|(_NPC)|(_ANIMAL)|(_MINIBOSS)|(_BOSS)|(_SC))$"; @@ -217,6 +166,7 @@ public class NEUOverlay extends Gui { private List selectedItemGroup = null; private boolean itemPaneOpen = false; + private long itemPaneShouldOpen = -1; private int page = 0; @@ -292,12 +242,14 @@ public class NEUOverlay extends Gui { } if (Mouse.getEventButtonState()) { setSearchBarFocus(true); + if (Mouse.getEventButton() == 1) { //Right mouse button down textField.setText(""); updateSearch(); } else { if (System.currentTimeMillis() - millisLastLeftClick < 300) { searchMode = !searchMode; + itemPaneShouldOpen = -1; lastSearchMode = System.currentTimeMillis(); if (searchMode && NotEnoughUpdates.INSTANCE.config.hidden.firstTimeSearchFocus) { NotificationHandler.displayNotification(Lists.newArrayList( @@ -1836,85 +1788,6 @@ public class NEUOverlay extends Gui { int guiScaleLast = 0; private boolean showVanillaLast = false; - - private boolean wardrobeOpen = false; - - private boolean isInNamedGui(String guiName) { - GuiScreen guiScreen = Minecraft.getMinecraft().currentScreen; - if (guiScreen instanceof GuiChest) { - GuiChest chest = (GuiChest) Minecraft.getMinecraft().currentScreen; - ContainerChest container = (ContainerChest) chest.inventorySlots; - IInventory lower = container.getLowerChestInventory(); - String containerName = lower.getDisplayName().getUnformattedText(); - wardrobeOpen = containerName.contains(guiName); - } - if (guiScreen instanceof GuiInventory) { - wardrobeOpen = false; - } - return wardrobeOpen; - } - - private ItemStack getChestSlotsAsItemStack(int slot) { - GuiScreen guiScreen = Minecraft.getMinecraft().currentScreen; - if (guiScreen instanceof GuiChest) { - GuiChest chest = (GuiChest) Minecraft.getMinecraft().currentScreen; - return chest.inventorySlots.getSlot(slot).getStack(); - } else { - return null; - } - } - - public ItemStack slot1 = null; - public ItemStack slot2 = null; - public ItemStack slot3 = null; - public ItemStack slot4 = null; - public ItemStack petSlot = null; - private String lastProfile; - - private ItemStack getWardrobeSlot(int armourSlot) { - if (SBInfo.getInstance().currentProfile == null) { - return null; - } - - if (!Objects.equals(SBInfo.getInstance().currentProfile, lastProfile)) { - lastProfile = SBInfo.getInstance().currentProfile; - slot1 = null; - slot2 = null; - slot3 = null; - slot4 = null; - petSlot = null; - } - - if (isInNamedGui("Your Equipment")) { - ItemStack itemStack = getChestSlotsAsItemStack(armourSlot); - if (itemStack != null) { - JsonObject itemToSave = NotEnoughUpdates.INSTANCE.manager.getJsonForItem(itemStack); - if (!itemToSave.has("internalname")) { - //would crash without internalName when trying to construct the ItemStack again - itemToSave.add("internalname", new JsonPrimitive("_")); - } - NotEnoughUpdates.INSTANCE.config.getProfileSpecific().savedEquipment.put(armourSlot, itemToSave); - return itemStack; - } - } else { - if (NotEnoughUpdates.INSTANCE.config.getProfileSpecific().savedEquipment.containsKey(armourSlot)) { - //don't use cache since the internalName is identical in most cases - return NotEnoughUpdates.INSTANCE.manager.jsonToStack(NotEnoughUpdates.INSTANCE.config.getProfileSpecific().savedEquipment - .get(armourSlot) - .getAsJsonObject(), false); - } - } - return null; - } - - public static boolean isRenderingArmorHud() { - return renderingArmorHud; - } - - public static boolean isRenderingPetHud() { - return renderingPetHud; - } - /** * Renders the search bar, quick commands, item selection (right), item info (left) and armor hud gui elements. */ @@ -1922,8 +1795,6 @@ public class NEUOverlay extends Gui { if (disabled) { return; } - renderingArmorHud = false; - renderingPetHud = false; GlStateManager.enableDepth(); FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; @@ -1984,6 +1855,13 @@ public class NEUOverlay extends Gui { (int) (fgFavourite2.getBlue() * 0.8f), fgFavourite2.getAlpha() ); + if (!NotEnoughUpdates.INSTANCE.config.itemlist.openWhenSearching && searchMode) { + itemPaneOpen = false; + } + if (itemPaneShouldOpen != -1 && System.currentTimeMillis() > itemPaneShouldOpen) { + itemPaneOpen = true; + itemPaneShouldOpen = -1; + } if (itemPaneOpen) { if (itemPaneTabOffset.getValue() == 0) { if (itemPaneOffsetFactor.getTarget() != 2 / 3f) { @@ -2321,7 +2199,6 @@ public class NEUOverlay extends Gui { GlStateManager.enableAlpha(); GlStateManager.alphaFunc(516, 0.1F); GlStateManager.disableLighting(); - renderInfoHuds(); Utils.pushGuiScale(-1); if (System.currentTimeMillis() - lastSearchMode > 120000 && @@ -2331,303 +2208,6 @@ 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), true); - Utils.drawItemStack(slot2, (int) ((width - 208) / 2f), (int) ((height + 60) / 2f - 105) + 18, true); - Utils.drawItemStack(slot3, (int) ((width - 208) / 2f), (int) ((height + 60) / 2f - 105) + 36, true); - Utils.drawItemStack(slot4, (int) ((width - 208) / 2f), (int) ((height + 60) / 2f - 105) + 54, true); - 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"); - } - } - } - } - - 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 - calculateTooltipXOffset(tooltipToDisplay, fr), - 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 - calculateTooltipXOffset(tooltipToDisplay, fr), - 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 - calculateTooltipXOffset(tooltipToDisplay, fr), - 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 - calculateTooltipXOffset(tooltipToDisplay, fr), - 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, true); - 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 - calculateTooltipXOffset(tooltipToDisplay, fr), - mouseY, - width, - height, - -1, - fr - ); - GL11.glTranslatef(0, 0, -80); - } - } - - } - } - } - } - } - - /** - * Calculates the width of the longest String in the tooltip, which can be used to offset the entire tooltip to the left more precisely - * - * @param tooltipToDisplay tooltip - * @param fr FontRenderer object - * @return offset to apply - */ - private int calculateTooltipXOffset(List tooltipToDisplay, FontRenderer fr) { - int offset = 0; - if (tooltipToDisplay != null) { - for (String line : tooltipToDisplay) { - int lineWidth = fr.getStringWidth(line); - if (lineWidth > offset) { - offset = lineWidth; - } - } - } - return offset + 20; - } - - 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. diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index 6732336c..c4b1bd77 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -66,6 +66,7 @@ import io.github.moulberry.notenoughupdates.miscgui.SignCalculator; import io.github.moulberry.notenoughupdates.miscgui.TrophyRewardOverlay; import io.github.moulberry.notenoughupdates.mixins.AccessorMinecraft; import io.github.moulberry.notenoughupdates.options.NEUConfig; +import io.github.moulberry.notenoughupdates.overlays.EquipmentOverlay; import io.github.moulberry.notenoughupdates.overlays.FuelBar; import io.github.moulberry.notenoughupdates.overlays.OverlayManager; import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; @@ -89,6 +90,7 @@ import net.minecraft.world.biome.BiomeGenHell; import net.minecraft.world.biome.BiomeGenJungle; import net.minecraft.world.biome.BiomeGenMesa; import net.minecraft.world.biome.BiomeGenSnow; +import net.minecraftforge.client.ClientCommandHandler; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.client.FMLClientHandler; import net.minecraftforge.fml.client.registry.ClientRegistry; @@ -243,7 +245,6 @@ public class NotEnoughUpdates { config.apiKey = null; } - //add the trophy fishing tab to the config if (config.profileViewer.pageLayout.size() == 8) { config.profileViewer.pageLayout.add(8); @@ -282,6 +283,7 @@ public class NotEnoughUpdates { MinecraftForge.EVENT_BUS.register(FishingHelper.getInstance()); MinecraftForge.EVENT_BUS.register(CrystalWishingCompassSolver.getInstance()); MinecraftForge.EVENT_BUS.register(new DwarvenMinesTextures()); + MinecraftForge.EVENT_BUS.register(EquipmentOverlay.INSTANCE); MinecraftForge.EVENT_BUS.register(CustomBiomes.INSTANCE); MinecraftForge.EVENT_BUS.register(new ChatListener(this)); MinecraftForge.EVENT_BUS.register(new ItemTooltipListener(this)); @@ -380,6 +382,12 @@ public class NotEnoughUpdates { } } + public void trySendCommand(String message) { + if (ClientCommandHandler.instance.executeCommand(Minecraft.getMinecraft().thePlayer, message) == 0) { + sendChatMessage(message); + } + } + public void displayLinks(JsonObject update, int totalWidth) { String discord_link = update.get("discord_link").getAsString(); String youtube_link = update.get("youtube_link").getAsString(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/events/GuiInventoryBackgroundDrawnEvent.java b/src/main/java/io/github/moulberry/notenoughupdates/events/GuiInventoryBackgroundDrawnEvent.java new file mode 100644 index 00000000..0b8bf126 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/events/GuiInventoryBackgroundDrawnEvent.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2022 NotEnoughUpdates contributors + * + * This file is part of NotEnoughUpdates. + * + * NotEnoughUpdates is free software: you can redistribute it + * and/or modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * NotEnoughUpdates is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with NotEnoughUpdates. If not, see . + */ + +package io.github.moulberry.notenoughupdates.events; + +import net.minecraft.client.gui.inventory.GuiContainer; + +public class GuiInventoryBackgroundDrawnEvent extends NEUEvent { + private final GuiContainer container; + private final float partialTicks; + + public GuiInventoryBackgroundDrawnEvent(GuiContainer container, float partialTicks) { + this.container = container; + this.partialTicks = partialTicks; + } + + public GuiContainer getContainer() { + return container; + } + + public float getPartialTicks() { + return partialTicks; + } +} 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 166e46d0..d4df7bfd 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java @@ -53,6 +53,7 @@ import io.github.moulberry.notenoughupdates.miscgui.TrophyRewardOverlay; 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.EquipmentOverlay; import io.github.moulberry.notenoughupdates.overlays.BazaarSearchOverlay; import io.github.moulberry.notenoughupdates.overlays.OverlayManager; import io.github.moulberry.notenoughupdates.overlays.RancherBootOverlay; @@ -534,12 +535,12 @@ public class RenderListener { x -= 68 - 200; } } - if (NEUOverlay.isRenderingArmorHud()) { + if (EquipmentOverlay.isRenderingArmorHud()) { if (x < guiLeft + xSize - 150 && x > guiLeft + xSize - 200 && y > guiTop && y < guiTop + 84) { x -= 25; } } - if (NEUOverlay.isRenderingPetHud()) { + if (EquipmentOverlay.isRenderingPetHud()) { if (x < guiLeft + xSize - 150 && x > guiLeft + xSize - 200 && y > guiTop + 60 && y < guiTop + 120) { x -= 25; } @@ -661,12 +662,12 @@ public class RenderListener { x -= 68 - 200; } } - if (NEUOverlay.isRenderingArmorHud()) { + if (EquipmentOverlay.isRenderingArmorHud()) { if (x < guiLeft + xSize - 150 && x > guiLeft + xSize - 200 && y > guiTop && y < guiTop + 84) { x -= 25; } } - if (NEUOverlay.isRenderingPetHud()) { + if (EquipmentOverlay.isRenderingPetHud()) { if (x < guiLeft + xSize - 150 && x > guiLeft + xSize - 200 && y > guiTop + 60 && y < guiTop + 120) { x -= 25; } @@ -1126,12 +1127,12 @@ public class RenderListener { x -= 68 - 200; } } - if (NEUOverlay.isRenderingArmorHud()) { + if (EquipmentOverlay.isRenderingArmorHud()) { if (x < guiLeft + xSize - 150 && x > guiLeft + xSize - 200 && y > guiTop && y < guiTop + 84) { x -= 25; } } - if (NEUOverlay.isRenderingPetHud()) { + if (EquipmentOverlay.isRenderingPetHud()) { if (x < guiLeft + xSize - 150 && x > guiLeft + xSize - 200 && y > guiTop + 60 && y < guiTop + 120) { x -= 25; } 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 90300bbc..f58ced51 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java @@ -26,13 +26,13 @@ import com.google.gson.JsonElement; import com.google.gson.JsonNull; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import io.github.moulberry.notenoughupdates.NEUOverlay; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.core.config.Position; import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.core.util.lerp.LerpUtils; import io.github.moulberry.notenoughupdates.listener.RenderListener; import io.github.moulberry.notenoughupdates.options.NEUConfig; +import io.github.moulberry.notenoughupdates.overlays.EquipmentOverlay; import io.github.moulberry.notenoughupdates.overlays.TextOverlay; import io.github.moulberry.notenoughupdates.overlays.TextOverlayStyle; import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; @@ -134,6 +134,12 @@ public class PetInfoOverlay extends TextOverlay { public String petXpType; public String petItem; public String skin; + + public String getPetId(boolean withoutBoost) { + return petType + ";" + (withoutBoost ? rarity.petId - 1 : rarity.petId); + + } + } public static class PetConfig { @@ -243,7 +249,8 @@ public class PetInfoOverlay extends TextOverlay { } private static Pet getClosestPet(String petType, int petId, String petItem, float petLevel) { - Set pets = config.petMap.values().stream().filter(pet -> pet.petType.equals(petType) && pet.rarity.petId == petId).collect( + Set pets = config.petMap.values().stream().filter(pet -> pet.petType.equals(petType) && + pet.rarity.petId == petId).collect( Collectors.toSet()); if (pets.isEmpty()) { @@ -254,7 +261,10 @@ public class PetInfoOverlay extends TextOverlay { return pets.iterator().next(); } - Set itemMatches = pets.stream().filter(pet -> Objects.equals(petItem, pet.petItem)).collect(Collectors.toSet()); + Set itemMatches = pets + .stream() + .filter(pet -> Objects.equals(petItem, pet.petItem)) + .collect(Collectors.toSet()); if (itemMatches.size() == 1) { return itemMatches.iterator().next(); @@ -452,11 +462,12 @@ public class PetInfoOverlay extends TextOverlay { } } - if (currentPet.petLevel.level < (currentPet.petLevel.maxLevel - 1) || !NotEnoughUpdates.INSTANCE.config.petOverlay.petOverlayText.contains(6)) { + if (currentPet.petLevel.level < (currentPet.petLevel.maxLevel - 1) || + !NotEnoughUpdates.INSTANCE.config.petOverlay.petOverlayText.contains(6)) { float remainingMax = currentPet.petLevel.maxXP - currentPet.petLevel.totalXp; if (remaining > 0) { if (xpGain < 1000) { - etaMaxStr = EnumChatFormatting.AQUA + "Until L" + currentPet.petLevel.maxLevel + ": " + + etaMaxStr = EnumChatFormatting.AQUA + "Until L" + currentPet.petLevel.maxLevel + ": " + EnumChatFormatting.YELLOW + "N/A"; } else { etaMaxStr = EnumChatFormatting.AQUA + "Until L" + currentPet.petLevel.maxLevel + ": " + @@ -563,7 +574,7 @@ public class PetInfoOverlay extends TextOverlay { JsonObject petInfo = new JsonParser().parse(ea.getString("petInfo")).getAsJsonObject(); petType = petInfo.get("type").getAsString(); rarity = Rarity.valueOf(petInfo.get("tier").getAsString()); - level = GuiProfileViewer. getPetLevel( + level = GuiProfileViewer.getPetLevel( petType, rarity.name(), Utils.getElementAsFloat(petInfo.get("exp"), 0) // Should only default if from item list and repo missing exp:0 @@ -782,7 +793,8 @@ public class PetInfoOverlay extends TextOverlay { if (currentPet.rarity.petId == 5) { mythicRarity = 4; } - JsonObject petItem = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(currentPet.skin != null ? currentPet.skin : (currentPet.petType + ";" + mythicRarity)); + JsonObject petItem = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get( + currentPet.skin != null ? currentPet.skin : (currentPet.petType + ";" + mythicRarity)); if (petItem != null) { Vector2f position = getPosition(overlayWidth, overlayHeight); int x = (int) position.x; @@ -799,7 +811,8 @@ public class PetInfoOverlay extends TextOverlay { Pet currentPet2 = getCurrentPet2(); if (currentPet2 != null) { - JsonObject petItem2 = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(currentPet2.skin != null ? currentPet2.skin : (currentPet2.petType + ";" + currentPet2.rarity.petId)); + JsonObject petItem2 = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get( + currentPet2.skin != null ? currentPet2.skin : (currentPet2.petType + ";" + currentPet2.rarity.petId)); if (petItem2 != null) { Vector2f position = getPosition(overlayWidth, overlayHeight); int x = (int) position.x; @@ -1037,12 +1050,7 @@ public class PetInfoOverlay extends TextOverlay { String chatMessage = Utils.cleanColour(event.message.getUnformattedText()); Matcher autopetMatcher = AUTOPET_EQUIP.matcher(event.message.getFormattedText()); - if (event.message.getUnformattedText().startsWith("You summoned your") || - System.currentTimeMillis() - NEUOverlay.cachedPetTimer < 500) { - NEUOverlay.cachedPetTimer = System.currentTimeMillis(); - NEUOverlay.shouldUseCachedPet = false; - } else if (autopetMatcher.matches()) { - NEUOverlay.shouldUseCachedPet = false; + if (autopetMatcher.matches()) { try { lastLevelHovered = Integer.parseInt(autopetMatcher.group(1)); } catch (NumberFormatException ignored) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiInventory.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiInventory.java index bd712ec7..86ed9b8f 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiInventory.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiInventory.java @@ -20,7 +20,9 @@ package io.github.moulberry.notenoughupdates.mixins; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.events.GuiInventoryBackgroundDrawnEvent; import io.github.moulberry.notenoughupdates.listener.RenderListener; +import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.gui.inventory.GuiInventory; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -36,4 +38,9 @@ public class MixinGuiInventory { ci.cancel(); } } + + @Inject(method = "drawGuiContainerBackgroundLayer", at = @At("TAIL")) + public void onDrawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY, CallbackInfo ci) { + new GuiInventoryBackgroundDrawnEvent((GuiContainer) (Object) this, partialTicks).post(); + } } 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 c83f370f..72a45930 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 @@ -51,6 +51,15 @@ public class Itemlist { @ConfigEditorBoolean public boolean keepopen = false; + @Expose + @ConfigOption( + name = "Open when searching", + desc = "Open the Itemlist when in container search mode by double clicking the search bar" + ) + @ConfigEditorBoolean + public boolean openWhenSearching = true; + + @Expose @ConfigOption( name = "Item Style", diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/EquipmentOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/EquipmentOverlay.java new file mode 100644 index 00000000..1bf61ad8 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/EquipmentOverlay.java @@ -0,0 +1,431 @@ +/* + * 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.overlays; + +import com.google.common.collect.Lists; +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.events.GuiInventoryBackgroundDrawnEvent; +import io.github.moulberry.notenoughupdates.miscfeatures.PetInfoOverlay; +import io.github.moulberry.notenoughupdates.mixins.AccessorGuiContainer; +import io.github.moulberry.notenoughupdates.options.NEUConfig; +import io.github.moulberry.notenoughupdates.util.ItemUtils; +import io.github.moulberry.notenoughupdates.util.SBInfo; +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.GuiChest; +import net.minecraft.client.gui.inventory.GuiInventory; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.inventory.ContainerChest; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.GuiScreenEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import net.minecraftforge.fml.relauncher.Side; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class EquipmentOverlay { + public static EquipmentOverlay INSTANCE = new EquipmentOverlay(); + + // + private static final ResourceLocation ARMOR_DISPLAY = new ResourceLocation( + "notenoughupdates:armordisplay/armordisplay.png"); + private static final ResourceLocation ARMOR_DISPLAY_GREY = new ResourceLocation( + "notenoughupdates:armordisplay/armordisplay_grey.png"); + private static final ResourceLocation ARMOR_DISPLAY_DARK = new ResourceLocation( + "notenoughupdates:armordisplay/armordisplay_phq_dark.png"); + private static final ResourceLocation ARMOR_DISPLAY_FSR = new ResourceLocation( + "notenoughupdates:armordisplay/armordisplay_fsr.png"); + private static final ResourceLocation ARMOR_DISPLAY_TRANSPARENT = new ResourceLocation( + "notenoughupdates:armordisplay/armordisplay_transparent.png"); + private static final ResourceLocation ARMOR_DISPLAY_TRANSPARENT_PET = new ResourceLocation( + "notenoughupdates:armordisplay/armordisplay_transparent_pet.png"); + + private static final ResourceLocation QUESTION_MARK = new ResourceLocation("notenoughupdates:pv_unknown.png"); + + private static final ResourceLocation PET_DISPLAY = new ResourceLocation( + "notenoughupdates:petdisplay/petdisplaysolo.png"); + private static final ResourceLocation PET_DISPLAY_GREY = new ResourceLocation( + "notenoughupdates:petdisplay/petdisplaysolo_dark.png"); + private static final ResourceLocation PET_DISPLAY_DARK = new ResourceLocation( + "notenoughupdates:petdisplay/petdisplaysolo_phqdark.png"); + private static final ResourceLocation PET_DISPLAY_FSR = new ResourceLocation( + "notenoughupdates:petdisplay/petdisplaysolo_fsr.png"); + private static final ResourceLocation PET_DISPLAY_TRANSPARENT = new ResourceLocation( + "notenoughupdates:petdisplay/petdisplaysolo_transparent.png"); + + private static final ResourceLocation PET_ARMOR_DISPLAY = new ResourceLocation( + "notenoughupdates:petdisplay/petdisplayarmor.png"); + private static final ResourceLocation PET_ARMOR_DISPLAY_GREY = new ResourceLocation( + "notenoughupdates:petdisplay/petdisplayarmor_dark.png"); + private static final ResourceLocation PET_ARMOR_DISPLAY_DARK = new ResourceLocation( + "notenoughupdates:petdisplay/petdisplayarmor_phqdark.png"); + private static final ResourceLocation PET_ARMOR_DISPLAY_FSR = new ResourceLocation( + "notenoughupdates:petdisplay/petdisplayarmor_fsr.png"); + private static final ResourceLocation PET_ARMOR_DISPLAY_TRANSPARENT = new ResourceLocation( + "notenoughupdates:petdisplay/petdisplayarmor_transparent.png"); + // + + // + public ResourceLocation getCustomEquipmentTexture(boolean isPetRendering) { + switch (NotEnoughUpdates.INSTANCE.config.customArmour.colourStyle) { + case 0: + return ARMOR_DISPLAY; + case 1: + return ARMOR_DISPLAY_GREY; + case 2: + return ARMOR_DISPLAY_DARK; + case 3: + return isPetRendering ? ARMOR_DISPLAY_TRANSPARENT_PET : ARMOR_DISPLAY_TRANSPARENT; + case 4: + return ARMOR_DISPLAY_FSR; + } + return null; + } + + public ResourceLocation getCustomPetTexture(boolean isArmorRendering) { + switch (NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle) { + case 0: + return isArmorRendering ? PET_ARMOR_DISPLAY : PET_DISPLAY; + case 1: + return isArmorRendering ? PET_ARMOR_DISPLAY_GREY : PET_DISPLAY_GREY; + case 2: + return isArmorRendering ? PET_ARMOR_DISPLAY_DARK : PET_DISPLAY_DARK; + case 3: + return isArmorRendering ? PET_ARMOR_DISPLAY_TRANSPARENT : PET_DISPLAY_TRANSPARENT; + case 4: + return isArmorRendering ? PET_ARMOR_DISPLAY_FSR : PET_DISPLAY_FSR; + } + return null; + } + // + + // + public static final int EQUIPMENT_SLOT_OFFSET_Y = 8; + public static final int ARMOR_OVERLAY_OVERHAND_WIDTH = 24; + public static final int ARMOR_OVERLAY_HEIGHT = 86; + public static final int ARMOR_OVERLAY_WIDTH = 31; + public static final int PET_OVERLAY_OFFSET_Y = ARMOR_OVERLAY_HEIGHT - 14 /* overlaying pixels */; + // + + public boolean isRenderingPet; + + public boolean shouldRenderPets; + public boolean shouldRenderArmorHud; + + public ItemStack petStack; + + // + + @SubscribeEvent + public void onGuiTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.START || event.side != Side.CLIENT) return; + updateGuiInfo(Minecraft.getMinecraft().currentScreen); + } + + @SubscribeEvent + public void onGuiInit(GuiScreenEvent.InitGuiEvent event) { + updateGuiInfo(event.gui); + } + + @SubscribeEvent + public void onRenderGuiPost(GuiInventoryBackgroundDrawnEvent event) { + if (!(event.getContainer() instanceof GuiInventory)) return; + GuiInventory inventory = ((GuiInventory) event.getContainer()); + renderGuis(inventory); + } + + // + + public void renderGuis(GuiInventory inventory) { + 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; + + GL11.glColor4f(1F, 1F, 1F, 1F); + if (shouldRenderArmorHud) { + renderEquipmentGui(inventory, mouseX, mouseY, width, height); + } + + if (shouldRenderPets) { + renderPets(inventory, mouseX, mouseY, width, height); + } + } + + public void renderEquipmentGui(GuiInventory guiScreen, int mouseX, int mouseY, int width, int height) { + AccessorGuiContainer container = ((AccessorGuiContainer) guiScreen); + + int overlayLeft = container.getGuiLeft() - ARMOR_OVERLAY_OVERHAND_WIDTH; + int overlayTop = container.getGuiTop(); + + ResourceLocation equipmentTexture = getCustomEquipmentTexture(isRenderingPet); + Minecraft.getMinecraft().getTextureManager().bindTexture(equipmentTexture); + + Utils.drawTexturedRect(overlayLeft, overlayTop, ARMOR_OVERLAY_WIDTH, ARMOR_OVERLAY_HEIGHT, GL11.GL_NEAREST); + + List tooltipToDisplay = new ArrayList<>(); + drawSlot(slot1, overlayLeft + 8, overlayTop + EQUIPMENT_SLOT_OFFSET_Y, mouseX, mouseY, tooltipToDisplay); + drawSlot(slot2, overlayLeft + 8, overlayTop + EQUIPMENT_SLOT_OFFSET_Y + 18, mouseX, mouseY, tooltipToDisplay); + drawSlot(slot3, overlayLeft + 8, overlayTop + EQUIPMENT_SLOT_OFFSET_Y + 36, mouseX, mouseY, tooltipToDisplay); + drawSlot(slot4, overlayLeft + 8, overlayTop + EQUIPMENT_SLOT_OFFSET_Y + 54, mouseX, mouseY, tooltipToDisplay); + + if (slot1 == null) { + Minecraft.getMinecraft().getTextureManager().bindTexture(QUESTION_MARK); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(overlayLeft + 8, overlayTop + EQUIPMENT_SLOT_OFFSET_Y, 16, 16, GL11.GL_NEAREST); + + tooltipToDisplay = Lists.newArrayList( + EnumChatFormatting.RED + "Warning", + EnumChatFormatting.GREEN + "You need to open /equipment", + EnumChatFormatting.GREEN + "to cache your armour" + ); + if (Utils.isWithinRect(mouseX, mouseY, overlayLeft + 8, overlayTop + 8, 16, 16) + && NotEnoughUpdates.INSTANCE.config.customArmour.sendWardrobeCommand + && Mouse.getEventButtonState() + && Minecraft.getMinecraft().thePlayer.inventory.getItemStack() == null) { + NotEnoughUpdates.INSTANCE.trySendCommand("/equipment"); + } + + } + if (tooltipToDisplay.size() > 0 && + Utils.isWithinRect( + mouseX, mouseY, + overlayLeft, overlayTop, + ARMOR_OVERLAY_OVERHAND_WIDTH, ARMOR_OVERLAY_HEIGHT + )) { + Utils.drawHoveringText( + tooltipToDisplay, + mouseX - calculateTooltipXOffset(tooltipToDisplay, Minecraft.getMinecraft().fontRendererObj), + mouseY, + width, + height, + -1, + Minecraft.getMinecraft().fontRendererObj + ); + } + + } + + private ItemStack getRepoPetStack() { + NEUManager manager = NotEnoughUpdates.INSTANCE.manager; + PetInfoOverlay.Pet currentPet = PetInfoOverlay.getCurrentPet(); + if (currentPet == null) return null; + ItemStack item = manager.createItem(currentPet.getPetId(false)); + if (item != null) { + return item; + } + item = manager.createItem(currentPet.getPetId(true)); + return item; + } + + private void updateGuiInfo(GuiScreen screen) { + if (getWardrobeSlot(10) != null) { + slot1 = getWardrobeSlot(10); + slot2 = getWardrobeSlot(19); + slot3 = getWardrobeSlot(28); + slot4 = getWardrobeSlot(37); + } + + if (screen instanceof GuiChest) { + petStack = getRepoPetStack(); + } + if (!(screen instanceof GuiInventory) + || !NotEnoughUpdates.INSTANCE.config.misc.hidePotionEffect + || !NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard()) { + shouldRenderPets = shouldRenderArmorHud = false; + return; + } + shouldRenderPets = NotEnoughUpdates.INSTANCE.config.petOverlay.petInvDisplay && petStack != null; + shouldRenderArmorHud = NotEnoughUpdates.INSTANCE.config.customArmour.enableArmourHud; + } + + private void drawSlot(ItemStack stack, int x, int y, int mouseX, int mouseY, List tooltip) { + if (stack == null) return; + Utils.drawItemStack(stack, x, y, true); + if (Utils.isWithinRect(mouseX, mouseY, x, y, 16, 16)) { + List tt = stack.getTooltip(Minecraft.getMinecraft().thePlayer, false); + if (shouldShowEquipmentTooltip(tt)) + tooltip.addAll(tt); + if (NotEnoughUpdates.INSTANCE.config.customArmour.sendWardrobeCommand + && Mouse.getEventButtonState()) { + NotEnoughUpdates.INSTANCE.trySendCommand("/equipment"); + } + } + } + + public void renderPets(GuiInventory inventory, int mouseX, int mouseY, int width, int height) { + ItemUtils.getOrCreateTag(petStack).setBoolean( + "NEUHIDEPETTOOLTIP", + NotEnoughUpdates.INSTANCE.config.petOverlay.hidePetTooltip + ); + ItemStack petInfo = petStack; + + ResourceLocation customPetTexture = getCustomPetTexture(isRenderingArmorHud()); + Minecraft.getMinecraft().getTextureManager().bindTexture(customPetTexture); + GlStateManager.color(1, 1, 1, 1); + + AccessorGuiContainer container = ((AccessorGuiContainer) inventory); + + int overlayLeft = container.getGuiLeft() - ARMOR_OVERLAY_OVERHAND_WIDTH; + int overlayTop = container.getGuiTop() + PET_OVERLAY_OFFSET_Y; + + Utils.drawTexturedRect(overlayLeft, overlayTop, 31, 32, GL11.GL_NEAREST); + GlStateManager.bindTexture(0); + + Utils.drawItemStack(petInfo, overlayLeft + 8, overlayTop + 8, true); + + List tooltipToDisplay; + if (Utils.isWithinRect(mouseX, mouseY, overlayLeft + 8, overlayTop + 8, 16, 16)) { + if (NotEnoughUpdates.INSTANCE.config.petOverlay.sendPetsCommand + && Minecraft.getMinecraft().thePlayer.inventory.getItemStack() == null + && Mouse.getEventButtonState()) { + NotEnoughUpdates.INSTANCE.trySendCommand("/pets"); + } + tooltipToDisplay = petInfo.getTooltip(Minecraft.getMinecraft().thePlayer, false); + Utils.drawHoveringText( + tooltipToDisplay, + mouseX - calculateTooltipXOffset(tooltipToDisplay, Minecraft.getMinecraft().fontRendererObj), + mouseY, + width, + height, + -1, + Minecraft.getMinecraft().fontRendererObj + ); + } + } + + private ItemStack getWardrobeSlot(int armourSlot) { + if (SBInfo.getInstance().currentProfile == null) { + return null; + } + + if (!Objects.equals(SBInfo.getInstance().currentProfile, lastProfile)) { + lastProfile = SBInfo.getInstance().currentProfile; + slot1 = null; + slot2 = null; + slot3 = null; + slot4 = null; + } + + NEUConfig.HiddenProfileSpecific profileSpecific = NotEnoughUpdates.INSTANCE.config.getProfileSpecific(); + if (profileSpecific == null) return null; + + if (isInNamedGui("Your Equipment")) { + ItemStack itemStack = getChestSlotsAsItemStack(armourSlot); + if (itemStack != null) { + JsonObject itemToSave = NotEnoughUpdates.INSTANCE.manager.getJsonForItem(itemStack); + if (!itemToSave.has("internalname")) { + //would crash without internalName when trying to construct the ItemStack again + itemToSave.add("internalname", new JsonPrimitive("_")); + } + profileSpecific.savedEquipment.put(armourSlot, itemToSave); + return itemStack; + } + } else { + if (profileSpecific.savedEquipment.containsKey(armourSlot)) { + //don't use cache since the internalName is identical in most cases + JsonObject jsonObject = profileSpecific.savedEquipment + .get(armourSlot); + if (jsonObject != null) return NotEnoughUpdates.INSTANCE.manager.jsonToStack(jsonObject + .getAsJsonObject(), false); + } + } + return null; + } + + private boolean wardrobeOpen = false; + + private boolean isInNamedGui(String guiName) { + GuiScreen guiScreen = Minecraft.getMinecraft().currentScreen; + if (guiScreen instanceof GuiChest) { + GuiChest chest = (GuiChest) Minecraft.getMinecraft().currentScreen; + ContainerChest container = (ContainerChest) chest.inventorySlots; + IInventory lower = container.getLowerChestInventory(); + String containerName = lower.getDisplayName().getUnformattedText(); + wardrobeOpen = containerName.contains(guiName); + } + if (guiScreen instanceof GuiInventory) { + wardrobeOpen = false; + } + return wardrobeOpen; + } + + private ItemStack getChestSlotsAsItemStack(int slot) { + GuiScreen guiScreen = Minecraft.getMinecraft().currentScreen; + if (guiScreen instanceof GuiChest) { + GuiChest chest = (GuiChest) Minecraft.getMinecraft().currentScreen; + return chest.inventorySlots.getSlot(slot).getStack(); + } else { + return null; + } + } + + public static boolean isRenderingArmorHud() { + return INSTANCE.shouldRenderArmorHud; + } + + public static boolean isRenderingPetHud() { + return INSTANCE.shouldRenderPets; + } + + private boolean shouldShowEquipmentTooltip(List toolTip) { + return !toolTip.get(0).equals("§o§7Empty Equipment Slot§r"); + } + + /** + * Calculates the width of the longest String in the tooltip, which can be used to offset the entire tooltip to the left more precisely + * + * @param tooltipToDisplay tooltip + * @param fr FontRenderer object + * @return offset to apply + */ + private int calculateTooltipXOffset(List tooltipToDisplay, FontRenderer fr) { + int offset = 0; + if (tooltipToDisplay != null) { + for (String line : tooltipToDisplay) { + int lineWidth = fr.getStringWidth(line); + if (lineWidth > offset) { + offset = lineWidth; + } + } + } + return offset + 20; + } + + public ItemStack slot1 = null; + public ItemStack slot2 = null; + public ItemStack slot3 = null; + public ItemStack slot4 = null; + private String lastProfile; + +} 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 cffdd164..ad8a6c98 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java @@ -57,6 +57,13 @@ public class ItemUtils { return skull; } + public static NBTTagCompound getOrCreateTag(ItemStack is) { + if (is.hasTagCompound()) return is.getTagCompound(); + NBTTagCompound nbtTagCompound = new NBTTagCompound(); + is.setTagCompound(nbtTagCompound); + return nbtTagCompound; + } + public static void appendLore(ItemStack is, List moreLore) { NBTTagCompound tagCompound = is.getTagCompound(); if (tagCompound == null) { -- cgit From ef557a6f4dff5ed9ce13f26f41b55c60008e8eae Mon Sep 17 00:00:00 2001 From: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> Date: Sun, 11 Sep 2022 22:11:26 +1000 Subject: fixed backpacks when dont have fairy soul req (#264) --- Update Notes/2.1.md | 1 + .../miscfeatures/StorageManager.java | 8 ++-- .../notenoughupdates/miscgui/StorageOverlay.java | 2 +- .../notenoughupdates/overlays/MiningOverlay.java | 1 + .../profileviewer/GuiProfileViewer.java | 45 +++++++++++++++++----- .../profileviewer/bestiary/BestiaryPage.java | 17 +++++--- 6 files changed, 54 insertions(+), 20 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index b820ee79..9c73e649 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -148,6 +148,7 @@ - Fixed shortened damage - nopo - Fixed bazaar prices sorting order in neu item list - hannibal2 - Fixed priceless items showing first in the missing tab of the accessory bag overlay - nopo +- Fixed storage gui when having locked backpack slots - nopo ### **Other:** 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 680637f2..cc463308 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/StorageManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/StorageManager.java @@ -38,6 +38,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.gui.inventory.GuiChest; import net.minecraft.init.Blocks; +import net.minecraft.init.Items; import net.minecraft.inventory.ContainerChest; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; @@ -555,8 +556,8 @@ public class StorageManager { int index = slot - 9; boolean changed = false; - if (stack.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane) && - stack.getMetadata() == 14) { + if ((stack.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane) && + stack.getMetadata() == 14) || (stack.getItem() == Items.dye && stack.getMetadata() == 8)) { if (storagePresent[index]) changed = true; storagePresent[index] = false; removePage(index); @@ -596,7 +597,8 @@ public class StorageManager { boolean changed = false; - if (stack.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane)) { + if (stack.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane) + || (stack.getItem() == Items.dye && stack.getMetadata() == 8)) { if (storagePresent[index]) changed = true; storagePresent[index] = false; removePage(index); 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 7e6b991c..27fea377 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/StorageOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/StorageOverlay.java @@ -414,7 +414,7 @@ public class StorageOverlay extends GuiElement { if (stackOnMouse != null) { String stackDisplay = Utils.cleanColour(stackOnMouse.getDisplayName()); if (stackDisplay.startsWith("Backpack Slot ") || stackDisplay.startsWith("Empty Backpack Slot ") || - stackDisplay.startsWith("Ender Chest Page ")) { + stackDisplay.startsWith("Ender Chest Page ") || stackDisplay.startsWith("Locked Backpack Slot ")) { stackOnMouse = null; } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/MiningOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/MiningOverlay.java index d24f005d..03fe9eff 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/MiningOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/MiningOverlay.java @@ -806,6 +806,7 @@ public class MiningOverlay extends TextTabOverlay { .getItemInformation() .get("ANVIL")) ); + put("First Event", new ItemStack(Items.fireworks, 1, 0)); }}; } } 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 0f9d1b4a..8576f141 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java @@ -61,6 +61,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.text.NumberFormat; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -749,6 +750,30 @@ public class GuiProfileViewer extends GuiScreen { lastTime = currentTime; + if (currentPage != ProfileViewerPage.LOADING && currentPage != ProfileViewerPage.INVALID_NAME) { + int ignoredTabs = 0; + List configList = NotEnoughUpdates.INSTANCE.config.profileViewer.pageLayout; + for (int i = 0; i < configList.size(); i++) { + ProfileViewerPage iPage = ProfileViewerPage.getById(configList.get(i)); + if (iPage == null) continue; + if (iPage.stack == null || (iPage == ProfileViewerPage.BINGO && !showBingoPage)) { + ignoredTabs++; + continue; + } + int i2 = i - ignoredTabs; + int x = guiLeft + i2 * 28; + int y = guiTop - 28; + + if (mouseX > x && mouseX < x + 28) { + if (mouseY > y && mouseY < y + 32) { + tooltipToDisplay = Collections.singletonList(iPage.stack + .getTooltip(Minecraft.getMinecraft().thePlayer, false) + .get(0)); + } + } + } + } + if (tooltipToDisplay != null) { List grayTooltip = new ArrayList<>(tooltipToDisplay.size()); for (String line : tooltipToDisplay) { @@ -1232,16 +1257,16 @@ public class GuiProfileViewer extends GuiScreen { LOADING(), INVALID_NAME(), NO_SKYBLOCK(), - BASIC(0, Items.paper, "Your Skills"), - DUNGEON(1, Item.getItemFromBlock(Blocks.deadbush), "Dungeoneering"), - EXTRA(2, Items.book, "Profile Stats"), - INVENTORIES(3, Item.getItemFromBlock(Blocks.ender_chest), "Storage"), - COLLECTIONS(4, Items.painting, "Collections"), - PETS(5, Items.bone, "Pets"), - MINING(6, Items.iron_pickaxe, "Heart of the Mountain"), - BINGO(7, Items.filled_map, "Bingo"), - TROPHY_FISH(8, Items.fishing_rod, "Trophy Fish"), - BESTIARY(9, Items.iron_sword, "Bestiary"); + BASIC(0, Items.paper, "§9Your Skills"), + DUNGEON(1, Item.getItemFromBlock(Blocks.deadbush), "§eDungeoneering"), + EXTRA(2, Items.book, "§7Profile Stats"), + INVENTORIES(3, Item.getItemFromBlock(Blocks.ender_chest), "§bStorage"), + COLLECTIONS(4, Items.painting, "§6Collections"), + PETS(5, Items.bone, "§aPets"), + MINING(6, Items.iron_pickaxe, "§5Heart of the Mountain"), + BINGO(7, Items.filled_map, "§zBingo"), + TROPHY_FISH(8, Items.fishing_rod, "§3Trophy Fish"), + BESTIARY(9, Items.iron_sword, "§cBestiary"); public final ItemStack stack; public final int id; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java index efa94ee5..70ea051a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java @@ -71,6 +71,11 @@ public class BestiaryPage extends GuiProfileViewerPage { int yIndex = 0; for (ItemStack stack : BestiaryData.getBestiaryLocations().keySet()) { Minecraft.getMinecraft().getTextureManager().bindTexture(pv_elements); + if (mouseX > guiLeft + 30 + bestiaryXSize * yIndex && mouseX < guiLeft + 30 + bestiaryXSize * yIndex + 20) { + if (mouseY > guiTop + 10 && mouseY < guiTop + 10 + 20) { + tooltipToDisplay = stack.getTooltip(Minecraft.getMinecraft().thePlayer, false); + } + } if (stack == selectedBestiaryLocation) { Utils.drawTexturedRect( guiLeft + 30 + bestiaryXSize * yIndex, @@ -109,10 +114,6 @@ public class BestiaryPage extends GuiProfileViewerPage { Utils.drawTexturedRect(guiLeft, guiTop, 431, 202, GL11.GL_NEAREST); GlStateManager.color(1, 1, 1, 1); - GlStateManager.disableLighting(); - RenderHelper.enableGUIStandardItemLighting(); - - List mobs = BestiaryData.getBestiaryLocations().get(selectedBestiaryLocation); Color color = new Color(128, 128, 128, 255); Utils.renderAlignedString( EnumChatFormatting.RED + "Bestiary Level: ", @@ -121,6 +122,10 @@ public class BestiaryPage extends GuiProfileViewerPage { guiTop + 50, 110 ); + + GlStateManager.disableLighting(); + RenderHelper.enableGUIStandardItemLighting(); + List mobs = BestiaryData.getBestiaryLocations().get(selectedBestiaryLocation); if (mobs != null) { for (int i = 0; i < mobs.size(); i++) { String mob = mobs.get(i); @@ -148,7 +153,7 @@ public class BestiaryPage extends GuiProfileViewerPage { 20 * (1 - completedness) / 256f, GL11.GL_NEAREST ); - GlStateManager.color(1, 185 / 255f, 0, 1); + //GlStateManager.color(1, 185 / 255f, 0, 1); Minecraft.getMinecraft().getTextureManager().bindTexture(pv_elements); Utils.drawTexturedRect( guiLeft + x, @@ -202,7 +207,7 @@ public class BestiaryPage extends GuiProfileViewerPage { if (level.maxed) { progressStr = EnumChatFormatting.GOLD + "MAXED!"; } else { - progressStr =EnumChatFormatting.AQUA + + progressStr = EnumChatFormatting.AQUA + StringUtils.shortNumberFormat(Math.round((levelNum % 1) * level.maxXpForLevel)) + "/" + StringUtils.shortNumberFormat(level.maxXpForLevel); -- cgit From 16fedc90309a898bc709eaadc944fd047300fd0d Mon Sep 17 00:00:00 2001 From: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> Date: Tue, 13 Sep 2022 00:24:07 +1000 Subject: Fixed pet overlay going to level 100 (#268) --- Update Notes/2.1.md | 1 + .../java/io/github/moulberry/notenoughupdates/util/XPInformation.java | 1 + 2 files changed, 2 insertions(+) (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 9c73e649..fa49a1d0 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -10,6 +10,7 @@ - [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) - Made it if you hold shift in the enchant solvers it overrides prevent missclicks - nopo - Fixed pet overlay not updating when going into /pets - nopo +- Fixed pet overlay randomly going to level 100 - nopo - [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 - nopo - [Price graph for items on /ah and /bz](https://cdn.discordapp.com/attachments/896407218151366687/926968296929107999/unknown.png) - DeDiamondPro diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/XPInformation.java b/src/main/java/io/github/moulberry/notenoughupdates/util/XPInformation.java index 58794e07..81eea343 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/XPInformation.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/XPInformation.java @@ -187,6 +187,7 @@ public class XPInformation { skillInfo.currentXp += updateWithPercentage.get(skill) / 100f * cap; skillInfo.totalXp += skillInfo.currentXp; skillInfo.currentXpMax = cap; + break; } else { skillInfo.totalXp += cap; } -- cgit From 7fb629f0fc0d6e2455418f85c36a11667f888d42 Mon Sep 17 00:00:00 2001 From: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> Date: Tue, 13 Sep 2022 00:27:37 +1000 Subject: Fixed clicking outside of experimentation game causing it to go count that as a valid click (#269) --- Update Notes/2.1.md | 1 + .../moulberry/notenoughupdates/miscfeatures/EnchantingSolvers.java | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index fa49a1d0..6080e656 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -149,6 +149,7 @@ - Fixed shortened damage - nopo - Fixed bazaar prices sorting order in neu item list - hannibal2 - Fixed priceless items showing first in the missing tab of the accessory bag overlay - nopo +- Fixed clicking outside of experimentation game causing it to go count that as a valid click - nopo - Fixed storage gui when having locked backpack slots - nopo ### **Other:** 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 558917fe..a1580d8e 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/EnchantingSolvers.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/EnchantingSolvers.java @@ -342,8 +342,9 @@ public class EnchantingSolvers { if (chronomatronReplayIndex < chronomatronOrder.size()) { String chronomatronCurrent = chronomatronOrder.get(chronomatronReplayIndex); - if (!NotEnoughUpdates.INSTANCE.config.enchantingSolvers.preventMisclicks1 || - chronomatronCurrent.equals(displayName) || Keyboard.getEventKey() == Keyboard.KEY_LSHIFT) { + if ((!NotEnoughUpdates.INSTANCE.config.enchantingSolvers.preventMisclicks1 || + chronomatronCurrent.equals(displayName) || Keyboard.getEventKey() == Keyboard.KEY_LSHIFT) && + stack.getItem() != Item.getItemFromBlock(Blocks.stained_glass_pane) && slotId != 4 && slotId != 49) { chronomatronReplayIndex++; Minecraft.getMinecraft().playerController.windowClick(windowId, slotId, 2, mode, Minecraft.getMinecraft().thePlayer @@ -374,7 +375,7 @@ public class EnchantingSolvers { long currentTime = System.currentTimeMillis(); if (currentTime - millisLastClick > 150 && (!NotEnoughUpdates.INSTANCE.config.enchantingSolvers.preventMisclicks1 || - current.containerIndex == slotId || Keyboard.getEventKey() == Keyboard.KEY_LSHIFT)) { + current.containerIndex == slotId || Keyboard.getEventKey() == Keyboard.KEY_LSHIFT) && (slotId < 45 && slotId > 8)) { ultrasequencerReplayIndex++; Minecraft.getMinecraft().playerController.windowClick(windowId, slotId, 2, mode, Minecraft.getMinecraft().thePlayer -- cgit From 94054563ff1d595253a4e50cf48b22fc77a05515 Mon Sep 17 00:00:00 2001 From: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> Date: Tue, 13 Sep 2022 02:31:56 +1000 Subject: Fix enchantment table overlay (#238) Co-authored-by: nea --- Update Notes/2.1.md | 2 + .../listener/ItemTooltipListener.java | 7 +- .../listener/NEUEventListener.java | 4 + .../notenoughupdates/listener/RenderListener.java | 22 + .../notenoughupdates/miscgui/CalendarOverlay.java | 5 +- .../notenoughupdates/miscgui/GuiCustomEnchant.java | 309 +- .../notenoughupdates/miscgui/hex/EnchantState.java | 37 + .../notenoughupdates/miscgui/hex/GuiCustomHex.java | 4794 ++++++++++++++++++++ .../notenoughupdates/miscgui/hex/HexItem.java | 264 ++ .../notenoughupdates/miscgui/hex/ItemType.java | 84 + .../miscgui/util/ExperienceOrb.java | 32 + .../notenoughupdates/miscgui/util/OrbDisplay.java | 142 + .../notenoughupdates/mixins/MixinGuiContainer.java | 2 + 13 files changed, 5521 insertions(+), 183 deletions(-) create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/EnchantState.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/GuiCustomHex.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/HexItem.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/ItemType.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscgui/util/ExperienceOrb.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscgui/util/OrbDisplay.java (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 6080e656..50e2d0e4 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -18,6 +18,7 @@ - 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 - Added a calculator (/neucalc help), that also works in the auction house / bazaar - nea89 +- Added an enchant table style gui for /hex - nopo - Added and fixed various things in the profile viewer: - [Added hotm tab](https://media.discordapp.net/attachments/659613194066722833/991115131507441724/unknown.png) - nopo - Big thanks to kwev1n for some math and jani for the texture @@ -146,6 +147,7 @@ - Fixed crash with spamming remove enchant in /neuec - nopo - Fixed missing enchants not working with shiny items - nopo - Fixed golden dragon not working in pet overlay - CrypticPlasma +- Fixed enchant overlay - nopo - Fixed shortened damage - nopo - Fixed bazaar prices sorting order in neu item list - hannibal2 - Fixed priceless items showing first in the missing tab of the accessory bag overlay - nopo 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 3936ad74..d4e0becd 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java @@ -906,11 +906,16 @@ public class ItemTooltipListener { boolean m = Keyboard.isKeyDown(Keyboard.KEY_M); boolean n = Keyboard.isKeyDown(Keyboard.KEY_N); boolean f = Keyboard.isKeyDown(Keyboard.KEY_F); + boolean l = Keyboard.isKeyDown(Keyboard.KEY_L); if (!copied && f && NotEnoughUpdates.INSTANCE.config.hidden.dev) { MiscUtils.copyToClipboard(NotEnoughUpdates.INSTANCE.manager.getSkullValueForItem(event.itemStack)); } + if (!copied && l) { + NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enableTableGUI = !NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enableTableGUI; + } + event.toolTip.add( EnumChatFormatting.AQUA + "Internal Name: " + EnumChatFormatting.GRAY + internal + EnumChatFormatting.GOLD + " [K]"); @@ -948,7 +953,7 @@ public class ItemTooltipListener { } } - copied = k || m || n || f; + copied = k || m || n || f || l; } } } 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 305135fc..e202b828 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/NEUEventListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/NEUEventListener.java @@ -34,6 +34,7 @@ import io.github.moulberry.notenoughupdates.miscfeatures.ItemCustomizeManager; import io.github.moulberry.notenoughupdates.miscfeatures.NPCRetexturing; import io.github.moulberry.notenoughupdates.miscgui.AccessoryBagOverlay; import io.github.moulberry.notenoughupdates.miscgui.GuiCustomEnchant; +import io.github.moulberry.notenoughupdates.miscgui.hex.GuiCustomHex; import io.github.moulberry.notenoughupdates.miscgui.StorageOverlay; import io.github.moulberry.notenoughupdates.overlays.OverlayManager; import io.github.moulberry.notenoughupdates.overlays.TextOverlay; @@ -144,6 +145,9 @@ public class NEUEventListener { if (GuiCustomEnchant.getInstance().shouldOverride(containerName)) { GuiCustomEnchant.getInstance().tick(); } + if (GuiCustomHex.getInstance().shouldOverride(containerName)) { + GuiCustomHex.getInstance().tick(containerName); + } } //MiningOverlay and TimersOverlay need real tick speed 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 a8d69c87..c822a51d 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java @@ -45,6 +45,7 @@ import io.github.moulberry.notenoughupdates.miscfeatures.StorageManager; import io.github.moulberry.notenoughupdates.miscgui.AccessoryBagOverlay; import io.github.moulberry.notenoughupdates.miscgui.CalendarOverlay; import io.github.moulberry.notenoughupdates.miscgui.GuiCustomEnchant; +import io.github.moulberry.notenoughupdates.miscgui.hex.GuiCustomHex; import io.github.moulberry.notenoughupdates.miscgui.GuiInvButtonEditor; import io.github.moulberry.notenoughupdates.miscgui.GuiItemRecipe; import io.github.moulberry.notenoughupdates.miscgui.StorageOverlay; @@ -445,12 +446,19 @@ public class RenderListener { containerName = cc.getLowerChestInventory().getDisplayName().getUnformattedText(); } + if (GuiCustomHex.getInstance().shouldOverride(containerName)) { + GuiCustomHex.getInstance().render(event.renderPartialTicks, containerName); + event.setCanceled(true); + return; + } + if (GuiCustomEnchant.getInstance().shouldOverride(containerName)) { GuiCustomEnchant.getInstance().render(event.renderPartialTicks); event.setCanceled(true); return; } + boolean tradeWindowActive = TradeWindow.tradeWindowActive(containerName); boolean storageOverlayActive = StorageManager.getInstance().shouldRenderStorageOverlay(containerName); boolean customAhActive = @@ -595,6 +603,7 @@ public class RenderListener { ContainerChest cc = (ContainerChest) eventGui.inventorySlots; containerName = cc.getLowerChestInventory().getDisplayName().getUnformattedText(); + if (GuiCustomHex.getInstance().shouldOverride(containerName)) return; if (GuiCustomEnchant.getInstance().shouldOverride(containerName)) return; } @@ -1050,12 +1059,18 @@ public class RenderListener { } } + if (GuiCustomHex.getInstance().shouldOverride(containerName) && + GuiCustomHex.getInstance().mouseInput(mouseX, mouseY)) { + event.setCanceled(true); + return; + } if (GuiCustomEnchant.getInstance().shouldOverride(containerName) && GuiCustomEnchant.getInstance().mouseInput(mouseX, mouseY)) { event.setCanceled(true); return; } + boolean tradeWindowActive = TradeWindow.tradeWindowActive(containerName); boolean storageOverlayActive = StorageManager.getInstance().shouldRenderStorageOverlay(containerName); boolean customAhActive = @@ -1519,12 +1534,19 @@ public class RenderListener { .getUnformattedText(); } + if (GuiCustomHex.getInstance().shouldOverride(containerName) && + GuiCustomHex.getInstance().keyboardInput()) { + event.setCanceled(true); + return; + } + if (GuiCustomEnchant.getInstance().shouldOverride(containerName) && GuiCustomEnchant.getInstance().keyboardInput()) { event.setCanceled(true); return; } + boolean tradeWindowActive = TradeWindow.tradeWindowActive(containerName); boolean storageOverlayActive = StorageManager.getInstance().shouldRenderStorageOverlay(containerName); boolean customAhActive = 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 2905a941..b1a3dca9 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/CalendarOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/CalendarOverlay.java @@ -75,6 +75,8 @@ public class CalendarOverlay { private static boolean enabled = false; + public static boolean ableToClickCalendar = true; + public static void setEnabled(boolean enabled) { CalendarOverlay.enabled = enabled; } @@ -479,8 +481,7 @@ public class CalendarOverlay { guiLeft = (width - xSize) / 2; guiTop = 5; - - if (mouseX >= guiLeft && mouseX <= guiLeft + xSize) { + if (mouseX >= guiLeft && mouseX <= guiLeft + xSize && ableToClickCalendar) { if (mouseY >= guiTop && mouseY <= guiTop + ySize) { ClientCommandHandler.instance.executeCommand(Minecraft.getMinecraft().thePlayer, "/neucalendar"); } 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 8ba3a98a..cbf98290 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.java @@ -28,6 +28,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.miscgui.util.OrbDisplay; import io.github.moulberry.notenoughupdates.mixins.AccessorGuiContainer; import io.github.moulberry.notenoughupdates.options.NEUConfig; import io.github.moulberry.notenoughupdates.util.Constants; @@ -74,9 +75,9 @@ public class GuiCustomEnchant extends Gui { "textures/entity/enchanting_table_book.png"); private static final ModelBook MODEL_BOOK = new ModelBook(); - private static final int EXPERIENCE_ORB_COUNT = 30; - private static final Pattern XP_COST_PATTERN = Pattern.compile("\\u00a73(\\d+) Exp Levels"); + private static final Pattern ENCHANT_LEVEL_PATTERN = Pattern.compile("(.*)_(.*)"); + private static final Pattern ENCHANT_NAME_PATTERN = Pattern.compile("([^IVX]*) ([IVX]*)"); private enum EnchantState { NO_ITEM, @@ -105,6 +106,10 @@ public class GuiCustomEnchant extends Gui { this.enchId = enchId; this.displayLore = displayLore; this.level = level; + if (this.enchId.equals("prosecute")) { + this.enchId = "PROSECUTE"; + } + if (Constants.ENCHANTS != null) { if (checkConflicts && Constants.ENCHANTS.has("enchant_pools")) { @@ -133,12 +138,18 @@ public class GuiCustomEnchant extends Gui { if (level >= 1 && Constants.ENCHANTS.has("enchants_xp_cost")) { JsonObject allCosts = Constants.ENCHANTS.getAsJsonObject("enchants_xp_cost"); + JsonObject maxLevel = null; + if (Constants.ENCHANTS.has("max_xp_table_levels")) { + maxLevel = Constants.ENCHANTS.getAsJsonObject("max_xp_table_levels"); + } + if (allCosts.has(enchId)) { JsonArray costs = allCosts.getAsJsonArray(enchId); if (costs.size() >= 1) { if (useMaxLevelForCost) { - this.xpCost = costs.get(costs.size() - 1).getAsInt(); + int cost = (maxLevel != null && maxLevel.has(enchId) ? maxLevel.get(enchId).getAsInt() : costs.size()); + this.xpCost = costs.get(cost - 1).getAsInt(); } else if (level - 1 < costs.size()) { this.xpCost = costs.get(level - 1).getAsInt(); } else { @@ -152,21 +163,7 @@ public class GuiCustomEnchant extends Gui { } } - public static class ExperienceOrb { - public float x; - public float y; - public float xLast; - public float yLast; - public float xVel; - public float yVel; - - public int type; - public int rotationDeg; - } - - private final List orbs = new ArrayList<>(); - private int orbTargetX = 0; - private int orbTargetY = 0; + public OrbDisplay orbDisplay = new OrbDisplay(); private int guiLeft; private int guiTop; @@ -226,8 +223,15 @@ public class GuiCustomEnchant extends Gui { } public boolean shouldOverride(String containerName) { + if (containerName == null) { + shouldOverrideFast = false; + return false; + } shouldOverrideFast = NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enableTableGUI && - Objects.equals("Enchant Item", containerName) && + (containerName.length() >= 12 && Objects.equals( + "Enchant Item", + containerName.substring(0, "Enchant Item".length()) + )) && NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard(); if (!shouldOverrideFast) { currentState = EnchantState.NO_ITEM; @@ -235,6 +239,10 @@ public class GuiCustomEnchant extends Gui { removable.clear(); expectedMaxPage = 1; } + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + ContainerChest cc = (ContainerChest) chest.inventorySlots; + ItemStack hexStack = cc.getLowerChestInventory().getStackInSlot(50); + if (hexStack != null && hexStack.getItem() == Items.experience_bottle) return false; return shouldOverrideFast; } @@ -245,13 +253,15 @@ public class GuiCustomEnchant extends Gui { ContainerChest cc = (ContainerChest) chest.inventorySlots; ItemStack stack = cc.getLowerChestInventory().getStackInSlot(23); - ItemStack enchantGuideStack = cc.getLowerChestInventory().getStackInSlot(50); + ItemStack arrowStack = cc.getLowerChestInventory().getStackInSlot(45); ItemStack enchantingItemStack = cc.getLowerChestInventory().getStackInSlot(19); + ItemStack hexStack = cc.getLowerChestInventory().getStackInSlot(50); int lastPage = currentPage; this.lastState = currentState; - if (enchantGuideStack != null && enchantGuideStack.getItem() != Items.book && enchantingItem != null) { + if (hexStack != null && hexStack.getItem() == Items.experience_bottle) return; + if (arrowStack != null && arrowStack.getItem() == Items.arrow && enchantingItem != null) { currentState = EnchantState.ADDING_ENCHANT; } else if (stack == null || enchantingItemStack == null) { if (currentState == EnchantState.SWITCHING_DONT_UPDATE || currentState == EnchantState.NO_ITEM) { @@ -305,30 +315,7 @@ public class GuiCustomEnchant extends Gui { } } - List toRemove = new ArrayList<>(); - for (ExperienceOrb orb : orbs) { - float targetDeltaX = guiLeft + orbTargetX - orb.x; - float targetDeltaY = guiTop + orbTargetY - orb.y; - - float length = (float) Math.sqrt(targetDeltaX * targetDeltaX + targetDeltaY * targetDeltaY); - - if (length < 8 && orb.xVel * orb.xVel + orb.yVel * orb.yVel < 20) { - toRemove.add(orb); - continue; - } - - orb.xVel += targetDeltaX * 2 / length; - orb.yVel += targetDeltaY * 2 / length; - - orb.xVel *= 0.90; - orb.yVel *= 0.90; - - orb.xLast = orb.x; - orb.yLast = orb.y; - orb.x += orb.xVel; - orb.y += orb.yVel; - } - orbs.removeAll(toRemove); + orbDisplay.physicsTickOrbs(); if (++tickCounter >= 20) { tickCounter = 0; @@ -389,40 +376,48 @@ public class GuiCustomEnchant extends Gui { if (ea != null) { NBTTagCompound enchantments = ea.getCompoundTag("enchantments"); if (enchantments != null) { - for (String enchId : enchantments.getKeySet()) { - String name = Utils.cleanColour(book.getDisplayName()); - if (name.equalsIgnoreCase("Bane of Arthropods")) { - name = "Bane of Arth."; - } else if (name.equalsIgnoreCase("Projectile Protection")) { - name = "Projectile Prot"; - } else if (name.equalsIgnoreCase("Blast Protection")) { - name = "Blast Prot"; - } - Enchantment enchantment = new Enchantment(slotIndex, name, enchId, - Utils.getRawTooltip(book), enchantments.getInteger(enchId), false, true - ); - enchantment.displayLore.remove(0); + String enchId = Utils.cleanColour(book.getDisplayName()).toLowerCase().replace(" ", "_").replace( + "-", + "_" + ); + String name = Utils.cleanColour(book.getDisplayName()); + int enchLevel = -1; + if (name.equalsIgnoreCase("Bane of Arthropods")) { + name = "Bane of Arth."; + } else if (name.equalsIgnoreCase("Projectile Protection")) { + name = "Projectile Prot"; + } else if (name.equalsIgnoreCase("Blast Protection")) { + name = "Blast Prot"; + } + Matcher levelMatcher = ENCHANT_LEVEL_PATTERN.matcher(enchId); + if (levelMatcher.matches()) { + enchLevel = Utils.parseRomanNumeral(levelMatcher.group(2).toUpperCase()); + enchId = levelMatcher.group(1); + } + Enchantment enchantment = new Enchantment(slotIndex, name, enchId, + Utils.getRawTooltip(book), enchLevel, false, true + ); + enchantment.displayLore.remove(0); - if (removingEnchantPlayerLevel == -1 && playerEnchantIds.containsKey(enchId)) { - removingEnchantPlayerLevel = playerEnchantIds.get(enchId); - } + if (removingEnchantPlayerLevel == -1 && playerEnchantIds.containsKey(enchId)) { + removingEnchantPlayerLevel = playerEnchantIds.get(enchId); + } - if (removingEnchantPlayerLevel >= 0 && enchantment.level < removingEnchantPlayerLevel) { - continue; - } + if (removingEnchantPlayerLevel >= 0 && enchantment.level < removingEnchantPlayerLevel) { + continue; + } - if (enchanterCurrentEnch == null) { + if (enchanterCurrentEnch == null) { + enchanterCurrentEnch = enchantment; + } else if (updateLevel) { + if (removingEnchantPlayerLevel < 0 && enchantment.level > enchanterCurrentEnch.level) { + enchanterCurrentEnch = enchantment; + } else if (removingEnchantPlayerLevel >= 0 && enchantment.level < enchanterCurrentEnch.level) { enchanterCurrentEnch = enchantment; - } else if (updateLevel) { - if (removingEnchantPlayerLevel < 0 && enchantment.level > enchanterCurrentEnch.level) { - enchanterCurrentEnch = enchantment; - } else if (removingEnchantPlayerLevel >= 0 && enchantment.level < enchanterCurrentEnch.level) { - enchanterCurrentEnch = enchantment; - } } - - enchanterEnchLevels.put(enchantment.level, enchantment); } + + enchanterEnchLevels.put(enchantment.level, enchantment); } } } @@ -455,43 +450,54 @@ public class GuiCustomEnchant extends Gui { if (ea != null) { NBTTagCompound enchantments = ea.getCompoundTag("enchantments"); if (enchantments != null) { - for (String enchId : enchantments.getKeySet()) { - String name = Utils.cleanColour(book.getDisplayName()); - - if (searchField.getText().trim().isEmpty() || - name.toLowerCase().contains(searchField.getText().trim().toLowerCase())) { - if (name.equalsIgnoreCase("Bane of Arthropods")) { - name = "Bane of Arth."; - } else if (name.equalsIgnoreCase("Projectile Protection")) { - name = "Projectile Prot"; - } else if (name.equalsIgnoreCase("Blast Protection")) { - name = "Blast Prot"; - } else if (name.equalsIgnoreCase("Luck of the Sea")) { - name = "Luck of Sea"; - } + String enchId = Utils + .cleanColour(book.getDisplayName()) + .toLowerCase() + .replace(" ", "_") + .replace("-", "_"); + if (enchId.equalsIgnoreCase("_")) continue; + if (enchId.equals("prosecute")) { + enchId = "PROSECUTE"; + } + String name = Utils.cleanColour(book.getDisplayName()); + + if (searchField.getText().trim().isEmpty() || + name.toLowerCase().contains(searchField.getText().trim().toLowerCase())) { + if (name.equalsIgnoreCase("Bane of Arthropods")) { + name = "Bane of Arth."; + } else if (name.equalsIgnoreCase("Projectile Protection")) { + name = "Projectile Prot"; + } else if (name.equalsIgnoreCase("Blast Protection")) { + name = "Blast Prot"; + } else if (name.equalsIgnoreCase("Luck of the Sea")) { + name = "Luck of Sea"; + } + Matcher nameMatcher = ENCHANT_NAME_PATTERN.matcher(name); + if (nameMatcher.matches()) { + name = nameMatcher.group(1); + } - if (playerEnchantIds.containsKey(enchId)) { - Enchantment enchantment = new Enchantment(slotIndex, name, enchId, - Utils.getRawTooltip(book), playerEnchantIds.get(enchId), false, false - ); - if (!enchantment.overMaxLevel) { - removable.add(enchantment); - } - } else { - Enchantment enchantment = new Enchantment(slotIndex, name, enchId, - Utils.getRawTooltip(book), enchantments.getInteger(enchId), true, true - ); - applicable.add(enchantment); + if (playerEnchantIds.containsKey(enchId)) { + Enchantment enchantment = new Enchantment(slotIndex, name, enchId, + Utils.getRawTooltip(book), playerEnchantIds.get(enchId), false, false + ); + if (!enchantment.overMaxLevel) { + removable.add(enchantment); } } else { - if (playerEnchantIds.containsKey(enchId)) { - searchRemovedFromRemovable = true; - } else { - searchRemovedFromApplicable = true; - } + Enchantment enchantment = new Enchantment(slotIndex, name, enchId, + Utils.getRawTooltip(book), 1, true, true + ); + applicable.add(enchantment); + } + } else { + if (playerEnchantIds.containsKey(enchId)) { + searchRemovedFromRemovable = true; + } else { + searchRemovedFromApplicable = true; } - } + } } } @@ -1356,37 +1362,11 @@ public class GuiCustomEnchant extends Gui { //Orb animation Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); - GlStateManager.color(1, 1, 1, 1); GlStateManager.disableDepth(); - for (ExperienceOrb orb : orbs) { - int orbX = Math.round(orb.xLast + (orb.x - orb.xLast) * partialTicks); - int orbY = Math.round(orb.yLast + (orb.y - orb.yLast) * partialTicks); - GlStateManager.pushMatrix(); - GlStateManager.translate(orbX, orbY, 0); - GlStateManager.rotate(orb.rotationDeg, 0, 0, 1); - - float targetDeltaX = guiLeft + orbTargetX - orb.x; - float targetDeltaY = guiTop + orbTargetY - orb.y; - float length = (float) Math.sqrt(targetDeltaX * targetDeltaX + targetDeltaY * targetDeltaY); - float velSq = orb.xVel * orb.xVel + orb.yVel * orb.yVel; - float opacity = Math.min(2, Math.max(0.5f, length / 16)) * Math.min(2, Math.max(0.5f, velSq / 40)); - if (opacity > 1) opacity = 1; - opacity = (float) Math.sqrt(opacity); - GlStateManager.color(1, 1, 1, opacity); - - Utils.drawTexturedRect( - -8, - -8, - 16, - 16, - ((orb.type % 3) * 16) / 512f, - (16 + (orb.type % 3) * 16) / 512f, - (217 + orb.type / 3 * 16) / 512f, - (217 + 16 + orb.type / 3 * 16) / 512f, - GL11.GL_NEAREST - ); - GlStateManager.popMatrix(); - } + GlStateManager.pushMatrix(); + GlStateManager.translate(guiLeft, guiTop, 0); + orbDisplay.renderOrbs(partialTicks); + GlStateManager.popMatrix(); GlStateManager.enableDepth(); if (stackOnMouse != null) { @@ -1403,37 +1383,6 @@ public class GuiCustomEnchant extends Gui { GlStateManager.translate(0, 0, -300); } - private void spawnExperienceOrbs(int startX, int startY, int targetX, int targetY, int baseType) { - orbs.clear(); - - this.orbTargetX = targetX; - this.orbTargetY = targetY; - - Random rand = new Random(); - for (int i = 0; i < EXPERIENCE_ORB_COUNT; i++) { - ExperienceOrb orb = new ExperienceOrb(); - orb.x = startX; - orb.y = startY; - orb.xLast = startX; - orb.yLast = startY; - orb.xVel = rand.nextFloat() * 20 - 10; - orb.yVel = rand.nextFloat() * 20 - 10; - orb.type = baseType; - - float typeRand = rand.nextFloat(); - if (typeRand < 0.6) { - orb.type += 0; - } else if (typeRand < 0.9) { - orb.type += 1; - } else { - orb.type += 2; - } - orb.rotationDeg = rand.nextInt(4) * 90; - - orbs.add(orb); - } - } - private void renderEnchantBook(ScaledResolution scaledresolution, float partialTicks) { GlStateManager.enableDepth(); @@ -1540,9 +1489,9 @@ public class GuiCustomEnchant extends Gui { EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); - ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(48); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(45); Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( - chest.inventorySlots.windowId, 48, 0, 0, stack, transactionID)); + chest.inventorySlots.windowId, 45, 0, 0, stack, transactionID)); cancelButtonAnimTime = System.currentTimeMillis(); } @@ -1592,9 +1541,9 @@ public class GuiCustomEnchant extends Gui { EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); - ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(48); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(45); Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( - chest.inventorySlots.windowId, 48, 0, 0, stack, transactionID)); + chest.inventorySlots.windowId, 45, 0, 0, stack, transactionID)); cancelButtonAnimTime = System.currentTimeMillis(); } else if (!isChangingEnchLevel && enchanterCurrentEnch != null && @@ -1617,9 +1566,9 @@ public class GuiCustomEnchant extends Gui { int playerXpLevel = Minecraft.getMinecraft().thePlayer.experienceLevel; if (playerXpLevel >= enchanterCurrentEnch.xpCost) { if (removingEnchantPlayerLevel >= 0 && enchanterCurrentEnch.level == removingEnchantPlayerLevel) { - spawnExperienceOrbs(guiLeft + X_SIZE / 2, guiTop + 66, X_SIZE / 2, 36, 3); + orbDisplay.spawnExperienceOrbs(X_SIZE / 2, 66, X_SIZE / 2, 36, 3); } else { - spawnExperienceOrbs(mouseX, mouseY, X_SIZE / 2, 66, 0); + orbDisplay.spawnExperienceOrbs(mouseX - guiLeft, mouseY - guiTop, X_SIZE / 2, 66, 0); } } @@ -1790,9 +1739,9 @@ public class GuiCustomEnchant extends Gui { } else if (currentState == EnchantState.ADDING_ENCHANT) { EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); - ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(48); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(45); Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( - chest.inventorySlots.windowId, 48, 0, 0, stack, transactionID)); + chest.inventorySlots.windowId, 45, 0, 0, stack, transactionID)); cancelButtonAnimTime = System.currentTimeMillis(); } @@ -1830,9 +1779,9 @@ public class GuiCustomEnchant extends Gui { } else if (currentState == EnchantState.ADDING_ENCHANT) { EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); - ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(48); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(45); Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( - chest.inventorySlots.windowId, 48, 0, 0, stack, transactionID)); + chest.inventorySlots.windowId, 45, 0, 0, stack, transactionID)); cancelButtonAnimTime = System.currentTimeMillis(); } @@ -1877,9 +1826,9 @@ public class GuiCustomEnchant extends Gui { EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); - ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(48); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(45); Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( - chest.inventorySlots.windowId, 48, 0, 0, stack, transactionID)); + chest.inventorySlots.windowId, 45, 0, 0, stack, transactionID)); cancelButtonAnimTime = System.currentTimeMillis(); } @@ -1898,9 +1847,9 @@ public class GuiCustomEnchant extends Gui { EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); - ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(48); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(45); Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( - chest.inventorySlots.windowId, 48, 0, 0, stack, transactionID)); + chest.inventorySlots.windowId, 45, 0, 0, stack, transactionID)); cancelButtonAnimTime = System.currentTimeMillis(); } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/EnchantState.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/EnchantState.java new file mode 100644 index 00000000..08e720a2 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/EnchantState.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2022 NotEnoughUpdates contributors + * + * This file is part of NotEnoughUpdates. + * + * NotEnoughUpdates is free software: you can redistribute it + * and/or modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * NotEnoughUpdates is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with NotEnoughUpdates. If not, see . + */ + +package io.github.moulberry.notenoughupdates.miscgui.hex; + +enum EnchantState { + NO_ITEM, + ADDING_ENCHANT, + SWITCHING_DONT_UPDATE, + INVALID_ITEM, + HAS_ITEM, + HAS_ITEM_IN_HEX, + HAS_ITEM_IN_BOOKS, + ADDING_BOOK, + NO_ITEM_IN_HEX, + INVALID_ITEM_HEX, + HAS_ITEM_IN_GEMSTONE, + ADDING_GEMSTONE, + APPLYING_GEMSTONE + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/GuiCustomHex.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/GuiCustomHex.java new file mode 100644 index 00000000..39374f9d --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/GuiCustomHex.java @@ -0,0 +1,4794 @@ +/* + * 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.miscgui.hex; + +import com.google.common.collect.Lists; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.core.GlScissorStack; +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.miscgui.CalendarOverlay; +import io.github.moulberry.notenoughupdates.miscgui.util.OrbDisplay; +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; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.model.ModelBook; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.inventory.ContainerChest; +import net.minecraft.inventory.Slot; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.play.client.C0EPacketClickWindow; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; +import org.apache.commons.lang3.text.WordUtils; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; +import org.lwjgl.util.glu.Project; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.text.NumberFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Objects; +import java.util.Random; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class GuiCustomHex extends Gui { + private static final GuiCustomHex INSTANCE = new GuiCustomHex(); + private static final ResourceLocation TEXTURE = new ResourceLocation("notenoughupdates:custom_enchant_gui.png"); + private static final ResourceLocation ENCHANTMENT_TABLE_BOOK_TEXTURE = new ResourceLocation( + "textures/entity/enchanting_table_book.png"); + private static final ModelBook MODEL_BOOK = new ModelBook(); + + private static final int EXPERIENCE_ORB_COUNT = 30; + + private static final Pattern XP_COST_PATTERN = Pattern.compile("\\u00a73(\\d+) Exp Levels"); + private static final Pattern ENCHANT_LEVEL_PATTERN = Pattern.compile("(.*)_(.*)"); + private static final Pattern ENCHANT_NAME_PATTERN = Pattern.compile("([^IVX]*) ([IVX]*)"); + + public static final NumberFormat numberFormat = NumberFormat.getInstance(Locale.US); + + public class Enchantment { + public int slotIndex; + public String enchantName; + public String enchId; + public List displayLore; + public int level; + public int xpCost = -1; + public boolean overMaxLevel = false; + public boolean conflicts = false; + public int price = -1; + + public Enchantment( + int slotIndex, String enchantName, String enchId, List displayLore, int level, + boolean useMaxLevelForCost, boolean checkConflicts + ) { + this.slotIndex = slotIndex; + this.enchantName = enchantName; + this.enchId = enchId; + this.displayLore = displayLore; + this.level = level; + boolean isUlt = false; + for (String lore : displayLore) { + if (lore.contains("§l")) isUlt = true; + break; + } + JsonObject bazaarInfo = NotEnoughUpdates.INSTANCE.manager.auctionManager.getBazaarInfo( + (isUlt ? "ULTIMATE_" : "") + enchId.toUpperCase() + ";" + level); + if (bazaarInfo != null && bazaarInfo.get("curr_buy") != null) { + this.price = bazaarInfo.get("curr_buy").getAsInt(); + } + if (this.enchId.equals("prosecute")) { + this.enchId = "PROSECUTE"; + } + + if (Constants.ENCHANTS != null) { + if (checkConflicts && Constants.ENCHANTS.has("enchant_pools")) { + JsonArray pools = Constants.ENCHANTS.getAsJsonArray("enchant_pools"); + out: + for (int i = 0; i < pools.size(); i++) { + JsonArray pool = pools.get(i).getAsJsonArray(); + + boolean hasThis = false; + boolean hasApplied = false; + + for (int j = 0; j < pool.size(); j++) { + String enchIdPoolElement = pool.get(j).getAsString(); + if (enchId.equalsIgnoreCase(enchIdPoolElement)) { + hasThis = true; + } else if (playerEnchantIds.containsKey(enchIdPoolElement)) { + hasApplied = true; + } + if (hasThis && hasApplied) { + this.conflicts = true; + break out; + } + } + } + } + + if (level >= 1 && Constants.ENCHANTS.has("enchants_xp_cost")) { + JsonObject allCosts = Constants.ENCHANTS.getAsJsonObject("enchants_xp_cost"); + if (allCosts.has(enchId)) { + JsonArray costs = allCosts.getAsJsonArray(enchId); + + if (costs.size() >= 1) { + if (useMaxLevelForCost) { + this.xpCost = costs.get(costs.size() - 1).getAsInt(); + } else if (level - 1 < costs.size()) { + this.xpCost = costs.get(level - 1).getAsInt(); + } else { + overMaxLevel = true; + } + } + } + + } + } + } + } + + public OrbDisplay orbDisplay = new OrbDisplay(); + + private int guiLeft; + private int guiTop; + private boolean shouldOverrideFast = false; + private boolean shouldOverrideET = false; + private boolean shouldOverrideGemstones = false; + private boolean shouldOverrideXp = false; + public float pageOpen; + public float pageOpenLast; + public float pageOpenRandom; + public float pageOpenVelocity; + public float bookOpen; + public float bookOpenLast; + + private int currentPage; + private int expectedMaxPage; + + private boolean isScrollingLeft = true; + + private ItemStack enchantingItem = null; + + private int removingEnchantPlayerLevel = -1; + + private final GuiElementTextField searchField = new GuiElementTextField("", GuiElementTextField.SCISSOR_TEXT); + + private final HashMap playerEnchantIds = new HashMap<>(); + + private boolean searchRemovedFromApplicable = false; + private boolean searchRemovedFromRemovable = false; + private final List applicable = new ArrayList<>(); + private final List removable = new ArrayList<>(); + + private final List applicableItem = new ArrayList<>(); + private final List removableItem = new ArrayList<>(); + private final HashMap enchanterEnchLevels = new HashMap<>(); + private final HashMap enchanterItemLevels = new HashMap<>(); + private Enchantment enchanterCurrentEnch = null; + private HexItem enchanterCurrentItem = null; + + public Random random = new Random(); + + private EnchantState currentState = EnchantState.NO_ITEM; + private EnchantState lastState = EnchantState.NO_ITEM; + + private final LerpingInteger leftScroll = new LerpingInteger(0, 150); + private final LerpingInteger rightScroll = new LerpingInteger(0, 150); + + private final LerpingFloat arrowAmount = new LerpingFloat(0, 100); + + private static final int X_SIZE = 364; + private static final int Y_SIZE = 215; + + private int clickedScrollOffset = -1; + private boolean isClickedScrollLeft = true; + + private boolean isChangingEnchLevel = false; + + private long cancelButtonAnimTime = 0; + private long confirmButtonAnimTime = 0; + + public static GuiCustomHex getInstance() { + return INSTANCE; + } + + public boolean shouldOverride(String containerName) { + CalendarOverlay.ableToClickCalendar = true; + if (containerName == null) { + shouldOverrideET = false; + shouldOverrideFast = false; + shouldOverrideGemstones = false; + shouldOverrideXp = false; + searchField.setText(""); + return false; + } + boolean config = NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enableTableGUI; + final List gemList = new ArrayList<>(Arrays.asList( + "\u2764", + "\u2748", + "\u270e", + "\u2618", + "\u2e15", + "\u2727", + "\u2741", + "\u2742" + )); + shouldOverrideFast = config && + (containerName.length() >= 7 && Objects.equals("The Hex", containerName.substring(0, "The Hex".length()))) && + NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard(); + + shouldOverrideET = config && + (containerName.length() >= 12 && Objects.equals( + "Enchant Item", + containerName.substring(0, "Enchant Item".length()) + )) && NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard(); + + shouldOverrideGemstones = config && + (containerName.length() >= 12 && Objects.equals( + "Gemstones ➜", + containerName.substring(0, "Gemstones ➜".length()) + )) && NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard(); + if (shouldOverrideGemstones) { + for (String string : gemList) { + if (containerName.contains(string)) { + shouldOverrideGemstones = false; + break; + } + } + } + + shouldOverrideXp = config && + (containerName.length() >= 21 && Objects.equals("Bottles of Enchanting", containerName.substring(0, "Bottles of Enchanting".length()))) && + NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard(); + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + ContainerChest cc = (ContainerChest) chest.inventorySlots; + ItemStack hexStack = cc.getLowerChestInventory().getStackInSlot(50); + CalendarOverlay.ableToClickCalendar = !(shouldOverrideET || shouldOverrideFast || shouldOverrideGemstones || shouldOverrideXp); + if (hexStack != null && hexStack.getItem() == Items.experience_bottle) + return (shouldOverrideET || shouldOverrideFast); + if (!shouldOverrideFast && !shouldOverrideET && !shouldOverrideGemstones && !shouldOverrideXp) { + currentState = EnchantState.NO_ITEM; + applicable.clear(); + removable.clear(); + applicableItem.clear(); + removableItem.clear(); + expectedMaxPage = 1; + enchanterCurrentItem = null; + searchField.setText(""); + } + return (shouldOverrideFast || shouldOverrideGemstones || shouldOverrideXp); + } + + private int tickCounter = 0; + + public void tick(String containerName) { + if (containerName.equals("The Hex")) { + currentState = EnchantState.HAS_ITEM_IN_HEX; + tickHex(); + } else if (containerName.contains("Enchant Item")) { + tickEnchants(); + } else if (containerName.contains("Books") || containerName.contains("Modifiers") || containerName.contains( + "Reforges") || containerName.contains("Item Upgrades") || containerName.equals("Bottles of Enchanting")) { + tickBooks(); + } else if (containerName.contains("Gemstones")) { + tickGemstones(); + } else { + tickBooks(); + } + } + + private void tickEnchants() { + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + ContainerChest cc = (ContainerChest) chest.inventorySlots; + + //ItemStack hexStack = cc.getLowerChestInventory().getStackInSlot(12); + ItemStack enchantingItemStack = cc.getLowerChestInventory().getStackInSlot(19); + //ItemStack stack = cc.getLowerChestInventory().getStackInSlot(23); + ItemStack hopperStack = cc.getLowerChestInventory().getStackInSlot(51); + + int lastPage = currentPage; + + this.lastState = currentState; + + if (hopperStack != null && hopperStack.getItem() != Item.getItemFromBlock(Blocks.hopper) && + enchantingItem != null) { + currentState = EnchantState.ADDING_ENCHANT; + } else if (enchantingItemStack == null) { + if (currentState == EnchantState.SWITCHING_DONT_UPDATE || currentState == EnchantState.NO_ITEM) { + currentState = EnchantState.NO_ITEM; + } else { + currentState = EnchantState.SWITCHING_DONT_UPDATE; + } + } else { + ItemStack sanityCheckStack = cc.getLowerChestInventory().getStackInSlot(12); + if (sanityCheckStack == null || sanityCheckStack.getItem() == Items.enchanted_book) { + currentState = EnchantState.HAS_ITEM; + enchantingItem = enchantingItemStack; + } else { + currentState = EnchantState.SWITCHING_DONT_UPDATE; + } + } + + if (currentState == EnchantState.HAS_ITEM) { + ItemStack pageUpStack = cc.getLowerChestInventory().getStackInSlot(17); + ItemStack pageDownStack = cc.getLowerChestInventory().getStackInSlot(35); + if (pageUpStack != null && pageDownStack != null) { + currentPage = 0; + boolean upIsGlass = pageUpStack.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane); + boolean downIsGlass = pageDownStack.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane); + int page = -1; + + expectedMaxPage = 1; + if (!downIsGlass) { + try { + page = Integer.parseInt(Utils.getRawTooltip(pageDownStack).get(1).substring(11)) - 1; + expectedMaxPage = page + 1; + } catch (Exception ignored) { + } + } + if (page == -1 && !upIsGlass) { + try { + page = Integer.parseInt(Utils.getRawTooltip(pageUpStack).get(1).substring(11)) + 1; + expectedMaxPage = page; + } catch (Exception ignored) { + } + } + if (page == -1) { + currentPage = 1; + } else { + currentPage = page; + } + } + } + + orbDisplay.physicsTickOrbs(); + + if (++tickCounter >= 20) { + tickCounter = 0; + } + + boolean updateItems = tickCounter == 0; + + if (currentState == EnchantState.ADDING_ENCHANT) { + if (arrowAmount.getTarget() != 1) { + arrowAmount.setTarget(1); + arrowAmount.resetTimer(); + } + } else { + if (arrowAmount.getTarget() != 0) { + arrowAmount.setTarget(0); + arrowAmount.resetTimer(); + } + } + + // Set allowedSwitchStates = Sets.newHashSet(EnchantState.ADDING_ENCHANT, EnchantState.HAS_ITEM, EnchantState.SWITCHING_DONT_UPDATE); + if (lastState != currentState || lastPage != currentPage) { + // if (!allowedSwitchStates.contains(lastState) || !allowedSwitchStates.contains(currentState)) { + leftScroll.setValue(0); + rightScroll.setValue(0); + // } + updateItems = true; + } + + if (updateItems && currentState != EnchantState.SWITCHING_DONT_UPDATE) { + enchanterEnchLevels.clear(); + + if (enchantingItem != null) { + playerEnchantIds.clear(); + NBTTagCompound tag = enchantingItem.getTagCompound(); + if (tag != null) { + NBTTagCompound ea = tag.getCompoundTag("ExtraAttributes"); + if (ea != null) { + NBTTagCompound enchantments = ea.getCompoundTag("enchantments"); + if (enchantments != null) { + for (String enchId : enchantments.getKeySet()) { + playerEnchantIds.put(enchId, enchantments.getInteger(enchId)); + } + } + } + } + } + + if (currentState == EnchantState.ADDING_ENCHANT) { + removingEnchantPlayerLevel = -1; + boolean updateLevel = enchanterCurrentEnch == null; + boolean hasXpBottle = false; + for (int i = 0; i < 27; i++) { + int slotIndex = 9 + i; + ItemStack book = cc.getLowerChestInventory().getStackInSlot(slotIndex); + ItemStack xpBottle = cc.getLowerChestInventory().getStackInSlot(50); + if (!hasXpBottle && xpBottle != null && + xpBottle.getItem() == Items.experience_bottle) { //Make show when in dungeon screen + String name = "Buy Xp Bottles"; + String id = "XP_BOTTLE"; + Enchantment xpBottleEnch = new Enchantment(50, name, id, + Utils.getRawTooltip(xpBottle), 1, true, false + ); + boolean hasHasXpBottle = false; + for (Enchantment ench : applicable) { + if (ench.enchId.equals("XP_BOTTLE")) { + hasHasXpBottle = true; + break; + } + } + if (!hasHasXpBottle) applicable.add(xpBottleEnch); + hasXpBottle = true; + } + if (book != null && book.getItem() == Items.enchanted_book) { + NBTTagCompound tagBook = book.getTagCompound(); + if (tagBook != null) { + NBTTagCompound ea = tagBook.getCompoundTag("ExtraAttributes"); + if (ea != null) { + NBTTagCompound enchantments = ea.getCompoundTag("enchantments"); + if (enchantments != null) { + String enchId = Utils.cleanColour(book.getDisplayName()).toLowerCase().replace(" ", "_").replace( + "-", + "_" + ); + String name = Utils.cleanColour(book.getDisplayName()); + int enchLevel = -1; + if (name.equalsIgnoreCase("Bane of Arthropods")) { + name = "Bane of Arth."; + } else if (name.equalsIgnoreCase("Projectile Protection")) { + name = "Projectile Prot"; + } else if (name.equalsIgnoreCase("Blast Protection")) { + name = "Blast Prot"; + } else if (name.equalsIgnoreCase("Turbo-Mushrooms")) { + name = "Turbo-Mush"; + } + Matcher levelMatcher = ENCHANT_LEVEL_PATTERN.matcher(enchId); + if (levelMatcher.matches()) { + enchLevel = Utils.parseRomanNumeral(levelMatcher.group(2).toUpperCase()); + enchId = levelMatcher.group(1); + } + Enchantment enchantment = new Enchantment(slotIndex, name, enchId, + Utils.getRawTooltip(book), enchLevel, false, true + ); + int index = 0; + for (String lore : enchantment.displayLore) { + if (lore.contains("N/A") && enchantment.price > 0) { + String price = numberFormat.format(enchantment.price); + enchantment.displayLore.set(index, "\u00a76" + price + ".0 Coins"); + } + index++; + } + enchantment.displayLore.remove(0); + + if (removingEnchantPlayerLevel == -1 && playerEnchantIds.containsKey(enchId)) { + removingEnchantPlayerLevel = playerEnchantIds.get(enchId); + } + + if (removingEnchantPlayerLevel >= 0 && enchantment.level < removingEnchantPlayerLevel) { + continue; + } + + if (enchanterCurrentEnch == null) { + enchanterCurrentEnch = enchantment; + } else if (updateLevel) { + if (removingEnchantPlayerLevel < 0 && enchantment.level > enchanterCurrentEnch.level) { + enchanterCurrentEnch = enchantment; + } else if (removingEnchantPlayerLevel >= 0 && enchantment.level < enchanterCurrentEnch.level) { + enchanterCurrentEnch = enchantment; + } + } + + enchanterEnchLevels.put(enchantment.level, enchantment); + } + } + } + } + } + if (enchanterCurrentEnch != null && removingEnchantPlayerLevel >= 0) { + for (String line : enchanterCurrentEnch.displayLore) { + Matcher matcher = XP_COST_PATTERN.matcher(line); + if (matcher.find()) { + enchanterCurrentEnch.xpCost = Integer.parseInt(matcher.group(1)); + } + } + } + } else { + isChangingEnchLevel = false; + enchanterCurrentEnch = null; + + searchRemovedFromRemovable = false; + searchRemovedFromApplicable = false; + applicable.clear(); + removable.clear(); + boolean hasXpBottle = false; + if (currentState == EnchantState.HAS_ITEM) { + for (int i = 0; i < 15; i++) { + int slotIndex = 12 + (i % 5) + (i / 5) * 9; + ItemStack book = cc.getLowerChestInventory().getStackInSlot(slotIndex); + ItemStack xpBottle = cc.getLowerChestInventory().getStackInSlot(50); + if (!hasXpBottle && xpBottle != null && + xpBottle.getItem() == Items.experience_bottle) { //Make show when in dungeon screen + String name = "Buy Xp Bottles"; + String id = "XP_BOTTLE"; + Enchantment xpBottleEnch = new Enchantment(50, name, id, + Utils.getRawTooltip(xpBottle), 1, true, false + ); + applicable.add(xpBottleEnch); + hasXpBottle = true; + } + if (book != null) { + NBTTagCompound tagBook = book.getTagCompound(); + if (tagBook != null) { + NBTTagCompound ea = tagBook.getCompoundTag("ExtraAttributes"); + if (ea != null) { + NBTTagCompound enchantments = ea.getCompoundTag("enchantments"); + if (enchantments != null) { + String enchId = Utils + .cleanColour(book.getDisplayName()) + .toLowerCase() + .replace(" ", "_") + .replace("-", "_"); + if (enchId.equalsIgnoreCase("_")) continue; + if (enchId.equals("prosecute")) { + enchId = "PROSECUTE"; + } + String name = Utils.cleanColour(book.getDisplayName()); + + if (searchField.getText().trim().isEmpty() || + name.toLowerCase().contains(searchField.getText().trim().toLowerCase())) { + if (name.equalsIgnoreCase("Bane of Arthropods")) { + name = "Bane of Arth."; + } else if (name.equalsIgnoreCase("Projectile Protection")) { + name = "Projectile Prot"; + } else if (name.equalsIgnoreCase("Blast Protection")) { + name = "Blast Prot"; + } else if (name.equalsIgnoreCase("Turbo-Mushrooms")) { + name = "Turbo-Mush"; + } + Matcher nameMatcher = ENCHANT_NAME_PATTERN.matcher(name); + if (nameMatcher.matches()) { + name = nameMatcher.group(1); + } + + if (playerEnchantIds.containsKey(enchId)) { + Enchantment enchantment = new Enchantment(slotIndex, name, enchId, + Utils.getRawTooltip(book), playerEnchantIds.get(enchId), false, false + ); + if (!enchantment.overMaxLevel) { + removable.add(enchantment); + } + } else { + Enchantment enchantment = new Enchantment(slotIndex, name, enchId, + Utils.getRawTooltip(book), 1, true, true + ); + applicable.add(enchantment); + } + } else { + if (playerEnchantIds.containsKey(enchId)) { + searchRemovedFromRemovable = true; + } else { + searchRemovedFromApplicable = true; + } + } + + } + } + } + } + } + NEUConfig cfg = NotEnoughUpdates.INSTANCE.config; + int mult = cfg.enchantingSolvers.enchantOrdering == 0 ? 1 : -1; + Comparator comparator = cfg.enchantingSolvers.enchantSorting == 0 ? + Comparator.comparingInt(e -> mult * e.xpCost) : + (c1, c2) -> mult * + c1.enchId.toLowerCase().compareTo(c2.enchId.toLowerCase()); + removable.sort(comparator); + applicable.sort(comparator); + } + } + } + + //Update book model state + if (lastState != currentState) { + do { + this.pageOpenRandom += (float) (this.random.nextInt(4) - this.random.nextInt(4)); + + } while (!(this.pageOpen > this.pageOpenRandom + 1.0F) && !(this.pageOpen < this.pageOpenRandom - 1.0F)); + } + + this.pageOpenLast = this.pageOpen; + this.bookOpenLast = this.bookOpen; + + if (currentState == EnchantState.HAS_ITEM || currentState == EnchantState.ADDING_ENCHANT) { + this.bookOpen += 0.2F; + } else { + this.bookOpen -= 0.2F; + } + + this.bookOpen = MathHelper.clamp_float(this.bookOpen, 0.0F, 1.0F); + float f1 = (this.pageOpenRandom - this.pageOpen) * 0.4F; + f1 = MathHelper.clamp_float(f1, -0.2F, 0.2F); + this.pageOpenVelocity += (f1 - this.pageOpenVelocity) * 0.9F; + this.pageOpen += this.pageOpenVelocity; + } + + private void tickBooks() { + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + ContainerChest cc = (ContainerChest) chest.inventorySlots; + + ItemStack enchantingItemStack = cc.getLowerChestInventory().getStackInSlot(19); + ItemStack anvilStack = cc.getLowerChestInventory().getStackInSlot(28); + + this.lastState = currentState; + + if (anvilStack != null && anvilStack.getItem() == Item.getItemFromBlock(Blocks.anvil) && + currentState != EnchantState.ADDING_BOOK) { + currentState = EnchantState.HAS_ITEM_IN_BOOKS; + enchantingItem = enchantingItemStack; + } else if (currentState == EnchantState.HAS_ITEM_IN_BOOKS && enchantingItem == null && + enchantingItemStack != null) { + enchantingItem = enchantingItemStack; + } else if (anvilStack != null && anvilStack.getItem() == Item.getItemFromBlock(Blocks.enchanting_table) && + currentState != EnchantState.ADDING_BOOK) { + currentState = EnchantState.HAS_ITEM_IN_BOOKS; + enchantingItem = enchantingItemStack; + } + + orbDisplay.physicsTickOrbs(); + + if (++tickCounter >= 20) { + tickCounter = 0; + } + + if (currentState == EnchantState.ADDING_BOOK) { + if (arrowAmount.getTarget() != 1) { + arrowAmount.setTarget(1); + arrowAmount.resetTimer(); + } + } else { + if (arrowAmount.getTarget() != 0) { + arrowAmount.setTarget(0); + arrowAmount.resetTimer(); + } + } + + isChangingEnchLevel = false; + + searchRemovedFromRemovable = false; + searchRemovedFromApplicable = false; + if (applicableItem.size() < 6) leftScroll.setValue(0); + applicableItem.clear(); + removableItem.clear(); + if (currentState == EnchantState.HAS_ITEM_IN_BOOKS || currentState == EnchantState.ADDING_BOOK) { + boolean hasRandomReforge = false; + for (int i = 0; i < 15; i++) { + int slotIndex = 12 + (i % 5) + (i / 5) * 9; + ItemStack book = cc.getLowerChestInventory().getStackInSlot(slotIndex); + ItemStack randomReforge = cc.getLowerChestInventory().getStackInSlot(48); + if (!hasRandomReforge && randomReforge != null && + randomReforge.getItem() == Item.getItemFromBlock(Blocks.anvil)) { //Make show when in dungeon screen + String name = Utils.cleanColour(randomReforge.getDisplayName()); + String id = Utils.cleanColour(randomReforge.getDisplayName()); + if (name.equals("Convert to Dungeon Item")) { + name = "Dungeonize Item"; + id = "CONVERT_TO_DUNGEON"; + } else if (name.equals("Random Basic Reforge")) { + name = "Basic Reforge"; + id = "RANDOM_REFORGE"; + } + HexItem reforgeItem = new HexItem(48, name, id, + Utils.getRawTooltip(randomReforge), true, true + ); + boolean hasAdded = false; + for (String lore : reforgeItem.displayLore) { + if (lore.contains("This item is already a Dungeon")) { + removableItem.add(reforgeItem); + hasAdded = true; + break; + } + } + if (!hasAdded) applicableItem.add(reforgeItem); + hasRandomReforge = true; + } + if (book != null) { + NBTTagCompound tagBook = book.getTagCompound(); + if (tagBook != null) { + NBTTagCompound ea = tagBook.getCompoundTag("ExtraAttributes"); + if (ea != null) { + NBTTagCompound enchantments = ea.getCompoundTag("enchantments"); + if (enchantments != null) { + String itemId = Utils.cleanColour(book.getDisplayName()).toUpperCase().replace(" ", "_").replace( + "-", + "_" + ); + String name = Utils.cleanColour(book.getDisplayName()); + if (itemId.equalsIgnoreCase("_")) continue; + if (itemId.equalsIgnoreCase("Item_Maxed_Out")) continue; + if (searchField.getText().trim().isEmpty() || + name.toLowerCase().contains(searchField.getText().trim().toLowerCase())) { + if (name.equalsIgnoreCase("Hot Potato Book")) { + name = "Hot Potato"; + } else if (name.equalsIgnoreCase("Fuming Potato Book")) { + name = "Fuming Potato"; + } else if (name.equalsIgnoreCase("Recombobulator 3000")) { + name = "Recombobulator"; + } else if (name.contains("Power Scroll")) { + name = name.replace("Power ", ""); + } else if (name.contains("\u272a")) { + name = name.replaceAll("[^✪]*", ""); + } else if (name.equalsIgnoreCase("First Master Star")) { + name = "Master Star \u00a7c➊"; + } else if (name.equalsIgnoreCase("Second Master Star")) { + name = "Master Star \u00a7c➋"; + } else if (name.equalsIgnoreCase("Third Master Star")) { + name = "Master Star \u00a7c➌"; + } else if (name.equalsIgnoreCase("Fourth Master Star")) { + name = "Master Star \u00a7c➍"; + } else if (name.equalsIgnoreCase("Fifth Master Star")) { + name = "Master Star \u00a7c➎"; + } else if (name.equalsIgnoreCase("The Art Of Peace")) { + name = "Art Of Peace"; + } else if (name.equalsIgnoreCase("Mana Disintegrator")) { + name = "M Disintegrator"; + } + /*if (playerEnchantIds.containsKey(itemId)) { + HexItem item = new HexItem(slotIndex, name, itemId, + Utils.getRawTooltip(book), false, false + ); + if (!item.overMaxLevel) { + removableItem.add(item); + } + enchanterItemLevels.put(item.level, item); + } else */ + { + HexItem item = new HexItem(slotIndex, name, itemId, + Utils.getRawTooltip(book), true, true + ); + enchanterItemLevels.put(item.level, item); + if (item.itemType != ItemType.UNKNOWN) { + int potatoCount = 0; + int killCount = 0; + int warCount = 0; + int ffdCount = 0; + int recombCount = 0; + int effLevel = 0; + int starCount = 0; + int singularityCount = 0; + int tunerCount = 0; + int peaceCount = 0; + int manaDisintegratorCount = 0; + boolean shadowWarp = false; + boolean witherShield = false; + boolean implosion = false; + String reforge = ""; + if (enchantingItem != null) { + NBTTagCompound tagItem = enchantingItem.getTagCompound(); + if (tagItem != null) { + NBTTagCompound extra = tagItem.getCompoundTag("ExtraAttributes"); + if (extra != null) { + potatoCount = extra.getInteger("hot_potato_count"); + killCount = extra.getInteger("stats_book"); + warCount = extra.getInteger("art_of_war_count"); + ffdCount = extra.getInteger("farming_for_dummies_count"); + recombCount = extra.getInteger("rarity_upgrades"); + starCount = extra.getInteger("upgrade_level"); + singularityCount = extra.getInteger("wood_singularity_count"); + tunerCount = extra.getInteger("tuned_transmission"); + peaceCount = extra.getInteger("art_of_peace_count"); + manaDisintegratorCount = extra.getInteger("mana_disintegrator_count"); + reforge = extra.getString("modifier"); + NBTTagCompound enchs = extra.getCompoundTag("enchantments"); + NBTTagList scrolls = extra.getTagList("ability_scroll", 8); + if (enchs != null) { + effLevel = enchs.getInteger("efficiency"); + } + if (scrolls != null) { + for (int index = 0; index < scrolls.tagCount(); index++) { + if (scrolls.getStringTagAt(index).equals("IMPLOSION_SCROLL")) { + implosion = true; + } else if (scrolls.getStringTagAt(index).equals("SHADOW_WARP_SCROLL")) { + shadowWarp = true; + } else if (scrolls.getStringTagAt(index).equals("WITHER_SHIELD_SCROLL")) { + witherShield = true; + } + } + } + } + } + } + if (item.itemName.length() > 14) item.itemName = item.itemName.substring(0, 14); + + if (item.itemType == ItemType.HOT_POTATO) { + if (potatoCount < 10) applicableItem.add(item); + else removableItem.add(item); + + } else if (item.itemType == ItemType.FUMING_POTATO) { + if (potatoCount >= 10 && potatoCount < 15) applicableItem.add(item); + else if (potatoCount >= 15) removableItem.add(item); + + } else if (item.itemType == ItemType.BOOK_OF_STATS) { + if (killCount > 0) removableItem.add(item); + else applicableItem.add(item); + + } else if (item.itemType == ItemType.ART_OF_WAR) { + if (warCount > 0) removableItem.add(item); + else applicableItem.add(item); + + } else if (item.itemType == ItemType.FARMING_DUMMY) { + if (ffdCount < 5) applicableItem.add(item); + else removableItem.add(item); + + } else if (item.itemType == ItemType.RECOMB) { + if (recombCount > 0) removableItem.add(item); + else applicableItem.add(item); + + } else if (item.itemType == ItemType.SILEX) { + if (effLevel >= 5 && effLevel < 10) applicableItem.add(item); + else if (effLevel == 10) removableItem.add(item); + + } else if (item.isPowerScroll()) { + applicableItem.add(item); + + } else if (item.isMasterStar()) { + applicableItem.add(item); + + } else if (item.isDungeonStar()) { + if (starCount >= item.itemType.getStarLevel()) removableItem.add(item); + else applicableItem.add(item); + + } else if (item.itemType == ItemType.WOOD_SINGULARITY) { + if (singularityCount > 0) removableItem.add(item); + else applicableItem.add(item); + + } else if (item.isHypeScroll()) { + if (shadowWarp) removableItem.add(item); + else if (implosion) removableItem.add(item); + else if (witherShield) removableItem.add(item); + else applicableItem.add(item); + + } else if (item.itemType == ItemType.TUNER) { + if (tunerCount >= 4) removableItem.add(item); + else applicableItem.add(item); + + } else if (item.itemType == ItemType.REFORGE) { + if (item.getReforge().equalsIgnoreCase(reforge) && !reforge.equals("")) removableItem.add(item); + else applicableItem.add(item); + + } else if (item.itemType == ItemType.ART_OF_PEACE) { + if (peaceCount > 0) removableItem.add(item); + else applicableItem.add(item); + + } else if (item.itemType == ItemType.MANA_DISINTEGRATOR) { + if (manaDisintegratorCount >= 10) removableItem.add(item); + else applicableItem.add(item); + + } else { + applicableItem.add(item); + } + } else { + applicableItem.add(item); + } + } + } else { + if (playerEnchantIds.containsKey(itemId)) { + searchRemovedFromRemovable = true; + } else { + searchRemovedFromApplicable = true; + } + } + } + } + } + } + } + NEUConfig cfg = NotEnoughUpdates.INSTANCE.config; + int mult = cfg.enchantingSolvers.enchantOrdering == 0 ? 1 : -1; + Comparator comparator = cfg.enchantingSolvers.enchantSorting == 0 ? + Comparator.comparingInt(e -> (int) (mult * e.price)) : + (c1, c2) -> mult * + c1.itemId.toLowerCase().compareTo(c2.itemId.toLowerCase()); + removableItem.sort(comparator); + applicableItem.sort(comparator); + } + } + + private void tickHex() { + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + ContainerChest cc = (ContainerChest) chest.inventorySlots; + + ItemStack enchantingItemStack = cc.getLowerChestInventory().getStackInSlot(22); + ItemStack glassStack = cc.getLowerChestInventory().getStackInSlot(12); + //ItemStack anvilStack = cc.getLowerChestInventory().getStackInSlot(28); + + this.lastState = currentState; + + if (enchantingItemStack != null) { + if (glassStack.getItem() != null && glassStack.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane)) { + if (glassStack.getItemDamage() == 14) { + currentState = EnchantState.INVALID_ITEM_HEX; + } else if (glassStack.getItemDamage() == 10) { + currentState = EnchantState.HAS_ITEM_IN_HEX; + } else { + currentState = EnchantState.NO_ITEM_IN_HEX; + } + enchantingItem = enchantingItemStack; + } + } else { + currentState = EnchantState.NO_ITEM_IN_HEX; + } + + orbDisplay.physicsTickOrbs(); + + if (++tickCounter >= 20) { + tickCounter = 0; + } + + if (currentState == EnchantState.ADDING_BOOK) { + if (arrowAmount.getTarget() != 1) { + arrowAmount.setTarget(1); + arrowAmount.resetTimer(); + } + } else { + if (arrowAmount.getTarget() != 0) { + arrowAmount.setTarget(0); + arrowAmount.resetTimer(); + } + } + + isChangingEnchLevel = false; + + searchRemovedFromRemovable = false; + searchRemovedFromApplicable = false; + applicableItem.clear(); + removableItem.clear(); + boolean hasHexItem = false; + if (currentState == EnchantState.HAS_ITEM_IN_HEX) { + for (int i = 0; i < 9; i++) { + int slotIndex = 15 + (i % 3) + (i / 3) * 9; + ItemStack book = cc.getLowerChestInventory().getStackInSlot(slotIndex); + if (!hasHexItem && glassStack != null) { + HexItem item = new HexItem(slotIndex, "Total Upgrades", "TOTAL_UPGRADES", + Utils.getRawTooltip(glassStack), true, true + ); + removableItem.add(item); + hasHexItem = true; + } + if (book != null) { + NBTTagCompound tagBook = book.getTagCompound(); + if (tagBook != null) { + NBTTagCompound ea = tagBook.getCompoundTag("ExtraAttributes"); + if (ea != null) { + NBTTagCompound enchantments = ea.getCompoundTag("enchantments"); + if (enchantments != null) { + String itemId = Utils.cleanColour(book.getDisplayName()).toUpperCase().replace(" ", "_").replace( + "-", + "_" + ); + String name = Utils.cleanColour(book.getDisplayName()); + if (itemId.equalsIgnoreCase("_")) continue; + if (itemId.equalsIgnoreCase("Item_Maxed_Out")) continue; + if (searchField.getText().trim().isEmpty() || + name.toLowerCase().contains(searchField.getText().trim().toLowerCase())) { + if (name.equalsIgnoreCase("Ultimate Enchantments")) { + name = "Ult Enchants"; + } + /*if (playerEnchantIds.containsKey(itemId)) { + HexItem item = new HexItem(slotIndex, name, itemId, + Utils.getRawTooltip(book), false, false + ); + if (!item.overMaxLevel) { + removableItem.add(item); + } + enchanterItemLevels.put(item.level, item); + } else */ + { + HexItem item = new HexItem(slotIndex, name, "HEX_ITEM" + i, + Utils.getRawTooltip(book), true, true + ); + enchanterItemLevels.put(item.level, item); + applicableItem.add(item); + } + } else { + if (playerEnchantIds.containsKey(itemId)) { + searchRemovedFromRemovable = true; + } else { + searchRemovedFromApplicable = true; + } + } + } + } + } + } + } + NEUConfig cfg = NotEnoughUpdates.INSTANCE.config; + int mult = cfg.enchantingSolvers.enchantOrdering == 0 ? 1 : -1; + Comparator comparator = cfg.enchantingSolvers.enchantSorting == 0 ? + Comparator.comparingInt(e -> (int) (mult * e.price)) : + (c1, c2) -> mult * + c1.itemId.toLowerCase().compareTo(c2.itemId.toLowerCase()); + removableItem.sort(comparator); + applicableItem.sort(comparator); + } + } + + private void tickGemstones() { + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + ContainerChest cc = (ContainerChest) chest.inventorySlots; + + ItemStack enchantingItemStack = cc.getLowerChestInventory().getStackInSlot(19); + ItemStack portalStack = cc.getLowerChestInventory().getStackInSlot(28); + + int lastPage = currentPage; + this.lastState = currentState; + if (portalStack != null && portalStack.getItem() == Item.getItemFromBlock(Blocks.end_portal_frame) && + currentState != EnchantState.ADDING_GEMSTONE && !shouldOverrideGemstones && + currentState != EnchantState.APPLYING_GEMSTONE) { + currentState = EnchantState.HAS_ITEM_IN_GEMSTONE; + enchantingItem = enchantingItemStack; + } else if (portalStack != null && portalStack.getItem() == Item.getItemFromBlock(Blocks.end_portal_frame) && + shouldOverrideGemstones && currentState != EnchantState.APPLYING_GEMSTONE) { + currentState = EnchantState.ADDING_GEMSTONE; + } else if (currentState == EnchantState.HAS_ITEM_IN_GEMSTONE && enchantingItem == null && + enchantingItemStack != null) { + enchantingItem = enchantingItemStack; + } else if (currentState != EnchantState.APPLYING_GEMSTONE) { + currentState = EnchantState.HAS_ITEM_IN_GEMSTONE; + } + + if (currentState == EnchantState.APPLYING_GEMSTONE || currentState == EnchantState.ADDING_GEMSTONE) { + ItemStack pageUpStack = cc.getLowerChestInventory().getStackInSlot(17); + ItemStack pageDownStack = cc.getLowerChestInventory().getStackInSlot(35); + if (pageUpStack != null && pageDownStack != null) { + currentPage = 0; + boolean upIsGlass = pageUpStack.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane); + boolean downIsGlass = pageDownStack.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane); + int page = -1; + + expectedMaxPage = 1; + if (!downIsGlass) { + try { + page = Integer.parseInt(Utils.getRawTooltip(pageDownStack).get(1).substring(11)) - 1; + expectedMaxPage = page + 1; + } catch (Exception ignored) { + } + } + if (page == -1 && !upIsGlass) { + try { + page = Integer.parseInt(Utils.getRawTooltip(pageUpStack).get(1).substring(11)) + 1; + expectedMaxPage = page; + } catch (Exception ignored) { + } + } + if (page == -1) { + currentPage = 1; + } else { + currentPage = page; + } + } + } + + orbDisplay.physicsTickOrbs(); + + if (++tickCounter >= 20) { + tickCounter = 0; + } + + if (lastState != currentState || lastPage != currentPage) { + leftScroll.setValue(0); + rightScroll.setValue(0); + } + + if (currentState == EnchantState.APPLYING_GEMSTONE) { + if (arrowAmount.getTarget() != 1) { + arrowAmount.setTarget(1); + arrowAmount.resetTimer(); + } + } else { + if (arrowAmount.getTarget() != 0) { + arrowAmount.setTarget(0); + arrowAmount.resetTimer(); + } + } + + isChangingEnchLevel = false; + + searchRemovedFromRemovable = false; + searchRemovedFromApplicable = false; + applicableItem.clear(); + removableItem.clear(); + if (isInGemstones()) { + for (int i = 0; i < 15; i++) { + int slotIndex = 12 + (i % 5) + (i / 5) * 9; + ItemStack book = cc.getLowerChestInventory().getStackInSlot(slotIndex); + if (book != null) { + NBTTagCompound tagBook = book.getTagCompound(); + if (tagBook != null) { + NBTTagCompound ea = tagBook.getCompoundTag("ExtraAttributes"); + if (ea != null) { + NBTTagCompound enchantments = ea.getCompoundTag("enchantments"); + if (enchantments != null) { + String itemId = Utils.cleanColour(book.getDisplayName()).toUpperCase().replace(" ", "_").replace( + "-", + "_" + ); + String name = Utils.cleanColour(book.getDisplayName()); + if (itemId.equalsIgnoreCase("_")) continue; + if (itemId.equalsIgnoreCase("Item_Maxed_Out")) continue; + if (searchField.getText().trim().isEmpty() || + name.toLowerCase().contains(searchField.getText().trim().toLowerCase())) { + /*if (playerEnchantIds.containsKey(itemId)) { + HexItem item = new HexItem(slotIndex, name, itemId, + Utils.getRawTooltip(book), false, false + ); + if (!item.overMaxLevel) { + removableItem.add(item); + } + enchanterItemLevels.put(item.level, item); + } else */ + { + HexItem item = new HexItem(slotIndex, name, itemId, + Utils.getRawTooltip(book), true, true + ); + enchanterItemLevels.put(item.level, item); + if (item.isGemstone()) { + if (book.getItem() == Items.dye) { + item.conflicts = true; + } + boolean removed = false; + for (String lore : item.displayLore) { + if (lore.contains("Click to remove!")) { + removableItem.add(item); + removed = true; + break; + } + } + if (!removed) { + applicableItem.add(item); + } + if (item.itemName.length() > 14) item.itemName = item.itemName.substring(0, 14); + } else { + applicableItem.add(item); + } + } + } else { + if (playerEnchantIds.containsKey(itemId)) { + searchRemovedFromRemovable = true; + } else { + searchRemovedFromApplicable = true; + } + } + } + } + } + } + } + NEUConfig cfg = NotEnoughUpdates.INSTANCE.config; + int mult = cfg.enchantingSolvers.enchantOrdering == 0 ? 1 : -1; + Comparator comparator = cfg.enchantingSolvers.enchantSorting == 0 ? + Comparator.comparingInt(e -> (int) (mult * e.price)) : + (c1, c2) -> mult * + c1.itemId.toLowerCase().compareTo(c2.itemId.toLowerCase()); + removableItem.sort(comparator); + applicableItem.sort(comparator); + } + this.pageOpenLast = this.pageOpen; + } + + private List createTooltip(String title, int selectedOption, String... options) { + String selPrefix = EnumChatFormatting.DARK_AQUA + " \u25b6 "; + String unselPrefix = EnumChatFormatting.GRAY.toString(); + + for (int i = 0; i < options.length; i++) { + if (i == selectedOption) { + options[i] = selPrefix + options[i]; + } else { + options[i] = unselPrefix + options[i]; + } + } + + List list = Lists.newArrayList(options); + list.add(0, ""); + list.add(0, EnumChatFormatting.GREEN + title); + return list; + } + + public void render(float partialTicks, String containerName) { + if (containerName == null) return; + if (containerName.equals("The Hex")) { + renderHex(partialTicks); + } else if (containerName.contains("Enchant Item")) { + renderEnchantment(partialTicks); + } else if (containerName.contains("Books") || containerName.contains("Modifiers") || containerName.contains("Bottles of Enchanting")) { + renderBooks(partialTicks); + } else if (containerName.contains("Gemstones")) { + renderGemstones(partialTicks); + } else { + renderBooks(partialTicks); + } + } + + private void renderEnchantment(float partialTicks) { + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return; + + int playerXpLevel = Minecraft.getMinecraft().thePlayer.experienceLevel; + + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + ContainerChest cc = (ContainerChest) chest.inventorySlots; + + leftScroll.tick(); + rightScroll.tick(); + arrowAmount.tick(); + + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + int width = scaledResolution.getScaledWidth(); + int height = scaledResolution.getScaledHeight(); + int mouseX = Mouse.getX() * width / Minecraft.getMinecraft().displayWidth; + int mouseY = height - Mouse.getY() * height / Minecraft.getMinecraft().displayHeight - 1; + + guiLeft = (width - X_SIZE) / 2; + guiTop = (height - Y_SIZE) / 2; + + List tooltipToDisplay = null; + boolean disallowClick = false; + ItemStack stackOnMouse = Minecraft.getMinecraft().thePlayer.inventory.getItemStack(); + int itemHoverX = -1; + int itemHoverY = -1; + boolean hoverLocked = false; + + drawGradientRect(0, 0, width, height, 0xc0101010, 0xd0101010); + + renderBaseTexture(); + + Minecraft.getMinecraft().fontRendererObj.drawString("Applicable", guiLeft + 7, guiTop + 7, 0x404040, false); + Minecraft.getMinecraft().fontRendererObj.drawString("Removable", guiLeft + 247, guiTop + 7, 0x404040, false); + + //Page Text + if (currentState == EnchantState.HAS_ITEM || currentState == EnchantState.ADDING_ENCHANT) { + String pageStr = "Page: " + currentPage + "/" + expectedMaxPage; + int pageStrLen = Minecraft.getMinecraft().fontRendererObj.getStringWidth(pageStr); + Utils.drawStringCentered(pageStr, Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2, guiTop + 14, false, 0x404040 + ); + + //Page Arrows + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 - pageStrLen / 2 - 2 - 15, guiTop + 6, 15, 15, + 0, 15 / 512f, 372 / 512f, 387 / 512f, GL11.GL_NEAREST + ); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 + pageStrLen / 2 + 2, guiTop + 6, 15, 15, + 15 / 512f, 30 / 512f, 372 / 512f, 387 / 512f, GL11.GL_NEAREST + ); + } + + tooltipToDisplay = renderSettings(mouseX, mouseY, tooltipToDisplay); + + renderScrollBars(applicable, removable, mouseY); + + //Enchant book model + renderEnchantBook(scaledResolution, partialTicks); + + //Can't be enchanted text + if (currentState == EnchantState.INVALID_ITEM) { + GlStateManager.disableDepth(); + Utils.drawStringCentered("This item can't", Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2, guiTop + 88, true, 0xffff5555 + ); + Utils.drawStringCentered("be enchanted", Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2, guiTop + 98, true, 0xffff5555 + ); + GlStateManager.enableDepth(); + } + + renderArrow(); + + //Text if no enchants appear + if (currentState == EnchantState.HAS_ITEM || currentState == EnchantState.ADDING_ENCHANT) { + if (applicable.isEmpty() && removable.isEmpty() && searchRemovedFromApplicable) { + Utils.drawStringCentered("Can't find that", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 8 + 48, guiTop + 28, true, 0xffff5555 + ); + Utils.drawStringCentered("enchant, perhaps", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 8 + 48, guiTop + 38, true, 0xffff5555 + ); + Utils.drawStringCentered("it is on", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 8 + 48, guiTop + 48, true, 0xffff5555 + ); + Utils.drawStringCentered("another page?", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 8 + 48, guiTop + 58, true, 0xffff5555 + ); + } else if (applicable.isEmpty() && !searchRemovedFromApplicable) { + Utils.drawStringCentered("No applicable", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 8 + 48, guiTop + 28, true, 0xffff5555 + ); + Utils.drawStringCentered("enchants on", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 8 + 48, guiTop + 38, true, 0xffff5555 + ); + Utils.drawStringCentered("this page...", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 8 + 48, guiTop + 48, true, 0xffff5555 + ); + } + if (applicable.isEmpty() && removable.isEmpty() && searchRemovedFromRemovable) { + Utils.drawStringCentered("Can't find that", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 248 + 48, guiTop + 28, true, 0xffff5555 + ); + Utils.drawStringCentered("enchant, perhaps", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 248 + 48, guiTop + 38, true, 0xffff5555 + ); + Utils.drawStringCentered("it is on", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 248 + 48, guiTop + 48, true, 0xffff5555 + ); + Utils.drawStringCentered("another page?", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 248 + 48, guiTop + 58, true, 0xffff5555 + ); + } else if (removable.isEmpty() && !searchRemovedFromRemovable) { + Utils.drawStringCentered("No removable", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 248 + 48, guiTop + 28, true, 0xffff5555 + ); + Utils.drawStringCentered("enchants on", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 248 + 48, guiTop + 38, true, 0xffff5555 + ); + Utils.drawStringCentered("this page...", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 248 + 48, guiTop + 48, true, 0xffff5555 + ); + } + } + //Available enchants (left) + GlScissorStack.push(0, guiTop + 18, width, guiTop + 18 + 96, scaledResolution); + for (int i = 0; i < 7; i++) { + int index = i + leftScroll.getValue() / 16; + + if (applicable.size() <= index) break; + Enchantment ench = applicable.get(index); + + int top = guiTop - (leftScroll.getValue() % 16) + 18 + 16 * i; + int vOffset = enchanterCurrentEnch != null && enchanterCurrentEnch.enchId.equals(ench.enchId) ? 16 : 0; + int uOffset = ench.conflicts ? 112 : 0; + int textOffset = vOffset / 16; + + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + 8, top, 96, 16, + uOffset / 512f, (96 + uOffset) / 512f, (249 + vOffset) / 512f, (249 + 16 + vOffset) / 512f, GL11.GL_NEAREST + ); + + if (mouseX > guiLeft + 8 && mouseX <= guiLeft + 8 + 96 && + mouseY > top && mouseY <= top + 16) { + disallowClick = true; + if (ench.displayLore != null) { + tooltipToDisplay = ench.displayLore; + } + } + + String levelStr = "" + ench.xpCost; + int colour = 0xc8ff8f; + if (ench.xpCost > playerXpLevel) { + colour = 0xff5555; + } + + int levelWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(levelStr); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2 - 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2 + 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2, + top + 4 - 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2, + top + 4 + 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2, + top + 4, + colour, + false + ); + + Minecraft.getMinecraft().fontRendererObj.drawString( + ench.enchantName, + guiLeft + 8 + 16 + 2 + textOffset, + top + 4 + textOffset, + 0xffffffdd, + true + ); + } + GlScissorStack.pop(scaledResolution); + + //Removable enchants (right) + GlScissorStack.push(0, guiTop + 18, width, guiTop + 18 + 96, scaledResolution); + for (int i = 0; i < 7; i++) { + int index = i + rightScroll.getValue() / 16; + + if (removable.size() <= index) break; + Enchantment ench = removable.get(index); + + int top = guiTop - (rightScroll.getValue() % 16) + 18 + 16 * i; + int vOffset = enchanterCurrentEnch != null && enchanterCurrentEnch.enchId.equals(ench.enchId) ? 16 : 0; + int textOffset = vOffset / 16; + + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + 248, top, 96, 16, + 0, 96 / 512f, (249 + vOffset) / 512f, (249 + 16 + vOffset) / 512f, GL11.GL_NEAREST + ); + + if (mouseX > guiLeft + 248 && mouseX <= guiLeft + 248 + 96 && + mouseY > top && mouseY <= top + 16) { + disallowClick = true; + if (ench.displayLore != null) { + tooltipToDisplay = ench.displayLore; + } + } + + String levelStr = "" + ench.xpCost; + if (ench.xpCost < 0) levelStr = "?"; + int colour = 0xc8ff8f; + if (ench.xpCost > playerXpLevel) { + colour = 0xff5555; + } + + int levelWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(levelStr); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2 - 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2 + 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2, + top + 4 - 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2, + top + 4 + 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2, + top + 4, + colour, + false + ); + + Minecraft.getMinecraft().fontRendererObj.drawString(ench.enchantName, + guiLeft + 248 + 16 + 2 + textOffset, top + 4 + textOffset, 0xffffffdd, true + ); + } + GlScissorStack.pop(scaledResolution); + + //Player Inventory Items + Minecraft.getMinecraft().fontRendererObj.drawString(Minecraft.getMinecraft().thePlayer.inventory + .getDisplayName() + .getUnformattedText(), + guiLeft + 102, guiTop + Y_SIZE - 96 + 2, 0x404040 + ); + int inventoryStartIndex = cc.getLowerChestInventory().getSizeInventory(); + GlStateManager.enableDepth(); + for (int i = 0; i < 36; i++) { + int itemX = guiLeft + 102 + 18 * (i % 9); + int itemY = guiTop + 133 + 18 * (i / 9); + + if (i >= 27) { + itemY += 4; + } + + GlStateManager.pushMatrix(); + GlStateManager.translate(guiLeft + 102 - 8, guiTop + 191 - (inventoryStartIndex / 9 * 18 + 89), 0); + Slot slot = cc.getSlot(inventoryStartIndex + i); + ((AccessorGuiContainer) chest).doDrawSlot(slot); + GlStateManager.popMatrix(); + + if (mouseX >= itemX && mouseX < itemX + 18 && + mouseY >= itemY && mouseY < itemY + 18) { + itemHoverX = itemX; + itemHoverY = itemY; + hoverLocked = SlotLocking.getInstance().isSlotLocked(slot); + + if (slot.getHasStack()) { + tooltipToDisplay = slot.getStack().getTooltip( + Minecraft.getMinecraft().thePlayer, + Minecraft.getMinecraft().gameSettings.advancedItemTooltips + ); + } + } + } + + //Search bar + if (currentState == EnchantState.HAS_ITEM) { + if (searchField.getText().isEmpty() && !searchField.getFocus()) { + searchField.setSize(90, 14); + searchField.setPrependText("\u00a77Search..."); + } else { + if (searchField.getFocus()) { + int len = Minecraft.getMinecraft().fontRendererObj.getStringWidth(searchField.getTextDisplay()) + 10; + searchField.setSize(Math.max(90, len), 14); + } else { + searchField.setSize(90, 14); + } + searchField.setPrependText(""); + } + searchField.render(guiLeft + X_SIZE / 2 - searchField.getWidth() / 2, guiTop + 83); + } else if (currentState == EnchantState.ADDING_ENCHANT && + enchanterCurrentEnch != null && !enchanterEnchLevels.isEmpty()) { + int left = guiLeft + X_SIZE / 2 - 56; + int top = guiTop + 83; + + int uOffset = enchanterCurrentEnch.conflicts ? 112 : 0; + + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(left, top, 112, 16, + uOffset / 512f, (112 + uOffset) / 512f, 249 / 512f, (249 + 16) / 512f, GL11.GL_NEAREST + ); + + if (mouseX > left + 16 && mouseX <= left + 96 && + mouseY > top && mouseY <= top + 16) { + disallowClick = true; + if (enchanterCurrentEnch.displayLore != null) { + tooltipToDisplay = enchanterCurrentEnch.displayLore; + } + } + + //Enchant cost + String levelStr = "" + enchanterCurrentEnch.xpCost; + if (enchanterCurrentEnch.xpCost < 0) levelStr = "?"; + + int colour = 0xc8ff8f; + if (enchanterCurrentEnch.xpCost > playerXpLevel) { + colour = 0xff5555; + } + + int levelWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(levelStr); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 8 - levelWidth / 2 - 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 8 - levelWidth / 2 + 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 8 - levelWidth / 2, + top + 4 - 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 8 - levelWidth / 2, + top + 4 + 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString(levelStr, left + 8 - levelWidth / 2, top + 4, colour, false); + + //Enchant name + String name = WordUtils.capitalizeFully(enchanterCurrentEnch.enchId.replace("_", " ")); + if (name.equalsIgnoreCase("Bane of Arthropods")) { + name = "Bane of Arth."; + } else if (name.equalsIgnoreCase("Projectile Protection")) { + name = "Projectile Prot"; + } else if (name.equalsIgnoreCase("Blast Protection")) { + name = "Blast Prot"; + } else if (name.equalsIgnoreCase("Luck of the Sea")) { + name = "Luck of Sea"; + } else if (name.equalsIgnoreCase("Turbo Mushrooms")) { + name = "Turbo-Mush"; + } + Utils.drawStringCentered( + name, + Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2, + top + 8, + true, + 0xffffffdd + ); + + if (isChangingEnchLevel) { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(left + 96, top, 16, 16, + 96 / 512f, 112 / 512f, 265 / 512f, (265 + 16) / 512f, GL11.GL_NEAREST + ); + } + + //Enchant level + levelStr = "" + enchanterCurrentEnch.level; + if (enchanterCurrentEnch.xpCost < 0) levelStr = "?"; + levelWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(levelStr); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 96 + 8 - levelWidth / 2 - 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 96 + 8 - levelWidth / 2 + 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 96 + 8 - levelWidth / 2, + top + 4 - 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 96 + 8 - levelWidth / 2, + top + 4 + 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 96 + 8 - levelWidth / 2, + top + 4, + 0xea82ff, + false + ); + + //Confirm button + + String confirmText = "Apply"; + if (removingEnchantPlayerLevel >= 0) { + if (removingEnchantPlayerLevel == enchanterCurrentEnch.level) { + confirmText = "Remove"; + } else if (enchanterCurrentEnch.level > removingEnchantPlayerLevel) { + confirmText = "Upgrade"; + } else { + confirmText = "Bad Level"; + } + } + if (System.currentTimeMillis() - confirmButtonAnimTime < 500 && !(playerXpLevel < enchanterCurrentEnch.xpCost)) { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 - 1 - 48, top + 18, 48, 14, + 0, 48 / 512f, 342 / 512f, (342 + 14) / 512f, GL11.GL_NEAREST + ); + Utils.drawStringCentered(confirmText, Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2 - 1 - 23, top + 18 + 9, false, 0x408040 + ); + } else { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 - 1 - 48, top + 18, 48, 14, + 0, 48 / 512f, 328 / 512f, (328 + 14) / 512f, GL11.GL_NEAREST + ); + Utils.drawStringCentered(confirmText, Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2 - 1 - 24, top + 18 + 8, false, 0x408040 + ); + + if (playerXpLevel < enchanterCurrentEnch.xpCost) { + Gui.drawRect(guiLeft + X_SIZE / 2 - 1 - 48, top + 18, guiLeft + X_SIZE / 2 - 1, top + 18 + 14, 0x80000000); + } + } + + //Cancel button + if (System.currentTimeMillis() - cancelButtonAnimTime < 500) { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 + 1, top + 18, 48, 14, + 0, 48 / 512f, 342 / 512f, (342 + 14) / 512f, GL11.GL_NEAREST + ); + Utils.drawStringCentered("Cancel", Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2 + 1 + 25, top + 18 + 9, false, 0xa04040 + ); + } else { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 + 1, top + 18, 48, 14, + 0, 48 / 512f, 328 / 512f, (328 + 14) / 512f, GL11.GL_NEAREST + ); + Utils.drawStringCentered("Cancel", Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2 + 1 + 24, top + 18 + 8, false, 0xa04040 + ); + } + + if (mouseY > top + 18 && mouseY <= top + 18 + 16) { + if (mouseX > guiLeft + X_SIZE / 2 - 1 - 48 && mouseX <= guiLeft + X_SIZE / 2 - 1) { + disallowClick = true; + if (enchanterCurrentEnch.displayLore != null) { + tooltipToDisplay = enchanterCurrentEnch.displayLore; + } + } else if (mouseX > guiLeft + X_SIZE / 2 + 1 && mouseX <= guiLeft + X_SIZE / 2 + 1 + 48) { + disallowClick = true; + tooltipToDisplay = Lists.newArrayList("\u00a7cCancel"); + } + } + + //Enchant level switcher + if (isChangingEnchLevel) { + tooltipToDisplay = null; + + List before = new ArrayList<>(); + List after = new ArrayList<>(); + + for (Enchantment ench : enchanterEnchLevels.values()) { + if (ench.level < enchanterCurrentEnch.level) { + before.add(ench); + } else if (ench.level > enchanterCurrentEnch.level) { + after.add(ench); + } + } + + before.sort(Comparator.comparingInt(o -> -o.level)); + after.sort(Comparator.comparingInt(o -> o.level)); + + int bSize = before.size(); + int aSize = after.size(); + GlStateManager.disableDepth(); + for (int i = 0; i < bSize + aSize; i++) { + Enchantment ench; + int yIndex; + if (i < bSize) { + ench = before.get(i); + yIndex = -i - 1; + } else { + ench = after.get(i - bSize); + yIndex = i - bSize + 1; + } + + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + + int type = 0; + if (i == bSize) { + type = 2; + } else if (i == 0) { + type = 1; + } + + if (mouseX > left + 96 && mouseX <= left + 96 + 16 && + mouseY > top + 16 * yIndex && mouseY <= top + 16 * yIndex + 16) { + tooltipToDisplay = new ArrayList<>(ench.displayLore); + if (tooltipToDisplay.size() > 2) { + tooltipToDisplay.remove(tooltipToDisplay.size() - 1); + tooltipToDisplay.remove(tooltipToDisplay.size() - 1); + } + itemHoverX = -1; + itemHoverY = -1; + } + + Utils.drawTexturedRect(left + 96, top + 16 * yIndex, 16, 16, + 16 * type / 512f, (16 + 16 * type) / 512f, 356 / 512f, (356 + 16) / 512f, GL11.GL_NEAREST + ); + + levelStr = "" + ench.level; + levelWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(levelStr); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 96 + 8 - levelWidth / 2 - 1, + top + 16 * yIndex + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 96 + 8 - levelWidth / 2 + 1, + top + 16 * yIndex + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 96 + 8 - levelWidth / 2, + top + 16 * yIndex + 4 - 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 96 + 8 - levelWidth / 2, + top + 16 * yIndex + 4 + 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 96 + 8 - levelWidth / 2, + top + 16 * yIndex + 4, + 0xea82ff, + false + ); + } + GlStateManager.enableDepth(); + } + + if (mouseX > left + 96 && mouseX <= left + 96 + 16 && + mouseY > top && mouseY <= top + 16) { + if (isChangingEnchLevel) { + tooltipToDisplay = Lists.newArrayList("\u00a7cCancel level change"); + } else { + tooltipToDisplay = Lists.newArrayList("\u00a7aChange enchant level"); + } + } + } + + if (currentState == EnchantState.HAS_ITEM) { + renderCancel(); + } + + //Item enchant input + ItemStack itemEnchantInput; + if (currentState == EnchantState.HAS_ITEM_IN_HEX) { + itemEnchantInput = cc.getSlot(22).getStack(); + } else { + itemEnchantInput = cc.getSlot(19).getStack(); + } + if (itemEnchantInput != null && itemEnchantInput.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane)) { + itemEnchantInput = enchantingItem; + } + { + int itemX = guiLeft + 174; + int itemY = guiTop + 58; + + if (itemEnchantInput == null) { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(itemX, itemY, 16, 16, + 0, 16 / 512f, 281 / 512f, (281 + 16) / 512f, GL11.GL_NEAREST + ); + } else { + Utils.drawItemStack(itemEnchantInput, itemX, itemY); + } + + if (mouseX >= itemX && mouseX < itemX + 18 && + mouseY >= itemY && mouseY < itemY + 18) { + itemHoverX = itemX; + itemHoverY = itemY; + + if (itemEnchantInput != null) { + tooltipToDisplay = itemEnchantInput.getTooltip( + Minecraft.getMinecraft().thePlayer, + Minecraft.getMinecraft().gameSettings.advancedItemTooltips + ); + } + } + } + + if (!isChangingEnchLevel && itemHoverX >= 0 && itemHoverY >= 0) { + GlStateManager.disableDepth(); + GlStateManager.colorMask(true, true, true, false); + Gui.drawRect(itemHoverX, itemHoverY, itemHoverX + 16, itemHoverY + 16, + hoverLocked ? 0x80ff8080 : 0x80ffffff + ); + GlStateManager.colorMask(true, true, true, true); + GlStateManager.enableDepth(); + } + + GlStateManager.translate(0, 0, 300); + + renderOrbAnim(partialTicks); + + renderMouseStack(stackOnMouse, disallowClick, mouseX, mouseY, + width, height, tooltipToDisplay + ); + GlStateManager.translate(0, 0, -300); + } + + private void renderBooks(float partialTicks) { + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return; + + int playerXpLevel = Minecraft.getMinecraft().thePlayer.experienceLevel; + + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + ContainerChest cc = (ContainerChest) chest.inventorySlots; + + leftScroll.tick(); + rightScroll.tick(); + arrowAmount.tick(); + + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + int width = scaledResolution.getScaledWidth(); + int height = scaledResolution.getScaledHeight(); + int mouseX = Mouse.getX() * width / Minecraft.getMinecraft().displayWidth; + int mouseY = height - Mouse.getY() * height / Minecraft.getMinecraft().displayHeight - 1; + + guiLeft = (width - X_SIZE) / 2; + guiTop = (height - Y_SIZE) / 2; + + List tooltipToDisplay = null; + boolean disallowClick = false; + ItemStack stackOnMouse = Minecraft.getMinecraft().thePlayer.inventory.getItemStack(); + int itemHoverX = -1; + int itemHoverY = -1; + boolean hoverLocked = false; + + drawGradientRect(0, 0, width, height, 0xc0101010, 0xd0101010); + + renderBaseTexture(); + + Minecraft.getMinecraft().fontRendererObj.drawString("Applicable", guiLeft + 7, guiTop + 7, 0x404040, false); + Minecraft.getMinecraft().fontRendererObj.drawString("Applied", guiLeft + 247, guiTop + 7, 0x404040, false); + + //Page Text + /*if (currentState == EnchantState.HAS_ITEM || currentState == EnchantState.ADDING_ENCHANT) { + String pageStr = "Page: " + currentPage + "/" + expectedMaxPage; + int pageStrLen = Minecraft.getMinecraft().fontRendererObj.getStringWidth(pageStr); + Utils.drawStringCentered(pageStr, Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2, guiTop + 14, false, 0x404040 + ); + + //Page Arrows + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 - pageStrLen / 2 - 2 - 15, guiTop + 6, 15, 15, + 0, 15 / 512f, 372 / 512f, 387 / 512f, GL11.GL_NEAREST + ); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 + pageStrLen / 2 + 2, guiTop + 6, 15, 15, + 15 / 512f, 30 / 512f, 372 / 512f, 387 / 512f, GL11.GL_NEAREST + ); + }*/ + + tooltipToDisplay = renderSettings(mouseX, mouseY, tooltipToDisplay); + + renderScrollBars(applicableItem, applicableItem, mouseY); + + //Enchant book model + renderEnchantBook(scaledResolution, partialTicks); + + //Can't be enchanted text + /*if (currentState == EnchantState.INVALID_ITEM) { + GlStateManager.disableDepth(); + Utils.drawStringCentered("This item can't", Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2, guiTop + 88, true, 0xffff5555 + ); + Utils.drawStringCentered("be enchanted", Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2, guiTop + 98, true, 0xffff5555 + ); + GlStateManager.enableDepth(); + }*/ + + renderArrow(); + + //Text if no enchants appear + if (currentState == EnchantState.HAS_ITEM || currentState == EnchantState.ADDING_ENCHANT || + currentState == EnchantState.HAS_ITEM_IN_BOOKS || currentState == EnchantState.ADDING_BOOK) { + if (applicableItem.isEmpty() && removableItem.isEmpty() && searchRemovedFromApplicable) { + Utils.drawStringCentered("Can't find that", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 8 + 48, guiTop + 28, true, 0xffff5555 + ); + Utils.drawStringCentered("enchant, perhaps", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 8 + 48, guiTop + 38, true, 0xffff5555 + ); + Utils.drawStringCentered("it is on", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 8 + 48, guiTop + 48, true, 0xffff5555 + ); + Utils.drawStringCentered("another page?", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 8 + 48, guiTop + 58, true, 0xffff5555 + ); + } else if (applicableItem.isEmpty() && !searchRemovedFromApplicable) { + Utils.drawStringCentered("No applicable", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 8 + 48, guiTop + 28, true, 0xffff5555 + ); + Utils.drawStringCentered("enchants on", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 8 + 48, guiTop + 38, true, 0xffff5555 + ); + Utils.drawStringCentered("this page...", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 8 + 48, guiTop + 48, true, 0xffff5555 + ); + } + if (applicableItem.isEmpty() && removableItem.isEmpty() && searchRemovedFromRemovable) { + Utils.drawStringCentered("Can't find that", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 248 + 48, guiTop + 28, true, 0xffff5555 + ); + Utils.drawStringCentered("enchant, perhaps", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 248 + 48, guiTop + 38, true, 0xffff5555 + ); + Utils.drawStringCentered("it is on", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 248 + 48, guiTop + 48, true, 0xffff5555 + ); + Utils.drawStringCentered("another page?", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 248 + 48, guiTop + 58, true, 0xffff5555 + ); + } else if (removableItem.isEmpty() && !searchRemovedFromRemovable) { + Utils.drawStringCentered("No removable", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 248 + 48, guiTop + 28, true, 0xffff5555 + ); + Utils.drawStringCentered("enchants on", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 248 + 48, guiTop + 38, true, 0xffff5555 + ); + Utils.drawStringCentered("this page...", Minecraft.getMinecraft().fontRendererObj, + guiLeft + 248 + 48, guiTop + 48, true, 0xffff5555 + ); + } + } + //Available enchants (left) + GlScissorStack.push(0, guiTop + 18, width, guiTop + 18 + 96, scaledResolution); + for (int i = 0; i < 7; i++) { + int index = i + leftScroll.getValue() / 16; + + if (applicableItem.size() <= index) break; + HexItem item = applicableItem.get(index); + + int top = guiTop - (leftScroll.getValue() % 16) + 18 + 16 * i; + int vOffset = enchanterCurrentItem != null && enchanterCurrentItem.itemId.equals(item.itemId) ? 16 : 0; + int uOffset = item.conflicts ? 112 : 0; + int textOffset = vOffset / 16; + + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + 8, top, 96, 16, + uOffset / 512f, (96 + uOffset) / 512f, (249 + vOffset) / 512f, (249 + 16 + vOffset) / 512f, GL11.GL_NEAREST + ); + + if (mouseX > guiLeft + 8 && mouseX <= guiLeft + 8 + 96 && + mouseY > top && mouseY <= top + 16) { + disallowClick = true; + if (item.displayLore != null) { + tooltipToDisplay = item.displayLore; + } + } + + String levelStr = getIconStr(item); + int colour = 0xc8ff8f; + if (item.price > playerXpLevel) { + colour = 0xff5555; + } + + int levelWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(levelStr); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2 - 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2 + 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2, + top + 4 - 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2, + top + 4 + 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2, + top + 4, + colour, + false + ); + + Minecraft.getMinecraft().fontRendererObj.drawString( + item.itemName, + guiLeft + 8 + 16 + 2 + textOffset, + top + 4 + textOffset, + 0xffffffdd, + true + ); + } + GlScissorStack.pop(scaledResolution); + + //Removable enchants (right) + GlScissorStack.push(0, guiTop + 18, width, guiTop + 18 + 96, scaledResolution); + for (int i = 0; i < 7; i++) { + int index = i + rightScroll.getValue() / 16; + + if (removableItem.size() <= index) break; + HexItem item = removableItem.get(index); + + int top = guiTop - (rightScroll.getValue() % 16) + 18 + 16 * i; + int vOffset = enchanterCurrentItem != null && enchanterCurrentItem.itemId.equals(item.itemId) ? 16 : 0; + int textOffset = vOffset / 16; + + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + 248, top, 96, 16, + 0, 96 / 512f, (249 + vOffset) / 512f, (249 + 16 + vOffset) / 512f, GL11.GL_NEAREST + ); + + if (mouseX > guiLeft + 248 && mouseX <= guiLeft + 248 + 96 && + mouseY > top && mouseY <= top + 16) { + disallowClick = true; + if (item.displayLore != null) { + tooltipToDisplay = item.displayLore; + } + } + + String levelStr = getIconStr(item); + int colour = 0xc8ff8f; + /*if (item.price > playerXpLevel) { + colour = 0xff5555; + }*/ + + int levelWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(levelStr); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2 - 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2 + 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2, + top + 4 - 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2, + top + 4 + 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2, + top + 4, + colour, + false + ); + + Minecraft.getMinecraft().fontRendererObj.drawString(item.itemName, + guiLeft + 248 + 16 + 2 + textOffset, top + 4 + textOffset, 0xffffffdd, true + ); + } + GlScissorStack.pop(scaledResolution); + + //Player Inventory Items + Minecraft.getMinecraft().fontRendererObj.drawString(Minecraft.getMinecraft().thePlayer.inventory + .getDisplayName() + .getUnformattedText(), + guiLeft + 102, guiTop + Y_SIZE - 96 + 2, 0x404040 + ); + int inventoryStartIndex = cc.getLowerChestInventory().getSizeInventory(); + GlStateManager.enableDepth(); + for (int i = 0; i < 36; i++) { + int itemX = guiLeft + 102 + 18 * (i % 9); + int itemY = guiTop + 133 + 18 * (i / 9); + + if (i >= 27) { + itemY += 4; + } + + GlStateManager.pushMatrix(); + GlStateManager.translate(guiLeft + 102 - 8, guiTop + 191 - (inventoryStartIndex / 9 * 18 + 89), 0); + Slot slot = cc.getSlot(inventoryStartIndex + i); + ((AccessorGuiContainer) chest).doDrawSlot(slot); + GlStateManager.popMatrix(); + + if (mouseX >= itemX && mouseX < itemX + 18 && + mouseY >= itemY && mouseY < itemY + 18) { + itemHoverX = itemX; + itemHoverY = itemY; + hoverLocked = SlotLocking.getInstance().isSlotLocked(slot); + + if (slot.getHasStack()) { + tooltipToDisplay = slot.getStack().getTooltip( + Minecraft.getMinecraft().thePlayer, + Minecraft.getMinecraft().gameSettings.advancedItemTooltips + ); + } + } + } + + //Search bar + if (currentState == EnchantState.HAS_ITEM) { + if (searchField.getText().isEmpty() && !searchField.getFocus()) { + searchField.setSize(90, 14); + searchField.setPrependText("\u00a77Search..."); + } else { + if (searchField.getFocus()) { + int len = Minecraft.getMinecraft().fontRendererObj.getStringWidth(searchField.getTextDisplay()) + 10; + searchField.setSize(Math.max(90, len), 14); + } else { + searchField.setSize(90, 14); + } + searchField.setPrependText(""); + } + searchField.render(guiLeft + X_SIZE / 2 - searchField.getWidth() / 2, guiTop + 83); + } else if (currentState == EnchantState.ADDING_BOOK && + enchanterCurrentItem != null /*&& !enchanterItemLevels.isEmpty()*/) { + int left = guiLeft + X_SIZE / 2 - 56; + int top = guiTop + 83; + + int uOffset = enchanterCurrentItem.conflicts ? 112 : 0; + + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(left, top, 112, 16, + uOffset / 512f, (112 + uOffset) / 512f, 249 / 512f, (249 + 16) / 512f, GL11.GL_NEAREST + ); + + if (mouseX > left + 16 && mouseX <= left + 96 && + mouseY > top && mouseY <= top + 16) { + disallowClick = true; + if (enchanterCurrentItem.displayLore != null) { + tooltipToDisplay = enchanterCurrentItem.displayLore; + } + } + + String priceStr = "" + numberFormat.format(enchanterCurrentItem.getPrice()) + " Coins"; + if (enchanterCurrentItem.price < 0) priceStr = ""; + int priceWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(priceStr); + int priceTop = guiTop + 10; + int x = 180; + int color = 0x2d2102; + Minecraft.getMinecraft().fontRendererObj.drawString( + priceStr, + guiLeft + x - priceWidth / 2 - 1, + priceTop + 4, + color, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + priceStr, + guiLeft + x - priceWidth / 2 + 1, + priceTop + 4, + color, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + priceStr, + guiLeft + x - priceWidth / 2, + priceTop + 4 - 1, + color, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + priceStr, + guiLeft + x - priceWidth / 2, + priceTop + 4 + 1, + color, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + priceStr, + guiLeft + x - priceWidth / 2, + priceTop + 4, + 0xfcba03, + false + ); + + //Enchant name + String name = WordUtils.capitalizeFully(enchanterCurrentItem.itemId.replace("_", " ")); + if (name.equalsIgnoreCase("Hot Potato Book")) { + name = "Hot Potato"; + } else if (name.equalsIgnoreCase("Fuming Potato Book")) { + name = "Fuming Potato"; + } else if (name.equalsIgnoreCase("Recombobulator 3000")) { + name = "Recombobulator"; + } else if (name.contains("Power Scroll")) { + name = name.replace("Power ", ""); + } else if (name.contains("\u272a")) { + name = name.replaceAll("[^✪]*", ""); + } else if (name.equalsIgnoreCase("First Master Star")) { + name = "Master Star \u00a7c➊"; + } else if (name.equalsIgnoreCase("Second Master Star")) { + name = "Master Star \u00a7c➋"; + } else if (name.equalsIgnoreCase("Third Master Star")) { + name = "Master Star \u00a7c➌"; + } else if (name.equalsIgnoreCase("Fourth Master Star")) { + name = "Master Star \u00a7c➍"; + } else if (name.equalsIgnoreCase("Fifth Master Star")) { + name = "Master Star \u00a7c➎"; + } else if (name.equalsIgnoreCase("The Art Of Peace")) { + name = "Art Of Peace"; + } else if (name.equalsIgnoreCase("Mana Disintegrator")) { + name = "M Disintegrator"; + } + Utils.drawStringCentered( + name, + Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2, + top + 8, + true, + 0xffffffdd + ); + + //Confirm button + String confirmText = "Apply"; + if (removingEnchantPlayerLevel >= 0) { + if (removingEnchantPlayerLevel == enchanterCurrentItem.level) { + confirmText = "Remove"; + } else if (enchanterCurrentItem.level > removingEnchantPlayerLevel) { + confirmText = "Upgrade"; + } else { + confirmText = "Bad Level"; + } + } + if (System.currentTimeMillis() - confirmButtonAnimTime < 500 && !(playerXpLevel < enchanterCurrentItem.price)) { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 - 1 - 48, top + 18, 48, 14, + 0, 48 / 512f, 342 / 512f, (342 + 14) / 512f, GL11.GL_NEAREST + ); + Utils.drawStringCentered(confirmText, Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2 - 1 - 23, top + 18 + 9, false, 0x408040 + ); + } else { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 - 1 - 48, top + 18, 48, 14, + 0, 48 / 512f, 328 / 512f, (328 + 14) / 512f, GL11.GL_NEAREST + ); + Utils.drawStringCentered(confirmText, Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2 - 1 - 24, top + 18 + 8, false, 0x408040 + ); + + /*if (playerXpLevel < enchanterCurrentItem.price) { + Gui.drawRect(guiLeft + X_SIZE / 2 - 1 - 48, top + 18, guiLeft + X_SIZE / 2 - 1, top + 18 + 14, 0x80000000); + }*/ + } + + //Cancel button + if (System.currentTimeMillis() - cancelButtonAnimTime < 500) { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 + 1, top + 18, 48, 14, + 0, 48 / 512f, 342 / 512f, (342 + 14) / 512f, GL11.GL_NEAREST + ); + Utils.drawStringCentered("Cancel", Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2 + 1 + 25, top + 18 + 9, false, 0xa04040 + ); + } else { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 + 1, top + 18, 48, 14, + 0, 48 / 512f, 328 / 512f, (328 + 14) / 512f, GL11.GL_NEAREST + ); + Utils.drawStringCentered("Cancel", Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2 + 1 + 24, top + 18 + 8, false, 0xa04040 + ); + } + + if (mouseY > top + 18 && mouseY <= top + 18 + 16) { + if (mouseX > guiLeft + X_SIZE / 2 - 1 - 48 && mouseX <= guiLeft + X_SIZE / 2 - 1) { + disallowClick = true; + if (enchanterCurrentItem.displayLore != null) { + tooltipToDisplay = enchanterCurrentItem.displayLore; + } + } else if (mouseX > guiLeft + X_SIZE / 2 + 1 && mouseX <= guiLeft + X_SIZE / 2 + 1 + 48) { + disallowClick = true; + tooltipToDisplay = Lists.newArrayList("\u00a7cCancel"); + } + } + } + + if (currentState == EnchantState.HAS_ITEM_IN_BOOKS || currentState == EnchantState.ADDING_BOOK) { + renderCancel(); + } + + //Item enchant input + ItemStack itemEnchantInput; + if (currentState == EnchantState.HAS_ITEM_IN_HEX) { + itemEnchantInput = cc.getSlot(22).getStack(); + } else { + itemEnchantInput = cc.getSlot(19).getStack(); + } + if (itemEnchantInput != null && itemEnchantInput.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane)) { + itemEnchantInput = enchantingItem; + } + { + int itemX = guiLeft + 174; + int itemY = guiTop + 58; + + if (itemEnchantInput == null) { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(itemX, itemY, 16, 16, + 0, 16 / 512f, 281 / 512f, (281 + 16) / 512f, GL11.GL_NEAREST + ); + } else { + Utils.drawItemStack(itemEnchantInput, itemX, itemY); + } + + if (mouseX >= itemX && mouseX < itemX + 18 && + mouseY >= itemY && mouseY < itemY + 18) { + itemHoverX = itemX; + itemHoverY = itemY; + + if (itemEnchantInput != null) { + tooltipToDisplay = itemEnchantInput.getTooltip( + Minecraft.getMinecraft().thePlayer, + Minecraft.getMinecraft().gameSettings.advancedItemTooltips + ); + } + } + } + + if (!isChangingEnchLevel && itemHoverX >= 0 && itemHoverY >= 0) { + GlStateManager.disableDepth(); + GlStateManager.colorMask(true, true, true, false); + Gui.drawRect(itemHoverX, itemHoverY, itemHoverX + 16, itemHoverY + 16, + hoverLocked ? 0x80ff8080 : 0x80ffffff + ); + GlStateManager.colorMask(true, true, true, true); + GlStateManager.enableDepth(); + } + + GlStateManager.translate(0, 0, 300); + + renderOrbAnim(partialTicks); + + renderMouseStack(stackOnMouse, disallowClick, mouseX, mouseY, + width, height, tooltipToDisplay + ); + GlStateManager.translate(0, 0, -300); + } + + private void renderHex(float partialTicks) { + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return; + + int playerXpLevel = Minecraft.getMinecraft().thePlayer.experienceLevel; + + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + ContainerChest cc = (ContainerChest) chest.inventorySlots; + + leftScroll.tick(); + //rightScroll.tick(); + //arrowAmount.tick(); + + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + int width = scaledResolution.getScaledWidth(); + int height = scaledResolution.getScaledHeight(); + int mouseX = Mouse.getX() * width / Minecraft.getMinecraft().displayWidth; + int mouseY = height - Mouse.getY() * height / Minecraft.getMinecraft().displayHeight - 1; + + guiLeft = (width - X_SIZE) / 2; + guiTop = (height - Y_SIZE) / 2; + + List tooltipToDisplay = null; + boolean disallowClick = false; + ItemStack stackOnMouse = Minecraft.getMinecraft().thePlayer.inventory.getItemStack(); + int itemHoverX = -1; + int itemHoverY = -1; + boolean hoverLocked = false; + + drawGradientRect(0, 0, width, height, 0xc0101010, 0xd0101010); + + renderBaseTexture(); + + Minecraft.getMinecraft().fontRendererObj.drawString("The Hex", guiLeft + 7, guiTop + 7, 0x404040, false); + //Minecraft.getMinecraft().fontRendererObj.drawString("Applied", guiLeft + 247, guiTop + 7, 0x404040, false); + + tooltipToDisplay = renderSettings(mouseX, mouseY, tooltipToDisplay); + + renderScrollBars(applicableItem, applicableItem, mouseY); + + //Enchant book model + renderEnchantBook(scaledResolution, partialTicks); + + //Can't be enchanted text + if (currentState == EnchantState.INVALID_ITEM_HEX) { + GlStateManager.disableDepth(); + Utils.drawStringCentered("This item can't", Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2, guiTop + 88, true, 0xffff5555 + ); + Utils.drawStringCentered("be enchanted", Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2, guiTop + 98, true, 0xffff5555 + ); + GlStateManager.enableDepth(); + } + + renderArrow(); + + //Available enchants (left) + GlScissorStack.push(0, guiTop + 18, width, guiTop + 18 + 96, scaledResolution); + for (int i = 0; i < 7; i++) { + int index = i + leftScroll.getValue() / 16; + + if (applicableItem.size() <= index) break; + HexItem item = applicableItem.get(index); + + int top = guiTop - (leftScroll.getValue() % 16) + 18 + 16 * i; + int vOffset = enchanterCurrentItem != null && enchanterCurrentItem.itemId.equals(item.itemId) ? 16 : 0; + int uOffset = item.conflicts ? 112 : 0; + int textOffset = vOffset / 16; + + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + 8, top, 96, 16, + uOffset / 512f, (96 + uOffset) / 512f, (249 + vOffset) / 512f, (249 + 16 + vOffset) / 512f, GL11.GL_NEAREST + ); + + if (mouseX > guiLeft + 8 && mouseX <= guiLeft + 8 + 96 && + mouseY > top && mouseY <= top + 16) { + disallowClick = true; + if (item.displayLore != null) { + tooltipToDisplay = item.displayLore; + } + } + + String levelStr = getIconStr(item); + int colour = 0xc8ff8f; + if (item.price > playerXpLevel) { + colour = 0xff5555; + } + + int levelWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(levelStr); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2 - 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2 + 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2, + top + 4 - 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2, + top + 4 + 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2, + top + 4, + colour, + false + ); + + Minecraft.getMinecraft().fontRendererObj.drawString( + item.itemName, + guiLeft + 8 + 16 + 2 + textOffset, + top + 4 + textOffset, + 0xffffffdd, + true + ); + } + GlScissorStack.pop(scaledResolution); + + //Removable enchants (right) + GlScissorStack.push(0, guiTop + 18, width, guiTop + 18 + 96, scaledResolution); + for (int i = 0; i < 7; i++) { + int index = i + rightScroll.getValue() / 16; + + if (removableItem.size() <= index) break; + HexItem item = removableItem.get(index); + + int top = guiTop - (rightScroll.getValue() % 16) + 18 + 16 * i; + int vOffset = enchanterCurrentItem != null && enchanterCurrentItem.itemId.equals(item.itemId) ? 16 : 0; + int textOffset = vOffset / 16; + + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + 248, top, 96, 16, + 0, 96 / 512f, (249 + vOffset) / 512f, (249 + 16 + vOffset) / 512f, GL11.GL_NEAREST + ); + + if (mouseX > guiLeft + 248 && mouseX <= guiLeft + 248 + 96 && + mouseY > top && mouseY <= top + 16) { + disallowClick = true; + if (item.displayLore != null) { + tooltipToDisplay = item.displayLore; + } + } + + String levelStr = getIconStr(item); + int colour = 0xc8ff8f; + if (item.price > playerXpLevel) { + colour = 0xff5555; + } + + int levelWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(levelStr); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2 - 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2 + 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2, + top + 4 - 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2, + top + 4 + 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2, + top + 4, + colour, + false + ); + + Minecraft.getMinecraft().fontRendererObj.drawString(item.itemName, + guiLeft + 248 + 16 + 2 + textOffset, top + 4 + textOffset, 0xffffffdd, true + ); + } + GlScissorStack.pop(scaledResolution); + + //Player Inventory Items + Minecraft.getMinecraft().fontRendererObj.drawString(Minecraft.getMinecraft().thePlayer.inventory + .getDisplayName() + .getUnformattedText(), + guiLeft + 102, guiTop + Y_SIZE - 96 + 2, 0x404040 + ); + int inventoryStartIndex = cc.getLowerChestInventory().getSizeInventory(); + GlStateManager.enableDepth(); + for (int i = 0; i < 36; i++) { + int itemX = guiLeft + 102 + 18 * (i % 9); + int itemY = guiTop + 133 + 18 * (i / 9); + + if (i >= 27) { + itemY += 4; + } + + GlStateManager.pushMatrix(); + GlStateManager.translate(guiLeft + 102 - 8, guiTop + 191 - (inventoryStartIndex / 9 * 18 + 89), 0); + Slot slot = cc.getSlot(inventoryStartIndex + i); + ((AccessorGuiContainer) chest).doDrawSlot(slot); + GlStateManager.popMatrix(); + + if (mouseX >= itemX && mouseX < itemX + 18 && + mouseY >= itemY && mouseY < itemY + 18) { + itemHoverX = itemX; + itemHoverY = itemY; + hoverLocked = SlotLocking.getInstance().isSlotLocked(slot); + + if (slot.getHasStack()) { + tooltipToDisplay = slot.getStack().getTooltip( + Minecraft.getMinecraft().thePlayer, + Minecraft.getMinecraft().gameSettings.advancedItemTooltips + ); + } + } + } + + if (currentState == EnchantState.ADDING_BOOK && + enchanterCurrentItem != null /*&& !enchanterItemLevels.isEmpty()*/) { + int left = guiLeft + X_SIZE / 2 - 56; + int top = guiTop + 83; + + int uOffset = enchanterCurrentItem.conflicts ? 112 : 0; + + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(left, top, 112, 16, + uOffset / 512f, (112 + uOffset) / 512f, 249 / 512f, (249 + 16) / 512f, GL11.GL_NEAREST + ); + + if (mouseX > left + 16 && mouseX <= left + 96 && + mouseY > top && mouseY <= top + 16) { + disallowClick = true; + if (enchanterCurrentItem.displayLore != null) { + tooltipToDisplay = enchanterCurrentItem.displayLore; + } + } + + if (mouseY > top + 18 && mouseY <= top + 18 + 16) { + if (mouseX > guiLeft + X_SIZE / 2 - 1 - 48 && mouseX <= guiLeft + X_SIZE / 2 - 1) { + disallowClick = true; + if (enchanterCurrentItem.displayLore != null) { + tooltipToDisplay = enchanterCurrentItem.displayLore; + } + } else if (mouseX > guiLeft + X_SIZE / 2 + 1 && mouseX <= guiLeft + X_SIZE / 2 + 1 + 48) { + disallowClick = true; + tooltipToDisplay = Lists.newArrayList("\u00a7cCancel"); + } + } + } + + if (currentState == EnchantState.HAS_ITEM_IN_BOOKS || currentState == EnchantState.ADDING_BOOK) { + renderCancel(); + } + + //Item enchant input + ItemStack itemEnchantInput; + if (isInHex()) { + itemEnchantInput = cc.getSlot(22).getStack(); + } else { + itemEnchantInput = cc.getSlot(19).getStack(); + } + if (itemEnchantInput != null && itemEnchantInput.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane)) { + itemEnchantInput = enchantingItem; + } + { + int itemX = guiLeft + 174; + int itemY = guiTop + 58; + + if (itemEnchantInput == null) { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(itemX, itemY, 16, 16, + 0, 16 / 512f, 281 / 512f, (281 + 16) / 512f, GL11.GL_NEAREST + ); + } else { + Utils.drawItemStack(itemEnchantInput, itemX, itemY); + } + + if (mouseX >= itemX && mouseX < itemX + 18 && + mouseY >= itemY && mouseY < itemY + 18) { + itemHoverX = itemX; + itemHoverY = itemY; + + if (itemEnchantInput != null) { + tooltipToDisplay = itemEnchantInput.getTooltip( + Minecraft.getMinecraft().thePlayer, + Minecraft.getMinecraft().gameSettings.advancedItemTooltips + ); + } + } + } + + if (!isChangingEnchLevel && itemHoverX >= 0 && itemHoverY >= 0) { + GlStateManager.disableDepth(); + GlStateManager.colorMask(true, true, true, false); + Gui.drawRect(itemHoverX, itemHoverY, itemHoverX + 16, itemHoverY + 16, + hoverLocked ? 0x80ff8080 : 0x80ffffff + ); + GlStateManager.colorMask(true, true, true, true); + GlStateManager.enableDepth(); + } + + GlStateManager.translate(0, 0, 300); + + renderOrbAnim(partialTicks); + + renderMouseStack(stackOnMouse, disallowClick, mouseX, mouseY, + width, height, tooltipToDisplay + ); + GlStateManager.translate(0, 0, -300); + } + + private void renderGemstones(float partialTicks) { + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return; + + int playerXpLevel = Minecraft.getMinecraft().thePlayer.experienceLevel; + + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + ContainerChest cc = (ContainerChest) chest.inventorySlots; + + leftScroll.tick(); + rightScroll.tick(); + arrowAmount.tick(); + + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + int width = scaledResolution.getScaledWidth(); + int height = scaledResolution.getScaledHeight(); + int mouseX = Mouse.getX() * width / Minecraft.getMinecraft().displayWidth; + int mouseY = height - Mouse.getY() * height / Minecraft.getMinecraft().displayHeight - 1; + + guiLeft = (width - X_SIZE) / 2; + guiTop = (height - Y_SIZE) / 2; + + List tooltipToDisplay = null; + boolean disallowClick = false; + ItemStack stackOnMouse = Minecraft.getMinecraft().thePlayer.inventory.getItemStack(); + int itemHoverX = -1; + int itemHoverY = -1; + boolean hoverLocked = false; + + drawGradientRect(0, 0, width, height, 0xc0101010, 0xd0101010); + + renderBaseTexture(); + + Minecraft.getMinecraft().fontRendererObj.drawString("Applicable", guiLeft + 7, guiTop + 7, 0x404040, false); + Minecraft.getMinecraft().fontRendererObj.drawString("Applied", guiLeft + 247, guiTop + 7, 0x404040, false); + + //Page Text + if (currentState == EnchantState.ADDING_GEMSTONE || currentState == EnchantState.APPLYING_GEMSTONE) { + String pageStr = "Page: " + currentPage + "/" + expectedMaxPage; + int pageStrLen = Minecraft.getMinecraft().fontRendererObj.getStringWidth(pageStr); + Utils.drawStringCentered(pageStr, Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2, guiTop + 14, false, 0x404040 + ); + + //Page Arrows + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 - pageStrLen / 2 - 2 - 15, guiTop + 6, 15, 15, + 0, 15 / 512f, 372 / 512f, 387 / 512f, GL11.GL_NEAREST + ); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 + pageStrLen / 2 + 2, guiTop + 6, 15, 15, + 15 / 512f, 30 / 512f, 372 / 512f, 387 / 512f, GL11.GL_NEAREST + ); + } + + //Confirm button + { + int top = guiTop + 83; + if (currentState == EnchantState.APPLYING_GEMSTONE) { + String confirmText = "Apply"; + if (removingEnchantPlayerLevel >= 0) { + if (removingEnchantPlayerLevel == enchanterCurrentItem.level) { + confirmText = "Remove"; + } else if (enchanterCurrentItem.level > removingEnchantPlayerLevel) { + confirmText = "Upgrade"; + } else { + confirmText = "Bad Level"; + } + } + if (System.currentTimeMillis() - confirmButtonAnimTime < 500) { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 - 1 - 48, top + 18, 48, 14, + 0, 48 / 512f, 342 / 512f, (342 + 14) / 512f, GL11.GL_NEAREST + ); + Utils.drawStringCentered(confirmText, Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2 - 1 - 23, top + 18 + 9, false, 0x408040 + ); + } else { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 - 1 - 48, top + 18, 48, 14, + 0, 48 / 512f, 328 / 512f, (328 + 14) / 512f, GL11.GL_NEAREST + ); + Utils.drawStringCentered(confirmText, Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2 - 1 - 24, top + 18 + 8, false, 0x408040 + ); + } + } + + //Cancel button + + if (System.currentTimeMillis() - cancelButtonAnimTime < 500) { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 + 1, top + 18, 48, 14, + 0, 48 / 512f, 342 / 512f, (342 + 14) / 512f, GL11.GL_NEAREST + ); + Utils.drawStringCentered("Cancel", Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2 + 1 + 25, top + 18 + 9, false, 0xa04040 + ); + } else { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 + 1, top + 18, 48, 14, + 0, 48 / 512f, 328 / 512f, (328 + 14) / 512f, GL11.GL_NEAREST + ); + Utils.drawStringCentered("Cancel", Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2 + 1 + 24, top + 18 + 8, false, 0xa04040 + ); + } + } + + tooltipToDisplay = renderSettings(mouseX, mouseY, tooltipToDisplay); + + renderScrollBars(applicableItem, applicableItem, mouseY); + + //Enchant book model + renderEnchantBook(scaledResolution, partialTicks); + + renderArrow(); + + //Available enchants (left) + GlScissorStack.push(0, guiTop + 18, width, guiTop + 18 + 96, scaledResolution); + for (int i = 0; i < 7; i++) { + int index = i + leftScroll.getValue() / 16; + + if (applicableItem.size() <= index) break; + HexItem item = applicableItem.get(index); + + int top = guiTop - (leftScroll.getValue() % 16) + 18 + 16 * i; + int vOffset = enchanterCurrentItem != null && enchanterCurrentItem.itemId.equals(item.itemId) ? 16 : 0; + int uOffset = item.conflicts ? 112 : 0; + int textOffset = vOffset / 16; + + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + 8, top, 96, 16, + uOffset / 512f, (96 + uOffset) / 512f, (249 + vOffset) / 512f, (249 + 16 + vOffset) / 512f, GL11.GL_NEAREST + ); + + if (mouseX > guiLeft + 8 && mouseX <= guiLeft + 8 + 96 && + mouseY > top && mouseY <= top + 16) { + disallowClick = true; + if (item.displayLore != null) { + tooltipToDisplay = item.displayLore; + } + } + + String levelStr = getIconStr(item); + int colour = 0xc8ff8f; + if (item.price > playerXpLevel) { + colour = 0xff5555; + } + + int levelWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(levelStr); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2 - 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2 + 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2, + top + 4 - 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2, + top + 4 + 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 16 - levelWidth / 2, + top + 4, + colour, + false + ); + + Minecraft.getMinecraft().fontRendererObj.drawString( + item.itemName, + guiLeft + 8 + 16 + 2 + textOffset, + top + 4 + textOffset, + 0xffffffdd, + true + ); + } + GlScissorStack.pop(scaledResolution); + + //Removable enchants (right) + GlScissorStack.push(0, guiTop + 18, width, guiTop + 18 + 96, scaledResolution); + for (int i = 0; i < 7; i++) { + int index = i + rightScroll.getValue() / 16; + + if (removableItem.size() <= index) break; + HexItem item = removableItem.get(index); + + int top = guiTop - (rightScroll.getValue() % 16) + 18 + 16 * i; + int vOffset = enchanterCurrentItem != null && enchanterCurrentItem.itemId.equals(item.itemId) ? 16 : 0; + int textOffset = vOffset / 16; + + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + 248, top, 96, 16, + 0, 96 / 512f, (249 + vOffset) / 512f, (249 + 16 + vOffset) / 512f, GL11.GL_NEAREST + ); + + if (mouseX > guiLeft + 248 && mouseX <= guiLeft + 248 + 96 && + mouseY > top && mouseY <= top + 16) { + disallowClick = true; + if (item.displayLore != null) { + tooltipToDisplay = item.displayLore; + } + } + + String levelStr = getIconStr(item); + int colour = 0xc8ff8f; + if (item.price > playerXpLevel) { + colour = 0xff5555; + } + + int levelWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(levelStr); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2 - 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2 + 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2, + top + 4 - 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2, + top + 4 + 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + guiLeft + 256 - levelWidth / 2, + top + 4, + colour, + false + ); + + Minecraft.getMinecraft().fontRendererObj.drawString(item.itemName, + guiLeft + 248 + 16 + 2 + textOffset, top + 4 + textOffset, 0xffffffdd, true + ); + } + GlScissorStack.pop(scaledResolution); + + //Player Inventory Items + Minecraft.getMinecraft().fontRendererObj.drawString(Minecraft.getMinecraft().thePlayer.inventory + .getDisplayName() + .getUnformattedText(), + guiLeft + 102, guiTop + Y_SIZE - 96 + 2, 0x404040 + ); + int inventoryStartIndex = cc.getLowerChestInventory().getSizeInventory(); + GlStateManager.enableDepth(); + for (int i = 0; i < 36; i++) { + int itemX = guiLeft + 102 + 18 * (i % 9); + int itemY = guiTop + 133 + 18 * (i / 9); + + if (i >= 27) { + itemY += 4; + } + + GlStateManager.pushMatrix(); + GlStateManager.translate(guiLeft + 102 - 8, guiTop + 191 - (inventoryStartIndex / 9 * 18 + 89), 0); + Slot slot = cc.getSlot(inventoryStartIndex + i); + ((AccessorGuiContainer) chest).doDrawSlot(slot); + GlStateManager.popMatrix(); + + if (mouseX >= itemX && mouseX < itemX + 18 && + mouseY >= itemY && mouseY < itemY + 18) { + itemHoverX = itemX; + itemHoverY = itemY; + hoverLocked = SlotLocking.getInstance().isSlotLocked(slot); + + if (slot.getHasStack()) { + tooltipToDisplay = slot.getStack().getTooltip( + Minecraft.getMinecraft().thePlayer, + Minecraft.getMinecraft().gameSettings.advancedItemTooltips + ); + } + } + } + + if (currentState == EnchantState.APPLYING_GEMSTONE && + enchanterCurrentItem != null /*&& !enchanterItemLevels.isEmpty()*/) { + int left = guiLeft + X_SIZE / 2 - 56; + int top = guiTop + 83; + + int uOffset = enchanterCurrentItem.conflicts ? 112 : 0; + + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(left, top, 112, 16, + uOffset / 512f, (112 + uOffset) / 512f, 249 / 512f, (249 + 16) / 512f, GL11.GL_NEAREST + ); + + if (mouseX > left + 16 && mouseX <= left + 96 && + mouseY > top && mouseY <= top + 16) { + disallowClick = true; + if (enchanterCurrentItem.displayLore != null) { + tooltipToDisplay = enchanterCurrentItem.displayLore; + } + } + + if (mouseY > top + 18 && mouseY <= top + 18 + 16) { + if (mouseX > guiLeft + X_SIZE / 2 - 1 - 48 && mouseX <= guiLeft + X_SIZE / 2 - 1) { + disallowClick = true; + if (enchanterCurrentItem.displayLore != null) { + tooltipToDisplay = enchanterCurrentItem.displayLore; + } + } else if (mouseX > guiLeft + X_SIZE / 2 + 1 && mouseX <= guiLeft + X_SIZE / 2 + 1 + 48) { + disallowClick = true; + tooltipToDisplay = Lists.newArrayList("\u00a7cCancel"); + } + } + } + + if (currentState == EnchantState.HAS_ITEM_IN_BOOKS || currentState == EnchantState.ADDING_BOOK) { + renderCancel(); + } + + //Item enchant input + ItemStack itemEnchantInput; + if (isInHex()) { + itemEnchantInput = cc.getSlot(22).getStack(); + } else { + itemEnchantInput = cc.getSlot(19).getStack(); + } + if (itemEnchantInput != null && itemEnchantInput.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane)) { + itemEnchantInput = enchantingItem; + } + { + int itemX = guiLeft + 174; + int itemY = guiTop + 58; + + if (itemEnchantInput == null) { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(itemX, itemY, 16, 16, + 0, 16 / 512f, 281 / 512f, (281 + 16) / 512f, GL11.GL_NEAREST + ); + } else { + Utils.drawItemStack(itemEnchantInput, itemX, itemY); + } + + if (mouseX >= itemX && mouseX < itemX + 18 && + mouseY >= itemY && mouseY < itemY + 18) { + itemHoverX = itemX; + itemHoverY = itemY; + + if (itemEnchantInput != null) { + tooltipToDisplay = itemEnchantInput.getTooltip( + Minecraft.getMinecraft().thePlayer, + Minecraft.getMinecraft().gameSettings.advancedItemTooltips + ); + } + } + } + + if (currentState == EnchantState.APPLYING_GEMSTONE) { + int left = guiLeft + X_SIZE / 2 - 56; + int top = guiTop + 83; + //Enchant cost + String levelStr = getIconStr(enchanterCurrentItem); + + int colour = 0xc8ff8f; + if (enchanterCurrentItem.price > playerXpLevel) { + colour = 0xff5555; + } + + int levelWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(levelStr); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 8 - levelWidth / 2 - 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 8 - levelWidth / 2 + 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 8 - levelWidth / 2, + top + 4 - 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 8 - levelWidth / 2, + top + 4 + 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString(levelStr, left + 8 - levelWidth / 2, top + 4, colour, false); + + //Enchant name + String name = WordUtils.capitalizeFully(enchanterCurrentItem.itemName); + if (name.equalsIgnoreCase("Bane of Arthropods")) { + name = "Bane of Arth."; + } else if (name.equalsIgnoreCase("Projectile Protection")) { + name = "Projectile Prot"; + } else if (name.equalsIgnoreCase("Blast Protection")) { + name = "Blast Prot"; + } else if (name.equalsIgnoreCase("Luck of the Sea")) { + name = "Luck of Sea"; + } else if (name.equalsIgnoreCase("Turbo Mushrooms")) { + name = "Turbo-Mush"; + } + Utils.drawStringCentered( + name, + Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2, + top + 8, + true, + 0xffffffdd + ); + + if (isChangingEnchLevel) { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(left + 96, top, 16, 16, + 96 / 512f, 112 / 512f, 265 / 512f, (265 + 16) / 512f, GL11.GL_NEAREST + ); + } + + //Enchant level + levelStr = ""; + levelWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(levelStr); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 96 + 8 - levelWidth / 2 - 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 96 + 8 - levelWidth / 2 + 1, + top + 4, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 96 + 8 - levelWidth / 2, + top + 4 - 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 96 + 8 - levelWidth / 2, + top + 4 + 1, + 0x2d2102, + false + ); + Minecraft.getMinecraft().fontRendererObj.drawString( + levelStr, + left + 96 + 8 - levelWidth / 2, + top + 4, + 0xea82ff, + false + ); + } + + if (!isChangingEnchLevel && itemHoverX >= 0 && itemHoverY >= 0) { + GlStateManager.disableDepth(); + GlStateManager.colorMask(true, true, true, false); + Gui.drawRect(itemHoverX, itemHoverY, itemHoverX + 16, itemHoverY + 16, + hoverLocked ? 0x80ff8080 : 0x80ffffff + ); + GlStateManager.colorMask(true, true, true, true); + GlStateManager.enableDepth(); + } + + GlStateManager.translate(0, 0, 300); + + renderOrbAnim(partialTicks); + + renderMouseStack(stackOnMouse, disallowClick, mouseX, mouseY, + width, height, tooltipToDisplay + ); + GlStateManager.translate(0, 0, -300); + } + + private String getIconStr(HexItem item) { + String levelStr = ""; + if (item.itemType != ItemType.UNKNOWN) { + int potatoCount = 0; + int killCount = 0; + int warCount = 0; + int ffdCount = 0; + int recombCount = 0; + int effLevel = 0; + int starCount = 0; + int singularityCount = 0; + int tunerCount = 0; + int manaDisintegratorCount = 0; + int peaceCount = 0; + int dungeonItem = 0; + boolean shadowWarp = false; + boolean witherShield = false; + boolean implosion = false; + String reforge = ""; + if (enchantingItem != null) { + NBTTagCompound tagItem = enchantingItem.getTagCompound(); + if (tagItem != null) { + NBTTagCompound ea = tagItem.getCompoundTag("ExtraAttributes"); + if (ea != null) { + potatoCount = ea.getInteger("hot_potato_count"); + killCount = ea.getInteger("stats_book"); + warCount = ea.getInteger("art_of_war_count"); + ffdCount = ea.getInteger("farming_for_dummies_count"); + recombCount = ea.getInteger("rarity_upgrades"); + starCount = ea.getInteger("upgrade_level"); + singularityCount = ea.getInteger("wood_singularity_count"); + tunerCount = ea.getInteger("tuned_transmission"); + peaceCount = ea.getInteger("art_of_peace_count"); + manaDisintegratorCount = ea.getInteger("mana_disintegrator_count"); + dungeonItem = ea.getInteger("dungeon_item"); + reforge = ea.getString("modifier"); + NBTTagCompound enchs = ea.getCompoundTag("enchantments"); + NBTTagList scrolls = ea.getTagList("ability_scroll", 8); + if (enchs != null) { + effLevel = enchs.getInteger("efficiency"); + } + if (scrolls != null) { + for (int index = 0; index < scrolls.tagCount(); index++) { + if (scrolls.getStringTagAt(index).equals("IMPLOSION_SCROLL")) { + implosion = true; + } else if (scrolls.getStringTagAt(index).equals("SHADOW_WARP_SCROLL")) { + shadowWarp = true; + } else if (scrolls.getStringTagAt(index).equals("WITHER_SHIELD_SCROLL")) { + witherShield = true; + } + } + } + } + } + } + if (item.itemType == ItemType.HOT_POTATO) { + if (potatoCount < 10) levelStr = "" + potatoCount; + else levelStr = "✔"; + + } else if (item.itemType == ItemType.FUMING_POTATO) { + if (potatoCount <= 10) levelStr = "" + 0; + else if (potatoCount < 15) levelStr = "" + (potatoCount - 10); + else levelStr = "✔"; + + } else if (item.itemType == ItemType.BOOK_OF_STATS) { + if (killCount > 0) levelStr = "✔"; + else levelStr = "✖"; + + } else if (item.itemType == ItemType.ART_OF_WAR) { + if (warCount > 0) levelStr = "✔"; + else levelStr = "✖"; + + } else if (item.itemType == ItemType.FARMING_DUMMY) { + if (ffdCount < 5) levelStr = "" + ffdCount; + else levelStr = "✔"; + + } else if (item.itemType == ItemType.RECOMB) { + if (recombCount > 0) levelStr = "✔"; + else levelStr = "✖"; + + } else if (item.itemType == ItemType.SILEX) { + if (effLevel < 10) levelStr = "✖"; + else levelStr = "✔"; + + } else if (item.isPowerScroll()) { + levelStr = "✖"; + + } else if (item.isMasterStar()) { + levelStr = "✖"; + + } else if (item.isDungeonStar()) { + if (starCount >= item.itemType.getStarLevel()) levelStr = "✔"; + else levelStr = "✖"; + + } else if (item.itemType == ItemType.WOOD_SINGULARITY) { + if (singularityCount > 0) levelStr = "✔"; + else levelStr = "✖"; + + } else if (item.isHypeScroll()) { + if (shadowWarp) levelStr = "✔"; + else if (implosion) levelStr = "✔"; + else if (witherShield) levelStr = "✔"; + else levelStr = "✖"; + + } else if (item.itemType == ItemType.TUNER) { + if (tunerCount >= 4) levelStr = "✔"; + else levelStr = "✖"; + + } else if (item.itemType == ItemType.REFORGE) { + if (item.getReforge().equalsIgnoreCase(reforge)) levelStr = "✔"; + else levelStr = "✖"; + + } else if (item.itemType == ItemType.RANDOM_REFORGE) { + levelStr = "?"; + + } else if (item.itemType == ItemType.ART_OF_PEACE) { + if (peaceCount > 0) levelStr = "✔"; + else levelStr = "✖"; + + } else if (item.itemType == ItemType.MANA_DISINTEGRATOR) { + if (manaDisintegratorCount >= 10) levelStr = "✔"; + else levelStr = "✖"; + + } else if (item.itemType == ItemType.CONVERT_TO_DUNGEON) { + if (dungeonItem > 0) levelStr = "✔"; + else levelStr = "✖"; + + } else if (item.itemType == ItemType.RUBY_GEMSTONE) { + levelStr = "❤"; + + } else if (item.itemType == ItemType.AMETHYST_GEMSTONE) { + levelStr = "❈"; + + } else if (item.itemType == ItemType.SAPPHIRE_GEMSTONE) { + levelStr = "✎"; + + } else if (item.itemType == ItemType.JADE_GEMSTONE) { + levelStr = "☘"; + + } else if (item.itemType == ItemType.AMBER_GEMSTONE) { + levelStr = "⸕"; + + } else if (item.itemType == ItemType.TOPAZ_GEMSTONE) { + levelStr = "✧"; + + } else if (item.itemType == ItemType.JASPER_GEMSTONE) { + levelStr = "❁"; + + } else if (item.itemType == ItemType.OPAL_GEMSTONE) { + levelStr = "❂"; + } + } else { + levelStr = "?"; + } + return levelStr; + } + + private void renderBaseTexture() { + //Base Texture + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft, guiTop, X_SIZE, Y_SIZE, + 0, X_SIZE / 512f, 0, Y_SIZE / 512f, GL11.GL_NEAREST + ); + } + + private List renderSettings(int mouseX, int mouseY, List tooltipToDisplay) { + //Settings Buttons + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + //On Settings Button + Utils.drawTexturedRect(guiLeft + 295, guiTop + 147, 16, 16, + 0, 16 / 512f, 387 / 512f, (387 + 16) / 512f, GL11.GL_NEAREST + ); + //Sorting Settings Button + float sortingMinU = NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enchantSorting * 16 / 512f; + Utils.drawTexturedRect(guiLeft + 295, guiTop + 147 + 18, 16, 16, + sortingMinU, sortingMinU + 16 / 512f, 419 / 512f, (419 + 16) / 512f, GL11.GL_NEAREST + ); + //Ordering Settings Button + float orderingMinU = NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enchantOrdering * 16 / 512f; + Utils.drawTexturedRect(guiLeft + 295 + 18, guiTop + 147 + 18, 16, 16, + orderingMinU, orderingMinU + 16 / 512f, 435 / 512f, (435 + 16) / 512f, GL11.GL_NEAREST + ); + + if (mouseX >= guiLeft + 294 && mouseX < guiLeft + 294 + 36 && + mouseY >= guiTop + 146 && mouseY < guiTop + 146 + 36) { + int index = (mouseX - (guiLeft + 295)) / 18 + (mouseY - (guiTop + 147)) / 18 * 2; + switch (index) { + case 0: + Gui.drawRect(guiLeft + 295, guiTop + 147, guiLeft + 295 + 16, guiTop + 147 + 16, 0x80ffffff); + tooltipToDisplay = createTooltip("Enable GUI", 0, "On", "Off"); + break; + case 2: + Gui.drawRect(guiLeft + 295, guiTop + 147 + 18, guiLeft + 295 + 16, guiTop + 147 + 16 + 18, 0x80ffffff); + tooltipToDisplay = createTooltip("Sort enchants...", + NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enchantSorting, + "By Cost", "Alphabetically" + ); + break; + case 3: + Gui.drawRect( + guiLeft + 295 + 18, + guiTop + 147 + 18, + guiLeft + 295 + 16 + 18, + guiTop + 147 + 16 + 18, + 0x80ffffff + ); + tooltipToDisplay = createTooltip("Order enchants...", + NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enchantOrdering, + "Ascending", "Descending" + ); + break; + } + } + return tooltipToDisplay; + } + + private void renderScrollBars(List applicable, List removable, int mouseY) { + //Left scroll bar + { + int offset; + if (applicable.size() <= 6) { + offset = 0; + } else if (isScrollingLeft && clickedScrollOffset >= 0) { + offset = mouseY - clickedScrollOffset; + if (offset < 0) offset = 0; + if (offset > 96 - 15) offset = 96 - 15; + } else { + offset = Math.round((96 - 15) * (leftScroll.getValue() / (float) ((applicable.size() - 6) * 16))); + } + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + 104, guiTop + 18 + offset, 12, 15, + 0, 12 / 512f, 313 / 512f, (313 + 15) / 512f, GL11.GL_NEAREST + ); + } + //Right scroll bar + { + int offset; + if (removable.size() <= 6) { + offset = 0; + } else if (!isScrollingLeft && clickedScrollOffset >= 0) { + offset = mouseY - clickedScrollOffset; + if (offset < 0) offset = 0; + if (offset > 96 - 15) offset = 96 - 15; + } else { + offset = Math.round((96 - 15) * (rightScroll.getValue() / (float) ((removable.size() - 6) * 16))); + } + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + 344, guiTop + 18 + offset, 12, 15, + 0, 12 / 512f, 313 / 512f, (313 + 15) / 512f, GL11.GL_NEAREST + ); + } + } + + private void renderArrow() { + //Enchant arrow + if (arrowAmount.getValue() > 0) { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + float w = 22 * arrowAmount.getValue(); + if (removingEnchantPlayerLevel < 0) { + Utils.drawTexturedRect(guiLeft + 134, guiTop + 58, w, 16, + 0, w / 512f, 297 / 512f, (297 + 16) / 512f, GL11.GL_NEAREST + ); + } else { + Utils.drawTexturedRect(guiLeft + 230 - w, guiTop + 58, w, 16, + (44 - w) / 512f, 44 / 512f, 297 / 512f, (297 + 16) / 512f, GL11.GL_NEAREST + ); + } + } + } + + private void renderCancel() { + int top = guiTop + 83; + //Cancel button + if (System.currentTimeMillis() - cancelButtonAnimTime < 500) { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 + 1, top + 18, 48, 14, + 0, 48 / 512f, 342 / 512f, (342 + 14) / 512f, GL11.GL_NEAREST + ); + Utils.drawStringCentered("Cancel", Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2 + 1 + 25, top + 18 + 9, false, 0xa04040 + ); + } else { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 + 1, top + 18, 48, 14, + 0, 48 / 512f, 328 / 512f, (328 + 14) / 512f, GL11.GL_NEAREST + ); + Utils.drawStringCentered("Cancel", Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2 + 1 + 24, top + 18 + 8, false, 0xa04040 + ); + } + } + + private void renderOrbAnim(float partialTicks) { + //Orb animation + GlStateManager.pushMatrix(); + GlStateManager.translate(guiLeft, guiTop, 0); + orbDisplay.renderOrbs(partialTicks); + GlStateManager.popMatrix(); + } + + private void renderMouseStack( + ItemStack stackOnMouse, boolean disallowClick, + int mouseX, int mouseY, int width, int height, + List tooltipToDisplay + ) { + if (stackOnMouse != null) { + if (disallowClick) { + Utils.drawItemStack(new ItemStack(Item.getItemFromBlock(Blocks.barrier)), mouseX - 8, mouseY - 8); + } else { + Utils.drawItemStack(stackOnMouse, mouseX - 8, mouseY - 8); + } + } else if (tooltipToDisplay != null) { + Utils.drawHoveringText(tooltipToDisplay, mouseX, mouseY, width, height, -1, + Minecraft.getMinecraft().fontRendererObj + ); + } + } + + private void renderEnchantBook(ScaledResolution scaledresolution, float partialTicks) { + GlStateManager.enableDepth(); + + GlStateManager.pushMatrix(); + GlStateManager.matrixMode(5889); + GlStateManager.pushMatrix(); + GlStateManager.loadIdentity(); + GlStateManager.viewport((scaledresolution.getScaledWidth() - 320) / 2 * scaledresolution.getScaleFactor(), + (scaledresolution.getScaledHeight() - 240) / 2 * scaledresolution.getScaleFactor(), + 320 * scaledresolution.getScaleFactor(), 240 * scaledresolution.getScaleFactor() + ); + GlStateManager.translate(0.0F, 0.33F, 0.0F); + Project.gluPerspective(90.0F, 1.3333334F, 9.0F, 80.0F); + GlStateManager.matrixMode(5888); + GlStateManager.loadIdentity(); + RenderHelper.enableStandardItemLighting(); + GlStateManager.translate(0.0F, 3.3F, -16.0F); + GlStateManager.scale(5, 5, 5); + GlStateManager.rotate(180.0F, 0.0F, 0.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(ENCHANTMENT_TABLE_BOOK_TEXTURE); + GlStateManager.rotate(20.0F, 1.0F, 0.0F, 0.0F); + float bookOpenAngle = this.bookOpenLast + (this.bookOpen - this.bookOpenLast) * partialTicks; + GlStateManager.translate( + (1.0F - bookOpenAngle) * 0.2F, + (1.0F - bookOpenAngle) * 0.1F, + (1.0F - bookOpenAngle) * 0.25F + ); + GlStateManager.rotate(-(1.0F - bookOpenAngle) * 90.0F - 90.0F, 0.0F, 1.0F, 0.0F); + GlStateManager.rotate(180.0F, 1.0F, 0.0F, 0.0F); + float pageAngle1 = this.pageOpenLast + (this.pageOpen - this.pageOpenLast) * partialTicks + 0.25F; + float pageAngle2 = this.pageOpenLast + (this.pageOpen - this.pageOpenLast) * partialTicks + 0.75F; + pageAngle1 = (pageAngle1 - (float) MathHelper.truncateDoubleToInt(pageAngle1)) * 1.6F - 0.3F; + pageAngle2 = (pageAngle2 - (float) MathHelper.truncateDoubleToInt(pageAngle2)) * 1.6F - 0.3F; + + if (pageAngle1 < 0.0F) pageAngle1 = 0.0F; + if (pageAngle1 > 1.0F) pageAngle1 = 1.0F; + if (pageAngle2 < 0.0F) pageAngle2 = 0.0F; + if (pageAngle2 > 1.0F) pageAngle2 = 1.0F; + + GlStateManager.enableRescaleNormal(); + MODEL_BOOK.render(null, 0.0F, pageAngle1, pageAngle2, bookOpenAngle, 0.0F, 0.0625F); + GlStateManager.disableRescaleNormal(); + RenderHelper.disableStandardItemLighting(); + GlStateManager.matrixMode(5889); + GlStateManager.viewport(0, 0, Minecraft.getMinecraft().displayWidth, Minecraft.getMinecraft().displayHeight); + GlStateManager.popMatrix(); + GlStateManager.matrixMode(5888); + GlStateManager.popMatrix(); + RenderHelper.disableStandardItemLighting(); + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + + GlStateManager.enableDepth(); + } + + private boolean isInEnchanting() { + return currentState == EnchantState.ADDING_ENCHANT || currentState == EnchantState.HAS_ITEM || + currentState == EnchantState.SWITCHING_DONT_UPDATE; + } + + private boolean isInHex() { + return currentState == EnchantState.HAS_ITEM_IN_HEX || currentState == EnchantState.INVALID_ITEM_HEX || + currentState == EnchantState.NO_ITEM_IN_HEX; + } + + private boolean isInGemstones() { + return currentState == EnchantState.HAS_ITEM_IN_GEMSTONE || currentState == EnchantState.ADDING_GEMSTONE || + currentState == EnchantState.APPLYING_GEMSTONE; + } + + public void overrideIsMouseOverSlot(Slot slot, int mouseX, int mouseY, CallbackInfoReturnable cir) { + if ((shouldOverrideFast || shouldOverrideGemstones || shouldOverrideXp) && currentState != EnchantState.ADDING_ENCHANT) { + boolean playerInv = slot.inventory == Minecraft.getMinecraft().thePlayer.inventory; + int slotId = slot.getSlotIndex(); + if (playerInv && slotId < 36) { + slotId -= 9; + if (slotId < 0) slotId += 36; + + int itemX = guiLeft + 102 + 18 * (slotId % 9); + int itemY = guiTop + 133 + 18 * (slotId / 9); + + if (slotId >= 27) { + itemY += 4; + } + + if (mouseX >= itemX && mouseX < itemX + 18 && + mouseY >= itemY && mouseY < itemY + 18) { + cir.setReturnValue(true); + } else { + cir.setReturnValue(false); + } + } else if ((slotId == 19 && !isInHex()) || (slotId == 22 && isInHex())) { + cir.setReturnValue(mouseX >= guiLeft + 173 && mouseX < guiLeft + 173 + 18 && + mouseY >= guiTop + 57 && mouseY < guiTop + 57 + 18); + } + } + } + + public boolean mouseInput(int mouseX, int mouseY) { + if (Mouse.getEventButtonState() && + (currentState == EnchantState.HAS_ITEM || currentState == EnchantState.ADDING_ENCHANT || + currentState == EnchantState.HAS_ITEM_IN_HEX || currentState == EnchantState.ADDING_BOOK || + currentState == EnchantState.ADDING_GEMSTONE || currentState == EnchantState.APPLYING_GEMSTONE)) { + if (mouseY > guiTop + 6 && mouseY < guiTop + 6 + 15) { + String pageStr = "Page: " + currentPage + "/" + expectedMaxPage; + int pageStrLen = Minecraft.getMinecraft().fontRendererObj.getStringWidth(pageStr); + + int click = -1; + if (mouseX > guiLeft + X_SIZE / 2 - pageStrLen / 2 - 2 - 15 && + mouseX <= guiLeft + X_SIZE / 2 - pageStrLen / 2 - 2) { + click = 17; + } else if (mouseX > guiLeft + X_SIZE / 2 + pageStrLen / 2 + 2 && + mouseX <= guiLeft + X_SIZE / 2 + pageStrLen / 2 + 2 + 15) { + click = 35; + } + + if (click >= 0) { + if (currentState == EnchantState.ADDING_ENCHANT || currentState == EnchantState.ADDING_BOOK) { + if (Mouse.getEventButtonState()) { + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(45); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, 45, 0, 0, stack, transactionID)); + + cancelButtonAnimTime = System.currentTimeMillis(); + } + } else { + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(click); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, click, 0, 0, stack, transactionID)); + } + return true; + } + } + } + + // Cancel button + if (currentState == EnchantState.HAS_ITEM || + currentState == EnchantState.HAS_ITEM_IN_BOOKS || currentState == EnchantState.HAS_ITEM_IN_GEMSTONE) { + if (Mouse.getEventButtonState()) { + int top = guiTop + 83; + + if (!isChangingEnchLevel && mouseX > guiLeft + X_SIZE / 2 + 1 && mouseX <= guiLeft + X_SIZE / 2 + 1 + 48 && + mouseY > top + 18 && mouseY <= top + 18 + 14) { + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + leftScroll.setValue(0); + rightScroll.setValue(0); + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + if (currentState != EnchantState.ADDING_BOOK) { + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(45); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, 45, 0, 0, stack, transactionID)); + if (isInGemstones()) { + currentState = EnchantState.HAS_ITEM_IN_GEMSTONE; + } + } else { + currentState = EnchantState.HAS_ITEM_IN_BOOKS; + } + searchField.setText(""); + cancelButtonAnimTime = System.currentTimeMillis(); + enchanterCurrentItem = null; + } + + if (mouseX > guiLeft + X_SIZE / 2 - searchField.getWidth() / 2 && + mouseX < guiLeft + X_SIZE / 2 + searchField.getWidth() / 2 && + mouseY > guiTop + 80 && mouseY < guiTop + 96) { + searchField.mouseClicked(mouseX, mouseY, Mouse.getEventButton()); + } else { + searchField.setFocus(false); + } + } else if (Mouse.getEventButton() < 0 && searchField.getFocus() && Mouse.isButtonDown(0)) { + searchField.mouseClickMove(mouseX, mouseY, 0, 0); + } + } else if (currentState == EnchantState.ADDING_ENCHANT && !enchanterEnchLevels.isEmpty()) { + if (Mouse.getEventButtonState()) { + int left = guiLeft + X_SIZE / 2 - 56; + int top = guiTop + 83; + + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 - 1 - 48, top + 18, 48, 14, + 0, 48 / 512f, 328 / 512f, (328 + 14) / 512f, GL11.GL_NEAREST + ); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 + 1, top + 18, 48, 14, + 0, 48 / 512f, 328 / 512f, (328 + 14) / 512f, GL11.GL_NEAREST + ); + + if (!isChangingEnchLevel && mouseX > guiLeft + X_SIZE / 2 + 1 && mouseX <= guiLeft + X_SIZE / 2 + 1 + 48 && + mouseY > top + 18 && mouseY <= top + 18 + 14) { + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(45); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, 45, 0, 0, stack, transactionID)); + + cancelButtonAnimTime = System.currentTimeMillis(); + } else if (!isChangingEnchLevel && enchanterCurrentEnch != null && + (mouseX > left + 16 && mouseX <= left + 96 && + mouseY > top && mouseY <= top + 16) || + (mouseX > guiLeft + X_SIZE / 2 - 1 - 48 && mouseX <= guiLeft + X_SIZE / 2 - 1 && + mouseY > top + 18 && mouseY <= top + 18 + 14)) { + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot( + enchanterCurrentEnch.slotIndex); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, + enchanterCurrentEnch.slotIndex, 0, 0, stack, transactionID + )); + + int playerXpLevel = Minecraft.getMinecraft().thePlayer.experienceLevel; + if (playerXpLevel >= enchanterCurrentEnch.xpCost) { + if (removingEnchantPlayerLevel >= 0 && enchanterCurrentEnch.level == removingEnchantPlayerLevel) { + orbDisplay.spawnExperienceOrbs(X_SIZE / 2, 66, X_SIZE / 2, 36, 3); + } else { + orbDisplay.spawnExperienceOrbs(mouseX - guiLeft, mouseY - guiTop, X_SIZE / 2, 66, 0); + } + } + + confirmButtonAnimTime = System.currentTimeMillis(); + } else if (mouseX > left + 96 && mouseX <= left + 96 + 16) { + if (!isChangingEnchLevel) { + if (mouseY > top && mouseY < top + 16) { + isChangingEnchLevel = true; + return true; + } + } else { + List before = new ArrayList<>(); + List after = new ArrayList<>(); + + for (Enchantment ench : enchanterEnchLevels.values()) { + if (ench.level < enchanterCurrentEnch.level) { + before.add(ench); + } else if (ench.level > enchanterCurrentEnch.level) { + after.add(ench); + } + } + + before.sort(Comparator.comparingInt(o -> -o.level)); + after.sort(Comparator.comparingInt(o -> o.level)); + + int bSize = before.size(); + int aSize = after.size(); + for (int i = 0; i < bSize + aSize; i++) { + Enchantment ench; + int yIndex; + if (i < bSize) { + yIndex = -i - 1; + ench = before.get(i); + } else { + yIndex = i - bSize + 1; + ench = after.get(i - bSize); + } + + if (mouseY > top + 16 * yIndex && mouseY <= top + 16 * yIndex + 16) { + enchanterCurrentEnch = ench; + isChangingEnchLevel = false; + return true; + } + } + } + } + + if (isChangingEnchLevel) { + isChangingEnchLevel = false; + return true; + } + } + } else if (currentState == EnchantState.ADDING_BOOK) { + if (Mouse.getEventButtonState()) { + int left = guiLeft + X_SIZE / 2 - 56; + int top = guiTop + 83; + + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 - 1 - 48, top + 18, 48, 14, + 0, 48 / 512f, 328 / 512f, (328 + 14) / 512f, GL11.GL_NEAREST + ); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 + 1, top + 18, 48, 14, + 0, 48 / 512f, 328 / 512f, (328 + 14) / 512f, GL11.GL_NEAREST + ); + + if (!isChangingEnchLevel && mouseX > guiLeft + X_SIZE / 2 + 1 && mouseX <= guiLeft + X_SIZE / 2 + 1 + 48 && + mouseY > top + 18 && mouseY <= top + 18 + 14) { + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + /*GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(45); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, 45, 0, 0, stack, transactionID));*/ + + cancelButtonAnimTime = System.currentTimeMillis(); + currentState = EnchantState.HAS_ITEM_IN_BOOKS; + enchanterCurrentItem = null; + } else if (!isChangingEnchLevel && enchanterCurrentItem != null && + (mouseX > left + 16 && mouseX <= left + 96 && + mouseY > top && mouseY <= top + 16) || + (mouseX > guiLeft + X_SIZE / 2 - 1 - 48 && mouseX <= guiLeft + X_SIZE / 2 - 1 && + mouseY > top + 18 && mouseY <= top + 18 + 14)) { + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot( + enchanterCurrentItem.slotIndex); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, + enchanterCurrentItem.slotIndex, 0, 0, stack, transactionID + )); + + if (removingEnchantPlayerLevel >= 0 && enchanterCurrentItem.level == removingEnchantPlayerLevel) { + orbDisplay.spawnExperienceOrbs(X_SIZE / 2, 66, X_SIZE / 2, 36, 3); + } else { + orbDisplay.spawnExperienceOrbs(mouseX - guiLeft, mouseY - guiTop, X_SIZE / 2, 66, 0); + } + + confirmButtonAnimTime = System.currentTimeMillis(); + enchanterCurrentItem = null; + currentState = EnchantState.HAS_ITEM_IN_BOOKS; + } else if (mouseX > left + 96 && mouseX <= left + 96 + 16) { + if (!isChangingEnchLevel) { + if (mouseY > top && mouseY < top + 16) { + isChangingEnchLevel = true; + return true; + } + } else { + List before = new ArrayList<>(); + List after = new ArrayList<>(); + + for (HexItem item : enchanterItemLevels.values()) { + if (item.level < enchanterCurrentItem.level) { + before.add(item); + } else if (item.level > enchanterCurrentItem.level) { + after.add(item); + } + } + + before.sort(Comparator.comparingInt(o -> -o.level)); + after.sort(Comparator.comparingInt(o -> o.level)); + + int bSize = before.size(); + int aSize = after.size(); + for (int i = 0; i < bSize + aSize; i++) { + HexItem item; + int yIndex; + if (i < bSize) { + yIndex = -i - 1; + item = before.get(i); + } else { + yIndex = i - bSize + 1; + item = after.get(i - bSize); + } + + if (mouseY > top + 16 * yIndex && mouseY <= top + 16 * yIndex + 16) { + enchanterCurrentItem = item; + isChangingEnchLevel = false; + return true; + } + } + } + } + + if (isChangingEnchLevel) { + isChangingEnchLevel = false; + return true; + } + } + } else if (currentState == EnchantState.HAS_ITEM_IN_HEX) { + if (Mouse.getEventButtonState()) { + int left = guiLeft + X_SIZE / 2 - 56; + int top = guiTop + 83; + + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 - 1 - 48, top + 18, 48, 14, + 0, 48 / 512f, 328 / 512f, (328 + 14) / 512f, GL11.GL_NEAREST + ); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 + 1, top + 18, 48, 14, + 0, 48 / 512f, 328 / 512f, (328 + 14) / 512f, GL11.GL_NEAREST + ); + + if (!isChangingEnchLevel && mouseX > guiLeft + X_SIZE / 2 + 1 && mouseX <= guiLeft + X_SIZE / 2 + 1 + 48 && + mouseY > top + 18 && mouseY <= top + 18 + 14) { + /*if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(45); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, 45, 0, 0, stack, transactionID)); + + cancelButtonAnimTime = System.currentTimeMillis(); + currentState = EnchantState.HAS_ITEM_IN_BOOKS; + enchanterCurrentItem = null;*/ + } else if (!isChangingEnchLevel && enchanterCurrentItem != null && + (mouseX > left + 16 && mouseX <= left + 96 && + mouseY > top && mouseY <= top + 16) || + (mouseX > guiLeft + X_SIZE / 2 - 1 - 48 && mouseX <= guiLeft + X_SIZE / 2 - 1 && + mouseY > top + 18 && mouseY <= top + 18 + 14)) { + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot( + enchanterCurrentItem.slotIndex); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, + enchanterCurrentItem.slotIndex, 0, 0, stack, transactionID + )); + enchantingItem = null; + if (removingEnchantPlayerLevel >= 0 && enchanterCurrentItem.level == removingEnchantPlayerLevel) { + orbDisplay.spawnExperienceOrbs(X_SIZE / 2, 66, X_SIZE / 2, 36, 3); + } else { + orbDisplay.spawnExperienceOrbs(mouseX - guiLeft, mouseY - guiTop, X_SIZE / 2, 66, 0); + } + + confirmButtonAnimTime = System.currentTimeMillis(); + //enchanterCurrentItem = null; + //currentState = EnchantState.HAS_ITEM_IN_BOOKS; + } else if (mouseX > left + 96 && mouseX <= left + 96 + 16) { + if (!isChangingEnchLevel) { + if (mouseY > top && mouseY < top + 16) { + isChangingEnchLevel = true; + return true; + } + } else { + List before = new ArrayList<>(); + List after = new ArrayList<>(); + + for (HexItem item : enchanterItemLevels.values()) { + if (item.level < enchanterCurrentItem.level) { + before.add(item); + } else if (item.level > enchanterCurrentItem.level) { + after.add(item); + } + } + + before.sort(Comparator.comparingInt(o -> -o.level)); + after.sort(Comparator.comparingInt(o -> o.level)); + + int bSize = before.size(); + int aSize = after.size(); + for (int i = 0; i < bSize + aSize; i++) { + HexItem item; + int yIndex; + if (i < bSize) { + yIndex = -i - 1; + item = before.get(i); + } else { + yIndex = i - bSize + 1; + item = after.get(i - bSize); + } + + if (mouseY > top + 16 * yIndex && mouseY <= top + 16 * yIndex + 16) { + enchanterCurrentItem = item; + isChangingEnchLevel = false; + return true; + } + } + } + } + + if (isChangingEnchLevel) { + isChangingEnchLevel = false; + return true; + } + } + } else if (currentState == EnchantState.ADDING_GEMSTONE || currentState == EnchantState.APPLYING_GEMSTONE) { + if (Mouse.getEventButtonState()) { + int left = guiLeft + X_SIZE / 2 - 56; + int top = guiTop + 83; + + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 - 1 - 48, top + 18, 48, 14, + 0, 48 / 512f, 328 / 512f, (328 + 14) / 512f, GL11.GL_NEAREST + ); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 + 1, top + 18, 48, 14, + 0, 48 / 512f, 328 / 512f, (328 + 14) / 512f, GL11.GL_NEAREST + ); + + if (!isChangingEnchLevel && mouseX > guiLeft + X_SIZE / 2 + 1 && mouseX <= guiLeft + X_SIZE / 2 + 1 + 48 && + mouseY > top + 18 && mouseY <= top + 18 + 14) { + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + if (currentState != EnchantState.APPLYING_GEMSTONE) { + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(45); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, 45, 0, 0, stack, transactionID)); + + cancelButtonAnimTime = System.currentTimeMillis(); + currentState = EnchantState.HAS_ITEM_IN_GEMSTONE; + enchanterCurrentItem = null; + } else { + currentState = EnchantState.ADDING_ENCHANT; + enchanterCurrentItem = null; + } + } else if (!isChangingEnchLevel && enchanterCurrentItem != null && + (mouseX > left + 16 && mouseX <= left + 96 && + mouseY > top && mouseY <= top + 16) || + (mouseX > guiLeft + X_SIZE / 2 - 1 - 48 && mouseX <= guiLeft + X_SIZE / 2 - 1 && + mouseY > top + 18 && mouseY <= top + 18 + 14) && currentState == EnchantState.APPLYING_GEMSTONE) { + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot( + enchanterCurrentItem.slotIndex); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, + enchanterCurrentItem.slotIndex, 0, 0, stack, transactionID + )); + enchantingItem = null; + if (removingEnchantPlayerLevel >= 0 && enchanterCurrentItem.level == removingEnchantPlayerLevel) { + orbDisplay.spawnExperienceOrbs(X_SIZE / 2, 66, X_SIZE / 2, 36, 3); + } else { + orbDisplay.spawnExperienceOrbs(mouseX - guiLeft, mouseY - guiTop, X_SIZE / 2, 66, 0); + } + + confirmButtonAnimTime = System.currentTimeMillis(); + enchanterCurrentItem = null; + currentState = EnchantState.ADDING_GEMSTONE; + } else if (mouseX > left + 96 && mouseX <= left + 96 + 16) { + if (!isChangingEnchLevel) { + if (mouseY > top && mouseY < top + 16) { + isChangingEnchLevel = true; + return true; + } + } else { + List before = new ArrayList<>(); + List after = new ArrayList<>(); + + for (HexItem item : enchanterItemLevels.values()) { + if (item.level < enchanterCurrentItem.level) { + before.add(item); + } else if (item.level > enchanterCurrentItem.level) { + after.add(item); + } + } + + before.sort(Comparator.comparingInt(o -> -o.level)); + after.sort(Comparator.comparingInt(o -> o.level)); + + int bSize = before.size(); + int aSize = after.size(); + for (int i = 0; i < bSize + aSize; i++) { + HexItem item; + int yIndex; + if (i < bSize) { + yIndex = -i - 1; + item = before.get(i); + } else { + yIndex = i - bSize + 1; + item = after.get(i - bSize); + } + + if (mouseY > top + 16 * yIndex && mouseY <= top + 16 * yIndex + 16) { + enchanterCurrentItem = item; + isChangingEnchLevel = false; + return true; + } + } + } + } + + if (isChangingEnchLevel) { + isChangingEnchLevel = false; + return true; + } + } + } + + if (!Mouse.getEventButtonState() && Mouse.getEventButton() < 0 && clickedScrollOffset != -1) { + if (isInEnchanting()) { + LerpingInteger lerpingInteger = isClickedScrollLeft ? leftScroll : rightScroll; + List enchantsList = isClickedScrollLeft ? applicable : removable; + + if (enchantsList.size() > 6) { + int newOffset = mouseY - clickedScrollOffset; + + int newScroll = Math.round(newOffset * (float) ((enchantsList.size() - 6) * 16) / (96 - 15)); + int max = (enchantsList.size() - 6) * 16; + + if (newScroll > max) newScroll = max; + if (newScroll < 0) newScroll = 0; + + lerpingInteger.setValue(newScroll); + } + } else { + LerpingInteger lerpingInteger = isClickedScrollLeft ? leftScroll : rightScroll; + List itemsList = isClickedScrollLeft ? applicableItem : removableItem; + + if (itemsList.size() > 6) { + int newOffset = mouseY - clickedScrollOffset; + + int newScroll = Math.round(newOffset * (float) ((itemsList.size() - 6) * 16) / (96 - 15)); + int max = (itemsList.size() - 6) * 16; + + if (newScroll > max) newScroll = max; + if (newScroll < 0) newScroll = 0; + + lerpingInteger.setValue(newScroll); + } + } + } + + //Config options + if (Mouse.getEventButtonState()) { + if (mouseX >= guiLeft + 294 && mouseX < guiLeft + 294 + 36 && + mouseY >= guiTop + 146 && mouseY < guiTop + 146 + 36) { + int index = (mouseX - (guiLeft + 295)) / 18 + (mouseY - (guiTop + 147)) / 18 * 2; + + int direction = Mouse.getEventButton() == 0 ? 1 : -1; + + switch (index) { + case 0: { + NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enableTableGUI = false; + break; + } + case 2: { + int val = NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enchantSorting; + val += direction; + if (val < 0) val = 1; + if (val > 1) val = 0; + NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enchantSorting = val; + break; + } + case 3: { + int val = NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enchantOrdering; + val += direction; + if (val < 0) val = 1; + if (val > 1) val = 0; + NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enchantOrdering = val; + break; + } + } + } + } + + if (Mouse.getEventButton() == 0) { + if (Mouse.getEventButtonState()) { + if (isInEnchanting()) { + if (mouseX > guiLeft + 104 && mouseX < guiLeft + 104 + 12) { + int offset; + if (applicable.size() <= 6) { + offset = 0; + } else { + offset = Math.round((96 - 15) * (leftScroll.getValue() / (float) ((applicable.size() - 6) * 16))); + } + if (mouseY >= guiTop + 18 + offset && mouseY < guiTop + 18 + offset + 15) { + isClickedScrollLeft = true; + clickedScrollOffset = mouseY - offset; + } + } else if (mouseX > guiLeft + 344 && mouseX < guiLeft + 344 + 12) { + int offset; + if (removable.size() <= 6) { + offset = 0; + } else { + offset = Math.round((96 - 15) * (rightScroll.getValue() / (float) ((removable.size() - 6) * 16))); + } + if (mouseY >= guiTop + 18 + offset && mouseY < guiTop + 18 + offset + 15) { + isClickedScrollLeft = false; + clickedScrollOffset = mouseY - offset; + } + } + } else { + if (mouseX > guiLeft + 104 && mouseX < guiLeft + 104 + 12) { + int offset; + if (applicableItem.size() <= 6) { + offset = 0; + } else { + offset = Math.round((96 - 15) * (leftScroll.getValue() / (float) ((applicableItem.size() - 6) * 16))); + } + if (mouseY >= guiTop + 18 + offset && mouseY < guiTop + 18 + offset + 15) { + isClickedScrollLeft = true; + clickedScrollOffset = mouseY - offset; + } + } else if (mouseX > guiLeft + 344 && mouseX < guiLeft + 344 + 12) { + int offset; + if (removableItem.size() <= 6) { + offset = 0; + } else { + offset = Math.round((96 - 15) * (rightScroll.getValue() / (float) ((removableItem.size() - 6) * 16))); + } + if (mouseY >= guiTop + 18 + offset && mouseY < guiTop + 18 + offset + 15) { + isClickedScrollLeft = false; + clickedScrollOffset = mouseY - offset; + } + } + } + } else { + clickedScrollOffset = -1; + } + } + + if (mouseY > guiTop + 18 && mouseY < guiTop + 18 + 96) { + if (mouseX > guiLeft + 8 && mouseX < guiLeft + 8 + 96) { + if (Mouse.getEventButton() == 0 && Mouse.getEventButtonState() && + Minecraft.getMinecraft().thePlayer.inventory.getItemStack() == null) { + if (isInEnchanting()) { + for (int i = 0; i < 7; i++) { + int index = i + leftScroll.getValue() / 16; + if (applicable.size() <= index) break; + + int top = guiTop - (leftScroll.getValue() % 16) + 18 + 16 * i; + if (mouseX > guiLeft + 8 && mouseX <= guiLeft + 8 + 96 && + mouseY > top && mouseY <= top + 16) { + Enchantment ench = applicable.get(index); + + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + if (currentState == EnchantState.HAS_ITEM) { + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = + ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(ench.slotIndex); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, + ench.slotIndex, 0, 0, stack, transactionID + )); + } else if (currentState == EnchantState.ADDING_ENCHANT) { + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(45); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, 45, 0, 0, stack, transactionID)); + + cancelButtonAnimTime = System.currentTimeMillis(); + } + + return true; + } + } + } else if (!isInHex() && !isInGemstones()) { + for (int i = 0; i < 7; i++) { + int index = i + leftScroll.getValue() / 16; + if (applicableItem.size() <= index) break; + + int top = guiTop - (leftScroll.getValue() % 16) + 18 + 16 * i; + if (mouseX > guiLeft + 8 && mouseX <= guiLeft + 8 + 96 && + mouseY > top && mouseY <= top + 16) { + HexItem item = applicableItem.get(index); + + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + if (currentState == EnchantState.HAS_ITEM_IN_BOOKS) { + currentState = EnchantState.ADDING_BOOK; + enchanterCurrentItem = item; + } else if (currentState == EnchantState.ADDING_BOOK && enchanterCurrentItem == item) { + currentState = EnchantState.HAS_ITEM_IN_BOOKS; + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = + ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(item.slotIndex); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, + item.slotIndex, 0, 0, stack, transactionID + )); + + cancelButtonAnimTime = System.currentTimeMillis(); + } else { + currentState = EnchantState.HAS_ITEM_IN_BOOKS; + enchanterCurrentItem = null; + } + + return true; + } + } + } else if (isInHex() && !isInGemstones()) { + for (int i = 0; i < 7; i++) { + int index = i + leftScroll.getValue() / 16; + if (applicableItem.size() <= index) break; + + int top = guiTop - (leftScroll.getValue() % 16) + 18 + 16 * i; + if (mouseX > guiLeft + 8 && mouseX <= guiLeft + 8 + 96 && + mouseY > top && mouseY <= top + 16) { + HexItem item = applicableItem.get(index); + + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + currentState = EnchantState.HAS_ITEM_IN_BOOKS; + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = + ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(item.slotIndex); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, + item.slotIndex, 0, 0, stack, transactionID + )); + + //cancelButtonAnimTime = System.currentTimeMillis(); + + return true; + } + } + } else if (currentState == EnchantState.ADDING_GEMSTONE || currentState == EnchantState.APPLYING_GEMSTONE) { + for (int i = 0; i < 7; i++) { + int index = i + leftScroll.getValue() / 16; + if (applicableItem.size() <= index) break; + + int top = guiTop - (leftScroll.getValue() % 16) + 18 + 16 * i; + if (mouseX > guiLeft + 8 && mouseX <= guiLeft + 8 + 96 && + mouseY > top && mouseY <= top + 16) { + HexItem item = applicableItem.get(index); + + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + if (currentState == EnchantState.ADDING_GEMSTONE) { + currentState = EnchantState.APPLYING_GEMSTONE; + enchanterCurrentItem = item; + } else if (currentState == EnchantState.APPLYING_GEMSTONE && enchanterCurrentItem == item) { + currentState = EnchantState.ADDING_GEMSTONE; + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = + ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(item.slotIndex); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, + item.slotIndex, 0, 0, stack, transactionID + )); + + cancelButtonAnimTime = System.currentTimeMillis(); + } else { + currentState = EnchantState.ADDING_GEMSTONE; + enchanterCurrentItem = null; + } + + //cancelButtonAnimTime = System.currentTimeMillis(); + + return true; + } + } + } else if (currentState == EnchantState.HAS_ITEM_IN_GEMSTONE) { + for (int i = 0; i < 7; i++) { + int index = i + leftScroll.getValue() / 16; + if (applicableItem.size() <= index) break; + + int top = guiTop - (leftScroll.getValue() % 16) + 18 + 16 * i; + if (mouseX > guiLeft + 8 && mouseX <= guiLeft + 8 + 96 && + mouseY > top && mouseY <= top + 16) { + HexItem item = applicableItem.get(index); + + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = + ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(item.slotIndex); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, + item.slotIndex, 0, 0, stack, transactionID + )); + + cancelButtonAnimTime = System.currentTimeMillis(); + + //cancelButtonAnimTime = System.currentTimeMillis(); + + return true; + } + } + } + } + + isScrollingLeft = true; + } else if (mouseX > guiLeft + 248 && mouseX < guiLeft + 248 + 96) { + if (Mouse.getEventButton() == 0 && Mouse.getEventButtonState() && + Minecraft.getMinecraft().thePlayer.inventory.getItemStack() == null) { + if (isInEnchanting()) { + for (int i = 0; i < 7; i++) { + int index = i + rightScroll.getValue() / 16; + if (removable.size() <= index) break; + + int top = guiTop - (rightScroll.getValue() % 16) + 18 + 16 * i; + if (mouseX > guiLeft + 248 && mouseX <= guiLeft + 248 + 96 && + mouseY > top && mouseY <= top + 16) { + Enchantment ench = removable.get(index); + + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + if (currentState == EnchantState.HAS_ITEM || currentState == EnchantState.HAS_ITEM_IN_HEX) { + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = + ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(ench.slotIndex); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, + ench.slotIndex, 0, 0, stack, transactionID + )); + } else if (currentState == EnchantState.ADDING_ENCHANT) { + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(45); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, 45, 0, 0, stack, transactionID)); + + cancelButtonAnimTime = System.currentTimeMillis(); + } + + return true; + } + } + } else if (currentState == EnchantState.ADDING_GEMSTONE) { + for (int i = 0; i < 7; i++) { + int index = i + rightScroll.getValue() / 16; + if (removableItem.size() <= index) break; + + int top = guiTop - (rightScroll.getValue() % 16) + 18 + 16 * i; + if (mouseX > guiLeft + 248 && mouseX <= guiLeft + 248 + 96 && + mouseY > top && mouseY <= top + 16) { + HexItem item = removableItem.get(index); + + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + if (currentState == EnchantState.ADDING_GEMSTONE) { + currentState = EnchantState.APPLYING_GEMSTONE; + enchanterCurrentItem = item; + } else if (currentState == EnchantState.APPLYING_GEMSTONE && enchanterCurrentItem == item) { + currentState = EnchantState.ADDING_GEMSTONE; + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = + ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(item.slotIndex); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, + item.slotIndex, 0, 0, stack, transactionID + )); + + cancelButtonAnimTime = System.currentTimeMillis(); + } else { + currentState = EnchantState.ADDING_GEMSTONE; + enchanterCurrentItem = null; + } + + return true; + } + } + + } else { + for (int i = 0; i < 7; i++) { + int index = i + rightScroll.getValue() / 16; + if (removableItem.size() <= index) break; + + int top = guiTop - (rightScroll.getValue() % 16) + 18 + 16 * i; + if (mouseX > guiLeft + 248 && mouseX <= guiLeft + 248 + 96 && + mouseY > top && mouseY <= top + 16) { + HexItem item = removableItem.get(index); + + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + if (currentState == EnchantState.HAS_ITEM_IN_BOOKS) { + currentState = EnchantState.ADDING_BOOK; + enchanterCurrentItem = item; + } else if (currentState == EnchantState.ADDING_BOOK && enchanterCurrentItem == item) { + currentState = EnchantState.HAS_ITEM_IN_BOOKS; + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = + ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(item.slotIndex); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, + item.slotIndex, 0, 0, stack, transactionID + )); + + cancelButtonAnimTime = System.currentTimeMillis(); + } else { + currentState = EnchantState.HAS_ITEM_IN_BOOKS; + enchanterCurrentItem = null; + } + + return true; + } + } + } + } + isScrollingLeft = false; + } + } + if (Mouse.getEventDWheel() != 0) { + int scroll = Mouse.getEventDWheel(); + if (scroll > 0) { + scroll = -16; + } else { + scroll = 16; + } + + LerpingInteger lerpingInteger = isScrollingLeft ? leftScroll : rightScroll; + int elementsCount; + if (isInEnchanting()) { + elementsCount = isScrollingLeft ? applicable.size() : removable.size(); + } else { + elementsCount = isScrollingLeft ? applicableItem.size() : removableItem.size(); + } + int max = (elementsCount - 6) * 16; + + int newTarget = lerpingInteger.getTarget() + scroll; + if (newTarget > max) newTarget = max; + if (newTarget < 0) newTarget = 0; + + if (newTarget != lerpingInteger.getTarget()) { + lerpingInteger.resetTimer(); + lerpingInteger.setTarget(newTarget); + } + } + + if (mouseX > guiLeft + 102 && mouseX < guiLeft + 102 + 160) { + if ((mouseY > guiTop + 133 && mouseY < guiTop + 133 + 54) || + (mouseY > guiTop + 133 + 54 + 4 && mouseY < guiTop + 133 + 54 + 4 + 18)) { + if (currentState == EnchantState.ADDING_ENCHANT) { + if (Mouse.getEventButtonState()) { + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(45); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, 45, 0, 0, stack, transactionID)); + + cancelButtonAnimTime = System.currentTimeMillis(); + } + return true; + } else { + return false; + } + } + } + if (mouseX >= guiLeft + 173 && mouseX < guiLeft + 173 + 18 && + mouseY >= guiTop + 57 && mouseY < guiTop + 57 + 18) { + if (currentState == EnchantState.ADDING_ENCHANT) { + if (Mouse.getEventButtonState()) { + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return true; + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + + EntityPlayerSP playerIn = Minecraft.getMinecraft().thePlayer; + short transactionID = playerIn.openContainer.getNextTransactionID(playerIn.inventory); + ItemStack stack = ((ContainerChest) chest.inventorySlots).getLowerChestInventory().getStackInSlot(45); + Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C0EPacketClickWindow( + chest.inventorySlots.windowId, 45, 0, 0, stack, transactionID)); + + cancelButtonAnimTime = System.currentTimeMillis(); + } + return true; + } else { + return false; + } + } + return true; + } + + public boolean keyboardInput() { + if (currentState == EnchantState.HAS_ITEM && searchField.getFocus()) { + if (Keyboard.getEventKeyState()) { + searchField.keyTyped(Keyboard.getEventCharacter(), Keyboard.getEventKey()); + } + return true; + } + if (Keyboard.getEventKey() == Minecraft.getMinecraft().gameSettings.keyBindScreenshot.getKeyCode()) { + return false; + } + + return Keyboard.getEventKey() != Keyboard.KEY_ESCAPE && + Keyboard.getEventKey() != Minecraft.getMinecraft().gameSettings.keyBindInventory.getKeyCode() && + (!NotEnoughUpdates.INSTANCE.config.slotLocking.enableSlotLocking || + Keyboard.getEventKey() != NotEnoughUpdates.INSTANCE.config.slotLocking.slotLockKey); + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/HexItem.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/HexItem.java new file mode 100644 index 00000000..5b3b30ea --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/HexItem.java @@ -0,0 +1,264 @@ +/* + * 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.miscgui.hex; + +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.util.Constants; +import io.github.moulberry.notenoughupdates.util.Utils; +import net.minecraft.util.StringUtils; + +import java.util.List; + +public class HexItem { + public int slotIndex; + public String itemName; + public String itemId; + public List displayLore; + public int level; + public int price = -1; + public boolean overMaxLevel = false; + public boolean conflicts = false; + public ItemType itemType; + public int gemstoneLevel = -1; + + public HexItem( + int slotIndex, String itemName, String itemId, List displayLore, + boolean useMaxLevelForCost, boolean checkConflicts + ) { + this.slotIndex = slotIndex; + this.itemName = itemName; + this.itemId = itemId.replace("'S", ""); + this.displayLore = displayLore; + switch (itemId) { + default: + this.itemType = ItemType.UNKNOWN; + break; + case "HOT_POTATO_BOOK": + this.itemType = ItemType.HOT_POTATO; + break; + case "FUMING_POTATO_BOOK": + this.itemType = ItemType.FUMING_POTATO; + break; + case "BOOK_OF_STATS": + this.itemType = ItemType.BOOK_OF_STATS; + break; + case "THE_ART_OF_WAR": + this.itemType = ItemType.ART_OF_WAR; + break; + case "FARMING_FOR_DUMMIES": + this.itemType = ItemType.FARMING_DUMMY; + break; + case "THE_ART_OF_PEACE": + this.itemType = ItemType.ART_OF_PEACE; + break; + case "RECOMBOBULATOR_3000": + this.itemType = ItemType.RECOMB; + break; + case "SILEX": + this.itemId = "SIL_EX"; + this.itemType = ItemType.SILEX; + break; + case "RUBY_POWER_SCROLL": + this.itemType = ItemType.RUBY_SCROLL; + break; + case "SAPPHIRE_POWER_SCROLL": + this.itemType = ItemType.SAPPHIRE_SCROLL; + break; + case "JASPER_POWER_SCROLL": + this.itemType = ItemType.JASPER_SCROLL; + break; + case "AMETHYST_POWER_SCROLL": + this.itemType = ItemType.AMETHYST_SCROLL; + break; + case "AMBER_POWER_SCROLL": + this.itemType = ItemType.AMBER_SCROLL; + break; + case "OPAL_POWER_SCROLL": + this.itemType = ItemType.OPAL_SCROLL; + break; + case "FIRST_MASTER_STAR": + this.itemType = ItemType.FIRST_MASTER_STAR; + break; + case "SECOND_MASTER_STAR": + this.itemType = ItemType.SECOND_MASTER_STAR; + break; + case "THIRD_MASTER_STAR": + this.itemType = ItemType.THIRD_MASTER_STAR; + break; + case "FOURTH_MASTER_STAR": + this.itemType = ItemType.FOURTH_MASTER_STAR; + break; + case "FIFTH_MASTER_STAR": + this.itemType = ItemType.FIFTH_MASTER_STAR; + break; + case "WOOD_SINGULARITY": + this.itemType = ItemType.WOOD_SINGULARITY; + break; + case "IMPLOSION": + this.itemType = ItemType.IMPLOSION_SCROLL; + break; + case "WITHER_SHIELD": + this.itemType = ItemType.WITHER_SHIELD_SCROLL; + break; + case "SHADOW_WARP": + this.itemType = ItemType.SHADOW_WARP_SCROLL; + break; + case "TRANSMISSION_TUNER": + this.itemType = ItemType.TUNER; + break; + case "RANDOM_REFORGE": + this.itemType = ItemType.RANDOM_REFORGE; + break; + case "MANA_DISINTEGRATOR": + this.itemType = ItemType.MANA_DISINTEGRATOR; + break; + case "TOTAL_UPGRADES": + this.itemType = ItemType.TOTAL_UPGRADES; + break; + case "CONVERT_TO_DUNGEON": + this.itemType = ItemType.CONVERT_TO_DUNGEON; + break; + case "EXPERIENCE_BOTTLE": + this.itemType = ItemType.EXPERIENCE_BOTTLE; + break; + case "GRAND_EXPERIENCE_BOTTLE": + this.itemType = ItemType.GRAND_EXPERIENCE_BOTTLE; + break; + case "TITANIC_EXPERIENCE_BOTTLE": + this.itemType = ItemType.TITANIC_EXPERIENCE_BOTTLE; + break; + case "COLOSSAL_EXPERIENCE_BOTTLE": + this.itemType = ItemType.COLOSSAL_EXPERIENCE_BOTTLE; + break; + } + if (this.itemType == ItemType.UNKNOWN) { + for (String string : displayLore) { + if ((string.contains("Applies the") && string.contains("reforge")) || + string.contains("reforge when combined")) { + this.itemType = ItemType.REFORGE; + break; + } + } + } + if (!this.isMasterStar() && itemId.contains("✪")) { + if (itemId.contains("✪✪✪✪✪")) this.itemType = ItemType.FIFTH_STAR; + else if (itemId.contains("✪✪✪✪")) this.itemType = ItemType.FOURTH_STAR; + else if (itemId.contains("✪✪✪")) this.itemType = ItemType.THIRD_STAR; + else if (itemId.contains("✪✪")) this.itemType = ItemType.SECOND_STAR; + else if (itemId.contains("✪")) this.itemType = ItemType.FIRST_STAR; + } + if (this.itemId.contains("EXPERIENCE_BOTTLE")) { + this.itemId = this.itemId.replace("EXPERIENCE_BOTTLE", "EXP_BOTTLE"); + } + if (this.itemId.contains("END_STONE_GEODE")) { + this.itemId = this.itemId.replace("END_STONE_GEODE", "ENDSTONE_GEODE"); + } + if (itemId.contains("HEX_ITEM")) this.itemType = ItemType.HEX_ITEM; + JsonObject bazaarInfo = NotEnoughUpdates.INSTANCE.manager.auctionManager.getBazaarInfo(this.itemId); + if (bazaarInfo != null && bazaarInfo.get("curr_buy") != null) { + this.price = bazaarInfo.get("curr_buy").getAsInt(); + } + if ("SIL_EX".equals(this.itemId)) this.itemId = "SILEX"; + if (itemName.contains("Amethyst Gemstone")) this.itemType = ItemType.AMETHYST_GEMSTONE; + if (itemName.contains("Ruby Gemstone")) this.itemType = ItemType.RUBY_GEMSTONE; + if (itemName.contains("Sapphire Gemstone")) this.itemType = ItemType.SAPPHIRE_GEMSTONE; + if (itemName.contains("Jasper Gemstone")) this.itemType = ItemType.JASPER_GEMSTONE; + if (itemName.contains("Jade Gemstone")) this.itemType = ItemType.JADE_GEMSTONE; + if (itemName.contains("Amber Gemstone")) this.itemType = ItemType.AMBER_GEMSTONE; + if (itemName.contains("Opal Gemstone")) this.itemType = ItemType.OPAL_GEMSTONE; + if (itemName.contains("Topaz Gemstone")) this.itemType = ItemType.TOPAZ_GEMSTONE; + if (itemName.contains("Gemstone Slot")) this.itemType = ItemType.GEMSTONE_SLOT; + if (this.itemName.contains(" Gemstone")) { + this.itemName = this.itemName.replace(" Gemstone", "").substring(2); + } else if (this.itemName.contains(" Experience Bottle")) { + this.itemName = this.itemName.replace("Experience Bottle", ""); + } else if (this.itemName.equals("Experience Bottle")) { + this.itemName = "Exp Bottle"; + } + if (isGemstone()) { + if (this.itemName.contains("Rough")) this.gemstoneLevel = 0; + if (this.itemName.contains("Flawed")) this.gemstoneLevel = 1; + if (this.itemName.contains("Fine")) this.gemstoneLevel = 2; + if (this.itemName.contains("Flawless")) this.gemstoneLevel = 3; + if (this.itemName.contains("Perfect")) this.gemstoneLevel = 4; + } + } + + public boolean isPowerScroll() { + return itemType == ItemType.RUBY_SCROLL || itemType == ItemType.SAPPHIRE_SCROLL || + itemType == ItemType.JASPER_SCROLL || itemType == ItemType.AMETHYST_SCROLL || + itemType == ItemType.AMBER_SCROLL || itemType == ItemType.OPAL_SCROLL; + } + + public boolean isDungeonStar() { + return itemType == ItemType.FIRST_STAR || itemType == ItemType.SECOND_STAR || + itemType == ItemType.THIRD_STAR || itemType == ItemType.FOURTH_STAR || + itemType == ItemType.FIFTH_STAR; + } + + public boolean isMasterStar() { + return itemType == ItemType.FIRST_MASTER_STAR || itemType == ItemType.SECOND_MASTER_STAR || + itemType == ItemType.THIRD_MASTER_STAR || itemType == ItemType.FOURTH_MASTER_STAR || + itemType == ItemType.FIFTH_MASTER_STAR; + } + + public String getReforge() { + JsonObject reforgeStones = Constants.REFORGESTONES; + if (reforgeStones != null && reforgeStones.has(this.itemId.toUpperCase())) { + JsonObject reforgeInfo = reforgeStones.get(this.itemId.toUpperCase()).getAsJsonObject(); + if (reforgeInfo != null) { + return Utils.getElementAsString(reforgeInfo.get("reforgeName"), ""); + } + + } + return ""; + } + + public int getPrice() { + if (this.itemType == ItemType.RANDOM_REFORGE) { + for (String string : displayLore) { + if (string.contains("Coins")) { + try { + price = Integer.parseInt(StringUtils + .stripControlCodes(string) + .replace(" Coins", "") + .replace(",", "") + .trim()); + } catch (NumberFormatException ignored) { + } + } + } + } + return price; + } + + public boolean isHypeScroll() { + return itemType == ItemType.IMPLOSION_SCROLL || itemType == ItemType.WITHER_SHIELD_SCROLL || + itemType == ItemType.SHADOW_WARP_SCROLL; + } + + public boolean isGemstone() { + return itemType == ItemType.RUBY_GEMSTONE || itemType == ItemType.AMETHYST_GEMSTONE || + itemType == ItemType.SAPPHIRE_GEMSTONE || itemType == ItemType.JASPER_GEMSTONE || + itemType == ItemType.JADE_GEMSTONE || itemType == ItemType.AMBER_GEMSTONE || + itemType == ItemType.OPAL_GEMSTONE || itemType == ItemType.TOPAZ_GEMSTONE; + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/ItemType.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/ItemType.java new file mode 100644 index 00000000..3b47a86d --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/ItemType.java @@ -0,0 +1,84 @@ +/* + * 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.miscgui.hex; + +enum ItemType { + HOT_POTATO, + FUMING_POTATO, + BOOK_OF_STATS, + ART_OF_WAR, + ART_OF_PEACE, + FARMING_DUMMY, + RECOMB, + SILEX, + RUBY_SCROLL, + SAPPHIRE_SCROLL, + JASPER_SCROLL, + AMETHYST_SCROLL, + AMBER_SCROLL, + OPAL_SCROLL, + FIRST_STAR(1), + SECOND_STAR(2), + THIRD_STAR(3), + FOURTH_STAR(4), + FIFTH_STAR(5), + FIRST_MASTER_STAR(6), + SECOND_MASTER_STAR(7), + THIRD_MASTER_STAR(8), + FOURTH_MASTER_STAR(9), + FIFTH_MASTER_STAR(10), + WOOD_SINGULARITY, + IMPLOSION_SCROLL, + SHADOW_WARP_SCROLL, + WITHER_SHIELD_SCROLL, + TUNER, + REFORGE, + RANDOM_REFORGE, + MANA_DISINTEGRATOR, + HEX_ITEM, + TOTAL_UPGRADES, + RUBY_GEMSTONE, + AMETHYST_GEMSTONE, + SAPPHIRE_GEMSTONE, + JASPER_GEMSTONE, + JADE_GEMSTONE, + AMBER_GEMSTONE, + OPAL_GEMSTONE, + TOPAZ_GEMSTONE, + CONVERT_TO_DUNGEON, + GEMSTONE_SLOT, + EXPERIENCE_BOTTLE, + GRAND_EXPERIENCE_BOTTLE, + TITANIC_EXPERIENCE_BOTTLE, + COLOSSAL_EXPERIENCE_BOTTLE, + UNKNOWN; + + private int starLevel = -1; + + ItemType() {} + + ItemType(int starLevel) { + this.starLevel = starLevel; + } + + public int getStarLevel() { + return starLevel; + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/util/ExperienceOrb.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/util/ExperienceOrb.java new file mode 100644 index 00000000..9da4f553 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/util/ExperienceOrb.java @@ -0,0 +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.miscgui.util; + +import org.lwjgl.util.vector.Vector2f; + +public class ExperienceOrb { + public Vector2f position; + public Vector2f positionLast; + public Vector2f velocity; + public Vector2f target; + + public int type; + public int rotationDeg; +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/util/OrbDisplay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/util/OrbDisplay.java new file mode 100644 index 00000000..42e935f5 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/util/OrbDisplay.java @@ -0,0 +1,142 @@ +/* + * 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.miscgui.util; + +import io.github.moulberry.notenoughupdates.core.util.lerp.LerpUtils; +import io.github.moulberry.notenoughupdates.util.Utils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import org.lwjgl.util.vector.Vector2f; + +import java.util.ArrayList; +import java.util.List; +import java.util.ListIterator; +import java.util.Random; + +public class OrbDisplay { + private static final ResourceLocation TEXTURE = new ResourceLocation("notenoughupdates:custom_enchant_gui.png"); + private static final int DEFAULT_COUNT = 30; + + private final List experienceOrbList = new ArrayList<>(); + + public ExperienceOrb spawnExperienceOrb(Random random, Vector2f start, Vector2f target, int baseType) { + ExperienceOrb orb = new ExperienceOrb(); + orb.position = new Vector2f(start); + orb.positionLast = new Vector2f(orb.position); + orb.velocity = new Vector2f( + random.nextFloat() * 20 - 10, + random.nextFloat() * 20 - 10 + ); + orb.target = new Vector2f(target); + orb.type = baseType; + orb.rotationDeg = random.nextInt(4) * 90; + + float v = random.nextFloat(); + if (v > 0.6) { + orb.type += 1; + } + if (v > 0.9) { + orb.type += 1; + } + + experienceOrbList.add(orb); + + return orb; + } + + public void spawnExperienceOrbs(int startX, int startY, int targetX, int targetY, int baseType) { + spawnExperienceOrbs(new Random(),new Vector2f(startX, startY), new Vector2f(targetX, targetY), baseType, DEFAULT_COUNT); + } + + public void spawnExperienceOrbs(Random random, Vector2f start, Vector2f target, int baseType, int count) { + for (int i = 0; i < count; i++) { + spawnExperienceOrb(random, start, target, baseType); + } + } + + public void physicsTickOrbs() { + for (ListIterator it = experienceOrbList.listIterator(); it.hasNext(); ) { + ExperienceOrb orb = it.next(); + + Vector2f delta = Vector2f.sub(orb.target, orb.position, null); + float length = delta.length(); + + // Remove close Orbs + if (length < 8 && orb.velocity.lengthSquared() < 20) { + it.remove(); + continue; + } + + // Update velocity + Vector2f.add(orb.velocity, (Vector2f) delta.scale(2 / length), orb.velocity); + orb.velocity.scale(0.9F); + + // Update position + orb.positionLast.set(orb.position); + Vector2f.add(orb.position, orb.velocity, orb.position); + } + } + + public void renderOrbs(float partialTicks) { + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.disableDepth(); + + for (ExperienceOrb orb : experienceOrbList) { + int orbX = Math.round(LerpUtils.lerp(orb.position.x, orb.positionLast.x, partialTicks)); + int orbY = Math.round(LerpUtils.lerp(orb.position.y, orb.positionLast.y, partialTicks)); + + GlStateManager.pushMatrix(); + + GlStateManager.translate(orbX, orbY, 0); + GlStateManager.rotate(orb.rotationDeg, 0, 0, 1); + + Vector2f delta = Vector2f.sub(orb.position, orb.target, null); + + float length = delta.length(); + float velocitySquared = orb.velocity.lengthSquared(); + float opacity = (float) Math.sqrt( + Math.min( + 1, + Math.min(2, Math.max(0.5F, length / 16)) + * Math.min(2, Math.max(0.5F, velocitySquared / 40)) + )); + GlStateManager.color(1, 1, 1, opacity); + + int orbU = (orb.type % 3) * 16; + int orbV = (orb.type / 3) * 16 + 217; + + Utils.drawTexturedRect( + -8, -8, 16, 16, + orbU / 512f, + (orbU + 16) / 512f, + orbV / 512f, + (orbV + 16) / 512f, + GL11.GL_NEAREST + ); + + GlStateManager.popMatrix(); + } + + GlStateManager.enableDepth(); + } + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java index be36d0b4..7d17aa3e 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java @@ -30,6 +30,7 @@ import io.github.moulberry.notenoughupdates.miscfeatures.EnchantingSolvers; import io.github.moulberry.notenoughupdates.miscfeatures.PetInfoOverlay; import io.github.moulberry.notenoughupdates.miscfeatures.SlotLocking; import io.github.moulberry.notenoughupdates.miscgui.GuiCustomEnchant; +import io.github.moulberry.notenoughupdates.miscgui.hex.GuiCustomHex; import io.github.moulberry.notenoughupdates.miscgui.StorageOverlay; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; @@ -189,6 +190,7 @@ public abstract class MixinGuiContainer extends GuiScreen { public void isMouseOverSlot(Slot slotIn, int mouseX, int mouseY, CallbackInfoReturnable cir) { StorageOverlay.getInstance().overrideIsMouseOverSlot(slotIn, mouseX, mouseY, cir); GuiCustomEnchant.getInstance().overrideIsMouseOverSlot(slotIn, mouseX, mouseY, cir); + GuiCustomHex.getInstance().overrideIsMouseOverSlot(slotIn, mouseX, mouseY, cir); AuctionBINWarning.getInstance().overrideIsMouseOverSlot(slotIn, mouseX, mouseY, cir); AbiphoneWarning.getInstance().overrideIsMouseOverSlot(slotIn, mouseX, mouseY, cir); } -- cgit From 2d8c295a9280337bace055fd2cedae8af17995ee Mon Sep 17 00:00:00 2001 From: Walker Selby Date: Wed, 14 Sep 2022 07:38:35 -0500 Subject: Add Blaze to /peek (#279) * Add Blaze to /peek Add blaze slayer to /peek Add Carpentry to skill average in /peek Fix color of - in peek Add my IGN to DEV_TESTERS in DevTestCommand and actually commit it so I can stop manually re-adding myself to that list * Update 2.1.md Added changes to changelog * Update 2.1.md Changed formatting for readability --- Update Notes/2.1.md | 4 +++- .../notenoughupdates/commands/dev/DevTestCommand.java | 3 ++- .../notenoughupdates/commands/profile/PeekCommand.java | 15 ++++++++++++--- 3 files changed, 17 insertions(+), 5 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 50e2d0e4..e6b2b472 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -7,7 +7,7 @@ - Added combat skill overlay - nopo - Added slayer overlay - nopo - 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) + - [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) - Made it if you hold shift in the enchant solvers it overrides prevent missclicks - nopo - Fixed pet overlay not updating when going into /pets - nopo - Fixed pet overlay randomly going to level 100 - nopo @@ -153,6 +153,8 @@ - Fixed priceless items showing first in the missing tab of the accessory bag overlay - nopo - Fixed clicking outside of experimentation game causing it to go count that as a valid click - nopo - Fixed storage gui when having locked backpack slots - nopo +- Fixed hyphens in /peek being the wrong color - whalker +- Fixed skill average calculation to include carpentry in /peek - whalker ### **Other:** 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 fdf59bb0..2a5e3305 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 @@ -57,7 +57,8 @@ public class DevTestCommand extends ClientCommandBase { "dediamondpro", "lulonaut", "craftyoldminer", - "eisengolem" + "eisengolem", + "whalker" ); private static final String[] DEV_FAIL_STRINGS = { 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 421f7c10..75e779fc 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 @@ -122,7 +122,7 @@ public class PeekCommand extends ClientCommandBase { float totalSkillLVL = 0; float totalSkillCount = 0; - List skills = Arrays.asList("taming", "mining", "foraging", "enchanting", "farming", "combat", "fishing", "alchemy"); + List skills = Arrays.asList("taming", "mining", "foraging", "enchanting", "farming", "combat", "fishing", "alchemy", "carpentry"); for (String skillName : skills) { totalSkillLVL += skyblockInfo.get(skillName).level; totalSkillCount++; @@ -133,6 +133,7 @@ public class PeekCommand extends ClientCommandBase { float spider = skyblockInfo.get("spider").level; float wolf = skyblockInfo.get("wolf").level; float enderman = skyblockInfo.get("enderman").level; + float blaze = skyblockInfo.get("blaze").level; float avgSkillLVL = totalSkillLVL / totalSkillCount; @@ -143,6 +144,7 @@ public class PeekCommand extends ClientCommandBase { spider = 1; wolf = 2; enderman = 0; + blaze = 0; } EnumChatFormatting combatPrefix = combat > 20 @@ -161,6 +163,11 @@ public class PeekCommand extends ClientCommandBase { ? EnumChatFormatting.GREEN : EnumChatFormatting.YELLOW) : EnumChatFormatting.RED; + EnumChatFormatting blazePrefix = blaze > 3 + ? (blaze > 6 + ? EnumChatFormatting.GREEN + : EnumChatFormatting.YELLOW) + : EnumChatFormatting.RED; EnumChatFormatting avgPrefix = avgSkillLVL > 20 ? (avgSkillLVL > 35 ? EnumChatFormatting.GREEN @@ -171,6 +178,7 @@ public class PeekCommand extends ClientCommandBase { overallScore += spider * spider / 81f; overallScore += wolf * wolf / 81f; overallScore += enderman * enderman / 81f; + overallScore += blaze * blaze / 81f; overallScore += avgSkillLVL / 20f; int cata = (int) skyblockInfo.get("catacombs").level; @@ -187,8 +195,9 @@ public class PeekCommand extends ClientCommandBase { Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText( g + "Slayer: " + zombiePrefix + (int) Math.floor(zombie) + g + "-" + spiderPrefix + (int) Math.floor(spider) + g + "-" + - wolfPrefix + (int) Math.floor(wolf) + "-" + - endermanPrefix + (int) Math.floor(enderman))); + wolfPrefix + (int) Math.floor(wolf) + g+ "-" + + endermanPrefix + (int) Math.floor(enderman) + g + "-" + + blazePrefix + (int) Math.floor(blaze))); } if (stats == null) { Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText( -- cgit From 5b3d6154a53599d37aa9c98e89b942f70fbce2cb Mon Sep 17 00:00:00 2001 From: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> Date: Fri, 23 Sep 2022 01:56:53 +1000 Subject: fix pet middle clicking (#287) --- Update Notes/2.1.md | 2 ++ src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java | 4 +++- .../moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java | 3 +-- 3 files changed, 6 insertions(+), 3 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index e6b2b472..99b2eef0 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -155,6 +155,8 @@ - Fixed storage gui when having locked backpack slots - nopo - Fixed hyphens in /peek being the wrong color - whalker - Fixed skill average calculation to include carpentry in /peek - whalker +- Fixed middle clicking on pets not registering pet swap - nopo +- Fixed middle clicking on an item with no id searching for it - nopo ### **Other:** diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java index 308bd63e..dbff2be2 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java @@ -753,7 +753,9 @@ public class NEUOverlay extends Gui { if (slot != null) { ItemStack hover = slot.getStack(); if (hover != null) { - textField.setText("id:" + manager.getInternalNameForItem(hover)); + if (manager.getInternalNameForItem(hover) != null) { + textField.setText("id:" + manager.getInternalNameForItem(hover)); + } itemPaneOpen = true; updateSearch(); } 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 761c0695..14a136a2 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java @@ -859,8 +859,7 @@ public class PetInfoOverlay extends TextOverlay { ); public static void onStackClick(ItemStack stack, int windowId, int slotId, int mouseButtonClicked, int mode) { - if (mode != 0) return; - if (mouseButtonClicked != 0 && mouseButtonClicked != 1) return; + if (mouseButtonClicked != 0 && mouseButtonClicked != 1 && mouseButtonClicked != 2) return; int slotIdMod = (slotId - 10) % 9; if (slotId >= 10 && slotId <= 43 && slotIdMod >= 0 && slotIdMod <= 6 && -- cgit From 61c53c0054431e75826d071dfb363406b5763195 Mon Sep 17 00:00:00 2001 From: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> Date: Fri, 23 Sep 2022 23:33:16 +1000 Subject: Pet overlay fixes (#290) * fixed pet overlay going to level 100 * fixed transparent pet and equip overlay not using the special texture fixed pet overlay showing a pet when you remove your pet * made pet overlay show the current stats of your pet * Fixed pet overlay showing Until level 100.0 * Fixed pet stats not showing decimal * Made pet overlay show xp to next level * 2.1.md slight smile * Try to generify pet lore replacements a tiny bit Also move pets page to use the same code as the pet overlay Co-authored-by: hannibal2 <24389977+hannibal00212@users.noreply.github.com> Co-authored-by: nea --- Update Notes/2.1.md | 1 + .../moulberry/notenoughupdates/NEUManager.java | 3 +- .../listener/ItemTooltipListener.java | 72 +++--- .../miscfeatures/PetInfoOverlay.java | 9 +- .../overlays/EquipmentOverlay.java | 11 +- .../notenoughupdates/profileviewer/PetsPage.java | 266 ++----------------- .../notenoughupdates/util/ItemResolutionQuery.java | 7 + .../moulberry/notenoughupdates/util/ItemUtils.java | 284 ++++++++++++++++++++- 8 files changed, 368 insertions(+), 285 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 99b2eef0..1c623928 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -157,6 +157,7 @@ - Fixed skill average calculation to include carpentry in /peek - whalker - Fixed middle clicking on pets not registering pet swap - nopo - Fixed middle clicking on an item with no id searching for it - nopo +- Fixed pets with decimal stats not showing in pv - nopo ### **Other:** diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java index 92e2cfd6..62b24111 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java @@ -1380,7 +1380,7 @@ public class NEUManager { float statMax = entry.getValue().getAsFloat(); float statMin = min.get("statNums").getAsJsonObject().get(entry.getKey()).getAsFloat(); float val = statMin * minMix + statMax * maxMix; - String statStr = (statMin > 0 ? "+" : "") + (int) Math.floor(val); + String statStr = (statMin > 0 ? "+" : "") + removeUnusedDecimal(Math.floor(val * 10) / 10); replacements.put(entry.getKey(), statStr); } } @@ -1457,6 +1457,7 @@ public class NEUManager { } public ItemStack jsonToStack(JsonObject json, boolean useCache, boolean useReplacements, boolean copyStack) { + if (useReplacements) useCache = false; if (json == null) return new ItemStack(Items.painting, 1, 10); String internalname = json.get("internalname").getAsString(); 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 c522e70a..d89e886f 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java @@ -55,7 +55,6 @@ 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; @@ -67,7 +66,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class ItemTooltipListener { - private static final String petToolTipRegex = + public static final String petToolTipRegex = "((Farming)|(Combat)|(Fishing)|(Mining)|(Foraging)|(Enchanting)|(Alchemy)) ((Mount)|(Pet)|(Morph)).*"; private final NotEnoughUpdates neu; private final Pattern xpLevelPattern = Pattern.compile("(.*) (\\xA7e(.*)\\xA76/\\xA7e(.*))"); @@ -711,45 +710,44 @@ public class ItemTooltipListener { } private void petToolTipXPExtendPetMenu(ItemTooltipEvent event) { - if (NotEnoughUpdates.INSTANCE.config.tooltipTweaks.petExtendExp) { - //7 is just a random number i chose, prob no pets with less lines than 7 - if (event.toolTip.size() > 7) { - if (Utils.cleanColour(event.toolTip.get(1)).matches(petToolTipRegex)) { - GuiProfileViewer.PetLevel petLevel; - - int xpLine = -1; - for (int i = event.toolTip.size() - 1; i >= 0; i--) { - Matcher matcher = xpLevelPattern.matcher(event.toolTip.get(i)); - if (matcher.matches()) { - xpLine = i; - event.toolTip.set(xpLine, matcher.group(1)); - break; - } else if (event.toolTip.get(i).matches("MAX LEVEL")) { - return; - } - } + if (!NotEnoughUpdates.INSTANCE.config.tooltipTweaks.petExtendExp) return; + //7 is just a random number i chose, prob no pets with less lines than 7 + if (event.toolTip.size() < 7) return; + if (event.itemStack.getTagCompound().hasKey("NEUHIDEPETTOOLTIP")) return; + if (Utils.cleanColour(event.toolTip.get(1)).matches(petToolTipRegex)) { + GuiProfileViewer.PetLevel petLevel; + + int xpLine = -1; + for (int i = event.toolTip.size() - 1; i >= 0; i--) { + Matcher matcher = xpLevelPattern.matcher(event.toolTip.get(i)); + if (matcher.matches()) { + xpLine = i; + event.toolTip.set(xpLine, matcher.group(1)); + break; + } else if (event.toolTip.get(i).matches("MAX LEVEL")) { + return; + } + } - PetInfoOverlay.Pet pet = PetInfoOverlay.getPetFromStack( - event.itemStack.getTagCompound() - ); - if (pet == null) { - return; - } - petLevel = pet.petLevel; + PetInfoOverlay.Pet pet = PetInfoOverlay.getPetFromStack( + event.itemStack.getTagCompound() + ); + if (pet == null) { + return; + } + petLevel = pet.petLevel; - if (petLevel == null || xpLine == -1) { - return; - } + if (petLevel == null || xpLine == -1) { + return; + } - event.toolTip.add( - xpLine + 1, - EnumChatFormatting.GRAY + "EXP: " + EnumChatFormatting.YELLOW + myFormatter.format(petLevel.levelXp) + - EnumChatFormatting.GOLD + "/" + EnumChatFormatting.YELLOW + - myFormatter.format(petLevel.currentLevelRequirement) - ); + event.toolTip.add( + xpLine + 1, + EnumChatFormatting.GRAY + "EXP: " + EnumChatFormatting.YELLOW + myFormatter.format(petLevel.levelXp) + + EnumChatFormatting.GOLD + "/" + EnumChatFormatting.YELLOW + + myFormatter.format(petLevel.currentLevelRequirement) + ); - } - } } } 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 14a136a2..499448fa 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java @@ -133,10 +133,11 @@ public class PetInfoOverlay extends TextOverlay { public String petXpType; public String petItem; public String skin; + public int candyUsed; public String getPetId(boolean withoutBoost) { - return petType + ";" + (withoutBoost ? rarity.petId - 1 : rarity.petId); - + boolean shouldDecreaseRarity = withoutBoost && "PET_ITEM_TIER_BOOST".equals(petItem); + return petType + ";" + (shouldDecreaseRarity ? rarity.petId - 1 : rarity.petId); } } @@ -466,10 +467,10 @@ public class PetInfoOverlay extends TextOverlay { float remainingMax = currentPet.petLevel.maxXP - currentPet.petLevel.totalXp; if (remaining > 0) { if (xpGain < 1000) { - etaMaxStr = EnumChatFormatting.AQUA + "Until L" + currentPet.petLevel.maxLevel + ": " + + etaMaxStr = EnumChatFormatting.AQUA + "Until L" + (int) currentPet.petLevel.maxLevel + ": " + EnumChatFormatting.YELLOW + "N/A"; } else { - etaMaxStr = EnumChatFormatting.AQUA + "Until L" + currentPet.petLevel.maxLevel + ": " + + etaMaxStr = EnumChatFormatting.AQUA + "Until L" + (int) currentPet.petLevel.maxLevel + ": " + EnumChatFormatting.YELLOW + Utils.prettyTime((long) (remainingMax) * 1000 * 60 * 60 / (long) xpGain); } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/EquipmentOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/EquipmentOverlay.java index 2d3175b5..d64dbe01 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/EquipmentOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/EquipmentOverlay.java @@ -106,7 +106,7 @@ public class EquipmentOverlay { case 2: return ARMOR_DISPLAY_DARK; case 3: - return isPetRendering ? ARMOR_DISPLAY_TRANSPARENT_PET : ARMOR_DISPLAY_TRANSPARENT; + return NotEnoughUpdates.INSTANCE.config.petOverlay.colourStyle == 3 && isPetRendering ? ARMOR_DISPLAY_TRANSPARENT_PET : ARMOR_DISPLAY_TRANSPARENT; case 4: return ARMOR_DISPLAY_FSR; } @@ -191,7 +191,7 @@ public class EquipmentOverlay { int overlayLeft = container.getGuiLeft() - ARMOR_OVERLAY_OVERHAND_WIDTH; int overlayTop = container.getGuiTop(); - ResourceLocation equipmentTexture = getCustomEquipmentTexture(isRenderingPet); + ResourceLocation equipmentTexture = getCustomEquipmentTexture(shouldRenderPets); Minecraft.getMinecraft().getTextureManager().bindTexture(equipmentTexture); Utils.drawTexturedRect(overlayLeft, overlayTop, ARMOR_OVERLAY_WIDTH, ARMOR_OVERLAY_HEIGHT, GL11.GL_NEAREST); @@ -243,7 +243,10 @@ public class EquipmentOverlay { NEUManager manager = NotEnoughUpdates.INSTANCE.manager; PetInfoOverlay.Pet currentPet = PetInfoOverlay.getCurrentPet(); if (currentPet == null) return null; - ItemStack item = manager.createItem(currentPet.getPetId(false)); + + ItemStack item = ItemUtils.createPetItemstackFromPetInfo(currentPet); + item = ItemUtils.petToolTipXPExtendPetOverlay(item); + if (item != null) { return item; } @@ -259,7 +262,7 @@ public class EquipmentOverlay { slot4 = getWardrobeSlot(37); } - if (screen instanceof GuiChest) { + if (screen instanceof GuiChest || screen instanceof GuiInventory) { petStack = getRepoPetStack(); } if ((!(screen instanceof GuiInventory) && !(screen instanceof GuiInvButtonEditor)) diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PetsPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PetsPage.java index 25751ab8..cb85bf79 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PetsPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PetsPage.java @@ -22,22 +22,17 @@ package io.github.moulberry.notenoughupdates.profileviewer; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.core.util.StringUtils; +import io.github.moulberry.notenoughupdates.miscfeatures.PetInfoOverlay; import io.github.moulberry.notenoughupdates.util.Constants; +import io.github.moulberry.notenoughupdates.util.ItemUtils; import io.github.moulberry.notenoughupdates.util.SBInfo; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.init.Items; import net.minecraft.item.ItemStack; -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.EnumChatFormatting; import net.minecraft.util.ResourceLocation; import org.lwjgl.input.Mouse; @@ -46,11 +41,7 @@ import org.lwjgl.opengl.GL11; import java.awt.*; import java.io.IOException; import java.util.ArrayList; -import java.util.Base64; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.UUID; public class PetsPage extends GuiProfileViewerPage { @@ -91,7 +82,8 @@ public class PetsPage extends GuiProfileViewerPage { String panoramaIdentifier = "day"; if (SBInfo.getInstance().currentTimeDate != null) { - if (SBInfo.getInstance().currentTimeDate.getHours() <= 6 || SBInfo.getInstance().currentTimeDate.getHours() >= 20) { + if (SBInfo.getInstance().currentTimeDate.getHours() <= 6 || + SBInfo.getInstance().currentTimeDate.getHours() >= 20) { panoramaIdentifier = "night"; } } @@ -123,201 +115,22 @@ public class PetsPage extends GuiProfileViewerPage { } }); for (JsonObject pet : sortedPets) { - String petname = pet.get("type").getAsString(); - String tier = pet.get("tier").getAsString(); - String heldItem = Utils.getElementAsString(pet.get("heldItem"), null); - String skin = Utils.getElementAsString(pet.get("skin"), null); - int candy = pet.get("candyUsed").getAsInt(); - JsonObject heldItemJson = heldItem == null ? null : NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(heldItem); - String tierNum = GuiProfileViewer.MINION_RARITY_TO_NUM.get(tier); - float exp = pet.get("exp").getAsFloat(); - if (tierNum == null) continue; - - if ( - pet.has("heldItem") && - !pet.get("heldItem").isJsonNull() && - pet.get("heldItem").getAsString().equals("PET_ITEM_TIER_BOOST") - ) { - tierNum = "" + (Integer.parseInt(tierNum) + 1); - } - - GuiProfileViewer.PetLevel levelObj = GuiProfileViewer.getPetLevel(petname, tier, exp); - - float level = levelObj.level; - float currentLevelRequirement = levelObj.currentLevelRequirement; - float maxXP = levelObj.maxXP; - pet.addProperty("level", level); - pet.addProperty("currentLevelRequirement", currentLevelRequirement); - pet.addProperty("maxXP", maxXP); - - JsonObject petItem = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(petname + ";" + tierNum); - ItemStack stack; - if (petItem == null) { - stack = getQuestionmarkSkull(); - NBTTagCompound display = new NBTTagCompound(); - if (stack.getTagCompound() != null && stack.getTagCompound().hasKey("display")) { - display = stack.getTagCompound().getCompoundTag("display"); - } - NBTTagList lore = new NBTTagList(); - lore.appendTag(new NBTTagString(EnumChatFormatting.RED + "This pet is not saved in the repository")); - lore.appendTag(new NBTTagString("")); - lore.appendTag(new NBTTagString(EnumChatFormatting.RED + "If you expected it to be there please send a message in")); - lore.appendTag( - new NBTTagString( - EnumChatFormatting.RED.toString() + - EnumChatFormatting.BOLD + - "#neu-support " + - EnumChatFormatting.RESET + - EnumChatFormatting.RED + - "on " + - EnumChatFormatting.BOLD + - "discord.gg/moulberry" - ) - ); - - display.setTag("Lore", lore); - NBTTagCompound tag = stack.getTagCompound() != null ? stack.getTagCompound() : new NBTTagCompound(); - tag.setTag("display", display); - stack.setTagCompound(tag); - } else { - stack = NotEnoughUpdates.INSTANCE.manager.jsonToStack(petItem, false, false); - HashMap replacements = NotEnoughUpdates.INSTANCE.manager.getLoreReplacements( - petname, - tier, - (int) Math.floor(level) - ); - - if (heldItem != null) { - HashMap petStatBoots = GuiProfileViewer.PET_STAT_BOOSTS.get(heldItem); - HashMap petStatBootsMult = GuiProfileViewer.PET_STAT_BOOSTS_MULT.get(heldItem); - if (petStatBoots != null) { - for (Map.Entry entryBoost : petStatBoots.entrySet()) { - try { - float value = Float.parseFloat(replacements.get(entryBoost.getKey())); - replacements.put(entryBoost.getKey(), String.valueOf((int) Math.floor(value + entryBoost.getValue()))); - } catch (Exception ignored) {} - } - } - if (petStatBootsMult != null) { - for (Map.Entry entryBoost : petStatBootsMult.entrySet()) { - try { - float value = Float.parseFloat(replacements.get(entryBoost.getKey())); - replacements.put(entryBoost.getKey(), String.valueOf((int) Math.floor(value * entryBoost.getValue()))); - } catch (Exception ignored) {} - } - } - } - - NBTTagCompound tag = stack.getTagCompound() == null ? new NBTTagCompound() : stack.getTagCompound(); - if (tag.hasKey("display", 10)) { - NBTTagCompound display = tag.getCompoundTag("display"); - if (display.hasKey("Lore", 9)) { - NBTTagList newLore = new NBTTagList(); - NBTTagList lore = display.getTagList("Lore", 8); - HashMap blankLocations = new HashMap<>(); - for (int j = 0; j < lore.tagCount(); j++) { - String line = lore.getStringTagAt(j); - if (line.trim().isEmpty()) { - blankLocations.put(blankLocations.size(), j); - } - for (Map.Entry replacement : replacements.entrySet()) { - line = line.replace("{" + replacement.getKey() + "}", replacement.getValue()); - } - newLore.appendTag(new NBTTagString(line)); - } - Integer secondLastBlank = blankLocations.get(blankLocations.size() - 2); - if (skin != null) { - JsonObject petSkin = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get("PET_SKIN_" + skin); - if (petSkin != null) { - try { - NBTTagCompound nbt = JsonToNBT.getTagFromJson(petSkin.get("nbttag").getAsString()); - tag.setTag("SkullOwner", nbt.getTag("SkullOwner")); - String name = petSkin.get("displayname").getAsString(); - if (name != null) { - name = Utils.cleanColour(name); - newLore.set(0, new NBTTagString(newLore.get(0).toString().replace("\"", "") + ", " + name)); - } - } catch (NBTException e) { - e.printStackTrace(); - } - } - } - for (int i = 0; i < newLore.tagCount(); i++) { - String cleaned = Utils.cleanColour(newLore.get(i).toString()); - if (cleaned.equals("\"Right-click to add this pet to\"")) { - newLore.removeTag(i + 1); - newLore.removeTag(i); - secondLastBlank = i - 1; - break; - } - } - NBTTagList temp = new NBTTagList(); - for (int i = 0; i < newLore.tagCount(); i++) { - temp.appendTag(newLore.get(i)); - if (secondLastBlank != null && i == secondLastBlank) { - if (heldItem != null) { - temp.appendTag( - new NBTTagString( - EnumChatFormatting.GOLD + "Held Item: " + heldItemJson.get("displayname").getAsString() - ) - ); - int blanks = 0; - JsonArray heldItemLore = heldItemJson.get("lore").getAsJsonArray(); - for (int k = 0; k < heldItemLore.size(); k++) { - String heldItemLine = heldItemLore.get(k).getAsString(); - if (heldItemLine.trim().isEmpty()) { - blanks++; - } else if (blanks == 2) { - temp.appendTag(new NBTTagString(heldItemLine)); - } else if (blanks > 2) { - break; - } - } - temp.appendTag(new NBTTagString()); - } - if (candy != 0) { - temp.appendTag(new NBTTagString(EnumChatFormatting.GREEN + "(" + candy + "/10) Pet Candy Used")); - temp.appendTag(new NBTTagString()); - } - temp.removeTag(temp.tagCount() - 1); - } - } - newLore = temp; - display.setTag("Lore", newLore); - } - if (display.hasKey("Name", 8)) { - String displayName = display.getString("Name"); - for (Map.Entry replacement : replacements.entrySet()) { - displayName = displayName.replace("{" + replacement.getKey() + "}", replacement.getValue()); - } - display.setTag("Name", new NBTTagString(displayName)); - } - tag.setTag("display", display); - } - - // Adds the missing pet fields to the tag - NBTTagCompound extraAttributes = new NBTTagCompound(); - JsonObject petInfo = new JsonObject(); - if(tag.hasKey("ExtraAttributes", 10)) { - extraAttributes = tag.getCompoundTag("ExtraAttributes"); - if (extraAttributes.hasKey("petInfo", 8)) { - petInfo = new JsonParser().parse(extraAttributes.getString("petInfo")).getAsJsonObject(); - } - } - petInfo.addProperty("exp", exp); - petInfo.addProperty("tier", tier); - petInfo.addProperty("type", petname); - if (heldItem != null) { - petInfo.addProperty("heldItem", heldItem); - } - if (skin != null) { - petInfo.addProperty("skin", skin); - } - extraAttributes.setString("petInfo", petInfo.toString()); - tag.setTag("ExtraAttributes", extraAttributes); - stack.setTagCompound(tag); - } - sortedPetsStack.add(stack); + PetInfoOverlay.Pet parsedPet = new PetInfoOverlay.Pet(); + parsedPet.petType = pet.get("type").getAsString(); + parsedPet.rarity = PetInfoOverlay.Rarity.valueOf(pet.get("tier").getAsString()); + parsedPet.petLevel = GuiProfileViewer.getPetLevel( + parsedPet.petType, + parsedPet.rarity.name(), + pet.get("exp").getAsFloat() + ); + parsedPet.petXpType = "unknown"; + parsedPet.petItem = Utils.getElementAsString(pet.get("heldItem"), null); + parsedPet.skin = Utils.getElementAsString(pet.get("skin"), null); + parsedPet.candyUsed = pet.get("candyUsed").getAsInt(); + sortedPetsStack.add(ItemUtils.createPetItemstackFromPetInfo(parsedPet)); + pet.addProperty("level", parsedPet.petLevel.level); + pet.addProperty("currentLevelRequirement", parsedPet.petLevel.currentLevelRequirement); + pet.addProperty("maxXP", parsedPet.petLevel.maxXP); } } @@ -396,7 +209,11 @@ public class PetsPage extends GuiProfileViewerPage { ); } - for (int i = petsPage * 20; i < Math.min(petsPage * 20 + 20, Math.min(sortedPetsStack.size(), sortedPets.size())); i++) { + for ( + int i = petsPage * 20; + i < Math.min(petsPage * 20 + 20, Math.min(sortedPetsStack.size(), sortedPets.size())); + i++ + ) { JsonObject pet = sortedPets.get(i); ItemStack stack = sortedPetsStack.get(i); @@ -433,7 +250,7 @@ public class PetsPage extends GuiProfileViewerPage { if (selectedPet >= 0) { ItemStack petStack; if (sortedPetsStack.size() <= selectedPet) { - petStack = getQuestionmarkSkull(); + petStack = ItemUtils.createQuestionMarkSkull("§cInvalid pet selection"); } else { petStack = sortedPetsStack.get(selectedPet); } @@ -441,7 +258,8 @@ public class PetsPage extends GuiProfileViewerPage { JsonObject pet = sortedPets.get(selectedPet); int x = guiLeft + 280; - float y = guiTop + 67 + 15 * (float) Math.sin(((getInstance().currentTime - getInstance().startTime) / 800f) % (2 * Math.PI)); + float y = guiTop + 67 + 15 * (float) Math.sin( + ((getInstance().currentTime - getInstance().startTime) / 800f) % (2 * Math.PI)); int displayLen = Minecraft.getMinecraft().fontRendererObj.getStringWidth(display); int halfDisplayLen = displayLen / 2; @@ -568,32 +386,4 @@ public class PetsPage extends GuiProfileViewerPage { sortedPetsStack = null; selectedPet = -1; } - - private ItemStack getQuestionmarkSkull() { - String textureLink = "bc8ea1f51f253ff5142ca11ae45193a4ad8c3ab5e9c6eec8ba7a4fcb7bac40"; - - String b64Decoded = "{\"textures\":{\"SKIN\":{\"url\":\"http://textures.minecraft.net/texture/" + textureLink + "\"}}}"; - String b64Encoded = new String(Base64.getEncoder().encode(b64Decoded.getBytes())); - - ItemStack stack = new ItemStack(Items.skull, 1, 3); - NBTTagCompound nbt = new NBTTagCompound(); - NBTTagCompound skullOwner = new NBTTagCompound(); - NBTTagCompound properties = new NBTTagCompound(); - NBTTagList textures = new NBTTagList(); - NBTTagCompound textures_0 = new NBTTagCompound(); - - String uuid = UUID.nameUUIDFromBytes(b64Encoded.getBytes()).toString(); - skullOwner.setString("Id", uuid); - skullOwner.setString("Name", uuid); - - textures_0.setString("Value", b64Encoded); - textures.appendTag(textures_0); - - properties.setTag("textures", textures); - skullOwner.setTag("Properties", properties); - nbt.setTag("SkullOwner", skullOwner); - stack.setTagCompound(nbt); - stack.setStackDisplayName(EnumChatFormatting.RED + "Unknown Pet"); - return stack; - } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/ItemResolutionQuery.java b/src/main/java/io/github/moulberry/notenoughupdates/util/ItemResolutionQuery.java index 75086b1f..4d3b4645 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/ItemResolutionQuery.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/ItemResolutionQuery.java @@ -138,6 +138,13 @@ public class ItemResolutionQuery { return manager.jsonToStack(jsonObject); } + @Nullable + public ItemStack resolveToItemStack(boolean useReplacements) { + JsonObject jsonObject = resolveToItemListJson(); + if (jsonObject == null) return null; + return manager.jsonToStack(jsonObject, false, useReplacements); + } + // private boolean isBazaar(IInventory chest) { if (chest.getDisplayName().getFormattedText().startsWith("Bazaar ➜ ")) { 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 c7c7d4b6..a8f6e960 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java @@ -20,16 +20,31 @@ package io.github.moulberry.notenoughupdates.util; import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.listener.ItemTooltipListener; +import io.github.moulberry.notenoughupdates.miscfeatures.PetInfoOverlay; +import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; import net.minecraft.item.ItemStack; +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.EnumChatFormatting; +import net.minecraft.util.MathHelper; +import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Locale; +import java.util.Map; +import java.util.function.BiFunction; public class ItemUtils { @@ -58,6 +73,14 @@ public class ItemUtils { return skull; } + public static ItemStack createQuestionMarkSkull(String label) { + return Utils.createSkull( + label, + "00000000-0000-0000-0000-000000000000", + "bc8ea1f51f253ff5142ca11ae45193a4ad8c3ab5e9c6eec8ba7a4fcb7bac40" + ); + } + public static NBTTagCompound getOrCreateTag(ItemStack is) { if (is.hasTagCompound()) return is.getTagCompound(); NBTTagCompound nbtTagCompound = new NBTTagCompound(); @@ -120,8 +143,267 @@ public class ItemUtils { return enchId; } + /** + * Mutates baseValues + */ + public static void modifyReplacement( + Map baseValues, + Map modifiers, + BiFunction mapper + ) { + if (modifiers == null || baseValues == null) return; + for (Map.Entry modifier : modifiers.entrySet()) { + String baseValue = baseValues.get(modifier.getKey()); + if (baseValue == null) continue; + try { + baseValues.put(modifier.getKey(), mapper.apply(baseValue, modifier.getValue())); + } catch (Exception e) { + System.out.println("Exception during replacement mapping: "); + e.printStackTrace(); + } + } + } + + public static String applyReplacements(Map replacements, String text) { + for (Map.Entry replacement : replacements.entrySet()) { + String search = "{" + replacement.getKey() + "}"; + text = text.replace(search, replacement.getValue()); + } + return text; + } + + public static ItemStack createPetItemstackFromPetInfo(PetInfoOverlay.Pet currentPet) { + JsonObject pet = NotEnoughUpdates.INSTANCE.manager.getJsonForItem(NotEnoughUpdates.INSTANCE.manager.createItem( + currentPet.getPetId(false))); + String petname = currentPet.petType; + String tier = Utils.getRarityFromInt(currentPet.rarity.petId).toUpperCase(); + String heldItem = currentPet.petItem; + String skin = currentPet.skin; + JsonObject heldItemJson = heldItem == null ? null : NotEnoughUpdates.INSTANCE.manager.getItemInformation().get( + heldItem); + String petId = currentPet.getPetId(false); + float exp = currentPet.petLevel.totalXp; + + GuiProfileViewer.PetLevel levelObj = GuiProfileViewer.getPetLevel(petname, tier, exp); + + float level = levelObj.level; + float currentLevelRequirement = levelObj.currentLevelRequirement; + float maxXP = levelObj.maxXP; + pet.addProperty("level", level); + pet.addProperty("currentLevelRequirement", currentLevelRequirement); + pet.addProperty("maxXP", maxXP); + + ItemStack petItemstack = NotEnoughUpdates.INSTANCE.manager + .createItemResolutionQuery() + .withKnownInternalName(petId) + .resolveToItemStack(false); + if (petItemstack == null) { + petItemstack = ItemUtils.createQuestionMarkSkull(EnumChatFormatting.RED + "Unknown Pet"); + appendLore(petItemstack, Arrays.asList( + "§cThis pet is not saved in the repository", + "", + "§cIf you expected it to be there please send a message in", + "§c§l#neu-support §r§con §ldiscord.gg/moulberry" + )); + } + Map replacements = NotEnoughUpdates.INSTANCE.manager.getLoreReplacements( + petname, + tier, + MathHelper.floor_float(level) + ); + + if (heldItem != null) { + modifyReplacement(replacements, GuiProfileViewer.PET_STAT_BOOSTS.get(heldItem), (original, modifier) -> + "" + MathHelper.floor_float(Float.parseFloat(original) + modifier)); + modifyReplacement(replacements, GuiProfileViewer.PET_STAT_BOOSTS_MULT.get(heldItem), (original, modifier) -> + "" + MathHelper.floor_float(Float.parseFloat(original) * modifier)); + } + + NBTTagCompound tag = getOrCreateTag(petItemstack); + if (tag.hasKey("display", 10)) { + NBTTagCompound displayTag = tag.getCompoundTag("display"); + if (displayTag.hasKey("Lore", 9)) { + List newLore = new ArrayList<>(); + NBTTagList lore = displayTag.getTagList("Lore", 8); + int secondLastBlankLine = -1, lastBlankLine = -1; + for (int j = 0; j < lore.tagCount(); j++) { + String line = lore.getStringTagAt(j); + if (line.trim().isEmpty()) { + secondLastBlankLine = lastBlankLine; + lastBlankLine = j; + } + line = applyReplacements(replacements, line); + newLore.add(line); + } + if (skin != null) { + JsonObject petSkin = NotEnoughUpdates.INSTANCE.manager + .createItemResolutionQuery() + .withKnownInternalName("PET_SKIN_" + skin) + .resolveToItemListJson(); + if (petSkin != null) { + try { + NBTTagCompound nbt = JsonToNBT.getTagFromJson(petSkin.get("nbttag").getAsString()); + tag.setTag("SkullOwner", nbt.getTag("SkullOwner")); + String name = petSkin.get("displayname").getAsString(); + if (name != null) { + name = Utils.cleanColour(name); + newLore.set(0, newLore.get(0) + ", " + name); + } + } catch (NBTException e) { + e.printStackTrace(); + } + } + } + for (int i = 0; i < newLore.size(); i++) { + String cleaned = Utils.cleanColour(newLore.get(i)); + if (cleaned.equals("Right-click to add this pet to")) { + newLore.remove(i + 1); + newLore.remove(i); + secondLastBlankLine = i - 1; + break; + } + } + if (secondLastBlankLine != -1) { + List petItemLore = new ArrayList<>(); + if (heldItem != null) { + petItemLore.add(EnumChatFormatting.GOLD + "Held Item: " + heldItemJson.get("displayname").getAsString()); + List heldItemLore = JsonUtils.getJsonArrayOrEmpty(heldItemJson, "lore", JsonElement::getAsString); + int blanks = 0; + for (String heldItemLoreLine : heldItemLore) { + if (heldItemLoreLine.trim().isEmpty()) { + blanks++; + } else if (blanks == 2) { + petItemLore.add(heldItemLoreLine); + } else if (blanks > 2) { + break; + } + } + } + if (currentPet.candyUsed > 0) { + if (petItemLore.size() > 0) { + petItemLore.add(""); + } + petItemLore.add("§a(" + currentPet.candyUsed + "/10) Pet Candy Used"); + } + newLore.addAll(secondLastBlankLine + 1, petItemLore); + } + NBTTagList temp = new NBTTagList(); + for (String loreLine : newLore) { + temp.appendTag(new NBTTagString(loreLine)); + } + displayTag.setTag("Lore", temp); + } + + if (displayTag.hasKey("Name", 8)) { + String displayName = displayTag.getString("Name"); + displayName = applyReplacements(replacements, displayName); + displayTag.setTag("Name", new NBTTagString(displayName)); + } + tag.setTag("display", displayTag); + } + + // Adds the missing pet fields to the tag + NBTTagCompound extraAttributes = new NBTTagCompound(); + JsonObject petInfo = new JsonObject(); + if (tag.hasKey("ExtraAttributes", 10)) { + extraAttributes = tag.getCompoundTag("ExtraAttributes"); + if (extraAttributes.hasKey("petInfo", 8)) { + petInfo = new JsonParser().parse(extraAttributes.getString("petInfo")).getAsJsonObject(); + } + } + petInfo.addProperty("exp", exp); + petInfo.addProperty("tier", tier); + petInfo.addProperty("type", petname); + if (heldItem != null) { + petInfo.addProperty("heldItem", heldItem); + } + if (skin != null) { + petInfo.addProperty("skin", skin); + } + extraAttributes.setString("petInfo", petInfo.toString()); + tag.setTag("ExtraAttributes", extraAttributes); + petItemstack.setTagCompound(tag); + return petItemstack; + } + + private static final DecimalFormat decimalFormatter = new DecimalFormat("#,###,###.###"); + + public static ItemStack petToolTipXPExtendPetOverlay(ItemStack stack) { + NBTTagCompound tag = stack.getTagCompound() == null ? new NBTTagCompound() : stack.getTagCompound(); + if (tag.hasKey("display", 10)) { + NBTTagCompound display = tag.getCompoundTag("display"); + if (display.hasKey("Lore", 9)) { + NBTTagList lore = display.getTagList("Lore", 8); + if (Utils.cleanColour(lore.getStringTagAt(0)).matches(ItemTooltipListener.petToolTipRegex) && + lore.tagCount() > 7) { + + GuiProfileViewer.PetLevel petLevel; + + PetInfoOverlay.Pet pet = PetInfoOverlay.getPetFromStack( + stack.getTagCompound() + ); + if (pet == null) return stack; + petLevel = pet.petLevel; + if (petLevel == null) return stack; + + NBTTagList newLore = new NBTTagList(); + int maxLvl = 100; + if (Constants.PETS != null && Constants.PETS.has("custom_pet_leveling") && + Constants.PETS.getAsJsonObject("custom_pet_leveling").has(pet.petType.toUpperCase()) && + Constants.PETS.getAsJsonObject("custom_pet_leveling").getAsJsonObject(pet.petType.toUpperCase()).has( + "max_level")) { + maxLvl = + Constants.PETS + .getAsJsonObject("custom_pet_leveling") + .getAsJsonObject(pet.petType.toUpperCase()) + .get("max_level") + .getAsInt(); + } + for (int i = 0; i < lore.tagCount(); i++) { + if (i == lore.tagCount() - 2) { + newLore.appendTag(new NBTTagString("")); + if (petLevel.level >= maxLvl) { + newLore.appendTag(new NBTTagString( + EnumChatFormatting.AQUA + "" + EnumChatFormatting.BOLD + "MAX LEVEL")); + } else { + double levelPercent = (Math.round(petLevel.levelPercentage * 1000) / 10.0); + newLore.appendTag(new NBTTagString( + EnumChatFormatting.GRAY + "Progress to Level " + (int) (petLevel.level + 1) + ": " + + EnumChatFormatting.YELLOW + levelPercent + "%")); + StringBuilder sb = new StringBuilder(); + + for (int j = 0; j < 20; j++) { + if (j < (levelPercent / 5)) { + sb.append(EnumChatFormatting.DARK_GREEN); + } else { + sb.append(EnumChatFormatting.GRAY); + } + sb.append("-"); + } + newLore.appendTag(new NBTTagString(sb.toString())); + newLore.appendTag(new NBTTagString( + EnumChatFormatting.GRAY + "EXP: " + EnumChatFormatting.YELLOW + + decimalFormatter.format(petLevel.levelXp) + + EnumChatFormatting.GOLD + "/" + EnumChatFormatting.YELLOW + + decimalFormatter.format(petLevel.currentLevelRequirement) + )); + } + } + newLore.appendTag(lore.get(i)); + } + display.setTag("Lore", newLore); + tag.setTag("display", display); + } + } + } + stack.setTagCompound(tag); + return stack; + } + public static boolean isSoulbound(ItemStack item) { return ItemUtils.getLore(item).stream() - .anyMatch(line -> line.equals("§8§l* §8Co-op Soulbound §8§l*") || line.equals("§8§l* Soulbound §8§l*")); + .anyMatch(line -> line.equals("§8§l* §8Co-op Soulbound §8§l*") || + line.equals("§8§l* Soulbound §8§l*")); } + } -- cgit From 1e71e3e515fc17034e2e73a9b5e6012637204453 Mon Sep 17 00:00:00 2001 From: Roman / Linnea Gräf Date: Sat, 24 Sep 2022 13:17:00 +0200 Subject: Fix missing repo crash in PetInvOverlay (#305) * Fix missing repo crash in PetInvOverlay * Add 2.1.md to *not* *satisfy* erymanthus (*not* RayDeezNuts) --- Update Notes/2.1.md | 1 + .../java/io/github/moulberry/notenoughupdates/NEUManager.java | 8 ++++---- .../moulberry/notenoughupdates/overlays/EquipmentOverlay.java | 2 +- .../io/github/moulberry/notenoughupdates/util/ItemUtils.java | 9 +-------- 4 files changed, 7 insertions(+), 13 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 1c623928..89f56293 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -42,6 +42,7 @@ - Added carpentry skill to skill average - hannibal2 - Fixed sort order of fishing rods in profile viewer page - hannibal2 - Changing sort logic from strength plus damage to bin price for best weapons in pv inventory page - hannibal2 + - Added pronouns to /pv - nea89 ### **Minor Changes:** diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java index 62b24111..7a2389d4 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java @@ -1267,7 +1267,7 @@ public class NEUManager { } } - public HashMap getLoreReplacements(String petname, String tier, int level) { + public HashMap getPetLoreReplacements(String petname, String tier, int level) { JsonObject petnums = null; if (petname != null && tier != null) { petnums = Constants.PETNUMS; @@ -1392,7 +1392,7 @@ public class NEUManager { return replacements; } - public HashMap getLoreReplacements(NBTTagCompound tag, int level) { + public HashMap getPetLoreReplacements(NBTTagCompound tag, int level) { String petname = null; String tier = null; if (tag != null && tag.hasKey("ExtraAttributes")) { @@ -1426,7 +1426,7 @@ public class NEUManager { } } } - return getLoreReplacements(petname, tier, level); + return getPetLoreReplacements(petname, tier, level); } public NBTTagList processLore(JsonArray lore, HashMap replacements) { @@ -1497,7 +1497,7 @@ public class NEUManager { HashMap replacements = new HashMap<>(); if (useReplacements) { - replacements = getLoreReplacements(stack.getTagCompound(), -1); + replacements = getPetLoreReplacements(stack.getTagCompound(), -1); String displayName = json.get("displayname").getAsString(); for (Map.Entry entry : replacements.entrySet()) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/EquipmentOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/EquipmentOverlay.java index d64dbe01..e6e8cb3b 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/EquipmentOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/EquipmentOverlay.java @@ -262,7 +262,7 @@ public class EquipmentOverlay { slot4 = getWardrobeSlot(37); } - if (screen instanceof GuiChest || screen instanceof GuiInventory) { + if ((screen instanceof GuiChest || screen instanceof GuiInventory) && NotEnoughUpdates.INSTANCE.config.petOverlay.petInvDisplay){ petStack = getRepoPetStack(); } if ((!(screen instanceof GuiInventory) && !(screen instanceof GuiInvButtonEditor)) 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 a8f6e960..c6bc7538 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java @@ -173,8 +173,6 @@ public class ItemUtils { } public static ItemStack createPetItemstackFromPetInfo(PetInfoOverlay.Pet currentPet) { - JsonObject pet = NotEnoughUpdates.INSTANCE.manager.getJsonForItem(NotEnoughUpdates.INSTANCE.manager.createItem( - currentPet.getPetId(false))); String petname = currentPet.petType; String tier = Utils.getRarityFromInt(currentPet.rarity.petId).toUpperCase(); String heldItem = currentPet.petItem; @@ -187,11 +185,6 @@ public class ItemUtils { GuiProfileViewer.PetLevel levelObj = GuiProfileViewer.getPetLevel(petname, tier, exp); float level = levelObj.level; - float currentLevelRequirement = levelObj.currentLevelRequirement; - float maxXP = levelObj.maxXP; - pet.addProperty("level", level); - pet.addProperty("currentLevelRequirement", currentLevelRequirement); - pet.addProperty("maxXP", maxXP); ItemStack petItemstack = NotEnoughUpdates.INSTANCE.manager .createItemResolutionQuery() @@ -206,7 +199,7 @@ public class ItemUtils { "§c§l#neu-support §r§con §ldiscord.gg/moulberry" )); } - Map replacements = NotEnoughUpdates.INSTANCE.manager.getLoreReplacements( + Map replacements = NotEnoughUpdates.INSTANCE.manager.getPetLoreReplacements( petname, tier, MathHelper.floor_float(level) -- cgit From 4662a5a792e4dd790a45cd8da158e4464fb1e2dd Mon Sep 17 00:00:00 2001 From: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> Date: Mon, 10 Oct 2022 05:37:05 +1100 Subject: Last pr before 2.1 i hope (#347) * Changed version so update notifier works for everyone * Added some missed stuff to 2.1.md * Fixed typo * I just had to... fixed name * Blame efe and lulo if that isnt right Co-authored-by: jani270 --- Update Notes/2.1.md | 7 ++++++- .../io/github/moulberry/notenoughupdates/NotEnoughUpdates.java | 2 +- .../notenoughupdates/miscfeatures/updater/AutoUpdater.java | 10 ---------- .../options/seperateSections/CustomArmour.java | 2 +- 4 files changed, 8 insertions(+), 13 deletions(-) (limited to 'Update Notes/2.1.md') diff --git a/Update Notes/2.1.md b/Update Notes/2.1.md index 89f56293..359a56fe 100644 --- a/Update Notes/2.1.md +++ b/Update Notes/2.1.md @@ -113,7 +113,6 @@ - Added power stone feature - hannibal2 - Added abiphone warning - hannibal2 - Added blur limit at 100 - nopo -- Added bazaar sacks profit feature - hannibal2 - Added an option to disable etherwarp overlay when TP is denied - hannibal2 - Added bazaar search overlay - hannibal2 - Added fraction display instead of percentage in slayer and dungeon RNG meter inventory - hannibal2 @@ -121,6 +120,7 @@ - Added showing the amount of dungeon runs or slayer bosses needed for the rng meter to fill up - hannibal2 - Added bazaar prices to enchants in the enchantment table - hannibal2 / nea89 - Added an option to not open the item list when searching containers - Lulonaut +- Made config option in mod settings work - nea89 ### **Bug Fixes:** @@ -159,6 +159,11 @@ - Fixed middle clicking on pets not registering pet swap - nopo - Fixed middle clicking on an item with no id searching for it - nopo - Fixed pets with decimal stats not showing in pv - nopo +- Changed click packets to act like vanilla - nea89/nopo +- Fixed custom trade menu - nopo +- Removed "Last Seen" from /pv as hypixel removed it from the api - jani +- Fixed profile selector in /pv if you have gui scale 5 - nopo +- Fixed Minecraft not going to be able to access the Hypixel api after 18/10/22 - nea89 ### **Other:** diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index 09c910e9..3f535d68 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -123,7 +123,7 @@ import java.util.Set; public class NotEnoughUpdates { public static final String MODID = "notenoughupdates"; public static final String VERSION = "2.1.0-REL"; - public static final int VERSION_ID = 20100; + public static final int VERSION_ID = 20101; //2.1.1 only so update notif works public static final int PRE_VERSION_ID = 0; public static final int HOTFIX_VERSION_ID = 0; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/AutoUpdater.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/AutoUpdater.java index e7ada16f..389cfc75 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/AutoUpdater.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/updater/AutoUpdater.java @@ -95,16 +95,6 @@ public class AutoUpdater { } updateLoader = getUpdateLoader(url); if (updateLoader == null) { - logProgress(new ChatComponentText( - "Your system does not support auto updates. Please download this update manually. Click here to read more about auto update compatibility (or the link above for manual downloads)") - .setChatStyle( - new ChatStyle() - .setChatHoverEvent(new HoverEvent( - HoverEvent.Action.SHOW_TEXT, - new ChatComponentText("Click here to read about auto update modalities") - )) - .setChatClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/neuupdate updatemodes")) - )); return; } updateLoader.greet(); 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 d7f82a66..92b4b2ab 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 @@ -29,7 +29,7 @@ public class CustomArmour { @Expose @ConfigOption( name = "Enable Equipment Hud", - desc = "Shows an overlay in your inventory showing your 4 extra armour slots" + + desc = "Shows an overlay in your inventory showing your 4 extra armour slots\n" + "\u00A7cRequires Hide Potion Effects to be enabled" ) @ConfigEditorBoolean -- cgit