/* * Copyright (C) 2022 NotEnoughUpdates contributors * * This file is part of NotEnoughUpdates. * * NotEnoughUpdates is free software: you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, either * version 3 of the License, or (at your option) any later version. * * NotEnoughUpdates is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * 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.JsonArray; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.autosubscribe.NEUAutoSubscribe; import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.events.ProfileDataLoadedEvent; import io.github.moulberry.notenoughupdates.options.NEUConfig; import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewerUtils; import io.github.moulberry.notenoughupdates.util.ItemUtils; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; 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 java.util.LinkedList; import java.util.List; @NEUAutoSubscribe public class PowerStoneStatsDisplay { private static PowerStoneStatsDisplay instance = null; private boolean dirty = true; public static PowerStoneStatsDisplay getInstance() { if (instance == null) { instance = new PowerStoneStatsDisplay(); } return instance; } @SubscribeEvent public void onProfileDataLoaded(ProfileDataLoadedEvent event) { JsonObject profileInfo = event.getProfileInfo(); if (profileInfo == null) return; JsonArray inventoryInfo = ProfileViewerUtils.readInventoryInfo(profileInfo, "talisman_bag"); if (inventoryInfo == null) return; NEUConfig.HiddenProfileSpecific configProfileSpecific = NotEnoughUpdates.INSTANCE.config.getProfileSpecific(); if (configProfileSpecific == null) return; configProfileSpecific.magicalPower = ProfileViewerUtils.getMagicalPower(inventoryInfo, profileInfo); } @SubscribeEvent public void onTick(TickEvent event) { if (!NotEnoughUpdates.INSTANCE.config.tooltipTweaks.powerStoneStats) return; if (!dirty) return; if (!Utils.getOpenChestName().equals("Your Bags")) 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; dirty = false; 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 onGuiOpen(GuiOpenEvent event) { if (event.gui != null) { dirty = true; } } @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" + StringUtils.formatNumber((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 = StringUtils.formatNumber((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); } }