From dd7a4209752715db544b2fef804da9762c532cdc Mon Sep 17 00:00:00 2001 From: kokoniara <70776766+kingstefan26@users.noreply.github.com> Date: Fri, 7 Oct 2022 14:50:22 +0200 Subject: fix player profile not never loading in chat (#63) * fix player profile not never loading in chat * cut out hychat like a cancer * ApiFetchur now caches whole players not single profiles, added a switch profile button in gui * ugh git * Revert "cut out hychat like a cancer" This reverts commit 2ee11afa * ugh git x2 * I tried, good luck maintaining this * forgot to uncomment hychat fix * now shows which profile is now selected put button on top a lil refactor * fix player profile sometimes not loading Co-authored-by: syeyoung <42869671+cyoung06@users.noreply.github.com> --- .../commands/CommandDungeonsGuide.java | 22 +- .../dungeonsguide/features/FeatureRegistry.java | 4 +- .../impl/etc/FeatureAutoAcceptReparty.java | 2 - .../features/impl/party/FeatureGoodParties.java | 11 - .../features/impl/party/api/ApiFetchur.java | 697 -------------------- .../features/impl/party/api/CachedData.java | 29 - .../features/impl/party/api/ClassSpecificData.java | 29 - .../features/impl/party/api/DungeonClass.java | 46 -- .../impl/party/api/DungeonSpecificData.java | 29 - .../features/impl/party/api/DungeonStat.java | 54 -- .../features/impl/party/api/DungeonType.java | 39 -- .../features/impl/party/api/FloorSpecificData.java | 29 - .../dungeonsguide/features/impl/party/api/Pet.java | 31 - .../features/impl/party/api/PlayerProfile.java | 91 --- .../features/impl/party/api/Skill.java | 32 - .../features/impl/party/api/SkinFetchur.java | 89 --- .../party/customgui/PanelPartyFinderSettings.java | 1 - .../playerpreview/DataRenderDungeonFloorStat.java | 100 --- .../DataRenderDungeonHighestFloorStat.java | 102 --- .../impl/party/playerpreview/DataRenderer.java | 33 - .../party/playerpreview/DataRendererClassLv.java | 85 --- .../party/playerpreview/DataRendererDungeonLv.java | 81 --- .../party/playerpreview/DataRendererEditor.java | 356 ----------- .../playerpreview/DataRendererFairySouls.java | 49 -- .../playerpreview/DataRendererLilyWeight.java | 72 --- .../party/playerpreview/DataRendererRegistry.java | 63 -- .../party/playerpreview/DataRendererSecrets.java | 53 -- .../playerpreview/DataRendererSelectedClassLv.java | 76 --- .../party/playerpreview/DataRendererSetUrOwn.java | 56 -- .../party/playerpreview/DataRendererSkillLv.java | 79 --- .../party/playerpreview/DataRendererTalismans.java | 123 ---- .../impl/party/playerpreview/FakePlayer.java | 101 +++ .../playerpreview/FeatureViewPlayerOnJoin.java | 620 ------------------ .../FeatureViewPlayerStatsOnJoin.java | 703 +++++++++++++++++++++ .../impl/party/playerpreview/api/ApiFetcher.java | 387 ++++++++++++ .../impl/party/playerpreview/api/CachedData.java | 29 + .../playerpreview/api/PlayerSkyblockData.java | 10 + .../impl/party/playerpreview/api/SkinFetcher.java | 90 +++ .../api/playerprofile/PlayerProfile.java | 92 +++ .../api/playerprofile/PlayerProfileParser.java | 449 +++++++++++++ .../dataclasses/ClassSpecificData.java | 29 + .../playerprofile/dataclasses/DungeonClass.java | 46 ++ .../dataclasses/DungeonSpecificData.java | 29 + .../api/playerprofile/dataclasses/DungeonStat.java | 54 ++ .../api/playerprofile/dataclasses/DungeonType.java | 39 ++ .../dataclasses/FloorSpecificData.java | 29 + .../api/playerprofile/dataclasses/Pet.java | 31 + .../api/playerprofile/dataclasses/Skill.java | 31 + .../datarenders/DataRendererEditor.java | 357 +++++++++++ .../datarenders/DataRendererRegistry.java | 64 ++ .../playerpreview/datarenders/IDataRenderer.java | 33 + .../impl/DataRenderDungeonFloorStat.java | 105 +++ .../impl/DataRenderDungeonHighestFloorStat.java | 107 ++++ .../datarenders/impl/DataRendererClassLv.java | 88 +++ .../datarenders/impl/DataRendererDungeonLv.java | 82 +++ .../datarenders/impl/DataRendererFairySouls.java | 50 ++ .../datarenders/impl/DataRendererLilyWeight.java | 71 +++ .../datarenders/impl/DataRendererSecrets.java | 53 ++ .../impl/DataRendererSelectedClassLv.java | 77 +++ .../datarenders/impl/DataRendererSetUrOwn.java | 57 ++ .../datarenders/impl/DataRendererSkillLv.java | 80 +++ .../datarenders/impl/DataRendererTalismans.java | 123 ++++ .../kr/syeyoung/dungeonsguide/utils/XPUtils.java | 2 +- 63 files changed, 3505 insertions(+), 3176 deletions(-) delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/ApiFetchur.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/CachedData.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/ClassSpecificData.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/DungeonClass.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/DungeonSpecificData.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/DungeonStat.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/DungeonType.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/FloorSpecificData.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/Pet.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/PlayerProfile.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/Skill.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/SkinFetchur.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRenderDungeonFloorStat.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRenderDungeonHighestFloorStat.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRenderer.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererClassLv.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererDungeonLv.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererEditor.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererFairySouls.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererLilyWeight.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererRegistry.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererSecrets.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererSelectedClassLv.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererSetUrOwn.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererSkillLv.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererTalismans.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/FakePlayer.java delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/FeatureViewPlayerOnJoin.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/FeatureViewPlayerStatsOnJoin.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/ApiFetcher.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/CachedData.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/PlayerSkyblockData.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/SkinFetcher.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/PlayerProfile.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/PlayerProfileParser.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/ClassSpecificData.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonClass.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonSpecificData.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonStat.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonType.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/FloorSpecificData.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/Pet.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/Skill.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/DataRendererEditor.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/DataRendererRegistry.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/IDataRenderer.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonFloorStat.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonHighestFloorStat.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererClassLv.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererDungeonLv.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererFairySouls.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererLilyWeight.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSecrets.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSelectedClassLv.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSetUrOwn.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSkillLv.java create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererTalismans.java (limited to 'src/main/java/kr') diff --git a/src/main/java/kr/syeyoung/dungeonsguide/commands/CommandDungeonsGuide.java b/src/main/java/kr/syeyoung/dungeonsguide/commands/CommandDungeonsGuide.java index 50f5aa7f..95850fdc 100644 --- a/src/main/java/kr/syeyoung/dungeonsguide/commands/CommandDungeonsGuide.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/commands/CommandDungeonsGuide.java @@ -40,8 +40,8 @@ import kr.syeyoung.dungeonsguide.dungeon.roomfinder.DungeonRoomInfoRegistry; import kr.syeyoung.dungeonsguide.events.DungeonLeftEvent; import kr.syeyoung.dungeonsguide.features.AbstractFeature; import kr.syeyoung.dungeonsguide.features.FeatureRegistry; -import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.FeatureViewPlayerOnJoin; -import kr.syeyoung.dungeonsguide.features.impl.party.api.ApiFetchur; +import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.FeatureViewPlayerStatsOnJoin; +import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.ApiFetcher; import kr.syeyoung.dungeonsguide.roomedit.EditingContext; import kr.syeyoung.dungeonsguide.roomedit.gui.GuiDungeonRoomEdit; import kr.syeyoung.dungeonsguide.roomprocessor.GeneralRoomProcessor; @@ -270,17 +270,7 @@ public class CommandDungeonsGuide extends CommandBase { Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §cNot in Party")); return; } - for (String member : context.getPartyRawMembers()) { - ApiFetchur.fetchUUIDAsync(member) - .thenAccept(a -> { - if (a == null) { - Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e"+member+"§f's Profile §cCouldn't fetch uuid")); - } else { - ApiFetchur.fetchMostRecentProfileAsync(a.get(), FeatureRegistry.PARTYKICKER_APIKEY.getAPIKey()); - Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e" + member + "§f's Profile ").appendSibling(new ChatComponentText("§7view").setChatStyle(new ChatStyle().setChatHoverEvent(new FeatureViewPlayerOnJoin.HoverEventRenderPlayer(a.orElse(null)))))); - } - }); - } + FeatureViewPlayerStatsOnJoin.processPartyMembers(context); }); // } else if (args[0].equals("fixschematic")) { // File root = new File(e.getDungeonsGuide().getConfigDir(), "schematics"); @@ -388,15 +378,15 @@ public class CommandDungeonsGuide extends CommandBase { } } else if (args[0].equals("pv")) { try { - ApiFetchur.fetchUUIDAsync(args[1]) + ApiFetcher.fetchUUIDAsync(args[1]) .thenAccept(a -> { - sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e" + args[1] + "§f's Profile ").appendSibling(new ChatComponentText("§7view").setChatStyle(new ChatStyle().setChatHoverEvent(new FeatureViewPlayerOnJoin.HoverEventRenderPlayer(a.orElse(null)))))); + sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e" + args[1] + "§f's Profile ").appendSibling(new ChatComponentText("§7view").setChatStyle(new ChatStyle().setChatHoverEvent(new FeatureViewPlayerStatsOnJoin.HoverEventRenderPlayer(a.orElse(null)))))); }); } catch (Exception e) { e.printStackTrace(); } } else if (args[0].equals("purge")) { - ApiFetchur.purgeCache(); + ApiFetcher.purgeCache(); CosmeticsManager cosmeticsManager = DungeonsGuide.getDungeonsGuide().getCosmeticsManager(); cosmeticsManager.requestPerms(); cosmeticsManager.requestCosmeticsList(); diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/FeatureRegistry.java b/src/main/java/kr/syeyoung/dungeonsguide/features/FeatureRegistry.java index 7ef483e1..bf3be41d 100644 --- a/src/main/java/kr/syeyoung/dungeonsguide/features/FeatureRegistry.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/features/FeatureRegistry.java @@ -36,7 +36,7 @@ import kr.syeyoung.dungeonsguide.features.impl.party.APIKey; import kr.syeyoung.dungeonsguide.features.impl.party.FeaturePartyList; import kr.syeyoung.dungeonsguide.features.impl.party.FeaturePartyReady; import kr.syeyoung.dungeonsguide.features.impl.party.customgui.FeatureCustomPartyFinder; -import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.FeatureViewPlayerOnJoin; +import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.FeatureViewPlayerStatsOnJoin; import kr.syeyoung.dungeonsguide.features.impl.secret.*; import kr.syeyoung.dungeonsguide.features.impl.secret.mechanicbrowser.FeatureMechanicBrowse; import kr.syeyoung.dungeonsguide.features.impl.solvers.*; @@ -161,7 +161,7 @@ public class FeatureRegistry { public static final FeatureSimonSaysSolver BOSSFIGHT_SIMONSAYS_SOLVER = register(new FeatureSimonSaysSolver()); public static final APIKey PARTYKICKER_APIKEY = register(new APIKey()); - public static final FeatureViewPlayerOnJoin PARTYKICKER_VIEWPLAYER = register(new FeatureViewPlayerOnJoin()); + public static final FeatureViewPlayerStatsOnJoin PARTYKICKER_VIEWPLAYER = register(new FeatureViewPlayerStatsOnJoin()); public static final FeatureCustomPartyFinder PARTYKICKER_CUSTOM = register(new FeatureCustomPartyFinder()); public static final FeaturePartyList PARTY_LIST = register(new FeaturePartyList()); public static final FeaturePartyReady PARTY_READY = register(new FeaturePartyReady()); diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/etc/FeatureAutoAcceptReparty.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/etc/FeatureAutoAcceptReparty.java index 3a469793..0cb126ef 100644 --- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/etc/FeatureAutoAcceptReparty.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/etc/FeatureAutoAcceptReparty.java @@ -22,10 +22,8 @@ import kr.syeyoung.dungeonsguide.SkyblockStatus; import kr.syeyoung.dungeonsguide.DungeonsGuide; import kr.syeyoung.dungeonsguide.chat.ChatProcessor; import kr.syeyoung.dungeonsguide.features.SimpleFeature; -import kr.syeyoung.dungeonsguide.features.impl.party.api.ApiFetchur; import kr.syeyoung.dungeonsguide.features.listener.ChatListener; import kr.syeyoung.dungeonsguide.utils.TextUtils; -import net.minecraft.client.Minecraft; import net.minecraftforge.client.event.ClientChatReceivedEvent; public class FeatureAutoAcceptReparty extends SimpleFeature implements ChatListener { diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/FeatureGoodParties.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/FeatureGoodParties.java index 7f292e13..6d33ebc9 100644 --- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/FeatureGoodParties.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/FeatureGoodParties.java @@ -18,22 +18,15 @@ package kr.syeyoung.dungeonsguide.features.impl.party; -import kr.syeyoung.dungeonsguide.features.FeatureRegistry; import kr.syeyoung.dungeonsguide.features.SimpleFeature; -import kr.syeyoung.dungeonsguide.features.impl.party.api.ApiFetchur; -import kr.syeyoung.dungeonsguide.features.impl.party.api.DungeonType; -import kr.syeyoung.dungeonsguide.features.impl.party.api.PlayerProfile; import kr.syeyoung.dungeonsguide.features.listener.GuiPostRenderListener; -import kr.syeyoung.dungeonsguide.features.listener.TickListener; import kr.syeyoung.dungeonsguide.utils.TextUtils; -import kr.syeyoung.dungeonsguide.utils.XPUtils; 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.init.Items; -import net.minecraft.inventory.Container; import net.minecraft.inventory.ContainerChest; import net.minecraft.inventory.Slot; import net.minecraft.nbt.NBTTagCompound; @@ -42,10 +35,6 @@ import net.minecraftforge.client.event.GuiScreenEvent; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL14; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; - public class FeatureGoodParties extends SimpleFeature implements GuiPostRenderListener { public FeatureGoodParties() { super("Party Kicker", "Highlight parties in party viewer", "Highlight parties you can't join with red", "partykicker.goodparty",true); diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/ApiFetchur.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/ApiFetchur.java deleted file mode 100644 index 0d929697..00000000 --- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/ApiFetchur.java +++ /dev/null @@ -1,697 +0,0 @@ -/* - * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod - * Copyright (C) 2021 cyoung06 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package kr.syeyoung.dungeonsguide.features.impl.party.api; - -import com.google.gson.*; -import com.mojang.authlib.GameProfile; -import kr.syeyoung.dungeonsguide.utils.TextUtils; -import kr.syeyoung.dungeonsguide.utils.XPUtils; -import net.minecraft.client.Minecraft; -import net.minecraft.init.Blocks; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompressedStreamTools; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import org.json.JSONObject; -import scala.tools.cmd.Opt; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.URL; -import java.net.URLConnection; -import java.util.*; -import java.util.concurrent.*; -import java.util.function.BiFunction; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -public class ApiFetchur { - private static final Gson gson = new Gson(); - - private static final Map> playerProfileCache = new ConcurrentHashMap<>(); - private static final Map> nicknameToUID = new ConcurrentHashMap<>(); - private static final Map> UIDtoNickname = new ConcurrentHashMap<>(); - private static final Map> UIDtoGameProfile = new ConcurrentHashMap<>(); - - private static final ExecutorService ex = Executors.newFixedThreadPool(4); - - private static final Set invalidKeys = new HashSet<>(); - public static void purgeCache() { - playerProfileCache.clear(); - nicknameToUID.clear(); - UIDtoNickname.clear(); - UIDtoGameProfile.clear(); - - completableFutureMap.clear(); - completableFutureMap2.clear(); - completableFutureMap3.clear(); - completableFutureMap4.clear(); - invalidKeys.clear(); - constants = null; - - ex.submit(ApiFetchur::getLilyWeightConstants); - } - static { - ex.submit(ApiFetchur::getLilyWeightConstants); - } - - public static JsonObject getJson(String url) throws IOException { - URLConnection connection = new URL(url).openConnection(); - connection.setConnectTimeout(10000); - connection.setReadTimeout(10000); - return gson.fromJson(new InputStreamReader(connection.getInputStream()), JsonObject.class); - } - public static JsonArray getJsonArr(String url) throws IOException { - URLConnection connection = new URL(url).openConnection(); - connection.setConnectTimeout(10000); - connection.setReadTimeout(10000); - return gson.fromJson(new InputStreamReader(connection.getInputStream()), JsonArray.class); - } - - private static volatile JsonObject constants; - public static JsonObject getLilyWeightConstants() { - if (constants != null) return constants; - try { - JsonObject jsonObject = getJson("https://raw.githubusercontent.com/Antonio32A/lilyweight/master/lib/constants.json"); - constants = jsonObject; - } catch (Exception e) { - throw new RuntimeException(e); - } - return constants; - } - - private static final Map>> completableFutureMap4 = new ConcurrentHashMap<>(); - public static CompletableFuture> getSkinGameProfileByUUIDAsync(String uid) { - if (UIDtoGameProfile.containsKey(uid)) { - CachedData cachedData = UIDtoGameProfile.get(uid); - if (cachedData.getExpire() > System.currentTimeMillis()) { - return CompletableFuture.completedFuture(Optional.ofNullable(cachedData.getData())); - } - UIDtoGameProfile.remove(uid); - } - if (completableFutureMap4.containsKey(uid)) return completableFutureMap4.get(uid); - - CompletableFuture> completableFuture = new CompletableFuture<>(); - fetchNicknameAsync(uid).thenAccept(nick -> { - if (!nick.isPresent()) { - completableFuture.complete(Optional.empty()); - return; - } - ex.submit(() -> { - try { - Optional playerProfile = getSkinGameProfileByUUID(uid,nick.get()); - UIDtoGameProfile.put(uid, new CachedData(System.currentTimeMillis()+1000*60*30, playerProfile.orElse(null))); - completableFuture.complete(playerProfile); - completableFutureMap4.remove(uid); - return; - } catch (IOException e) { - e.printStackTrace(); - } - completableFuture.complete(Optional.empty()); - completableFutureMap4.remove(uid); - }); - }); - completableFutureMap4.put(uid, completableFuture); - return completableFuture; - } - - public static Optional getSkinGameProfileByUUID(String uid, String nickname) throws IOException { - GameProfile gameProfile = new GameProfile(UUID.fromString(uid), nickname); - GameProfile newProf = Minecraft.getMinecraft().getSessionService().fillProfileProperties(gameProfile, true); - return newProf == gameProfile ? Optional.empty() : Optional.of(newProf); - } - - - private static final Map>> completableFutureMap = new ConcurrentHashMap<>(); - public static CompletableFuture> fetchMostRecentProfileAsync(String uid, String apiKey) { - if (playerProfileCache.containsKey(uid)) { - CachedData cachedData = playerProfileCache.get(uid); - if (cachedData.getExpire() > System.currentTimeMillis()) { - return CompletableFuture.completedFuture(Optional.ofNullable(cachedData.getData())); - } - playerProfileCache.remove(uid); - } - if (completableFutureMap.containsKey(uid)) return completableFutureMap.get(uid); - if (invalidKeys.contains(apiKey)) { - CompletableFuture cf = new CompletableFuture(); - cf.completeExceptionally(new IOException("403 for url")); - return cf; - } - - CompletableFuture> completableFuture = new CompletableFuture<>(); - ex.submit(() -> { - try { - Optional playerProfile = fetchMostRecentProfile(uid, apiKey); - playerProfileCache.put(uid, new CachedData(System.currentTimeMillis()+1000*60*30, playerProfile.orElse(null))); - completableFuture.complete(playerProfile); - completableFutureMap.remove(uid); - return; - } catch (IOException e) { - if (e.getMessage().contains("403 for URL")) { - completableFuture.completeExceptionally(e); - completableFutureMap.remove(uid); - invalidKeys.add(apiKey); - } else { - completableFuture.completeExceptionally(e); - completableFutureMap.remove(uid); - } - e.printStackTrace(); - } - }); - completableFutureMap.put(uid, completableFuture); - return completableFuture; - } - - private static final Map>> completableFutureMap3 = new ConcurrentHashMap<>(); - public static CompletableFuture> fetchNicknameAsync(String uid) { - if (UIDtoNickname.containsKey(uid)) { - CachedData cachedData = UIDtoNickname.get(uid); - if (cachedData.getExpire() > System.currentTimeMillis()) { - return CompletableFuture.completedFuture(Optional.ofNullable(cachedData.getData())); - } - UIDtoNickname.remove(uid); - } - if (completableFutureMap3.containsKey(uid)) return completableFutureMap3.get(uid); - - - CompletableFuture> completableFuture = new CompletableFuture<>(); - - ex.submit(() -> { - try { - Optional playerProfile = fetchNickname(uid); - UIDtoNickname.put(uid, new CachedData(System.currentTimeMillis()+1000*60*60*12,playerProfile.orElse(null))); - if (playerProfile.isPresent()) - nicknameToUID.put(playerProfile.orElse(null), new CachedData<>(System.currentTimeMillis()+1000*60*60*12, uid)); - completableFuture.complete(playerProfile); - completableFutureMap3.remove(uid); - return; - } catch (IOException e) { - e.printStackTrace(); - } - completableFuture.complete(Optional.empty()); - completableFutureMap3.remove(uid); - }); - completableFutureMap3.put(uid, completableFuture); - - return completableFuture; - } - - private static final Map>> completableFutureMap2 = new ConcurrentHashMap<>(); - public static CompletableFuture> fetchUUIDAsync(String nickname) { - if (nicknameToUID.containsKey(nickname)) { - CachedData cachedData = nicknameToUID.get(nickname); - if (cachedData.getExpire() > System.currentTimeMillis()) { - return CompletableFuture.completedFuture(Optional.ofNullable(cachedData.getData())); - } - nicknameToUID.remove(nickname); - } - if (completableFutureMap2.containsKey(nickname)) return completableFutureMap2.get(nickname); - - - CompletableFuture> completableFuture = new CompletableFuture<>(); - - ex.submit(() -> { - try { - Optional playerProfile = fetchUUID(nickname); - nicknameToUID.put(nickname, new CachedData(System.currentTimeMillis()+1000*60*60*12,playerProfile.orElse(null))); - if (playerProfile.isPresent()) - UIDtoNickname.put(playerProfile.orElse(null), new CachedData<>(System.currentTimeMillis()+1000*60*60*12, nickname)); - - completableFuture.complete(playerProfile); - completableFutureMap2.remove(nickname); - return; - } catch (IOException e) { - e.printStackTrace(); - } - completableFuture.complete(Optional.empty()); - completableFutureMap2.remove(nickname); - }); - completableFutureMap2.put(nickname, completableFuture); - - return completableFuture; - } - - public static Optional fetchUUID(String nickname) throws IOException { - JsonObject json = getJson("https://api.mojang.com/users/profiles/minecraft/"+nickname); - if (json.has("error")) return Optional.empty(); - return Optional.of(TextUtils.insertDashUUID(json.get("id").getAsString())); - } - public static Optional fetchNickname(String uuid) throws IOException { - try { - JsonArray json = getJsonArr("https://api.mojang.com/user/profiles/" + uuid.replace("-", "") + "/names"); - return Optional.of(json.get(json.size()-1).getAsJsonObject().get("name").getAsString()); - } catch (Exception e) {return Optional.empty();} - } - - public static List fetchPlayerProfiles(String uid, String apiKey) throws IOException { - JsonObject json = getJson("https://api.hypixel.net/skyblock/profiles?uuid="+uid+"&key="+apiKey); - if (!json.get("success").getAsBoolean()) return new ArrayList<>(); - JsonArray profiles = json.getAsJsonArray("profiles"); - String dashTrimmed = uid.replace("-", ""); - - ArrayList playerProfiles = new ArrayList<>(); - for (JsonElement jsonElement : profiles) { - JsonObject semiProfile = jsonElement.getAsJsonObject(); - if (!semiProfile.has(dashTrimmed)) continue; - playerProfiles.add(parseProfile(semiProfile, dashTrimmed)); - } - return playerProfiles; - } - - public static Optional fetchMostRecentProfile(String uid, String apiKey) throws IOException { - JsonObject json = getJson("https://api.hypixel.net/skyblock/profiles?uuid="+uid+"&key="+apiKey); - if (!json.get("success").getAsBoolean()) return Optional.empty(); - JsonArray profiles = json.getAsJsonArray("profiles"); - String dashTrimmed = uid.replace("-", ""); - - JsonObject profile = null; - long lastSave = Long.MIN_VALUE; - for (JsonElement jsonElement : profiles) { - JsonObject semiProfile = jsonElement.getAsJsonObject(); - if (!semiProfile.getAsJsonObject("members").has(dashTrimmed)) continue; - long lastSave2 = semiProfile.getAsJsonObject("members").getAsJsonObject(dashTrimmed).get("last_save").getAsLong(); - if (lastSave2 > lastSave) { - profile = semiProfile; - lastSave = lastSave2; - } - } - - if (profile == null) return Optional.empty(); - PlayerProfile pp = parseProfile(profile, dashTrimmed); - json = getJson("https://api.hypixel.net/player?uuid="+uid+"&key="+apiKey); - if (json.has("player")) { - JsonObject treasures = json.getAsJsonObject("player"); - if (treasures.has("achievements")) { - treasures = treasures.getAsJsonObject("achievements"); - if (treasures.has("skyblock_treasure_hunter")) { - pp.setTotalSecrets(treasures.get("skyblock_treasure_hunter").getAsInt()); - } - } - } - - return Optional.of(pp); - } - - public static int getOrDefault(JsonObject jsonObject, String key, int value) { - if (jsonObject == null || !jsonObject.has(key) || jsonObject.get(key) instanceof JsonNull) return value; - return jsonObject.get(key).getAsInt(); - } - public static long getOrDefault(JsonObject jsonObject, String key, long value) { - if (jsonObject == null || !jsonObject.has(key) || jsonObject.get(key) instanceof JsonNull) return value; - return jsonObject.get(key).getAsLong(); - } - public static double getOrDefault(JsonObject jsonObject, String key, double value) { - if (jsonObject == null || !jsonObject.has(key) || jsonObject.get(key) instanceof JsonNull) return value; - return jsonObject.get(key).getAsDouble(); - } - public static String getOrDefault(JsonObject jsonObject, String key, String value) { - if (jsonObject == null || !jsonObject.has(key) || jsonObject.get(key) instanceof JsonNull) return value; - return jsonObject.get(key).getAsString(); - } - public static Double getOrDefaultNullable(JsonObject jsonObject, String key, Double value) { - if (jsonObject == null || !jsonObject.has(key) || jsonObject.get(key) instanceof JsonNull) return value; - return jsonObject.get(key).getAsDouble(); - } - public static NBTTagCompound parseBase64NBT(String nbt) throws IOException { - return CompressedStreamTools.readCompressed(new ByteArrayInputStream(Base64.getDecoder().decode(nbt))); - } - - public static ItemStack deserializeNBT(NBTTagCompound nbtTagCompound) { - if (nbtTagCompound.hasNoTags()) return null; - ItemStack itemStack = new ItemStack(Blocks.stone); - itemStack.deserializeNBT(nbtTagCompound); - return itemStack; - } - - public static PlayerProfile parseProfile(JsonObject profile, String dashTrimmed) throws IOException { - PlayerProfile playerProfile = new PlayerProfile(); - playerProfile.setProfileUID(getOrDefault(profile, "profile_id", "")); - playerProfile.setMemberUID(dashTrimmed); - playerProfile.setProfileName(getOrDefault(profile, "cute_name", "")); - - JsonObject playerData = profile.getAsJsonObject("members").getAsJsonObject(dashTrimmed); - playerProfile.setLastSave(getOrDefault(playerData, "last_save", 0L)); - playerProfile.setFairySouls(getOrDefault(playerData, "fairy_souls_collected", 0)); - playerProfile.setFairyExchanges(getOrDefault(playerData, "fairy_exchanges", 0)); - - if (playerData.has("inv_armor")) { - playerProfile.setCurrentArmor(new PlayerProfile.Armor()); - NBTTagCompound armor = parseBase64NBT(playerData.getAsJsonObject("inv_armor") - .get("data") - .getAsString()); - NBTTagList array = armor.getTagList("i", 10); - for (int i = 0; i < 4; i++) { - NBTTagCompound item = array.getCompoundTagAt(i); - playerProfile.getCurrentArmor().getArmorSlots()[i] = deserializeNBT(item); - } - } - - if (playerData.has("wardrobe_contents")) { - NBTTagCompound armor = parseBase64NBT(playerData.getAsJsonObject("wardrobe_contents").get("data").getAsString()); - NBTTagList array = armor.getTagList("i", 10); - for (int i = 0; i < array.tagCount(); i++) { - if (i % 4 == 0) playerProfile.getWardrobe().add(new PlayerProfile.Armor()); - NBTTagCompound item = array.getCompoundTagAt(i); - playerProfile.getWardrobe().get(i/4).getArmorSlots()[i%4] = deserializeNBT(item); - } - - } - playerProfile.setSelectedWardrobe(getOrDefault(playerData, "wardrobe_equipped_slot", -1)); - - if (playerData.has("inv_contents")) { - NBTTagCompound armor = parseBase64NBT(playerData.getAsJsonObject("inv_contents").get("data").getAsString()); - NBTTagList array = armor.getTagList("i", 10); - playerProfile.setInventory(new ItemStack[array.tagCount()]); - for (int i = 0; i < array.tagCount(); i++) { - NBTTagCompound item = array.getCompoundTagAt(i); - playerProfile.getInventory()[i] = deserializeNBT(item); - } - } - if (playerData.has("ender_chest_contents")) { - NBTTagCompound armor = parseBase64NBT(playerData.getAsJsonObject("ender_chest_contents").get("data").getAsString()); - NBTTagList array = armor.getTagList("i", 10); - playerProfile.setEnderchest(new ItemStack[array.tagCount()]); - for (int i = 0; i < array.tagCount(); i++) { - NBTTagCompound item = array.getCompoundTagAt(i); - playerProfile.getEnderchest()[i] = deserializeNBT(item); - } - } - if (playerData.has("talisman_bag")) { - NBTTagCompound armor = parseBase64NBT(playerData.getAsJsonObject("talisman_bag").get("data").getAsString()); - NBTTagList array = armor.getTagList("i", 10); - playerProfile.setTalismans(new ItemStack[array.tagCount()]); - for (int i = 0; i < array.tagCount(); i++) { - NBTTagCompound item = array.getCompoundTagAt(i); - playerProfile.getTalismans()[i] = deserializeNBT(item); - } - } - - playerProfile.setSkillXp(new HashMap<>()); - for (Skill value : Skill.values()) { - playerProfile.getSkillXp().put(value, getOrDefaultNullable(playerData, "experience_skill_"+value.getJsonName(), null)); - } - - if (playerData.has("pets")) { - for (JsonElement pets : playerData.getAsJsonArray("pets")) { - JsonObject pet = pets.getAsJsonObject(); - Pet petObj = new Pet(); - petObj.setActive(pet.get("active").getAsBoolean()); - petObj.setExp(getOrDefault(pet, "exp", 0.0)); - petObj.setHeldItem(getOrDefault(pet, "heldItem", null)); - petObj.setSkin(getOrDefault(pet, "skin", null)); - petObj.setType(getOrDefault(pet, "type", null)); - petObj.setUuid(getOrDefault(pet, "uuid", null)); - - playerProfile.getPets().add(petObj); - } - } - - if (playerData.has("dungeons") && playerData.getAsJsonObject("dungeons").has("dungeon_types")) { - JsonObject types = playerData.getAsJsonObject("dungeons") - .getAsJsonObject("dungeon_types"); - for (DungeonType value : DungeonType.values()) { - DungeonStat dungeonStat = new DungeonStat(); - DungeonSpecificData dungeonSpecificData = new DungeonSpecificData<>(value, dungeonStat); - playerProfile.getDungeonStats().put(value, dungeonSpecificData); - - if (!types.has(value.getJsonName())) continue; - - JsonObject dungeonObj = types.getAsJsonObject(value.getJsonName()); - - dungeonStat.setHighestCompleted(getOrDefault(dungeonObj, "highest_tier_completed", -1)); - - for (Integer validFloor : value.getValidFloors()) { - DungeonStat.PlayedFloor playedFloor = new DungeonStat.PlayedFloor(); - playedFloor.setBestScore(getOrDefault(dungeonObj.getAsJsonObject("best_score"), ""+validFloor, 0)); - playedFloor.setCompletions(getOrDefault(dungeonObj.getAsJsonObject("tier_completions"), ""+validFloor, 0)); - playedFloor.setFastestTime(getOrDefault(dungeonObj.getAsJsonObject("fastest_time"), ""+validFloor, -1)); - playedFloor.setFastestTimeS(getOrDefault(dungeonObj.getAsJsonObject("fastest_time_s"), ""+validFloor, -1)); - playedFloor.setFastestTimeSPlus(getOrDefault(dungeonObj.getAsJsonObject("fastest_time_s_plus"), ""+validFloor, -1)); - playedFloor.setMobsKilled(getOrDefault(dungeonObj.getAsJsonObject("mobs_killed"), ""+validFloor, 0)); - playedFloor.setMostMobsKilled(getOrDefault(dungeonObj.getAsJsonObject("most_mobs_killed"), ""+validFloor, 0)); - playedFloor.setMostHealing(getOrDefault(dungeonObj.getAsJsonObject("most_healing"), ""+validFloor, 0)); - playedFloor.setTimes_played(getOrDefault(dungeonObj.getAsJsonObject("times_played"), ""+validFloor, 0)); - playedFloor.setWatcherKills(getOrDefault(dungeonObj.getAsJsonObject("watcher_kills"), ""+validFloor, 0)); - - for (DungeonClass dungeonClass : DungeonClass.values()) { - DungeonStat.PlayedFloor.ClassStatistics classStatistics = new DungeonStat.PlayedFloor.ClassStatistics(); - classStatistics.setMostDamage(getOrDefault(dungeonObj.getAsJsonObject("most_damage_"+dungeonClass.getJsonName()), ""+validFloor, 0)); - ClassSpecificData classStatisticsClassSpecificData = new ClassSpecificData<>(dungeonClass, classStatistics); - - playedFloor.getClassStatistics().put(dungeonClass, classStatisticsClassSpecificData); - } - - FloorSpecificData playedFloorFloorSpecificData = new FloorSpecificData<>(validFloor, playedFloor); - dungeonStat.getPlays().put(validFloor, playedFloorFloorSpecificData); - } - - dungeonStat.setExperience(getOrDefault(dungeonObj, "experience", 0)); - - - } - } - if (playerData.has("dungeons") && playerData.getAsJsonObject("dungeons").has("player_classes")) { - JsonObject classes = playerData.getAsJsonObject("dungeons") - .getAsJsonObject("player_classes"); - for (DungeonClass dungeonClass : DungeonClass.values()) { - PlayerProfile.PlayerClassData classStatistics = new PlayerProfile.PlayerClassData(); - classStatistics.setExperience(getOrDefault(classes.getAsJsonObject(dungeonClass.getJsonName()), "experience", 0)); - ClassSpecificData classStatisticsClassSpecificData = new ClassSpecificData<>(dungeonClass, classStatistics); - - playerProfile.getPlayerClassData().put(dungeonClass, classStatisticsClassSpecificData); - } - } - if (playerData.has("dungeons")) { - String id = getOrDefault(playerData.getAsJsonObject("dungeons"), "selected_dungeon_class", null); - DungeonClass dungeonClass = DungeonClass.getClassByJsonName(id); - playerProfile.setSelectedClass(dungeonClass); - } - try { - calculateLilyWeight(playerProfile, playerData); - } catch (Exception e) { - e.printStackTrace(); - } - return playerProfile; - } - - private static void calculateLilyWeight(PlayerProfile playerProfile, JsonObject playerData) throws ExecutionException, InterruptedException { - JsonObject constants = getLilyWeightConstants(); - double[] slayerXP = new double[4]; - if (playerData.has("slayer_bosses")) { - slayerXP[0] = getOrDefault(playerData.getAsJsonObject("slayer_bosses").getAsJsonObject("zombie"), "xp", 0); - slayerXP[1] = getOrDefault(playerData.getAsJsonObject("slayer_bosses").getAsJsonObject("spider"), "xp", 0); - slayerXP[2] = getOrDefault(playerData.getAsJsonObject("slayer_bosses").getAsJsonObject("wolf"), "xp", 0); - slayerXP[3] = getOrDefault(playerData.getAsJsonObject("slayer_bosses").getAsJsonObject("enderman"), "xp", 0); - } - double skillWeight = 0; - double overflowWeight = 0; - { - JsonObject srw = constants.getAsJsonObject("skillRatioWeight"); - int skillMaxXP = constants.get("skillMaxXP").getAsInt(); - JsonArray overflowMultiplier = constants.getAsJsonArray("skillOverflowMultipliers"); - JsonArray skillFactor = constants.getAsJsonArray("skillFactors"); - - double skillAvg = playerProfile.getSkillXp().entrySet().stream() - .filter(a -> a.getValue() != null) - .filter(a -> srw.has(a.getKey().getJsonName())) - .map(a -> XPUtils.getSkillXp(a.getKey(), a.getValue()).getLevel()).collect(Collectors.averagingInt(a -> a)); - - double n = 12 * (skillAvg/60)*(skillAvg/60); - double r2 = Math.sqrt(2); - - for (Map.Entry skillDoubleEntry : playerProfile.getSkillXp().entrySet()) { - String jsonName = skillDoubleEntry.getKey().getJsonName(); - JsonArray temp_srw = srw.getAsJsonArray(jsonName); - if (temp_srw == null) continue; - int lv = XPUtils.getSkillXp(skillDoubleEntry.getKey(), skillDoubleEntry.getValue()).getLevel(); - skillWeight += n * temp_srw.get(lv).getAsDouble() - * temp_srw.get(temp_srw.size() - 1).getAsDouble(); - skillWeight += temp_srw.get(temp_srw.size() - 1).getAsDouble() * Math.pow(lv/60.0, r2); - } - - int cnt = 0; - for (Map.Entry skillNames : constants.getAsJsonObject("skillNames").entrySet()) { - Skill s = getSkillByLilyName(skillNames.getKey()); - double factor = skillFactor.get(cnt).getAsDouble(); - double effectiveOver; - Double xp = playerProfile.getSkillXp().get(s); - if (xp == null) continue; xp -= skillMaxXP; - { - if (xp < skillMaxXP) effectiveOver = xp; - else { - double remainingXP = xp; - double z = 0; - for (int i = 0; i<= xp/skillMaxXP; i++) { - if (remainingXP >= skillMaxXP) { - remainingXP -= skillMaxXP; - z += Math.pow(factor, i); - } - } - effectiveOver = z * skillMaxXP; - } - } - double rating = effectiveOver / skillMaxXP; - double overflowMult = overflowMultiplier.get(cnt).getAsDouble(); - double t = rating * overflowMult; - if (t > 0) overflowWeight += t; - cnt++; - } - } - double cataCompWeight, masterCompWeight; - { - JsonArray completionFactor = constants.getAsJsonArray("dungeonCompletionWorth"); - JsonObject dungeonCompletionBuffs = constants.getAsJsonObject("dungeonCompletionBuffs"); - double max1000 = 0; - double mMax1000 = 0; - for (int i = 0; i < completionFactor.size(); i++) { - if (i < 8) max1000 += completionFactor.get(i).getAsDouble(); - else mMax1000 += completionFactor.get(i).getAsDouble(); - } - - max1000 *= 1000; - mMax1000 *= 1000; - - double upperBound = 1500; double score = 0; - - DungeonStat dStat = playerProfile.getDungeonStats().get(DungeonType.CATACOMBS).getData(); - for (FloorSpecificData value : dStat.getPlays().values()) { - int runs = value.getData().getCompletions(); - int excess = 0; if (runs > 1000) { - excess = runs - 1000; runs = 1000; - } - - double floorScore = runs * completionFactor.get(value.getFloor()).getAsDouble(); - if (excess > 0) - floorScore *= Math.log10(excess / 1000.0 + 1) / Math.log10(7.5) + 1; - score += floorScore; - } - cataCompWeight = (score / max1000 * upperBound); - - dStat = playerProfile.getDungeonStats().get(DungeonType.MASTER_CATACOMBS).getData(); - for (FloorSpecificData value : dStat.getPlays().values()) { - if (dungeonCompletionBuffs.has(value.getFloor()+"")) { - double threshold = 20; - if (value.getData().getCompletions() >= threshold) upperBound += dungeonCompletionBuffs.get(value.getFloor()+"").getAsDouble(); - else upperBound += dungeonCompletionBuffs.get(value.getFloor()+"").getAsDouble() * Math.pow(value.getData().getCompletions()/threshold, 1.840896416); - } - } - score = 0; - for (FloorSpecificData value : dStat.getPlays().values()) { - int runs = value.getData().getCompletions(); - int excess = 0; if (runs > 1000) { - excess = runs - 1000; runs = 1000; - } - - double floorScore = runs * completionFactor.get(value.getFloor()+7).getAsDouble(); - if (excess > 0) - floorScore *= Math.log10(excess / 1000.0 + 1) / Math.log10(5) + 1; - score += floorScore; - } - - masterCompWeight = score / mMax1000 * upperBound; - } - double dungeonXPWeight = 0; - { - double dungeonOverall = constants.get("dungeonOverall").getAsDouble(); - double dungeonMaxXP = constants.get("dungeonMaxXP").getAsDouble(); - - double cataXP = playerProfile.getDungeonStats().get(DungeonType.CATACOMBS).getData().getExperience(); - XPUtils.XPCalcResult xpCalcResult = XPUtils.getCataXp(cataXP); - double level = xpCalcResult.getLevel(); - if (xpCalcResult.getLevel() != 50) { - double progress = Math.floor(xpCalcResult.getRemainingXp() / xpCalcResult.getNextLvXp() * 1000) / 1000.0; - level += progress; - } - - double n; double tempLevel = 0; - if (cataXP < dungeonMaxXP) - n = 0.2 * Math.pow(level / 50.0, 2.967355422); - else { - double part = 142452410; - tempLevel = 50 + (cataXP - dungeonMaxXP) / part; - n = 0.2 * Math.pow(1 + ((tempLevel - 50) / 50), 2.967355422); - } - if (level != 0) { - if (cataXP < 569809640) dungeonXPWeight = dungeonOverall * (Math.pow(1.18340401286164044, (level + 1)) - 1.05994990217254) * (1 + n); - else dungeonXPWeight =4000 * (n / 0.15465244570598540); - } else dungeonXPWeight = 0; - } - double slayerWeight = 0; - { - JsonArray slayerDeprecationScaling = constants.getAsJsonArray("slayerDeprecationScaling"); - BiFunction getSlayerWeight = (xp, type) -> { - double score = 0; - { - double d = xp / 100000; - if (xp >= 6416) { - double D = (d - Math.pow(3, (-5 / 2.0))) * (d + Math.pow(3, -5 / 2.0)); - 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 / 3.0) * Math.cos(Math.acos(d * Math.pow(3, 5 / 2.0)) / 3) - 1; - } - } - score = Math.floor(score); - double scaling = slayerDeprecationScaling.get(type).getAsDouble(); - double effectiveXP = 0; - for (int i = 1; i <= score; i++) - effectiveXP += (i * i + i) * Math.pow(scaling, i); - effectiveXP = Math.round((1000000 * effectiveXP * (0.05 / scaling)) * 100) / 100.0; - double actualXP = ((score*score*score / 6) + (score*score / 2) + (score / 3)) * 100000; - double distance = xp - actualXP; - double effectiveDistance = distance * Math.pow(scaling, score); - return effectiveXP + effectiveDistance; - }; - - double zombie = getSlayerWeight.apply(slayerXP[0], 0); - double spider = getSlayerWeight.apply(slayerXP[1], 1); - double wolf = getSlayerWeight.apply(slayerXP[2], 2); - double enderman = getSlayerWeight.apply(slayerXP[3], 3); - double individual = zombie / 7000 + spider / 4800 + wolf / 2200 + enderman / 1000; - double extra = (slayerXP[0] + 1.6 * slayerXP[1] + 3.6 * slayerXP[2] + 10 * slayerXP[3]) / 900000; - slayerWeight = (individual + extra); - } - - PlayerProfile.LilyWeight lilyWeight = new PlayerProfile.LilyWeight(); - lilyWeight.setCatacombs_base(cataCompWeight); - lilyWeight.setCatacombs_master(masterCompWeight); - lilyWeight.setCatacombs_exp(dungeonXPWeight); - lilyWeight.setSkill_base(skillWeight); - lilyWeight.setSkill_overflow(overflowWeight); - lilyWeight.setSlayer(slayerWeight); - - playerProfile.setLilyWeight(lilyWeight); - } - - private static Skill getSkillByLilyName(String lilyName) { - switch(lilyName) { - case "experience_skill_enchanting": return Skill.ENCHANTING; - case "experience_skill_taming": return Skill.TAMING; - case "experience_skill_alchemy": return Skill.ALCHEMY; - case "experience_skill_mining": return Skill.MINING; - case "experience_skill_farming": return Skill.FARMING; - case "experience_skill_foraging": return Skill.FORAGING; - case "experience_skill_combat": return Skill.COMBAT; - case "experience_skill_fishing": return Skill.FISHING; - default: return null; - } - } -} diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/CachedData.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/CachedData.java deleted file mode 100644 index 39b04088..00000000 --- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/CachedData.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod - * Copyright (C) 2021 cyoung06 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package kr.syeyoung.dungeonsguide.features.impl.party.api; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class CachedData { - private final long expire; - private final T data; -} diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/ClassSpecificData.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/ClassSpecificData.java deleted file mode 100644 index f977b46a..00000000 --- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/ClassSpecificData.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod - * Copyright (C) 2021 cyoung06 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package kr.syeyoung.dungeonsguide.features.impl.party.api; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@AllArgsConstructor -@Getter -public class ClassSpecificData { - private final DungeonClass dungeonClass; - private final T data; -} diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/DungeonClass.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/DungeonClass.java deleted file mode 100644 index bc0d15f2..00000000 --- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/DungeonClass.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod - * Copyright (C) 2021 cyoung06 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package kr.syeyoung.dungeonsguide.features.impl.party.api; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.HashMap; -import java.util.Map; - -@Getter -@AllArgsConstructor -public enum DungeonClass { - MAGE("mage", "Mage"), ARCHER("archer","Archer"), HEALER("healer", "Healer"), TANK("tank", "Tank"), BERSERK("berserk", "Berserk"); - - - private final String jsonName; - private final String familarName; - private static final Map jsonNameToClazz = new HashMap<>(); - static { - for (DungeonClass value : values()) { - jsonNameToClazz.put(value.getJsonName(), value); - } - } - - public static DungeonClass getClassByJsonName(String name) { - return jsonNameToClazz.get(name); - } - -} diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/DungeonSpecificData.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/DungeonSpecificData.java deleted file mode 100644 index a70b8ba0..00000000 --- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/DungeonSpecificData.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod - * Copyright (C) 2021 cyoung06 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package kr.syeyoung.dungeonsguide.features.impl.party.api; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public class DungeonSpecificData { - private final DungeonType type; - private final T data; -} diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/DungeonStat.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/DungeonStat.java deleted file mode 100644 index fb3be9ac..00000000 --- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/DungeonStat.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod - * Copyright (C) 2021 cyoung06 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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