/* * Copyright (C) 2023 NotEnoughUpdates contributors * * This file is part of NotEnoughUpdates. * * NotEnoughUpdates is free software: you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, either * version 3 of the License, or (at your option) any later version. * * NotEnoughUpdates is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * 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.level.task; 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.profileviewer.GuiProfileViewer; import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; import io.github.moulberry.notenoughupdates.profileviewer.SkyblockProfiles; import io.github.moulberry.notenoughupdates.profileviewer.data.APIDataJson; import io.github.moulberry.notenoughupdates.profileviewer.level.LevelPage; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import java.util.ArrayList; import java.util.List; import java.util.Map; public class SkillRelatedTaskLevel extends GuiTaskLevel { public SkillRelatedTaskLevel(LevelPage levelPage) { super(levelPage); } @Override public void drawTask(JsonObject object, int mouseX, int mouseY, int guiLeft, int guiTop) { SkyblockProfiles.SkyblockProfile selectedProfile = GuiProfileViewer.getSelectedProfile(); if (selectedProfile == null) { return; } APIDataJson data = selectedProfile.getAPIDataJson(); if (data == null) { return; } Map levelingInfo = selectedProfile.getLevelingInfo(); if (levelingInfo == null) { return; } JsonObject skillRelatedTask = levelPage.getConstant().getAsJsonObject("skill_related_task"); JsonObject miningObj = skillRelatedTask.getAsJsonObject("mining"); int hotmLevel = (int) levelingInfo.get("hotm").level; int hotmXP = 0; JsonArray hotmXpArray = miningObj.get("hotm_xp").getAsJsonArray(); for (int i = 1; i <= hotmLevel; i++) { hotmXP += hotmXpArray.get(i - 1).getAsInt(); } float mithrilPowder = data.mining_core.powder_mithril; float gemstonePowder = data.mining_core.powder_gemstone; float mithril = data.mining_core.powder_spent_mithril + mithrilPowder; float gemstone = data.mining_core.powder_spent_gemstone + gemstonePowder; // PUNKT NULL double totalMithril = mithril + mithrilPowder; double totalGemstone = gemstone + gemstonePowder; double mithrilUnder = Math.min(350000.0, totalMithril); double mithrilOver = Math.max(0, Math.min(totalMithril, 12_500_000.0) - 350000.0); double gemstoneUnder = Math.min(350000.0, totalGemstone); double gemstoneOver = Math.max(0, Math.min(totalGemstone, 20_000_000.0) - 350000.0); double mithrilXP = Math.floor(mithrilUnder / 2400.0); double gemstoneXP = Math.floor(gemstoneUnder / 2500.0); double mithrilExcess = Math.floor( 3.75 * (Math.sqrt(1 + 8 * Math.sqrt((1758267.0 / 12_500_000.0) * mithrilOver + 9)) - 3)); double gemstoneExcess = Math.floor( 4.25 * (Math.sqrt(1 + 8 * Math.sqrt((1758267.0 / 20_000_000.0) * gemstoneOver + 9)) - 3)); double sbXpHotmTier = (mithrilXP + mithrilExcess) + (gemstoneXP + gemstoneExcess) + hotmXP; int sbXpPotmTier = 0; JsonArray potmXpArray = miningObj.get("potm_xp").getAsJsonArray(); int potm = (data.mining_core.nodes.getOrDefault("special_0", new JsonPrimitive(0)).getAsInt()); for (int i = 1; i <= potm; i++) { sbXpPotmTier += potmXpArray.get(i - 1).getAsInt(); } int sbXpCommissionMilestone = 0; JsonArray tutorialArray = Utils.getElementOrDefault( selectedProfile.getProfileJson(), "objectives.tutorial", new JsonArray() ).getAsJsonArray(); JsonArray commissionMilestoneXpArray = miningObj.get("commission_milestone_xp").getAsJsonArray(); for (JsonElement jsonElement : tutorialArray) { if (jsonElement.getAsJsonPrimitive().isString() && jsonElement.getAsString().startsWith( "commission_milestone_reward_skyblock_xp_tier")) for (int i = 1; i <= commissionMilestoneXpArray.size(); i++) { int value = commissionMilestoneXpArray.get(i - 1).getAsInt(); if (jsonElement.getAsString().equals("commission_milestone_reward_skyblock_xp_tier_" + i)) { sbXpCommissionMilestone += value; } } } int sbXpFossilResearch = data.glacite_player_data.fossils_donated.size() * miningObj.get("fossil_research_xp").getAsInt(); // rock mines float pet_milestone_ores_mined = data.player_stats.pets.milestone.ores_mined; int sbXpRockPet = 0; int rockMilestoneXp = miningObj.get("rock_milestone_xp").getAsInt(); JsonArray rockMilestoneRequired = miningObj.get("rock_milestone_required").getAsJsonArray(); for (JsonElement jsonElement : rockMilestoneRequired) { int value = jsonElement.getAsInt(); if (pet_milestone_ores_mined >= value) { sbXpRockPet += rockMilestoneXp; } } // farming JsonObject farmingObj = skillRelatedTask.get("farming").getAsJsonObject(); int anitaShopUpgradesXp = farmingObj.get("anita_shop_upgrades_xp").getAsInt(); int doubleDrops = data.jacobs_contest.perks.double_drops; int farmingLevelCap = data.jacobs_contest.perks.farming_level_cap; int sbXpGainedByAnita = (doubleDrops + farmingLevelCap) * anitaShopUpgradesXp; // fishing int sbXpTrophyFish = 0; JsonObject fishingObj = skillRelatedTask.get("fishing").getAsJsonObject(); JsonArray trophyFishXpArr = fishingObj.get("trophy_fish_xp").getAsJsonArray(); if (object.has("trophy_fish")) { JsonObject trophyFish = object.get("trophy_fish").getAsJsonObject(); for (Map.Entry stringJsonElementEntry : trophyFish.entrySet()) { String key = stringJsonElementEntry.getKey(); if (stringJsonElementEntry.getValue().isJsonPrimitive()) { if (key.endsWith("_bronze")) sbXpTrophyFish += trophyFishXpArr.get(0).getAsInt(); if (key.endsWith("_silver")) sbXpTrophyFish += trophyFishXpArr.get(1).getAsInt(); if (key.endsWith("_gold")) sbXpTrophyFish += trophyFishXpArr.get(2).getAsInt(); if (key.endsWith("_diamond")) sbXpTrophyFish += trophyFishXpArr.get(3).getAsInt(); } } } float petMilestoneKilled = data.player_stats.pets.milestone.sea_creatures_killed; int sbXpDolphinPet = 0; int dolphinMilestoneXp = fishingObj.get("dolphin_milestone_xp").getAsInt(); JsonArray dolphinMilestoneRequired = fishingObj.get("dolphin_milestone_required").getAsJsonArray(); for (JsonElement jsonElement : dolphinMilestoneRequired) { int value = jsonElement.getAsInt(); if (petMilestoneKilled >= value) { sbXpDolphinPet += dolphinMilestoneXp; } } int sbXpNucleus = 0; int nucleusRuns = data.leveling.completions.NUCLEUS_RUNS; JsonElement nucleusXp = miningObj.get("crystal_nucleus_xp"); if (nucleusXp == null) { Utils.showOutdatedRepoNotification("crystal_nucleus_xp from sblevels.json"); } else { sbXpNucleus += nucleusRuns * nucleusXp.getAsInt(); } List lore = new ArrayList<>(); lore.add(levelPage.buildLore("Heart of the Mountain", sbXpHotmTier, miningObj.get("hotm").getAsInt(), false)); lore.add(levelPage.buildLore( "Commission Milestones", sbXpCommissionMilestone, miningObj.get("commission_milestone").getAsInt(), false )); lore.add(levelPage.buildLore("Crystal Nucleus", sbXpNucleus, miningObj.get("crystal_nucleus").getAsInt(), false)); lore.add(levelPage.buildLore( "Anita's Shop Upgrade", sbXpGainedByAnita, farmingObj.get("anita_shop_upgrades").getAsInt(), false )); lore.add(levelPage.buildLore("Peak of the Mountain", sbXpPotmTier, miningObj.get("potm").getAsInt(), false)); lore.add(levelPage.buildLore( "Fossil Resarch", sbXpFossilResearch, miningObj.get("fossil_research").getAsInt(), false )); lore.add(levelPage.buildLore("Trophy Fish", sbXpTrophyFish, fishingObj.get("trophy_fish").getAsInt(), false)); lore.add(levelPage.buildLore("Rock Milestone", sbXpRockPet, miningObj.get("rock_milestone").getAsInt(), false)); lore.add(levelPage.buildLore( "Dolphin Milestone", sbXpDolphinPet, fishingObj.get("dolphin_milestone").getAsInt(), false )); int totalXp = (int) (sbXpHotmTier + sbXpCommissionMilestone + sbXpGainedByAnita + sbXpPotmTier + sbXpTrophyFish + sbXpRockPet + sbXpDolphinPet + sbXpNucleus + sbXpFossilResearch); levelPage.renderLevelBar( "Skill Related Task", new ItemStack(Items.diamond_sword), guiLeft + 23, guiTop + 115, 110, 0, totalXp, levelPage.getConstant().getAsJsonObject("category_xp").get("skill_related_task").getAsInt(), mouseX, mouseY, true, lore ); } }