From 659a0e4981640802058d9eef35fec16fab82c5f2 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Thu, 28 Jan 2021 23:36:00 +0800 Subject: PRE12 --- .../notenoughupdates/NEUEventListener.java | 62 ++++++- .../moulberry/notenoughupdates/NEUManager.java | 37 ++-- .../moulberry/notenoughupdates/NEUOverlay.java | 142 ++++++++------- .../notenoughupdates/NotEnoughUpdates.java | 4 +- .../notenoughupdates/dungeons/DungeonMap.java | 44 +++-- .../notenoughupdates/gamemodes/SBGamemodes.java | 3 +- .../miscfeatures/CommissionOverlay.java | 167 ----------------- .../miscfeatures/CrystalOverlay.java | 36 ++++ .../miscfeatures/DamageCommas.java | 94 ++++++++++ .../miscfeatures/DwarvenMinesWaypoints.java | 8 +- .../notenoughupdates/miscfeatures/FairySouls.java | 2 + .../notenoughupdates/miscfeatures/MiningStuff.java | 6 +- .../notenoughupdates/mixins/MinecraftAccessor.java | 15 ++ .../mixins/MixinRendererLivingEntity.java | 26 +++ .../notenoughupdates/options/NEUConfig.java | 20 ++- .../overlays/CommissionOverlay.java | 167 +++++++++++++++++ .../notenoughupdates/overlays/FarmingOverlay.java | 199 +++++++++++++++++++++ .../notenoughupdates/overlays/FuelBar.java | 2 +- .../notenoughupdates/overlays/TextOverlay.java | 20 +++ .../profileviewer/GuiProfileViewer.java | 72 ++++++-- .../profileviewer/ProfileViewer.java | 57 ++++-- .../notenoughupdates/util/HypixelApi.java | 2 + .../notenoughupdates/util/ProfileApiSyncer.java | 75 ++++++++ .../moulberry/notenoughupdates/util/SBInfo.java | 8 +- .../notenoughupdates/util/XPInformation.java | 90 ++++++++++ src/main/resources/mixins.notenoughupdates.json | 4 +- 26 files changed, 1041 insertions(+), 321 deletions(-) delete mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CommissionOverlay.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/DamageCommas.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/mixins/MinecraftAccessor.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRendererLivingEntity.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/overlays/CommissionOverlay.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/overlays/FarmingOverlay.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/util/ProfileApiSyncer.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/util/XPInformation.java (limited to 'src/main') diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUEventListener.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUEventListener.java index 4682a744..9e31c19e 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUEventListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUEventListener.java @@ -3,20 +3,23 @@ package io.github.moulberry.notenoughupdates; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.minecraft.MinecraftProfileTexture; import io.github.moulberry.notenoughupdates.auction.CustomAHGui; +import io.github.moulberry.notenoughupdates.core.config.Position; import io.github.moulberry.notenoughupdates.cosmetics.CapeManager; import io.github.moulberry.notenoughupdates.dungeons.DungeonBlocks; import io.github.moulberry.notenoughupdates.dungeons.DungeonWin; import io.github.moulberry.notenoughupdates.gamemodes.SBGamemodes; import io.github.moulberry.notenoughupdates.miscfeatures.*; import io.github.moulberry.notenoughupdates.miscgui.*; +import io.github.moulberry.notenoughupdates.mixins.MinecraftAccessor; +import io.github.moulberry.notenoughupdates.overlays.CommissionOverlay; +import io.github.moulberry.notenoughupdates.overlays.FarmingOverlay; import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; import io.github.moulberry.notenoughupdates.overlays.TextOverlay; import io.github.moulberry.notenoughupdates.overlays.TextOverlayStyle; -import io.github.moulberry.notenoughupdates.util.Constants; -import io.github.moulberry.notenoughupdates.util.RequestFocusListener; -import io.github.moulberry.notenoughupdates.util.SBInfo; -import io.github.moulberry.notenoughupdates.util.Utils; +import io.github.moulberry.notenoughupdates.util.*; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.Gui; @@ -27,17 +30,21 @@ import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.gui.inventory.GuiEditSign; import net.minecraft.client.network.NetworkPlayerInfo; import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.texture.ITextureObject; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.event.ClickEvent; 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; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTUtil; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.*; import net.minecraftforge.event.entity.player.EntityInteractEvent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; @@ -46,6 +53,7 @@ import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.text.WordUtils; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; @@ -56,9 +64,12 @@ import java.awt.*; import java.awt.datatransfer.StringSelection; import java.io.File; import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; import java.text.NumberFormat; import java.util.List; import java.util.*; +import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -146,6 +157,7 @@ public class NEUEventListener { } return TextOverlayStyle.BACKGROUND; })); + textOverlays.add(new FarmingOverlay(new Position(20, 300), () -> TextOverlayStyle.BACKGROUND)); } /** @@ -153,14 +165,37 @@ public class NEUEventListener { * This is used in order to prevent the mod spamming messages. * 2)Adds unique items to the collection log */ + private boolean preloadedItems = false; private long lastLongUpdate = 0; private long lastSkyblockScoreboard = 0; + + private final ExecutorService itemPreloader = Executors.newFixedThreadPool(10); + private final List toPreload = new ArrayList<>(); + @SubscribeEvent public void onTick(TickEvent.ClientTickEvent event) { if(event.phase != TickEvent.Phase.START) return; if(Minecraft.getMinecraft().theWorld == null) return; if(Minecraft.getMinecraft().thePlayer == null) return; + if(neu.hasSkyblockScoreboard()) { + if(!preloadedItems) { + preloadedItems = true; + for(JsonObject json : neu.manager.getItemInformation().values()) { + itemPreloader.submit(() -> { + ItemStack stack = neu.manager.jsonToStack(json, true, true); + if(stack.getItem() == Items.skull) toPreload.add(stack); + }); + } + } else if(!toPreload.isEmpty()) { + System.out.println("Preload size:"+toPreload.size()); + Utils.drawItemStack(toPreload.get(0), -100, -100); + toPreload.remove(0); + } else { + itemPreloader.shutdown(); + } + } + boolean longUpdate = false; long currentTime = System.currentTimeMillis(); if(currentTime - lastLongUpdate > 1000) { @@ -176,6 +211,8 @@ public class NEUEventListener { DwarvenMinesTextures.tick(); FairySouls.tick(); MiningStuff.tick(); + ProfileApiSyncer.getInstance().tick(); + DamageCommas.tick(); for(TextOverlay overlay : textOverlays) { overlay.tick(); } @@ -285,6 +322,9 @@ public class NEUEventListener { neu.manager.auctionManager.markNeedsUpdate(); } } + + + /*if(longUpdate && neu.hasSkyblockScoreboard()) { if(neu.manager.getCurrentProfile() == null || neu.manager.getCurrentProfile().length() == 0) { ProfileViewer.Profile profile = NotEnoughUpdates.profileViewer.getProfile(Minecraft.getMinecraft().thePlayer.getUniqueID().toString().replace("-", ""), @@ -777,6 +817,8 @@ public class NEUEventListener { } private void renderDungeonChestOverlay(GuiScreen gui) { + if(neu.config.dungeonProfit.profitDisplayLoc == 3) return; + if(gui instanceof GuiChest && neu.config.dungeonProfit.profitDisplayLoc != 2) { try { int xSize = (int) Utils.getField(GuiContainer.class, gui, "xSize", "field_146999_f"); @@ -815,9 +857,10 @@ public class NEUEventListener { internal = internal.replace("\u00CD", "I").replace("\u0130", "I"); float bazaarPrice = -1; JsonObject bazaarInfo = neu.manager.auctionManager.getBazaarInfo(internal); - if(bazaarInfo != null && bazaarInfo.has("avg_sell")) { - bazaarPrice = bazaarInfo.get("avg_sell").getAsFloat(); + if(bazaarInfo != null && bazaarInfo.has("curr_sell")) { + bazaarPrice = bazaarInfo.get("curr_sell").getAsFloat(); } + if(bazaarPrice < 5000000 && internal.equals("RECOMBOBULATOR_3000")) bazaarPrice = 5000000; float worth = -1; if(bazaarPrice > 0) { @@ -918,8 +961,10 @@ public class NEUEventListener { if(neu.config.dungeonProfit.profitDisplayLoc == 1 && !valueStringBIN2.equals(missingItem)) { int w = Minecraft.getMinecraft().fontRendererObj.getStringWidth(plStringBIN); GlStateManager.disableLighting(); + GlStateManager.translate(0, 0, 200); Minecraft.getMinecraft().fontRendererObj.drawString(plStringBIN, guiLeft+xSize-5-w, guiTop+5, 0xffffffff, true); + GlStateManager.translate(0, 0, -200); return; } @@ -1440,9 +1485,10 @@ public class NEUEventListener { internal = internal.replace("\u00CD", "I").replace("\u0130", "I"); float bazaarPrice = -1; JsonObject bazaarInfo = neu.manager.auctionManager.getBazaarInfo(internal); - if(bazaarInfo != null && bazaarInfo.has("avg_sell")) { - bazaarPrice = bazaarInfo.get("avg_sell").getAsFloat(); + if(bazaarInfo != null && bazaarInfo.has("curr_sell")) { + bazaarPrice = bazaarInfo.get("curr_sell").getAsFloat(); } + if(bazaarPrice < 5000000 && internal.equals("RECOMBOBULATOR_3000")) bazaarPrice = 5000000; float worth = -1; if(bazaarPrice > 0) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java index 668ac1fe..0381a70a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java @@ -27,6 +27,7 @@ import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.ThreadPoolExecutor; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -172,8 +173,6 @@ public class NEUManager { }*/ - - Thread thread = new Thread(() -> { JDialog dialog = null; try { @@ -277,7 +276,6 @@ public class NEUManager { } }); - System.out.println("finished thread create"); File items = new File(repoLocation, "items"); if(items.exists()) { File[] itemFiles = new File(repoLocation, "items").listFiles(); @@ -652,6 +650,8 @@ public class NEUManager { if(ea.hasKey("id", 8)) { internalname = ea.getString("id").replaceAll(":", "-"); + } else { + return null; } if("PET".equals(internalname)) { @@ -1313,28 +1313,25 @@ public class NEUManager { } public ItemStack jsonToStack(JsonObject json, boolean useCache) { - return jsonToStack(json, useCache, true, false); + return jsonToStack(json, useCache, true); } - private static ExecutorService asyncItemES = Executors.newFixedThreadPool(10); - public ItemStack jsonToStack(JsonObject json, boolean useCache, boolean useReplacements, boolean multithread) { + public ItemStack jsonToStack(JsonObject json, boolean useCache, boolean useReplacements) { + return jsonToStack(json, useCache, useReplacements, true); + } + + public ItemStack jsonToStack(JsonObject json, boolean useCache, boolean useReplacements, boolean copyStack) { if(json == null) return new ItemStack(Items.painting, 1, 10); String internalname = json.get("internalname").getAsString(); if(useCache) { - if(itemstackCache.containsKey(internalname)) { - ItemStack stack = itemstackCache.get(internalname); - if(stack == null) { - if(multithread) { - return null; - } - } else { + ItemStack stack = itemstackCache.get(internalname); + if(stack != null) { + if(copyStack) { return stack.copy(); + } else { + return stack; } - } else if(multithread) { - asyncItemES.submit(() -> jsonToStack(json, true, useReplacements, false)); - itemstackCache.put(internalname, null); - return null; } } @@ -1385,7 +1382,11 @@ public class NEUManager { } if(useCache) itemstackCache.put(internalname, stack); - return stack; + if(copyStack) { + return stack.copy(); + } else { + return stack; + } } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java index 9012e67e..cd81da0b 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java @@ -54,6 +54,8 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List; import java.util.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; @@ -264,8 +266,7 @@ public class NEUOverlay extends Gui { @Override public void mouseClick(float x, float y, int mouseX, int mouseY) { if(Mouse.getEventButtonState()) { - Minecraft.getMinecraft().thePlayer.closeScreen(); - Minecraft.getMinecraft().displayGuiScreen(new GuiScreenElementWrapper(new NEUConfigEditor(NotEnoughUpdates.INSTANCE.config))); + NotEnoughUpdates.INSTANCE.openGui = new GuiScreenElementWrapper(new NEUConfigEditor(NotEnoughUpdates.INSTANCE.config)); } } @@ -415,7 +416,7 @@ public class NEUOverlay extends Gui { extraScale = 1.3f; } else if(manager.getItemInformation().containsKey(display)) { - render = manager.jsonToStack(manager.getItemInformation().get(display)); + render = manager.jsonToStack(manager.getItemInformation().get(display), true, true); } else { Item item = Item.itemRegistry.getObject(new ResourceLocation(display.toLowerCase())); if(item != null) { @@ -1148,6 +1149,8 @@ public class NEUOverlay extends Gui { private HashMap parentMap = new HashMap<>(); + private ExecutorService searchES = Executors.newSingleThreadExecutor(); + /** * Clears the current item list, creating a new TreeSet if necessary. * Adds all items that match the search AND match the sort mode to the current item list. @@ -1156,69 +1159,77 @@ public class NEUOverlay extends Gui { public void updateSearch() { SunTzu.randomizeQuote(); - if(searchedItems==null) searchedItems = new TreeSet<>(getItemComparator()); - searchedItems.clear(); - searchedItemsSubgroup.clear(); - searchedItemsArr = null; - redrawItems = true; - Set removeChildItems = new HashSet<>(); - Set itemsMatch = manager.search(textField.getText(), true); - for(String itemname : itemsMatch) { - JsonObject item = manager.getItemInformation().get(itemname); - if(checkMatchesSort(itemname, item)) { - if(Constants.PARENTS != null) { - if(Constants.PARENTS.has(itemname) && Constants.PARENTS.get(itemname).isJsonArray()) { - List children = new ArrayList<>(); - for(JsonElement e : Constants.PARENTS.get(itemname).getAsJsonArray()) { - if(e.isJsonPrimitive()) { - children.add(e.getAsString()); + if(searchedItems == null) searchedItems = new TreeSet<>(getItemComparator()); + + searchES.submit(() -> { + TreeSet searchedItems = new TreeSet<>(getItemComparator()); + HashMap> searchedItemsSubgroup = new HashMap<>(); + + Set removeChildItems = new HashSet<>(); + Set itemsMatch = manager.search(textField.getText(), true); + for(String itemname : itemsMatch) { + JsonObject item = manager.getItemInformation().get(itemname); + if(checkMatchesSort(itemname, item)) { + if(Constants.PARENTS != null) { + if(Constants.PARENTS.has(itemname) && Constants.PARENTS.get(itemname).isJsonArray()) { + List children = new ArrayList<>(); + for(JsonElement e : Constants.PARENTS.get(itemname).getAsJsonArray()) { + if(e.isJsonPrimitive()) { + children.add(e.getAsString()); + } } + children.retainAll(itemsMatch); + for(String child : children) { + removeChildItems.add(manager.getItemInformation().get(child)); + } + searchedItemsSubgroup.put(itemname, children); } - children.retainAll(itemsMatch); - for(String child : children) { - removeChildItems.add(manager.getItemInformation().get(child)); - } - searchedItemsSubgroup.put(itemname, children); } + searchedItems.add(item); } - searchedItems.add(item); } - } - searchedItems.removeAll(removeChildItems); - out: - for(Map.Entry> entry : searchedItemsSubgroup.entrySet()) { - if(searchedItems.contains(manager.getItemInformation().get(entry.getKey()))) { - continue; + searchedItems.removeAll(removeChildItems); + out: + for(Map.Entry> entry : searchedItemsSubgroup.entrySet()) { + if(searchedItems.contains(manager.getItemInformation().get(entry.getKey()))) { + continue; + } + for(String itemname : entry.getValue()) { + JsonObject item = manager.getItemInformation().get(itemname); + if(item != null) searchedItems.add(item); + } } - for(String itemname : entry.getValue()) { - JsonObject item = manager.getItemInformation().get(itemname); - if(item != null) searchedItems.add(item); + switch(textField.getText().toLowerCase().trim()) { + case "nullzee": + searchedItems.add(CustomItems.NULLZEE); + break; + case "rune": + searchedItems.add(CustomItems.RUNE); + break; + case "2b2t": + searchedItems.add(CustomItems.TWOBEETWOTEE); + break; + case "ducttape": + case "ducttapedigger": + searchedItems.add(CustomItems.DUCTTAPE); + break; + case "thirtyvirus": + searchedItems.add(manager.getItemInformation().get("SPIKED_BAIT")); + break; + case "leocthl": + searchedItems.add(CustomItems.LEOCTHL); + break; + case "spinaxx": + searchedItems.add(CustomItems.SPINAXX); + break; } - } - switch(textField.getText().toLowerCase().trim()) { - case "nullzee": - searchedItems.add(CustomItems.NULLZEE); - break; - case "rune": - searchedItems.add(CustomItems.RUNE); - break; - case "2b2t": - searchedItems.add(CustomItems.TWOBEETWOTEE); - break; - case "ducttape": - case "ducttapedigger": - searchedItems.add(CustomItems.DUCTTAPE); - break; - case "thirtyvirus": - searchedItems.add(manager.getItemInformation().get("SPIKED_BAIT")); - break; - case "leocthl": - searchedItems.add(CustomItems.LEOCTHL); - break; - case "spinaxx": - searchedItems.add(CustomItems.SPINAXX); - break; - } + + this.searchedItems = searchedItems; + this.searchedItemsSubgroup = searchedItemsSubgroup; + + searchedItemsArr = null; + redrawItems = true; + }); } /** @@ -1512,8 +1523,6 @@ public class NEUOverlay extends Gui { * is enabled) */ public void renderOverlay() { - GlStateManager.enableDepth(); - int width = Utils.peekGuiScale().getScaledWidth(); int height = Utils.peekGuiScale().getScaledHeight(); int mouseX = Mouse.getX() * width / Minecraft.getMinecraft().displayWidth; @@ -1610,6 +1619,8 @@ public class NEUOverlay extends Gui { if(disabled) { return; } + GlStateManager.enableDepth(); + FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; Utils.resetGuiScale(); @@ -2086,8 +2097,11 @@ public class NEUOverlay extends Gui { iterateItemSlots(new ItemSlotConsumer() { public void consume(int x, int y, int id) { JsonObject json = getSearchedItemPage(id); - ItemStack stack = manager.jsonToStack(json, true, true, true); - if (json == null || stack == null || !stack.hasEffect()) { + if(json == null) { + return; + } + ItemStack stack = manager.jsonToStack(json, true, true, false); + if (stack == null || !stack.hasEffect()) { return; } @@ -2241,7 +2255,7 @@ public class NEUOverlay extends Gui { renderEntity(x + ITEM_SIZE / 2, y + ITEM_SIZE, scale, name, entities); } else { if(!items) return; - ItemStack stack = manager.jsonToStack(json, true, true, true); + ItemStack stack = manager.jsonToStack(json, true, true, false); if(stack != null) { if(glint) { Utils.drawItemStack(stack, x, y); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index f2f41b17..b70dcc24 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -31,6 +31,7 @@ import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; import io.github.moulberry.notenoughupdates.util.SBInfo; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; +import io.github.moulberry.notenoughupdates.util.XPInformation; import net.minecraft.block.material.MapColor; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; @@ -909,6 +910,7 @@ public class NotEnoughUpdates { MinecraftForge.EVENT_BUS.register(new DwarvenMinesTextures()); MinecraftForge.EVENT_BUS.register(new DwarvenMinesWaypoints()); MinecraftForge.EVENT_BUS.register(new FuelBar()); + MinecraftForge.EVENT_BUS.register(XPInformation.getInstance()); ClientCommandHandler.instance.registerCommand(collectionLogCommand); ClientCommandHandler.instance.registerCommand(cosmeticsCommand); @@ -920,7 +922,7 @@ public class NotEnoughUpdates { ClientCommandHandler.instance.registerCommand(joinDungeonCommand); ClientCommandHandler.instance.registerCommand(viewProfileCommand); ClientCommandHandler.instance.registerCommand(viewProfileShortCommand); - ClientCommandHandler.instance.registerCommand(viewCataCommand); + if(!Loader.isModLoaded("skyblockextras")) ClientCommandHandler.instance.registerCommand(viewCataCommand); ClientCommandHandler.instance.registerCommand(peekCommand); ClientCommandHandler.instance.registerCommand(tutorialCommand); ClientCommandHandler.instance.registerCommand(overlayPlacementsCommand); 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 993eb78b..fa51cdca 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonMap.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonMap.java @@ -23,7 +23,10 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.ItemMap; import net.minecraft.item.ItemStack; +import net.minecraft.scoreboard.Score; +import net.minecraft.scoreboard.ScoreObjective; import net.minecraft.scoreboard.ScorePlayerTeam; +import net.minecraft.scoreboard.Scoreboard; import net.minecraft.util.*; import net.minecraft.world.storage.MapData; import net.minecraftforge.client.event.RenderGameOverlayEvent; @@ -83,6 +86,7 @@ public class DungeonMap { private Map playerEntityMapPositions = new HashMap<>(); private Map playerMarkerMapPositions = new HashMap<>(); + private Set rawPlayerMarkerMapPositions = new HashSet<>(); private Map playerMarkerMapPositionsLast = new HashMap<>(); private Map playerSkinMap = new HashMap<>(); @@ -586,7 +590,7 @@ public class DungeonMap { float angle = pos.rotation; boolean doInterp = NotEnoughUpdates.INSTANCE.config.dungeonMap.dmPlayerInterp; - if(playerEntityMapPositions.containsKey(name)) { + if(!isFloorOne && playerEntityMapPositions.containsKey(name)) { MapPosition entityPos = playerEntityMapPositions.get(name); angle = entityPos.rotation; @@ -994,6 +998,7 @@ public class DungeonMap { } } + private boolean isFloorOne = false; private boolean failMap = false; private long lastClearCache = 0; public void renderMap(int centerX, int centerY, Color[][] colourMap, Map mapDecorations, @@ -1014,6 +1019,25 @@ public class DungeonMap { failMap = false; lastClearCache = System.currentTimeMillis(); + + isFloorOne = false; + Scoreboard scoreboard = Minecraft.getMinecraft().thePlayer.getWorldScoreboard(); + + ScoreObjective sidebarObjective = scoreboard.getObjectiveInDisplaySlot(1); + + List scores = new ArrayList<>(scoreboard.getSortedScores(sidebarObjective)); + + for(int i=scores.size()-1; i>=0; i--) { + Score score = scores.get(i); + ScorePlayerTeam scoreplayerteam1 = scoreboard.getPlayersTeam(score.getPlayerName()); + String line = ScorePlayerTeam.formatPlayerName(scoreplayerteam1, score.getPlayerName()); + line = Utils.cleanDuplicateColourCodes(line); + + if(line.contains("(F1)")) { + isFloorOne = true; + break; + } + } } if(failMap) { @@ -1192,8 +1216,6 @@ public class DungeonMap { continue; } - if(decorations++ >= 6) break; - float deltaX = x - startRoomX; float deltaY = y - startRoomY; @@ -1229,10 +1251,13 @@ public class DungeonMap { MapPosition pos = new MapPosition(roomsOffsetX, connOffsetX, roomsOffsetY, connOffsetY); pos.rotation = angle % 360; if(pos.rotation < 0) pos.rotation += 360; - positions.add(pos); + + if(decorations++ <= 6) { + positions.add(pos); + } + rawPlayerMarkerMapPositions.add(pos); } - //System.out.println(playerMarkerMapPositions.size() + ":" + positions.size()); boolean different = playerMarkerMapPositions.size() != positions.size(); if (!different) { @@ -1275,9 +1300,6 @@ public class DungeonMap { List playerList = new ArrayList<>(playerMarkerMapPositionsLast.keySet()); List> playerPermutations = permutations(playerList); - //if(playerPermutations.size() > 0 || playerMarkerMapPositionsLast.size() > 0) - // System.out.println("Perm Size: " + playerPermutations.size() + " from " + playerMarkerMapPositionsLast.size()); - List finalUsedIndexes = new ArrayList<>(); if (playerPermutations.size() > 0) { HashMap smallestPermutation = null; @@ -1455,13 +1477,15 @@ public class DungeonMap { for(ScorePlayerTeam team : Minecraft.getMinecraft().thePlayer.getWorldScoreboard().getTeams()) { if(team.getTeamName().startsWith("a") && team.getMembershipCollection().size() == 1) { String playerName = Iterables.get(team.getMembershipCollection(), 0); + boolean foundPlayer = false; for(EntityPlayer player : Minecraft.getMinecraft().theWorld.playerEntities) { - if(player.getName().equals(playerName) && (player == Minecraft.getMinecraft().thePlayer || - (!player.isPlayerSleeping() && !player.isInvisible()))) { + if(player.getName().equals(playerName) && (player == Minecraft.getMinecraft().thePlayer || !player.isPlayerSleeping())) { actualPlayers.add(playerName); + foundPlayer = true; break; } } + if(!foundPlayer) actualPlayers.add(playerName); if(++players >= 6) break; } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/gamemodes/SBGamemodes.java b/src/main/java/io/github/moulberry/notenoughupdates/gamemodes/SBGamemodes.java index 0c645255..827f9498 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/gamemodes/SBGamemodes.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/gamemodes/SBGamemodes.java @@ -247,8 +247,7 @@ public class SBGamemodes { boolean inDungeons = SBInfo.getInstance().getLocation() != null && SBInfo.getInstance().getLocation().equals("dungeon"); - if("Your Island".equals(SBInfo.getInstance().location) && - (EnumChatFormatting.YELLOW+"Break a log").equals(SBInfo.getInstance().objective)) { + if((EnumChatFormatting.YELLOW+"Break a log").equals(SBInfo.getInstance().objective)) { getGamemode().locked = false; } else { getGamemode().locked = true; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CommissionOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CommissionOverlay.java deleted file mode 100644 index decfbf3f..00000000 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CommissionOverlay.java +++ /dev/null @@ -1,167 +0,0 @@ -package io.github.moulberry.notenoughupdates.miscfeatures; - -import com.google.common.collect.ComparisonChain; -import com.google.common.collect.Ordering; -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.overlays.TextOverlay; -import io.github.moulberry.notenoughupdates.overlays.TextOverlayStyle; -import io.github.moulberry.notenoughupdates.util.SBInfo; -import net.minecraft.client.Minecraft; -import net.minecraft.client.network.NetworkPlayerInfo; -import net.minecraft.scoreboard.ScorePlayerTeam; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.WorldSettings; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import java.util.*; -import java.util.function.Supplier; - -import static net.minecraft.util.EnumChatFormatting.*; - -public class CommissionOverlay extends TextOverlay { - - public CommissionOverlay(Position position, Supplier styleSupplier) { - super(position, styleSupplier); - } - - public static Map commissionProgress = new LinkedHashMap<>(); - - @Override - public void update() { - overlayStrings = null; - - if(SBInfo.getInstance().getLocation() == null) return; - if(!SBInfo.getInstance().getLocation().equals("mining_3")) return; - - overlayStrings = new ArrayList<>(); - commissionProgress.clear(); - List forgeStrings = new ArrayList<>(); - String mithrilPowder = null; - - boolean commissions = false; - boolean forges = false; - List players = playerOrdering.sortedCopy(Minecraft.getMinecraft().thePlayer.sendQueue.getPlayerInfoMap()); - for(NetworkPlayerInfo info : players) { - String name = Minecraft.getMinecraft().ingameGUI.getTabList().getPlayerName(info); - if(name.contains("Mithril Powder:")) { - mithrilPowder = trimIgnoreColour(name); - } - if(name.equals(RESET.toString()+BLUE+BOLD+"Forges"+RESET)) { - commissions = false; - forges = true; - continue; - } else if(name.equals(RESET.toString()+BLUE+BOLD+"Commissions"+RESET)) { - commissions = true; - forges = false; - continue; - } - String clean = StringUtils.cleanColour(name); - if(forges && clean.startsWith(" ")) { - if(name.contains("LOCKED")) continue; - if(NotEnoughUpdates.INSTANCE.config.mining.hideEmptyForges && name.contains("EMPTY")) continue; - forgeStrings.add(DARK_AQUA+"Forge "+trimIgnoreColour(name)); - } else if(commissions && clean.startsWith(" ")) { - String[] split = clean.trim().split(": "); - if(split.length == 2) { - if(split[1].endsWith("%")) { - try { - float progress = Float.parseFloat(split[1].replace("%", ""))/100; - progress = LerpUtils.clampZeroOne(progress); - commissionProgress.put(split[0], progress); - } catch(Exception ignored) {} - } else { - commissionProgress.put(split[0], 1.0f); - } - } - } else { - commissions = false; - forges = false; - } - } - - List commissionsStrings = new ArrayList<>(); - for(Map.Entry entry : commissionProgress.entrySet()) { - if(entry.getValue() >= 1) { - commissionsStrings.add(DARK_AQUA+entry.getKey() + ": " + GREEN + "DONE"); - } else { - EnumChatFormatting col = RED; - if(entry.getValue() >= 0.75) { - col = GREEN; - } else if(entry.getValue() >= 0.5) { - col = YELLOW; - } else if(entry.getValue() >= 0.25) { - col = GOLD; - } - - String valS = String.valueOf(entry.getValue()*100); - int periodIndex = valS.indexOf('.');//1.3 - if(periodIndex > 0) { - valS = valS.substring(0, Math.min(valS.length(), periodIndex+2)); - } - if(valS.endsWith("0")) { - valS = valS.substring(0, Math.max(0, valS.length()-2)); - } - - commissionsStrings.add(DARK_AQUA+entry.getKey() + ": " + col+valS+"%"); - } - } - boolean hasAny = false; - if(NotEnoughUpdates.INSTANCE.config.mining.commissionsOverlay) { - overlayStrings.addAll(commissionsStrings); - hasAny = true; - } - if(NotEnoughUpdates.INSTANCE.config.mining.powderOverlay) { - if(mithrilPowder != null) { - if(hasAny) overlayStrings.add(null); - overlayStrings.add(DARK_AQUA+mithrilPowder); - hasAny = true; - } - } - if(NotEnoughUpdates.INSTANCE.config.mining.forgeOverlay) { - if(hasAny) overlayStrings.add(null); - overlayStrings.addAll(forgeStrings); - } - } - - private String trimIgnoreColour(String str) { - str = str.trim(); - boolean colourCodeLast = false; - for(int i=0; i playerOrdering = Ordering.from(new PlayerComparator()); - - @SideOnly(Side.CLIENT) - static class PlayerComparator implements Comparator { - private PlayerComparator() { } - - public int compare(NetworkPlayerInfo o1, NetworkPlayerInfo o2) { - ScorePlayerTeam team1 = o1.getPlayerTeam(); - ScorePlayerTeam team2 = o2.getPlayerTeam(); - return ComparisonChain.start().compareTrueFirst( - o1.getGameType() != WorldSettings.GameType.SPECTATOR, - o2.getGameType() != WorldSettings.GameType.SPECTATOR) - .compare(team1 != null ? team1.getRegisteredName() : "", team2 != null ? team2.getRegisteredName() : "") - .compare(o1.getGameProfile().getName(), o2.getGameProfile().getName()).result(); - } - } - - -} 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 2c1d1fab..9e97cfc0 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalOverlay.java @@ -108,6 +108,10 @@ public class CrystalOverlay { int radius; } + private static double posLastUpdateX; + private static double posLastUpdateY; + private static double posLastUpdateZ; + private static HashMap skullId = new HashMap<>(); static { skullId.put("d9c3168a-8654-3dd8-b297-4d3b7e55b95a", CrystalType.FARMING_MINION); @@ -118,6 +122,8 @@ public class CrystalOverlay { public static long displayMillis = 0; + public static long lastMiningUpdate = 0; + public static HashMap crystals = new HashMap<>(); private static ExecutorService es = Executors.newSingleThreadExecutor(); @@ -131,6 +137,7 @@ public class CrystalOverlay { long currentTime = System.currentTimeMillis(); if(currentTime - displayMillis > 10*1000) { + crystals.clear(); displayMillis = -1; } @@ -191,11 +198,35 @@ public class CrystalOverlay { @SubscribeEvent public void onTick(TickEvent.ClientTickEvent event) { + if(displayMillis < 0) { + return; + } + EntityPlayerSP p = Minecraft.getMinecraft().thePlayer; if(p == null) return; if(event.phase == TickEvent.Phase.START) { + double dX = p.posX - posLastUpdateX; + double dY = p.posY - posLastUpdateY; + double dZ = p.posZ - posLastUpdateZ; + + if(dX*dX + dY*dY + dZ*dZ < 1) { + return; + } + + posLastUpdateX = p.posX; + posLastUpdateY = p.posY; + posLastUpdateZ = p.posZ; + for(CrystalType type : crystals.keySet()) { + if(type == CrystalType.MINING_MINION) { + long currentTime = System.currentTimeMillis(); + if(currentTime - lastMiningUpdate < 1000) { + continue; + } + lastMiningUpdate = currentTime; + } + ReverseWorldRenderer worldRenderer = type.getOverlayVBO(); if(worldRenderer != null) { BlockPos crystal = crystals.get(type); @@ -205,6 +236,11 @@ public class CrystalOverlay { (float)p.posX-crystal.getX(), (float)p.posY-crystal.getY(), (float)p.posZ-crystal.getZ()); + /*es.submit(() -> worldRenderer.sortVertexData( + (float)p.posX-crystal.getX(), + (float)p.posY-crystal.getY(), + (float)p.posZ-crystal.getZ()));*/ + } } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/DamageCommas.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/DamageCommas.java new file mode 100644 index 00000000..c011ac9b --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/DamageCommas.java @@ -0,0 +1,94 @@ +package io.github.moulberry.notenoughupdates.miscfeatures; + +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import net.minecraft.entity.item.EntityArmorStand; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +import java.text.NumberFormat; +import java.util.HashMap; + +public class DamageCommas { + + private static final HashMap replacementMap = new HashMap<>(); + + public static void tick() { + replacementMap.clear(); + } + + public static IChatComponent replaceName(IChatComponent name) { + if(!NotEnoughUpdates.INSTANCE.config.misc.damageCommas) return name; + + String formatted = name.getFormattedText(); + int hashCode = formatted.hashCode(); + + if(replacementMap.containsKey(hashCode)) { + ChatComponentText component = replacementMap.get(hashCode); + if(component == null) return name; + return component; + } + + if(formatted.length() >= 7 && formatted.startsWith("\u00A7f\u2727") && + formatted.endsWith("\u2727\u00a7r")) { + StringBuilder builder = new StringBuilder(); + boolean numLast = false; + boolean colLast = false; + int numCount = 0; + for(int i=formatted.length()-4; i>=3; i--) { + char c = formatted.charAt(i); + if(c == '\u00a7') { + if(numLast) numCount--; + numLast = false; + colLast = true; + } else if(c >= '0' && c <= '9') { + numLast = true; + colLast = false; + numCount++; + } else { + if(colLast) { + replacementMap.put(hashCode, null); + return name; + } + numLast = false; + } + + builder.append(c); + if(numLast && numCount % 3 == 0) builder.append(','); + } + + ChatComponentText ret = new ChatComponentText("\u00A7f\u2727"+builder.reverse().toString()+"\u2727\u00a7r"); + replacementMap.put(hashCode, ret); + return ret; + } + + if(formatted.length() >= 5 && formatted.startsWith(EnumChatFormatting.GRAY.toString()) && + formatted.endsWith(EnumChatFormatting.RESET.toString())) { + String damageS = formatted.substring(2, formatted.length()-2); + + for(int i=0; i '9') { + replacementMap.put(hashCode, null); + return name; + } + } + + try { + int damage = Integer.parseInt(damageS); + + String damageFormatted = NumberFormat.getIntegerInstance().format(damage); + + ChatComponentText ret = new ChatComponentText(EnumChatFormatting.GRAY+damageFormatted+EnumChatFormatting.RESET); + replacementMap.put(hashCode, ret); + return ret; + } catch(Exception e) { + replacementMap.put(hashCode, null); + return name; + } + } + replacementMap.put(hashCode, null); + return name; + } + +} 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 58cf4d20..1502cf4a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/DwarvenMinesWaypoints.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/DwarvenMinesWaypoints.java @@ -1,7 +1,7 @@ package io.github.moulberry.notenoughupdates.miscfeatures; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import io.github.moulberry.notenoughupdates.options.NEUConfig; +import io.github.moulberry.notenoughupdates.overlays.CommissionOverlay; import io.github.moulberry.notenoughupdates.util.SBInfo; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; @@ -194,7 +194,11 @@ public class DwarvenMinesWaypoints { } else { for(String commissionName : CommissionOverlay.commissionProgress.keySet()) { if(commissionName.toLowerCase().contains(entry.getKey().toLowerCase())) { - renderWayPoint(EnumChatFormatting.AQUA+entry.getKey(), entry.getValue(), event.partialTicks); + if(commissionName.contains("Titanium")) { + renderWayPoint(EnumChatFormatting.WHITE+entry.getKey(), entry.getValue(), event.partialTicks); + } else { + renderWayPoint(EnumChatFormatting.AQUA+entry.getKey(), entry.getValue(), event.partialTicks); + } } } } 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 b5a98704..5fe5938b 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FairySouls.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FairySouls.java @@ -73,6 +73,8 @@ public class FairySouls { @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(); 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 3e4649be..8b130d24 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/MiningStuff.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/MiningStuff.java @@ -2,7 +2,7 @@ package io.github.moulberry.notenoughupdates.miscfeatures; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.core.util.render.TextRenderUtils; -import io.github.moulberry.notenoughupdates.options.NEUConfig; +import io.github.moulberry.notenoughupdates.overlays.CommissionOverlay; import io.github.moulberry.notenoughupdates.util.SBInfo; import io.github.moulberry.notenoughupdates.util.SpecialColour; import io.github.moulberry.notenoughupdates.util.Utils; @@ -19,13 +19,9 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraftforge.client.event.ClientChatReceivedEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.client.event.RenderLivingEvent; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; -import org.lwjgl.util.vector.Vector3f; -import org.lwjgl.util.vector.Vector4f; public class MiningStuff { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MinecraftAccessor.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MinecraftAccessor.java new file mode 100644 index 00000000..b40d418b --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MinecraftAccessor.java @@ -0,0 +1,15 @@ +package io.github.moulberry.notenoughupdates.mixins; + +import net.minecraft.client.Minecraft; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.io.File; + +@Mixin(Minecraft.class) +public interface MinecraftAccessor { + + @Accessor + public File getFileAssets(); + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRendererLivingEntity.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRendererLivingEntity.java new file mode 100644 index 00000000..39e42152 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRendererLivingEntity.java @@ -0,0 +1,26 @@ +package io.github.moulberry.notenoughupdates.mixins; + +import io.github.moulberry.notenoughupdates.miscfeatures.DamageCommas; +import net.minecraft.client.renderer.entity.RendererLivingEntity; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityArmorStand; +import net.minecraft.util.IChatComponent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(RendererLivingEntity.class) +public class MixinRendererLivingEntity { + + @Redirect(method = "renderName", at=@At(value = "INVOKE", target = + "Lnet/minecraft/entity/EntityLivingBase;getDisplayName()Lnet/minecraft/util/IChatComponent;")) + public IChatComponent renderName_getDisplayName(EntityLivingBase entity) { + if(entity instanceof EntityArmorStand) { + return DamageCommas.replaceName(entity.getDisplayName()); + } else { + return entity.getDisplayName(); + } + } + +} 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 44d2faa1..ca0ebb2e 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java @@ -10,7 +10,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.*; import io.github.moulberry.notenoughupdates.core.config.gui.GuiPositionEditor; -import io.github.moulberry.notenoughupdates.miscfeatures.CommissionOverlay; +import io.github.moulberry.notenoughupdates.overlays.CommissionOverlay; import io.github.moulberry.notenoughupdates.overlays.TextOverlayStyle; import net.minecraft.client.Minecraft; import net.minecraftforge.client.ClientCommandHandler; @@ -256,7 +256,7 @@ public class NEUConfig extends Config { @Expose @ConfigOption( name = "Hide Potion Effects", - desc = "Hides the potion effects inside your inventory while on skyblock" + desc = "Hide the potion effects inside your inventory while on skyblock" ) @ConfigEditorBoolean public boolean hidePotionEffect = true; @@ -264,7 +264,7 @@ public class NEUConfig extends Config { @Expose @ConfigOption( name = "Streamer Mode", - desc = "Randomizes lobby names in the scoreboard and chat messages to help prevent stream sniping" + desc = "Randomize lobby names in the scoreboard and chat messages to help prevent stream sniping" ) @ConfigEditorBoolean public boolean streamerMode = false; @@ -272,10 +272,18 @@ public class NEUConfig extends Config { @Expose @ConfigOption( name = "Gui Click Sounds", - desc = "Plays click sounds in various NEU-related GUIs when pressing buttons" + desc = "Play click sounds in various NEU-related GUIs when pressing buttons" ) @ConfigEditorBoolean public boolean guiButtonClicks = true; + + @Expose + @ConfigOption( + name = "Commas in Damage Numbers", + desc = "Add a comma to damage number indicators to make it more readable" + ) + @ConfigEditorBoolean + public boolean damageCommas = true; } public static class Notifications { @@ -636,7 +644,7 @@ public class NEUConfig extends Config { "Lore = Inside the \"Open Reward Chest\" item" ) @ConfigEditorDropdown( - values = {"Overlay", "GUI Title", "Lore"} + values = {"Overlay", "GUI Title", "Lore", "Off"} ) public int profitDisplayLoc = 0; } @@ -1287,7 +1295,7 @@ public class NEUConfig extends Config { arr.add("/enderchest:Ender Chest:ENDER_CHEST"); arr.add("/wardrobe:Wardrobe:LEATHER_CHESTPLATE"); arr.add("/pets:Pets:BONE"); - arr.add("/ah:Auction House:GOLD_BLOCK"); + arr.add("/neuah:NEU Auction House:GOLD_BLOCK"); arr.add("/bz:Bazaar:GOLD_BARDING"); return arr; } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/CommissionOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/CommissionOverlay.java new file mode 100644 index 00000000..1920c49a --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/CommissionOverlay.java @@ -0,0 +1,167 @@ +package io.github.moulberry.notenoughupdates.overlays; + +import com.google.common.collect.ComparisonChain; +import com.google.common.collect.Ordering; +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.overlays.TextOverlay; +import io.github.moulberry.notenoughupdates.overlays.TextOverlayStyle; +import io.github.moulberry.notenoughupdates.util.SBInfo; +import net.minecraft.client.Minecraft; +import net.minecraft.client.network.NetworkPlayerInfo; +import net.minecraft.scoreboard.ScorePlayerTeam; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.WorldSettings; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import java.util.*; +import java.util.function.Supplier; + +import static net.minecraft.util.EnumChatFormatting.*; + +public class CommissionOverlay extends TextOverlay { + + public CommissionOverlay(Position position, Supplier styleSupplier) { + super(position, styleSupplier); + } + + public static Map commissionProgress = new LinkedHashMap<>(); + + @Override + public void update() { + overlayStrings = null; + + if(SBInfo.getInstance().getLocation() == null) return; + if(!SBInfo.getInstance().getLocation().equals("mining_3")) return; + + overlayStrings = new ArrayList<>(); + commissionProgress.clear(); + List forgeStrings = new ArrayList<>(); + String mithrilPowder = null; + + boolean commissions = false; + boolean forges = false; + List players = playerOrdering.sortedCopy(Minecraft.getMinecraft().thePlayer.sendQueue.getPlayerInfoMap()); + for(NetworkPlayerInfo info : players) { + String name = Minecraft.getMinecraft().ingameGUI.getTabList().getPlayerName(info); + if(name.contains("Mithril Powder:")) { + mithrilPowder = trimIgnoreColour(name); + } + if(name.equals(RESET.toString()+BLUE+BOLD+"Forges"+RESET)) { + commissions = false; + forges = true; + continue; + } else if(name.equals(RESET.toString()+BLUE+BOLD+"Commissions"+RESET)) { + commissions = true; + forges = false; + continue; + } + String clean = StringUtils.cleanColour(name); + if(forges && clean.startsWith(" ")) { + if(name.contains("LOCKED")) continue; + if(NotEnoughUpdates.INSTANCE.config.mining.hideEmptyForges && name.contains("EMPTY")) continue; + forgeStrings.add(DARK_AQUA+"Forge "+trimIgnoreColour(name)); + } else if(commissions && clean.startsWith(" ")) { + String[] split = clean.trim().split(": "); + if(split.length == 2) { + if(split[1].endsWith("%")) { + try { + float progress = Float.parseFloat(split[1].replace("%", ""))/100; + progress = LerpUtils.clampZeroOne(progress); + commissionProgress.put(split[0], progress); + } catch(Exception ignored) {} + } else { + commissionProgress.put(split[0], 1.0f); + } + } + } else { + commissions = false; + forges = false; + } + } + + List commissionsStrings = new ArrayList<>(); + for(Map.Entry entry : commissionProgress.entrySet()) { + if(entry.getValue() >= 1) { + commissionsStrings.add(DARK_AQUA+entry.getKey() + ": " + GREEN + "DONE"); + } else { + EnumChatFormatting col = RED; + if(entry.getValue() >= 0.75) { + col = GREEN; + } else if(entry.getValue() >= 0.5) { + col = YELLOW; + } else if(entry.getValue() >= 0.25) { + col = GOLD; + } + + String valS = String.valueOf(entry.getValue()*100); + int periodIndex = valS.indexOf('.');//1.3 + if(periodIndex > 0) { + valS = valS.substring(0, Math.min(valS.length(), periodIndex+2)); + } + if(valS.endsWith("0")) { + valS = valS.substring(0, Math.max(0, valS.length()-2)); + } + + commissionsStrings.add(DARK_AQUA+entry.getKey() + ": " + col+valS+"%"); + } + } + boolean hasAny = false; + if(NotEnoughUpdates.INSTANCE.config.mining.commissionsOverlay) { + overlayStrings.addAll(commissionsStrings); + hasAny = true; + } + if(NotEnoughUpdates.INSTANCE.config.mining.powderOverlay) { + if(mithrilPowder != null) { + if(hasAny) overlayStrings.add(null); + overlayStrings.add(DARK_AQUA+mithrilPowder); + hasAny = true; + } + } + if(NotEnoughUpdates.INSTANCE.config.mining.forgeOverlay) { + if(hasAny) overlayStrings.add(null); + overlayStrings.addAll(forgeStrings); + } + } + + private String trimIgnoreColour(String str) { + str = str.trim(); + boolean colourCodeLast = false; + for(int i=0; i