/* * Copyright (C) 2022 NotEnoughUpdates contributors * * This file is part of NotEnoughUpdates. * * NotEnoughUpdates is free software: you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, either * version 3 of the License, or (at your option) any later version. * * NotEnoughUpdates is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * 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.minionhelper; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.autosubscribe.NEUAutoSubscribe; import io.github.moulberry.notenoughupdates.miscgui.minionhelper.loaders.MinionHelperApiLoader; import io.github.moulberry.notenoughupdates.miscgui.minionhelper.loaders.MinionHelperChatLoader; import io.github.moulberry.notenoughupdates.miscgui.minionhelper.loaders.MinionHelperInventoryLoader; import io.github.moulberry.notenoughupdates.miscgui.minionhelper.loaders.repo.MinionHelperRepoLoader; import io.github.moulberry.notenoughupdates.miscgui.minionhelper.render.MinionHelperOverlay; import io.github.moulberry.notenoughupdates.miscgui.minionhelper.render.MinionHelperTooltips; import io.github.moulberry.notenoughupdates.miscgui.minionhelper.sources.CustomSource; import io.github.moulberry.notenoughupdates.miscgui.minionhelper.sources.MinionSource; import io.github.moulberry.notenoughupdates.miscgui.minionhelper.util.MinionHelperPriceCalculation; import io.github.moulberry.notenoughupdates.miscgui.minionhelper.util.MinionHelperRequirementsManager; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.inventory.Container; import net.minecraft.inventory.ContainerChest; import net.minecraftforge.common.MinecraftForge; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; @NEUAutoSubscribe public class MinionHelperManager { private static MinionHelperManager instance = null; private final Map minions = new HashMap<>(); private int needForNextSlot = -1; private int localPelts = -1; private final MinionHelperPriceCalculation priceCalculation = new MinionHelperPriceCalculation(this); private final MinionHelperRequirementsManager requirementsManager = new MinionHelperRequirementsManager(this); private final MinionHelperApiLoader api = new MinionHelperApiLoader(this); private final MinionHelperRepoLoader repo = new MinionHelperRepoLoader(this); private final MinionHelperOverlay overlay = new MinionHelperOverlay(this); private final MinionHelperInventoryLoader inventoryLoader = new MinionHelperInventoryLoader(this); private String debugPlayerUuid; private String debugProfileName; private int debugNeedForNextSlot = -1; public static MinionHelperManager getInstance() { if (instance == null) { instance = new MinionHelperManager(); } return instance; } private MinionHelperManager() { MinecraftForge.EVENT_BUS.register(priceCalculation); MinecraftForge.EVENT_BUS.register(api); MinecraftForge.EVENT_BUS.register(repo); MinecraftForge.EVENT_BUS.register(overlay); MinecraftForge.EVENT_BUS.register(new MinionHelperTooltips(this)); MinecraftForge.EVENT_BUS.register(new MinionHelperChatLoader(this)); MinecraftForge.EVENT_BUS.register(inventoryLoader); } public boolean inCraftedMinionsInventory() { if (!NotEnoughUpdates.INSTANCE.isOnSkyblock()) return false; Minecraft minecraft = Minecraft.getMinecraft(); if (minecraft == null || minecraft.thePlayer == null) return false; Container inventoryContainer = minecraft.thePlayer.openContainer; if (!(inventoryContainer instanceof ContainerChest)) return false; ContainerChest containerChest = (ContainerChest) inventoryContainer; String name = containerChest.getLowerChestInventory().getDisplayName().getUnformattedText(); return name.equalsIgnoreCase("Crafted Minions"); } public boolean notReady() { return !repo.isReadyToUse() || !api.isReadyToUse(); } public boolean isInvalidApiKey() { return api.isInvalidApiKey(); } public Minion getMinionById(String internalName) { if (minions.containsKey(internalName)) { return minions.get(internalName); } else { System.err.println("Cannot get minion for id '" + internalName + "'!"); return null; } } public Minion getMinionByName(String displayName, int tier) { for (Minion minion : minions.values()) { if (displayName.equals(minion.getDisplayName())) { if (minion.getTier() == tier) { return minion; } } } System.err.println("Cannot get minion for display name '" + displayName + "'!"); return null; } public void createMinion(String internalName, int tier, int xpGain) { minions.put(internalName, new Minion(internalName, tier, xpGain)); } public String formatInternalName(String minionName) { return minionName.toUpperCase(Locale.ROOT).replace(" ", "_"); } private List getChildren(Minion minion) { List list = new ArrayList<>(); for (Minion other : minions.values()) { if (minion == other.getParent()) { list.add(other); list.addAll(getChildren(other)); break; } } return list; } public void onProfileSwitch() { for (Minion minion : minions.values()) { minion.setCrafted(false); minion.setMeetRequirements(false); } needForNextSlot = -1; api.onProfileSwitch(); overlay.onProfileSwitch(); inventoryLoader.onProfileSwitch(); } public void reloadData() { requirementsManager.reloadRequirements(); ApiData apiData = api.getApiData(); if (apiData != null) { for (String minion : apiData.getCraftedMinions()) { setCrafted(getMinionById(minion)); } } } public void setCrafted(Minion minion) { minion.setCrafted(true); if (minion.getCustomSource() != null) { minion.setMeetRequirements(true); for (Minion child : getChildren(minion)) { child.setMeetRequirements(true); } } } public void handleCommand(String[] args) { if (!NotEnoughUpdates.INSTANCE.config.minionHelper.gui) { Utils.addChatMessage("§e[NEU] Minion Helper gui is disabled!"); return; } if (args.length > 1) { String parameter = args[1]; if (parameter.equals("debugplayer")) { if (args.length == 3) { if (args[2].equals("reset")) { Utils.addChatMessage("§e[NEU] Minion debug player reset."); setDebugPlayer(null, null, -1); return; } } if (args.length < 4) { Utils.addChatMessage("§c[NEU] Usage: /neudevtest minion " + "setplayer [need-for-next-slot]"); return; } String playerUuid = args[2]; String playerProfileName = args[3]; int need = args.length == 5 ? Integer.parseInt(args[4]) : -1; setDebugPlayer(playerUuid, playerProfileName, need); Utils.addChatMessage("§e[NEU] Minion debug player set."); return; } if (args.length == 2) { if (parameter.equals("clearminion")) { minions.clear(); Utils.addChatMessage("minion map cleared"); return; } if (parameter.equals("reloadrepo")) { repo.setDirty(); Utils.addChatMessage("repo reload requested"); return; } if (parameter.equals("reloadapi")) { api.resetData(); api.setDirty(); Utils.addChatMessage("api reload requested"); return; } if (parameter.equals("clearapi")) { api.resetData(); Utils.addChatMessage("api data cleared"); return; } } if (args.length == 3) { if (parameter.equals("maxperpage")) { api.resetData(); int maxPerPage = Integer.parseInt(args[2]); Utils.addChatMessage("set max per page to " + maxPerPage); overlay.setMaxPerPage(maxPerPage); return; } } if (args.length == 4) { if (parameter.equals("arrowpos")) { int x = Integer.parseInt(args[2]); int y = Integer.parseInt(args[3]); Utils.addChatMessage("set page pos to " + x + ";" + y); overlay.setTopLeft(new int[]{x, y}); return; } } } Utils.addChatMessage(""); Utils.addChatMessage("§3NEU Minion Helper commands: §c(for testing only!)"); Utils.addChatMessage("§6/neudevtest minion clearminion §7Clears the minion map"); Utils.addChatMessage("§6/neudevtest minion reloadrepo §7Manually loading the data from repo"); Utils.addChatMessage("§6/neudevtest minion reloadapi §7Manually loading the data from api"); Utils.addChatMessage("§6/neudevtest minion clearapi §7Clears the api data"); Utils.addChatMessage("§6/neudevtest minion maxperpage §7Changes the max minions per page number"); Utils.addChatMessage("§6/neudevtest minion arrowpos §7Changes the position of the page numbers"); Utils.addChatMessage("§6/neudevtest minion debugplayer [need-for-next-slot] §7" + "See the Minions missing of other player"); Utils.addChatMessage(""); } private void setDebugPlayer(String playerUuid, String playerProfileName, int fakeNeedForNextSlot) { this.debugPlayerUuid = playerUuid; this.debugProfileName = playerProfileName; this.debugNeedForNextSlot = fakeNeedForNextSlot; onProfileSwitch(); } public MinionHelperPriceCalculation getPriceCalculation() { return priceCalculation; } public MinionHelperRequirementsManager getRequirementsManager() { return requirementsManager; } public MinionHelperApiLoader getApi() { return api; } public MinionHelperOverlay getOverlay() { return overlay; } public Map getAllMinions() { return minions; } public void setNeedForNextSlot(int needForNextSlot) { this.needForNextSlot = needForNextSlot; overlay.resetCache(); } public int getNeedForNextSlot() { return needForNextSlot; } public void setCustomSource(Minion minion, CustomSource customSource) { MinionSource minionSource = minion.getMinionSource(); if (minionSource == null) { minion.setMinionSource(customSource); } minion.setCustomSource(customSource); } public int getLocalPelts() { return localPelts; } public void setLocalPelts(int pelts) { localPelts = pelts; if (localPelts != -1) { ApiData apiData = api.getApiData(); if (apiData != null) { apiData.setPeltCount(localPelts); } } } public String getDebugPlayerUuid() { return debugPlayerUuid; } public String getDebugProfileName() { return debugProfileName; } public int getDebugNeedForNextSlot() { return debugNeedForNextSlot; } }