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