From d1411db9aad59a530215e6d06a839dec706c80b8 Mon Sep 17 00:00:00 2001
From: Raid34 <77941535+Raid34@users.noreply.github.com>
Date: Fri, 7 Oct 2022 20:13:34 +1300
Subject: Update README.md
noticed the "ll the other features could be found at here" link was a 404 and somehow ended out remaking the whole features list
---
README.md | 79 +++++++++++++++++++++++++++++++++++++++++++--------------------
1 file changed, 54 insertions(+), 25 deletions(-)
diff --git a/README.md b/README.md
index 716fd557..df328bed 100755
--- a/README.md
+++ b/README.md
@@ -17,31 +17,60 @@
# Dungeons Guide
-The most intelligent Hypixel Skyblock Dungeons Mod
+The most intelligent Hypixel Skyblock Dungeons Mod.
## Official Support Discord
-Join Our Discord! https://discord.gg/vuGsXhY5Bv
+Join Our [Discord!](https://discord.gg/vuGsXhY5Bv)
+
## Features
-- Dungeon Waypoints
- - Waypoints for every things that are interactable in dungeon.
- - NPC, Secret, Door, Lever, Superboom wall, Crypts
- - Q. Hey is this feature bannable?
- - A. No.
- 0. It has been verified a admin to be safe. Check #announcement on discord for screenshot
- 1. It is not Watchdog detectable since it does not modify player behaviour or packet
- 2. It is not an ESP (unlike some other "secret waypoints" mods which are really just ChestESP and ItemESP). This mod bases the waypoints on a static set of coordinates from a corner of the room a player is in. This is similar to fairy soul waypoints (which Simon has confirmed are allowed) since it is not scanning for the secrets but rather displaying a waypoint over a set coordinate.
- 3. It does not break any of the 4 guidelines recently posted by Fr0z3n about disallowed QOL modifications
- 4. It does not provide an unfair advantage. Players who memorized secrets will always be able to find secrets faster than someone who hasn't memorized secrets and is using waypoints.
-- Puzzle Solvers (ALL)
- - 3 weirdos
- - intelligent ice-path solver
- - intelligent ice-fill solver
- - intelligent box solver
- - intelligent water solver (FAST SOLUTION)
- - blaze solver
- - creeper solver
- - Bomb defuse solver (except it does not esp or xray solution)
- - Teleport-pads solver
- - Trivia solver
-- Useful Dungeon HUDS
-- All the other features could be found at [here](https://dungeonsguide.gitbook.io/)
+### Solvers
+- **F7 Terminal Solvers** (Shows the correct solution/order.)
+- **Creeper Solver** (Shows what sea lanterns to hit.)
+- **Simon Says Solver** (Shows correct buttons to hit.)
+- **Blaze Room Solver** (Shows what order to kill the blazes in.)
+- **Dynamic Water Board Solver** (Shows you what buttons to hit.)
+- **Tic-tac-toe Solver** (Shows the correct tic-tac-toe solution.)
+- **Riddle Solver** (Tells you the correct person, requires you to click all three characters first.)
+- **Ice Fill Solver** (Shows the correct path through the ice puzzle.)
+- **Silverfish Solver** (Shows what way you should hit the silverfish.)
+- **Bomb Defuse Solver** (Shows the path through the pressure plates. Requires you to visit the left side and press a key to save the solution first, Required to be this way to follow Hypixel rules.)
+- **Secret Finder** (Creates a line from the player towards the nearest secret. [Video demonstrating this feature](https://www.youtube.com/watch?v=fhfNU13wjq0))
+- **Fairy Soul Finder** (Shows the location of dungeon fairy souls.)
+
+### QOL Features
+- **Secret Chest Close** (Hit any key while in a secret chest to close it.)
+- **Ability Cooldown** (Shows ability cooldowns.)
+- **Spirit Boots Fixer** (Fixes spirit boots changing your hand to air.)
+- **Blood Room Warning** (Shows dungeon progress and if you should enter the boss arena or not.)
+- **Box Secret Bats** (Creates a box around secret bats to make them easier to find, does not change their hitbox.)
+- **Box Real Livid** (Creates a coloured box around the real Livid.)
+- **Box Skeleton Masters** (Places a box around skeleton masters to make them easier to see.)
+- **Highlight Starred Mobs** (Highlight starred mobs to make them easier to spot and kill.)
+- **Dungeon Map** (See the layout of a dungeon, room progress, other players positions and the total secrets in each room.)
+- **Reparty/Auto reparty** (Disbands and reinvites all members of the party.)
+- **Disable Ability Messages** (Prevents messages such as *you were hit for X Damage* showing in chat.)
+- **Spirit Bear Summon Percentage** (Shows how close the spirit bear is to spawning.)
+- **Low-Health Warning** (Shows a player name and health if they have less than 500 hp left.
+- **Custom Party Finder GUI** (A nicer party finder gui.)
+
+### Statistics Related Features
+- **View Room Name** (Shows the name of your current room in a dungeon.)
+- **Party Profile Viewer** (Hover over the view button in chat to view a persons armour, total secrets, lily weight, talismans and additional configurable statistics.)
+- **Profit Calculator** (Shows how much you will profit/lose my opening a dungeons chest.)
+- **Price Viewer** (Shows the BIN and AH price of an item.)
+- **See Boss Health** (Allows you to see the health of most bosses in dungeons, including mini-bosses such as guardians and giants.)
+- **Dungeon Items Stats** (Shows what floor the item originated from and what quality the item is (percentage).)
+- **Real-Time Indicator** (Shows how much time has passed since starting the dungeon.)
+- **In-Game Time Indicator** (Shows how much time Hypixel thinks has passed since starting the dungeon.)
+- **Dungeon Cooldown Indicator** (Counts 20 seconds since you left the dungeon.)
+- **Dungeon Death Indicator** (Shows who died and how many times, also shows the total number of deaths.)
+- **Dungeon Score Pre-Calculator** (Pre-calculates dungeon score then shows how many secrets need to be found to progress to the next rank (i.e S -> S+).)
+- **Obtained Secret Indicator** (Shows how many secrets have been found and exist in the current dungeon. Shown as found secrets/total secrets.)
+- **Broken Crypts Indicator** (Same as what Tab-list shows, but without pressing the tab.)
+- **Current Milestone Indicator** (Shows the current milestone you have achieved.)
+
+### Assorted Other Features
+- **Discord Rich Presence** (Shows basic information in DRP. Supports ask to join.)
+
+## Bannable
+Features such as **Secret Finder** are allowed under Hypixel rules as the waypoints are based on a static set of coordinates from a corner of the room a player is in. This is similar to fairy soul waypoints (which Simon has confirmed are allowed) since it is not scanning for the secrets but rather displaying a waypoint over a set coordinate. Dungeon Guide itself has been confirmed allowed on hypixel by an [admin](https://media.discordapp.net/attachments/781913473872560194/867454697387065354/image0.png)
--
cgit
From ae29466b93b72564a578c7435588b42c6433af63 Mon Sep 17 00:00:00 2001
From: Egirl_Emily <79115183+Egirl-Emily@users.noreply.github.com>
Date: Fri, 7 Oct 2022 10:31:44 +0300
Subject: some changes
(probably missing something like spirit boots fixer and /dg atj)
---
README.md | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index df328bed..dd5f7f35 100755
--- a/README.md
+++ b/README.md
@@ -27,8 +27,8 @@ Join Our [Discord!](https://discord.gg/vuGsXhY5Bv)
- **Creeper Solver** (Shows what sea lanterns to hit.)
- **Simon Says Solver** (Shows correct buttons to hit.)
- **Blaze Room Solver** (Shows what order to kill the blazes in.)
-- **Dynamic Water Board Solver** (Shows you what buttons to hit.)
-- **Tic-tac-toe Solver** (Shows the correct tic-tac-toe solution.)
+- **Advanced Water Board Solver** (Shows you what buttons to hit.)
+- **Tic-Tac-Toe Solver** (Shows the correct tic-tac-toe solution.)
- **Riddle Solver** (Tells you the correct person, requires you to click all three characters first.)
- **Ice Fill Solver** (Shows the correct path through the ice puzzle.)
- **Silverfish Solver** (Shows what way you should hit the silverfish.)
@@ -37,7 +37,6 @@ Join Our [Discord!](https://discord.gg/vuGsXhY5Bv)
- **Fairy Soul Finder** (Shows the location of dungeon fairy souls.)
### QOL Features
-- **Secret Chest Close** (Hit any key while in a secret chest to close it.)
- **Ability Cooldown** (Shows ability cooldowns.)
- **Spirit Boots Fixer** (Fixes spirit boots changing your hand to air.)
- **Blood Room Warning** (Shows dungeon progress and if you should enter the boss arena or not.)
--
cgit
From 88bdae53ac798bb5a4c35a05837c73ee9178d440 Mon Sep 17 00:00:00 2001
From: Egirl_Emily <79115183+Egirl-Emily@users.noreply.github.com>
Date: Fri, 7 Oct 2022 10:41:07 +0300
Subject: Secrets Chest Close readded
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index dd5f7f35..17c96873 100755
--- a/README.md
+++ b/README.md
@@ -37,6 +37,7 @@ Join Our [Discord!](https://discord.gg/vuGsXhY5Bv)
- **Fairy Soul Finder** (Shows the location of dungeon fairy souls.)
### QOL Features
+- **Secrets Chest Close** (Hit any key while in a secret chest to close it.)
- **Ability Cooldown** (Shows ability cooldowns.)
- **Spirit Boots Fixer** (Fixes spirit boots changing your hand to air.)
- **Blood Room Warning** (Shows dungeon progress and if you should enter the boss arena or not.)
--
cgit
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>
---
build.gradle | 18 +
.../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 +-
64 files changed, 3523 insertions(+), 3176 deletions(-)
mode change 100755 => 100644 build.gradle
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
diff --git a/build.gradle b/build.gradle
old mode 100755
new mode 100644
index f108ac58..24bc189f
--- a/build.gradle
+++ b/build.gradle
@@ -1,4 +1,22 @@
+/*
+ * 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 .
+ */
+
plugins {
id "idea"
id "java"
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 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.Data;
-
-import java.util.HashMap;
-import java.util.Map;
-
-@Data
-public class DungeonStat {
- private int highestCompleted;
- private double experience;
-
- private Map> plays = new HashMap<>();
- @Data
- public static class PlayedFloor {
- private int times_played;
- private int completions;
- private int watcherKills;
-
- private int fastestTime;
- private int fastestTimeS;
- private int fastestTimeSPlus;
- private int bestScore;
-
- private int mostMobsKilled;
- private int mobsKilled;
-
- private Map> classStatistics = new HashMap<>();
- @Data
- public static class ClassStatistics {
- private double mostDamage;
- }
-
- private double mostHealing;
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/DungeonType.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/DungeonType.java
deleted file mode 100644
index 00ca208b..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/DungeonType.java
+++ /dev/null
@@ -1,39 +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.common.collect.Sets;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.Set;
-
-@Getter
-@AllArgsConstructor
-public enum DungeonType {
- CATACOMBS("catacombs", "The Catacombs",
- Sets.newHashSet(0,1,2,3,4,5,6,7)),
- MASTER_CATACOMBS("master_catacombs", "MasterMode Catacombs", Sets.newHashSet(
- 1,2,3,4,5,6
- ));
-
- private final String jsonName;
- private final String familiarName;
- private final Set validFloors ;
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/FloorSpecificData.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/FloorSpecificData.java
deleted file mode 100644
index 3f3c4f35..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/FloorSpecificData.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 FloorSpecificData {
- private final int floor;
- private final T data;
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/Pet.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/Pet.java
deleted file mode 100644
index eb1427eb..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/Pet.java
+++ /dev/null
@@ -1,31 +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.Data;
-
-@Data
-public class Pet {
- private String uuid;
- private String type;
- private double exp;
- private boolean active;
- private String heldItem;
- private String skin;
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/PlayerProfile.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/PlayerProfile.java
deleted file mode 100644
index a9c1a272..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/PlayerProfile.java
+++ /dev/null
@@ -1,91 +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.Data;
-import net.minecraft.item.ItemStack;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-@Data
-public class PlayerProfile {
- private String profileUID;
- private String memberUID;
- private String profileName;
-
- private long lastSave;
-
- private int fairySouls;
- private int fairyExchanges;
-
- private Armor currentArmor;
- private List wardrobe = new ArrayList<>();
- private int selectedWardrobe = -1;
-
- private ItemStack[] inventory;
- private ItemStack[] enderchest;
- private ItemStack[] talismans;
-
- private int totalSecrets;
-
- @Data
- public static class Armor {
- private final ItemStack[] armorSlots = new ItemStack[4];
-
- public ItemStack getHelmet() { return armorSlots[3]; }
- public ItemStack getChestPlate() { return armorSlots[2]; }
- public ItemStack getLeggings() { return armorSlots[1]; }
- public ItemStack getBoots() { return armorSlots[0]; }
- }
-
- private Map> dungeonStats = new HashMap<>();
-
- private Map> playerClassData = new HashMap<>();
- private DungeonClass selectedClass;
- @Data
- public static class PlayerClassData {
- private double experience;
- }
-
- private Map skillXp;
-
- private List pets = new ArrayList<>();
-
-
- private Map additionalProperties = new HashMap<>();
-
- private LilyWeight lilyWeight;
-
- @Data
- public static class LilyWeight {
- private double skill_base;
- private double skill_overflow;
- private double catacombs_base;
- private double catacombs_master;
- private double catacombs_exp;
- private double slayer;
-
- public double getTotal() {
- return skill_base + skill_overflow + catacombs_base + catacombs_exp + catacombs_master + slayer;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/Skill.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/Skill.java
deleted file mode 100644
index 47900ef3..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/Skill.java
+++ /dev/null
@@ -1,32 +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;
-import lombok.Getter;
-
-@Getter
-@AllArgsConstructor
-public enum Skill {
- RUNECRAFTING("runecrafting", "Runecrafting"), COMBAT("combat", "Combat"), MINING("mining", "Mining"), ALCHEMY("alchemy", "Alchemy"), FARMING("farming", "Farming"), TAMING("taming", "Taming"), ENCHANTING("enchanting", "Enchanting"), FISHING("fishing", "Fishing"), FORAGING("foraging", "Foraging"), CARPENTRY("carpentry", "Carpentry");
-
- private final String jsonName;
- private final String friendlyName;
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/SkinFetchur.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/SkinFetchur.java
deleted file mode 100644
index e2c08d58..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/api/SkinFetchur.java
+++ /dev/null
@@ -1,89 +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.mojang.authlib.GameProfile;
-import com.mojang.authlib.minecraft.MinecraftProfileTexture;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.resources.DefaultPlayerSkin;
-import net.minecraft.client.resources.SkinManager;
-import net.minecraft.util.ResourceLocation;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ConcurrentHashMap;
-
-public class SkinFetchur {
-
- private static final Map> skinSetMap = new ConcurrentHashMap<>();
-
- private static final Map> currentReq = new HashMap<>();
-
- public static CompletableFuture getSkinSet(GameProfile gameProfile) {
- if (gameProfile == null) {
- return CompletableFuture.completedFuture(new SkinSet(DefaultPlayerSkin.getDefaultSkinLegacy(), null, "default"));
- }
- if (skinSetMap.containsKey(gameProfile.getId().toString())) {
- CachedData ss = skinSetMap.get(gameProfile.getId().toString());
- if (ss.getExpire() > System.currentTimeMillis())
- CompletableFuture.completedFuture(skinSetMap.get(gameProfile.getId().toString()).getData());
- skinSetMap.remove(gameProfile.getId().toString());
- }
- if (currentReq.containsKey(gameProfile.getId().toString()))
- return currentReq.get(gameProfile.getId().toString());
-
- SkinSet skinSet = new SkinSet();
- CompletableFuture skinSet2 = new CompletableFuture<>();
- currentReq.put(gameProfile.getId().toString(), skinSet2);
- Minecraft.getMinecraft().getSkinManager().loadProfileTextures(gameProfile, new SkinManager.SkinAvailableCallback() {
- public void skinAvailable(MinecraftProfileTexture.Type p_180521_1_, ResourceLocation location, MinecraftProfileTexture profileTexture) {
- switch (p_180521_1_) {
- case SKIN:
- skinSet.setSkinLoc(location);
- skinSet.setSkinType(profileTexture.getMetadata("model"));
- if (skinSet.getSkinType() == null) {
- skinSet.setSkinType("default");
- }
- skinSet2.complete(skinSet);
- skinSetMap.put(gameProfile.getId().toString(), new CachedData<>(System.currentTimeMillis() + 1000*60*60*3, skinSet));
- currentReq.get(gameProfile.getId().toString());
- break;
- case CAPE:
- skinSet.setCapeLoc(location);
- }
- }
- }, true);
-
- return skinSet2;
- }
-
- @Data
- @NoArgsConstructor
- @AllArgsConstructor
- public static class SkinSet {
- private ResourceLocation skinLoc;
- private ResourceLocation capeLoc;
- private String skinType;
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/PanelPartyFinderSettings.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/PanelPartyFinderSettings.java
index 46107ff8..fe719de2 100644
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/PanelPartyFinderSettings.java
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/PanelPartyFinderSettings.java
@@ -21,7 +21,6 @@ package kr.syeyoung.dungeonsguide.features.impl.party.customgui;
import kr.syeyoung.dungeonsguide.chat.ChatProcessor;
import kr.syeyoung.dungeonsguide.chat.PartyManager;
import kr.syeyoung.dungeonsguide.features.FeatureRegistry;
-import kr.syeyoung.dungeonsguide.features.impl.party.api.ApiFetchur;
import kr.syeyoung.dungeonsguide.gui.elements.*;
import kr.syeyoung.dungeonsguide.utils.TextUtils;
import lombok.Getter;
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRenderDungeonFloorStat.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRenderDungeonFloorStat.java
deleted file mode 100644
index 627b1881..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRenderDungeonFloorStat.java
+++ /dev/null
@@ -1,100 +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.playerpreview;
-
-import kr.syeyoung.dungeonsguide.features.impl.party.api.*;
-import kr.syeyoung.dungeonsguide.utils.TextUtils;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.FontRenderer;
-import net.minecraft.client.gui.ScaledResolution;
-import net.minecraftforge.fml.client.config.GuiUtils;
-
-import java.awt.*;
-import java.util.Arrays;
-
-public class DataRenderDungeonFloorStat implements DataRenderer {
- private final DungeonType dungeonType;
- private final int floor;
- public DataRenderDungeonFloorStat(DungeonType dungeonType, int floor) {
- this.dungeonType = dungeonType;
- this.floor = floor;
- }
-
- @Override
- public Dimension renderData(PlayerProfile playerProfile) {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- String floorName = (dungeonType == DungeonType.CATACOMBS ? "F" : "M") + floor;
-
- boolean flag = false;
- DungeonSpecificData dungeonStatDungeonSpecificData = playerProfile.getDungeonStats().get(dungeonType);
- if (dungeonStatDungeonSpecificData != null) {
- FloorSpecificData playedFloorFloorSpecificData = dungeonStatDungeonSpecificData.getData().getPlays().get(floor);
- if (playedFloorFloorSpecificData != null) {
- flag = true;
- fr.drawString("§b" + floorName + " §a" + playedFloorFloorSpecificData.getData().getBestScore() + " §f" + playedFloorFloorSpecificData.getData().getCompletions() + "§7/§f" + playedFloorFloorSpecificData.getData().getWatcherKills() + "§7/§f" + playedFloorFloorSpecificData.getData().getTimes_played() + " §7(" + (int) (playedFloorFloorSpecificData.getData().getCompletions()*100 / (double) playedFloorFloorSpecificData.getData().getWatcherKills()) + "%)", 0, 0, -1);
- fr.drawString("§6S+ §e" + (playedFloorFloorSpecificData.getData().getFastestTimeSPlus() != -1 ? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTimeSPlus()) : "§7N/A") + " §6S §e" + (playedFloorFloorSpecificData.getData().getFastestTimeS() != -1 ? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTimeS()) : "§7N/A"), 0, fr.FONT_HEIGHT, -1);
- }
- }
- if (!flag) {
- fr.drawString("§cNo Stat for "+floorName, 0,0,-1);
- }
-
- return getDimension();
- }
-
- @Override
- public Dimension renderDummy() {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- String floorName = (dungeonType == DungeonType.CATACOMBS ? "F" : "M") + floor;
-
-
- fr.drawString("§b"+floorName+" §a305 §f10§7/§f35§7/§f50 §7("+(int)(1000.0/35.0)+"%)", 0,0,-1);
- fr.drawString("§6S+ §e10m 53s §6S §e15m 13s", 0, fr.FONT_HEIGHT, -1);
- return getDimension();
- }
-
- @Override
- public Dimension getDimension() {
- return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT*2);
- }
-
- @Override
- public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
-
- DungeonSpecificData dungeonStatDungeonSpecificData = playerProfile.getDungeonStats().get(dungeonType);
- if (dungeonStatDungeonSpecificData == null) return;
- FloorSpecificData playedFloorFloorSpecificData = dungeonStatDungeonSpecificData.getData().getPlays().get(floor);
- if (playedFloorFloorSpecificData == null) return;
- String floorName = (dungeonType == DungeonType.CATACOMBS ? "F" : "M") + floor;
-
- ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
- GuiUtils.drawHoveringText(Arrays.asList(
- "§bFloor "+floorName,
- "§bBest Score§7: §f"+playedFloorFloorSpecificData.getData().getBestScore(),
- "§bTotal Completions§7: §f"+playedFloorFloorSpecificData.getData().getCompletions(),
- "§bTotal Watcher kills§7: §f"+playedFloorFloorSpecificData.getData().getWatcherKills(),
- "§bTotal Runs§7: §f"+playedFloorFloorSpecificData.getData().getTimes_played(),
- "§bFastest S+§7: §f"+(playedFloorFloorSpecificData.getData().getFastestTimeSPlus() != -1? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTimeSPlus()) : "§7N/A"),
- "§bFastest S§7: §f"+(playedFloorFloorSpecificData.getData().getFastestTimeS() != -1? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTimeS()) : "§7N/A"),
- "§bFastest Run§7: §f"+(playedFloorFloorSpecificData.getData().getFastestTime() != -1? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTime()) : "§7N/A"),
- "§bMost Mobs Killed§7: §f"+playedFloorFloorSpecificData.getData().getMostMobsKilled(),
- "§bTotal Mobs Killed§7: §f"+playedFloorFloorSpecificData.getData().getMobsKilled()
- ), mouseX, mouseY, scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), -1, Minecraft.getMinecraft().fontRendererObj);
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRenderDungeonHighestFloorStat.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRenderDungeonHighestFloorStat.java
deleted file mode 100644
index d19fa2f1..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRenderDungeonHighestFloorStat.java
+++ /dev/null
@@ -1,102 +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.playerpreview;
-
-import kr.syeyoung.dungeonsguide.features.impl.party.api.*;
-import kr.syeyoung.dungeonsguide.utils.TextUtils;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.FontRenderer;
-import net.minecraft.client.gui.ScaledResolution;
-import net.minecraftforge.fml.client.config.GuiUtils;
-
-import java.awt.*;
-import java.util.Arrays;
-
-public class DataRenderDungeonHighestFloorStat implements DataRenderer {
- private final DungeonType dungeonType;
- public DataRenderDungeonHighestFloorStat(DungeonType dungeonType) {
- this.dungeonType = dungeonType;
- }
-
- @Override
- public Dimension renderData(PlayerProfile playerProfile) {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
-
- boolean flag = false;
- DungeonSpecificData dungeonStatDungeonSpecificData = playerProfile.getDungeonStats().get(dungeonType);
- if (dungeonStatDungeonSpecificData != null) {
- if (dungeonStatDungeonSpecificData.getData().getHighestCompleted() != -1) {
- FloorSpecificData playedFloorFloorSpecificData = dungeonStatDungeonSpecificData.getData().getPlays().get(dungeonStatDungeonSpecificData.getData().getHighestCompleted());
- String floorName = (dungeonType == DungeonType.CATACOMBS ? "F" : "M") + dungeonStatDungeonSpecificData.getData().getHighestCompleted();
- if (playedFloorFloorSpecificData != null) {
- flag = true;
- fr.drawString("§bH: " + floorName + " §a" + playedFloorFloorSpecificData.getData().getBestScore() + " §f" + playedFloorFloorSpecificData.getData().getCompletions() + "§7/§f" + playedFloorFloorSpecificData.getData().getWatcherKills() + "§7/§f" + playedFloorFloorSpecificData.getData().getTimes_played() + " §7(" + (int) (playedFloorFloorSpecificData.getData().getCompletions() *100/ (double) playedFloorFloorSpecificData.getData().getWatcherKills()) + "%)", 0, 0, -1);
- fr.drawString("§6S+ §e" + (playedFloorFloorSpecificData.getData().getFastestTimeSPlus() != -1 ? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTimeSPlus()) : "§7N/A") + " §6S §e" + (playedFloorFloorSpecificData.getData().getFastestTimeS() != -1 ? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTimeS()) : "§7N/A"), 0, fr.FONT_HEIGHT, -1);
- }
- }
- }
- if (!flag) {
- fr.drawString("§cNo Highest Floor for ", 0,0,-1);
- fr.drawString("§c"+dungeonType.getFamiliarName(), 0,fr.FONT_HEIGHT,-1);
- }
-
- return getDimension();
- }
-
- @Override
- public Dimension renderDummy() {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- String floorName = (dungeonType == DungeonType.CATACOMBS ? "F" : "M") + "9";
-
-
- fr.drawString("§bH: "+floorName+" §a305 §f10§7/§f35§7/§f50 §7("+(int)(1000.0/35.0)+"%)", 0,0,-1);
- fr.drawString("§6S+ §e10m 53s §6S §e15m 13s", 0, fr.FONT_HEIGHT, -1);
- return getDimension();
- }
-
- @Override
- public Dimension getDimension() {
- return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT*2);
- }
-
- @Override
- public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
-
- DungeonSpecificData dungeonStatDungeonSpecificData = playerProfile.getDungeonStats().get(dungeonType);
- if (dungeonStatDungeonSpecificData == null) return;
- if (dungeonStatDungeonSpecificData.getData().getHighestCompleted() == -1) return;
- FloorSpecificData playedFloorFloorSpecificData = dungeonStatDungeonSpecificData.getData().getPlays().get( dungeonStatDungeonSpecificData.getData().getHighestCompleted());
- if (playedFloorFloorSpecificData == null) return;
- String floorName = (dungeonType == DungeonType.CATACOMBS ? "F" : "M") + dungeonStatDungeonSpecificData.getData().getHighestCompleted();
-
- ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
- GuiUtils.drawHoveringText(Arrays.asList(
- "§bFloor "+floorName,
- "§bBest Score§7: §f"+playedFloorFloorSpecificData.getData().getBestScore(),
- "§bTotal Completions§7: §f"+playedFloorFloorSpecificData.getData().getCompletions(),
- "§bTotal Watcher kills§7: §f"+playedFloorFloorSpecificData.getData().getWatcherKills(),
- "§bTotal Runs§7: §f"+playedFloorFloorSpecificData.getData().getTimes_played(),
- "§bFastest S+§7: §f"+(playedFloorFloorSpecificData.getData().getFastestTimeSPlus() != -1? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTimeSPlus()) : "§7N/A"),
- "§bFastest S§7: §f"+(playedFloorFloorSpecificData.getData().getFastestTimeS() != -1? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTimeS()) : "§7N/A"),
- "§bFastest Run§7: §f"+(playedFloorFloorSpecificData.getData().getFastestTime() != -1? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTime()) : "§7N/A"),
- "§bMost Mobs Killed§7: §f"+playedFloorFloorSpecificData.getData().getMostMobsKilled(),
- "§bTotal Mobs Killed§7: §f"+playedFloorFloorSpecificData.getData().getMobsKilled()
- ), mouseX, mouseY, scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), -1, Minecraft.getMinecraft().fontRendererObj);
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRenderer.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRenderer.java
deleted file mode 100644
index df72647e..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRenderer.java
+++ /dev/null
@@ -1,33 +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.playerpreview;
-
-import kr.syeyoung.dungeonsguide.features.impl.party.api.PlayerProfile;
-
-import java.awt.*;
-
-public interface DataRenderer {
- Dimension renderData(PlayerProfile playerProfile);
- void onHover(PlayerProfile playerProfile, int mouseX, int mouseY);
-
-
- Dimension renderDummy();
-
- Dimension getDimension();
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererClassLv.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererClassLv.java
deleted file mode 100644
index 3f47f373..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererClassLv.java
+++ /dev/null
@@ -1,85 +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.playerpreview;
-
-import kr.syeyoung.dungeonsguide.features.impl.party.api.*;
-import kr.syeyoung.dungeonsguide.utils.RenderUtils;
-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.ScaledResolution;
-import net.minecraftforge.fml.client.config.GuiUtils;
-
-import java.awt.*;
-import java.util.Arrays;
-
-public class DataRendererClassLv implements DataRenderer {
- private final DungeonClass dungeonClass;
- public DataRendererClassLv(DungeonClass dungeonClass) {
- this.dungeonClass = dungeonClass;
- }
- @Override
- public Dimension renderData(PlayerProfile playerProfile) {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- ClassSpecificData dungeonStatDungeonSpecificData = playerProfile.getPlayerClassData().get(dungeonClass);
- boolean selected = playerProfile.getSelectedClass() == dungeonClass;
- if (dungeonStatDungeonSpecificData == null) {
- fr.drawString(dungeonClass.getFamilarName(), 0,0, 0xFF55ffff);
- fr.drawString("Unknown", fr.getStringWidth(dungeonClass.getFamilarName()+" "),0,0xFFFFFFFF);
- if (selected)
- fr.drawString("★", fr.getStringWidth(dungeonClass.getFamilarName()+" Unknown "),0,0xFFAAAAAA);
- } else {
- XPUtils.XPCalcResult xpCalcResult = XPUtils.getCataXp(dungeonStatDungeonSpecificData.getData().getExperience());
- fr.drawString(dungeonClass.getFamilarName(), 0,0, 0xFF55ffff);
- fr.drawString(xpCalcResult.getLevel()+"", fr.getStringWidth(dungeonClass.getFamilarName()+" "),0,0xFFFFFFFF);
- if (selected)
- fr.drawString("★", fr.getStringWidth(dungeonClass.getFamilarName()+" "+xpCalcResult.getLevel()+" "),0,0xFFAAAAAA);
-
- RenderUtils.renderBar(0, fr.FONT_HEIGHT, 100,xpCalcResult.getRemainingXp() == 0 ? 1 : (float) (xpCalcResult.getRemainingXp() / xpCalcResult.getNextLvXp()));
- }
-
- return new Dimension(100, fr.FONT_HEIGHT*2);
- }
-
- @Override
- public Dimension renderDummy() {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- fr.drawString(dungeonClass.getFamilarName(), 0,0, 0xFF55ffff);
- fr.drawString("99", fr.getStringWidth(dungeonClass.getFamilarName()+" "),0,0xFFFFFFFF);
- fr.drawString("★", fr.getStringWidth(dungeonClass.getFamilarName()+" 99 "),0,0xFFAAAAAA);
- RenderUtils.renderBar(0, fr.FONT_HEIGHT, 100,1.0f);
- return new Dimension(100, fr.FONT_HEIGHT*2);
- }
- @Override
- public Dimension getDimension() {
- return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT*2);
- }
-
- @Override
- public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
- ClassSpecificData dungeonStatDungeonSpecificData = playerProfile.getPlayerClassData().get(dungeonClass);
- if (dungeonStatDungeonSpecificData == null) return;
- XPUtils.XPCalcResult xpCalcResult = XPUtils.getCataXp(dungeonStatDungeonSpecificData.getData().getExperience());
- ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
-
- GuiUtils.drawHoveringText(Arrays.asList("§bCurrent Lv§7: §e"+xpCalcResult.getLevel(),"§bExp§7: §e"+ TextUtils.format((long)xpCalcResult.getRemainingXp()) + "§7/§e"+TextUtils.format((long)xpCalcResult.getNextLvXp()), "§bTotal Xp§7: §e"+ TextUtils.format((long)dungeonStatDungeonSpecificData.getData().getExperience())),mouseX, mouseY,
- scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), -1, Minecraft.getMinecraft().fontRendererObj);
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererDungeonLv.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererDungeonLv.java
deleted file mode 100644
index 80a918ef..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererDungeonLv.java
+++ /dev/null
@@ -1,81 +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.playerpreview;
-
-import kr.syeyoung.dungeonsguide.features.impl.party.api.DungeonSpecificData;
-import kr.syeyoung.dungeonsguide.features.impl.party.api.DungeonStat;
-import kr.syeyoung.dungeonsguide.features.impl.party.api.DungeonType;
-import kr.syeyoung.dungeonsguide.features.impl.party.api.PlayerProfile;
-import kr.syeyoung.dungeonsguide.utils.RenderUtils;
-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.ScaledResolution;
-import net.minecraftforge.fml.client.config.GuiUtils;
-
-import java.awt.*;
-import java.util.Arrays;
-
-public class DataRendererDungeonLv implements DataRenderer {
- private final DungeonType dungeonType;
- public DataRendererDungeonLv(DungeonType dungeonType) {
- this.dungeonType = dungeonType;
- }
- @Override
- public Dimension renderData(PlayerProfile playerProfile) {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- DungeonSpecificData dungeonStatDungeonSpecificData = playerProfile.getDungeonStats().get(dungeonType);
- if (dungeonStatDungeonSpecificData == null) {
- fr.drawString(dungeonType.getFamiliarName(), 0,0, 0xFFFF5555);
- fr.drawString("Unknown", fr.getStringWidth(dungeonType.getFamiliarName()+" "),0,0xFFFFFFFF);
- } else {
- XPUtils.XPCalcResult xpCalcResult = XPUtils.getCataXp(dungeonStatDungeonSpecificData.getData().getExperience());
- fr.drawString(dungeonType.getFamiliarName(), 0,0, 0xFFFF5555);
- fr.drawString(xpCalcResult.getLevel()+"", fr.getStringWidth(dungeonType.getFamiliarName()+" "),0,0xFFFFFFFF);
-
- RenderUtils.renderBar(0, fr.FONT_HEIGHT, 100,xpCalcResult.getRemainingXp() == 0 ? 1 : (float) (xpCalcResult.getRemainingXp() / xpCalcResult.getNextLvXp()));
- }
-
- return new Dimension(100, fr.FONT_HEIGHT*2);
- }
-
- @Override
- public Dimension renderDummy() {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- fr.drawString(dungeonType.getFamiliarName(), 0,0, 0xFFFF5555);
- fr.drawString("99", fr.getStringWidth(dungeonType.getFamiliarName()+" "),0,0xFFFFFFFF);
- RenderUtils.renderBar(0, fr.FONT_HEIGHT, 100,1.0f);
- return new Dimension(100, fr.FONT_HEIGHT*2);
- }
- @Override
- public Dimension getDimension() {
- return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT*2);
- }
-
- @Override
- public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
- DungeonSpecificData dungeonStatDungeonSpecificData = playerProfile.getDungeonStats().get(dungeonType);
- if (dungeonStatDungeonSpecificData == null) return;
- XPUtils.XPCalcResult xpCalcResult = XPUtils.getCataXp(dungeonStatDungeonSpecificData.getData().getExperience());
- ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
- GuiUtils.drawHoveringText(Arrays.asList("§bCurrent Lv§7: §e"+xpCalcResult.getLevel(),"§bExp§7: §e"+TextUtils.format((long)xpCalcResult.getRemainingXp()) + "§7/§e"+TextUtils.format((long)xpCalcResult.getNextLvXp()), "§bTotal Xp§7: §e"+ TextUtils.format((long)dungeonStatDungeonSpecificData.getData().getExperience())),mouseX, mouseY,
- scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), -1, Minecraft.getMinecraft().fontRendererObj);
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererEditor.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererEditor.java
deleted file mode 100644
index c559775a..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererEditor.java
+++ /dev/null
@@ -1,356 +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.playerpreview;
-
-import kr.syeyoung.dungeonsguide.gui.MPanel;
-import kr.syeyoung.dungeonsguide.utils.RenderUtils;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.FontRenderer;
-import net.minecraft.client.gui.Gui;
-import net.minecraft.client.gui.ScaledResolution;
-import net.minecraft.client.renderer.GlStateManager;
-import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL14;
-
-import java.awt.*;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-public class DataRendererEditor extends MPanel {
- private final FeatureViewPlayerOnJoin feature;
-
- public DataRendererEditor(FeatureViewPlayerOnJoin featureViewPlayerOnJoin) {
- this.feature = featureViewPlayerOnJoin;
- }
-
- @Override
- public void resize(int parentWidth, int parentHeight) {
- this.setBounds(new Rectangle(5,5,parentWidth-10, 260));
- }
-
- private String currentlySelected;
- private int selectedX;
- private int selectedY;
- private int lastX;
- private int lastY;
- private int scrollY;
- private final int baseWidth = 120;
- private final int hamburgerWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth("==");
-
- @Override
- public void render(int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks, Rectangle scissor) {
- Gui.drawRect(0,0,getBounds().width, getBounds().height, RenderUtils.blendAlpha(0x141414, 0.12f));
-
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- ScaledResolution sr = new ScaledResolution(Minecraft.getMinecraft());
-
-
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- fr.drawString("Available", (310 + baseWidth + hamburgerWidth -fr.getStringWidth("Available")) / 2, 4, 0xFFFFFFFF);
- fr.drawString("Current", (baseWidth + hamburgerWidth+10 -fr.getStringWidth("Current")) /2 , 4, 0xFFFFFFFF);
- Gui.drawRect(4,4 + fr.FONT_HEIGHT + 3,baseWidth + hamburgerWidth+6 + 1, 236+ fr.FONT_HEIGHT + 3, 0xFF222222);
- Gui.drawRect(5,5+ fr.FONT_HEIGHT + 3,baseWidth + hamburgerWidth + 5 + 1, 235+ fr.FONT_HEIGHT + 3, RenderUtils.blendAlpha(0x141414, 0.15f));
- Gui.drawRect(5 + hamburgerWidth,4+ fr.FONT_HEIGHT + 3,6 + hamburgerWidth, 236+ fr.FONT_HEIGHT + 3, 0xFF222222);
-
- Gui.drawRect(154,4 + fr.FONT_HEIGHT + 3,150 + baseWidth + hamburgerWidth + 6+1, 236+ fr.FONT_HEIGHT + 3, 0xFF222222);
- Gui.drawRect(155,5+ fr.FONT_HEIGHT + 3,150 + baseWidth + hamburgerWidth + 5+1, 235+ fr.FONT_HEIGHT + 3, RenderUtils.blendAlpha(0x141414, 0.15f));
- Gui.drawRect(155 + hamburgerWidth,4 + fr.FONT_HEIGHT + 3,156 + hamburgerWidth, 236+ fr.FONT_HEIGHT + 3, 0xFF222222);
-
- GlStateManager.pushMatrix();
- clip(scissor.x + 6+hamburgerWidth, scissor.y + 5+fr.FONT_HEIGHT+3, baseWidth, 230);
- GlStateManager.translate(6+hamburgerWidth, 5+fr.FONT_HEIGHT+3, 0);
- int culmutativeY = 0;
- int relSelectedY = selectedY - (5+ fr.FONT_HEIGHT + 3);
- boolean drewit = false;
- for (String datarenderers : feature.>getParameter("datarenderers").getValue()) {
-
- if (0 <= selectedX && selectedX <= hamburgerWidth+11 && currentlySelected != null) {
- DataRenderer dataRenderer = DataRendererRegistry.getDataRenderer(currentlySelected);
- Dimension dim;
- if (dataRenderer == null) dim = new Dimension(0,fr.FONT_HEIGHT*2);
- else dim = dataRenderer.getDimension();
-
- if (culmutativeY + dim.height > relSelectedY && relSelectedY >= culmutativeY && !drewit) {
- clip(scissor.x + 6 + hamburgerWidth, scissor.y + 5+fr.FONT_HEIGHT+3, baseWidth, 230);
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- if (dataRenderer == null) {
- fr.drawString("Couldn't find Datarenderer", 0,0, 0xFFFF0000);
- fr.drawString(currentlySelected, 0,fr.FONT_HEIGHT, 0xFFFF0000);
- dim = new Dimension(0, fr.FONT_HEIGHT * 2);
- } else {
- GlStateManager.pushMatrix();
- dim = dataRenderer.renderDummy();
- GlStateManager.popMatrix();
- }
- clip(scissor.x, scissor.y, scissor.width, scissor.height);
- GlStateManager.translate(-hamburgerWidth-1, 0, 0);
- Gui.drawRect(0,0, hamburgerWidth, dim.height-1, 0xFF777777);
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- fr.drawString("=",fr.getStringWidth("=")/2,(dim.height - fr.FONT_HEIGHT) / 2, 0xFFFFFFFF);
- GlStateManager.translate(hamburgerWidth+1,dim.height,0);
- drewit = true;
- }
- }
-
- DataRenderer dataRenderer = DataRendererRegistry.getDataRenderer(datarenderers);
- clip(scissor.x + 6 + hamburgerWidth, scissor.y + 5+fr.FONT_HEIGHT+3, baseWidth, 230);
- Dimension dim;
-
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- if (dataRenderer == null) {
- fr.drawString("Couldn't find Datarenderer", 0,0, 0xFFFF0000);
- fr.drawString(datarenderers, 0,fr.FONT_HEIGHT, 0xFFFF0000);
- dim = new Dimension(0, fr.FONT_HEIGHT * 2);
- } else {
- GlStateManager.pushMatrix();
- dim = dataRenderer.renderDummy();
- GlStateManager.popMatrix();
- }
- clip(scissor.x, scissor.y, scissor.width, scissor.height);
- GlStateManager.translate(-hamburgerWidth-1, 0, 0);
- Gui.drawRect(0,0, hamburgerWidth, dim.height-1, 0xFFAAAAAA);
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- fr.drawString("=",fr.getStringWidth("=")/2,(dim.height - fr.FONT_HEIGHT) / 2, 0xFFFFFFFF);
- GlStateManager.translate(hamburgerWidth+1,dim.height,0);
-
- culmutativeY += dim.height;
- }
-
- if (currentlySelected != null && new Rectangle(0,5+fr.FONT_HEIGHT + 3, hamburgerWidth+11, 232).contains(selectedX, selectedY) && !drewit) {
- DataRenderer dataRenderer = DataRendererRegistry.getDataRenderer(currentlySelected);
- Dimension dim;
- clip(scissor.x + 6 + hamburgerWidth, scissor.y + 5+fr.FONT_HEIGHT+3, baseWidth, 230);
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- if (dataRenderer == null) {
- fr.drawString("Couldn't find Datarenderer", 0,0, 0xFFFF0000);
- fr.drawString(currentlySelected, 0,fr.FONT_HEIGHT, 0xFFFF0000);
- dim = new Dimension(0, fr.FONT_HEIGHT * 2);
- } else {
- GlStateManager.pushMatrix();
- dim = dataRenderer.renderDummy();
- GlStateManager.popMatrix();
- }
- clip(scissor.x, scissor.y, scissor.width, scissor.height);
- GlStateManager.translate(-hamburgerWidth-1, 0, 0);
- Gui.drawRect(0,0, hamburgerWidth, dim.height-1, 0xFF777777);
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- fr.drawString("=",fr.getStringWidth("=")/2,(dim.height - fr.FONT_HEIGHT) / 2, 0xFFFFFFFF);
- GlStateManager.translate(hamburgerWidth+1,dim.height,0);
- }
- GlStateManager.popMatrix();
-
-
- GlStateManager.pushMatrix();
- GlStateManager.translate(156+hamburgerWidth, 5+fr.FONT_HEIGHT+3 - scrollY, 0);
-
- Set rest = new HashSet<>(DataRendererRegistry.getValidDataRenderer());
- rest.removeAll( feature.>getParameter("datarenderers").getValue());
- rest.remove(currentlySelected);
- for (String datarenderers : rest) {
- DataRenderer dataRenderer = DataRendererRegistry.getDataRenderer(datarenderers);
- clip(scissor.x + 156 + hamburgerWidth, scissor.y + 5+fr.FONT_HEIGHT+3, baseWidth, 230);
- Dimension dim;
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- if (dataRenderer == null) {
- fr.drawString("Couldn't find Datarenderer", 0,0, 0xFFFF0000);
- fr.drawString(datarenderers, 0,fr.FONT_HEIGHT, 0xFFFF0000);
- dim = new Dimension(0, fr.FONT_HEIGHT * 2);
- } else {
- GlStateManager.pushMatrix();
- dim = dataRenderer.renderDummy();
- GlStateManager.popMatrix();
- }
- clip(scissor.x + 155, scissor.y + 5+fr.FONT_HEIGHT+3, hamburgerWidth, 230);
- GlStateManager.translate(-hamburgerWidth-1, 0, 0);
- Gui.drawRect(0,0, hamburgerWidth, dim.height-1, 0xFFAAAAAA);
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- fr.drawString("=",fr.getStringWidth("=")/2,(dim.height - fr.FONT_HEIGHT) / 2, 0xFFFFFFFF);
- GlStateManager.translate(hamburgerWidth+1,dim.height,0);
- }
- GlStateManager.popMatrix();
- clip(0,0,sr.getScaledWidth(), sr.getScaledHeight());
- {
- if (currentlySelected != null) {
- GlStateManager.pushMatrix();
- GlStateManager.translate(selectedX+hamburgerWidth+1, selectedY, 0);
- DataRenderer dataRenderer = DataRendererRegistry.getDataRenderer(currentlySelected);
- Dimension dim;
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- if (dataRenderer == null) {
- fr.drawString("Couldn't find Datarenderer", 0, 0, 0xFFFF0000);
- fr.drawString(currentlySelected, 0, fr.FONT_HEIGHT, 0xFFFF0000);
- dim = new Dimension(0, fr.FONT_HEIGHT * 2);
- } else {
- GlStateManager.pushMatrix();
- dim = dataRenderer.renderDummy();
- GlStateManager.popMatrix();
- }
- GlStateManager.translate(-hamburgerWidth-1, 0, 0);
- Gui.drawRect(0,0, hamburgerWidth, dim.height-1, 0xFFAAAAAA);
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- fr.drawString("=",fr.getStringWidth("=")/2,(dim.height - fr.FONT_HEIGHT) / 2, 0xFFFFFFFF);
- GlStateManager.popMatrix();
- }
- }
- clip(scissor.x, scissor.y, scissor.width, scissor.height);
- }
-
- @Override
- public void mouseClicked(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int mouseButton) {
- super.mouseClicked(absMouseX, absMouseY, relMouseX, relMouseY, mouseButton);
- lastX = relMouseX;
- lastY = relMouseY;
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- int legitRelY = relMouseY - (5+fr.FONT_HEIGHT+3);
- if (new Rectangle(155,5+fr.FONT_HEIGHT + 3, hamburgerWidth, 230).contains(relMouseX, relMouseY)) {
- Set rest = new HashSet<>(DataRendererRegistry.getValidDataRenderer());
- rest.removeAll( feature.>getParameter("datarenderers").getValue());
- rest.remove(currentlySelected);
- int culmutativeY = -scrollY;
- for (String datarenderers : rest) {
- DataRenderer dataRenderer = DataRendererRegistry.getDataRenderer(datarenderers);
- Dimension dim;
- if (dataRenderer == null) {
- dim = new Dimension(0, fr.FONT_HEIGHT * 2);
- } else {
- GlStateManager.pushMatrix();
- dim = dataRenderer.getDimension();
- GlStateManager.popMatrix();
- }
- culmutativeY += dim.height;
-
- if (legitRelY < culmutativeY) {
- currentlySelected = datarenderers;
- selectedX = 155;
- selectedY = culmutativeY - dim.height + 5+fr.FONT_HEIGHT + 3;
- break;
- }
- }
- }
- if (new Rectangle(5,5+fr.FONT_HEIGHT + 3, hamburgerWidth, 230).contains(relMouseX, relMouseY)) {
- List rest = feature.>getParameter("datarenderers").getValue();
- int culmutativeY = 0;
- for (String datarenderers : rest) {
- DataRenderer dataRenderer = DataRendererRegistry.getDataRenderer(datarenderers);
- Dimension dim;
- if (dataRenderer == null) {
- dim = new Dimension(0, fr.FONT_HEIGHT * 2);
- } else {
- GlStateManager.pushMatrix();
- dim = dataRenderer.getDimension();
- GlStateManager.popMatrix();
- }
- culmutativeY += dim.height;
-
- if (legitRelY < culmutativeY) {
- currentlySelected = datarenderers;
- selectedX = 5;
- selectedY = culmutativeY - dim.height + 5+fr.FONT_HEIGHT + 3;
- rest.remove(datarenderers);
- break;
- }
- }
- }
- }
-
- @Override
- public void mouseClickMove(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int clickedMouseButton, long timeSinceLastClick) {
- super.mouseClickMove(absMouseX, absMouseY, relMouseX, relMouseY, clickedMouseButton, timeSinceLastClick);
- if (currentlySelected != null) {
- int dx = relMouseX - lastX;
- int dy = relMouseY - lastY;
- selectedX += dx;
- selectedY += dy;
- }
- lastX = relMouseX;
- lastY = relMouseY;
- }
-
- @Override
- public void mouseReleased(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int state) {
- super.mouseReleased(absMouseX, absMouseY, relMouseX, relMouseY, state);
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- int legitRelY = selectedY - (5+fr.FONT_HEIGHT+3);
- if (currentlySelected != null && new Rectangle(0,5+fr.FONT_HEIGHT + 3, hamburgerWidth+11, 232).contains(selectedX, selectedY)) {
- Set rest = new HashSet<>(DataRendererRegistry.getValidDataRenderer());
- int culmutativeY = 0;
- List asdasdkasd = feature.>getParameter("datarenderers").getValue();
- int index = asdasdkasd.size();
- for (int i = 0; i 0) scrollY -= 20;
- if (scrollY < 0) scrollY = 0;
-
-
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererFairySouls.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererFairySouls.java
deleted file mode 100644
index e2895967..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererFairySouls.java
+++ /dev/null
@@ -1,49 +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.playerpreview;
-
-import kr.syeyoung.dungeonsguide.features.impl.party.api.PlayerProfile;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.FontRenderer;
-
-import java.awt.*;
-
-public class DataRendererFairySouls implements DataRenderer {
- @Override
- public Dimension renderData(PlayerProfile playerProfile) {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- fr.drawString("§eFairy Souls §f"+playerProfile.getFairySouls(), 0,0,-1);
- return new Dimension(100, fr.FONT_HEIGHT);
- }
-
- @Override
- public Dimension renderDummy() {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- fr.drawString("§eFairy Souls §f300", 0,0,-1);
- return new Dimension(100, fr.FONT_HEIGHT);
- }
- @Override
- public Dimension getDimension() {
- return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT);
- }
-
- @Override
- public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererLilyWeight.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererLilyWeight.java
deleted file mode 100644
index fa9ecf65..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererLilyWeight.java
+++ /dev/null
@@ -1,72 +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.playerpreview;
-
-import kr.syeyoung.dungeonsguide.features.impl.party.api.PlayerProfile;
-import kr.syeyoung.dungeonsguide.utils.TextUtils;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.FontRenderer;
-import net.minecraft.client.gui.ScaledResolution;
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.fml.client.config.GuiUtils;
-
-import java.awt.*;
-import java.util.Arrays;
-
-public class DataRendererLilyWeight implements DataRenderer {
- @Override
- public Dimension renderData(PlayerProfile playerProfile) {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- if (playerProfile.getLilyWeight() == null)
- fr.drawString("§eLily Weight §cAPI DISABLED", 0,0,-1);
- else
- fr.drawString("§eLily Weight §b"+String.format("%.3f", playerProfile.getLilyWeight().getTotal()), 0,0,-1);
- return new Dimension(100, fr.FONT_HEIGHT);
- }
-
- @Override
- public Dimension renderDummy() {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- fr.drawString("§eLily Weight §b300", 0,0,-1);
- return new Dimension(100, fr.FONT_HEIGHT);
- }
- @Override
- public Dimension getDimension() {
- return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT);
- }
-
- @Override
- public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
- PlayerProfile.LilyWeight lilyWeight= playerProfile.getLilyWeight();
- if (lilyWeight == null) return;
- ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
- GuiUtils.drawHoveringText(Arrays.asList(
- "§bDungeon Weights§7: §e"+ String.format("%.3f",lilyWeight.getCatacombs_base()+lilyWeight.getCatacombs_master()+lilyWeight.getCatacombs_exp()),
- " §bCatacomb Completion§7: §e"+String.format("%.3f",lilyWeight.getCatacombs_base()),
- " §bMaster Completion§7: §e"+String.format("%.3f", lilyWeight.getCatacombs_master()),
- " §bExperience§7: §e"+String.format("%.3f", lilyWeight.getCatacombs_exp()),
- "§bSkill Weights§7: §e"+ String.format("%.3f", lilyWeight.getSkill_base() + lilyWeight.getSkill_overflow()),
- " §bSkill Weight§7: §e"+String.format("%.3f", lilyWeight.getSkill_base()),
- " §bOverflow Weight§7: §e"+String.format("%.3f", lilyWeight.getSkill_overflow()),
- "§bSlayer Weight§7: §e"+String.format("%.3f", lilyWeight.getSlayer()),
- "§bTotal§7: §e"+String.format("%.3f", lilyWeight.getTotal())
- ),mouseX, mouseY,
- scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), -1, Minecraft.getMinecraft().fontRendererObj);
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererRegistry.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererRegistry.java
deleted file mode 100644
index 56e69feb..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererRegistry.java
+++ /dev/null
@@ -1,63 +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.playerpreview;
-
-import kr.syeyoung.dungeonsguide.features.impl.party.api.DungeonClass;
-import kr.syeyoung.dungeonsguide.features.impl.party.api.DungeonType;
-import kr.syeyoung.dungeonsguide.features.impl.party.api.Skill;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-public class DataRendererRegistry {
- private static final Map dataRendererMap = new HashMap<>();
-
- public static DataRenderer getDataRenderer(String id) {
- return dataRendererMap.get(id);
- }
-
- public static Set getValidDataRenderer() {
- return dataRendererMap.keySet();
- }
-
- static {
- dataRendererMap.put("catalv", new DataRendererDungeonLv(DungeonType.CATACOMBS));
- for (DungeonClass value : DungeonClass.values()) {
- dataRendererMap.put("class_"+value.getJsonName()+"_lv", new DataRendererClassLv(value));
- }
- dataRendererMap.put("selected_class_lv", new DataRendererSelectedClassLv());
- for (Skill value : Skill.values()) {
- dataRendererMap.put("skill_"+value.getJsonName()+"_lv", new DataRendererSkillLv(value));
- }
- for (DungeonType value : DungeonType.values()) {
- for (Integer validFloor : value.getValidFloors()) {
- dataRendererMap.put("dungeon_"+value.getJsonName()+"_"+validFloor+"_stat", new DataRenderDungeonFloorStat(value, validFloor));
- }
- dataRendererMap.put("dungeon_"+value.getJsonName()+"_higheststat", new DataRenderDungeonHighestFloorStat(value));
- }
- dataRendererMap.put("fairysouls", new DataRendererFairySouls());
- dataRendererMap.put("secrets", new DataRendererSecrets());
-
- dataRendererMap.put("dummy", new DataRendererSetUrOwn());
-
- dataRendererMap.put("talismans", new DataRendererTalismans());
- dataRendererMap.put("weight", new DataRendererLilyWeight());
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererSecrets.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererSecrets.java
deleted file mode 100644
index 81f08c95..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererSecrets.java
+++ /dev/null
@@ -1,53 +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.playerpreview;
-
-import kr.syeyoung.dungeonsguide.features.impl.party.api.PlayerProfile;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.FontRenderer;
-
-import java.awt.*;
-import java.util.stream.Collectors;
-
-public class DataRendererSecrets implements DataRenderer {
- @Override
- public Dimension renderData(PlayerProfile playerProfile) {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- double theint = playerProfile.getTotalSecrets()/ (double)playerProfile.getDungeonStats().values().stream().flatMap(s -> s.getData().getPlays().values().stream())
- .map(fs -> fs.getData().getWatcherKills()).reduce(0, Integer::sum);
- fr.drawString("§eSecrets §b"+playerProfile.getTotalSecrets()+" §7("+
- String.format("%.2f", theint)+"/run)", 0,0,-1);
- return new Dimension(100, fr.FONT_HEIGHT);
- }
-
- @Override
- public Dimension renderDummy() {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- fr.drawString("§eSecrets §b99999 §7(X/run)", 0,0,-1);
- return new Dimension(100, fr.FONT_HEIGHT);
- }
- @Override
- public Dimension getDimension() {
- return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT);
- }
-
- @Override
- public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererSelectedClassLv.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererSelectedClassLv.java
deleted file mode 100644
index 94bc3542..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererSelectedClassLv.java
+++ /dev/null
@@ -1,76 +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.playerpreview;
-
-import kr.syeyoung.dungeonsguide.features.impl.party.api.ClassSpecificData;
-import kr.syeyoung.dungeonsguide.features.impl.party.api.PlayerProfile;
-import kr.syeyoung.dungeonsguide.utils.RenderUtils;
-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.ScaledResolution;
-import net.minecraftforge.fml.client.config.GuiUtils;
-
-import java.awt.*;
-import java.util.Arrays;
-
-public class DataRendererSelectedClassLv implements DataRenderer {
- @Override
- public Dimension renderData(PlayerProfile playerProfile) {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- ClassSpecificData dungeonStatDungeonSpecificData = playerProfile.getPlayerClassData().get(playerProfile.getSelectedClass());
- if (dungeonStatDungeonSpecificData == null) {
- fr.drawString("Unknown Selected", 0,0, 0xFF55ffff);
- } else {
- XPUtils.XPCalcResult xpCalcResult = XPUtils.getCataXp(dungeonStatDungeonSpecificData.getData().getExperience());
- fr.drawString(playerProfile.getSelectedClass().getFamilarName(), 0,0, 0xFF55ffff);
- fr.drawString(xpCalcResult.getLevel()+"", fr.getStringWidth(playerProfile.getSelectedClass().getFamilarName()+" "),0,0xFFFFFFFF);
- fr.drawString("★", fr.getStringWidth(playerProfile.getSelectedClass().getFamilarName()+" "+xpCalcResult.getLevel()+" "),0,0xFFAAAAAA);
-
- RenderUtils.renderBar(0, fr.FONT_HEIGHT, 100,xpCalcResult.getRemainingXp() == 0 ? 1 : (float) (xpCalcResult.getRemainingXp() / xpCalcResult.getNextLvXp()));
- }
-
- return new Dimension(100, fr.FONT_HEIGHT*2);
- }
-
- @Override
- public Dimension renderDummy() {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- fr.drawString("SelectedClass", 0,0, 0xFF55ffff);
- fr.drawString("99", fr.getStringWidth("SelectedClass "),0,0xFFFFFFFF);
- fr.drawString("★", fr.getStringWidth("SelectedClass 99 "),0,0xFFAAAAAA);
- RenderUtils.renderBar(0, fr.FONT_HEIGHT, 100,1.0f);
- return new Dimension(100, fr.FONT_HEIGHT*2);
- }
- @Override
- public Dimension getDimension() {
- return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT*2);
- }
-
- @Override
- public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
- ClassSpecificData dungeonStatDungeonSpecificData = playerProfile.getPlayerClassData().get(playerProfile.getSelectedClass());
- if (dungeonStatDungeonSpecificData == null) return;
- XPUtils.XPCalcResult xpCalcResult = XPUtils.getCataXp(dungeonStatDungeonSpecificData.getData().getExperience());
- ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
- GuiUtils.drawHoveringText(Arrays.asList("§bCurrent Lv§7: §e"+xpCalcResult.getLevel(),"§bExp§7: §e"+ TextUtils.format((long)xpCalcResult.getRemainingXp()) + "§7/§e"+TextUtils.format((long)xpCalcResult.getNextLvXp()), "§bTotal Xp§7: §e"+ TextUtils.format((long)dungeonStatDungeonSpecificData.getData().getExperience())),mouseX, mouseY,
- scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), -1, Minecraft.getMinecraft().fontRendererObj);
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererSetUrOwn.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererSetUrOwn.java
deleted file mode 100644
index eff18d13..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererSetUrOwn.java
+++ /dev/null
@@ -1,56 +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.playerpreview;
-
-import kr.syeyoung.dungeonsguide.features.impl.party.api.PlayerProfile;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.FontRenderer;
-
-import java.awt.*;
-
-public class DataRendererSetUrOwn implements DataRenderer {
- @Override
- public Dimension renderData(PlayerProfile playerProfile) {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- fr.drawString("§aCustomize at /dg", 0,0,-1);
- fr.drawString("§a-> Party Kicker", 0,fr.FONT_HEIGHT,-1);
- fr.drawString("§a-> View Player Stats", 0,fr.FONT_HEIGHT*2,-1);
- fr.drawString("§a-> Edit", 0,fr.FONT_HEIGHT*3,-1);
- return new Dimension(100, fr.FONT_HEIGHT*4);
- }
-
- @Override
- public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
-
- }
-
- @Override
- public Dimension renderDummy() {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- fr.drawString("§aCustomize at /dg", 0,0,-1);
- fr.drawString("§a-> Party Kicker", 0,fr.FONT_HEIGHT,-1);
- fr.drawString("§a-> View Player Stats", 0,fr.FONT_HEIGHT*2,-1);
- fr.drawString("§a-> Edit", 0,fr.FONT_HEIGHT*3,-1);
- return new Dimension(100, fr.FONT_HEIGHT*4);
- }
- @Override
- public Dimension getDimension() {
- return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT*4);
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererSkillLv.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererSkillLv.java
deleted file mode 100644
index 58fbb782..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererSkillLv.java
+++ /dev/null
@@ -1,79 +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.playerpreview;
-
-import kr.syeyoung.dungeonsguide.features.impl.party.api.PlayerProfile;
-import kr.syeyoung.dungeonsguide.features.impl.party.api.Skill;
-import kr.syeyoung.dungeonsguide.utils.RenderUtils;
-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.ScaledResolution;
-import net.minecraftforge.fml.client.config.GuiUtils;
-
-import java.awt.*;
-import java.util.Arrays;
-
-public class DataRendererSkillLv implements DataRenderer {
- private final Skill skill;
- public DataRendererSkillLv(Skill skill) {
- this.skill = skill;
- }
- @Override
- public Dimension renderData(PlayerProfile playerProfile) {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- Double xp = playerProfile.getSkillXp().get(skill);
- if (xp == null) {
- fr.drawString(skill.getFriendlyName(), 0,0, 0xFF55ffff);
- fr.drawString("§cSkill API Disabled", 0, fr.FONT_HEIGHT,0xFFFFFFFF);
- } else {
- XPUtils.XPCalcResult xpCalcResult = XPUtils.getSkillXp(skill, xp);
- fr.drawString(skill.getFriendlyName(), 0,0, 0xFF55ffff);
- fr.drawString(xpCalcResult.getLevel()+"", fr.getStringWidth(skill.getFriendlyName()+" "),0,0xFFFFFFFF);
-
- RenderUtils.renderBar(0, fr.FONT_HEIGHT, 100,xpCalcResult.getRemainingXp() == 0 ? 1 : (float) (xpCalcResult.getRemainingXp() / xpCalcResult.getNextLvXp()));
- }
-
- return new Dimension(100, fr.FONT_HEIGHT*2);
- }
-
- @Override
- public Dimension renderDummy() {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- fr.drawString(skill.getFriendlyName(), 0,0, 0xFF55ffff);
- fr.drawString("99", fr.getStringWidth(skill.getFriendlyName()+" "),0,0xFFFFFFFF);
- RenderUtils.renderBar(0, fr.FONT_HEIGHT, 100,1.0f);
- return new Dimension(100, fr.FONT_HEIGHT*2);
- }
- @Override
- public Dimension getDimension() {
- return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT*2);
- }
-
- @Override
- public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
- Double xp = playerProfile.getSkillXp().get(skill);
- if (xp == null) return;
- XPUtils.XPCalcResult xpCalcResult = XPUtils.getSkillXp(skill, xp);
- ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
- GuiUtils.drawHoveringText(Arrays.asList("§bCurrent Lv§7: §e"+xpCalcResult.getLevel(),"§bExp§7: §e"+ TextUtils.format((long)xpCalcResult.getRemainingXp()) + "§7/§e"+TextUtils.format((long)xpCalcResult.getNextLvXp()), "§bTotal Xp§7: §e"+ TextUtils.format(xp.longValue())),mouseX, mouseY,
- scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), -1, Minecraft.getMinecraft().fontRendererObj);
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererTalismans.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererTalismans.java
deleted file mode 100644
index d94ae506..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/DataRendererTalismans.java
+++ /dev/null
@@ -1,123 +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.playerpreview;
-
-import kr.syeyoung.dungeonsguide.features.impl.party.api.PlayerProfile;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.FontRenderer;
-import net.minecraft.client.gui.ScaledResolution;
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.nbt.NBTTagList;
-import net.minecraftforge.fml.client.config.GuiUtils;
-
-import java.awt.*;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-public class DataRendererTalismans implements DataRenderer {
- @Override
- public Dimension renderData(PlayerProfile playerProfile) {
- boolean apiDisabled = playerProfile.getTalismans() == null || playerProfile.getInventory() == null;
- if (!playerProfile.getAdditionalProperties().containsKey("talismanCnt") && !apiDisabled) {
- int[] cnts = new int[Rarity.values().length];
- for (ItemStack talisman : playerProfile.getTalismans()) {
- if (talisman == null) continue;
- Rarity r = getRarity(talisman);
- if (r != null) cnts[r.ordinal()]++;
- }
- for (ItemStack itemStack : playerProfile.getInventory()) {
- if (itemStack == null) continue;
- Rarity r = getRarity(itemStack);
- if (r != null) cnts[r.ordinal()]++;
- }
- playerProfile.getAdditionalProperties().put("talismanCnt", cnts);
- }
- int[] rawData = (int[]) playerProfile.getAdditionalProperties().get("talismanCnt");
-
- String str = "";
- if (rawData != null)
- for (Rarity r : Rarity.values()) {
- str = r.color+rawData[r.idx] +" "+ str;
- }
-
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- if (apiDisabled)
- fr.drawString("§eTalis §cAPI DISABLED", 0,0,-1);
- else
- fr.drawString("§eTalis §f"+str, 0,0,-1);
- return new Dimension(100, fr.FONT_HEIGHT);
- }
-
- private Rarity getRarity(ItemStack itemStack) {
- NBTTagCompound display = itemStack.getTagCompound().getCompoundTag("display");
- if (display == null) return null;
- NBTTagList lore = display.getTagList("Lore", 8);
- if (lore == null) return null;
- for (int i = 0; i < lore.tagCount(); i++) {
- String line = lore.getStringTagAt(i);
- for (Rarity value : Rarity.values()) {
- if (line.startsWith(value.getColor()) && line.contains("CCESSORY")) return value;
- }
- }
- return null;
- }
-
- @Override
- public Dimension renderDummy() {
- String str = "";
- for (Rarity r : Rarity.values()) {
- str = r.color+(r.idx+5)*2+" "+str;
- }
-
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- fr.drawString("§eTalis §f"+str, 0,0,-1);
- return new Dimension(100, fr.FONT_HEIGHT);
- }
- @Override
- public Dimension getDimension() {
- return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT);
- }
-
- @Override
- public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
- int[] rawData = (int[]) playerProfile.getAdditionalProperties().get("talismanCnt");
- if (rawData == null) return;
- ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
- List list = new ArrayList<>();
-
- for (Rarity r : Rarity.values()) {
- list.add(r.getColor()+r.name()+"§7: §e"+rawData[r.idx]);
- }
- GuiUtils.drawHoveringText(list,mouseX, mouseY,
- scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), -1, Minecraft.getMinecraft().fontRendererObj);
- }
-
-
- @AllArgsConstructor @Getter
- public static enum Rarity {
- COMMON("§f", 0), UNCOMMON("§a",1), RARE("§9",2), EPIC("§5",3), LEGENDARY("§6",4), MYTHIC("§d",5);
-
- private String color;
- private int idx;
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/FakePlayer.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/FakePlayer.java
new file mode 100644
index 00000000..ec8a29d9
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/FakePlayer.java
@@ -0,0 +1,101 @@
+package kr.syeyoung.dungeonsguide.features.impl.party.playerpreview;
+
+import com.google.common.base.Objects;
+import com.mojang.authlib.GameProfile;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.PlayerProfile;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.SkinFetcher;
+import kr.syeyoung.dungeonsguide.utils.TextUtils;
+import lombok.Getter;
+import lombok.Setter;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.EntityOtherPlayerMP;
+import net.minecraft.client.resources.DefaultPlayerSkin;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.scoreboard.ScorePlayerTeam;
+import net.minecraft.scoreboard.Team;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.world.World;
+
+public class FakePlayer extends EntityOtherPlayerMP {
+ @Setter
+ @Getter
+ private PlayerProfile skyblockProfile;
+ private final SkinFetcher.SkinSet skinSet;
+ private final PlayerProfile.Armor armor;
+ @Getter
+ private final int profileNumber;
+
+ private FakePlayer(World w) {
+ super(w, null);
+ throw new UnsupportedOperationException("what");
+ }
+
+ public FakePlayer(GameProfile playerProfile, SkinFetcher.SkinSet skinSet, PlayerProfile skyblockProfile, int profileNumber) {
+ super(Minecraft.getMinecraft().theWorld, playerProfile);
+ this.profileNumber = profileNumber;
+ this.skyblockProfile = skyblockProfile;
+ this.skinSet = skinSet;
+ armor = skyblockProfile.getCurrentArmor();
+ this.inventory.armorInventory = skyblockProfile.getCurrentArmor().getArmorSlots();
+
+ int highestDungeonScore = Integer.MIN_VALUE;
+ if (skyblockProfile.getInventory() != null) {
+ ItemStack highestItem = null;
+ for (ItemStack itemStack : skyblockProfile.getInventory()) {
+ if (itemStack == null) continue;
+ NBTTagCompound display = itemStack.getTagCompound().getCompoundTag("display");
+ if (display == null) continue;
+ NBTTagList nbtTagList = display.getTagList("Lore", 8);
+ if (nbtTagList == null) continue;
+ for (int i = 0; i < nbtTagList.tagCount(); i++) {
+ String str = nbtTagList.getStringTagAt(i);
+ if (TextUtils.stripColor(str).startsWith("Gear")) {
+ int dungeonScore = Integer.parseInt(TextUtils.keepIntegerCharactersOnly(TextUtils.stripColor(str).split(" ")[2]));
+ if (dungeonScore > highestDungeonScore) {
+ highestItem = itemStack;
+ highestDungeonScore = dungeonScore;
+ }
+ }
+ }
+ }
+
+ this.inventory.mainInventory[0] = highestItem;
+ this.inventory.currentItem = 0;
+ }
+ }
+
+ public String getSkinType() {
+ return this.skinSet == null ? DefaultPlayerSkin.getSkinType(getGameProfile().getId()) : this.skinSet.getSkinType();
+ }
+
+ public ResourceLocation getLocationSkin() {
+ return Objects.firstNonNull(skinSet.getSkinLoc(), DefaultPlayerSkin.getDefaultSkin(getGameProfile().getId()));
+ }
+
+ public ResourceLocation getLocationCape() {
+ return skinSet.getCapeLoc();
+ }
+
+ @Override
+ public ItemStack[] getInventory() {
+ return this.inventory.armorInventory;
+ }
+
+ @Override
+ public boolean isInvisibleToPlayer(EntityPlayer player) {
+ return true;
+ }
+
+ @Override
+ public Team getTeam() {
+ return new ScorePlayerTeam(null, null) {
+ @Override
+ public EnumVisible getNameTagVisibility() {
+ return EnumVisible.NEVER;
+ }
+ };
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/FeatureViewPlayerOnJoin.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/FeatureViewPlayerOnJoin.java
deleted file mode 100644
index ceca0022..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/FeatureViewPlayerOnJoin.java
+++ /dev/null
@@ -1,620 +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.playerpreview;
-
-import com.google.common.base.Supplier;
-import com.mojang.authlib.GameProfile;
-import io.github.moulberry.hychat.HyChat;
-import io.github.moulberry.hychat.chat.ChatManager;
-import io.github.moulberry.hychat.gui.GuiChatBox;
-import kr.syeyoung.dungeonsguide.DungeonsGuide;
-import kr.syeyoung.dungeonsguide.chat.ChatProcessor;
-import kr.syeyoung.dungeonsguide.chat.PartyManager;
-import kr.syeyoung.dungeonsguide.config.guiconfig.ConfigPanelCreator;
-import kr.syeyoung.dungeonsguide.config.guiconfig.MFeatureEdit;
-import kr.syeyoung.dungeonsguide.config.guiconfig.MParameterEdit;
-import kr.syeyoung.dungeonsguide.config.guiconfig.RootConfigPanel;
-import kr.syeyoung.dungeonsguide.cosmetics.ActiveCosmetic;
-import kr.syeyoung.dungeonsguide.cosmetics.CosmeticData;
-import kr.syeyoung.dungeonsguide.features.FeatureParameter;
-import kr.syeyoung.dungeonsguide.features.FeatureRegistry;
-import kr.syeyoung.dungeonsguide.features.SimpleFeature;
-import kr.syeyoung.dungeonsguide.features.impl.party.api.*;
-import kr.syeyoung.dungeonsguide.features.listener.ChatListener;
-import kr.syeyoung.dungeonsguide.features.listener.GuiClickListener;
-import kr.syeyoung.dungeonsguide.features.listener.GuiPostRenderListener;
-import kr.syeyoung.dungeonsguide.gui.MPanel;
-import kr.syeyoung.dungeonsguide.utils.TextUtils;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.SneakyThrows;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.entity.EntityOtherPlayerMP;
-import net.minecraft.client.gui.*;
-import net.minecraft.client.gui.inventory.GuiInventory;
-import net.minecraft.client.renderer.GlStateManager;
-import net.minecraft.client.renderer.RenderHelper;
-import net.minecraft.client.resources.DefaultPlayerSkin;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.event.HoverEvent;
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.nbt.NBTTagList;
-import net.minecraft.scoreboard.ScorePlayerTeam;
-import net.minecraft.scoreboard.Team;
-import net.minecraft.util.*;
-import net.minecraft.world.World;
-import net.minecraftforge.client.event.ClientChatReceivedEvent;
-import net.minecraftforge.client.event.GuiScreenEvent;
-import net.minecraftforge.fml.client.config.GuiUtils;
-import net.minecraftforge.fml.common.Loader;
-import org.lwjgl.input.Mouse;
-import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL14;
-
-import java.awt.*;
-import java.util.*;
-import java.util.List;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-
-public class FeatureViewPlayerOnJoin extends SimpleFeature implements GuiPostRenderListener, ChatListener, GuiClickListener {
-
- public FeatureViewPlayerOnJoin() {
- super("Party", "View player stats when join", "view player rendering when joining/someone joins the party", "partykicker.viewstats", true);
- this.parameters.put("datarenderers", new FeatureParameter>("datarenderers", "DataRenderers","Datarenderssdasd", new ArrayList<>(Arrays.asList(
- "catalv", "selected_class_lv", "dungeon_catacombs_higheststat", "dungeon_master_catacombs_higheststat", "skill_combat_lv", "skill_foraging_lv", "skill_mining_lv", "fairysouls", "dummy"
- )), "stringlist"));
- }
-
- private Rectangle popupRect;
- private String lastuid; // actually current uid
- private Future> profileFuture;
- private Future> gfFuture;
- private Future skinFuture;
- private FakePlayer fakePlayer;
- private boolean drawInv = false;
- @SneakyThrows
- @Override
- public void onGuiPostRender(GuiScreenEvent.DrawScreenEvent.Post rendered) {
- if (!(Minecraft.getMinecraft().currentScreen instanceof GuiChat)) {
- cancelRender();
- return;
- }
- ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
- IChatComponent ichatcomponent = getHoveredComponent(scaledResolution);
- String uid = null;
- if (ichatcomponent != null && ichatcomponent.getChatStyle().getChatHoverEvent() instanceof HoverEventRenderPlayer) {
- uid = ((HoverEventRenderPlayer) ichatcomponent.getChatStyle().getChatHoverEvent()).getUuid();
- }
- reqRender(uid);
- }
-
- public void cancelRender() {
- popupRect = null;
- profileFuture = null;
- lastuid = null;
- gfFuture = null;
- skinFuture= null;
- fakePlayer= null;
- drawInv = false;
- }
-
- public void reqRender(String uid) {
- ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
- int width = scaledResolution.getScaledWidth();
- int height = scaledResolution.getScaledHeight();
- int mouseX = Mouse.getX() * width / Minecraft.getMinecraft().displayWidth;
- int mouseY = height - Mouse.getY() * height / Minecraft.getMinecraft().displayHeight - 1;
-
-
- if (!((popupRect != null && (popupRect.contains(mouseX, mouseY) || drawInv)) || uid != null && uid.equals(lastuid))) {
- cancelRender();
- }
-
- if (uid != null && !uid.equals(lastuid) && (popupRect==null || (!popupRect.contains(mouseX, mouseY) && !drawInv)) ) {
- cancelRender();
- lastuid = uid;
- }
- if (lastuid == null) return;
-
-
- if (popupRect == null) {
- popupRect = new Rectangle(mouseX, mouseY, 220, 220);
- if (popupRect.y + popupRect.height > scaledResolution.getScaledHeight()) {
- popupRect.y -= popupRect.y + popupRect.height - scaledResolution.getScaledHeight();
- }
- }
-
- if (profileFuture == null) {
- profileFuture = ApiFetchur.fetchMostRecentProfileAsync(lastuid, FeatureRegistry.PARTYKICKER_APIKEY.getAPIKey());
- }
-
- if (gfFuture == null) {
- gfFuture = ApiFetchur.getSkinGameProfileByUUIDAsync(lastuid);
- }
- boolean plsSetAPIKEY = false;
- if (skinFuture == null && gfFuture.isDone()) {
- try {
- skinFuture = SkinFetchur.getSkinSet(gfFuture.get().orElse(null));
- } catch (InterruptedException | ExecutionException e) {
- e.printStackTrace();
- }
- }
-
- try {
- if (fakePlayer == null && skinFuture != null && profileFuture != null && skinFuture.isDone() && profileFuture.isDone() && profileFuture.get().isPresent()) {
- fakePlayer = new FakePlayer(gfFuture.get().orElse(null), skinFuture.get(), profileFuture.get().orElse(null));
- }
- } catch (InterruptedException | ExecutionException e) {
- plsSetAPIKEY = true;
- }
-
-
- try {
- render(popupRect, scaledResolution, mouseX, mouseY, plsSetAPIKEY ? null : (profileFuture.isDone() ? profileFuture.get() : null), plsSetAPIKEY);
- } catch (InterruptedException | ExecutionException e) {
- }
-
- }
-
- public static void clip(ScaledResolution resolution, int x, int y, int width, int height) {
- if (width < 0 || height < 0) return;
-
- int scale = resolution.getScaleFactor();
- GL11.glScissor((x ) * scale, Minecraft.getMinecraft().displayHeight - (y + height) * scale, (width) * scale, height * scale);
- }
- private void render(Rectangle popupRect, ScaledResolution scaledResolution, int mouseX, int mouseY, Optional playerProfile, boolean apiKeyPlsSet) {
-
- GlStateManager.pushMatrix();
- GlStateManager.translate(popupRect.x, popupRect.y, 0);
- Gui.drawRect(0,0, popupRect.width, popupRect.height, 0xFF23272a);
- Gui.drawRect(2,2, popupRect.width-2, popupRect.height-2, 0XFF2c2f33);
-
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- if (apiKeyPlsSet) {
- Minecraft.getMinecraft().fontRendererObj.drawString("Please set API KEY on /dg -> Party Kicker", 5,5, 0xFFFFFFFF);
- GlStateManager.popMatrix();
- return;
- }
- if (playerProfile == null) {
- Minecraft.getMinecraft().fontRendererObj.drawString("Fetching data...", 5,5, 0xFFFFFFFF);
- GlStateManager.popMatrix();
- return;
- }
- if (!playerProfile.isPresent()) {
- Minecraft.getMinecraft().fontRendererObj.drawString("User could not be found", 5,5, 0xFFFFFFFF);
- GlStateManager.popMatrix();
- return;
- }
- int relX = mouseX - popupRect.x;
- int relY = mouseY - popupRect.y;
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
-
-
- GL11.glEnable(GL11.GL_SCISSOR_TEST);
- clip(scaledResolution, popupRect.x, popupRect.y, popupRect.width, popupRect.height);
-
- Gui.drawRect(0,168, 90, 195, 0xFF23272a);
- Gui.drawRect(2,170, 88, 193, new Rectangle(2,170,86,23).contains(relX, relY) ? 0xFFff7777 : 0xFFFF3333);
-
- Gui.drawRect(0,193, 90, 220, 0xFF23272a);
- Gui.drawRect(2,195, 88, 218, new Rectangle(2,195,86,23).contains(relX, relY) ? 0xFF859DF0 : 0xFF7289da);
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- fr.drawString("Kick", (90 - fr.getStringWidth("Kick")) / 2,(364 - fr.FONT_HEIGHT) / 2, 0xFFFFFFFF);
- fr.drawString("Invite", (90 - fr.getStringWidth("Invite")) / 2,(414 - fr.FONT_HEIGHT) / 2, 0xFFFFFFFF);
-
- GlStateManager.pushMatrix();
-
- GlStateManager.translate(95, 5, 0);
- int culmutativeY = 5;
- DataRenderer dataRendererToHover = null;
- for (String datarenderers : this.>getParameter("datarenderers").getValue()) {
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- DataRenderer dataRenderer = DataRendererRegistry.getDataRenderer(datarenderers);
- Dimension dim;
- if (dataRenderer == null) {
- fr.drawString("Couldn't find Datarenderer", 0,0, 0xFFFF0000);
- fr.drawString(datarenderers, 0,fr.FONT_HEIGHT, 0xFFFF0000);
- dim = new Dimension(0, fr.FONT_HEIGHT * 2);
- } else {
- GlStateManager.pushMatrix();
- dim = dataRenderer.renderData(playerProfile.get());
- GlStateManager.popMatrix();
- }
- if (relX >= 95 && relX <= popupRect.width && relY >= culmutativeY && relY < culmutativeY+dim.height && dataRenderer != null) {
- dataRendererToHover = dataRenderer;
- }
- culmutativeY += dim.height;
- GlStateManager.translate(0,dim.height,0);
- }
-
- GlStateManager.popMatrix();
-
- Gui.drawRect(0,0, 90, 170, 0xFF23272a);
- Gui.drawRect(2,2, 88, 168, 0xFF444444);
- Gui.drawRect(80,159, 90, 170, 0xFF23272a);
- Gui.drawRect(82,161, 88, 168, 0xFF444444);
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- fr.drawString("§eI", 83,161,-1);
- GlStateManager.color(1, 1, 1, 1.0F);
- if (fakePlayer != null) {
- clip(scaledResolution, popupRect.x+2, popupRect.y+2, 86, 166);
- GuiInventory.drawEntityOnScreen(45, 150, 60, -(mouseX - popupRect.x - 75), 0, fakePlayer);
-
- String toDraw = fakePlayer.getName();
- List activeCosmetics = DungeonsGuide.getDungeonsGuide().getCosmeticsManager().getActiveCosmeticByPlayer().get(UUID.fromString(TextUtils.insertDashUUID(playerProfile.get().getMemberUID())));
- CosmeticData prefix = null, color = null;
- if (activeCosmetics != null) {
- for (ActiveCosmetic activeCosmetic : activeCosmetics) {
- CosmeticData cosmeticData = DungeonsGuide.getDungeonsGuide().getCosmeticsManager().getCosmeticDataMap().get(activeCosmetic.getCosmeticData());
- if (cosmeticData != null) {
- if (cosmeticData.getCosmeticType().equals("prefix")) prefix = cosmeticData;
- if (cosmeticData.getCosmeticType().equals("color")) color = cosmeticData;
- }
- }
- }
- toDraw = (color == null ? "§e" : color.getData().replace("&", "§"))+toDraw;
- if (prefix != null) toDraw = prefix.getData().replace("&", "§") + " "+toDraw;
-
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- fr.drawString(toDraw, (90 - fr.getStringWidth(toDraw)) / 2, 15, -1);
-
- ItemStack toHover = null;
- if (relX > 20 && relX < 70) {
- if (33<=relY && relY <= 66) {
- toHover = fakePlayer.getInventory()[3];
- } else if (66 <= relY && relY <= 108) {
- toHover = fakePlayer.getInventory()[2];
- } else if (108 <= relY && relY <= 130) {
- toHover = fakePlayer.getInventory()[1];
- } else if (130 <= relY && relY <= 154) {
- toHover = fakePlayer.getInventory()[0];
- }
- } else if (relX > 0 && relX <= 20) {
- if (80 <= relY && relY <= 120) {
- toHover = fakePlayer.inventory.mainInventory[fakePlayer.inventory.currentItem];
- }
- }
-
- if (toHover != null) {
- List list = toHover.getTooltip(Minecraft.getMinecraft().thePlayer, Minecraft.getMinecraft().gameSettings.advancedItemTooltips);
- for (int i = 0; i < list.size(); ++i) {
- if (i == 0) {
- list.set(i, toHover.getRarity().rarityColor + list.get(i));
- } else {
- list.set(i, EnumChatFormatting.GRAY + list.get(i));
- }
- }
- FontRenderer font = toHover.getItem().getFontRenderer(toHover);
- GlStateManager.popMatrix();
- GL11.glDisable(GL11.GL_SCISSOR_TEST);
- FontRenderer theRenderer = (font == null ? fr : font);
- GuiUtils.drawHoveringText(list,mouseX, mouseY, scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), -1, theRenderer);
- GL11.glEnable(GL11.GL_SCISSOR_TEST);
- GlStateManager.pushMatrix();
- GlStateManager.translate(popupRect.x, popupRect.y, 0);
- }
- clip(scaledResolution, popupRect.x, popupRect.y, popupRect.width, popupRect.height);
- } else {
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- fr.drawString("Loading", 5,35, 0xFFEFFF00);
- }
-
- GlStateManager.popMatrix();
- GL11.glDisable(GL11.GL_SCISSOR_TEST);
- if (dataRendererToHover != null && !drawInv) {
- dataRendererToHover.onHover(playerProfile.get(), mouseX, mouseY);
- }
- GL11.glEnable(GL11.GL_SCISSOR_TEST);
- GlStateManager.pushMatrix();
- GlStateManager.translate(popupRect.x, popupRect.y, 0);
-
- if (drawInv) {
- int startX = 81;
- int startY = 86;
- clip(scaledResolution, popupRect.x+startX-1, popupRect.y+startY-1, 164, 74);
- GlStateManager.translate(startX,startY,1);
- Gui.drawRect(-1,-1,163,73, 0xFF000000);
- GlStateManager.disableLighting();
- ItemStack toHover = null;
- int rx = relX - startX;
- int ry = relY - startY;
-
- if (playerProfile.get().getInventory() != null) {
- GlStateManager.disableRescaleNormal();
- RenderHelper.enableGUIStandardItemLighting();
- GlStateManager.disableLighting();
- for (int i = 0; i < playerProfile.get().getInventory().length; i++) {
- int x = (i%9) * 18;
- int y = (i/9) * 18;
- if (x <= rx && rx list = toHover.getTooltip(Minecraft.getMinecraft().thePlayer, Minecraft.getMinecraft().gameSettings.advancedItemTooltips);
- for (int i = 0; i < list.size(); ++i) {
- if (i == 0) {
- list.set(i, toHover.getRarity().rarityColor + list.get(i));
- } else {
- list.set(i, EnumChatFormatting.GRAY + list.get(i));
- }
- }
- FontRenderer font = toHover.getItem().getFontRenderer(toHover);
- GlStateManager.popMatrix();
- GL11.glDisable(GL11.GL_SCISSOR_TEST);
- FontRenderer theRenderer = (font == null ? fr : font);
- GuiUtils.drawHoveringText(list,mouseX, mouseY, scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), -1, theRenderer);
- GL11.glEnable(GL11.GL_SCISSOR_TEST);
- GlStateManager.pushMatrix();
- }
- } else {
- Gui.drawRect(0,0,162,72, 0xFF666666);
- fr.drawSplitString("Player has disabled Inventory API", 5,5, 142, -1);
- }
-
- }
- GL11.glDisable(GL11.GL_SCISSOR_TEST);
-
-
- GlStateManager.popMatrix(); // 33 66 108 130 154 // 5 75
- }
- @Override
- public void onMouseInput(GuiScreenEvent.MouseInputEvent.Pre mouseInputEvent) {
- ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
- int width = scaledResolution.getScaledWidth();
- int height = scaledResolution.getScaledHeight();
- int mouseX = Mouse.getX() * width / Minecraft.getMinecraft().displayWidth;
- int mouseY = height - Mouse.getY() * height / Minecraft.getMinecraft().displayHeight - 1;
-
- if (Mouse.getEventButton() != -1 && Mouse.isButtonDown(Mouse.getEventButton()) && drawInv) drawInv = false;
- if (popupRect == null || !popupRect.contains(mouseX, mouseY)) return;
-
- mouseInputEvent.setCanceled(true);
-
- int relX = mouseX - popupRect.x;
- int relY = mouseY - popupRect.y;
-
-
- try {
- PlayerProfile playerProfile = profileFuture.isDone() ? profileFuture.get().orElse(null) : null;
- if (playerProfile == null) return;
- if (Mouse.getEventButton() != -1 && Mouse.isButtonDown(Mouse.getEventButton())) {
- if (new Rectangle(2, 195, 86, 23).contains(relX, relY)) {
- // invite
- ChatProcessor.INSTANCE.addToChatQueue("/p invite " + ApiFetchur.fetchNicknameAsync(playerProfile.getMemberUID()).get().orElse("-"), () -> {}, true);
- } else if (new Rectangle(2, 170, 86, 23).contains(relX, relY)) {
- // kick
- ChatProcessor.INSTANCE.addToChatQueue("/p kick " + ApiFetchur.fetchNicknameAsync(playerProfile.getMemberUID()).get().orElse("-"), () -> {}, true);
- } else if (new Rectangle(80,159,10,11).contains(relX, relY)) {
- drawInv = true;
- }
- }
-
- } catch (InterruptedException | ExecutionException e) {
- }
-
-
- }
-
- public IChatComponent getHoveredComponent(ScaledResolution scaledResolution) {
- IChatComponent ichatcomponent = null;
- if (Loader.isModLoaded("hychat")) {
- try {
- ChatManager chatManager = HyChat.getInstance().getChatManager();
- GuiChatBox guiChatBox = chatManager.getFocusedChat();
-
- int x = guiChatBox.getX(scaledResolution);
- int y = guiChatBox.getY(scaledResolution);
- ichatcomponent = guiChatBox.chatArray.getHoveredComponent(guiChatBox.getSelectedTab().getChatLines(), Mouse.getX(), Mouse.getY(), x, y);
- } catch (Throwable t) {}
- }
- if (ichatcomponent == null) {
- ichatcomponent = Minecraft.getMinecraft().ingameGUI.getChatGUI().getChatComponent(Mouse.getX(), Mouse.getY());
- }
- return ichatcomponent;
- }
-
- @Override
- public void onChat(ClientChatReceivedEvent clientChatReceivedEvent) {
- if (!isEnabled()) return;
- String str = clientChatReceivedEvent.message.getFormattedText();
- if (str.contains("§r§ejoined the dungeon group! (§r§b")) {
- String username = TextUtils.stripColor(str).split(" ")[3];
- if (username.equalsIgnoreCase(Minecraft.getMinecraft().getSession().getUsername())) {
- PartyManager.INSTANCE.requestPartyList((context) -> {
- if (context == null) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §cBugged Dungeon Party "));
- } else {
-
- 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))))));
- }
- });
- }
- }
- });
- } else {
- ApiFetchur.fetchUUIDAsync(username)
- .thenAccept(a -> {
- if (a == null) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e"+username+"§f's Profile §cCouldn't fetch uuid"));
- return;
- }
- ApiFetchur.fetchMostRecentProfileAsync(a.get(), FeatureRegistry.PARTYKICKER_APIKEY.getAPIKey());
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e"+username+"§f's Profile ").appendSibling(new ChatComponentText("§7view").setChatStyle(new ChatStyle().setChatHoverEvent(new FeatureViewPlayerOnJoin.HoverEventRenderPlayer(a.orElse(null))))));
- });
- }
- }
- }
-
-
- public static class HoverEventRenderPlayer extends HoverEvent {
- @Getter
- private final String uuid;
- public HoverEventRenderPlayer(String uuid) {
- super(Action.SHOW_TEXT, new ChatComponentText(""));
- this.uuid = uuid;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- if (!super.equals(o)) return false;
- HoverEventRenderPlayer that = (HoverEventRenderPlayer) o;
- return Objects.equals(uuid, that.uuid);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(super.hashCode(), uuid);
- }
-
- private IChatComponent cached;
-
- @Override
- public IChatComponent getValue() {
- if (cached == null)
- return cached = new ChatComponentText("").setChatStyle(new ChatStyle().setChatHoverEvent(new HoverEvent(Action.SHOW_TEXT, new ChatComponentText(uuid))));
- return cached;
- }
- }
-
- public static class FakePlayer extends EntityOtherPlayerMP {
- @Setter
- @Getter
- private PlayerProfile skyblockProfile;
- private final SkinFetchur.SkinSet skinSet;
- private final PlayerProfile.Armor armor;
- private FakePlayer(World w) {
- super(w, null);
- throw new UnsupportedOperationException("what");
- }
- public FakePlayer(GameProfile playerProfile, SkinFetchur.SkinSet skinSet, PlayerProfile skyblockProfile) {
- super(Minecraft.getMinecraft().theWorld, playerProfile);
- this.skyblockProfile = skyblockProfile;
- this.skinSet = skinSet;
- armor= skyblockProfile.getCurrentArmor();
- this.inventory.armorInventory = skyblockProfile.getCurrentArmor().getArmorSlots();
-
- int highestDungeonScore = Integer.MIN_VALUE;
- if (skyblockProfile.getInventory() != null) {
- ItemStack highestItem = null;
- for (ItemStack itemStack : skyblockProfile.getInventory()) {
- if (itemStack == null) continue;
- NBTTagCompound display = itemStack.getTagCompound().getCompoundTag("display");
- if (display == null) continue;
- NBTTagList nbtTagList = display.getTagList("Lore", 8);
- if (nbtTagList == null) continue;
- for (int i = 0; i < nbtTagList.tagCount(); i++) {
- String str = nbtTagList.getStringTagAt(i);
- if (TextUtils.stripColor(str).startsWith("Gear")) {
- int dungeonScore = Integer.parseInt(TextUtils.keepIntegerCharactersOnly(TextUtils.stripColor(str).split(" ")[2]));
- if (dungeonScore > highestDungeonScore) {
- highestItem = itemStack;
- highestDungeonScore = dungeonScore;
- }
- }
- }
- }
-
- this.inventory.mainInventory[0] = highestItem;
- this.inventory.currentItem = 0;
- }
- }
-
- public String getSkinType() {
- return this.skinSet == null ? DefaultPlayerSkin.getSkinType(getGameProfile().getId()) : this.skinSet.getSkinType();
- }
-
- public ResourceLocation getLocationSkin() {
- return com.google.common.base.Objects.firstNonNull(skinSet.getSkinLoc(), DefaultPlayerSkin.getDefaultSkin(getGameProfile().getId()));
- }
-
- public ResourceLocation getLocationCape() {
- return skinSet.getCapeLoc();
- }
-
- @Override
- public ItemStack[] getInventory() {
- return this.inventory.armorInventory;
- }
-
- @Override
- public boolean isInvisibleToPlayer(EntityPlayer player) {
- return true;
- }
-
- @Override
- public Team getTeam() {
- return new ScorePlayerTeam(null, null) {
- @Override
- public EnumVisible getNameTagVisibility() {
- return EnumVisible.NEVER;
- }
- };
- }
- }
-
-
-
- @Override
- public String getEditRoute(RootConfigPanel rootConfigPanel) {
- ConfigPanelCreator.map.put("base." + getKey() , new Supplier() {
- @Override
- public MPanel get() {
-
- MFeatureEdit featureEdit = new MFeatureEdit(FeatureViewPlayerOnJoin.this, rootConfigPanel);
- featureEdit.addParameterEdit("datarenderers", new DataRendererEditor(FeatureViewPlayerOnJoin.this));
- for (FeatureParameter parameter: getParameters()) {
- if (parameter.getKey().equals("datarenderers")) continue;
- featureEdit.addParameterEdit(parameter.getKey(), new MParameterEdit(FeatureViewPlayerOnJoin.this, parameter, rootConfigPanel));
- }
- return featureEdit;
- }
- });
- return "base." + getKey() ;
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/FeatureViewPlayerStatsOnJoin.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/FeatureViewPlayerStatsOnJoin.java
new file mode 100644
index 00000000..74beb42f
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/FeatureViewPlayerStatsOnJoin.java
@@ -0,0 +1,703 @@
+/*
+ * 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.playerpreview;
+
+import com.mojang.authlib.GameProfile;
+import io.github.moulberry.hychat.HyChat;
+import io.github.moulberry.hychat.chat.ChatManager;
+import io.github.moulberry.hychat.gui.GuiChatBox;
+import kr.syeyoung.dungeonsguide.DungeonsGuide;
+import kr.syeyoung.dungeonsguide.chat.ChatProcessor;
+import kr.syeyoung.dungeonsguide.chat.PartyContext;
+import kr.syeyoung.dungeonsguide.chat.PartyManager;
+import kr.syeyoung.dungeonsguide.config.guiconfig.ConfigPanelCreator;
+import kr.syeyoung.dungeonsguide.config.guiconfig.MFeatureEdit;
+import kr.syeyoung.dungeonsguide.config.guiconfig.MParameterEdit;
+import kr.syeyoung.dungeonsguide.config.guiconfig.RootConfigPanel;
+import kr.syeyoung.dungeonsguide.cosmetics.ActiveCosmetic;
+import kr.syeyoung.dungeonsguide.cosmetics.CosmeticData;
+import kr.syeyoung.dungeonsguide.features.FeatureParameter;
+import kr.syeyoung.dungeonsguide.features.FeatureRegistry;
+import kr.syeyoung.dungeonsguide.features.SimpleFeature;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.ApiFetcher;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.PlayerSkyblockData;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.SkinFetcher;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.PlayerProfile;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.datarenders.DataRendererEditor;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.datarenders.DataRendererRegistry;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.datarenders.IDataRenderer;
+import kr.syeyoung.dungeonsguide.features.listener.ChatListener;
+import kr.syeyoung.dungeonsguide.features.listener.GuiClickListener;
+import kr.syeyoung.dungeonsguide.features.listener.GuiPostRenderListener;
+import kr.syeyoung.dungeonsguide.utils.TextUtils;
+import lombok.Getter;
+import lombok.Setter;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.gui.GuiChat;
+import net.minecraft.client.gui.ScaledResolution;
+import net.minecraft.client.gui.inventory.GuiInventory;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.client.renderer.RenderHelper;
+import net.minecraft.event.HoverEvent;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.util.ChatStyle;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.IChatComponent;
+import net.minecraftforge.client.event.ClientChatReceivedEvent;
+import net.minecraftforge.client.event.GuiScreenEvent;
+import net.minecraftforge.fml.client.config.GuiUtils;
+import net.minecraftforge.fml.common.Loader;
+import org.lwjgl.input.Mouse;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL14;
+
+import java.awt.*;
+import java.util.List;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+public class FeatureViewPlayerStatsOnJoin extends SimpleFeature implements GuiPostRenderListener, ChatListener, GuiClickListener {
+
+ public FeatureViewPlayerStatsOnJoin() {
+ super("Party", "View player stats when join", "view player rendering when joining/someone joins the party", "partykicker.viewstats", true);
+
+
+ this.parameters.put("datarenderers", new FeatureParameter>("datarenderers", "DataRenderers", "Datarenderssdasd", new ArrayList<>(Arrays.asList(
+ "catalv", "selected_class_lv", "dungeon_catacombs_higheststat", "dungeon_master_catacombs_higheststat", "skill_combat_lv", "skill_foraging_lv", "skill_mining_lv", "fairysouls", "dummy"
+ )), "stringlist"));
+
+
+
+
+ }
+
+
+ ChangeProfileWidget profileButtonWidget = new ChangeProfileWidget();
+
+ static Minecraft mc = Minecraft.getMinecraft();
+ protected Rectangle popupRect;
+ private String lastuid; // actually current uid
+ private CompletableFuture> profileFuture;
+ private Future> gameProfileFuture;
+ private Future skinFuture;
+ private FakePlayer fakePlayer;
+ private boolean shouldDraw = false;
+
+
+ @Override
+ public void onGuiPostRender(GuiScreenEvent.DrawScreenEvent.Post rendered) {
+ if (!(mc.currentScreen instanceof GuiChat)) {
+ cancelRender();
+ return;
+ }
+
+ ScaledResolution scaledResolution = new ScaledResolution(mc);
+
+ IChatComponent ichatcomponent = getHoveredComponent(scaledResolution);
+ String uid = null;
+ if (ichatcomponent != null && ichatcomponent.getChatStyle().getChatHoverEvent() instanceof HoverEventRenderPlayer) {
+ uid = ((HoverEventRenderPlayer) ichatcomponent.getChatStyle().getChatHoverEvent()).getUuid();
+ }
+
+ int width = scaledResolution.getScaledWidth();
+ int height = scaledResolution.getScaledHeight();
+ int mouseX = Mouse.getX() * width / mc.displayWidth;
+ int mouseY = height - Mouse.getY() * height / mc.displayHeight - 1;
+
+ shouldCancelRendering(uid, mouseX, mouseY);
+
+ if (lastuid == null) return;
+
+
+ if (popupRect == null) {
+ popupRect = new Rectangle(mouseX, mouseY, 220, 220);
+ if (popupRect.y + popupRect.height > scaledResolution.getScaledHeight()) {
+ popupRect.y -= popupRect.y + popupRect.height - scaledResolution.getScaledHeight();
+ }
+ }
+
+ if (profileFuture == null) {
+ profileFuture = ApiFetcher.fetchMostRecentProfileAsync(lastuid, FeatureRegistry.PARTYKICKER_APIKEY.getAPIKey());
+ }
+
+ if (gameProfileFuture == null) {
+ gameProfileFuture = ApiFetcher.getSkinGameProfileByUUIDAsync(lastuid);
+ }
+ boolean plsSetAPIKEY = false;
+ if (skinFuture == null && gameProfileFuture.isDone()) {
+ try {
+ skinFuture = SkinFetcher.getSkinSet(gameProfileFuture.get().orElse(null));
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+ }
+
+ try {
+ if (fakePlayer == null && skinFuture != null && profileFuture != null && skinFuture.isDone() && profileFuture.isDone() && profileFuture.get().isPresent()) {
+ if (profileButtonWidget.getCurrentrySelectedProfile(profileFuture.get().get()) != null) {
+ if (skinFuture.get() != null) {
+ profileButtonWidget.setCurrentyselectedprofile(profileFuture.get().get().getLastestprofileArrayIndex());
+ fakePlayer = new FakePlayer(gameProfileFuture.get().orElse(null), skinFuture.get(), profileButtonWidget.getCurrentrySelectedProfile(profileFuture.get().get()), profileButtonWidget.getCurrentyselectedprofile());
+ }
+ }
+ } else if (fakePlayer != null) {
+ if (fakePlayer.getProfileNumber() != profileButtonWidget.getCurrentyselectedprofile()) {
+ fakePlayer = new FakePlayer(gameProfileFuture.get().orElse(null), skinFuture.get(), profileButtonWidget.getCurrentrySelectedProfile(profileFuture.get().get()), profileButtonWidget.getCurrentyselectedprofile());
+ }
+ }
+ } catch (InterruptedException | ExecutionException e) {
+ plsSetAPIKEY = true;
+ }
+
+
+ Optional playerProfile;
+ if (plsSetAPIKEY || !profileFuture.isDone()) {
+ playerProfile = null;
+ } else {
+ PlayerSkyblockData data = null;
+ try {
+ data = profileFuture.get().get();
+ } catch (InterruptedException | ExecutionException e) {
+ throw new RuntimeException(e);
+ }
+ PlayerProfile currentlySelectedProfile = profileButtonWidget.getCurrentrySelectedProfile(data);
+ playerProfile = Optional.ofNullable(currentlySelectedProfile);
+ }
+
+
+ draw(scaledResolution, mouseX, mouseY, plsSetAPIKEY, playerProfile);
+ }
+
+
+ private void draw(ScaledResolution scaledResolution, int mouseX, int mouseY, boolean plsSetAPIKEY, Optional playerProfile) {
+ GlStateManager.pushMatrix();
+ GlStateManager.translate(popupRect.x, popupRect.y, 0);
+ int backroundGuiColor = 0xFF23272a;
+ Gui.drawRect(0, 0, popupRect.width, popupRect.height, backroundGuiColor);
+ Gui.drawRect(2, 2, popupRect.width - 2, popupRect.height - 2, 0XFF2c2f33);
+
+ GlStateManager.enableBlend();
+ GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ if (plsSetAPIKEY) {
+ mc.fontRendererObj.drawString("Please set API KEY on /dg -> Party Kicker", 5, 5, 0xFFFFFFFF);
+ GlStateManager.popMatrix();
+ } else if (playerProfile == null) {
+ mc.fontRendererObj.drawString("Fetching data...", 5, 5, 0xFFFFFFFF);
+ GlStateManager.popMatrix();
+ } else if (!playerProfile.isPresent()) {
+ mc.fontRendererObj.drawString("User could not be found", 5, 5, 0xFFFFFFFF);
+ GlStateManager.popMatrix();
+ } else {
+ int relX = mouseX - popupRect.x;
+ int relY = mouseY - popupRect.y;
+ FontRenderer fr = mc.fontRendererObj;
+ GL11.glEnable(GL11.GL_SCISSOR_TEST);
+ clip(scaledResolution, popupRect.x, popupRect.y, popupRect.width, popupRect.height);
+
+ Gui.drawRect(0, 168, 90, 195, backroundGuiColor);
+ Gui.drawRect(2, 170, 88, 193, new Rectangle(2, 170, 86, 23).contains(relX, relY) ? 0xFFff7777 : 0xFFFF3333);
+
+ Gui.drawRect(0, 193, 90, 220, backroundGuiColor);
+ Gui.drawRect(2, 195, 88, 218, new Rectangle(2, 195, 86, 23).contains(relX, relY) ? 0xFF859DF0 : 0xFF7289da);
+
+
+
+ GlStateManager.enableBlend();
+ GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ fr.drawString("Kick", (90 - fr.getStringWidth("Kick")) / 2, (364 - fr.FONT_HEIGHT) / 2, 0xFFFFFFFF);
+ fr.drawString("Invite", (90 - fr.getStringWidth("Invite")) / 2, (414 - fr.FONT_HEIGHT) / 2, 0xFFFFFFFF);
+
+ GlStateManager.pushMatrix();
+ GlStateManager.translate(95, 5, 0);
+ int culmutativeY = 5;
+ IDataRenderer dataRendererToHover = null;
+ for (String datarenderers : this.>getParameter("datarenderers").getValue()) {
+ GlStateManager.enableBlend();
+ GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ IDataRenderer dataRenderer = DataRendererRegistry.getDataRenderer(datarenderers);
+ Dimension dim;
+ if (dataRenderer == null) {
+ fr.drawString("Couldn't find Datarenderer", 0, 0, 0xFFFF0000);
+ fr.drawString(datarenderers, 0, fr.FONT_HEIGHT, 0xFFFF0000);
+ dim = new Dimension(0, fr.FONT_HEIGHT * 2);
+ } else {
+ GlStateManager.pushMatrix();
+ dim = dataRenderer.renderData(playerProfile.get());
+ GlStateManager.popMatrix();
+ }
+ if (relX >= 95 && relX <= popupRect.width && relY >= culmutativeY && relY < culmutativeY + dim.height && dataRenderer != null) {
+ dataRendererToHover = dataRenderer;
+ }
+ culmutativeY += dim.height;
+ GlStateManager.translate(0, dim.height, 0);
+ }
+ GlStateManager.popMatrix();
+ GlStateManager.enableBlend();
+ GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ Gui.drawRect(0, 0, 90, 170, backroundGuiColor);
+ Gui.drawRect(2, 2, 88, 168, 0xFF444444);
+
+ GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+
+ profileButtonWidget.drawChangeProfileButton(relX, relY);
+
+
+ Gui.drawRect(78, 156, 90, 170, backroundGuiColor);
+ fr.drawString("§eI", 82, 159, -1);
+
+
+
+ GlStateManager.color(1, 1, 1, 1.0F);
+ if (fakePlayer != null) {
+ drawFakePlayer(scaledResolution, mouseX, mouseY, playerProfile, relX, relY, fr);
+ } else {
+ GlStateManager.enableBlend();
+ GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ fr.drawString("Loading", 5, 35, 0xFFEFFF00);
+ }
+ GlStateManager.popMatrix();
+ GL11.glDisable(GL11.GL_SCISSOR_TEST);
+ if (dataRendererToHover != null && !shouldDraw) {
+ dataRendererToHover.onHover(playerProfile.get(), mouseX, mouseY);
+ }
+ GL11.glEnable(GL11.GL_SCISSOR_TEST);
+ GlStateManager.pushMatrix();
+ GlStateManager.translate(popupRect.x, popupRect.y, 0);
+ if (shouldDraw) {
+ int startX = 81;
+ int startY = 86;
+ clip(scaledResolution, popupRect.x + startX - 1, popupRect.y + startY - 1, 164, 74);
+ GlStateManager.translate(startX, startY, 1);
+ Gui.drawRect(-1, -1, 163, 73, 0xFF000000);
+ GlStateManager.disableLighting();
+ ItemStack toHover = null;
+ int rx = relX - startX;
+ int ry = relY - startY;
+
+ if (playerProfile.get().getInventory() != null) {
+ GlStateManager.disableRescaleNormal();
+ RenderHelper.enableGUIStandardItemLighting();
+ GlStateManager.disableLighting();
+ for (int i = 0; i < playerProfile.get().getInventory().length; i++) {
+ int x = (i % 9) * 18;
+ int y = (i / 9) * 18;
+ if (x <= rx && rx < x + 18 && y <= ry && ry < y + 18) {
+ toHover = playerProfile.get().getInventory()[(i + 9) % 36];
+ }
+ Gui.drawRect(x, y, x + 18, y + 18, 0xFF000000);
+ Gui.drawRect(x + 1, y + 1, x + 17, y + 17, 0xFF666666);
+ GlStateManager.color(1, 1, 1, 1.0F);
+
+ mc.getRenderItem().renderItemAndEffectIntoGUI(playerProfile.get().getInventory()[(i + 9) % 36], (i % 9) * 18 + 1, (i / 9) * 18 + 1);
+ }
+
+ if (toHover != null) {
+ drawItemStackToolTip(scaledResolution, mouseX, mouseY, fr, toHover);
+ }
+ } else {
+ Gui.drawRect(0, 0, 162, 72, 0xFF666666);
+ fr.drawSplitString("Player has disabled Inventory API", 5, 5, 142, -1);
+ }
+
+ }
+ GL11.glDisable(GL11.GL_SCISSOR_TEST);
+ GlStateManager.popMatrix(); // 33 66 108 130 154 // 5 75
+ }
+
+
+ }
+
+ private void drawFakePlayer(ScaledResolution scaledResolution, int mouseX, int mouseY, Optional playerProfile, int relX, int relY, FontRenderer fr) {
+ clip(scaledResolution, popupRect.x + 2, popupRect.y + 2, 86, 166);
+ GuiInventory.drawEntityOnScreen(45, 150, 60, -(mouseX - popupRect.x - 75), 0, fakePlayer);
+
+ String toDraw = fakePlayer.getName();
+ List activeCosmetics = DungeonsGuide.getDungeonsGuide().getCosmeticsManager().getActiveCosmeticByPlayer().get(UUID.fromString(TextUtils.insertDashUUID(playerProfile.get().getMemberUID())));
+ CosmeticData prefix = null;
+ CosmeticData color = null;
+ if (activeCosmetics != null) {
+ for (ActiveCosmetic activeCosmetic : activeCosmetics) {
+ CosmeticData cosmeticData = DungeonsGuide.getDungeonsGuide().getCosmeticsManager().getCosmeticDataMap().get(activeCosmetic.getCosmeticData());
+ if (cosmeticData != null) {
+ if (cosmeticData.getCosmeticType().equals("prefix")) prefix = cosmeticData;
+ if (cosmeticData.getCosmeticType().equals("color")) color = cosmeticData;
+ }
+ }
+ }
+ toDraw = (color == null ? "§e" : color.getData().replace("&", "§")) + toDraw;
+ if (prefix != null) toDraw = prefix.getData().replace("&", "§") + " " + toDraw;
+
+ GlStateManager.enableBlend();
+ GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+
+
+ String profileName = "on §6" + playerProfile.get().getProfileName();
+ fr.drawString(profileName, (90 - fr.getStringWidth(profileName)) / 2, 15, -1);
+
+
+ fr.drawString(toDraw, (90 - fr.getStringWidth(toDraw)) / 2, 10 - (fr.FONT_HEIGHT / 2), -1);
+
+ ItemStack toHover = null;
+ if (relX > 20 && relX < 70) {
+ if (33 <= relY && relY <= 66) {
+ toHover = fakePlayer.getInventory()[3];
+ } else if (66 <= relY && relY <= 108) {
+ toHover = fakePlayer.getInventory()[2];
+ } else if (108 <= relY && relY <= 130) {
+ toHover = fakePlayer.getInventory()[1];
+ } else if (130 <= relY && relY <= 154) {
+ toHover = fakePlayer.getInventory()[0];
+ }
+ } else if (relX > 0 && relX <= 20) {
+ if (80 <= relY && relY <= 120) {
+ toHover = fakePlayer.inventory.mainInventory[fakePlayer.inventory.currentItem];
+ }
+ }
+
+ if (toHover != null) {
+ drawItemStackToolTip(scaledResolution, mouseX, mouseY, fr, toHover);
+ GlStateManager.translate(popupRect.x, popupRect.y, 0);
+ }
+ clip(scaledResolution, popupRect.x, popupRect.y, popupRect.width, popupRect.height);
+ }
+
+ public void drawItemStackToolTip(ScaledResolution scaledResolution, int mouseX, int mouseY, FontRenderer fr, ItemStack toHover) {
+ List list = toHover.getTooltip(mc.thePlayer, mc.gameSettings.advancedItemTooltips);
+ for (int i = 0; i < list.size(); ++i) {
+ if (i == 0) {
+ list.set(i, toHover.getRarity().rarityColor + list.get(i));
+ } else {
+ list.set(i, EnumChatFormatting.GRAY + list.get(i));
+ }
+ }
+ FontRenderer font = toHover.getItem().getFontRenderer(toHover);
+ GlStateManager.popMatrix();
+ GL11.glDisable(GL11.GL_SCISSOR_TEST);
+ FontRenderer theRenderer = (font == null ? fr : font);
+ GuiUtils.drawHoveringText(list, mouseX, mouseY, scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), -1, theRenderer);
+ GL11.glEnable(GL11.GL_SCISSOR_TEST);
+ GlStateManager.pushMatrix();
+ }
+
+
+ class ChangeProfileWidget {
+ public ChangeProfileWidget(){
+ fr = Minecraft.getMinecraft().fontRendererObj;
+ stringWidth = fr.getStringWidth(buttonText);
+ textx = ((83 - stringWidth) / 2);
+ texty = (324 - fr.FONT_HEIGHT) / 2;
+ blockWidth = stringWidth + 3;
+ blockHeight = fr.FONT_HEIGHT + 2;
+ }
+
+ FontRenderer fr;
+
+ @Getter @Setter
+ int currentyselectedprofile = 0;
+
+ String buttonText = "Switch Profile";
+
+ int stringWidth;
+ int textx;
+ int texty;
+
+ int blockWidth;
+ int blockHeight;
+
+ void drawChangeProfileButton(float relX, float relY){
+
+ boolean contains = isWithinButtonRec(relX, relY);
+
+ Gui.drawRect(textx - 5, texty - 1, textx + blockWidth, texty + blockHeight, contains ? 0xFFFFFFFF : 0xFF30afd3);
+
+ fr.drawString(buttonText, textx, texty + 2, contains ? 0x30afd3 : 0xFFFFFF);
+ }
+
+
+ Rectangle getButtonRec(){
+ return new Rectangle(textx - 5, texty - 1, blockWidth, blockHeight);
+ }
+
+ boolean isWithinButtonRec(float relX, float relY){
+ return getButtonRec().contains(relX, relY);
+ }
+
+ long clickDeBounce = 0;
+ void handleClickProfileButton(PlayerSkyblockData playerData){
+
+ if(System.currentTimeMillis() <= clickDeBounce){
+ return;
+ } else {
+ clickDeBounce = System.currentTimeMillis() + 200;
+ }
+
+ ScaledResolution scaledResolution = new ScaledResolution(mc);
+ int width = scaledResolution.getScaledWidth();
+ int height = scaledResolution.getScaledHeight();
+ int mouseX = Mouse.getX() * width / mc.displayWidth;
+ int mouseY = height - Mouse.getY() * height / mc.displayHeight - 1;
+
+ int relX = mouseX - popupRect.x;
+ int relY = mouseY - popupRect.y;
+
+ if (isWithinButtonRec(relX, relY)) {
+ if (profileButtonWidget.currentyselectedprofile + 1 >= playerData.getPlayerProfiles().length) {
+ profileButtonWidget.currentyselectedprofile = 0;
+ } else {
+ profileButtonWidget.currentyselectedprofile++;
+ }
+ }
+ }
+
+ PlayerProfile getCurrentrySelectedProfile(PlayerSkyblockData data) {
+ if (data == null) return null;
+ if (data.getPlayerProfiles() == null) return null;
+ if (data.getPlayerProfiles().length == 0) return null;
+ if (data.getPlayerProfiles().length < currentyselectedprofile) return null;
+ return data.getPlayerProfiles()[currentyselectedprofile];
+ }
+ }
+
+
+
+
+ private void shouldCancelRendering(String uid, int mouseX, int mouseY) {
+ if (!((popupRect != null && (popupRect.contains(mouseX, mouseY) || shouldDraw)) || uid != null && uid.equals(lastuid))) {
+ cancelRender();
+ }
+
+ if (uid != null && !uid.equals(lastuid) && (popupRect==null || (!popupRect.contains(mouseX, mouseY) && !shouldDraw)) ) {
+ cancelRender();
+ lastuid = uid;
+ }
+ }
+
+ public void cancelRender() {
+ popupRect = null;
+ profileFuture = null;
+ lastuid = null;
+ gameProfileFuture = null;
+ skinFuture = null;
+ fakePlayer = null;
+ shouldDraw = false;
+ }
+
+
+ public static void clip(ScaledResolution resolution, int x, int y, int width, int height) {
+ if (width < 0 || height < 0) return;
+
+ int scale = resolution.getScaleFactor();
+ GL11.glScissor((x) * scale, mc.displayHeight - (y + height) * scale, (width) * scale, height * scale);
+ }
+
+ @Override
+ public void onMouseInput(GuiScreenEvent.MouseInputEvent.Pre mouseInputEvent) {
+ ScaledResolution scaledResolution = new ScaledResolution(mc);
+ int width = scaledResolution.getScaledWidth();
+ int height = scaledResolution.getScaledHeight();
+ int mouseX = Mouse.getX() * width / mc.displayWidth;
+ int mouseY = height - Mouse.getY() * height / mc.displayHeight - 1;
+
+ if (Mouse.getEventButton() != -1 && Mouse.isButtonDown(Mouse.getEventButton()) && shouldDraw) shouldDraw = false;
+ if (popupRect == null || !popupRect.contains(mouseX, mouseY)) return;
+
+ mouseInputEvent.setCanceled(true);
+
+ int relX = mouseX - popupRect.x;
+ int relY = mouseY - popupRect.y;
+
+ try {
+ PlayerSkyblockData playerData;
+
+ if (profileFuture.isDone()) {
+ playerData = profileFuture.get().orElse(null);
+ } else {
+ return;
+ }
+
+ if (playerData == null) {
+ return;
+ }
+
+ if (Mouse.getEventButton() == -1 && !Mouse.isButtonDown(Mouse.getEventButton())) return;
+
+ if (new Rectangle(2, 195, 86, 23).contains(relX, relY)) {
+ // invite
+ ChatProcessor.INSTANCE.addToChatQueue("/p invite " + ApiFetcher.fetchNicknameAsync(profileButtonWidget.getCurrentrySelectedProfile(playerData).getMemberUID()).get().orElse("-"), () -> {
+ }, true);
+ }
+
+ else if (new Rectangle(2, 170, 86, 23).contains(relX, relY)) {
+ // kick
+ ChatProcessor.INSTANCE.addToChatQueue("/p kick " + ApiFetcher.fetchNicknameAsync(profileButtonWidget.getCurrentrySelectedProfile(playerData).getMemberUID()).get().orElse("-"), () -> {
+ }, true);
+ }
+
+
+
+ else if (new Rectangle(80, 159, 10, 11).contains(relX, relY)) {
+ shouldDraw = true;
+ }
+
+
+ this.profileButtonWidget.handleClickProfileButton(playerData);
+
+
+
+ } catch (InterruptedException | ExecutionException e) {
+ }
+
+
+ }
+
+
+
+ public IChatComponent getHoveredComponent(ScaledResolution scaledResolution) {
+ IChatComponent ichatcomponent = null;
+ if (Loader.isModLoaded("hychat")) {
+ try {
+ ChatManager chatManager = HyChat.getInstance().getChatManager();
+ GuiChatBox guiChatBox = chatManager.getFocusedChat();
+
+ int x = guiChatBox.getX(scaledResolution);
+ int y = guiChatBox.getY(scaledResolution);
+ ichatcomponent = guiChatBox.chatArray.getHoveredComponent(guiChatBox.getSelectedTab().getChatLines(), Mouse.getX(), Mouse.getY(), x, y);
+ } catch (Throwable t) {}
+ }
+ if (ichatcomponent == null) {
+ ichatcomponent = Minecraft.getMinecraft().ingameGUI.getChatGUI().getChatComponent(Mouse.getX(), Mouse.getY());
+ }
+ return ichatcomponent;
+
+// return Minecraft.getMinecraft().ingameGUI.getChatGUI().getChatComponent(Mouse.getX(), Mouse.getY());
+ }
+
+ @Override
+ public void onChat(ClientChatReceivedEvent event) {
+ if (!isEnabled()) return;
+ String str = event.message.getFormattedText();
+ if (str.contains("§r§ejoined the dungeon group! (§r§b")) {
+ String username = TextUtils.stripColor(str).split(" ")[3];
+ if (username.equalsIgnoreCase(mc.getSession().getUsername())) {
+ PartyManager.INSTANCE.requestPartyList(context -> {
+ if (context == null) {
+ mc.thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §cBugged Dungeon Party "));
+ } else {
+ processPartyMembers(context);
+ }
+ });
+ } else {
+ ApiFetcher.fetchUUIDAsync(username)
+ .thenAccept(a -> {
+ if (a == null) {
+ mc.thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e" + username + "§f's Profile §cCouldn't fetch uuid"));
+ return;
+ }
+ ApiFetcher.fetchMostRecentProfileAsync(a.get(), FeatureRegistry.PARTYKICKER_APIKEY.getAPIKey());
+ mc.thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e" + username + "§f's Profile ").appendSibling(new ChatComponentText("§7view").setChatStyle(new ChatStyle().setChatHoverEvent(new FeatureViewPlayerStatsOnJoin.HoverEventRenderPlayer(a.orElse(null))))));
+ });
+ }
+ }
+ }
+
+ public static void processPartyMembers(PartyContext context) {
+ for (String member : context.getPartyRawMembers()) {
+ ApiFetcher.fetchUUIDAsync(member)
+ .thenAccept(a -> {
+ if (a == null) {
+ mc.thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e" + member + "§f's Profile §cCouldn't fetch uuid"));
+ } else {
+ ApiFetcher.fetchMostRecentProfileAsync(a.get(), FeatureRegistry.PARTYKICKER_APIKEY.getAPIKey());
+ mc.thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e" + member + "§f's Profile ").appendSibling(new ChatComponentText("§7view").setChatStyle(new ChatStyle().setChatHoverEvent(new HoverEventRenderPlayer(a.orElse(null))))));
+ }
+ });
+ }
+ }
+
+
+ public static class HoverEventRenderPlayer extends HoverEvent {
+ @Getter
+ private final String uuid;
+
+ public HoverEventRenderPlayer(String uuid) {
+ super(Action.SHOW_TEXT, new ChatComponentText(""));
+ this.uuid = uuid;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ if (!super.equals(o)) return false;
+ HoverEventRenderPlayer that = (HoverEventRenderPlayer) o;
+ return Objects.equals(uuid, that.uuid);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), uuid);
+ }
+
+ private IChatComponent cached;
+
+ @Override
+ public IChatComponent getValue() {
+ if (cached == null) {
+ cached = new ChatComponentText("")
+ .setChatStyle(
+ new ChatStyle()
+ .setChatHoverEvent(
+ new HoverEvent(
+ Action.SHOW_TEXT,
+ new ChatComponentText(uuid)
+ )
+ )
+ );
+ return cached;
+ }
+ return cached;
+ }
+ }
+
+
+ @Override
+ public String getEditRoute(RootConfigPanel rootConfigPanel) {
+ ConfigPanelCreator.map.put("base." + getKey(), () -> {
+
+ MFeatureEdit featureEdit = new MFeatureEdit(FeatureViewPlayerStatsOnJoin.this, rootConfigPanel);
+ featureEdit.addParameterEdit("datarenderers", new DataRendererEditor(FeatureViewPlayerStatsOnJoin.this));
+ for (FeatureParameter parameter : getParameters()) {
+ if (parameter.getKey().equals("datarenderers")) continue;
+ featureEdit.addParameterEdit(parameter.getKey(), new MParameterEdit(FeatureViewPlayerStatsOnJoin.this, parameter, rootConfigPanel));
+ }
+ return featureEdit;
+ });
+ return "base." + getKey();
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/ApiFetcher.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/ApiFetcher.java
new file mode 100644
index 00000000..c11bc404
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/ApiFetcher.java
@@ -0,0 +1,387 @@
+/*
+ * 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.playerpreview.api;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.mojang.authlib.GameProfile;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.PlayerProfile;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.PlayerProfileParser;
+import kr.syeyoung.dungeonsguide.utils.TextUtils;
+import net.minecraft.client.Minecraft;
+import org.apache.commons.io.IOUtils;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+public class ApiFetcher {
+
+ private ApiFetcher(){}
+
+ 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();
+ PlayerProfileParser.constants = null;
+
+ ex.submit(PlayerProfileParser::getLilyWeightConstants);
+ }
+
+ static {
+ ex.submit(PlayerProfileParser::getLilyWeightConstants);
+ }
+
+ public static JsonObject getJson(String url) throws IOException {
+ URLConnection connection = new URL(url).openConnection();
+ connection.setConnectTimeout(10000);
+ connection.setReadTimeout(10000);
+ InputStreamReader inputStreamReader = new InputStreamReader(connection.getInputStream());
+ String serverres = IOUtils.toString(inputStreamReader);
+ return gson.fromJson(serverres, 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 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 = fetchPlayerProfiles(uid, apiKey);
+ playerProfileCache.put(uid, new CachedData<>(System.currentTimeMillis() + 1000 * 60 * 30, playerProfile.orElse(null)));
+ completableFuture.complete(playerProfile);
+ completableFutureMap.remove(uid);
+ } 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 Optional getNumberOfSecretsFromAchievement(String uid, String apiKey) throws IOException {
+ JsonObject responce = getJson("https://api.hypixel.net/player?uuid=" + uid + "&key=" + apiKey);
+ if (responce.has("player")) {
+ JsonObject treasures = responce.getAsJsonObject("player");
+ if (treasures.has("achievements")) {
+ treasures = treasures.getAsJsonObject("achievements");
+ if (treasures.has("skyblock_treasure_hunter")) {
+ return Optional.of(treasures.get("skyblock_treasure_hunter").getAsInt());
+ }
+ }
+ }
+ return Optional.empty();
+ }
+
+
+ public static int getArrayIndex(Object[] arr,Object value) {
+ int k=0;
+ for(int i=0;i fetchPlayerProfiles(String uid, String apiKey) throws IOException {
+ System.out.println("Featching player profiles");
+ JsonObject json = getJson("https://api.hypixel.net/skyblock/profiles?uuid=" + uid + "&key=" + apiKey);
+ if (!json.get("success").getAsBoolean()) return Optional.empty();
+ System.out.println("Downloaded data from api");
+ JsonArray profiles = json.getAsJsonArray("profiles");
+ String dashTrimmed = uid.replace("-", "");
+
+
+ PlayerSkyblockData pp = new PlayerSkyblockData();
+ ArrayList playerProfiles = new ArrayList<>();
+ System.out.println("Saving and parsing data");
+ float lastSave = Long.MIN_VALUE;
+ PlayerProfile lastest = null;
+ for (JsonElement jsonElement : profiles) {
+ JsonObject semiProfile = jsonElement.getAsJsonObject();
+ if (!semiProfile.get("members").getAsJsonObject().has(dashTrimmed)) {
+ System.out.println("Profile does not appear to have the player???");
+ continue;
+ }
+
+ System.out.println("Parsing profile");
+ PlayerProfile e = PlayerProfileParser.parseProfile(semiProfile, dashTrimmed);
+
+ System.out.println("Finished Parsing Profile");
+
+
+ System.out.println("Getting nm of secrets from achivment");
+ getNumberOfSecretsFromAchievement(uid, apiKey).ifPresent(e::setTotalSecrets);
+ System.out.println("finished getting secrets from achivment");
+
+
+ System.out.println("Gettign last save");
+ JsonElement last_save = semiProfile.get("last_save");
+ if(last_save != null){
+ float lastSave2 = last_save.getAsLong();
+ if (lastSave2 > lastSave) {
+ lastest = e;
+ lastSave = lastSave2;
+ }
+ }
+ System.out.println("Finished getting last save");
+
+ playerProfiles.add(e);
+ }
+ System.out.println("THE AMMOUT OF PLAYER PROFILES: " + playerProfiles.size());
+ PlayerProfile[] p = new PlayerProfile[playerProfiles.size()];
+ pp.setLastestprofileArrayIndex(getArrayIndex(p, lastest));
+ pp.setPlayerProfiles(playerProfiles.toArray(p));
+ return Optional.of(pp);
+ }
+
+ 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;
+ float lastSave = Long.MIN_VALUE;
+ for (JsonElement jsonElement : profiles) {
+ JsonObject semiProfile = jsonElement.getAsJsonObject();
+ if (!semiProfile.getAsJsonObject("members").has(dashTrimmed)) {
+ continue;
+ }
+ JsonElement last_save = semiProfile.get("last_save");
+
+ JsonElement cute_name = semiProfile.get("cute_name");
+ if (cute_name != null) {
+ System.out.println(cute_name.getAsString());
+ } else {
+ System.out.println("THIS SHOULD NOT HAPPEN");
+ }
+
+ if (last_save == null) {
+ return Optional.empty();
+ }
+ float lastSave2 = last_save.getAsLong();
+ if (lastSave2 > lastSave) {
+
+ profile = semiProfile;
+ lastSave = lastSave2;
+ }
+ }
+
+
+ if (profile == null) {
+ return Optional.empty();
+ }
+
+ PlayerProfile pp = PlayerProfileParser.parseProfile(profile, dashTrimmed);
+
+ getNumberOfSecretsFromAchievement(uid, apiKey).ifPresent(pp::setTotalSecrets);
+
+ return Optional.of(pp);
+ }
+
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/CachedData.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/CachedData.java
new file mode 100644
index 00000000..e3a98eaa
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/CachedData.java
@@ -0,0 +1,29 @@
+/*
+ * 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.playerpreview.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/playerpreview/api/PlayerSkyblockData.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/PlayerSkyblockData.java
new file mode 100644
index 00000000..72b28e61
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/PlayerSkyblockData.java
@@ -0,0 +1,10 @@
+package kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api;
+
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.PlayerProfile;
+import lombok.Data;
+
+@Data
+public class PlayerSkyblockData {
+ PlayerProfile[] playerProfiles;
+ int lastestprofileArrayIndex;
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/SkinFetcher.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/SkinFetcher.java
new file mode 100644
index 00000000..5d9afa4a
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/SkinFetcher.java
@@ -0,0 +1,90 @@
+/*
+ * 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.playerpreview.api;
+
+import com.mojang.authlib.GameProfile;
+import com.mojang.authlib.minecraft.MinecraftProfileTexture;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.resources.DefaultPlayerSkin;
+import net.minecraft.client.resources.SkinManager;
+import net.minecraft.util.ResourceLocation;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class SkinFetcher {
+
+ private SkinFetcher(){}
+
+ private static final Map> skinSetMap = new ConcurrentHashMap<>();
+
+ private static final Map> currentReq = new HashMap<>();
+
+ public static CompletableFuture getSkinSet(GameProfile gameProfile) {
+ if (gameProfile == null) {
+ return CompletableFuture.completedFuture(new SkinSet(DefaultPlayerSkin.getDefaultSkinLegacy(), null, "default"));
+ }
+ if (skinSetMap.containsKey(gameProfile.getId().toString())) {
+ CachedData ss = skinSetMap.get(gameProfile.getId().toString());
+ if (ss.getExpire() > System.currentTimeMillis())
+ CompletableFuture.completedFuture(skinSetMap.get(gameProfile.getId().toString()).getData());
+ skinSetMap.remove(gameProfile.getId().toString());
+ }
+ if (currentReq.containsKey(gameProfile.getId().toString()))
+ return currentReq.get(gameProfile.getId().toString());
+
+ SkinSet skinSet = new SkinSet();
+ CompletableFuture skinSet2 = new CompletableFuture<>();
+ currentReq.put(gameProfile.getId().toString(), skinSet2);
+ Minecraft.getMinecraft().getSkinManager().loadProfileTextures(gameProfile, new SkinManager.SkinAvailableCallback() {
+ public void skinAvailable(MinecraftProfileTexture.Type p_180521_1_, ResourceLocation location, MinecraftProfileTexture profileTexture) {
+ switch (p_180521_1_) {
+ case SKIN:
+ skinSet.setSkinLoc(location);
+ skinSet.setSkinType(profileTexture.getMetadata("model"));
+ if (skinSet.getSkinType() == null) {
+ skinSet.setSkinType("default");
+ }
+ skinSet2.complete(skinSet);
+ skinSetMap.put(gameProfile.getId().toString(), new CachedData<>(System.currentTimeMillis() + 1000*60*60*3, skinSet));
+ currentReq.get(gameProfile.getId().toString());
+ break;
+ case CAPE:
+ skinSet.setCapeLoc(location);
+ }
+ }
+ }, true);
+
+ return skinSet2;
+ }
+
+ @Data
+ @NoArgsConstructor
+ @AllArgsConstructor
+ public static class SkinSet {
+ private ResourceLocation skinLoc;
+ private ResourceLocation capeLoc;
+ private String skinType;
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/PlayerProfile.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/PlayerProfile.java
new file mode 100644
index 00000000..95cd000f
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/PlayerProfile.java
@@ -0,0 +1,92 @@
+/*
+ * 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.playerpreview.api.playerprofile;
+
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.*;
+import lombok.Data;
+import net.minecraft.item.ItemStack;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class PlayerProfile {
+ private String profileUID;
+ private String memberUID;
+ private String profileName;
+
+ private long lastSave;
+
+ private int fairySouls;
+ private int fairyExchanges;
+
+ private Armor currentArmor;
+ private List wardrobe = new ArrayList<>();
+ private int selectedWardrobe = -1;
+
+ private ItemStack[] inventory;
+ private ItemStack[] enderchest;
+ private ItemStack[] talismans;
+
+ private int totalSecrets;
+
+ @Data
+ public static class Armor {
+ private final ItemStack[] armorSlots = new ItemStack[4];
+
+ public ItemStack getHelmet() { return armorSlots[3]; }
+ public ItemStack getChestPlate() { return armorSlots[2]; }
+ public ItemStack getLeggings() { return armorSlots[1]; }
+ public ItemStack getBoots() { return armorSlots[0]; }
+ }
+
+ private Map> dungeonStats = new HashMap<>();
+
+ private Map> playerClassData = new HashMap<>();
+ private DungeonClass selectedClass;
+ @Data
+ public static class PlayerClassData {
+ private double experience;
+ }
+
+ private Map skillXp;
+
+ private List pets = new ArrayList<>();
+
+
+ private Map additionalProperties = new HashMap<>();
+
+ private LilyWeight lilyWeight;
+
+ @Data
+ public static class LilyWeight {
+ private double skill_base;
+ private double skill_overflow;
+ private double catacombs_base;
+ private double catacombs_master;
+ private double catacombs_exp;
+ private double slayer;
+
+ public double getTotal() {
+ return skill_base + skill_overflow + catacombs_base + catacombs_exp + catacombs_master + slayer;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/PlayerProfileParser.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/PlayerProfileParser.java
new file mode 100644
index 00000000..b19e1e36
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/PlayerProfileParser.java
@@ -0,0 +1,449 @@
+package kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonNull;
+import com.google.gson.JsonObject;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.ApiFetcher;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.*;
+import kr.syeyoung.dungeonsguide.utils.XPUtils;
+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 java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.function.BiFunction;
+import java.util.stream.Collectors;
+
+public class PlayerProfileParser {
+
+ public static volatile JsonObject constants;
+
+ public static JsonObject getLilyWeightConstants() {
+ if (constants != null) return constants;
+ try {
+ JsonObject jsonObject = ApiFetcher.getJson("https://raw.githubusercontent.com/Antonio32A/lilyweight/master/lib/constants.json");
+ constants = jsonObject;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ return constants;
+ }
+
+ 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/playerpreview/api/playerprofile/dataclasses/ClassSpecificData.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/ClassSpecificData.java
new file mode 100644
index 00000000..3496f3a9
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/ClassSpecificData.java
@@ -0,0 +1,29 @@
+/*
+ * 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.playerpreview.api.playerprofile.dataclasses;
+
+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/playerpreview/api/playerprofile/dataclasses/DungeonClass.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonClass.java
new file mode 100644
index 00000000..fc569b57
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonClass.java
@@ -0,0 +1,46 @@
+/*
+ * 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.playerpreview.api.playerprofile.dataclasses;
+
+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/playerpreview/api/playerprofile/dataclasses/DungeonSpecificData.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonSpecificData.java
new file mode 100644
index 00000000..05975767
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonSpecificData.java
@@ -0,0 +1,29 @@
+/*
+ * 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.playerpreview.api.playerprofile.dataclasses;
+
+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/playerpreview/api/playerprofile/dataclasses/DungeonStat.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonStat.java
new file mode 100644
index 00000000..be42a509
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonStat.java
@@ -0,0 +1,54 @@
+/*
+ * 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.playerpreview.api.playerprofile.dataclasses;
+
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+public class DungeonStat {
+ private int highestCompleted;
+ private double experience;
+
+ private Map> plays = new HashMap<>();
+ @Data
+ public static class PlayedFloor {
+ private int times_played;
+ private int completions;
+ private int watcherKills;
+
+ private int fastestTime;
+ private int fastestTimeS;
+ private int fastestTimeSPlus;
+ private int bestScore;
+
+ private int mostMobsKilled;
+ private int mobsKilled;
+
+ private Map> classStatistics = new HashMap<>();
+ @Data
+ public static class ClassStatistics {
+ private double mostDamage;
+ }
+
+ private double mostHealing;
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonType.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonType.java
new file mode 100644
index 00000000..a394214d
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonType.java
@@ -0,0 +1,39 @@
+/*
+ * 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.playerpreview.api.playerprofile.dataclasses;
+
+import com.google.common.collect.Sets;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Set;
+
+@Getter
+@AllArgsConstructor
+public enum DungeonType {
+ CATACOMBS("catacombs", "The Catacombs",
+ Sets.newHashSet(0,1,2,3,4,5,6,7)),
+ MASTER_CATACOMBS("master_catacombs", "MasterMode Catacombs", Sets.newHashSet(
+ 1,2,3,4,5,6
+ ));
+
+ private final String jsonName;
+ private final String familiarName;
+ private final Set validFloors ;
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/FloorSpecificData.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/FloorSpecificData.java
new file mode 100644
index 00000000..e31d5034
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/FloorSpecificData.java
@@ -0,0 +1,29 @@
+/*
+ * 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.playerpreview.api.playerprofile.dataclasses;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public class FloorSpecificData {
+ private final int floor;
+ private final T data;
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/Pet.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/Pet.java
new file mode 100644
index 00000000..40f15e49
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/Pet.java
@@ -0,0 +1,31 @@
+/*
+ * 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.playerpreview.api.playerprofile.dataclasses;
+
+import lombok.Data;
+
+@Data
+public class Pet {
+ private String uuid;
+ private String type;
+ private double exp;
+ private boolean active;
+ private String heldItem;
+ private String skin;
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/Skill.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/Skill.java
new file mode 100644
index 00000000..4ccc1e2d
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/Skill.java
@@ -0,0 +1,31 @@
+/*
+ * 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.playerpreview.api.playerprofile.dataclasses;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum Skill {
+ RUNECRAFTING("runecrafting", "Runecrafting"), COMBAT("combat", "Combat"), MINING("mining", "Mining"), ALCHEMY("alchemy", "Alchemy"), FARMING("farming", "Farming"), TAMING("taming", "Taming"), ENCHANTING("enchanting", "Enchanting"), FISHING("fishing", "Fishing"), FORAGING("foraging", "Foraging"), CARPENTRY("carpentry", "Carpentry");
+
+ private final String jsonName;
+ private final String friendlyName;
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/DataRendererEditor.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/DataRendererEditor.java
new file mode 100644
index 00000000..02ab6ea1
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/DataRendererEditor.java
@@ -0,0 +1,357 @@
+/*
+ * 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.playerpreview.datarenders;
+
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.FeatureViewPlayerStatsOnJoin;
+import kr.syeyoung.dungeonsguide.gui.MPanel;
+import kr.syeyoung.dungeonsguide.utils.RenderUtils;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.gui.ScaledResolution;
+import net.minecraft.client.renderer.GlStateManager;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL14;
+
+import java.awt.*;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class DataRendererEditor extends MPanel {
+ private final FeatureViewPlayerStatsOnJoin feature;
+
+ public DataRendererEditor(FeatureViewPlayerStatsOnJoin featureViewPlayerStatsOnJoin) {
+ this.feature = featureViewPlayerStatsOnJoin;
+ }
+
+ @Override
+ public void resize(int parentWidth, int parentHeight) {
+ this.setBounds(new Rectangle(5,5,parentWidth-10, 260));
+ }
+
+ private String currentlySelected;
+ private int selectedX;
+ private int selectedY;
+ private int lastX;
+ private int lastY;
+ private int scrollY;
+ private final int baseWidth = 120;
+ private final int hamburgerWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth("==");
+
+ @Override
+ public void render(int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks, Rectangle scissor) {
+ Gui.drawRect(0,0,getBounds().width, getBounds().height, RenderUtils.blendAlpha(0x141414, 0.12f));
+
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ ScaledResolution sr = new ScaledResolution(Minecraft.getMinecraft());
+
+
+ GlStateManager.enableBlend();
+ GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ fr.drawString("Available", (310 + baseWidth + hamburgerWidth -fr.getStringWidth("Available")) / 2, 4, 0xFFFFFFFF);
+ fr.drawString("Current", (baseWidth + hamburgerWidth+10 -fr.getStringWidth("Current")) /2 , 4, 0xFFFFFFFF);
+ Gui.drawRect(4,4 + fr.FONT_HEIGHT + 3,baseWidth + hamburgerWidth+6 + 1, 236+ fr.FONT_HEIGHT + 3, 0xFF222222);
+ Gui.drawRect(5,5+ fr.FONT_HEIGHT + 3,baseWidth + hamburgerWidth + 5 + 1, 235+ fr.FONT_HEIGHT + 3, RenderUtils.blendAlpha(0x141414, 0.15f));
+ Gui.drawRect(5 + hamburgerWidth,4+ fr.FONT_HEIGHT + 3,6 + hamburgerWidth, 236+ fr.FONT_HEIGHT + 3, 0xFF222222);
+
+ Gui.drawRect(154,4 + fr.FONT_HEIGHT + 3,150 + baseWidth + hamburgerWidth + 6+1, 236+ fr.FONT_HEIGHT + 3, 0xFF222222);
+ Gui.drawRect(155,5+ fr.FONT_HEIGHT + 3,150 + baseWidth + hamburgerWidth + 5+1, 235+ fr.FONT_HEIGHT + 3, RenderUtils.blendAlpha(0x141414, 0.15f));
+ Gui.drawRect(155 + hamburgerWidth,4 + fr.FONT_HEIGHT + 3,156 + hamburgerWidth, 236+ fr.FONT_HEIGHT + 3, 0xFF222222);
+
+ GlStateManager.pushMatrix();
+ clip(scissor.x + 6+hamburgerWidth, scissor.y + 5+fr.FONT_HEIGHT+3, baseWidth, 230);
+ GlStateManager.translate(6+hamburgerWidth, 5+fr.FONT_HEIGHT+3, 0);
+ int culmutativeY = 0;
+ int relSelectedY = selectedY - (5+ fr.FONT_HEIGHT + 3);
+ boolean drewit = false;
+ for (String datarenderers : feature.>getParameter("datarenderers").getValue()) {
+
+ if (0 <= selectedX && selectedX <= hamburgerWidth+11 && currentlySelected != null) {
+ IDataRenderer dataRenderer = DataRendererRegistry.getDataRenderer(currentlySelected);
+ Dimension dim;
+ if (dataRenderer == null) dim = new Dimension(0,fr.FONT_HEIGHT*2);
+ else dim = dataRenderer.getDimension();
+
+ if (culmutativeY + dim.height > relSelectedY && relSelectedY >= culmutativeY && !drewit) {
+ clip(scissor.x + 6 + hamburgerWidth, scissor.y + 5+fr.FONT_HEIGHT+3, baseWidth, 230);
+ GlStateManager.enableBlend();
+ GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ if (dataRenderer == null) {
+ fr.drawString("Couldn't find Datarenderer", 0,0, 0xFFFF0000);
+ fr.drawString(currentlySelected, 0,fr.FONT_HEIGHT, 0xFFFF0000);
+ dim = new Dimension(0, fr.FONT_HEIGHT * 2);
+ } else {
+ GlStateManager.pushMatrix();
+ dim = dataRenderer.renderDummy();
+ GlStateManager.popMatrix();
+ }
+ clip(scissor.x, scissor.y, scissor.width, scissor.height);
+ GlStateManager.translate(-hamburgerWidth-1, 0, 0);
+ Gui.drawRect(0,0, hamburgerWidth, dim.height-1, 0xFF777777);
+ GlStateManager.enableBlend();
+ GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ fr.drawString("=",fr.getStringWidth("=")/2,(dim.height - fr.FONT_HEIGHT) / 2, 0xFFFFFFFF);
+ GlStateManager.translate(hamburgerWidth+1,dim.height,0);
+ drewit = true;
+ }
+ }
+
+ IDataRenderer dataRenderer = DataRendererRegistry.getDataRenderer(datarenderers);
+ clip(scissor.x + 6 + hamburgerWidth, scissor.y + 5+fr.FONT_HEIGHT+3, baseWidth, 230);
+ Dimension dim;
+
+ GlStateManager.enableBlend();
+ GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ if (dataRenderer == null) {
+ fr.drawString("Couldn't find Datarenderer", 0,0, 0xFFFF0000);
+ fr.drawString(datarenderers, 0,fr.FONT_HEIGHT, 0xFFFF0000);
+ dim = new Dimension(0, fr.FONT_HEIGHT * 2);
+ } else {
+ GlStateManager.pushMatrix();
+ dim = dataRenderer.renderDummy();
+ GlStateManager.popMatrix();
+ }
+ clip(scissor.x, scissor.y, scissor.width, scissor.height);
+ GlStateManager.translate(-hamburgerWidth-1, 0, 0);
+ Gui.drawRect(0,0, hamburgerWidth, dim.height-1, 0xFFAAAAAA);
+ GlStateManager.enableBlend();
+ GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ fr.drawString("=",fr.getStringWidth("=")/2,(dim.height - fr.FONT_HEIGHT) / 2, 0xFFFFFFFF);
+ GlStateManager.translate(hamburgerWidth+1,dim.height,0);
+
+ culmutativeY += dim.height;
+ }
+
+ if (currentlySelected != null && new Rectangle(0,5+fr.FONT_HEIGHT + 3, hamburgerWidth+11, 232).contains(selectedX, selectedY) && !drewit) {
+ IDataRenderer dataRenderer = DataRendererRegistry.getDataRenderer(currentlySelected);
+ Dimension dim;
+ clip(scissor.x + 6 + hamburgerWidth, scissor.y + 5+fr.FONT_HEIGHT+3, baseWidth, 230);
+ GlStateManager.enableBlend();
+ GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ if (dataRenderer == null) {
+ fr.drawString("Couldn't find Datarenderer", 0,0, 0xFFFF0000);
+ fr.drawString(currentlySelected, 0,fr.FONT_HEIGHT, 0xFFFF0000);
+ dim = new Dimension(0, fr.FONT_HEIGHT * 2);
+ } else {
+ GlStateManager.pushMatrix();
+ dim = dataRenderer.renderDummy();
+ GlStateManager.popMatrix();
+ }
+ clip(scissor.x, scissor.y, scissor.width, scissor.height);
+ GlStateManager.translate(-hamburgerWidth-1, 0, 0);
+ Gui.drawRect(0,0, hamburgerWidth, dim.height-1, 0xFF777777);
+ GlStateManager.enableBlend();
+ GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ fr.drawString("=",fr.getStringWidth("=")/2,(dim.height - fr.FONT_HEIGHT) / 2, 0xFFFFFFFF);
+ GlStateManager.translate(hamburgerWidth+1,dim.height,0);
+ }
+ GlStateManager.popMatrix();
+
+
+ GlStateManager.pushMatrix();
+ GlStateManager.translate(156+hamburgerWidth, 5+fr.FONT_HEIGHT+3 - scrollY, 0);
+
+ Set rest = new HashSet<>(DataRendererRegistry.getValidDataRenderer());
+ rest.removeAll( feature.>getParameter("datarenderers").getValue());
+ rest.remove(currentlySelected);
+ for (String datarenderers : rest) {
+ IDataRenderer dataRenderer = DataRendererRegistry.getDataRenderer(datarenderers);
+ clip(scissor.x + 156 + hamburgerWidth, scissor.y + 5+fr.FONT_HEIGHT+3, baseWidth, 230);
+ Dimension dim;
+ GlStateManager.enableBlend();
+ GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ if (dataRenderer == null) {
+ fr.drawString("Couldn't find Datarenderer", 0,0, 0xFFFF0000);
+ fr.drawString(datarenderers, 0,fr.FONT_HEIGHT, 0xFFFF0000);
+ dim = new Dimension(0, fr.FONT_HEIGHT * 2);
+ } else {
+ GlStateManager.pushMatrix();
+ dim = dataRenderer.renderDummy();
+ GlStateManager.popMatrix();
+ }
+ clip(scissor.x + 155, scissor.y + 5+fr.FONT_HEIGHT+3, hamburgerWidth, 230);
+ GlStateManager.translate(-hamburgerWidth-1, 0, 0);
+ Gui.drawRect(0,0, hamburgerWidth, dim.height-1, 0xFFAAAAAA);
+ GlStateManager.enableBlend();
+ GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ fr.drawString("=",fr.getStringWidth("=")/2,(dim.height - fr.FONT_HEIGHT) / 2, 0xFFFFFFFF);
+ GlStateManager.translate(hamburgerWidth+1,dim.height,0);
+ }
+ GlStateManager.popMatrix();
+ clip(0,0,sr.getScaledWidth(), sr.getScaledHeight());
+ {
+ if (currentlySelected != null) {
+ GlStateManager.pushMatrix();
+ GlStateManager.translate(selectedX+hamburgerWidth+1, selectedY, 0);
+ IDataRenderer dataRenderer = DataRendererRegistry.getDataRenderer(currentlySelected);
+ Dimension dim;
+ GlStateManager.enableBlend();
+ GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ if (dataRenderer == null) {
+ fr.drawString("Couldn't find Datarenderer", 0, 0, 0xFFFF0000);
+ fr.drawString(currentlySelected, 0, fr.FONT_HEIGHT, 0xFFFF0000);
+ dim = new Dimension(0, fr.FONT_HEIGHT * 2);
+ } else {
+ GlStateManager.pushMatrix();
+ dim = dataRenderer.renderDummy();
+ GlStateManager.popMatrix();
+ }
+ GlStateManager.translate(-hamburgerWidth-1, 0, 0);
+ Gui.drawRect(0,0, hamburgerWidth, dim.height-1, 0xFFAAAAAA);
+ GlStateManager.enableBlend();
+ GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ fr.drawString("=",fr.getStringWidth("=")/2,(dim.height - fr.FONT_HEIGHT) / 2, 0xFFFFFFFF);
+ GlStateManager.popMatrix();
+ }
+ }
+ clip(scissor.x, scissor.y, scissor.width, scissor.height);
+ }
+
+ @Override
+ public void mouseClicked(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int mouseButton) {
+ super.mouseClicked(absMouseX, absMouseY, relMouseX, relMouseY, mouseButton);
+ lastX = relMouseX;
+ lastY = relMouseY;
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ int legitRelY = relMouseY - (5+fr.FONT_HEIGHT+3);
+ if (new Rectangle(155,5+fr.FONT_HEIGHT + 3, hamburgerWidth, 230).contains(relMouseX, relMouseY)) {
+ Set rest = new HashSet<>(DataRendererRegistry.getValidDataRenderer());
+ rest.removeAll( feature.>getParameter("datarenderers").getValue());
+ rest.remove(currentlySelected);
+ int culmutativeY = -scrollY;
+ for (String datarenderers : rest) {
+ IDataRenderer dataRenderer = DataRendererRegistry.getDataRenderer(datarenderers);
+ Dimension dim;
+ if (dataRenderer == null) {
+ dim = new Dimension(0, fr.FONT_HEIGHT * 2);
+ } else {
+ GlStateManager.pushMatrix();
+ dim = dataRenderer.getDimension();
+ GlStateManager.popMatrix();
+ }
+ culmutativeY += dim.height;
+
+ if (legitRelY < culmutativeY) {
+ currentlySelected = datarenderers;
+ selectedX = 155;
+ selectedY = culmutativeY - dim.height + 5+fr.FONT_HEIGHT + 3;
+ break;
+ }
+ }
+ }
+ if (new Rectangle(5,5+fr.FONT_HEIGHT + 3, hamburgerWidth, 230).contains(relMouseX, relMouseY)) {
+ List rest = feature.>getParameter("datarenderers").getValue();
+ int culmutativeY = 0;
+ for (String datarenderers : rest) {
+ IDataRenderer dataRenderer = DataRendererRegistry.getDataRenderer(datarenderers);
+ Dimension dim;
+ if (dataRenderer == null) {
+ dim = new Dimension(0, fr.FONT_HEIGHT * 2);
+ } else {
+ GlStateManager.pushMatrix();
+ dim = dataRenderer.getDimension();
+ GlStateManager.popMatrix();
+ }
+ culmutativeY += dim.height;
+
+ if (legitRelY < culmutativeY) {
+ currentlySelected = datarenderers;
+ selectedX = 5;
+ selectedY = culmutativeY - dim.height + 5+fr.FONT_HEIGHT + 3;
+ rest.remove(datarenderers);
+ break;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void mouseClickMove(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int clickedMouseButton, long timeSinceLastClick) {
+ super.mouseClickMove(absMouseX, absMouseY, relMouseX, relMouseY, clickedMouseButton, timeSinceLastClick);
+ if (currentlySelected != null) {
+ int dx = relMouseX - lastX;
+ int dy = relMouseY - lastY;
+ selectedX += dx;
+ selectedY += dy;
+ }
+ lastX = relMouseX;
+ lastY = relMouseY;
+ }
+
+ @Override
+ public void mouseReleased(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int state) {
+ super.mouseReleased(absMouseX, absMouseY, relMouseX, relMouseY, state);
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ int legitRelY = selectedY - (5+fr.FONT_HEIGHT+3);
+ if (currentlySelected != null && new Rectangle(0,5+fr.FONT_HEIGHT + 3, hamburgerWidth+11, 232).contains(selectedX, selectedY)) {
+ Set rest = new HashSet<>(DataRendererRegistry.getValidDataRenderer());
+ int culmutativeY = 0;
+ List asdasdkasd = feature.>getParameter("datarenderers").getValue();
+ int index = asdasdkasd.size();
+ for (int i = 0; i 0) scrollY -= 20;
+ if (scrollY < 0) scrollY = 0;
+
+
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/DataRendererRegistry.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/DataRendererRegistry.java
new file mode 100644
index 00000000..b2187511
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/DataRendererRegistry.java
@@ -0,0 +1,64 @@
+/*
+ * 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.playerpreview.datarenders;
+
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.DungeonClass;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.DungeonType;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.Skill;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.datarenders.impl.*;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+public class DataRendererRegistry {
+ private static final Map dataRendererMap = new HashMap<>();
+
+ public static IDataRenderer getDataRenderer(String id) {
+ return dataRendererMap.get(id);
+ }
+
+ public static Set getValidDataRenderer() {
+ return dataRendererMap.keySet();
+ }
+
+ static {
+ dataRendererMap.put("catalv", new DataRendererDungeonLv(DungeonType.CATACOMBS));
+ for (DungeonClass value : DungeonClass.values()) {
+ dataRendererMap.put("class_"+value.getJsonName()+"_lv", new DataRendererClassLv(value));
+ }
+ dataRendererMap.put("selected_class_lv", new DataRendererSelectedClassLv());
+ for (Skill value : Skill.values()) {
+ dataRendererMap.put("skill_"+value.getJsonName()+"_lv", new DataRendererSkillLv(value));
+ }
+ for (DungeonType value : DungeonType.values()) {
+ for (Integer validFloor : value.getValidFloors()) {
+ dataRendererMap.put("dungeon_"+value.getJsonName()+"_"+validFloor+"_stat", new DataRenderDungeonFloorStat(value, validFloor));
+ }
+ dataRendererMap.put("dungeon_"+value.getJsonName()+"_higheststat", new DataRenderDungeonHighestFloorStat(value));
+ }
+ dataRendererMap.put("fairysouls", new DataRendererFairySouls());
+ dataRendererMap.put("secrets", new DataRendererSecrets());
+
+ dataRendererMap.put("dummy", new DataRendererSetUrOwn());
+
+ dataRendererMap.put("talismans", new DataRendererTalismans());
+ dataRendererMap.put("weight", new DataRendererLilyWeight());
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/IDataRenderer.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/IDataRenderer.java
new file mode 100644
index 00000000..3f2d0ad2
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/IDataRenderer.java
@@ -0,0 +1,33 @@
+/*
+ * 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.playerpreview.datarenders;
+
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.PlayerProfile;
+
+import java.awt.*;
+
+public interface IDataRenderer {
+ Dimension renderData(PlayerProfile playerProfile);
+ void onHover(PlayerProfile playerProfile, int mouseX, int mouseY);
+
+
+ Dimension renderDummy();
+
+ Dimension getDimension();
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonFloorStat.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonFloorStat.java
new file mode 100644
index 00000000..f2cf4a38
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonFloorStat.java
@@ -0,0 +1,105 @@
+/*
+ * 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.playerpreview.datarenders.impl;
+
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.datarenders.IDataRenderer;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.PlayerProfile;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.DungeonSpecificData;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.DungeonStat;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.DungeonType;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.FloorSpecificData;
+import kr.syeyoung.dungeonsguide.utils.TextUtils;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.gui.ScaledResolution;
+import net.minecraftforge.fml.client.config.GuiUtils;
+
+import java.awt.*;
+import java.util.Arrays;
+
+public class DataRenderDungeonFloorStat implements IDataRenderer {
+ private final DungeonType dungeonType;
+ private final int floor;
+ public DataRenderDungeonFloorStat(DungeonType dungeonType, int floor) {
+ this.dungeonType = dungeonType;
+ this.floor = floor;
+ }
+
+ @Override
+ public Dimension renderData(PlayerProfile playerProfile) {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ String floorName = (dungeonType == DungeonType.CATACOMBS ? "F" : "M") + floor;
+
+ boolean flag = false;
+ DungeonSpecificData dungeonStatDungeonSpecificData = playerProfile.getDungeonStats().get(dungeonType);
+ if (dungeonStatDungeonSpecificData != null) {
+ FloorSpecificData playedFloorFloorSpecificData = dungeonStatDungeonSpecificData.getData().getPlays().get(floor);
+ if (playedFloorFloorSpecificData != null) {
+ flag = true;
+ fr.drawString("§b" + floorName + " §a" + playedFloorFloorSpecificData.getData().getBestScore() + " §f" + playedFloorFloorSpecificData.getData().getCompletions() + "§7/§f" + playedFloorFloorSpecificData.getData().getWatcherKills() + "§7/§f" + playedFloorFloorSpecificData.getData().getTimes_played() + " §7(" + (int) (playedFloorFloorSpecificData.getData().getCompletions()*100 / (double) playedFloorFloorSpecificData.getData().getWatcherKills()) + "%)", 0, 0, -1);
+ fr.drawString("§6S+ §e" + (playedFloorFloorSpecificData.getData().getFastestTimeSPlus() != -1 ? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTimeSPlus()) : "§7N/A") + " §6S §e" + (playedFloorFloorSpecificData.getData().getFastestTimeS() != -1 ? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTimeS()) : "§7N/A"), 0, fr.FONT_HEIGHT, -1);
+ }
+ }
+ if (!flag) {
+ fr.drawString("§cNo Stat for "+floorName, 0,0,-1);
+ }
+
+ return getDimension();
+ }
+
+ @Override
+ public Dimension renderDummy() {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ String floorName = (dungeonType == DungeonType.CATACOMBS ? "F" : "M") + floor;
+
+
+ fr.drawString("§b"+floorName+" §a305 §f10§7/§f35§7/§f50 §7("+(int)(1000.0/35.0)+"%)", 0,0,-1);
+ fr.drawString("§6S+ §e10m 53s §6S §e15m 13s", 0, fr.FONT_HEIGHT, -1);
+ return getDimension();
+ }
+
+ @Override
+ public Dimension getDimension() {
+ return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT*2);
+ }
+
+ @Override
+ public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
+
+ DungeonSpecificData dungeonStatDungeonSpecificData = playerProfile.getDungeonStats().get(dungeonType);
+ if (dungeonStatDungeonSpecificData == null) return;
+ FloorSpecificData playedFloorFloorSpecificData = dungeonStatDungeonSpecificData.getData().getPlays().get(floor);
+ if (playedFloorFloorSpecificData == null) return;
+ String floorName = (dungeonType == DungeonType.CATACOMBS ? "F" : "M") + floor;
+
+ ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
+ GuiUtils.drawHoveringText(Arrays.asList(
+ "§bFloor "+floorName,
+ "§bBest Score§7: §f"+playedFloorFloorSpecificData.getData().getBestScore(),
+ "§bTotal Completions§7: §f"+playedFloorFloorSpecificData.getData().getCompletions(),
+ "§bTotal Watcher kills§7: §f"+playedFloorFloorSpecificData.getData().getWatcherKills(),
+ "§bTotal Runs§7: §f"+playedFloorFloorSpecificData.getData().getTimes_played(),
+ "§bFastest S+§7: §f"+(playedFloorFloorSpecificData.getData().getFastestTimeSPlus() != -1? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTimeSPlus()) : "§7N/A"),
+ "§bFastest S§7: §f"+(playedFloorFloorSpecificData.getData().getFastestTimeS() != -1? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTimeS()) : "§7N/A"),
+ "§bFastest Run§7: §f"+(playedFloorFloorSpecificData.getData().getFastestTime() != -1? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTime()) : "§7N/A"),
+ "§bMost Mobs Killed§7: §f"+playedFloorFloorSpecificData.getData().getMostMobsKilled(),
+ "§bTotal Mobs Killed§7: §f"+playedFloorFloorSpecificData.getData().getMobsKilled()
+ ), mouseX, mouseY, scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), -1, Minecraft.getMinecraft().fontRendererObj);
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonHighestFloorStat.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonHighestFloorStat.java
new file mode 100644
index 00000000..8daba7eb
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonHighestFloorStat.java
@@ -0,0 +1,107 @@
+/*
+ * 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.playerpreview.datarenders.impl;
+
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.datarenders.IDataRenderer;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.PlayerProfile;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.DungeonSpecificData;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.DungeonStat;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.DungeonType;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.FloorSpecificData;
+import kr.syeyoung.dungeonsguide.utils.TextUtils;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.gui.ScaledResolution;
+import net.minecraftforge.fml.client.config.GuiUtils;
+
+import java.awt.*;
+import java.util.Arrays;
+
+public class DataRenderDungeonHighestFloorStat implements IDataRenderer {
+ private final DungeonType dungeonType;
+ public DataRenderDungeonHighestFloorStat(DungeonType dungeonType) {
+ this.dungeonType = dungeonType;
+ }
+
+ @Override
+ public Dimension renderData(PlayerProfile playerProfile) {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+
+ boolean flag = false;
+ DungeonSpecificData dungeonStatDungeonSpecificData = playerProfile.getDungeonStats().get(dungeonType);
+ if (dungeonStatDungeonSpecificData != null) {
+ if (dungeonStatDungeonSpecificData.getData().getHighestCompleted() != -1) {
+ FloorSpecificData playedFloorFloorSpecificData = dungeonStatDungeonSpecificData.getData().getPlays().get(dungeonStatDungeonSpecificData.getData().getHighestCompleted());
+ String floorName = (dungeonType == DungeonType.CATACOMBS ? "F" : "M") + dungeonStatDungeonSpecificData.getData().getHighestCompleted();
+ if (playedFloorFloorSpecificData != null) {
+ flag = true;
+ fr.drawString("§bH: " + floorName + " §a" + playedFloorFloorSpecificData.getData().getBestScore() + " §f" + playedFloorFloorSpecificData.getData().getCompletions() + "§7/§f" + playedFloorFloorSpecificData.getData().getWatcherKills() + "§7/§f" + playedFloorFloorSpecificData.getData().getTimes_played() + " §7(" + (int) (playedFloorFloorSpecificData.getData().getCompletions() *100/ (double) playedFloorFloorSpecificData.getData().getWatcherKills()) + "%)", 0, 0, -1);
+ fr.drawString("§6S+ §e" + (playedFloorFloorSpecificData.getData().getFastestTimeSPlus() != -1 ? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTimeSPlus()) : "§7N/A") + " §6S §e" + (playedFloorFloorSpecificData.getData().getFastestTimeS() != -1 ? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTimeS()) : "§7N/A"), 0, fr.FONT_HEIGHT, -1);
+ }
+ }
+ }
+ if (!flag) {
+ fr.drawString("§cNo Highest Floor for ", 0,0,-1);
+ fr.drawString("§c"+dungeonType.getFamiliarName(), 0,fr.FONT_HEIGHT,-1);
+ }
+
+ return getDimension();
+ }
+
+ @Override
+ public Dimension renderDummy() {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ String floorName = (dungeonType == DungeonType.CATACOMBS ? "F" : "M") + "9";
+
+
+ fr.drawString("§bH: "+floorName+" §a305 §f10§7/§f35§7/§f50 §7("+(int)(1000.0/35.0)+"%)", 0,0,-1);
+ fr.drawString("§6S+ §e10m 53s §6S §e15m 13s", 0, fr.FONT_HEIGHT, -1);
+ return getDimension();
+ }
+
+ @Override
+ public Dimension getDimension() {
+ return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT*2);
+ }
+
+ @Override
+ public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
+
+ DungeonSpecificData dungeonStatDungeonSpecificData = playerProfile.getDungeonStats().get(dungeonType);
+ if (dungeonStatDungeonSpecificData == null) return;
+ if (dungeonStatDungeonSpecificData.getData().getHighestCompleted() == -1) return;
+ FloorSpecificData playedFloorFloorSpecificData = dungeonStatDungeonSpecificData.getData().getPlays().get( dungeonStatDungeonSpecificData.getData().getHighestCompleted());
+ if (playedFloorFloorSpecificData == null) return;
+ String floorName = (dungeonType == DungeonType.CATACOMBS ? "F" : "M") + dungeonStatDungeonSpecificData.getData().getHighestCompleted();
+
+ ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
+ GuiUtils.drawHoveringText(Arrays.asList(
+ "§bFloor "+floorName,
+ "§bBest Score§7: §f"+playedFloorFloorSpecificData.getData().getBestScore(),
+ "§bTotal Completions§7: §f"+playedFloorFloorSpecificData.getData().getCompletions(),
+ "§bTotal Watcher kills§7: §f"+playedFloorFloorSpecificData.getData().getWatcherKills(),
+ "§bTotal Runs§7: §f"+playedFloorFloorSpecificData.getData().getTimes_played(),
+ "§bFastest S+§7: §f"+(playedFloorFloorSpecificData.getData().getFastestTimeSPlus() != -1? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTimeSPlus()) : "§7N/A"),
+ "§bFastest S§7: §f"+(playedFloorFloorSpecificData.getData().getFastestTimeS() != -1? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTimeS()) : "§7N/A"),
+ "§bFastest Run§7: §f"+(playedFloorFloorSpecificData.getData().getFastestTime() != -1? TextUtils.formatTime(playedFloorFloorSpecificData.getData().getFastestTime()) : "§7N/A"),
+ "§bMost Mobs Killed§7: §f"+playedFloorFloorSpecificData.getData().getMostMobsKilled(),
+ "§bTotal Mobs Killed§7: §f"+playedFloorFloorSpecificData.getData().getMobsKilled()
+ ), mouseX, mouseY, scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), -1, Minecraft.getMinecraft().fontRendererObj);
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererClassLv.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererClassLv.java
new file mode 100644
index 00000000..8a798eee
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererClassLv.java
@@ -0,0 +1,88 @@
+/*
+ * 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.playerpreview.datarenders.impl;
+
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.datarenders.IDataRenderer;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.PlayerProfile;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.ClassSpecificData;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.DungeonClass;
+import kr.syeyoung.dungeonsguide.utils.RenderUtils;
+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.ScaledResolution;
+import net.minecraftforge.fml.client.config.GuiUtils;
+
+import java.awt.*;
+import java.util.Arrays;
+
+public class DataRendererClassLv implements IDataRenderer {
+ private final DungeonClass dungeonClass;
+ public DataRendererClassLv(DungeonClass dungeonClass) {
+ this.dungeonClass = dungeonClass;
+ }
+ @Override
+ public Dimension renderData(PlayerProfile playerProfile) {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ ClassSpecificData dungeonStatDungeonSpecificData = playerProfile.getPlayerClassData().get(dungeonClass);
+ boolean selected = playerProfile.getSelectedClass() == dungeonClass;
+ if (dungeonStatDungeonSpecificData == null) {
+ fr.drawString(dungeonClass.getFamilarName(), 0,0, 0xFF55ffff);
+ fr.drawString("Unknown", fr.getStringWidth(dungeonClass.getFamilarName()+" "),0,0xFFFFFFFF);
+ if (selected)
+ fr.drawString("★", fr.getStringWidth(dungeonClass.getFamilarName()+" Unknown "),0,0xFFAAAAAA);
+ } else {
+ XPUtils.XPCalcResult xpCalcResult = XPUtils.getCataXp(dungeonStatDungeonSpecificData.getData().getExperience());
+ fr.drawString(dungeonClass.getFamilarName(), 0,0, 0xFF55ffff);
+ fr.drawString(xpCalcResult.getLevel()+"", fr.getStringWidth(dungeonClass.getFamilarName()+" "),0,0xFFFFFFFF);
+ if (selected)
+ fr.drawString("★", fr.getStringWidth(dungeonClass.getFamilarName()+" "+xpCalcResult.getLevel()+" "),0,0xFFAAAAAA);
+
+ RenderUtils.renderBar(0, fr.FONT_HEIGHT, 100,xpCalcResult.getRemainingXp() == 0 ? 1 : (float) (xpCalcResult.getRemainingXp() / xpCalcResult.getNextLvXp()));
+ }
+
+ return new Dimension(100, fr.FONT_HEIGHT*2);
+ }
+
+ @Override
+ public Dimension renderDummy() {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ fr.drawString(dungeonClass.getFamilarName(), 0,0, 0xFF55ffff);
+ fr.drawString("99", fr.getStringWidth(dungeonClass.getFamilarName()+" "),0,0xFFFFFFFF);
+ fr.drawString("★", fr.getStringWidth(dungeonClass.getFamilarName()+" 99 "),0,0xFFAAAAAA);
+ RenderUtils.renderBar(0, fr.FONT_HEIGHT, 100,1.0f);
+ return new Dimension(100, fr.FONT_HEIGHT*2);
+ }
+ @Override
+ public Dimension getDimension() {
+ return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT*2);
+ }
+
+ @Override
+ public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
+ ClassSpecificData dungeonStatDungeonSpecificData = playerProfile.getPlayerClassData().get(dungeonClass);
+ if (dungeonStatDungeonSpecificData == null) return;
+ XPUtils.XPCalcResult xpCalcResult = XPUtils.getCataXp(dungeonStatDungeonSpecificData.getData().getExperience());
+ ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
+
+ GuiUtils.drawHoveringText(Arrays.asList("§bCurrent Lv§7: §e"+xpCalcResult.getLevel(),"§bExp§7: §e"+ TextUtils.format((long)xpCalcResult.getRemainingXp()) + "§7/§e"+TextUtils.format((long)xpCalcResult.getNextLvXp()), "§bTotal Xp§7: §e"+ TextUtils.format((long)dungeonStatDungeonSpecificData.getData().getExperience())),mouseX, mouseY,
+ scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), -1, Minecraft.getMinecraft().fontRendererObj);
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererDungeonLv.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererDungeonLv.java
new file mode 100644
index 00000000..5cc37fa6
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererDungeonLv.java
@@ -0,0 +1,82 @@
+/*
+ * 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.playerpreview.datarenders.impl;
+
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.DungeonSpecificData;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.DungeonStat;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.DungeonType;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.PlayerProfile;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.datarenders.IDataRenderer;
+import kr.syeyoung.dungeonsguide.utils.RenderUtils;
+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.ScaledResolution;
+import net.minecraftforge.fml.client.config.GuiUtils;
+
+import java.awt.*;
+import java.util.Arrays;
+
+public class DataRendererDungeonLv implements IDataRenderer {
+ private final DungeonType dungeonType;
+ public DataRendererDungeonLv(DungeonType dungeonType) {
+ this.dungeonType = dungeonType;
+ }
+ @Override
+ public Dimension renderData(PlayerProfile playerProfile) {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ DungeonSpecificData dungeonStatDungeonSpecificData = playerProfile.getDungeonStats().get(dungeonType);
+ if (dungeonStatDungeonSpecificData == null) {
+ fr.drawString(dungeonType.getFamiliarName(), 0,0, 0xFFFF5555);
+ fr.drawString("Unknown", fr.getStringWidth(dungeonType.getFamiliarName()+" "),0,0xFFFFFFFF);
+ } else {
+ XPUtils.XPCalcResult xpCalcResult = XPUtils.getCataXp(dungeonStatDungeonSpecificData.getData().getExperience());
+ fr.drawString(dungeonType.getFamiliarName(), 0,0, 0xFFFF5555);
+ fr.drawString(xpCalcResult.getLevel()+"", fr.getStringWidth(dungeonType.getFamiliarName()+" "),0,0xFFFFFFFF);
+
+ RenderUtils.renderBar(0, fr.FONT_HEIGHT, 100,xpCalcResult.getRemainingXp() == 0 ? 1 : (float) (xpCalcResult.getRemainingXp() / xpCalcResult.getNextLvXp()));
+ }
+
+ return new Dimension(100, fr.FONT_HEIGHT*2);
+ }
+
+ @Override
+ public Dimension renderDummy() {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ fr.drawString(dungeonType.getFamiliarName(), 0,0, 0xFFFF5555);
+ fr.drawString("99", fr.getStringWidth(dungeonType.getFamiliarName()+" "),0,0xFFFFFFFF);
+ RenderUtils.renderBar(0, fr.FONT_HEIGHT, 100,1.0f);
+ return new Dimension(100, fr.FONT_HEIGHT*2);
+ }
+ @Override
+ public Dimension getDimension() {
+ return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT*2);
+ }
+
+ @Override
+ public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
+ DungeonSpecificData dungeonStatDungeonSpecificData = playerProfile.getDungeonStats().get(dungeonType);
+ if (dungeonStatDungeonSpecificData == null) return;
+ XPUtils.XPCalcResult xpCalcResult = XPUtils.getCataXp(dungeonStatDungeonSpecificData.getData().getExperience());
+ ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
+ GuiUtils.drawHoveringText(Arrays.asList("§bCurrent Lv§7: §e"+xpCalcResult.getLevel(),"§bExp§7: §e"+TextUtils.format((long)xpCalcResult.getRemainingXp()) + "§7/§e"+TextUtils.format((long)xpCalcResult.getNextLvXp()), "§bTotal Xp§7: §e"+ TextUtils.format((long)dungeonStatDungeonSpecificData.getData().getExperience())),mouseX, mouseY,
+ scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), -1, Minecraft.getMinecraft().fontRendererObj);
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererFairySouls.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererFairySouls.java
new file mode 100644
index 00000000..5b8f4d8e
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererFairySouls.java
@@ -0,0 +1,50 @@
+/*
+ * 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.playerpreview.datarenders.impl;
+
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.PlayerProfile;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.datarenders.IDataRenderer;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.FontRenderer;
+
+import java.awt.*;
+
+public class DataRendererFairySouls implements IDataRenderer {
+ @Override
+ public Dimension renderData(PlayerProfile playerProfile) {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ fr.drawString("§eFairy Souls §f"+playerProfile.getFairySouls(), 0,0,-1);
+ return new Dimension(100, fr.FONT_HEIGHT);
+ }
+
+ @Override
+ public Dimension renderDummy() {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ fr.drawString("§eFairy Souls §f300", 0,0,-1);
+ return new Dimension(100, fr.FONT_HEIGHT);
+ }
+ @Override
+ public Dimension getDimension() {
+ return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT);
+ }
+
+ @Override
+ public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererLilyWeight.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererLilyWeight.java
new file mode 100644
index 00000000..ef57f955
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererLilyWeight.java
@@ -0,0 +1,71 @@
+/*
+ * 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.playerpreview.datarenders.impl;
+
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.PlayerProfile;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.datarenders.IDataRenderer;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.gui.ScaledResolution;
+import net.minecraftforge.fml.client.config.GuiUtils;
+
+import java.awt.*;
+import java.util.Arrays;
+
+public class DataRendererLilyWeight implements IDataRenderer {
+ @Override
+ public Dimension renderData(PlayerProfile playerProfile) {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ if (playerProfile.getLilyWeight() == null)
+ fr.drawString("§eLily Weight §cAPI DISABLED", 0,0,-1);
+ else
+ fr.drawString("§eLily Weight §b"+String.format("%.3f", playerProfile.getLilyWeight().getTotal()), 0,0,-1);
+ return new Dimension(100, fr.FONT_HEIGHT);
+ }
+
+ @Override
+ public Dimension renderDummy() {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ fr.drawString("§eLily Weight §b300", 0,0,-1);
+ return new Dimension(100, fr.FONT_HEIGHT);
+ }
+ @Override
+ public Dimension getDimension() {
+ return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT);
+ }
+
+ @Override
+ public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
+ PlayerProfile.LilyWeight lilyWeight= playerProfile.getLilyWeight();
+ if (lilyWeight == null) return;
+ ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
+ GuiUtils.drawHoveringText(Arrays.asList(
+ "§bDungeon Weights§7: §e"+ String.format("%.3f",lilyWeight.getCatacombs_base()+lilyWeight.getCatacombs_master()+lilyWeight.getCatacombs_exp()),
+ " §bCatacomb Completion§7: §e"+String.format("%.3f",lilyWeight.getCatacombs_base()),
+ " §bMaster Completion§7: §e"+String.format("%.3f", lilyWeight.getCatacombs_master()),
+ " §bExperience§7: §e"+String.format("%.3f", lilyWeight.getCatacombs_exp()),
+ "§bSkill Weights§7: §e"+ String.format("%.3f", lilyWeight.getSkill_base() + lilyWeight.getSkill_overflow()),
+ " §bSkill Weight§7: §e"+String.format("%.3f", lilyWeight.getSkill_base()),
+ " §bOverflow Weight§7: §e"+String.format("%.3f", lilyWeight.getSkill_overflow()),
+ "§bSlayer Weight§7: §e"+String.format("%.3f", lilyWeight.getSlayer()),
+ "§bTotal§7: §e"+String.format("%.3f", lilyWeight.getTotal())
+ ),mouseX, mouseY,
+ scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), -1, Minecraft.getMinecraft().fontRendererObj);
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSecrets.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSecrets.java
new file mode 100644
index 00000000..bacbc598
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSecrets.java
@@ -0,0 +1,53 @@
+/*
+ * 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.playerpreview.datarenders.impl;
+
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.PlayerProfile;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.datarenders.IDataRenderer;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.FontRenderer;
+
+import java.awt.*;
+
+public class DataRendererSecrets implements IDataRenderer {
+ @Override
+ public Dimension renderData(PlayerProfile playerProfile) {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ double theint = playerProfile.getTotalSecrets()/ (double)playerProfile.getDungeonStats().values().stream().flatMap(s -> s.getData().getPlays().values().stream())
+ .map(fs -> fs.getData().getWatcherKills()).reduce(0, Integer::sum);
+ fr.drawString("§eSecrets §b"+playerProfile.getTotalSecrets()+" §7("+
+ String.format("%.2f", theint)+"/run)", 0,0,-1);
+ return new Dimension(100, fr.FONT_HEIGHT);
+ }
+
+ @Override
+ public Dimension renderDummy() {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ fr.drawString("§eSecrets §b99999 §7(X/run)", 0,0,-1);
+ return new Dimension(100, fr.FONT_HEIGHT);
+ }
+ @Override
+ public Dimension getDimension() {
+ return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT);
+ }
+
+ @Override
+ public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSelectedClassLv.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSelectedClassLv.java
new file mode 100644
index 00000000..d8d3a292
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSelectedClassLv.java
@@ -0,0 +1,77 @@
+/*
+ * 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.playerpreview.datarenders.impl;
+
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.ClassSpecificData;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.PlayerProfile;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.datarenders.IDataRenderer;
+import kr.syeyoung.dungeonsguide.utils.RenderUtils;
+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.ScaledResolution;
+import net.minecraftforge.fml.client.config.GuiUtils;
+
+import java.awt.*;
+import java.util.Arrays;
+
+public class DataRendererSelectedClassLv implements IDataRenderer {
+ @Override
+ public Dimension renderData(PlayerProfile playerProfile) {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ ClassSpecificData dungeonStatDungeonSpecificData = playerProfile.getPlayerClassData().get(playerProfile.getSelectedClass());
+ if (dungeonStatDungeonSpecificData == null) {
+ fr.drawString("Unknown Selected", 0,0, 0xFF55ffff);
+ } else {
+ XPUtils.XPCalcResult xpCalcResult = XPUtils.getCataXp(dungeonStatDungeonSpecificData.getData().getExperience());
+ fr.drawString(playerProfile.getSelectedClass().getFamilarName(), 0,0, 0xFF55ffff);
+ fr.drawString(xpCalcResult.getLevel()+"", fr.getStringWidth(playerProfile.getSelectedClass().getFamilarName()+" "),0,0xFFFFFFFF);
+ fr.drawString("★", fr.getStringWidth(playerProfile.getSelectedClass().getFamilarName()+" "+xpCalcResult.getLevel()+" "),0,0xFFAAAAAA);
+
+ RenderUtils.renderBar(0, fr.FONT_HEIGHT, 100,xpCalcResult.getRemainingXp() == 0 ? 1 : (float) (xpCalcResult.getRemainingXp() / xpCalcResult.getNextLvXp()));
+ }
+
+ return new Dimension(100, fr.FONT_HEIGHT*2);
+ }
+
+ @Override
+ public Dimension renderDummy() {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ fr.drawString("SelectedClass", 0,0, 0xFF55ffff);
+ fr.drawString("99", fr.getStringWidth("SelectedClass "),0,0xFFFFFFFF);
+ fr.drawString("★", fr.getStringWidth("SelectedClass 99 "),0,0xFFAAAAAA);
+ RenderUtils.renderBar(0, fr.FONT_HEIGHT, 100,1.0f);
+ return new Dimension(100, fr.FONT_HEIGHT*2);
+ }
+ @Override
+ public Dimension getDimension() {
+ return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT*2);
+ }
+
+ @Override
+ public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
+ ClassSpecificData dungeonStatDungeonSpecificData = playerProfile.getPlayerClassData().get(playerProfile.getSelectedClass());
+ if (dungeonStatDungeonSpecificData == null) return;
+ XPUtils.XPCalcResult xpCalcResult = XPUtils.getCataXp(dungeonStatDungeonSpecificData.getData().getExperience());
+ ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
+ GuiUtils.drawHoveringText(Arrays.asList("§bCurrent Lv§7: §e"+xpCalcResult.getLevel(),"§bExp§7: §e"+ TextUtils.format((long)xpCalcResult.getRemainingXp()) + "§7/§e"+TextUtils.format((long)xpCalcResult.getNextLvXp()), "§bTotal Xp§7: §e"+ TextUtils.format((long)dungeonStatDungeonSpecificData.getData().getExperience())),mouseX, mouseY,
+ scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), -1, Minecraft.getMinecraft().fontRendererObj);
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSetUrOwn.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSetUrOwn.java
new file mode 100644
index 00000000..3d5e94cc
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSetUrOwn.java
@@ -0,0 +1,57 @@
+/*
+ * 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.playerpreview.datarenders.impl;
+
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.PlayerProfile;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.datarenders.IDataRenderer;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.FontRenderer;
+
+import java.awt.*;
+
+public class DataRendererSetUrOwn implements IDataRenderer {
+ @Override
+ public Dimension renderData(PlayerProfile playerProfile) {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ fr.drawString("§aCustomize at /dg", 0,0,-1);
+ fr.drawString("§a-> Party Kicker", 0,fr.FONT_HEIGHT,-1);
+ fr.drawString("§a-> View Player Stats", 0,fr.FONT_HEIGHT*2,-1);
+ fr.drawString("§a-> Edit", 0,fr.FONT_HEIGHT*3,-1);
+ return new Dimension(100, fr.FONT_HEIGHT*4);
+ }
+
+ @Override
+ public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
+
+ }
+
+ @Override
+ public Dimension renderDummy() {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ fr.drawString("§aCustomize at /dg", 0,0,-1);
+ fr.drawString("§a-> Party Kicker", 0,fr.FONT_HEIGHT,-1);
+ fr.drawString("§a-> View Player Stats", 0,fr.FONT_HEIGHT*2,-1);
+ fr.drawString("§a-> Edit", 0,fr.FONT_HEIGHT*3,-1);
+ return new Dimension(100, fr.FONT_HEIGHT*4);
+ }
+ @Override
+ public Dimension getDimension() {
+ return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT*4);
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSkillLv.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSkillLv.java
new file mode 100644
index 00000000..ea83a74e
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSkillLv.java
@@ -0,0 +1,80 @@
+/*
+ * 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.playerpreview.datarenders.impl;
+
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.PlayerProfile;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.Skill;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.datarenders.IDataRenderer;
+import kr.syeyoung.dungeonsguide.utils.RenderUtils;
+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.ScaledResolution;
+import net.minecraftforge.fml.client.config.GuiUtils;
+
+import java.awt.*;
+import java.util.Arrays;
+
+public class DataRendererSkillLv implements IDataRenderer {
+ private final Skill skill;
+ public DataRendererSkillLv(Skill skill) {
+ this.skill = skill;
+ }
+ @Override
+ public Dimension renderData(PlayerProfile playerProfile) {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ Double xp = playerProfile.getSkillXp().get(skill);
+ if (xp == null) {
+ fr.drawString(skill.getFriendlyName(), 0,0, 0xFF55ffff);
+ fr.drawString("§cSkill API Disabled", 0, fr.FONT_HEIGHT,0xFFFFFFFF);
+ } else {
+ XPUtils.XPCalcResult xpCalcResult = XPUtils.getSkillXp(skill, xp);
+ fr.drawString(skill.getFriendlyName(), 0,0, 0xFF55ffff);
+ fr.drawString(xpCalcResult.getLevel()+"", fr.getStringWidth(skill.getFriendlyName()+" "),0,0xFFFFFFFF);
+
+ RenderUtils.renderBar(0, fr.FONT_HEIGHT, 100,xpCalcResult.getRemainingXp() == 0 ? 1 : (float) (xpCalcResult.getRemainingXp() / xpCalcResult.getNextLvXp()));
+ }
+
+ return new Dimension(100, fr.FONT_HEIGHT*2);
+ }
+
+ @Override
+ public Dimension renderDummy() {
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ fr.drawString(skill.getFriendlyName(), 0,0, 0xFF55ffff);
+ fr.drawString("99", fr.getStringWidth(skill.getFriendlyName()+" "),0,0xFFFFFFFF);
+ RenderUtils.renderBar(0, fr.FONT_HEIGHT, 100,1.0f);
+ return new Dimension(100, fr.FONT_HEIGHT*2);
+ }
+ @Override
+ public Dimension getDimension() {
+ return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT*2);
+ }
+
+ @Override
+ public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
+ Double xp = playerProfile.getSkillXp().get(skill);
+ if (xp == null) return;
+ XPUtils.XPCalcResult xpCalcResult = XPUtils.getSkillXp(skill, xp);
+ ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
+ GuiUtils.drawHoveringText(Arrays.asList("§bCurrent Lv§7: §e"+xpCalcResult.getLevel(),"§bExp§7: §e"+ TextUtils.format((long)xpCalcResult.getRemainingXp()) + "§7/§e"+TextUtils.format((long)xpCalcResult.getNextLvXp()), "§bTotal Xp§7: §e"+ TextUtils.format(xp.longValue())),mouseX, mouseY,
+ scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), -1, Minecraft.getMinecraft().fontRendererObj);
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererTalismans.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererTalismans.java
new file mode 100644
index 00000000..9630e2be
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererTalismans.java
@@ -0,0 +1,123 @@
+/*
+ * 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.playerpreview.datarenders.impl;
+
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.PlayerProfile;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.datarenders.IDataRenderer;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.FontRenderer;
+import net.minecraft.client.gui.ScaledResolution;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraftforge.fml.client.config.GuiUtils;
+
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DataRendererTalismans implements IDataRenderer {
+ @Override
+ public Dimension renderData(PlayerProfile playerProfile) {
+ boolean apiDisabled = playerProfile.getTalismans() == null || playerProfile.getInventory() == null;
+ if (!playerProfile.getAdditionalProperties().containsKey("talismanCnt") && !apiDisabled) {
+ int[] cnts = new int[Rarity.values().length];
+ for (ItemStack talisman : playerProfile.getTalismans()) {
+ if (talisman == null) continue;
+ Rarity r = getRarity(talisman);
+ if (r != null) cnts[r.ordinal()]++;
+ }
+ for (ItemStack itemStack : playerProfile.getInventory()) {
+ if (itemStack == null) continue;
+ Rarity r = getRarity(itemStack);
+ if (r != null) cnts[r.ordinal()]++;
+ }
+ playerProfile.getAdditionalProperties().put("talismanCnt", cnts);
+ }
+ int[] rawData = (int[]) playerProfile.getAdditionalProperties().get("talismanCnt");
+
+ String str = "";
+ if (rawData != null)
+ for (Rarity r : Rarity.values()) {
+ str = r.color+rawData[r.idx] +" "+ str;
+ }
+
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ if (apiDisabled)
+ fr.drawString("§eTalis §cAPI DISABLED", 0,0,-1);
+ else
+ fr.drawString("§eTalis §f"+str, 0,0,-1);
+ return new Dimension(100, fr.FONT_HEIGHT);
+ }
+
+ private Rarity getRarity(ItemStack itemStack) {
+ NBTTagCompound display = itemStack.getTagCompound().getCompoundTag("display");
+ if (display == null) return null;
+ NBTTagList lore = display.getTagList("Lore", 8);
+ if (lore == null) return null;
+ for (int i = 0; i < lore.tagCount(); i++) {
+ String line = lore.getStringTagAt(i);
+ for (Rarity value : Rarity.values()) {
+ if (line.startsWith(value.getColor()) && line.contains("CCESSORY")) return value;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Dimension renderDummy() {
+ String str = "";
+ for (Rarity r : Rarity.values()) {
+ str = r.color+(r.idx+5)*2+" "+str;
+ }
+
+ FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
+ fr.drawString("§eTalis §f"+str, 0,0,-1);
+ return new Dimension(100, fr.FONT_HEIGHT);
+ }
+ @Override
+ public Dimension getDimension() {
+ return new Dimension(100, Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT);
+ }
+
+ @Override
+ public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) {
+ int[] rawData = (int[]) playerProfile.getAdditionalProperties().get("talismanCnt");
+ if (rawData == null) return;
+ ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
+ List list = new ArrayList<>();
+
+ for (Rarity r : Rarity.values()) {
+ list.add(r.getColor()+r.name()+"§7: §e"+rawData[r.idx]);
+ }
+ GuiUtils.drawHoveringText(list,mouseX, mouseY,
+ scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), -1, Minecraft.getMinecraft().fontRendererObj);
+ }
+
+
+ @AllArgsConstructor @Getter
+ public static enum Rarity {
+ COMMON("§f", 0), UNCOMMON("§a",1), RARE("§9",2), EPIC("§5",3), LEGENDARY("§6",4), MYTHIC("§d",5);
+
+ private String color;
+ private int idx;
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/utils/XPUtils.java b/src/main/java/kr/syeyoung/dungeonsguide/utils/XPUtils.java
index 2738dcec..ebdd87ab 100644
--- a/src/main/java/kr/syeyoung/dungeonsguide/utils/XPUtils.java
+++ b/src/main/java/kr/syeyoung/dungeonsguide/utils/XPUtils.java
@@ -18,7 +18,7 @@
package kr.syeyoung.dungeonsguide.utils;
-import kr.syeyoung.dungeonsguide.features.impl.party.api.Skill;
+import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.api.playerprofile.dataclasses.Skill;
import lombok.Data;
import java.util.Map;
--
cgit
From 292fbd05e13271ca3ad99ebe00ae4302e04848f3 Mon Sep 17 00:00:00 2001
From: Eryk Ruta <70776766+kingstefan26@users.noreply.github.com>
Date: Tue, 1 Nov 2022 15:51:30 +0100
Subject: 3rd time is the charm (#70)
* Updated some dependencies, used my crusty skytils forgegradle fork + removed the IRRELEVANT hytils fixes. generally made the thing build
* made the logs less annoying
* temp fix so it doesn't throw an exception
* FAT REFACTOR
General refactor on
Authenticator.java
DungeonsGuide.java
Main.java
removed unnecessary imports where not needed
to be removed DGInterface.java (no real reason to exist)
in DungeonsGuide.java made the retry stomp a singe-thread executor, so it doesn't leak when offline
added an "offline mode" so it doesn't just error when server down
TODO: move auth to DungeonsGuide.java and make it retry when network down on launch
* New auth implementation that should replace the old one:
does all the things the old one did
removed progressBar cuz it would make the impl 3x more complicated in the name of a splash screen
added a token changed event (so now it supports re-logging with a different account)
code is (should) be more readable / extensible
TODO: surgically replace Authenticator.java with new impl AND support re-logging
* Made the chat processor logger name less obnoxious
* implemented my implementation of an implementation of auth
can and is very buggy, essentially the loading of the remote classes but the mod works so idk
TODO: MAKE STOMP NOT DO STUFF TILL STOMPCONNECTED IS EMITTED
* fix for stomp client null bc forge events not going tru on pre-init
TODO: make work and test the web loadable classes, then make all the stuff that relies on stomp not throw exceptions when stomp is not connected
* move the create auth method into AuthProvider interface,
so we don't clutter AuthManager with implementation details
* Decouple AuthProviderUtil and DgAuth,
move some stuff around and make it more readable
* moved AuthUtil to make more sense
* de-clutter the tree a little bit
* Inline StompClientStatus.java / refactor
* inline the useless interface
* refactoringgg
* fix ahUtils exeption spam
* small StompClient refactor
* fix GLCursors exeption spam + logger
* make sure we are authenticated when downloading resources
* new .destination("value") instead of .header("destination", "value")
* StompMessageHandler -> StompMessageSubscription
* Introduced StompManager
* fix dungeon map not showing ppl heads
* ehhh
* wip (commit cuz im chekig out)
* fix player profile not never loading in chat
* remove this specific line
* 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
* make my new party ready work and look ok
* change the look and add some "somewhere" locations
* make stomp connection "null safe"
* i hate git
* introduce callbacks on parameter change for cleaner code
add one example
* impl new system,
half way done
* now shows which profile is now selected
put button on top
a lil refactor
* fix player profile sometimes not loading
* add players knowing who is using dg (try to)
* announcing that we are a dg user will get reworked in the future
* update deps
* make it not spam logs
* sanity check for premium features so it doesn't 403
* add YoMamaOutdated that checks if you are using outdated dg
* hychat?? anyone
* try catch in FeatureRegistry
* added Ether transmission ability
* chat shredder borken, disabled for now
* party deserves its own folder
* dungeon stuff in dungeon folder
* events folders moved
* fix score data collection hanging forever if stomp is not connected
* fix stomp never connecting
* re-add the removed
* fix wonky rendering
* server side implementation is not ready, canning this for a future release
* attempt to fix heads loading on main thread
* discord
* me when sonar lint
* new consumer based stomp subscriptions
* replace old with new subscriptions
* remove the remains of StompSubscription and replace CloseListener with a forge event
* StompSubscription is now a functional interface
* remove unnecessary event message chains,
feature logic should be in the feature
* fix events being set up wrongly
* Revert "fix events being set up wrongly"
This reverts commit e6ea7efa557a5f5c8a3ea33be998717bc024b8cb.
* Revert "remove unnecessary event message chains,"
This reverts commit 96f508bae85b33cdcef6be19226c00fc52a1439b.
* fix stomp client sending payload object instead of the actual payload
* fix null pointer on empty party
* fix players with cosmetics name being white in tab
* added message when not connected to dg
changed YoMamaOutdated to use CloudFlare workers
added client sided message queue
* the mod doesn't init when outdated
* mcmod.info
* dont busy wait in authmenager
* test pepole crusty tests
* chill out the authmanager
* name the thread pool in auth manager
* clear most compiler warnings
* make outdated check allow to play without the mod initialized
* make first startup VERY noticeable, move config creation to main
* major dungeon package refactor
* refactor checkpoint
* refactor checkpoint #1
* final refactor checkpoint #2
* remove the player if from version check, made the version check not nesssery for playing
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* remove trap room fix that didnt fix anything
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* make secret beacons optional
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* make the checkmarks on map align with the rest of everyone
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* removed debug function
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* move the menus to make more sense + make destination text on secrets optional
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* improve dungeonMap performance by ~90%
temporarly disabled 9 slot map player location due to bugs
fix DungeonContext not getting player from ScoreBoard
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* add epic countdown on dungeon start (still wip)
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* added a option to cache blockstaes
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* added TabListUtil
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* fixed epic countdown
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* (i want to sleep) made all the dungeon room detection async
TODO: fix ol the bugs i created by doing that
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* stuff still broken but almost playable, unlike last commit
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* upload build jar to discord
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* cache the deps for the love of god
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* who needs linux and 32bit windows anyway
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* only upload to discord on beta branch
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* added "kick" when a member joins party
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* move stuff that sends chat to player into a separate class
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* use our chat queue instead of calling `thePlayer.addChatMessage` to proxy ourselves from 1.8 code
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* Added and implemented MortDetector2000.java
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* extract duplicate + make more readable
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* added dummy support in FeatureDebugTrap
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* gradle now puts version in mcmod.info
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* remove side effects from DgAuth.java
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* move debug commands into debug CommandDgDebug.java
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* fix key being wrong
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* move epic countdown to dungeon huds, clean up
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* Revert "who needs linux and 32bit windows anyway"
This reverts commit 0f3c2d544a70fc799cd3215dad5e997c0c8b6c06.
* make FeatureRegistry not static initialise to get rid of "ClassNotDefined" errors
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* null check on Exception since it threw NullPointers
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* finish up progress bar in DungeonsGuide.java
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* warn about null features
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* move stuff around in SkyblockStatus, move the stuff that updates status into SkyblockStatus from DungeonListener
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* rename DungeonGodObject.java to DungeonFacade.java
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* add cleanChat clause in FeatureEpicCountdown
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* implement getPreRequisites and isComplete in ActionBreakWithSuperBoom
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* clean up FeatureParameter
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* eliminate possible state inconsistency in DungeonListener
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* move percentage from DungeonFacade to DungeonContext
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* move `purge` and `partymax` back into CommandDungeonsGuide
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* stop repeating ReceiveChatQueue in ChatTransmitter
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* Clean up DungeonsGuide
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* move `sendDebugChat` to `ChatTransmitter.java`
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* change CommandDgDebug into a `else if` from an `switch` because some bigot decided its better
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* duplicate code since it currently doesn't make sense, to be reworked
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* fix typo
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* remove the trycatch so we fail fast
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* fix null pointer when trying to get fontRenderer before minecraft is initialised
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* broken checkpoint 0
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* broken checkpoint 1
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* Revert "broken checkpoint 1"
This reverts commit 64985e6287c7b5650b509668e42b9803e25c419c.
* Revert "broken checkpoint 0"
This reverts commit 5f62e1345d9c8e7f66f1e5792004a05027913d92.
* Revert "fix null pointer when trying to get fontRenderer before minecraft is initialised"
This reverts commit 57d92a78d31c410f699b58c8995c94055d57e2a4.
* Revert "remove the trycatch so we fail fast"
This reverts commit 12772255ed575e411fb99edf37ec16d0e5f42924.
* Revert "fix typo"
This reverts commit aa96cc2436d3ead42d53ead78f3334fac5100713.
* Revert "duplicate code since it currently doesn't make sense, to be reworked"
This reverts commit 6d71b88e3102d23bcfd90d85e8996327776fd52f.
* Revert "change CommandDgDebug into a `else if` from an `switch` because some bigot decided its better"
This reverts commit ffea84d9b5fd4adbe034a88249bc920eafa7c53a.
* Revert "move `sendDebugChat` to `ChatTransmitter.java`"
This reverts commit 5b8b2e22fff33768134a01c15c7650100ebb9257.
* Revert "Clean up DungeonsGuide"
This reverts commit 2069ad3ebc4344eb1e778954dc1d8f6c9303de69.
* fix typo
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
(cherry picked from commit aa96cc2436d3ead42d53ead78f3334fac5100713)
* duplicate code since it currently doesn't make sense, to be reworked
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
(cherry picked from commit 6d71b88e3102d23bcfd90d85e8996327776fd52f)
* change CommandDgDebug into a `else if` from an `switch` because some bigot decided its better
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
(cherry picked from commit ffea84d9b5fd4adbe034a88249bc920eafa7c53a)
* move debug chat into ChatTransmitter
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* null pointer in SkyblockStatus bc context was not initialised yet
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* move dungeon starting door detection up the tree since it was a duplicate in both children, inline MortDetector2000
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* move dungeon name to DungeonContext
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* clean up Main
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* separate the "loader" and "mod"
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* separate DungeonsGuide and Main even more
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* change singleton implementation of DungeonsGuide
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* move classes since their paths are hardcoded into roomdatas
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* create CatacombsDataProvider.java and implement it
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* remove unnecessary `DungeonsGuide.getDungeonsGuide();` (IntelliJ refactor bug)
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* move `help` text in commands
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* a certain someone hates switch statements
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* remove my version check, since we have to wait for out lord and savior to make his own
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* make `Main` and `DungeonsGuide` compatible with supported jar classloading
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* make the beta upload action run on push
since it didnt get the secret on pull request and failed anyway,
TODO: make the jar name not hardcoded
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
* upload all jar
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
Signed-off-by: kingstefan26 <70776766+kingstefan26@users.noreply.github.com>
Co-authored-by: syeyoung <42869671+cyoung06@users.noreply.github.com>
---
.github/workflows/beta.yml | 33 +
.github/workflows/main.yml | 7 +-
build.gradle | 36 +-
.../kr/syeyoung/dungeonsguide/Authenticator.java | 302 -----
.../kr/syeyoung/dungeonsguide/DGInterface.java | 28 -
.../kr/syeyoung/dungeonsguide/DungeonsGuide.java | 272 ----
.../kr/syeyoung/dungeonsguide/GuiLoadingError.java | 21 +-
.../kr/syeyoung/dungeonsguide/IDungeonGuide.java | 10 +
.../java/kr/syeyoung/dungeonsguide/Keybinds.java | 53 -
src/main/java/kr/syeyoung/dungeonsguide/Main.java | 185 +--
.../kr/syeyoung/dungeonsguide/SkyblockStatus.java | 123 --
.../kr/syeyoung/dungeonsguide/YoMamaOutdated.java | 110 ++
.../syeyoung/dungeonsguide/auth/AuthManager.java | 150 +++
.../kr/syeyoung/dungeonsguide/auth/AuthUtil.java | 70 +
.../InvalidDungeonsGuideCredentialsException.java | 8 +
.../dungeonsguide/auth/ResourceManager.java | 164 +++
.../auth/authprovider/AuthProvider.java | 16 +
.../auth/authprovider/DgAuth/DgAuth.java | 46 +
.../auth/authprovider/DgAuth/DgAuthUtil.java | 88 ++
.../dungeonsguide/auth/authprovider/NullAuth.java | 62 +
.../dungeonsguide/chat/ChatProcessResult.java | 31 -
.../syeyoung/dungeonsguide/chat/ChatProcessor.java | 115 --
.../dungeonsguide/chat/ChatSubscriber.java | 26 -
.../syeyoung/dungeonsguide/chat/PartyContext.java | 89 --
.../syeyoung/dungeonsguide/chat/PartyManager.java | 605 ---------
.../commands/CommandDungeonsGuide.java | 602 ---------
.../dungeonsguide/commands/CommandReparty.java | 110 --
.../kr/syeyoung/dungeonsguide/config/Config.java | 65 -
.../config/guiconfig/ConfigPanelCreator.java | 40 -
.../config/guiconfig/GuiConfigV2.java | 59 -
.../dungeonsguide/config/guiconfig/MCategory.java | 103 --
.../config/guiconfig/MCategoryElement.java | 82 --
.../dungeonsguide/config/guiconfig/MFeature.java | 154 ---
.../config/guiconfig/MFeatureEdit.java | 113 --
.../dungeonsguide/config/guiconfig/MNotFound.java | 40 -
.../config/guiconfig/MPanelCategory.java | 83 --
.../config/guiconfig/MParameterEdit.java | 220 ----
.../config/guiconfig/NestedCategory.java | 55 -
.../config/guiconfig/RootConfigPanel.java | 305 -----
.../guiconfig/location/GuiGuiLocationConfig.java | 166 ---
.../config/guiconfig/location/Marker.java | 45 -
.../config/guiconfig/location/PanelDelegate.java | 406 ------
.../dungeonsguide/config/types/AColor.java | 63 -
.../dungeonsguide/config/types/GUIRectangle.java | 82 --
.../dungeonsguide/config/types/TCAColor.java | 53 -
.../dungeonsguide/config/types/TCBoolean.java | 39 -
.../dungeonsguide/config/types/TCColor.java | 42 -
.../dungeonsguide/config/types/TCFloat.java | 39 -
.../dungeonsguide/config/types/TCGUIRectangle.java | 52 -
.../dungeonsguide/config/types/TCInteger.java | 39 -
.../dungeonsguide/config/types/TCKeybind.java | 39 -
.../dungeonsguide/config/types/TCRectangle.java | 53 -
.../dungeonsguide/config/types/TCString.java | 39 -
.../dungeonsguide/config/types/TCStringList.java | 52 -
.../dungeonsguide/config/types/TCTextStyle.java | 55 -
.../config/types/TCTextStyleList.java | 55 -
.../dungeonsguide/config/types/TypeConverter.java | 29 -
.../config/types/TypeConverterRegistry.java | 54 -
.../dungeonsguide/cosmetics/ActiveCosmetic.java | 12 -
.../dungeonsguide/cosmetics/CosmeticData.java | 14 -
.../dungeonsguide/cosmetics/CosmeticsManager.java | 300 -----
.../cosmetics/CustomNetworkPlayerInfo.java | 103 --
.../cosmetics/CustomPacketPlayerListItem.java | 39 -
.../dungeonsguide/cosmetics/IChatReplacer.java | 26 -
.../chatreplacers/ChatReplacerChatByMe.java | 106 --
.../cosmetics/chatreplacers/ChatReplacerCoop.java | 121 --
.../chatreplacers/ChatReplacerMessage.java | 107 --
.../cosmetics/chatreplacers/ChatReplacerPV.java | 119 --
.../chatreplacers/ChatReplacerSocialOptions.java | 121 --
.../chatreplacers/ChatReplacerViewProfile.java | 128 --
.../dungeon/DungeonActionManager.java | 38 -
.../dungeonsguide/dungeon/DungeonContext.java | 206 ---
.../dungeonsguide/dungeon/MapProcessor.java | 504 -------
.../dungeon/actions/AbstractAction.java | 57 -
.../dungeonsguide/dungeon/actions/Action.java | 40 -
.../dungeon/actions/ActionBreakWithSuperBoom.java | 101 --
.../dungeon/actions/ActionChangeState.java | 72 -
.../dungeonsguide/dungeon/actions/ActionClick.java | 78 --
.../dungeon/actions/ActionClickSet.java | 91 --
.../dungeon/actions/ActionComplete.java | 41 -
.../dungeon/actions/ActionDropItem.java | 71 -
.../dungeon/actions/ActionInteract.java | 81 --
.../dungeonsguide/dungeon/actions/ActionKill.java | 89 --
.../dungeonsguide/dungeon/actions/ActionMove.java | 114 --
.../dungeon/actions/ActionMoveNearestAir.java | 113 --
.../dungeonsguide/dungeon/actions/ActionRoot.java | 48 -
.../dungeon/actions/tree/ActionRoute.java | 124 --
.../dungeon/actions/tree/ActionTree.java | 83 --
.../dungeon/actions/tree/ActionTreeUtil.java | 83 --
.../dungeon/data/DungeonRoomInfo.java | 6 +-
.../dungeonsguide/dungeon/data/OffsetPoint.java | 21 +-
.../dungeonsguide/dungeon/data/OffsetPointSet.java | 2 +-
.../dungeon/doorfinder/CatacombDataProvider.java | 171 ---
.../doorfinder/CatacombMasterDataProvider.java | 125 --
.../dungeon/doorfinder/DungeonDoor.java | 81 --
.../doorfinder/DungeonSpecificDataProvider.java | 39 -
.../DungeonSpecificDataProviderRegistry.java | 39 -
.../dungeon/doorfinder/EDungeonDoorType.java | 33 -
.../dungeon/events/DungeonCryptBrokenEvent.java | 37 -
.../dungeon/events/DungeonDeathEvent.java | 38 -
.../dungeonsguide/dungeon/events/DungeonEvent.java | 41 -
.../dungeon/events/DungeonEventData.java | 25 -
.../dungeon/events/DungeonEventHolder.java | 32 -
.../dungeon/events/DungeonMapUpdateEvent.java | 33 -
.../dungeon/events/DungeonNodataEvent.java | 28 -
.../dungeon/events/DungeonPuzzleFailureEvent.java | 33 -
.../dungeon/events/DungeonRoomDiscoverEvent.java | 45 -
.../events/DungeonSecretCountChangeEvent.java | 39 -
.../dungeon/events/DungeonStateChangeEvent.java | 41 -
.../dungeon/events/SerializableBlockPos.java | 36 -
.../dungeon/mechanics/DungeonBreakableWall.java | 18 +-
.../dungeon/mechanics/DungeonDoor.java | 16 +-
.../dungeon/mechanics/DungeonDummy.java | 13 +-
.../dungeon/mechanics/DungeonFairySoul.java | 56 +-
.../dungeon/mechanics/DungeonJournal.java | 17 +-
.../dungeon/mechanics/DungeonLever.java | 17 +-
.../dungeon/mechanics/DungeonMechanic.java | 40 -
.../dungeon/mechanics/DungeonNPC.java | 67 +-
.../dungeon/mechanics/DungeonOnewayDoor.java | 22 +-
.../dungeon/mechanics/DungeonOnewayLever.java | 17 +-
.../dungeon/mechanics/DungeonPressurePlate.java | 52 +-
.../dungeon/mechanics/DungeonRoomDoor.java | 50 +-
.../dungeon/mechanics/DungeonSecret.java | 106 +-
.../dungeon/mechanics/DungeonTomb.java | 64 +-
.../dungeon/mechanics/RouteBlocker.java | 25 -
.../mechanics/dunegonmechanic/DungeonMechanic.java | 40 +
.../mechanics/dunegonmechanic/RouteBlocker.java | 25 +
.../mechanics/predicates/PredicateArmorStand.java | 1 -
.../dungeon/roomfinder/DungeonRoom.java | 381 ------
.../roomfinder/DungeonRoomInfoRegistry.java | 143 --
.../dungeon/roomfinder/RoomMatcher.java | 155 ---
.../eventlistener/DungeonListener.java | 585 ---------
.../eventlistener/FeatureListener.java | 512 --------
.../eventlistener/PacketListener.java | 177 ---
.../dungeonsguide/events/BlockUpdateEvent.java | 38 -
.../dungeonsguide/events/BossroomEnterEvent.java | 24 -
.../events/DiscordUserJoinRequestEvent.java | 30 -
.../events/DiscordUserUpdateEvent.java | 30 -
.../events/DungeonContextInitializationEvent.java | 24 -
.../dungeonsguide/events/DungeonEndedEvent.java | 24 -
.../dungeonsguide/events/DungeonLeftEvent.java | 24 -
.../dungeonsguide/events/DungeonStartedEvent.java | 24 -
.../dungeonsguide/events/HypixelJoinedEvent.java | 24 -
.../dungeonsguide/events/KeyBindPressedEvent.java | 28 -
.../events/PlayerInteractEntityEvent.java | 39 -
.../events/PlayerListItemPacketEvent.java | 30 -
.../dungeonsguide/events/SkyblockJoinedEvent.java | 24 -
.../dungeonsguide/events/SkyblockLeftEvent.java | 24 -
.../dungeonsguide/events/StompConnectedEvent.java | 30 -
.../syeyoung/dungeonsguide/events/TitleEvent.java | 30 -
.../dungeonsguide/events/WindowUpdateEvent.java | 33 -
.../dungeonsguide/features/AbstractFeature.java | 109 --
.../dungeonsguide/features/FeatureParameter.java | 51 -
.../dungeonsguide/features/FeatureRegistry.java | 217 ---
.../dungeonsguide/features/GuiFeature.java | 160 ---
.../dungeonsguide/features/SimpleFeature.java | 33 -
.../features/impl/advanced/FeatureDebug.java | 65 -
.../impl/advanced/FeatureDebuggableMap.java | 92 --
.../impl/advanced/FeatureRoomCoordDisplay.java | 93 --
.../impl/advanced/FeatureRoomDebugInfo.java | 94 --
.../features/impl/boss/FeatureAutoReparty.java | 34 -
.../features/impl/boss/FeatureBossHealth.java | 103 --
.../features/impl/boss/FeatureBoxRealLivid.java | 54 -
.../features/impl/boss/FeatureChestPrice.java | 174 ---
.../features/impl/boss/FeatureCurrentPhase.java | 74 --
.../features/impl/boss/FeatureHideAnimals.java | 69 -
.../features/impl/boss/FeatureTerracotaTimer.java | 77 --
.../impl/boss/FeatureThornBearPercentage.java | 78 --
.../impl/boss/FeatureThornSpiritBowTimer.java | 111 --
.../features/impl/boss/FeatureWarningOnPortal.java | 200 ---
.../terminal/CorrectThePaneSolutionProvider.java | 53 -
.../impl/boss/terminal/FeatureSimonSaysSolver.java | 115 --
.../impl/boss/terminal/FeatureTerminalSolvers.java | 155 ---
.../terminal/NavigateMazeSolutionProvider.java | 144 --
.../terminal/SelectAllColorSolutionProivider.java | 60 -
.../terminal/SelectInOrderSolutionProvider.java | 72 -
.../impl/boss/terminal/TerminalSolution.java | 30 -
.../boss/terminal/TerminalSolutionProvider.java | 29 -
.../terminal/WhatStartsWithSolutionProvider.java | 51 -
.../impl/cosmetics/FeatureNicknameColor.java | 49 -
.../impl/cosmetics/FeatureNicknamePrefix.java | 49 -
.../features/impl/cosmetics/PrefixSelectorGUI.java | 188 ---
.../impl/discord/inviteViewer/ImageTexture.java | 120 --
.../discord/inviteViewer/PartyInviteViewer.java | 320 -----
.../discord/inviteViewer/PartyJoinRequest.java | 59 -
.../impl/discord/invteTooltip/MTooltipInvite.java | 128 --
.../invteTooltip/MTooltipInviteElement.java | 109 --
.../impl/discord/onlinealarm/PlayingDGAlarm.java | 171 ---
.../features/impl/dungeon/FeatureBoxBats.java | 68 -
.../impl/dungeon/FeatureBoxSkelemaster.java | 68 -
.../features/impl/dungeon/FeatureBoxStarMobs.java | 68 -
.../features/impl/dungeon/FeatureCollectScore.java | 28 -
.../dungeon/FeatureDungeonCurrentRoomSecrets.java | 108 --
.../impl/dungeon/FeatureDungeonDeaths.java | 167 ---
.../features/impl/dungeon/FeatureDungeonMap.java | 454 -------
.../impl/dungeon/FeatureDungeonMilestone.java | 109 --
.../impl/dungeon/FeatureDungeonRealTime.java | 92 --
.../impl/dungeon/FeatureDungeonRoomName.java | 98 --
.../impl/dungeon/FeatureDungeonSBTime.java | 119 --
.../features/impl/dungeon/FeatureDungeonScore.java | 361 -----
.../impl/dungeon/FeatureDungeonSecrets.java | 144 --
.../features/impl/dungeon/FeatureDungeonTombs.java | 88 --
.../features/impl/dungeon/FeatureHideNameTags.java | 53 -
.../features/impl/dungeon/FeaturePlayerESP.java | 111 --
.../dungeon/FeaturePressAnyKeyToCloseChest.java | 89 --
.../impl/dungeon/FeatureWarnLowHealth.java | 106 --
.../impl/dungeon/FeatureWatcherWarning.java | 87 --
.../impl/etc/FeatureAutoAcceptReparty.java | 68 -
.../features/impl/etc/FeatureCooldownCounter.java | 106 --
.../features/impl/etc/FeatureCopyMessages.java | 42 -
.../impl/etc/FeatureDecreaseExplosionSound.java | 55 -
.../features/impl/etc/FeatureDisableMessage.java | 79 --
.../features/impl/etc/FeaturePenguins.java | 182 ---
.../features/impl/etc/FeatureRepartyCommand.java | 29 -
.../impl/etc/FeatureTooltipDungeonStat.java | 52 -
.../features/impl/etc/FeatureTooltipPrice.java | 111 --
.../features/impl/etc/FeatureUpdateAlarm.java | 63 -
.../impl/etc/ability/FeatureAbilityCooldown.java | 403 ------
.../features/impl/etc/ability/SkyblockAbility.java | 32 -
.../features/impl/etc/ability/UsedAbility.java | 31 -
.../dungeonsguide/features/impl/party/APIKey.java | 58 -
.../features/impl/party/FeatureGoodParties.java | 121 --
.../features/impl/party/FeaturePartyList.java | 97 --
.../features/impl/party/FeaturePartyReady.java | 181 ---
.../party/customgui/FeatureCustomPartyFinder.java | 114 --
.../impl/party/customgui/GuiCustomPartyFinder.java | 78 --
.../impl/party/customgui/PanelPartyFinder.java | 341 -----
.../party/customgui/PanelPartyFinderSettings.java | 294 -----
.../party/customgui/PanelPartyListElement.java | 237 ----
.../impl/party/playerpreview/FakePlayer.java | 101 --
.../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 --
.../features/impl/secret/FeatureActions.java | 144 --
.../features/impl/secret/FeatureBloodRush.java | 45 -
.../impl/secret/FeatureCreateRefreshLine.java | 72 -
.../impl/secret/FeatureFreezePathfind.java | 57 -
.../impl/secret/FeaturePathfindStrategy.java | 110 --
.../features/impl/secret/FeaturePathfindToAll.java | 45 -
.../impl/secret/FeatureSoulRoomWarning.java | 231 ----
.../impl/secret/FeatureTogglePathfind.java | 55 -
.../impl/secret/PathfindLineProperties.java | 117 --
.../mechanicbrowser/FeatureMechanicBrowse.java | 179 ---
.../mechanicbrowser/MGuiMechanicBrowser.java | 45 -
.../mechanicbrowser/MechanicBrowserElement.java | 65 -
.../mechanicbrowser/MechanicBrowserTooltip.java | 68 -
.../mechanicbrowser/PanelMechanicBrowser.java | 327 -----
.../features/impl/solvers/FeatureSolverBlaze.java | 46 -
.../impl/solvers/FeatureSolverBombdefuse.java | 30 -
.../features/impl/solvers/FeatureSolverBox.java | 57 -
.../impl/solvers/FeatureSolverIcefill.java | 40 -
.../features/impl/solvers/FeatureSolverKahoot.java | 35 -
.../features/impl/solvers/FeatureSolverRiddle.java | 35 -
.../impl/solvers/FeatureSolverSilverfish.java | 40 -
.../impl/solvers/FeatureSolverTeleport.java | 39 -
.../impl/solvers/FeatureSolverTictactoe.java | 39 -
.../features/listener/BossroomEnterListener.java | 23 -
.../features/listener/ChatListener.java | 25 -
.../features/listener/ChatListenerGlobal.java | 25 -
.../listener/DiscordUserJoinRequestListener.java | 26 -
.../listener/DiscordUserUpdateListener.java | 25 -
.../DungeonContextInitializationListener.java | 23 -
.../features/listener/DungeonEndListener.java | 23 -
.../features/listener/DungeonQuitListener.java | 23 -
.../features/listener/DungeonStartListener.java | 23 -
.../listener/EntityLivingRenderListener.java | 27 -
.../listener/GuiBackgroundRenderListener.java | 25 -
.../features/listener/GuiClickListener.java | 25 -
.../features/listener/GuiOpenListener.java | 25 -
.../features/listener/GuiPostRenderListener.java | 26 -
.../features/listener/GuiPreRenderListener.java | 25 -
.../features/listener/GuiUpdateListener.java | 26 -
.../features/listener/InteractListener.java | 26 -
.../features/listener/KeyInputListener.java | 26 -
.../features/listener/KeybindPressedListener.java | 25 -
.../features/listener/PlayerRenderListener.java | 26 -
.../features/listener/ScreenRenderListener.java | 23 -
.../features/listener/SkyblockJoinListener.java | 23 -
.../features/listener/SkyblockLeaveListener.java | 23 -
.../features/listener/SoundListener.java | 25 -
.../features/listener/StompConnectedListener.java | 25 -
.../features/listener/TextureStichListener.java | 26 -
.../features/listener/TickListener.java | 23 -
.../features/listener/TitleListener.java | 25 -
.../features/listener/TooltipListener.java | 25 -
.../features/listener/WorldRenderListener.java | 23 -
.../features/text/PanelTextParameterConfig.java | 284 ----
.../dungeonsguide/features/text/StyledText.java | 29 -
.../features/text/StyledTextProvider.java | 30 -
.../features/text/StyledTextRenderer.java | 245 ----
.../features/text/TextHUDFeature.java | 191 ---
.../dungeonsguide/features/text/TextStyle.java | 36 -
.../kr/syeyoung/dungeonsguide/gamesdk/GameSDK.java | 95 --
.../gamesdk/jna/GameSDKTypeMapper.java | 46 -
.../dungeonsguide/gamesdk/jna/NativeGameSDK.java | 50 -
.../gamesdk/jna/datastruct/DiscordActivity.java | 51 -
.../jna/datastruct/DiscordActivityAssets.java | 42 -
.../jna/datastruct/DiscordActivityParty.java | 40 -
.../jna/datastruct/DiscordActivitySecrets.java | 41 -
.../jna/datastruct/DiscordActivityTimestamps.java | 40 -
.../jna/datastruct/DiscordCreateParams.java | 72 -
.../gamesdk/jna/datastruct/DiscordEntitlement.java | 42 -
.../gamesdk/jna/datastruct/DiscordFileStat.java | 42 -
.../jna/datastruct/DiscordImageDimensions.java | 40 -
.../gamesdk/jna/datastruct/DiscordImageHandle.java | 43 -
.../gamesdk/jna/datastruct/DiscordInputMode.java | 41 -
.../gamesdk/jna/datastruct/DiscordLobby.java | 47 -
.../gamesdk/jna/datastruct/DiscordOAuth2Token.java | 42 -
.../gamesdk/jna/datastruct/DiscordPartySize.java | 40 -
.../gamesdk/jna/datastruct/DiscordPresence.java | 40 -
.../jna/datastruct/DiscordRelationship.java | 41 -
.../gamesdk/jna/datastruct/DiscordSku.java | 44 -
.../gamesdk/jna/datastruct/DiscordSkuPrice.java | 41 -
.../gamesdk/jna/datastruct/DiscordStruct.java | 36 -
.../gamesdk/jna/datastruct/DiscordUser.java | 46 -
.../jna/datastruct/DiscordUserAchievement.java | 44 -
.../enumuration/EDiscordActivityActionType.java | 67 -
.../EDiscordActivityJoinRequestReply.java | 68 -
.../jna/enumuration/EDiscordActivityType.java | 69 -
.../jna/enumuration/EDiscordCreateFlags.java | 67 -
.../jna/enumuration/EDiscordEntitlementType.java | 72 -
.../gamesdk/jna/enumuration/EDiscordImageType.java | 66 -
.../jna/enumuration/EDiscordInputModeType.java | 67 -
.../jna/enumuration/EDiscordLobbySearchCast.java | 67 -
.../enumuration/EDiscordLobbySearchComparison.java | 71 -
.../enumuration/EDiscordLobbySearchDistance.java | 69 -
.../gamesdk/jna/enumuration/EDiscordLobbyType.java | 67 -
.../gamesdk/jna/enumuration/EDiscordLogLevel.java | 69 -
.../jna/enumuration/EDiscordPremiumType.java | 68 -
.../jna/enumuration/EDiscordRelationshipType.java | 71 -
.../gamesdk/jna/enumuration/EDiscordResult.java | 109 --
.../gamesdk/jna/enumuration/EDiscordSkuType.java | 69 -
.../gamesdk/jna/enumuration/EDiscordStatus.java | 69 -
.../gamesdk/jna/enumuration/EDiscordUserFlag.java | 70 -
.../jna/interfacestruct/GameSDKCallback.java | 30 -
.../interfacestruct/IDiscordAchievementEvents.java | 40 -
.../IDiscordAchievementManager.java | 58 -
.../interfacestruct/IDiscordActivityEvents.java | 51 -
.../interfacestruct/IDiscordActivityManager.java | 64 -
.../IDiscordApplicationManager.java | 61 -
.../gamesdk/jna/interfacestruct/IDiscordCore.java | 92 --
.../jna/interfacestruct/IDiscordImageManager.java | 54 -
.../jna/interfacestruct/IDiscordLobbyEvents.java | 65 -
.../jna/interfacestruct/IDiscordLobbyManager.java | 149 ---
.../IDiscordLobbyMemberTransaction.java | 43 -
.../interfacestruct/IDiscordLobbySearchQuery.java | 53 -
.../interfacestruct/IDiscordLobbyTransaction.java | 58 -
.../jna/interfacestruct/IDiscordNetworkEvents.java | 46 -
.../interfacestruct/IDiscordNetworkManager.java | 66 -
.../jna/interfacestruct/IDiscordOverlayEvents.java | 39 -
.../interfacestruct/IDiscordOverlayManager.java | 57 -
.../IDiscordRelationshipEvents.java | 43 -
.../IDiscordRelationshipManager.java | 54 -
.../interfacestruct/IDiscordStorageManager.java | 82 --
.../jna/interfacestruct/IDiscordStoreEvents.java | 44 -
.../jna/interfacestruct/IDiscordStoreManager.java | 74 --
.../jna/interfacestruct/IDiscordUserEvents.java | 39 -
.../jna/interfacestruct/IDiscordUserManager.java | 54 -
.../jna/interfacestruct/IDiscordVoiceEvents.java | 40 -
.../jna/interfacestruct/IDiscordVoiceManager.java | 73 --
.../gamesdk/jna/typedef/DiscordClientID.java | 30 -
.../jna/typedef/DiscordNetworkChannelId.java | 30 -
.../gamesdk/jna/typedef/DiscordNetworkPeerId.java | 30 -
.../gamesdk/jna/typedef/DiscordSnowflake.java | 30 -
.../gamesdk/jna/typedef/DiscordTimestamp.java | 30 -
.../gamesdk/jna/typedef/DiscordVersion.java | 30 -
.../dungeonsguide/gamesdk/jna/typedef/Int32.java | 31 -
.../dungeonsguide/gamesdk/jna/typedef/Int64.java | 31 -
.../dungeonsguide/gamesdk/jna/typedef/UInt32.java | 31 -
.../dungeonsguide/gamesdk/jna/typedef/UInt64.java | 31 -
.../dungeonsguide/gamesdk/jna/typedef/UInt8.java | 31 -
.../java/kr/syeyoung/dungeonsguide/gui/MGui.java | 261 ----
.../java/kr/syeyoung/dungeonsguide/gui/MPanel.java | 296 -----
.../dungeonsguide/gui/elements/MButton.java | 117 --
.../dungeonsguide/gui/elements/MCollapsable.java | 138 --
.../dungeonsguide/gui/elements/MColor.java | 49 -
.../gui/elements/MEditableAColor.java | 107 --
.../gui/elements/MFloatSelectionButton.java | 97 --
.../gui/elements/MIntegerSelectionButton.java | 95 --
.../dungeonsguide/gui/elements/MKeyEditButton.java | 148 ---
.../dungeonsguide/gui/elements/MLabel.java | 72 -
.../gui/elements/MLabelAndElement.java | 76 --
.../syeyoung/dungeonsguide/gui/elements/MList.java | 93 --
.../dungeonsguide/gui/elements/MModal.java | 92 --
.../gui/elements/MModalConfirmation.java | 87 --
.../dungeonsguide/gui/elements/MModalMessage.java | 77 --
.../gui/elements/MNavigatingPane.java | 214 ---
.../gui/elements/MPanelScaledGUI.java | 214 ---
.../dungeonsguide/gui/elements/MParameter.java | 91 --
.../gui/elements/MPassiveLabelAndElement.java | 71 -
.../dungeonsguide/gui/elements/MPopupMenu.java | 103 --
.../gui/elements/MPortableColorEdit.java | 296 -----
.../dungeonsguide/gui/elements/MRootPanel.java | 60 -
.../dungeonsguide/gui/elements/MScrollBar.java | 210 ---
.../gui/elements/MScrollablePanel.java | 187 ---
.../dungeonsguide/gui/elements/MSpacer.java | 36 -
.../gui/elements/MStringSelectionButton.java | 94 --
.../dungeonsguide/gui/elements/MTabbedPane.java | 161 ---
.../dungeonsguide/gui/elements/MTextField.java | 422 ------
.../dungeonsguide/gui/elements/MToggleButton.java | 97 --
.../dungeonsguide/gui/elements/MTooltip.java | 108 --
.../dungeonsguide/gui/elements/MTooltipText.java | 44 -
.../dungeonsguide/gui/elements/MValue.java | 80 --
.../syeyoung/dungeonsguide/mod/DungeonsGuide.java | 260 ++++
.../kr/syeyoung/dungeonsguide/mod/Keybinds.java | 47 +
.../syeyoung/dungeonsguide/mod/SkyblockStatus.java | 155 +++
.../dungeonsguide/mod/chat/ChatProcessResult.java | 31 +
.../dungeonsguide/mod/chat/ChatProcessor.java | 118 ++
.../dungeonsguide/mod/chat/ChatSubscriber.java | 26 +
.../dungeonsguide/mod/chat/ChatTransmitter.java | 69 +
.../dungeonsguide/mod/commands/CommandDgDebug.java | 450 +++++++
.../mod/commands/CommandDungeonsGuide.java | 172 +++
.../dungeonsguide/mod/commands/CommandReparty.java | 104 ++
.../syeyoung/dungeonsguide/mod/config/Config.java | 65 +
.../mod/config/guiconfig/ConfigPanelCreator.java | 40 +
.../mod/config/guiconfig/GuiConfigV2.java | 59 +
.../mod/config/guiconfig/MCategory.java | 103 ++
.../mod/config/guiconfig/MCategoryElement.java | 82 ++
.../mod/config/guiconfig/MFeature.java | 154 +++
.../mod/config/guiconfig/MFeatureEdit.java | 113 ++
.../mod/config/guiconfig/MNotFound.java | 38 +
.../mod/config/guiconfig/MPanelCategory.java | 83 ++
.../mod/config/guiconfig/MParameterEdit.java | 219 ++++
.../mod/config/guiconfig/NestedCategory.java | 54 +
.../mod/config/guiconfig/RootConfigPanel.java | 311 +++++
.../guiconfig/location/GuiGuiLocationConfig.java | 166 +++
.../mod/config/guiconfig/location/Marker.java | 45 +
.../config/guiconfig/location/PanelDelegate.java | 403 ++++++
.../dungeonsguide/mod/config/types/AColor.java | 63 +
.../mod/config/types/GUIRectangle.java | 81 ++
.../dungeonsguide/mod/config/types/TCAColor.java | 51 +
.../dungeonsguide/mod/config/types/TCBoolean.java | 39 +
.../dungeonsguide/mod/config/types/TCColor.java | 41 +
.../dungeonsguide/mod/config/types/TCFloat.java | 39 +
.../mod/config/types/TCGUIRectangle.java | 50 +
.../dungeonsguide/mod/config/types/TCInteger.java | 39 +
.../dungeonsguide/mod/config/types/TCKeybind.java | 39 +
.../mod/config/types/TCRectangle.java | 51 +
.../dungeonsguide/mod/config/types/TCString.java | 39 +
.../mod/config/types/TCStringList.java | 51 +
.../mod/config/types/TCTextStyle.java | 52 +
.../mod/config/types/TCTextStyleList.java | 54 +
.../mod/config/types/TypeConverter.java | 29 +
.../mod/config/types/TypeConverterRegistry.java | 52 +
.../mod/cosmetics/ActiveCosmetic.java | 12 +
.../dungeonsguide/mod/cosmetics/CosmeticData.java | 14 +
.../mod/cosmetics/CosmeticsManager.java | 288 ++++
.../mod/cosmetics/CustomNetworkPlayerInfo.java | 108 ++
.../mod/cosmetics/CustomPacketPlayerListItem.java | 38 +
.../dungeonsguide/mod/cosmetics/IChatReplacer.java | 26 +
.../chatreplacers/ChatReplacerChatByMe.java | 106 ++
.../cosmetics/chatreplacers/ChatReplacerCoop.java | 119 ++
.../chatreplacers/ChatReplacerMessage.java | 106 ++
.../cosmetics/chatreplacers/ChatReplacerPV.java | 119 ++
.../chatreplacers/ChatReplacerSocialOptions.java | 117 ++
.../chatreplacers/ChatReplacerViewProfile.java | 130 ++
.../dungeonsguide/mod/discord/gamesdk/GameSDK.java | 87 ++
.../mod/discord/gamesdk/jna/GameSDKTypeMapper.java | 46 +
.../mod/discord/gamesdk/jna/NativeGameSDK.java | 50 +
.../gamesdk/jna/datastruct/DiscordActivity.java | 50 +
.../jna/datastruct/DiscordActivityAssets.java | 42 +
.../jna/datastruct/DiscordActivityParty.java | 40 +
.../jna/datastruct/DiscordActivitySecrets.java | 41 +
.../jna/datastruct/DiscordActivityTimestamps.java | 40 +
.../jna/datastruct/DiscordCreateParams.java | 72 +
.../gamesdk/jna/datastruct/DiscordEntitlement.java | 42 +
.../gamesdk/jna/datastruct/DiscordFileStat.java | 42 +
.../jna/datastruct/DiscordImageDimensions.java | 40 +
.../gamesdk/jna/datastruct/DiscordImageHandle.java | 43 +
.../gamesdk/jna/datastruct/DiscordInputMode.java | 41 +
.../gamesdk/jna/datastruct/DiscordLobby.java | 47 +
.../gamesdk/jna/datastruct/DiscordOAuth2Token.java | 42 +
.../gamesdk/jna/datastruct/DiscordPartySize.java | 40 +
.../gamesdk/jna/datastruct/DiscordPresence.java | 40 +
.../jna/datastruct/DiscordRelationship.java | 41 +
.../discord/gamesdk/jna/datastruct/DiscordSku.java | 44 +
.../gamesdk/jna/datastruct/DiscordSkuPrice.java | 41 +
.../gamesdk/jna/datastruct/DiscordStruct.java | 35 +
.../gamesdk/jna/datastruct/DiscordUser.java | 43 +
.../jna/datastruct/DiscordUserAchievement.java | 44 +
.../enumuration/EDiscordActivityActionType.java | 67 +
.../EDiscordActivityJoinRequestReply.java | 68 +
.../jna/enumuration/EDiscordActivityType.java | 69 +
.../jna/enumuration/EDiscordCreateFlags.java | 67 +
.../jna/enumuration/EDiscordEntitlementType.java | 72 +
.../gamesdk/jna/enumuration/EDiscordImageType.java | 66 +
.../jna/enumuration/EDiscordInputModeType.java | 67 +
.../jna/enumuration/EDiscordLobbySearchCast.java | 67 +
.../enumuration/EDiscordLobbySearchComparison.java | 71 +
.../enumuration/EDiscordLobbySearchDistance.java | 69 +
.../gamesdk/jna/enumuration/EDiscordLobbyType.java | 67 +
.../gamesdk/jna/enumuration/EDiscordLogLevel.java | 69 +
.../jna/enumuration/EDiscordPremiumType.java | 68 +
.../jna/enumuration/EDiscordRelationshipType.java | 71 +
.../gamesdk/jna/enumuration/EDiscordResult.java | 109 ++
.../gamesdk/jna/enumuration/EDiscordSkuType.java | 69 +
.../gamesdk/jna/enumuration/EDiscordStatus.java | 69 +
.../gamesdk/jna/enumuration/EDiscordUserFlag.java | 70 +
.../jna/interfacestruct/GameSDKCallback.java | 30 +
.../interfacestruct/IDiscordAchievementEvents.java | 39 +
.../IDiscordAchievementManager.java | 57 +
.../interfacestruct/IDiscordActivityEvents.java | 50 +
.../interfacestruct/IDiscordActivityManager.java | 63 +
.../IDiscordApplicationManager.java | 60 +
.../gamesdk/jna/interfacestruct/IDiscordCore.java | 91 ++
.../jna/interfacestruct/IDiscordImageManager.java | 52 +
.../jna/interfacestruct/IDiscordLobbyEvents.java | 64 +
.../jna/interfacestruct/IDiscordLobbyManager.java | 148 +++
.../IDiscordLobbyMemberTransaction.java | 42 +
.../interfacestruct/IDiscordLobbySearchQuery.java | 52 +
.../interfacestruct/IDiscordLobbyTransaction.java | 57 +
.../jna/interfacestruct/IDiscordNetworkEvents.java | 45 +
.../interfacestruct/IDiscordNetworkManager.java | 65 +
.../jna/interfacestruct/IDiscordOverlayEvents.java | 38 +
.../interfacestruct/IDiscordOverlayManager.java | 56 +
.../IDiscordRelationshipEvents.java | 42 +
.../IDiscordRelationshipManager.java | 53 +
.../interfacestruct/IDiscordStorageManager.java | 81 ++
.../jna/interfacestruct/IDiscordStoreEvents.java | 43 +
.../jna/interfacestruct/IDiscordStoreManager.java | 73 ++
.../jna/interfacestruct/IDiscordUserEvents.java | 38 +
.../jna/interfacestruct/IDiscordUserManager.java | 53 +
.../jna/interfacestruct/IDiscordVoiceEvents.java | 39 +
.../jna/interfacestruct/IDiscordVoiceManager.java | 72 +
.../gamesdk/jna/typedef/DiscordClientID.java | 28 +
.../jna/typedef/DiscordNetworkChannelId.java | 28 +
.../gamesdk/jna/typedef/DiscordNetworkPeerId.java | 28 +
.../gamesdk/jna/typedef/DiscordSnowflake.java | 28 +
.../gamesdk/jna/typedef/DiscordTimestamp.java | 28 +
.../gamesdk/jna/typedef/DiscordVersion.java | 28 +
.../mod/discord/gamesdk/jna/typedef/Int32.java | 31 +
.../mod/discord/gamesdk/jna/typedef/Int64.java | 31 +
.../mod/discord/gamesdk/jna/typedef/UInt32.java | 31 +
.../mod/discord/gamesdk/jna/typedef/UInt64.java | 31 +
.../mod/discord/gamesdk/jna/typedef/UInt8.java | 31 +
.../mod/discord/rpc/JDiscordActivity.java | 72 +
.../mod/discord/rpc/JDiscordRelation.java | 42 +
.../mod/discord/rpc/JDiscordUser.java | 40 +
.../mod/discord/rpc/RichPresenceManager.java | 251 ++++
.../mod/dungeon/DungeonActionContext.java | 35 +
.../dungeonsguide/mod/dungeon/DungeonContext.java | 218 ++++
.../dungeonsguide/mod/dungeon/DungeonFacade.java | 35 +
.../dungeonsguide/mod/dungeon/MapProcessor.java | 535 ++++++++
.../mod/dungeon/actions/AbstractAction.java | 61 +
.../dungeon/actions/ActionBreakWithSuperBoom.java | 103 ++
.../mod/dungeon/actions/ActionChangeState.java | 75 ++
.../mod/dungeon/actions/ActionClick.java | 82 ++
.../mod/dungeon/actions/ActionClickSet.java | 90 ++
.../mod/dungeon/actions/ActionComplete.java | 41 +
.../mod/dungeon/actions/ActionDropItem.java | 82 ++
.../mod/dungeon/actions/ActionInteract.java | 89 ++
.../mod/dungeon/actions/ActionKill.java | 90 ++
.../mod/dungeon/actions/ActionMove.java | 122 ++
.../mod/dungeon/actions/ActionMoveNearestAir.java | 92 ++
.../mod/dungeon/actions/ActionRoot.java | 47 +
.../mod/dungeon/actions/tree/ActionRoute.java | 136 ++
.../actions/tree/ActionRouteProperties.java | 16 +
.../mod/dungeon/actions/tree/ActionTree.java | 94 ++
.../mod/dungeon/actions/tree/ActionTreeUtil.java | 83 ++
.../mod/dungeon/doorfinder/DungeonDoor.java | 87 ++
.../doorfinder/DungeonSpecificDataProvider.java | 39 +
.../DungeonSpecificDataProviderRegistry.java | 42 +
.../mod/dungeon/doorfinder/EDungeonDoorType.java | 38 +
.../catacombs/CatacombsDataProvider.java | 75 ++
.../catacombs/impl/MasterModeDataProvider.java | 64 +
.../catacombs/impl/NormalModeDataProvider.java | 101 ++
.../mod/dungeon/events/DungeonEvent.java | 41 +
.../mod/dungeon/events/DungeonEventData.java | 25 +
.../mod/dungeon/events/DungeonEventHolder.java | 32 +
.../mod/dungeon/events/SerializableBlockPos.java | 38 +
.../events/impl/DungeonCryptBrokenEvent.java | 35 +
.../mod/dungeon/events/impl/DungeonDeathEvent.java | 36 +
.../dungeon/events/impl/DungeonMapUpdateEvent.java | 34 +
.../dungeon/events/impl/DungeonNodataEvent.java | 29 +
.../events/impl/DungeonPuzzleFailureEvent.java | 34 +
.../events/impl/DungeonRoomDiscoverEvent.java | 46 +
.../events/impl/DungeonSecretCountChangeEvent.java | 37 +
.../events/impl/DungeonStateChangeEvent.java | 40 +
.../mod/dungeon/map/DungeonMapData.java | 121 ++
.../mod/dungeon/pathfinding/AStarCornerCut.java | 189 +++
.../mod/dungeon/pathfinding/AStarFineGrid.java | 182 +++
.../mod/dungeon/pathfinding/CachedWorld.java | 85 ++
.../mod/dungeon/pathfinding/JPSPathfinder.java | 306 +++++
.../pathfinding/NodeProcessorDungeonRoom.java | 144 ++
.../mod/dungeon/pathfinding/ThetaStar.java | 209 +++
.../mod/dungeon/roomedit/EditingContext.java | 83 ++
.../mod/dungeon/roomedit/Parameter.java | 39 +
.../mod/dungeon/roomedit/gui/GuiDungeonAddSet.java | 136 ++
.../roomedit/gui/GuiDungeonParameterEdit.java | 173 +++
.../dungeon/roomedit/gui/GuiDungeonRoomEdit.java | 68 +
.../dungeon/roomedit/gui/GuiDungeonValueEdit.java | 127 ++
.../mechanicedit/ValueEditBreakableWall.java | 143 ++
.../roomedit/mechanicedit/ValueEditDoor.java | 157 +++
.../roomedit/mechanicedit/ValueEditDummy.java | 121 ++
.../roomedit/mechanicedit/ValueEditFairySoul.java | 118 ++
.../roomedit/mechanicedit/ValueEditJournal.java | 122 ++
.../roomedit/mechanicedit/ValueEditLever.java | 133 ++
.../roomedit/mechanicedit/ValueEditNPC.java | 121 ++
.../roomedit/mechanicedit/ValueEditOnewayDoor.java | 143 ++
.../mechanicedit/ValueEditOnewayLever.java | 137 ++
.../mechanicedit/ValueEditPressurePlate.java | 136 ++
.../roomedit/mechanicedit/ValueEditSecret.java | 129 ++
.../roomedit/mechanicedit/ValueEditTomb.java | 118 ++
.../dungeon/roomedit/panes/ActionDisplayPane.java | 82 ++
.../roomedit/panes/ActionTreeDisplayPane.java | 216 +++
.../mod/dungeon/roomedit/panes/DynamicEditor.java | 29 +
.../dungeon/roomedit/panes/GeneralEditPane.java | 286 ++++
.../roomedit/panes/ProcessorParameterEditPane.java | 144 ++
.../roomedit/panes/RoomDataDisplayPane.java | 126 ++
.../roomedit/panes/RoomMatchDisplayPane.java | 152 +++
.../dungeon/roomedit/panes/RoommatchingPane.java | 84 ++
.../mod/dungeon/roomedit/panes/SecretEditPane.java | 156 +++
.../mod/dungeon/roomedit/valueedit/ValueEdit.java | 27 +
.../roomedit/valueedit/ValueEditAColor.java | 339 +++++
.../roomedit/valueedit/ValueEditBoolean.java | 101 ++
.../dungeon/roomedit/valueedit/ValueEditColor.java | 287 ++++
.../roomedit/valueedit/ValueEditCreator.java | 29 +
.../dungeon/roomedit/valueedit/ValueEditFloat.java | 99 ++
.../roomedit/valueedit/ValueEditInteger.java | 99 ++
.../dungeon/roomedit/valueedit/ValueEditNull.java | 38 +
.../roomedit/valueedit/ValueEditOffsetPoint.java | 163 +++
.../valueedit/ValueEditOffsetPointSet.java | 250 ++++
.../roomedit/valueedit/ValueEditRegistry.java | 70 +
.../roomedit/valueedit/ValueEditString.java | 99 ++
.../mod/dungeon/roomfinder/DungeonRoom.java | 381 ++++++
.../roomfinder/DungeonRoomInfoRegistry.java | 163 +++
.../mod/dungeon/roomfinder/RoomMatcher.java | 145 +++
.../roomprocessor/GeneralRoomProcessor.java | 448 +++++++
.../dungeon/roomprocessor/ProcessorFactory.java | 65 +
.../mod/dungeon/roomprocessor/RoomProcessor.java | 49 +
.../roomprocessor/RoomProcessorBlazeSolver.java | 201 +++
.../roomprocessor/RoomProcessorButtonSolver.java | 132 ++
.../roomprocessor/RoomProcessorCreeperSolver.java | 148 +++
.../roomprocessor/RoomProcessorGenerator.java | 25 +
.../roomprocessor/RoomProcessorIcePath.java | 234 ++++
.../roomprocessor/RoomProcessorRedRoom.java | 121 ++
.../dungeon/roomprocessor/RoomProcessorRiddle.java | 121 ++
.../RoomProcessorTeleportMazeSolver.java | 145 +++
.../RoomProcessorTicTacToeSolver.java | 214 +++
.../dungeon/roomprocessor/RoomProcessorTrivia.java | 165 +++
.../bombdefuse/RoomProcessorBombDefuseSolver.java | 441 +++++++
.../bombdefuse/chambers/BDChamber.java | 83 ++
.../chambers/BombDefuseChamberGenerator.java | 30 +
.../bombdefuse/chambers/ChamberProcessor.java | 27 +
.../chambers/DummyDefuseChamberProcessor.java | 32 +
.../chambers/GeneralDefuseChamberProcessor.java | 137 ++
.../chambers/arrow/ArrowLeftProcessor.java | 138 ++
.../chambers/arrow/ArrowProcessorMatcher.java | 52 +
.../chambers/arrow/ArrowRightProcessor.java | 126 ++
.../chambers/bugged/ImpossibleMatcher.java | 47 +
.../chambers/color/ColorLeftProcessor.java | 230 ++++
.../chambers/color/ColorProcessorMatcher.java | 49 +
.../chambers/color/ColorRightProcessor.java | 175 +++
.../chambers/creeper/CreeperLeftProcessor.java | 95 ++
.../chambers/creeper/CreeperProcessorMatcher.java | 52 +
.../chambers/creeper/CreeperRightProcessor.java | 73 ++
.../goldenpath/GoldenPathLeftProcessor.java | 141 ++
.../goldenpath/GoldenPathProcessorMatcher.java | 47 +
.../goldenpath/GoldenPathRightProcessor.java | 97 ++
.../chambers/maze/MazeLeftProcessor.java | 80 ++
.../chambers/maze/MazeProcessorMatcher.java | 47 +
.../chambers/maze/MazeRightProcessor.java | 73 ++
.../chambers/number/NumberLeftProcessor.java | 125 ++
.../chambers/number/NumberProcessorMatcher.java | 53 +
.../chambers/number/NumberRightProcessor.java | 114 ++
.../bossfight/BossfightProcessor.java | 33 +
.../bossfight/BossfightProcessorBonzo.java | 85 ++
.../bossfight/BossfightProcessorLivid.java | 90 ++
.../bossfight/BossfightProcessorNecron.java | 77 ++
.../bossfight/BossfightProcessorProf.java | 144 ++
.../bossfight/BossfightProcessorSadan.java | 144 ++
.../bossfight/BossfightProcessorScarf.java | 134 ++
.../bossfight/BossfightProcessorThorn.java | 103 ++
.../bossfight/GeneralBossfightProcessor.java | 155 +++
.../roomprocessor/bossfight/HealthData.java | 33 +
.../boxpuzzle/BoxPuzzleSolvingThread.java | 182 +++
.../boxpuzzle/RoomProcessorBoxSolver.java | 392 ++++++
.../icefill/RoomProcessorIcePath2.java | 151 +++
.../roomprocessor/waterpuzzle/LeverState.java | 33 +
.../waterpuzzle/LeverStateContradict.java | 25 +
.../waterpuzzle/RoomProcessorWaterPuzzle.java | 124 ++
.../dungeon/roomprocessor/waterpuzzle/Route.java | 60 +
.../roomprocessor/waterpuzzle/SwitchData.java | 46 +
.../roomprocessor/waterpuzzle/WaterBoard.java | 424 ++++++
.../roomprocessor/waterpuzzle/WaterNode.java | 36 +
.../waterpuzzle/nodes/WaterNodeAir.java | 59 +
.../waterpuzzle/nodes/WaterNodeEnd.java | 60 +
.../waterpuzzle/nodes/WaterNodeStart.java | 66 +
.../waterpuzzle/nodes/WaterNodeToggleable.java | 71 +
.../waterpuzzle/nodes/WaterNodeWall.java | 62 +
.../mod/events/impl/AuthChangedEvent.java | 6 +
.../mod/events/impl/BlockUpdateEvent.java | 37 +
.../mod/events/impl/BossroomEnterEvent.java | 24 +
.../events/impl/DiscordUserJoinRequestEvent.java | 33 +
.../mod/events/impl/DiscordUserUpdateEvent.java | 32 +
.../impl/DungeonContextInitializationEvent.java | 24 +
.../mod/events/impl/DungeonEndedEvent.java | 24 +
.../mod/events/impl/DungeonLeftEvent.java | 24 +
.../mod/events/impl/DungeonStartedEvent.java | 24 +
.../mod/events/impl/HypixelJoinedEvent.java | 24 +
.../mod/events/impl/KeyBindPressedEvent.java | 31 +
.../mod/events/impl/PlayerInteractEntityEvent.java | 39 +
.../mod/events/impl/PlayerListItemPacketEvent.java | 32 +
.../mod/events/impl/SkyblockJoinedEvent.java | 24 +
.../mod/events/impl/SkyblockLeftEvent.java | 24 +
.../mod/events/impl/StompConnectedEvent.java | 32 +
.../dungeonsguide/mod/events/impl/TitleEvent.java | 32 +
.../mod/events/impl/WindowUpdateEvent.java | 34 +
.../mod/events/listener/DungeonListener.java | 513 ++++++++
.../mod/events/listener/FeatureListener.java | 512 ++++++++
.../mod/events/listener/PacketListener.java | 191 +++
.../mod/features/AbstractFeature.java | 114 ++
.../mod/features/FeatureParameter.java | 72 +
.../mod/features/FeatureRegistry.java | 337 +++++
.../dungeonsguide/mod/features/GuiFeature.java | 160 +++
.../dungeonsguide/mod/features/SimpleFeature.java | 33 +
.../mod/features/impl/advanced/FeatureDebug.java | 31 +
.../features/impl/advanced/FeatureDebugTrap.java | 80 ++
.../impl/advanced/FeatureDebuggableMap.java | 88 ++
.../impl/advanced/FeatureRoomCoordDisplay.java | 94 ++
.../impl/advanced/FeatureRoomDebugInfo.java | 95 ++
.../features/impl/advanced/FeatureTestPepole.java | 460 +++++++
.../mod/features/impl/boss/FeatureAutoReparty.java | 34 +
.../mod/features/impl/boss/FeatureBossHealth.java | 104 ++
.../features/impl/boss/FeatureBoxRealLivid.java | 54 +
.../mod/features/impl/boss/FeatureChestPrice.java | 174 +++
.../features/impl/boss/FeatureCurrentPhase.java | 74 ++
.../mod/features/impl/boss/FeatureHideAnimals.java | 76 ++
.../features/impl/boss/FeatureTerracotaTimer.java | 77 ++
.../impl/boss/FeatureThornBearPercentage.java | 78 ++
.../impl/boss/FeatureThornSpiritBowTimer.java | 110 ++
.../features/impl/boss/FeatureWarningOnPortal.java | 200 +++
.../terminal/CorrectThePaneSolutionProvider.java | 53 +
.../impl/boss/terminal/FeatureSimonSaysSolver.java | 113 ++
.../impl/boss/terminal/FeatureTerminalSolvers.java | 153 +++
.../terminal/NavigateMazeSolutionProvider.java | 144 ++
.../terminal/SelectAllColorSolutionProivider.java | 60 +
.../terminal/SelectInOrderSolutionProvider.java | 72 +
.../impl/boss/terminal/TerminalSolution.java | 30 +
.../boss/terminal/TerminalSolutionProvider.java | 29 +
.../terminal/WhatStartsWithSolutionProvider.java | 50 +
.../impl/cosmetics/FeatureNicknameColor.java | 49 +
.../impl/cosmetics/FeatureNicknamePrefix.java | 49 +
.../features/impl/cosmetics/PrefixSelectorGUI.java | 188 +++
.../impl/discord/inviteViewer/ImageTexture.java | 118 ++
.../discord/inviteViewer/PartyInviteViewer.java | 314 +++++
.../discord/inviteViewer/PartyJoinRequest.java | 59 +
.../impl/discord/invteTooltip/MTooltipInvite.java | 127 ++
.../invteTooltip/MTooltipInviteElement.java | 109 ++
.../impl/discord/onlinealarm/PlayingDGAlarm.java | 170 +++
.../mod/features/impl/dungeon/FeatureBoxBats.java | 68 +
.../impl/dungeon/FeatureBoxSkelemaster.java | 68 +
.../features/impl/dungeon/FeatureBoxStarMobs.java | 68 +
.../features/impl/dungeon/FeatureCollectScore.java | 77 ++
.../dungeon/FeatureDungeonCurrentRoomSecrets.java | 108 ++
.../impl/dungeon/FeatureDungeonDeaths.java | 168 +++
.../features/impl/dungeon/FeatureDungeonMap.java | 508 ++++++++
.../impl/dungeon/FeatureDungeonMilestone.java | 110 ++
.../impl/dungeon/FeatureDungeonRealTime.java | 91 ++
.../impl/dungeon/FeatureDungeonRoomName.java | 95 ++
.../impl/dungeon/FeatureDungeonSBTime.java | 119 ++
.../features/impl/dungeon/FeatureDungeonScore.java | 351 +++++
.../impl/dungeon/FeatureDungeonSecrets.java | 145 +++
.../features/impl/dungeon/FeatureDungeonTombs.java | 88 ++
.../features/impl/dungeon/FeatureHideNameTags.java | 53 +
.../features/impl/dungeon/FeaturePlayerESP.java | 111 ++
.../dungeon/FeaturePressAnyKeyToCloseChest.java | 89 ++
.../impl/dungeon/FeatureWarnLowHealth.java | 106 ++
.../impl/dungeon/FeatureWatcherWarning.java | 87 ++
.../impl/etc/FeatureAutoAcceptReparty.java | 68 +
.../features/impl/etc/FeatureCooldownCounter.java | 96 ++
.../mod/features/impl/etc/FeatureCopyMessages.java | 42 +
.../impl/etc/FeatureDecreaseExplosionSound.java | 52 +
.../features/impl/etc/FeatureDisableMessage.java | 77 ++
.../features/impl/etc/FeatureEpicCountdown.java | 156 +++
.../mod/features/impl/etc/FeaturePenguins.java | 168 +++
.../features/impl/etc/FeatureRepartyCommand.java | 29 +
.../impl/etc/FeatureTooltipDungeonStat.java | 52 +
.../mod/features/impl/etc/FeatureTooltipPrice.java | 111 ++
.../mod/features/impl/etc/FeatureUpdateAlarm.java | 56 +
.../impl/etc/ability/FeatureAbilityCooldown.java | 402 ++++++
.../features/impl/etc/ability/SkyblockAbility.java | 32 +
.../mod/features/impl/etc/ability/UsedAbility.java | 31 +
.../mod/features/impl/party/APIKey.java | 56 +
.../features/impl/party/FeatureGoodParties.java | 121 ++
.../mod/features/impl/party/FeaturePartyList.java | 97 ++
.../mod/features/impl/party/FeaturePartyReady.java | 180 +++
.../party/customgui/FeatureCustomPartyFinder.java | 110 ++
.../impl/party/customgui/GuiCustomPartyFinder.java | 75 ++
.../impl/party/customgui/PanelPartyFinder.java | 341 +++++
.../party/customgui/PanelPartyFinderSettings.java | 293 +++++
.../party/customgui/PanelPartyListElement.java | 236 ++++
.../impl/party/playerpreview/FakePlayer.java | 101 ++
.../FeatureViewPlayerStatsOnJoin.java | 706 ++++++++++
.../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 ++
.../mod/features/impl/secret/FeatureActions.java | 143 ++
.../mod/features/impl/secret/FeatureBloodRush.java | 45 +
.../impl/secret/FeatureCreateRefreshLine.java | 69 +
.../impl/secret/FeatureFreezePathfind.java | 45 +
.../impl/secret/FeaturePathfindStrategy.java | 106 ++
.../features/impl/secret/FeaturePathfindToAll.java | 45 +
.../impl/secret/FeatureSoulRoomWarning.java | 232 ++++
.../impl/secret/FeatureTogglePathfind.java | 45 +
.../impl/secret/PathfindLineProperties.java | 115 ++
.../mechanicbrowser/FeatureMechanicBrowse.java | 164 +++
.../mechanicbrowser/MGuiMechanicBrowser.java | 45 +
.../mechanicbrowser/MechanicBrowserElement.java | 61 +
.../mechanicbrowser/MechanicBrowserTooltip.java | 68 +
.../mechanicbrowser/PanelMechanicBrowser.java | 343 +++++
.../features/impl/solvers/FeatureSolverBlaze.java | 51 +
.../impl/solvers/FeatureSolverBombdefuse.java | 30 +
.../features/impl/solvers/FeatureSolverBox.java | 57 +
.../impl/solvers/FeatureSolverIcefill.java | 40 +
.../features/impl/solvers/FeatureSolverKahoot.java | 35 +
.../features/impl/solvers/FeatureSolverRiddle.java | 35 +
.../impl/solvers/FeatureSolverSilverfish.java | 44 +
.../impl/solvers/FeatureSolverTeleport.java | 39 +
.../impl/solvers/FeatureSolverTictactoe.java | 39 +
.../features/listener/BossroomEnterListener.java | 23 +
.../mod/features/listener/ChatListener.java | 25 +
.../mod/features/listener/ChatListenerGlobal.java | 25 +
.../listener/DiscordUserJoinRequestListener.java | 25 +
.../listener/DiscordUserUpdateListener.java | 25 +
.../DungeonContextInitializationListener.java | 23 +
.../mod/features/listener/DungeonEndListener.java | 23 +
.../mod/features/listener/DungeonQuitListener.java | 23 +
.../features/listener/DungeonStartListener.java | 23 +
.../listener/EntityLivingRenderListener.java | 26 +
.../listener/GuiBackgroundRenderListener.java | 25 +
.../mod/features/listener/GuiClickListener.java | 25 +
.../mod/features/listener/GuiOpenListener.java | 25 +
.../features/listener/GuiPostRenderListener.java | 25 +
.../features/listener/GuiPreRenderListener.java | 25 +
.../mod/features/listener/GuiUpdateListener.java | 25 +
.../mod/features/listener/InteractListener.java | 25 +
.../mod/features/listener/KeyInputListener.java | 25 +
.../features/listener/KeybindPressedListener.java | 25 +
.../features/listener/PlayerRenderListener.java | 26 +
.../features/listener/ScreenRenderListener.java | 23 +
.../features/listener/SkyblockJoinListener.java | 23 +
.../features/listener/SkyblockLeaveListener.java | 23 +
.../mod/features/listener/SoundListener.java | 25 +
.../features/listener/StompConnectedListener.java | 25 +
.../features/listener/TextureStichListener.java | 25 +
.../mod/features/listener/TickListener.java | 23 +
.../mod/features/listener/TitleListener.java | 25 +
.../mod/features/listener/TooltipListener.java | 25 +
.../mod/features/listener/WorldRenderListener.java | 23 +
.../features/text/PanelTextParameterConfig.java | 283 ++++
.../mod/features/text/StyledText.java | 29 +
.../mod/features/text/StyledTextProvider.java | 30 +
.../mod/features/text/StyledTextRenderer.java | 244 ++++
.../mod/features/text/TextHUDFeature.java | 191 +++
.../dungeonsguide/mod/features/text/TextStyle.java | 34 +
.../kr/syeyoung/dungeonsguide/mod/gui/MGui.java | 247 ++++
.../kr/syeyoung/dungeonsguide/mod/gui/MPanel.java | 296 +++++
.../dungeonsguide/mod/gui/elements/MButton.java | 117 ++
.../mod/gui/elements/MCollapsable.java | 137 ++
.../dungeonsguide/mod/gui/elements/MColor.java | 48 +
.../mod/gui/elements/MEditableAColor.java | 106 ++
.../mod/gui/elements/MFloatSelectionButton.java | 97 ++
.../mod/gui/elements/MIntegerSelectionButton.java | 95 ++
.../mod/gui/elements/MKeyEditButton.java | 147 +++
.../dungeonsguide/mod/gui/elements/MLabel.java | 72 +
.../mod/gui/elements/MLabelAndElement.java | 75 ++
.../dungeonsguide/mod/gui/elements/MList.java | 93 ++
.../dungeonsguide/mod/gui/elements/MModal.java | 92 ++
.../mod/gui/elements/MModalConfirmation.java | 87 ++
.../mod/gui/elements/MModalMessage.java | 77 ++
.../mod/gui/elements/MNavigatingPane.java | 213 +++
.../mod/gui/elements/MPanelScaledGUI.java | 213 +++
.../dungeonsguide/mod/gui/elements/MParameter.java | 90 ++
.../mod/gui/elements/MPassiveLabelAndElement.java | 71 +
.../dungeonsguide/mod/gui/elements/MPopupMenu.java | 97 ++
.../mod/gui/elements/MPortableColorEdit.java | 292 +++++
.../dungeonsguide/mod/gui/elements/MRootPanel.java | 60 +
.../dungeonsguide/mod/gui/elements/MScrollBar.java | 209 +++
.../mod/gui/elements/MScrollablePanel.java | 185 +++
.../dungeonsguide/mod/gui/elements/MSpacer.java | 36 +
.../mod/gui/elements/MStringSelectionButton.java | 94 ++
.../mod/gui/elements/MTabbedPane.java | 160 +++
.../dungeonsguide/mod/gui/elements/MTextField.java | 418 ++++++
.../mod/gui/elements/MToggleButton.java | 96 ++
.../dungeonsguide/mod/gui/elements/MTooltip.java | 107 ++
.../mod/gui/elements/MTooltipText.java | 44 +
.../dungeonsguide/mod/gui/elements/MValue.java | 79 ++
.../dungeonsguide/mod/party/PartyContext.java | 102 ++
.../dungeonsguide/mod/party/PartyManager.java | 626 +++++++++
.../dungeonsguide/mod/resources/DGTexturePack.java | 71 +
.../mod/stomp/FailedWebSocketConnection.java | 7 +
.../dungeonsguide/mod/stomp/StompClient.java | 192 +++
.../dungeonsguide/mod/stomp/StompDiedEvent.java | 15 +
.../dungeonsguide/mod/stomp/StompHeader.java | 24 +
.../dungeonsguide/mod/stomp/StompManager.java | 73 ++
.../dungeonsguide/mod/stomp/StompPayload.java | 96 ++
.../dungeonsguide/mod/stomp/StompSubscription.java | 6 +
.../syeyoung/dungeonsguide/mod/utils/AhUtils.java | 98 ++
.../dungeonsguide/mod/utils/ArrayUtils.java | 40 +
.../dungeonsguide/mod/utils/BlockCache.java | 50 +
.../dungeonsguide/mod/utils/GlStateUtils.java | 68 +
.../syeyoung/dungeonsguide/mod/utils/MapUtils.java | 176 +++
.../dungeonsguide/mod/utils/RenderUtils.java | 1372 +++++++++++++++++++
.../dungeonsguide/mod/utils/ScoreBoardUtils.java | 58 +
.../dungeonsguide/mod/utils/ShortUtils.java | 47 +
.../dungeonsguide/mod/utils/SkyblockUtils.java | 52 +
.../dungeonsguide/mod/utils/TabListUtil.java | 75 ++
.../dungeonsguide/mod/utils/TextUtils.java | 121 ++
.../dungeonsguide/mod/utils/TimeScoreUtil.java | 82 ++
.../dungeonsguide/mod/utils/TitleRender.java | 139 ++
.../dungeonsguide/mod/utils/VectorUtils.java | 51 +
.../syeyoung/dungeonsguide/mod/utils/XPUtils.java | 222 ++++
.../mod/utils/cursor/CursorReader.java | 95 ++
.../dungeonsguide/mod/utils/cursor/EnumCursor.java | 54 +
.../dungeonsguide/mod/utils/cursor/Foundation.java | 33 +
.../dungeonsguide/mod/utils/cursor/GLCursors.java | 231 ++++
.../dungeonsguide/mod/utils/cursor/User32.java | 67 +
.../dungeonsguide/mod/utils/cursor/X11.java | 37 +
.../mod/wsresource/StaticResource.java | 30 +
.../mod/wsresource/StaticResourceCache.java | 77 ++
.../dungeonsguide/pathfinding/AStarCornerCut.java | 189 ---
.../dungeonsguide/pathfinding/AStarFineGrid.java | 182 ---
.../dungeonsguide/pathfinding/CachedWorld.java | 97 --
.../dungeonsguide/pathfinding/JPSPathfinder.java | 311 -----
.../pathfinding/NodeProcessorDungeonRoom.java | 142 --
.../dungeonsguide/pathfinding/ThetaStar.java | 211 ---
.../dungeonsguide/resources/DGTexturePack.java | 72 -
.../dungeonsguide/roomedit/EditingContext.java | 87 --
.../syeyoung/dungeonsguide/roomedit/Parameter.java | 40 -
.../roomedit/gui/GuiDungeonAddSet.java | 143 --
.../roomedit/gui/GuiDungeonParameterEdit.java | 179 ---
.../roomedit/gui/GuiDungeonRoomEdit.java | 75 --
.../roomedit/gui/GuiDungeonValueEdit.java | 133 --
.../mechanicedit/ValueEditBreakableWall.java | 143 --
.../roomedit/mechanicedit/ValueEditDoor.java | 157 ---
.../roomedit/mechanicedit/ValueEditDummy.java | 122 --
.../roomedit/mechanicedit/ValueEditFairySoul.java | 119 --
.../roomedit/mechanicedit/ValueEditJournal.java | 123 --
.../roomedit/mechanicedit/ValueEditLever.java | 133 --
.../roomedit/mechanicedit/ValueEditNPC.java | 123 --
.../roomedit/mechanicedit/ValueEditOnewayDoor.java | 143 --
.../mechanicedit/ValueEditOnewayLever.java | 137 --
.../mechanicedit/ValueEditPressurePlate.java | 136 --
.../roomedit/mechanicedit/ValueEditSecret.java | 129 --
.../roomedit/mechanicedit/ValueEditTomb.java | 118 --
.../roomedit/panes/ActionDisplayPane.java | 82 --
.../roomedit/panes/ActionTreeDisplayPane.java | 217 ---
.../roomedit/panes/DynamicEditor.java | 29 -
.../roomedit/panes/GeneralEditPane.java | 285 ----
.../roomedit/panes/ProcessorParameterEditPane.java | 144 --
.../roomedit/panes/RoomDataDisplayPane.java | 127 --
.../roomedit/panes/RoomMatchDisplayPane.java | 152 ---
.../roomedit/panes/RoommatchingPane.java | 84 --
.../roomedit/panes/SecretEditPane.java | 156 ---
.../roomedit/valueedit/ValueEdit.java | 27 -
.../roomedit/valueedit/ValueEditAColor.java | 339 -----
.../roomedit/valueedit/ValueEditBoolean.java | 101 --
.../roomedit/valueedit/ValueEditColor.java | 287 ----
.../roomedit/valueedit/ValueEditCreator.java | 29 -
.../roomedit/valueedit/ValueEditFloat.java | 99 --
.../roomedit/valueedit/ValueEditInteger.java | 99 --
.../roomedit/valueedit/ValueEditNull.java | 38 -
.../roomedit/valueedit/ValueEditOffsetPoint.java | 163 ---
.../valueedit/ValueEditOffsetPointSet.java | 250 ----
.../roomedit/valueedit/ValueEditRegistry.java | 70 -
.../roomedit/valueedit/ValueEditString.java | 99 --
.../roomprocessor/GeneralRoomProcessor.java | 448 -------
.../roomprocessor/ProcessorFactory.java | 65 -
.../dungeonsguide/roomprocessor/RoomProcessor.java | 49 -
.../roomprocessor/RoomProcessorBlazeSolver.java | 216 ---
.../roomprocessor/RoomProcessorButtonSolver.java | 133 --
.../roomprocessor/RoomProcessorCreeperSolver.java | 153 ---
.../roomprocessor/RoomProcessorGenerator.java | 25 -
.../roomprocessor/RoomProcessorIcePath.java | 236 ----
.../roomprocessor/RoomProcessorRedRoom.java | 125 --
.../roomprocessor/RoomProcessorRiddle.java | 123 --
.../RoomProcessorTeleportMazeSolver.java | 145 ---
.../RoomProcessorTicTacToeSolver.java | 216 ---
.../roomprocessor/RoomProcessorTrivia.java | 167 ---
.../bombdefuse/RoomProcessorBombDefuseSolver.java | 441 -------
.../bombdefuse/chambers/BDChamber.java | 83 --
.../chambers/BombDefuseChamberGenerator.java | 30 -
.../bombdefuse/chambers/ChamberProcessor.java | 27 -
.../chambers/DummyDefuseChamberProcessor.java | 33 -
.../chambers/GeneralDefuseChamberProcessor.java | 139 --
.../chambers/arrow/ArrowLeftProcessor.java | 138 --
.../chambers/arrow/ArrowProcessorMatcher.java | 52 -
.../chambers/arrow/ArrowRightProcessor.java | 127 --
.../chambers/bugged/ImpossibleMatcher.java | 47 -
.../chambers/color/ColorLeftProcessor.java | 233 ----
.../chambers/color/ColorProcessorMatcher.java | 49 -
.../chambers/color/ColorRightProcessor.java | 177 ---
.../chambers/creeper/CreeperLeftProcessor.java | 102 --
.../chambers/creeper/CreeperProcessorMatcher.java | 52 -
.../chambers/creeper/CreeperRightProcessor.java | 76 --
.../goldenpath/GoldenPathLeftProcessor.java | 143 --
.../goldenpath/GoldenPathProcessorMatcher.java | 49 -
.../goldenpath/GoldenPathRightProcessor.java | 100 --
.../chambers/maze/MazeLeftProcessor.java | 89 --
.../chambers/maze/MazeProcessorMatcher.java | 49 -
.../chambers/maze/MazeRightProcessor.java | 79 --
.../chambers/number/NumberLeftProcessor.java | 132 --
.../chambers/number/NumberProcessorMatcher.java | 53 -
.../chambers/number/NumberRightProcessor.java | 117 --
.../bossfight/BossfightProcessor.java | 33 -
.../bossfight/BossfightProcessorBonzo.java | 86 --
.../bossfight/BossfightProcessorLivid.java | 90 --
.../bossfight/BossfightProcessorNecron.java | 80 --
.../bossfight/BossfightProcessorProf.java | 144 --
.../bossfight/BossfightProcessorSadan.java | 144 --
.../bossfight/BossfightProcessorScarf.java | 134 --
.../bossfight/BossfightProcessorThorn.java | 104 --
.../bossfight/GeneralBossfightProcessor.java | 155 ---
.../roomprocessor/bossfight/HealthData.java | 33 -
.../boxpuzzle/BoxPuzzleSolvingThread.java | 184 ---
.../boxpuzzle/RoomProcessorBoxSolver.java | 392 ------
.../icefill/RoomProcessorIcePath2.java | 160 ---
.../roomprocessor/waterpuzzle/LeverState.java | 33 -
.../waterpuzzle/LeverStateContradict.java | 25 -
.../waterpuzzle/RoomProcessorWaterPuzzle.java | 124 --
.../roomprocessor/waterpuzzle/Route.java | 60 -
.../roomprocessor/waterpuzzle/SwitchData.java | 46 -
.../roomprocessor/waterpuzzle/WaterBoard.java | 423 ------
.../roomprocessor/waterpuzzle/WaterNode.java | 36 -
.../waterpuzzle/nodes/WaterNodeAir.java | 59 -
.../waterpuzzle/nodes/WaterNodeEnd.java | 60 -
.../waterpuzzle/nodes/WaterNodeStart.java | 66 -
.../waterpuzzle/nodes/WaterNodeToggleable.java | 71 -
.../waterpuzzle/nodes/WaterNodeWall.java | 62 -
.../dungeonsguide/rpc/JDiscordActivity.java | 72 -
.../dungeonsguide/rpc/JDiscordRelation.java | 42 -
.../syeyoung/dungeonsguide/rpc/JDiscordUser.java | 40 -
.../dungeonsguide/rpc/RichPresenceManager.java | 251 ----
.../dungeonsguide/stomp/CloseListener.java | 23 -
.../syeyoung/dungeonsguide/stomp/StompClient.java | 194 ---
.../dungeonsguide/stomp/StompClientStatus.java | 23 -
.../syeyoung/dungeonsguide/stomp/StompHeader.java | 27 -
.../dungeonsguide/stomp/StompInterface.java | 26 -
.../dungeonsguide/stomp/StompMessageHandler.java | 23 -
.../syeyoung/dungeonsguide/stomp/StompPayload.java | 86 --
.../dungeonsguide/stomp/StompSubscription.java | 41 -
.../syeyoung/dungeonsguide/url/DGConnection.java | 18 +-
.../dungeonsguide/url/DGStreamHandler.java | 4 +-
.../dungeonsguide/url/DGStreamHandlerFactory.java | 4 +-
.../kr/syeyoung/dungeonsguide/utils/AhUtils.java | 87 --
.../syeyoung/dungeonsguide/utils/ArrayUtils.java | 40 -
.../syeyoung/dungeonsguide/utils/GlStateUtils.java | 69 -
.../kr/syeyoung/dungeonsguide/utils/MapUtils.java | 177 ---
.../syeyoung/dungeonsguide/utils/RenderUtils.java | 1377 --------------------
.../syeyoung/dungeonsguide/utils/ShortUtils.java | 47 -
.../dungeonsguide/utils/SkyblockUtils.java | 54 -
.../kr/syeyoung/dungeonsguide/utils/TextUtils.java | 122 --
.../dungeonsguide/utils/TimeScoreUtil.java | 87 --
.../syeyoung/dungeonsguide/utils/VectorUtils.java | 53 -
.../kr/syeyoung/dungeonsguide/utils/XPUtils.java | 222 ----
.../dungeonsguide/utils/cursor/CursorReader.java | 99 --
.../dungeonsguide/utils/cursor/EnumCursor.java | 54 -
.../dungeonsguide/utils/cursor/Foundation.java | 34 -
.../dungeonsguide/utils/cursor/GLCursors.java | 224 ----
.../dungeonsguide/utils/cursor/User32.java | 68 -
.../syeyoung/dungeonsguide/utils/cursor/X11.java | 37 -
.../dungeonsguide/wsresource/StaticResource.java | 30 -
.../wsresource/StaticResourceCache.java | 83 --
.../resources/assets/dg/textures/dglogox128.png | Bin 0 -> 3024 bytes
.../resources/assets/dg/textures/dglogox32.png | Bin 0 -> 648 bytes
.../assets/skyblock_dungeons_guide/sounds.json | 10 +
.../skyblock_dungeons_guide/sounds/readysetgo.ogg | Bin 0 -> 161265 bytes
src/main/resources/mcmod.info | 6 +-
1120 files changed, 55834 insertions(+), 54249 deletions(-)
create mode 100644 .github/workflows/beta.yml
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/Authenticator.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/DGInterface.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/DungeonsGuide.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/IDungeonGuide.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/Keybinds.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/SkyblockStatus.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/YoMamaOutdated.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/auth/AuthManager.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/auth/AuthUtil.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/auth/InvalidDungeonsGuideCredentialsException.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/auth/ResourceManager.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/auth/authprovider/AuthProvider.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/auth/authprovider/DgAuth/DgAuth.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/auth/authprovider/DgAuth/DgAuthUtil.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/auth/authprovider/NullAuth.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/chat/ChatProcessResult.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/chat/ChatProcessor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/chat/ChatSubscriber.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/chat/PartyContext.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/chat/PartyManager.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/commands/CommandDungeonsGuide.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/commands/CommandReparty.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/Config.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/ConfigPanelCreator.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/GuiConfigV2.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MCategory.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MCategoryElement.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MFeature.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MFeatureEdit.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MNotFound.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MPanelCategory.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MParameterEdit.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/NestedCategory.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/RootConfigPanel.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/location/GuiGuiLocationConfig.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/location/Marker.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/location/PanelDelegate.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/types/AColor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/types/GUIRectangle.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/types/TCAColor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/types/TCBoolean.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/types/TCColor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/types/TCFloat.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/types/TCGUIRectangle.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/types/TCInteger.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/types/TCKeybind.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/types/TCRectangle.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/types/TCString.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/types/TCStringList.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/types/TCTextStyle.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/types/TCTextStyleList.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/types/TypeConverter.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/config/types/TypeConverterRegistry.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/cosmetics/ActiveCosmetic.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/cosmetics/CosmeticData.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/cosmetics/CosmeticsManager.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/cosmetics/CustomNetworkPlayerInfo.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/cosmetics/CustomPacketPlayerListItem.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/cosmetics/IChatReplacer.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/cosmetics/chatreplacers/ChatReplacerChatByMe.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/cosmetics/chatreplacers/ChatReplacerCoop.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/cosmetics/chatreplacers/ChatReplacerMessage.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/cosmetics/chatreplacers/ChatReplacerPV.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/cosmetics/chatreplacers/ChatReplacerSocialOptions.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/cosmetics/chatreplacers/ChatReplacerViewProfile.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/dungeon/DungeonActionManager.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/DungeonContext.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/MapProcessor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/dungeon/actions/AbstractAction.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/actions/Action.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/actions/ActionBreakWithSuperBoom.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/actions/ActionChangeState.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/actions/ActionClick.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/actions/ActionClickSet.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/dungeon/actions/ActionComplete.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/actions/ActionDropItem.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/actions/ActionInteract.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/actions/ActionKill.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/actions/ActionMove.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/actions/ActionMoveNearestAir.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/actions/ActionRoot.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/dungeon/actions/tree/ActionRoute.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/actions/tree/ActionTree.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/dungeon/actions/tree/ActionTreeUtil.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/CatacombDataProvider.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/CatacombMasterDataProvider.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/DungeonDoor.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/DungeonSpecificDataProvider.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/DungeonSpecificDataProviderRegistry.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/EDungeonDoorType.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/dungeon/events/DungeonCryptBrokenEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/dungeon/events/DungeonDeathEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/dungeon/events/DungeonEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/dungeon/events/DungeonEventData.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/dungeon/events/DungeonEventHolder.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/dungeon/events/DungeonMapUpdateEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/dungeon/events/DungeonNodataEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/dungeon/events/DungeonPuzzleFailureEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/dungeon/events/DungeonRoomDiscoverEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/dungeon/events/DungeonSecretCountChangeEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/dungeon/events/DungeonStateChangeEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/dungeon/events/SerializableBlockPos.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/mechanics/DungeonMechanic.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/mechanics/RouteBlocker.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/mechanics/dunegonmechanic/DungeonMechanic.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/mechanics/dunegonmechanic/RouteBlocker.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/roomfinder/DungeonRoom.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/roomfinder/DungeonRoomInfoRegistry.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/dungeon/roomfinder/RoomMatcher.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/eventlistener/DungeonListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/eventlistener/FeatureListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/eventlistener/PacketListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/events/BlockUpdateEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/events/BossroomEnterEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/events/DiscordUserJoinRequestEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/events/DiscordUserUpdateEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/events/DungeonContextInitializationEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/events/DungeonEndedEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/events/DungeonLeftEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/events/DungeonStartedEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/events/HypixelJoinedEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/events/KeyBindPressedEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/events/PlayerInteractEntityEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/events/PlayerListItemPacketEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/events/SkyblockJoinedEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/events/SkyblockLeftEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/events/StompConnectedEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/events/TitleEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/events/WindowUpdateEvent.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/AbstractFeature.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/FeatureParameter.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/FeatureRegistry.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/GuiFeature.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/SimpleFeature.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/advanced/FeatureDebug.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/advanced/FeatureDebuggableMap.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/advanced/FeatureRoomCoordDisplay.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/advanced/FeatureRoomDebugInfo.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/boss/FeatureAutoReparty.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/boss/FeatureBossHealth.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/boss/FeatureBoxRealLivid.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/boss/FeatureChestPrice.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/boss/FeatureCurrentPhase.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/boss/FeatureHideAnimals.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/boss/FeatureTerracotaTimer.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/boss/FeatureThornBearPercentage.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/boss/FeatureThornSpiritBowTimer.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/boss/FeatureWarningOnPortal.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/boss/terminal/CorrectThePaneSolutionProvider.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/boss/terminal/FeatureSimonSaysSolver.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/boss/terminal/FeatureTerminalSolvers.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/boss/terminal/NavigateMazeSolutionProvider.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/boss/terminal/SelectAllColorSolutionProivider.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/boss/terminal/SelectInOrderSolutionProvider.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/boss/terminal/TerminalSolution.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/boss/terminal/TerminalSolutionProvider.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/boss/terminal/WhatStartsWithSolutionProvider.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/cosmetics/FeatureNicknameColor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/cosmetics/FeatureNicknamePrefix.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/cosmetics/PrefixSelectorGUI.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/discord/inviteViewer/ImageTexture.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/discord/inviteViewer/PartyInviteViewer.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/discord/inviteViewer/PartyJoinRequest.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/discord/invteTooltip/MTooltipInvite.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/discord/invteTooltip/MTooltipInviteElement.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/discord/onlinealarm/PlayingDGAlarm.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureBoxBats.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureBoxSkelemaster.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureBoxStarMobs.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureCollectScore.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureDungeonCurrentRoomSecrets.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureDungeonDeaths.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureDungeonMap.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureDungeonMilestone.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureDungeonRealTime.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureDungeonRoomName.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureDungeonSBTime.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureDungeonScore.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureDungeonSecrets.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureDungeonTombs.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureHideNameTags.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeaturePlayerESP.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeaturePressAnyKeyToCloseChest.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureWarnLowHealth.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/dungeon/FeatureWatcherWarning.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/etc/FeatureAutoAcceptReparty.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/etc/FeatureCooldownCounter.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/etc/FeatureCopyMessages.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/etc/FeatureDecreaseExplosionSound.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/etc/FeatureDisableMessage.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/etc/FeaturePenguins.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/etc/FeatureRepartyCommand.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/etc/FeatureTooltipDungeonStat.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/etc/FeatureTooltipPrice.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/etc/FeatureUpdateAlarm.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/etc/ability/FeatureAbilityCooldown.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/etc/ability/SkyblockAbility.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/etc/ability/UsedAbility.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/APIKey.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/FeatureGoodParties.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/FeaturePartyList.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/FeaturePartyReady.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/FeatureCustomPartyFinder.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/GuiCustomPartyFinder.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/PanelPartyFinder.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/PanelPartyFinderSettings.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/PanelPartyListElement.java
delete 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/FeatureViewPlayerStatsOnJoin.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/ApiFetcher.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/CachedData.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/PlayerSkyblockData.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/SkinFetcher.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/PlayerProfile.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/PlayerProfileParser.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/ClassSpecificData.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonClass.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonSpecificData.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonStat.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonType.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/FloorSpecificData.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/Pet.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/api/playerprofile/dataclasses/Skill.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/DataRendererEditor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/DataRendererRegistry.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/IDataRenderer.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonFloorStat.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonHighestFloorStat.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererClassLv.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererDungeonLv.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererFairySouls.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererLilyWeight.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSecrets.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSelectedClassLv.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSetUrOwn.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererSkillLv.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/playerpreview/datarenders/impl/DataRendererTalismans.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/secret/FeatureActions.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/secret/FeatureBloodRush.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/secret/FeatureCreateRefreshLine.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/secret/FeatureFreezePathfind.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/secret/FeaturePathfindStrategy.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/secret/FeaturePathfindToAll.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/secret/FeatureSoulRoomWarning.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/secret/FeatureTogglePathfind.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/secret/PathfindLineProperties.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/secret/mechanicbrowser/FeatureMechanicBrowse.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/secret/mechanicbrowser/MGuiMechanicBrowser.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/secret/mechanicbrowser/MechanicBrowserElement.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/secret/mechanicbrowser/MechanicBrowserTooltip.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/secret/mechanicbrowser/PanelMechanicBrowser.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/solvers/FeatureSolverBlaze.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/solvers/FeatureSolverBombdefuse.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/solvers/FeatureSolverBox.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/solvers/FeatureSolverIcefill.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/solvers/FeatureSolverKahoot.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/solvers/FeatureSolverRiddle.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/solvers/FeatureSolverSilverfish.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/solvers/FeatureSolverTeleport.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/impl/solvers/FeatureSolverTictactoe.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/BossroomEnterListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/ChatListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/ChatListenerGlobal.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/DiscordUserJoinRequestListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/DiscordUserUpdateListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/DungeonContextInitializationListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/DungeonEndListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/DungeonQuitListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/DungeonStartListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/EntityLivingRenderListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/GuiBackgroundRenderListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/GuiClickListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/GuiOpenListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/GuiPostRenderListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/GuiPreRenderListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/GuiUpdateListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/InteractListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/KeyInputListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/KeybindPressedListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/PlayerRenderListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/ScreenRenderListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/SkyblockJoinListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/SkyblockLeaveListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/SoundListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/StompConnectedListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/TextureStichListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/TickListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/TitleListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/TooltipListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/listener/WorldRenderListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/text/PanelTextParameterConfig.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/text/StyledText.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/text/StyledTextProvider.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/text/StyledTextRenderer.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/text/TextHUDFeature.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/features/text/TextStyle.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/GameSDK.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/GameSDKTypeMapper.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/NativeGameSDK.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordActivity.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordActivityAssets.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordActivityParty.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordActivitySecrets.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordActivityTimestamps.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordCreateParams.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordEntitlement.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordFileStat.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordImageDimensions.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordImageHandle.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordInputMode.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordLobby.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordOAuth2Token.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordPartySize.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordPresence.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordRelationship.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordSku.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordSkuPrice.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordStruct.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordUser.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/datastruct/DiscordUserAchievement.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/enumuration/EDiscordActivityActionType.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/enumuration/EDiscordActivityJoinRequestReply.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/enumuration/EDiscordActivityType.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/enumuration/EDiscordCreateFlags.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/enumuration/EDiscordEntitlementType.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/enumuration/EDiscordImageType.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/enumuration/EDiscordInputModeType.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/enumuration/EDiscordLobbySearchCast.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/enumuration/EDiscordLobbySearchComparison.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/enumuration/EDiscordLobbySearchDistance.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/enumuration/EDiscordLobbyType.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/enumuration/EDiscordLogLevel.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/enumuration/EDiscordPremiumType.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/enumuration/EDiscordRelationshipType.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/enumuration/EDiscordResult.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/enumuration/EDiscordSkuType.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/enumuration/EDiscordStatus.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/enumuration/EDiscordUserFlag.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/GameSDKCallback.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordAchievementEvents.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordAchievementManager.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordActivityEvents.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordActivityManager.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordApplicationManager.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordCore.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordImageManager.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordLobbyEvents.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordLobbyManager.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordLobbyMemberTransaction.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordLobbySearchQuery.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordLobbyTransaction.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordNetworkEvents.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordNetworkManager.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordOverlayEvents.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordOverlayManager.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordRelationshipEvents.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordRelationshipManager.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordStorageManager.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordStoreEvents.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordStoreManager.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordUserEvents.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordUserManager.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordVoiceEvents.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/interfacestruct/IDiscordVoiceManager.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/typedef/DiscordClientID.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/typedef/DiscordNetworkChannelId.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/typedef/DiscordNetworkPeerId.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/typedef/DiscordSnowflake.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/typedef/DiscordTimestamp.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/typedef/DiscordVersion.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/typedef/Int32.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/typedef/Int64.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/typedef/UInt32.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/typedef/UInt64.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gamesdk/jna/typedef/UInt8.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gui/MGui.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gui/MPanel.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MButton.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MCollapsable.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MColor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MEditableAColor.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MFloatSelectionButton.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MIntegerSelectionButton.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MKeyEditButton.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MLabel.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MLabelAndElement.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MList.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MModal.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MModalConfirmation.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MModalMessage.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MNavigatingPane.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MPanelScaledGUI.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MParameter.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MPassiveLabelAndElement.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MPopupMenu.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MPortableColorEdit.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MRootPanel.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MScrollBar.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MScrollablePanel.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MSpacer.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MStringSelectionButton.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MTabbedPane.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MTextField.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MToggleButton.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MTooltip.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MTooltipText.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MValue.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/DungeonsGuide.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/Keybinds.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/SkyblockStatus.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/chat/ChatProcessResult.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/chat/ChatProcessor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/chat/ChatSubscriber.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/chat/ChatTransmitter.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandDgDebug.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandDungeonsGuide.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandReparty.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/Config.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/ConfigPanelCreator.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/GuiConfigV2.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/MCategory.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/MCategoryElement.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/MFeature.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/MFeatureEdit.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/MNotFound.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/MPanelCategory.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/MParameterEdit.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/NestedCategory.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/RootConfigPanel.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/location/GuiGuiLocationConfig.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/location/Marker.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/guiconfig/location/PanelDelegate.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/types/AColor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/types/GUIRectangle.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/types/TCAColor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/types/TCBoolean.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/types/TCColor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/types/TCFloat.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/types/TCGUIRectangle.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/types/TCInteger.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/types/TCKeybind.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/types/TCRectangle.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/types/TCString.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/types/TCStringList.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/types/TCTextStyle.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/types/TCTextStyleList.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/types/TypeConverter.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/config/types/TypeConverterRegistry.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/cosmetics/ActiveCosmetic.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/cosmetics/CosmeticData.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/cosmetics/CosmeticsManager.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/cosmetics/CustomNetworkPlayerInfo.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/cosmetics/CustomPacketPlayerListItem.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/cosmetics/IChatReplacer.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/cosmetics/chatreplacers/ChatReplacerChatByMe.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/cosmetics/chatreplacers/ChatReplacerCoop.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/cosmetics/chatreplacers/ChatReplacerMessage.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/cosmetics/chatreplacers/ChatReplacerPV.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/cosmetics/chatreplacers/ChatReplacerSocialOptions.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/cosmetics/chatreplacers/ChatReplacerViewProfile.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/GameSDK.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/GameSDKTypeMapper.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/NativeGameSDK.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordActivity.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordActivityAssets.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordActivityParty.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordActivitySecrets.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordActivityTimestamps.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordCreateParams.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordEntitlement.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordFileStat.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordImageDimensions.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordImageHandle.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordInputMode.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordLobby.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordOAuth2Token.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordPartySize.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordPresence.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordRelationship.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordSku.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordSkuPrice.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordStruct.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordUser.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/datastruct/DiscordUserAchievement.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/enumuration/EDiscordActivityActionType.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/enumuration/EDiscordActivityJoinRequestReply.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/enumuration/EDiscordActivityType.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/enumuration/EDiscordCreateFlags.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/enumuration/EDiscordEntitlementType.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/enumuration/EDiscordImageType.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/enumuration/EDiscordInputModeType.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/enumuration/EDiscordLobbySearchCast.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/enumuration/EDiscordLobbySearchComparison.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/enumuration/EDiscordLobbySearchDistance.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/enumuration/EDiscordLobbyType.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/enumuration/EDiscordLogLevel.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/enumuration/EDiscordPremiumType.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/enumuration/EDiscordRelationshipType.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/enumuration/EDiscordResult.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/enumuration/EDiscordSkuType.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/enumuration/EDiscordStatus.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/enumuration/EDiscordUserFlag.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/GameSDKCallback.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordAchievementEvents.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordAchievementManager.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordActivityEvents.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordActivityManager.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordApplicationManager.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordCore.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordImageManager.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordLobbyEvents.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordLobbyManager.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordLobbyMemberTransaction.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordLobbySearchQuery.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordLobbyTransaction.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordNetworkEvents.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordNetworkManager.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordOverlayEvents.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordOverlayManager.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordRelationshipEvents.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordRelationshipManager.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordStorageManager.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordStoreEvents.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordStoreManager.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordUserEvents.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordUserManager.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordVoiceEvents.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/interfacestruct/IDiscordVoiceManager.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/typedef/DiscordClientID.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/typedef/DiscordNetworkChannelId.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/typedef/DiscordNetworkPeerId.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/typedef/DiscordSnowflake.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/typedef/DiscordTimestamp.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/typedef/DiscordVersion.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/typedef/Int32.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/typedef/Int64.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/typedef/UInt32.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/typedef/UInt64.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/gamesdk/jna/typedef/UInt8.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/rpc/JDiscordActivity.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/rpc/JDiscordRelation.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/rpc/JDiscordUser.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/discord/rpc/RichPresenceManager.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/DungeonActionContext.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/DungeonContext.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/DungeonFacade.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/MapProcessor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/actions/AbstractAction.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/actions/ActionBreakWithSuperBoom.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/actions/ActionChangeState.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/actions/ActionClick.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/actions/ActionClickSet.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/actions/ActionComplete.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/actions/ActionDropItem.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/actions/ActionInteract.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/actions/ActionKill.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/actions/ActionMove.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/actions/ActionMoveNearestAir.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/actions/ActionRoot.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/actions/tree/ActionRoute.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/actions/tree/ActionRouteProperties.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/actions/tree/ActionTree.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/actions/tree/ActionTreeUtil.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/doorfinder/DungeonDoor.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/doorfinder/DungeonSpecificDataProvider.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/doorfinder/DungeonSpecificDataProviderRegistry.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/doorfinder/EDungeonDoorType.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/doorfinder/catacombs/CatacombsDataProvider.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/doorfinder/catacombs/impl/MasterModeDataProvider.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/doorfinder/catacombs/impl/NormalModeDataProvider.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/events/DungeonEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/events/DungeonEventData.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/events/DungeonEventHolder.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/events/SerializableBlockPos.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/events/impl/DungeonCryptBrokenEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/events/impl/DungeonDeathEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/events/impl/DungeonMapUpdateEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/events/impl/DungeonNodataEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/events/impl/DungeonPuzzleFailureEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/events/impl/DungeonRoomDiscoverEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/events/impl/DungeonSecretCountChangeEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/events/impl/DungeonStateChangeEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/map/DungeonMapData.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/pathfinding/AStarCornerCut.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/pathfinding/AStarFineGrid.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/pathfinding/CachedWorld.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/pathfinding/JPSPathfinder.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/pathfinding/NodeProcessorDungeonRoom.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/pathfinding/ThetaStar.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/EditingContext.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/Parameter.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/gui/GuiDungeonAddSet.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/gui/GuiDungeonParameterEdit.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/gui/GuiDungeonRoomEdit.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/gui/GuiDungeonValueEdit.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/mechanicedit/ValueEditBreakableWall.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/mechanicedit/ValueEditDoor.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/mechanicedit/ValueEditDummy.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/mechanicedit/ValueEditFairySoul.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/mechanicedit/ValueEditJournal.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/mechanicedit/ValueEditLever.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/mechanicedit/ValueEditNPC.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/mechanicedit/ValueEditOnewayDoor.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/mechanicedit/ValueEditOnewayLever.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/mechanicedit/ValueEditPressurePlate.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/mechanicedit/ValueEditSecret.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/mechanicedit/ValueEditTomb.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/panes/ActionDisplayPane.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/panes/ActionTreeDisplayPane.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/panes/DynamicEditor.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/panes/GeneralEditPane.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/panes/ProcessorParameterEditPane.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/panes/RoomDataDisplayPane.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/panes/RoomMatchDisplayPane.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/panes/RoommatchingPane.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/panes/SecretEditPane.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/valueedit/ValueEdit.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/valueedit/ValueEditAColor.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/valueedit/ValueEditBoolean.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/valueedit/ValueEditColor.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/valueedit/ValueEditCreator.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/valueedit/ValueEditFloat.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/valueedit/ValueEditInteger.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/valueedit/ValueEditNull.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/valueedit/ValueEditOffsetPoint.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/valueedit/ValueEditOffsetPointSet.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/valueedit/ValueEditRegistry.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomedit/valueedit/ValueEditString.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomfinder/DungeonRoom.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomfinder/DungeonRoomInfoRegistry.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomfinder/RoomMatcher.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/GeneralRoomProcessor.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/ProcessorFactory.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/RoomProcessor.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/RoomProcessorBlazeSolver.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/RoomProcessorButtonSolver.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/RoomProcessorCreeperSolver.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/RoomProcessorGenerator.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/RoomProcessorIcePath.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/RoomProcessorRedRoom.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/RoomProcessorRiddle.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/RoomProcessorTeleportMazeSolver.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/RoomProcessorTicTacToeSolver.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/RoomProcessorTrivia.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/RoomProcessorBombDefuseSolver.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/BDChamber.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/BombDefuseChamberGenerator.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/ChamberProcessor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/DummyDefuseChamberProcessor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/GeneralDefuseChamberProcessor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/arrow/ArrowLeftProcessor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/arrow/ArrowProcessorMatcher.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/arrow/ArrowRightProcessor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/bugged/ImpossibleMatcher.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/color/ColorLeftProcessor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/color/ColorProcessorMatcher.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/color/ColorRightProcessor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/creeper/CreeperLeftProcessor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/creeper/CreeperProcessorMatcher.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/creeper/CreeperRightProcessor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/goldenpath/GoldenPathLeftProcessor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/goldenpath/GoldenPathProcessorMatcher.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/goldenpath/GoldenPathRightProcessor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/maze/MazeLeftProcessor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/maze/MazeProcessorMatcher.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/maze/MazeRightProcessor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/number/NumberLeftProcessor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/number/NumberProcessorMatcher.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bombdefuse/chambers/number/NumberRightProcessor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bossfight/BossfightProcessor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bossfight/BossfightProcessorBonzo.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bossfight/BossfightProcessorLivid.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bossfight/BossfightProcessorNecron.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bossfight/BossfightProcessorProf.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bossfight/BossfightProcessorSadan.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bossfight/BossfightProcessorScarf.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bossfight/BossfightProcessorThorn.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bossfight/GeneralBossfightProcessor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/bossfight/HealthData.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/boxpuzzle/BoxPuzzleSolvingThread.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/boxpuzzle/RoomProcessorBoxSolver.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/icefill/RoomProcessorIcePath2.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/waterpuzzle/LeverState.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/waterpuzzle/LeverStateContradict.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/waterpuzzle/RoomProcessorWaterPuzzle.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/waterpuzzle/Route.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/waterpuzzle/SwitchData.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/waterpuzzle/WaterBoard.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/waterpuzzle/WaterNode.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/waterpuzzle/nodes/WaterNodeAir.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/waterpuzzle/nodes/WaterNodeEnd.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/waterpuzzle/nodes/WaterNodeStart.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/waterpuzzle/nodes/WaterNodeToggleable.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/dungeon/roomprocessor/waterpuzzle/nodes/WaterNodeWall.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/AuthChangedEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/BlockUpdateEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/BossroomEnterEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/DiscordUserJoinRequestEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/DiscordUserUpdateEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/DungeonContextInitializationEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/DungeonEndedEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/DungeonLeftEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/DungeonStartedEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/HypixelJoinedEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/KeyBindPressedEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/PlayerInteractEntityEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/PlayerListItemPacketEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/SkyblockJoinedEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/SkyblockLeftEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/StompConnectedEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/TitleEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/impl/WindowUpdateEvent.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/DungeonListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/FeatureListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/PacketListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/AbstractFeature.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/FeatureParameter.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/FeatureRegistry.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/GuiFeature.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/SimpleFeature.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/advanced/FeatureDebug.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/advanced/FeatureDebugTrap.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/advanced/FeatureDebuggableMap.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/advanced/FeatureRoomCoordDisplay.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/advanced/FeatureRoomDebugInfo.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/advanced/FeatureTestPepole.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureAutoReparty.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureBossHealth.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureBoxRealLivid.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureChestPrice.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureCurrentPhase.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureHideAnimals.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureTerracotaTimer.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureThornBearPercentage.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureThornSpiritBowTimer.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/FeatureWarningOnPortal.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/terminal/CorrectThePaneSolutionProvider.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/terminal/FeatureSimonSaysSolver.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/terminal/FeatureTerminalSolvers.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/terminal/NavigateMazeSolutionProvider.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/terminal/SelectAllColorSolutionProivider.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/terminal/SelectInOrderSolutionProvider.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/terminal/TerminalSolution.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/terminal/TerminalSolutionProvider.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/terminal/WhatStartsWithSolutionProvider.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/cosmetics/FeatureNicknameColor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/cosmetics/FeatureNicknamePrefix.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/cosmetics/PrefixSelectorGUI.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/discord/inviteViewer/ImageTexture.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/discord/inviteViewer/PartyInviteViewer.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/discord/inviteViewer/PartyJoinRequest.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/discord/invteTooltip/MTooltipInvite.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/discord/invteTooltip/MTooltipInviteElement.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/discord/onlinealarm/PlayingDGAlarm.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureBoxBats.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureBoxSkelemaster.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureBoxStarMobs.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureCollectScore.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonCurrentRoomSecrets.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonDeaths.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonMap.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonMilestone.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonRealTime.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonRoomName.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonSBTime.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonScore.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonSecrets.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureDungeonTombs.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureHideNameTags.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeaturePlayerESP.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeaturePressAnyKeyToCloseChest.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureWarnLowHealth.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/dungeon/FeatureWatcherWarning.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/etc/FeatureAutoAcceptReparty.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/etc/FeatureCooldownCounter.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/etc/FeatureCopyMessages.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/etc/FeatureDecreaseExplosionSound.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/etc/FeatureDisableMessage.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/etc/FeatureEpicCountdown.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/etc/FeaturePenguins.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/etc/FeatureRepartyCommand.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/etc/FeatureTooltipDungeonStat.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/etc/FeatureTooltipPrice.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/etc/FeatureUpdateAlarm.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/etc/ability/FeatureAbilityCooldown.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/etc/ability/SkyblockAbility.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/etc/ability/UsedAbility.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/APIKey.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/FeatureGoodParties.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/FeaturePartyList.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/FeaturePartyReady.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/customgui/FeatureCustomPartyFinder.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/customgui/GuiCustomPartyFinder.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/customgui/PanelPartyFinder.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/customgui/PanelPartyFinderSettings.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/customgui/PanelPartyListElement.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/FakePlayer.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/FeatureViewPlayerStatsOnJoin.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/api/ApiFetcher.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/api/CachedData.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/api/PlayerSkyblockData.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/api/SkinFetcher.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/api/playerprofile/PlayerProfile.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/api/playerprofile/PlayerProfileParser.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/api/playerprofile/dataclasses/ClassSpecificData.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonClass.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonSpecificData.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonStat.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/api/playerprofile/dataclasses/DungeonType.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/api/playerprofile/dataclasses/FloorSpecificData.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/api/playerprofile/dataclasses/Pet.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/api/playerprofile/dataclasses/Skill.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/DataRendererEditor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/DataRendererRegistry.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/IDataRenderer.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonFloorStat.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonHighestFloorStat.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererClassLv.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererDungeonLv.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererFairySouls.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererLilyWeight.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererSecrets.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererSelectedClassLv.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererSetUrOwn.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererSkillLv.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererTalismans.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/secret/FeatureActions.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/secret/FeatureBloodRush.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/secret/FeatureCreateRefreshLine.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/secret/FeatureFreezePathfind.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/secret/FeaturePathfindStrategy.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/secret/FeaturePathfindToAll.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/secret/FeatureSoulRoomWarning.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/secret/FeatureTogglePathfind.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/secret/PathfindLineProperties.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/secret/mechanicbrowser/FeatureMechanicBrowse.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/secret/mechanicbrowser/MGuiMechanicBrowser.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/secret/mechanicbrowser/MechanicBrowserElement.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/secret/mechanicbrowser/MechanicBrowserTooltip.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/secret/mechanicbrowser/PanelMechanicBrowser.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/solvers/FeatureSolverBlaze.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/solvers/FeatureSolverBombdefuse.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/solvers/FeatureSolverBox.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/solvers/FeatureSolverIcefill.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/solvers/FeatureSolverKahoot.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/solvers/FeatureSolverRiddle.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/solvers/FeatureSolverSilverfish.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/solvers/FeatureSolverTeleport.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/solvers/FeatureSolverTictactoe.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/BossroomEnterListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/ChatListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/ChatListenerGlobal.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/DiscordUserJoinRequestListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/DiscordUserUpdateListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/DungeonContextInitializationListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/DungeonEndListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/DungeonQuitListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/DungeonStartListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/EntityLivingRenderListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/GuiBackgroundRenderListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/GuiClickListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/GuiOpenListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/GuiPostRenderListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/GuiPreRenderListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/GuiUpdateListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/InteractListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/KeyInputListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/KeybindPressedListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/PlayerRenderListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/ScreenRenderListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/SkyblockJoinListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/SkyblockLeaveListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/SoundListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/StompConnectedListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/TextureStichListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/TickListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/TitleListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/TooltipListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/listener/WorldRenderListener.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/text/PanelTextParameterConfig.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/text/StyledText.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/text/StyledTextProvider.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/text/StyledTextRenderer.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/text/TextHUDFeature.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/features/text/TextStyle.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/MGui.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/MPanel.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MButton.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MCollapsable.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MColor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MEditableAColor.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MFloatSelectionButton.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MIntegerSelectionButton.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MKeyEditButton.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MLabel.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MLabelAndElement.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MList.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MModal.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MModalConfirmation.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MModalMessage.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MNavigatingPane.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MPanelScaledGUI.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MParameter.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MPassiveLabelAndElement.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MPopupMenu.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MPortableColorEdit.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MRootPanel.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MScrollBar.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MScrollablePanel.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MSpacer.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MStringSelectionButton.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MTabbedPane.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MTextField.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MToggleButton.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MTooltip.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MTooltipText.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/gui/elements/MValue.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/party/PartyContext.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/party/PartyManager.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/resources/DGTexturePack.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/stomp/FailedWebSocketConnection.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/stomp/StompClient.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/stomp/StompDiedEvent.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/stomp/StompHeader.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/stomp/StompManager.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/stomp/StompPayload.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/stomp/StompSubscription.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/AhUtils.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/ArrayUtils.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/BlockCache.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/GlStateUtils.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/MapUtils.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/RenderUtils.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/ScoreBoardUtils.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/ShortUtils.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/SkyblockUtils.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/TabListUtil.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/TextUtils.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/TimeScoreUtil.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/TitleRender.java
create mode 100755 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/VectorUtils.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/XPUtils.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/cursor/CursorReader.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/cursor/EnumCursor.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/cursor/Foundation.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/cursor/GLCursors.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/cursor/User32.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/utils/cursor/X11.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/wsresource/StaticResource.java
create mode 100644 src/main/java/kr/syeyoung/dungeonsguide/mod/wsresource/StaticResourceCache.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/pathfinding/AStarCornerCut.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/pathfinding/AStarFineGrid.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/pathfinding/CachedWorld.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/pathfinding/JPSPathfinder.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/pathfinding/NodeProcessorDungeonRoom.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/pathfinding/ThetaStar.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/resources/DGTexturePack.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/EditingContext.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/Parameter.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/gui/GuiDungeonAddSet.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/gui/GuiDungeonParameterEdit.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/gui/GuiDungeonRoomEdit.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/gui/GuiDungeonValueEdit.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/mechanicedit/ValueEditBreakableWall.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/mechanicedit/ValueEditDoor.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/mechanicedit/ValueEditDummy.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/mechanicedit/ValueEditFairySoul.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/mechanicedit/ValueEditJournal.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/mechanicedit/ValueEditLever.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/mechanicedit/ValueEditNPC.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/mechanicedit/ValueEditOnewayDoor.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/mechanicedit/ValueEditOnewayLever.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/mechanicedit/ValueEditPressurePlate.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/mechanicedit/ValueEditSecret.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/mechanicedit/ValueEditTomb.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/ActionDisplayPane.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/ActionTreeDisplayPane.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/DynamicEditor.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/GeneralEditPane.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/ProcessorParameterEditPane.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/RoomDataDisplayPane.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/RoomMatchDisplayPane.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/RoommatchingPane.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/panes/SecretEditPane.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/valueedit/ValueEdit.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/valueedit/ValueEditAColor.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/valueedit/ValueEditBoolean.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/valueedit/ValueEditColor.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/valueedit/ValueEditCreator.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/valueedit/ValueEditFloat.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/valueedit/ValueEditInteger.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/valueedit/ValueEditNull.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/valueedit/ValueEditOffsetPoint.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/valueedit/ValueEditOffsetPointSet.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/valueedit/ValueEditRegistry.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomedit/valueedit/ValueEditString.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/GeneralRoomProcessor.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/ProcessorFactory.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/RoomProcessor.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/RoomProcessorBlazeSolver.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/RoomProcessorButtonSolver.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/RoomProcessorCreeperSolver.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/RoomProcessorGenerator.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/RoomProcessorIcePath.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/RoomProcessorRedRoom.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/RoomProcessorRiddle.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/RoomProcessorTeleportMazeSolver.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/RoomProcessorTicTacToeSolver.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/RoomProcessorTrivia.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/RoomProcessorBombDefuseSolver.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/BDChamber.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/BombDefuseChamberGenerator.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/ChamberProcessor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/DummyDefuseChamberProcessor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/GeneralDefuseChamberProcessor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/arrow/ArrowLeftProcessor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/arrow/ArrowProcessorMatcher.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/arrow/ArrowRightProcessor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/bugged/ImpossibleMatcher.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/color/ColorLeftProcessor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/color/ColorProcessorMatcher.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/color/ColorRightProcessor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/creeper/CreeperLeftProcessor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/creeper/CreeperProcessorMatcher.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/creeper/CreeperRightProcessor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/goldenpath/GoldenPathLeftProcessor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/goldenpath/GoldenPathProcessorMatcher.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/goldenpath/GoldenPathRightProcessor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/maze/MazeLeftProcessor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/maze/MazeProcessorMatcher.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/maze/MazeRightProcessor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/number/NumberLeftProcessor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/number/NumberProcessorMatcher.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bombdefuse/chambers/number/NumberRightProcessor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bossfight/BossfightProcessor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bossfight/BossfightProcessorBonzo.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bossfight/BossfightProcessorLivid.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bossfight/BossfightProcessorNecron.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bossfight/BossfightProcessorProf.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bossfight/BossfightProcessorSadan.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bossfight/BossfightProcessorScarf.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bossfight/BossfightProcessorThorn.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bossfight/GeneralBossfightProcessor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/bossfight/HealthData.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/boxpuzzle/BoxPuzzleSolvingThread.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/boxpuzzle/RoomProcessorBoxSolver.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/icefill/RoomProcessorIcePath2.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/waterpuzzle/LeverState.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/waterpuzzle/LeverStateContradict.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/waterpuzzle/RoomProcessorWaterPuzzle.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/waterpuzzle/Route.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/waterpuzzle/SwitchData.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/waterpuzzle/WaterBoard.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/waterpuzzle/WaterNode.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/waterpuzzle/nodes/WaterNodeAir.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/waterpuzzle/nodes/WaterNodeEnd.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/waterpuzzle/nodes/WaterNodeStart.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/waterpuzzle/nodes/WaterNodeToggleable.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/roomprocessor/waterpuzzle/nodes/WaterNodeWall.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/rpc/JDiscordActivity.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/rpc/JDiscordRelation.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/rpc/JDiscordUser.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/rpc/RichPresenceManager.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/stomp/CloseListener.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/stomp/StompClient.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/stomp/StompClientStatus.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/stomp/StompHeader.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/stomp/StompInterface.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/stomp/StompMessageHandler.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/stomp/StompPayload.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/stomp/StompSubscription.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/utils/AhUtils.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/utils/ArrayUtils.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/utils/GlStateUtils.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/utils/MapUtils.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/utils/RenderUtils.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/utils/ShortUtils.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/utils/SkyblockUtils.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/utils/TextUtils.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/utils/TimeScoreUtil.java
delete mode 100755 src/main/java/kr/syeyoung/dungeonsguide/utils/VectorUtils.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/utils/XPUtils.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/utils/cursor/CursorReader.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/utils/cursor/EnumCursor.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/utils/cursor/Foundation.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/utils/cursor/GLCursors.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/utils/cursor/User32.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/utils/cursor/X11.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/wsresource/StaticResource.java
delete mode 100644 src/main/java/kr/syeyoung/dungeonsguide/wsresource/StaticResourceCache.java
create mode 100644 src/main/resources/assets/dg/textures/dglogox128.png
create mode 100644 src/main/resources/assets/dg/textures/dglogox32.png
create mode 100644 src/main/resources/assets/skyblock_dungeons_guide/sounds.json
create mode 100644 src/main/resources/assets/skyblock_dungeons_guide/sounds/readysetgo.ogg
diff --git a/.github/workflows/beta.yml b/.github/workflows/beta.yml
new file mode 100644
index 00000000..5cbbe58f
--- /dev/null
+++ b/.github/workflows/beta.yml
@@ -0,0 +1,33 @@
+name: Beta Build
+
+on:
+ push:
+ branches:
+ - 'breaking-changes-just-working-im-not-putting-all-of-these-into-3.0-but-for-the-sake-of-beta-release-this-thing-exists'
+ workflow_dispatch:
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - name: Set up JDK 16
+ uses: actions/setup-java@v3
+ with:
+ java-version: '16'
+ distribution: 'adopt'
+ cache: 'gradle'
+ - name: Grant execute permission for gradlew
+ run: chmod +x gradlew
+ - name: Download hychat as a dependency
+ run: mkdir jars && wget https://cdn.discordapp.com/attachments/782825804983566356/791708191519932426/Hychat-1.12.1-BETA.jar -O jars/Hychat-1.12.1-BETA.jar
+ - name: Build with Gradle
+ run: ./gradlew build
+ - uses: actions/upload-artifact@v2
+ if: github.event_name == 'workflow_dispatch'
+ with:
+ name: Compiled-files
+ path: build/libs/*.jar
+ - name: Upload to beta webhook
+ env:
+ BETA_WEBHOOK: ${{ secrets.BETA_WEBHOOK }}
+ run: path=$(find ./build/ -type d -name "libs" -exec find "{}" -type f -name "dungeonsguide-*-all.jar" \;) curl -F "file1=@$path" "$BETA_WEBHOOK"
\ No newline at end of file
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 62f386c2..db0dc81b 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -3,10 +3,10 @@ name: Build
on:
push:
branches:
- - '*'
+ - 'master'
pull_request:
branches:
- - '*'
+ - 'master'
workflow_dispatch:
jobs:
build:
@@ -20,6 +20,7 @@ jobs:
with:
java-version: '16'
distribution: 'adopt'
+ cache: 'gradle'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Download hychat as a dependency
@@ -30,4 +31,4 @@ jobs:
if: github.event_name == 'workflow_dispatch'
with:
name: Compiled-files
- path: build/libs/*.jar
+ path: build/libs/*.jar
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 24bc189f..7252969e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -31,7 +31,7 @@ tasks.wrapper {
// the full version (with sources and documentation) of Gradle (ALL)
distributionType = Wrapper.DistributionType.ALL
}
-version = "3.0.0"
+version = "3.8.0"
group = "kr.syeyoung.dungeonsguide"
archivesBaseName = "dungeonsguide"
@@ -78,17 +78,18 @@ dependencies {
forge("net.minecraftforge:forge:1.8.9-11.15.1.2318-1.8.9")
- implementation "org.jetbrains:annotations-java5:19.0.0"
- implementation "org.java-websocket:Java-WebSocket:1.5.1"
- implementation "org.json:json:20171018"
- implementation "com.twelvemonkeys.imageio:imageio-bmp:3.7.0"
+ implementation 'org.jetbrains:annotations-java5:23.0.0'
+ implementation 'org.java-websocket:Java-WebSocket:1.5.3'
+ implementation "org.json:json:20220924"
+ implementation 'com.twelvemonkeys.imageio:imageio-bmp:3.8.3'
+
+ compileOnly 'org.projectlombok:lombok:1.18.24'
+ annotationProcessor 'org.projectlombok:lombok:1.18.24'
- compileOnly "org.projectlombok:lombok:1.18.20"
compileOnly files("jars/Hychat-1.12.1-BETA.jar")
- annotationProcessor "org.projectlombok:lombok:1.18.16"
- testCompileOnly "org.projectlombok:lombok:1.18.20"
- testAnnotationProcessor "org.projectlombok:lombok:1.18.20"
+ testCompileOnly "org.projectlombok:lombok:1.18.24"
+ testAnnotationProcessor "org.projectlombok:lombok:1.18.24"
modRuntimeOnly("me.djtheredstoner:DevAuth-forge-legacy:1.1.0")
}
@@ -116,9 +117,9 @@ tasks.shadowJar {
relocate "org.java_websocket", "kr.syeyoung.org.java_websocket"
dependencies {
- include(dependency("org.java-websocket:Java-WebSocket:1.5.1"))
+ include(dependency("org.java-websocket:Java-WebSocket:1.5.3"))
include(dependency("org.slf4j:slf4j-api:1.7.25"))
- include(dependency("org.json:json:20171018"))
+ include(dependency("org.json:json:20220924"))
include(dependency("com.twelvemonkeys..*:.*"))
}
}
@@ -131,3 +132,16 @@ tasks.named("remapJar") {
tasks.assemble.dependsOn tasks.remapJar
+
+processResources {
+ inputs.property 'version', project.version
+
+ // replace stuff in mcmod.info, nothing else
+ from(sourceSets.main.resources.srcDirs) {
+ duplicatesStrategy = 'include'
+ include 'mcmod.info'
+
+ // replace version and mcversion
+ expand 'version': project.version
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/Authenticator.java b/src/main/java/kr/syeyoung/dungeonsguide/Authenticator.java
deleted file mode 100755
index 5b15fde6..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/Authenticator.java
+++ /dev/null
@@ -1,302 +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;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
-import com.mojang.authlib.GameProfile;
-import com.mojang.authlib.exceptions.AuthenticationException;
-import com.mojang.authlib.minecraft.MinecraftSessionService;
-import net.minecraft.client.Minecraft;
-import net.minecraft.util.Session;
-import net.minecraftforge.fml.common.ProgressManager;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.io.IOUtils;
-
-import javax.crypto.*;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
-import javax.net.ssl.*;
-import java.io.*;
-import java.math.BigInteger;
-import java.net.*;
-import java.security.*;
-import java.security.cert.CertificateException;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.X509EncodedKeySpec;
-import java.util.HashMap;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-public class Authenticator {
- private KeyPair rsaKey;
- private String token;
- private final ProgressManager.ProgressBar progressBar;
-
- public String getToken() {
- return token;
- }
-
- private KeyPair getKeyPair() {
- KeyPairGenerator a = null;
- try {
- a = KeyPairGenerator.getInstance("RSA");
- } catch (NoSuchAlgorithmException b) { }
- a.initialize(1024);
- this.rsaKey = a.generateKeyPair();
- return this.rsaKey;
- }
-
- private PublicKey dgPublicKey;
- private PublicKey getDGPublicKey() throws NoSuchAlgorithmException, InvalidKeySpecException {
- if (dgPublicKey != null) return dgPublicKey;
- X509EncodedKeySpec spec = new X509EncodedKeySpec(Base64.decodeBase64("MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxO89qtwG67jNucQ9Y44c" +
- "IUs/B+5BeJPs7G+RG2gfs4/2+tzF/c1FLDc33M7yKw8aKk99vsBUY9Oo8gxxiEPB" +
- "JitP/qfon2THp94oM77ZTpHlmFoqbZMcKGZVI8yfvEL4laTM8Hw+qh5poQwtpEbK" +
- "Xo47AkxygxJasUnykER2+aSTZ6kWU2D4xiNtFA6lzqN+/oA+NaYfPS0amAvyVlHR" +
- "n/8IuGkxb5RrlqVssQstFnxsJuv88qdGSEqlcKq2tLeg9hb8eCnl2OFzvXmgbVER" +
- "0JaV+4Z02fVG1IlR3Xo1mSit7yIU6++3usRCjx2yfXpnGGJUW5pe6YETjNew3ax+" +
- "FAZ4GePWCdmS7FvBnbbABKo5pE06ZTfDUTCjQlAJQiUgoF6ntMJvQAXPu48Vr8q/" +
- "mTcuZWVnI6CDgyE7nNq3WNoq3397sBzxRohMxuqzl3T19zkfPKF05iV2Ju1HQMW5" +
- "I119bYrmVD240aGESZc20Sx/9g1BFpNzQbM5PGUlWJ0dhLjl2ge4ip2hHciY3OEY" +
- "p2Qy2k+xEdenpKdL+WMRimCQoO9gWe2Tp4NmP5dppDXZgPjXqjZpnGs0Uxs+fXqW" +
- "cwlg3MbX3rFl9so/fhVf4p9oXZK3ve7z5D6XSSDRYECvsKIa08WAxJ/U6n204E/4" +
- "xUF+3ZgFPdzZGn2PU7SsnOsCAwEAAQ=="));
- return dgPublicKey = KeyFactory.getInstance("RSA").generatePublic(spec);
- }
-
- public Authenticator(ProgressManager.ProgressBar progressBar) {
- this.progressBar = progressBar;
- progressBar.step("Generating KeyPair");
- getKeyPair();
- }
-
- public String authenticateAndDownload(String version) throws IOException, AuthenticationException, NoSuchAlgorithmException, CertificateException, KeyStoreException, KeyManagementException, InvalidKeySpecException, SignatureException {
- Session session = Minecraft.getMinecraft().getSession();
- String sessionToken = session.getToken();
-
- progressBar.step("Authenticating (1/2)");
- String tempToken = requestAuth(session.getProfile());
- MinecraftSessionService yggdrasilMinecraftSessionService = Minecraft.getMinecraft().getSessionService();
- JsonObject d = getJwtPayload(tempToken);
- String hash = calculateServerHash(Base64.decodeBase64(d.get("sharedSecret").getAsString()),
- Base64.decodeBase64(d.get("publicKey").getAsString()));
- yggdrasilMinecraftSessionService.joinServer(session.getProfile(), sessionToken, hash);
- progressBar.step("Authenticating (2/2)");
- this.token = verifyAuth(tempToken, this.rsaKey.getPublic());
- try {
- progressBar.step("Downloading Jar");
- if (version != null)
- downloadSafe(this.token, "https://dungeons.guide/resource/version?v=" + version, true);
- progressBar.step("Downloading Rooms");
- downloadSafe(this.token, "https://dungeons.guide/resource/roomdata", false);
- } catch (Throwable t) {
- t.printStackTrace();
- }
- return this.token;
- }
-
- public JsonObject getJwtPayload(String jwt) {
- String midPart = jwt.split("\\.")[1].replace("+", "-").replace("/", "_");
- String base64Decode = new String(Base64.decodeBase64(midPart)); // padding
- return (JsonObject) new JsonParser().parse(base64Decode);
- }
-
-
-
- private String requestAuth(GameProfile profile) throws IOException, NoSuchAlgorithmException, CertificateException, KeyStoreException, KeyManagementException {
- HttpsURLConnection connection = (HttpsURLConnection) new URL("https://dungeons.guide/auth/requestAuth").openConnection();
- connection.setRequestProperty("User-Agent", "DungeonsGuide/1.0");
- connection.setRequestProperty("Content-Type", "application/json");
- connection.setRequestMethod("POST");
- connection.setDoInput(true);
- connection.setDoOutput(true);
-
- connection.getOutputStream().write(("{\"uuid\":\""+profile.getId().toString()+"\",\"nickname\":\""+profile.getName()+"\"}").getBytes());
- String payload = String.join("\n", IOUtils.readLines(connection.getErrorStream() == null ? connection.getInputStream() : connection.getErrorStream()));
- if (connection.getResponseCode() >= 400)
- System.out.println("https://dungeons.guide/auth/requestAuth :: Received "+connection.getResponseCode()+" along with\n"+payload);
-
- JsonObject json = (JsonObject) new JsonParser().parse(payload);
-
- if (!"ok".equals(json.get("status").getAsString())) {
- return null;
- }
- return json.get("data").getAsString();
- }
- private String verifyAuth(String tempToken, PublicKey clientKey) throws IOException {
- HttpsURLConnection urlConnection = (HttpsURLConnection) new URL("https://dungeons.guide/auth/authenticate").openConnection();
- urlConnection.setRequestMethod("POST");
- urlConnection.setRequestProperty("User-Agent", "DungeonsGuide/1.0");
- urlConnection.setRequestProperty("Content-Type", "application/json");
- urlConnection.setDoInput(true);
- urlConnection.setDoOutput(true);
-
- urlConnection.getOutputStream().write(("{\"jwt\":\""+tempToken+"\",\"publicKey\":\""+Base64.encodeBase64URLSafeString(clientKey.getEncoded())+"\"}").getBytes());
- String payload = String.join("\n", IOUtils.readLines(urlConnection.getErrorStream() == null ? urlConnection.getInputStream() : urlConnection.getErrorStream()));
- if (urlConnection.getResponseCode() >= 400)
- System.out.println("https://dungeons.guide/auth/authenticate :: Received "+urlConnection.getResponseCode()+" along with\n"+payload);
-
- JsonObject jsonObject = (JsonObject) new JsonParser().parse(payload);
- if (!"ok".equals(jsonObject.get("status").getAsString())) {
- return null;
- }
- return jsonObject.get("data").getAsString();
- }
-
- private final HashMap loadedResources = new HashMap();
-
- public HashMap getResources() {
- return loadedResources;
- }
-
- private void downloadSafe(String dgToken, String url, boolean isValidateSignature) throws IOException, NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException, CertificateException, KeyStoreException, KeyManagementException, SignatureException, InvalidKeySpecException {
- HttpsURLConnection dgConnection = (HttpsURLConnection) new URL(url).openConnection();
- dgConnection.setRequestProperty("User-Agent", "DungeonsGuide/1.0");
- dgConnection.setRequestProperty("Content-Type", "application/json");
- dgConnection.setRequestMethod("GET");
- dgConnection.setRequestProperty("Authorization", dgToken);
- dgConnection.setDoInput(true);
- dgConnection.setDoOutput(true);
-
- InputStream inputStream = dgConnection.getInputStream();
- byte[] lengthBytes = new byte[4];
- inputStream.read(lengthBytes);
- int length = ((lengthBytes[0] & 0xFF) << 24) |
- ((lengthBytes[1] & 0xFF) << 16) |
- ((lengthBytes[2] & 0xFF) << 8) |
- ((lengthBytes[3] & 0xFF));
- while (inputStream.available() < length) ;
- byte[] keyPayload = new byte[length];
- inputStream.read(keyPayload);
-
- Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
- cipher.init(Cipher.DECRYPT_MODE, this.rsaKey.getPrivate());
- byte[] h = cipher.doFinal(keyPayload);
-
- cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
- SecretKeySpec keySpec = new SecretKeySpec(h, "AES");
- IvParameterSpec ivSpec = new IvParameterSpec(h);
- cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
- CipherInputStream cipherInputStream = new CipherInputStream(inputStream, cipher);
-
- cipherInputStream.read(lengthBytes);
- length = ((lengthBytes[0] & 0xFF) << 24) |
- ((lengthBytes[1] & 0xFF) << 16) |
- ((lengthBytes[2] & 0xFF) << 8) |
- ((lengthBytes[3] & 0xFF));
-
- int totalLen = length;
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- byte[] buff = new byte[256];
- while (totalLen > 0) {
- int len = cipherInputStream.read(buff, 0, Math.min(buff.length, totalLen));
- totalLen -= len;
- bos.write(buff, 0, len);
- }
- byte[] body = bos.toByteArray();
-
- byte[] signed = null;
- if (isValidateSignature) {
- progressBar.step("Validating Signature");
- cipherInputStream.read(lengthBytes,0 , 4);
- length = ((lengthBytes[0] & 0xFF) << 24) |
- ((lengthBytes[1] & 0xFF) << 16) |
- ((lengthBytes[2] & 0xFF) << 8) |
- ((lengthBytes[3] & 0xFF));
-
- totalLen = length;
- bos = new ByteArrayOutputStream();
- while (totalLen > 0) {
- int len = cipherInputStream.read(buff, 0, Math.min(buff.length, totalLen));
- totalLen -= len;
- bos.write(buff, 0, len);
- }
- signed = bos.toByteArray();
-
- Signature sign = Signature.getInstance("SHA512withRSA");
- sign.initVerify(getDGPublicKey());
- sign.update(body);
- boolean truth = sign.verify(signed);
- if (!truth) throw new SignatureException("DG SIGNATURE FORGED");
- }
-
- ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(body));
- ZipEntry zipEntry;
- while ((zipEntry=zipInputStream.getNextEntry()) != null) {
- byte[] buffer = new byte[256];
- ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
- int p = 0;
- while((p = zipInputStream.read(buffer)) > 0) {
- byteArrayOutputStream.write(buffer, 0, p);
- }
- this.loadedResources.put(zipEntry.getName(), byteArrayOutputStream.toByteArray());
- }
- dgConnection.disconnect();
- }
-
- public JsonElement getJsonSecured(String u) throws IOException, NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException, CertificateException, KeyStoreException, KeyManagementException {
- HttpsURLConnection httpsURLConnection = (HttpsURLConnection) new URL(u).openConnection();
- httpsURLConnection.setRequestProperty("User-Agent", "DungeonsGuide/1.0");
- httpsURLConnection.setRequestProperty("Content-Type", "application/json");
- httpsURLConnection.setRequestMethod("GET");
- httpsURLConnection.setRequestProperty("Authorization", this.token);
- httpsURLConnection.setDoInput(true);
- httpsURLConnection.setDoOutput(true);
-
- InputStream inputStream = httpsURLConnection.getInputStream();
- byte[] lengthPayload = new byte[4];
- inputStream.read(lengthPayload);
- int length = ((lengthPayload[0] & 0xFF) << 24) |
- ((lengthPayload[1] & 0xFF) << 16) |
- ((lengthPayload[2] & 0xFF) << 8) |
- ((lengthPayload[3] & 0xFF));
- while (inputStream.available() < length) ;
- byte[] keyPayload = new byte[length];
- inputStream.read(keyPayload);
-
- Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
- cipher.init(Cipher.DECRYPT_MODE, this.rsaKey.getPrivate());
- byte[] AESKey = cipher.doFinal(keyPayload);
-
- cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
- SecretKeySpec secretKeySpec = new SecretKeySpec(AESKey, "AES");
- IvParameterSpec ivParameterSpec = new IvParameterSpec(AESKey);
- cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
- CipherInputStream cipherInputStream = new CipherInputStream(inputStream, cipher);
- cipherInputStream.read(lengthPayload);
- length = ((lengthPayload[0] & 0xFF) << 24) |
- ((lengthPayload[1] & 0xFF) << 16) |
- ((lengthPayload[2] & 0xFF) << 8) |
- ((lengthPayload[3] & 0xFF));
- JsonElement l = new JsonParser().parse(new InputStreamReader(cipherInputStream));
- httpsURLConnection.disconnect();
- return l;
- }
-
- public String calculateServerHash(byte[] a, byte[] b) throws NoSuchAlgorithmException {
- MessageDigest c = MessageDigest.getInstance("SHA-1");
- c.update("".getBytes());
- c.update(a);
- c.update(b);
- byte[] d = c.digest();
- return new BigInteger(d).toString(16);
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/DGInterface.java b/src/main/java/kr/syeyoung/dungeonsguide/DGInterface.java
deleted file mode 100755
index 0529f0a6..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/DGInterface.java
+++ /dev/null
@@ -1,28 +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;
-
-import net.minecraftforge.fml.common.event.FMLInitializationEvent;
-import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
-
-public interface DGInterface {
- void init(FMLInitializationEvent event);
-
- void pre(FMLPreInitializationEvent event);
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/DungeonsGuide.java b/src/main/java/kr/syeyoung/dungeonsguide/DungeonsGuide.java
deleted file mode 100755
index f1c8b3a9..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/DungeonsGuide.java
+++ /dev/null
@@ -1,272 +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;
-
-import com.google.common.collect.Sets;
-import com.google.gson.JsonObject;
-import kr.syeyoung.dungeonsguide.chat.ChatProcessor;
-import kr.syeyoung.dungeonsguide.chat.PartyManager;
-import kr.syeyoung.dungeonsguide.commands.*;
-import kr.syeyoung.dungeonsguide.config.Config;
-import kr.syeyoung.dungeonsguide.cosmetics.CosmeticsManager;
-import kr.syeyoung.dungeonsguide.dungeon.roomfinder.DungeonRoomInfoRegistry;
-import kr.syeyoung.dungeonsguide.eventlistener.DungeonListener;
-import kr.syeyoung.dungeonsguide.eventlistener.FeatureListener;
-import kr.syeyoung.dungeonsguide.eventlistener.PacketListener;
-import kr.syeyoung.dungeonsguide.events.StompConnectedEvent;
-import kr.syeyoung.dungeonsguide.features.FeatureRegistry;
-import kr.syeyoung.dungeonsguide.resources.DGTexturePack;
-import kr.syeyoung.dungeonsguide.rpc.RichPresenceManager;
-import kr.syeyoung.dungeonsguide.stomp.CloseListener;
-import kr.syeyoung.dungeonsguide.stomp.StompClient;
-import kr.syeyoung.dungeonsguide.stomp.StompInterface;
-import kr.syeyoung.dungeonsguide.utils.AhUtils;
-import kr.syeyoung.dungeonsguide.utils.TimeScoreUtil;
-import kr.syeyoung.dungeonsguide.utils.cursor.GLCursors;
-import kr.syeyoung.dungeonsguide.wsresource.StaticResourceCache;
-import lombok.Getter;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.GuiButton;
-import net.minecraft.client.gui.GuiErrorScreen;
-import net.minecraft.client.gui.GuiScreen;
-import net.minecraft.client.resources.IReloadableResourceManager;
-import net.minecraft.client.resources.IResourceManager;
-import net.minecraft.client.resources.IResourceManagerReloadListener;
-import net.minecraft.client.resources.IResourcePack;
-import net.minecraft.launchwrapper.LaunchClassLoader;
-import net.minecraft.util.IChatComponent;
-import net.minecraftforge.client.ClientCommandHandler;
-import net.minecraftforge.common.MinecraftForge;
-import net.minecraftforge.fml.common.FMLCommonHandler;
-import net.minecraftforge.fml.common.ProgressManager;
-import net.minecraftforge.fml.common.event.FMLInitializationEvent;
-import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
-import net.minecraftforge.fml.relauncher.ReflectionHelper;
-
-import javax.crypto.BadPaddingException;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
-import java.io.*;
-import java.net.URI;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-public class DungeonsGuide implements DGInterface, CloseListener {
-
- private SkyblockStatus skyblockStatus;
-
- private static DungeonsGuide dungeonsGuide;
-
-
- @Getter
- private final Authenticator authenticator;
-
- @Getter
- private StompInterface stompConnection;
- @Getter
- private CosmeticsManager cosmeticsManager;
-
- public DungeonsGuide(Authenticator authenticator) {
- this.authenticator = authenticator;
- }
-
- public static void sendDebugChat(IChatComponent iChatComponent) {
- if (FeatureRegistry.DEBUG.isEnabled())
- Minecraft.getMinecraft().thePlayer.addChatMessage(iChatComponent);
- }
- @Getter
- CommandReparty commandReparty;
-
-
- private final String stompURL = "wss://dungeons.guide/ws";
-// private String stompURL = "ws://localhost/ws";
- public void init(FMLInitializationEvent event) {
- ProgressManager.ProgressBar progressbar = ProgressManager.push("DungeonsGuide", 4);
-
-
- try {
- Set invalid = ReflectionHelper.getPrivateValue(LaunchClassLoader.class, (LaunchClassLoader) Main.class.getClassLoader(), "invalidClasses");
- ((LaunchClassLoader) Main.class.getClassLoader()).clearNegativeEntries(Sets.newHashSet("org.slf4j.LoggerFactory"));
- invalid.clear();
- } catch (Throwable t) {
- t.printStackTrace();
- }
-
- progressbar.step("Registering Events & Commands");
- dungeonsGuide = this;
- skyblockStatus = new SkyblockStatus();
-
- CommandDungeonsGuide commandDungeonsGuide;
- MinecraftForge.EVENT_BUS.register(new DungeonListener());
- ClientCommandHandler.instance.registerCommand(commandDungeonsGuide = new CommandDungeonsGuide());
- MinecraftForge.EVENT_BUS.register(commandDungeonsGuide);
-
- commandReparty = new CommandReparty();
- MinecraftForge.EVENT_BUS.register(commandReparty);
-
- MinecraftForge.EVENT_BUS.register(new FeatureListener());
- MinecraftForge.EVENT_BUS.register(new PacketListener());
- MinecraftForge.EVENT_BUS.register(new Keybinds());
-
-// MinecraftForge.EVENT_BUS.register(PartyManager.INSTANCE);
- MinecraftForge.EVENT_BUS.register(ChatProcessor.INSTANCE);
- MinecraftForge.EVENT_BUS.register(PartyManager.INSTANCE);
- MinecraftForge.EVENT_BUS.register(StaticResourceCache.INSTANCE);
-
- AhUtils.registerTimer();
-
- progressbar.step("Loading Roomdatas");
- try {
- DungeonRoomInfoRegistry.loadAll(configDir);
- } catch (BadPaddingException | InvalidKeyException | NoSuchPaddingException | IllegalBlockSizeException | IOException | NoSuchAlgorithmException | InvalidAlgorithmParameterException e) {
- e.printStackTrace();
- }
- progressbar.step("Opening connection");
-
- cosmeticsManager = new CosmeticsManager();
- MinecraftForge.EVENT_BUS.register(cosmeticsManager);
-
- try {
- connectStomp();
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
-
-
- progressbar.step("Loading Config");
- try {
- Config.loadConfig( null );
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- if (FeatureRegistry.ETC_REPARTY.isEnabled())
- ClientCommandHandler.instance.registerCommand(commandReparty);
- if (FeatureRegistry.DISCORD_DONOTUSE.isEnabled())
- System.setProperty("dg.safe", "true");
- MinecraftForge.EVENT_BUS.register(RichPresenceManager.INSTANCE);
- TimeScoreUtil.init();
-
- ProgressManager.pop(progressbar);
-
- ((IReloadableResourceManager)Minecraft.getMinecraft().getResourceManager()).registerReloadListener(resourceManager -> GLCursors.setupCursors());
- }
- @Getter
- private boolean firstTimeUsingDG = false;
- public void pre(FMLPreInitializationEvent event) {
- t.start();
- configDir = new File(event.getModConfigurationDirectory(),"dungeonsguide");
- File configFile = new File(configDir, "config.json");
- if (!configFile.exists()) {
- configDir.mkdirs();
- firstTimeUsingDG = true;
- }
- Config.f = configFile;
- Minecraft.getMinecraft().getFramebuffer().enableStencil();
-
- try {
- List resourcePackList = ReflectionHelper.getPrivateValue(Minecraft.class, Minecraft.getMinecraft(),"defaultResourcePacks", "aA", "field_110449_ao");
- resourcePackList.add(new DGTexturePack(authenticator));
- Minecraft.getMinecraft().refreshResources();
- } catch (Throwable t){
- t.printStackTrace();
- }
- }
-
- @Getter
- private File configDir;
-
-
- public SkyblockStatus getSkyblockStatus() {
- return skyblockStatus;
- }
-
- public static DungeonsGuide getDungeonsGuide() {
- return dungeonsGuide;
- }
- ScheduledExecutorService ex = Executors.newScheduledThreadPool(2);
- @Override
- public void onClose(int code, String reason, boolean remote) {
- System.out.println("Stomp Connection closed, trying to reconnect - "+reason+ " - "+code);
- connectStomp();
- }
-
- public void connectStomp() {
- ex.schedule(() -> {
- try {
- stompConnection = new StompClient(new URI(stompURL), authenticator.getToken(), DungeonsGuide.this);
- MinecraftForge.EVENT_BUS.post(new StompConnectedEvent(stompConnection));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }, 5L, TimeUnit.SECONDS);
- }
-
- private Thread t = new Thread(new Runnable() {
- @Override
- public void run() {
- while (true) {
- JsonObject obj = DungeonsGuide.getDungeonsGuide().getAuthenticator().getJwtPayload(DungeonsGuide.getDungeonsGuide().getAuthenticator().getToken());
- if (!obj.get("uuid").getAsString().equals(Minecraft.getMinecraft().getSession().getPlayerID())) {
- if (Minecraft.getMinecraft().currentScreen instanceof GuiErrorScreen) return;
-
- final String[] a = new String[]{
- "User has changed current Minecraft session.",
- "Please restart mc to revalidate Dungeons Guide",
- "Hopefully this screen will be fixed in later release"
- };
- final GuiScreen b = new GuiErrorScreen(null, null) {
- @Override
- public void drawScreen(int par1, int par2, float par3) {
- super.drawScreen(par1, par2, par3);
- for (int i = 0; i < a.length; ++i) {
- drawCenteredString(fontRendererObj, a[i], width / 2, height / 3 + 12 * i, 0xFFFFFFFF);
- }
- }
-
- @Override
- public void initGui() {
- super.initGui();
- this.buttonList.clear();
- this.buttonList.add(new GuiButton(0, width / 2 - 50, height - 50, 100, 20, "close"));
- }
-
- @Override
- protected void actionPerformed(GuiButton button) {
- FMLCommonHandler.instance().exitJava(-1, true);
- }
- };
- Minecraft.getMinecraft().displayGuiScreen(b);
- return;
- }
- try {
- Thread.sleep(100L);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- });
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/GuiLoadingError.java b/src/main/java/kr/syeyoung/dungeonsguide/GuiLoadingError.java
index 4adb2624..68ce5262 100644
--- a/src/main/java/kr/syeyoung/dungeonsguide/GuiLoadingError.java
+++ b/src/main/java/kr/syeyoung/dungeonsguide/GuiLoadingError.java
@@ -18,23 +18,26 @@
package kr.syeyoung.dungeonsguide;
-import kr.syeyoung.dungeonsguide.gui.MPanel;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.*;
-import net.minecraft.client.renderer.GlStateManager;
-import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.common.FMLCommonHandler;
import org.lwjgl.opengl.GL11;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.io.PrintStream;
public class GuiLoadingError extends GuiScreen {
- private String stacktrace;
- private Throwable throwable;
- private GuiScreen originalGUI;
- public GuiLoadingError(Throwable t, String stacktrace, GuiScreen originalGUI) {
- this.throwable = t;
- this.stacktrace = stacktrace;
+ static Throwable cause;
+ private final String stacktrace;
+ private final GuiScreen originalGUI;
+ public GuiLoadingError(GuiScreen originalGUI) {
+
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ PrintStream printStream = new PrintStream(byteArrayOutputStream);
+ cause.printStackTrace(printStream);
+ this.stacktrace = byteArrayOutputStream.toString();
+
this.originalGUI = originalGUI;
}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/IDungeonGuide.java b/src/main/java/kr/syeyoung/dungeonsguide/IDungeonGuide.java
new file mode 100644
index 00000000..a568d827
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/IDungeonGuide.java
@@ -0,0 +1,10 @@
+package kr.syeyoung.dungeonsguide;
+
+/**
+ * This exists, so we can reload the mod/ download a more recent version
+ */
+public interface IDungeonGuide {
+ void init();
+ void preinit();
+
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/Keybinds.java b/src/main/java/kr/syeyoung/dungeonsguide/Keybinds.java
deleted file mode 100755
index 1235d29e..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/Keybinds.java
+++ /dev/null
@@ -1,53 +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;
-
-import kr.syeyoung.dungeonsguide.events.KeyBindPressedEvent;
-import kr.syeyoung.dungeonsguide.features.FeatureRegistry;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.settings.GameSettings;
-import net.minecraft.client.settings.KeyBinding;
-import net.minecraft.util.ChatComponentText;
-import net.minecraftforge.common.MinecraftForge;
-import net.minecraftforge.fml.client.registry.ClientRegistry;
-import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
-import net.minecraftforge.fml.common.gameevent.InputEvent;
-import org.lwjgl.input.Keyboard;
-import org.lwjgl.input.Mouse;
-
-public class Keybinds
-{
-
- @SubscribeEvent
- public void onTogglePathfindStatus(InputEvent.KeyInputEvent keyInputEvent) {
- if (Keyboard.getEventKeyState()) {
- int key = Keyboard.getEventKey() == 0 ? Keyboard.getEventCharacter() + 256 : Keyboard.getEventKey();
- KeyBindPressedEvent keyBindPressedEvent = new KeyBindPressedEvent(key);
- MinecraftForge.EVENT_BUS.post(keyBindPressedEvent);
- }
- }
- @SubscribeEvent
- public void onMousePressed(InputEvent.MouseInputEvent mouseInputEvent) {
- if (Mouse.getEventButtonState()) {
- int key = Mouse.getEventButton() - 100;
- KeyBindPressedEvent keyBindPressedEvent = new KeyBindPressedEvent(key);
- MinecraftForge.EVENT_BUS.post(keyBindPressedEvent);
- }
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/Main.java b/src/main/java/kr/syeyoung/dungeonsguide/Main.java
index 29ac0599..5cfc0622 100755
--- a/src/main/java/kr/syeyoung/dungeonsguide/Main.java
+++ b/src/main/java/kr/syeyoung/dungeonsguide/Main.java
@@ -18,11 +18,13 @@
package kr.syeyoung.dungeonsguide;
-import com.mojang.authlib.exceptions.AuthenticationException;
+import kr.syeyoung.dungeonsguide.auth.AuthManager;
+import kr.syeyoung.dungeonsguide.auth.InvalidDungeonsGuideCredentialsException;
+import kr.syeyoung.dungeonsguide.auth.ResourceManager;
+import kr.syeyoung.dungeonsguide.mod.DungeonsGuide;
import kr.syeyoung.dungeonsguide.url.DGStreamHandlerFactory;
-import kr.syeyoung.dungeonsguide.utils.cursor.EnumCursor;
-import kr.syeyoung.dungeonsguide.utils.cursor.GLCursors;
-import net.minecraft.client.gui.*;
+import lombok.Getter;
+import net.minecraft.client.gui.GuiMainMenu;
import net.minecraft.launchwrapper.LaunchClassLoader;
import net.minecraftforge.client.event.GuiOpenEvent;
import net.minecraftforge.common.MinecraftForge;
@@ -33,110 +35,135 @@ import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.jetbrains.annotations.NotNull;
-import java.io.*;
-import java.lang.reflect.InvocationTargetException;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
import java.net.URL;
-import java.security.*;
-import java.security.cert.CertificateException;
-import java.security.spec.InvalidKeySpecException;
@Mod(modid = Main.MOD_ID, version = Main.VERSION)
-public class Main
-{
+public class Main {
+
public static final String MOD_ID = "skyblock_dungeons_guide";
- public static final String VERSION = "1.0";
+ public static final String VERSION = "3.8.0";
+ Logger logger = LogManager.getLogger("DG-main");
- private static Main main;
- private DGInterface dgInterface;
+ IDungeonGuide dgInstance;
private boolean isLoaded = false;
- private Throwable cause;
- private String stacktrace;
- private boolean showedError = false;
-
+ public static final String SERVER_URL = "https://dungeons.guide";
+ public static final String SOME_FUNNY_KEY_THING = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxO89qtwG67jNucQ9Y44c" +
+ "IUs/B+5BeJPs7G+RG2gfs4/2+tzF/c1FLDc33M7yKw8aKk99vsBUY9Oo8gxxiEPB" +
+ "JitP/qfon2THp94oM77ZTpHlmFoqbZMcKGZVI8yfvEL4laTM8Hw+qh5poQwtpEbK" +
+ "Xo47AkxygxJasUnykER2+aSTZ6kWU2D4xiNtFA6lzqN+/oA+NaYfPS0amAvyVlHR" +
+ "n/8IuGkxb5RrlqVssQstFnxsJuv88qdGSEqlcKq2tLeg9hb8eCnl2OFzvXmgbVER" +
+ "0JaV+4Z02fVG1IlR3Xo1mSit7yIU6++3usRCjx2yfXpnGGJUW5pe6YETjNew3ax+" +
+ "FAZ4GePWCdmS7FvBnbbABKo5pE06ZTfDUTCjQlAJQiUgoF6ntMJvQAXPu48Vr8q/" +
+ "mTcuZWVnI6CDgyE7nNq3WNoq3397sBzxRohMxuqzl3T19zkfPKF05iV2Ju1HQMW5" +
+ "I119bYrmVD240aGESZc20Sx/9g1BFpNzQbM5PGUlWJ0dhLjl2ge4ip2hHciY3OEY" +
+ "p2Qy2k+xEdenpKdL+WMRimCQoO9gWe2Tp4NmP5dppDXZgPjXqjZpnGs0Uxs+fXqW" +
+ "cwlg3MbX3rFl9so/fhVf4p9oXZK3ve7z5D6XSSDRYECvsKIa08WAxJ/U6n204E/4" +
+ "xUF+3ZgFPdzZGn2PU7SsnOsCAwEAAQ==";
@EventHandler
- public void initEvent(FMLInitializationEvent initializationEvent)
- {
+ public void initEvent(final FMLInitializationEvent initializationEvent) {
MinecraftForge.EVENT_BUS.register(this);
- if (dgInterface != null) {
- main = this;
- try {
- dgInterface.init(initializationEvent);
- } catch (Exception e) {
- cause = e;
- ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
- PrintStream printStream = new PrintStream(byteArrayOutputStream);
- e.printStackTrace(printStream);
- stacktrace = new String(byteArrayOutputStream.toByteArray());
-
- e.printStackTrace();
- }
+ try {
+ logger.info("init-ing DungeonsGuide");
+ dgInstance.init();
+ } catch (Exception e) {
+ handleException(e, null);
}
}
+
+
+ private boolean showedError = false;
@SubscribeEvent(priority = EventPriority.HIGHEST)
public void onGuiOpen(GuiOpenEvent guiOpenEvent) {
if (!showedError && !isLoaded && guiOpenEvent.gui instanceof GuiMainMenu) {
- guiOpenEvent.gui = new GuiLoadingError(cause, stacktrace, guiOpenEvent.gui);
+ guiOpenEvent.gui = new GuiLoadingError(guiOpenEvent.gui);
showedError = true;
}
+
}
+
+ @Getter
+ static File configDir;
+
@EventHandler
- public void preInit(FMLPreInitializationEvent preInitializationEvent) {
- ProgressManager.ProgressBar progressBar = ProgressManager.push("DungeonsGuide", this.getClass().getResourceAsStream("/kr/syeyoung/dungeonsguide/e.class") == null ? 7 : 6);
- Authenticator authenticator = new Authenticator(progressBar);
- String token = null;
+ public void preInit(final FMLPreInitializationEvent preInitializationEvent) {
+ MinecraftForge.EVENT_BUS.register(new YoMamaOutdated());
+
+ ProgressManager.ProgressBar progressBar = null;
+
try {
- token = authenticator.authenticateAndDownload(this.getClass().getResourceAsStream("/kr/syeyoung/dungeonsguide/DungeonsGuide.class") == null ? System.getProperty("dg.version") == null ? "nlatest" : System.getProperty("dg.version") : null);
- if (token != null) {
- main = this;
- URL.setURLStreamHandlerFactory(new DGStreamHandlerFactory(authenticator));
- LaunchClassLoader classLoader = (LaunchClassLoader) Main.class.getClassLoader();
- classLoader.addURL(new URL("z:///"));
-
- try {
- progressBar.step("Initializing");
- this.dgInterface = new DungeonsGuide(authenticator);
- this.dgInterface.pre(preInitializationEvent);
- while (progressBar.getStep() < progressBar.getSteps())
- progressBar.step("random-"+progressBar.getStep());
- ProgressManager.pop(progressBar);
- isLoaded = true;
- } catch (Throwable e) {
- cause = e;
- ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
- PrintStream printStream = new PrintStream(byteArrayOutputStream);
- e.printStackTrace(printStream);
- stacktrace = new String(byteArrayOutputStream.toByteArray());
-
- while (progressBar.getStep() < progressBar.getSteps())
- progressBar.step("random-"+progressBar.getStep());
- ProgressManager.pop(progressBar);
-
- e.printStackTrace();
+ try (InputStream premiumControlClass = this.getClass().getResourceAsStream("/kr/syeyoung/dungeonsguide/e.class")) {
+ progressBar = ProgressManager.push("DungeonsGuide", premiumControlClass == null ? 7 : 6);
+ }
+
+ AuthManager.getInstance().setBaseserverurl(SERVER_URL);
+ AuthManager.getInstance().init();
+
+
+ configDir = new File(preInitializationEvent.getModConfigurationDirectory(), "dungeonsguide");
+
+
+ String version = null;
+ try (InputStream resourceAsStream = this.getClass().getResourceAsStream("/kr/syeyoung/dungeonsguide/DungeonsGuide.class")) {
+ if (resourceAsStream == null) {
+ if (System.getProperty("dg.version") == null) {
+ version = "nlatest";
+ } else {
+ version = System.getProperty("dg.version");
+ }
}
+ }catch (Exception e){
+ e.printStackTrace();
}
- } catch (IOException | AuthenticationException | NoSuchAlgorithmException | CertificateException | KeyStoreException | KeyManagementException | InvalidKeySpecException | SignatureException e) {
- cause = e;
- ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
- PrintStream printStream = new PrintStream(byteArrayOutputStream);
- e.printStackTrace(printStream);
- stacktrace = new String(byteArrayOutputStream.toByteArray());
-
- while (progressBar.getStep() < progressBar.getSteps())
- progressBar.step("random-"+progressBar.getStep());
- ProgressManager.pop(progressBar);
-
- e.printStackTrace();
+ ResourceManager.getInstance().setBaseUrl(Main.SERVER_URL);
+ ResourceManager.getInstance().setBASE64_X509ENCODEDKEYSPEC(Main.SOME_FUNNY_KEY_THING);
+
+ if(!AuthManager.getInstance().isPlebUser() && version != null){
+ ResourceManager.getInstance().downloadAssets(version);
+ }
+
+ URL.setURLStreamHandlerFactory(new DGStreamHandlerFactory());
+ LaunchClassLoader classLoader = (LaunchClassLoader) Main.class.getClassLoader();
+ classLoader.addURL(new URL("z:///"));
+
+ progressBar.step("Initializing");
+
+ dgInstance = new DungeonsGuide();
+ dgInstance.preinit();
+
+ finishUpProgressBar(progressBar);
+ isLoaded = true;
+
+ } catch (IOException | InvalidDungeonsGuideCredentialsException e) {
+ handleException(e, progressBar);
}
}
- public static Main a() {
- return main;
+
+ public void handleException(@NotNull final Throwable e, ProgressManager.ProgressBar progressBar) {
+ GuiLoadingError.cause = e;
+
+ finishUpProgressBar(progressBar);
+
+ e.printStackTrace();
+ }
+
+ public static void finishUpProgressBar(final ProgressManager.ProgressBar progressBar) {
+ if(progressBar == null) return;
+ while (progressBar.getStep() < progressBar.getSteps())
+ progressBar.step("random-" + progressBar.getStep());
+ ProgressManager.pop(progressBar);
}
}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/SkyblockStatus.java b/src/main/java/kr/syeyoung/dungeonsguide/SkyblockStatus.java
deleted file mode 100755
index 7e2286b3..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/SkyblockStatus.java
+++ /dev/null
@@ -1,123 +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;
-
-import com.google.common.collect.Sets;
-import kr.syeyoung.dungeonsguide.commands.*;
-import kr.syeyoung.dungeonsguide.dungeon.DungeonContext;
-import kr.syeyoung.dungeonsguide.dungeon.roomfinder.DungeonRoomInfoRegistry;
-import kr.syeyoung.dungeonsguide.utils.TextUtils;
-import lombok.Getter;
-import lombok.Setter;
-import net.minecraft.client.Minecraft;
-import net.minecraft.scoreboard.*;
-import net.minecraftforge.client.ClientCommandHandler;
-import net.minecraftforge.common.MinecraftForge;
-
-import javax.crypto.BadPaddingException;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
-import java.io.File;
-import java.io.IOException;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
-import java.util.Collection;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class SkyblockStatus {
- @Getter
- private boolean isOnSkyblock;
- private boolean isOnDungeon;
-
- public boolean isOnDungeon() {
- return forceIsOnDungeon || isOnDungeon;
- }
-
- @Getter @Setter
- private boolean forceIsOnDungeon;
-
- @Getter
- @Setter
- private DungeonContext context;
-
- @Getter
- @Setter
- private int percentage;
-
- @Getter @Setter
- private String dungeonName;
-
- public boolean isOnHypixel() {
- Minecraft mc = Minecraft.getMinecraft();
- if (mc == null || mc.thePlayer == null) return false;
- if (!mc.isSingleplayer() && mc.thePlayer.getClientBrand() != null) {
- return mc.thePlayer.getClientBrand().startsWith("Hypixel BungeeCord");
- }
- return false;
- }
-
- private static final Set SKYBLOCK_IN_ALL_LANGUAGES = Sets.newHashSet("SKYBLOCK");
-
- public void updateStatus() {
- if (!isOnHypixel()) {
- isOnDungeon = false;
- isOnSkyblock = false;
- return;
- }
-
- Scoreboard scoreboard = Minecraft.getMinecraft().thePlayer.getWorldScoreboard();
- ScoreObjective scoreObjective = scoreboard.getObjectiveInDisplaySlot(1);
- if (scoreObjective == null) return;
-
- String objectiveName = TextUtils.stripColor(scoreObjective.getDisplayName());
- boolean skyblockFound = false;
- for (String skyblock : SKYBLOCK_IN_ALL_LANGUAGES) {
- if (objectiveName.startsWith(skyblock)) {
- skyblockFound = true;
- isOnSkyblock = true;
- break;
- }
- }
-
- if (!skyblockFound) {
- isOnSkyblock = false;
- isOnDungeon = false;
- return;
- }
-
- Collection scores = scoreboard.getSortedScores(scoreObjective);
- boolean foundDungeon = false;
- for (Score sc:scores) {
- ScorePlayerTeam scorePlayerTeam = scoreboard.getPlayersTeam(sc.getPlayerName());
- String strippedLine = TextUtils.keepScoreboardCharacters(TextUtils.stripColor(ScorePlayerTeam.formatPlayerName(scorePlayerTeam, sc.getPlayerName()))).trim();
- if (strippedLine.contains("Cleared: ")) {
- foundDungeon = true;
- percentage = Integer.parseInt(strippedLine.substring(9).split(" ")[0]);
- }
- if (ScorePlayerTeam.formatPlayerName(scorePlayerTeam, sc.getPlayerName()).startsWith(" §7⏣")) {
- dungeonName = strippedLine.trim();
- }
- }
-
- isOnDungeon = foundDungeon;
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/YoMamaOutdated.java b/src/main/java/kr/syeyoung/dungeonsguide/YoMamaOutdated.java
new file mode 100644
index 00000000..ca9b34f4
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/YoMamaOutdated.java
@@ -0,0 +1,110 @@
+package kr.syeyoung.dungeonsguide;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.*;
+import net.minecraftforge.client.event.GuiOpenEvent;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.fml.common.FMLCommonHandler;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.lwjgl.opengl.GL11;
+
+import java.io.IOException;
+
+public class YoMamaOutdated {
+
+ Logger logger = LogManager.getLogger("YoMamaOutdated");
+
+ public boolean isUsingOutdatedDg = true;
+ String outdatedMessage;
+
+ public YoMamaOutdated() {
+ MinecraftForge.EVENT_BUS.register(this);
+ this.check();
+ }
+
+ void check() {
+
+ isUsingOutdatedDg = false;
+
+// try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
+// HttpGet httpget = new HttpGet( "https://dungeonsguide.kingstefan26.workers.dev/outdated");
+// Header[] haeders = {new BasicHeader("User-Agent", "DungeonsGuide/" + Main.VERSION)};
+// httpget.setHeaders(haeders);
+// HttpResponse httpresponse = httpclient.execute(httpget);
+//
+// if (httpresponse.getStatusLine().getStatusCode() != 200) {
+// outdatedMessage = IOUtils.toString(httpresponse.getEntity().getContent(), StandardCharsets.UTF_8);
+// }else {
+// isUsingOutdatedDg = false;
+// }
+//
+// } catch (Exception ignored) {
+// }
+
+ }
+
+ private boolean showedError = false;
+
+ @SubscribeEvent
+ public void onGuiOpen(GuiOpenEvent event) {
+ if (!showedError && isUsingOutdatedDg) {
+ showedError = true;
+
+ GuiScreen ogGui = event.gui;
+
+ event.gui = new GuiScreen() {
+ @Override
+ public void initGui() {
+ ScaledResolution sr = new ScaledResolution(Minecraft.getMinecraft());
+ this.buttonList.add(new GuiButton(0, sr.getScaledWidth()/2-100,sr.getScaledHeight()-70 ,"Close Minecraft"));
+ this.buttonList.add(new GuiButton(1, sr.getScaledWidth()/2-100,sr.getScaledHeight()-40 ,"Ignore"));
+ }
+
+ @Override
+ protected void actionPerformed(GuiButton button) throws IOException {
+ super.actionPerformed(button);
+ if (button.id == 0) {
+ FMLCommonHandler.instance().exitJava(-1,true);
+ } else if (button.id == 1) {
+ Minecraft.getMinecraft().displayGuiScreen(ogGui);
+ }
+ }
+
+ @Override
+ public void drawScreen(int mouseX, int mouseY, float partialTicks) {
+ super.drawBackground(1);
+
+ ScaledResolution sr = new ScaledResolution(Minecraft.getMinecraft());
+ FontRenderer fontRenderer = Minecraft.getMinecraft().fontRendererObj;
+ String text = "This DungeonsGuide installation seems to be invalid";
+ fontRenderer.drawString(text, (sr.getScaledWidth()-fontRenderer.getStringWidth(text))/2,40,0xFFFF0000);
+ String text1 = "Message from our server:";
+ fontRenderer.drawString(text1, (sr.getScaledWidth()-fontRenderer.getStringWidth(text1))/2, (int) (40+fontRenderer.FONT_HEIGHT*1.5),0xFFFF0000);
+
+ int tenth = sr.getScaledWidth() / 10;
+
+ Gui.drawRect(tenth, 70,sr.getScaledWidth()-tenth, sr.getScaledHeight()-80, 0xFF5B5B5B);
+ clip(sr, tenth, 70,sr.getScaledWidth()-2*tenth, sr.getScaledHeight()-150);
+ GL11.glEnable(GL11.GL_SCISSOR_TEST);
+
+
+ fontRenderer.drawString(outdatedMessage, tenth+2,fontRenderer.FONT_HEIGHT + 72, 0xFFFFFFFF);
+
+ GL11.glDisable(GL11.GL_SCISSOR_TEST);
+
+ super.drawScreen(mouseX, mouseY, partialTicks);
+ }
+
+ public void clip(ScaledResolution resolution, int x, int y, int width, int height) {
+ if (width < 0 || height < 0) return;
+
+ int scale = resolution.getScaleFactor();
+ GL11.glScissor((x ) * scale, Minecraft.getMinecraft().displayHeight - (y + height) * scale, (width) * scale, height * scale);
+ }
+ };
+ }
+ }
+
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/auth/AuthManager.java b/src/main/java/kr/syeyoung/dungeonsguide/auth/AuthManager.java
new file mode 100644
index 00000000..5588a4a2
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/auth/AuthManager.java
@@ -0,0 +1,150 @@
+package kr.syeyoung.dungeonsguide.auth;
+
+import com.google.common.base.Throwables;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import com.google.gson.JsonObject;
+import com.mojang.authlib.exceptions.AuthenticationException;
+import kr.syeyoung.dungeonsguide.auth.authprovider.AuthProvider;
+import kr.syeyoung.dungeonsguide.auth.authprovider.DgAuth.DgAuth;
+import kr.syeyoung.dungeonsguide.auth.authprovider.DgAuth.DgAuthUtil;
+import kr.syeyoung.dungeonsguide.mod.chat.ChatTransmitter;
+import kr.syeyoung.dungeonsguide.mod.events.impl.AuthChangedEvent;
+import kr.syeyoung.dungeonsguide.mod.stomp.StompManager;
+import lombok.Setter;
+import net.minecraft.client.Minecraft;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.gameevent.TickEvent;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.io.IOException;
+import java.security.KeyPair;
+import java.security.NoSuchAlgorithmException;
+import java.util.Objects;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+
+
+public class AuthManager {
+ Logger logger = LogManager.getLogger("AuthManger");
+
+ private static AuthManager instance;
+
+ public static AuthManager getInstance() {
+ if(instance == null) instance = new AuthManager();
+ return instance;
+ }
+
+
+ @Setter
+ private String baseserverurl = "https://dungeons.guide";
+
+ private AuthProvider currentProvider;
+
+ public String getToken() {
+ if (currentProvider != null && currentProvider.getToken() != null) {
+ return currentProvider.getToken();
+ }
+ return null;
+ }
+
+ public KeyPair getKeyPair(){
+ if (currentProvider != null && currentProvider.getToken() != null) {
+ return currentProvider.getRsaKey();
+ }
+ return null;
+ }
+
+
+ boolean initlock = false;
+
+ public void init() {
+ if (initlock) {
+ logger.info("Cannot init AuthManger twice");
+ return;
+ }
+
+ reauth();
+
+ initlock = true;
+
+
+ MinecraftForge.EVENT_BUS.register(this);
+
+ ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("DgAuth Pool").build();
+ final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1, namedThreadFactory);
+ scheduler.scheduleAtFixedRate(() -> {
+ if (getToken() != null) {
+ JsonObject obj = DgAuthUtil.getJwtPayload(getToken());
+ if (!obj.get("uuid").getAsString().replace("-", "").equals(Minecraft.getMinecraft().getSession().getPlayerID())) {
+ shouldReAuth = true;
+ }
+ }
+ }, 10,2000, TimeUnit.MILLISECONDS);
+ }
+
+ boolean shouldReAuth = true;
+ int tickCounter;
+
+ @SubscribeEvent
+ public void onTickClientTick(TickEvent.ClientTickEvent event) {
+ if (event.phase != TickEvent.Phase.START) return;
+
+ if (tickCounter % 200 == 0) {
+ tickCounter = 0;
+ reauth();
+ }
+ tickCounter++;
+
+ }
+
+ public boolean isPlebUser(){
+ return Objects.equals(getInstance().getPlanType(), "OPENSOURCE");
+ }
+
+ public String getPlanType(){
+ if(getToken() == null) return null;
+
+
+ JsonObject jwt = DgAuthUtil.getJwtPayload(getToken());
+
+ if(!jwt.has("plan")) return null;
+
+ return jwt.get("plan").getAsString();
+
+ }
+
+ void reauth() {
+ if (!shouldReAuth) return;
+
+ shouldReAuth = false;
+
+ currentProvider = null;
+ try {
+ currentProvider = new DgAuth(baseserverurl).createAuthProvider();
+ if (currentProvider.getToken() == null) {
+ shouldReAuth = true;
+ currentProvider = null;
+ ChatTransmitter.addToQueue("§eDungeons Guide §7:: §r§cDG auth failed, trying again in ten seconds", true);
+ logger.info("DG auth failed, trying again in a second");
+ } else {
+ // RE-AUTHed SUCCESSFULLY HOORAY
+ // for some reason the forge events don't work in pre init, so I call the callback directly
+ StompManager.getInstance().init();
+ MinecraftForge.EVENT_BUS.post(new AuthChangedEvent());
+ }
+ } catch (NoSuchAlgorithmException | AuthenticationException | IOException e) {
+
+ shouldReAuth = true;
+ currentProvider = null;
+ ChatTransmitter.addToQueue("§eDungeons Guide §7:: §r§cDG auth failed, trying again in ten seconds", true);
+ logger.error("Re-auth failed with message {}, trying again in a ten seconds", String.valueOf(Throwables.getRootCause(e)));
+ }
+
+ }
+
+
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/auth/AuthUtil.java b/src/main/java/kr/syeyoung/dungeonsguide/auth/AuthUtil.java
new file mode 100644
index 00000000..d96b054d
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/auth/AuthUtil.java
@@ -0,0 +1,70 @@
+package kr.syeyoung.dungeonsguide.auth;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
+
+import javax.crypto.*;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import javax.net.ssl.HttpsURLConnection;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.security.*;
+
+public class AuthUtil {
+ private AuthUtil() {}
+
+ public static KeyPair getKeyPair() throws NoSuchAlgorithmException {
+ KeyPairGenerator a = null;
+ a = KeyPairGenerator.getInstance("RSA");
+ a.initialize(1024);
+ return a.generateKeyPair();
+ }
+
+
+ public static JsonElement getJsonSecured(String u) throws IOException, NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException{
+
+ int length = 0;
+ CipherInputStream cipherInputStream = null;
+
+ HttpsURLConnection httpsURLConnection = (HttpsURLConnection) new URL(u).openConnection();
+ httpsURLConnection.setRequestProperty("User-Agent", "DungeonsGuide/1.0");
+ httpsURLConnection.setRequestProperty("Content-Type", "application/json");
+ httpsURLConnection.setRequestMethod("GET");
+ httpsURLConnection.setRequestProperty("Authorization", AuthManager.getInstance().getToken());
+ httpsURLConnection.setDoInput(true);
+ httpsURLConnection.setDoOutput(true);
+
+ InputStream inputStream = httpsURLConnection.getInputStream();
+ byte[] lengthPayload = new byte[4];
+ inputStream.read(lengthPayload);
+ length = ((lengthPayload[0] & 0xFF) << 24) |
+ ((lengthPayload[1] & 0xFF) << 16) |
+ ((lengthPayload[2] & 0xFF) << 8) |
+ ((lengthPayload[3] & 0xFF));
+ while (inputStream.available() < length) ;
+ byte[] keyPayload = new byte[length];
+ inputStream.read(keyPayload);
+
+ Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
+ cipher.init(Cipher.DECRYPT_MODE, AuthManager.getInstance().getKeyPair().getPrivate());
+ byte[] AESKey = cipher.doFinal(keyPayload);
+
+ cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+ SecretKeySpec secretKeySpec = new SecretKeySpec(AESKey, "AES");
+ IvParameterSpec ivParameterSpec = new IvParameterSpec(AESKey);
+ cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
+ cipherInputStream = new CipherInputStream(inputStream, cipher);
+ cipherInputStream.read(lengthPayload);
+ length = ((lengthPayload[0] & 0xFF) << 24) |
+ ((lengthPayload[1] & 0xFF) << 16) |
+ ((lengthPayload[2] & 0xFF) << 8) |
+ ((lengthPayload[3] & 0xFF));
+
+ httpsURLConnection.disconnect();
+
+ return new JsonParser().parse(new InputStreamReader(cipherInputStream));
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/auth/InvalidDungeonsGuideCredentialsException.java b/src/main/java/kr/syeyoung/dungeonsguide/auth/InvalidDungeonsGuideCredentialsException.java
new file mode 100644
index 00000000..98caa049
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/auth/InvalidDungeonsGuideCredentialsException.java
@@ -0,0 +1,8 @@
+package kr.syeyoung.dungeonsguide.auth;
+
+public class InvalidDungeonsGuideCredentialsException extends Throwable {
+
+ public InvalidDungeonsGuideCredentialsException(String message) {
+ super(message);
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/auth/ResourceManager.java b/src/main/java/kr/syeyoung/dungeonsguide/auth/ResourceManager.java
new file mode 100644
index 00000000..56d46aea
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/auth/ResourceManager.java
@@ -0,0 +1,164 @@
+package kr.syeyoung.dungeonsguide.auth;
+
+import lombok.Setter;
+import net.minecraftforge.common.MinecraftForge;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import javax.crypto.*;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import javax.net.ssl.HttpsURLConnection;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.security.*;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+public class ResourceManager {
+
+ Logger logger = LogManager.getLogger("ResourceManager");
+
+ @Setter
+ private String baseUrl;
+ @Setter
+ private String BASE64_X509ENCODEDKEYSPEC;
+ private final HashMap loadedResources = new HashMap<>();
+
+
+ private static ResourceManager instance;
+ public static ResourceManager getInstance() {
+ if(instance == null) {
+ instance = new ResourceManager();
+ MinecraftForge.EVENT_BUS.register(instance);
+ }
+ return instance;
+ }
+
+ private ResourceManager() {
+ }
+
+ public Map getResources() {
+ return loadedResources;
+ }
+
+
+ public void downloadAssets(String version) throws InvalidDungeonsGuideCredentialsException {
+ if(AuthManager.getInstance().getToken() == null) throw new InvalidDungeonsGuideCredentialsException("Not Authenticated while downloading assets");
+ try {
+ // version not being null indicates that the user is "premium"
+ // so we download the special version
+ if (version != null)
+ downloadSafe( baseUrl + "/resource/version?v=" + version, true);
+
+ if(!AuthManager.getInstance().isPlebUser()){
+ downloadSafe(baseUrl + "/resource/roomdata", false);
+ } else {
+ logger.error("The current User is a pleb not downloading user data");
+ }
+
+ } catch (Exception t) {
+ t.printStackTrace();
+ }
+
+ }
+
+ private void downloadSafe(String url, boolean isValidateSignature) throws IOException, NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException, SignatureException, InvalidKeySpecException {
+ HttpsURLConnection dgConnection = (HttpsURLConnection) new URL(url).openConnection();
+ dgConnection.setRequestProperty("User-Agent", "DungeonsGuide/1.0");
+ dgConnection.setRequestProperty("Content-Type", "application/json");
+ dgConnection.setRequestMethod("GET");
+ dgConnection.setRequestProperty("Authorization", AuthManager.getInstance().getToken());
+ dgConnection.setDoInput(true);
+ dgConnection.setDoOutput(true);
+
+ InputStream inputStream = dgConnection.getInputStream();
+ byte[] lengthBytes = new byte[4];
+ inputStream.read(lengthBytes);
+ int length = ((lengthBytes[0] & 0xFF) << 24) |
+ ((lengthBytes[1] & 0xFF) << 16) |
+ ((lengthBytes[2] & 0xFF) << 8) |
+ ((lengthBytes[3] & 0xFF));
+ while (inputStream.available() < length) ;
+ byte[] keyPayload = new byte[length];
+ inputStream.read(keyPayload);
+
+ Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
+ cipher.init(Cipher.DECRYPT_MODE, AuthManager.getInstance().getKeyPair().getPrivate());
+ byte[] h = cipher.doFinal(keyPayload);
+
+ cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+ SecretKeySpec keySpec = new SecretKeySpec(h, "AES");
+ IvParameterSpec ivSpec = new IvParameterSpec(h);
+ cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
+ CipherInputStream cipherInputStream = new CipherInputStream(inputStream, cipher);
+
+ cipherInputStream.read(lengthBytes);
+ length = ((lengthBytes[0] & 0xFF) << 24) |
+ ((lengthBytes[1] & 0xFF) << 16) |
+ ((lengthBytes[2] & 0xFF) << 8) |
+ ((lengthBytes[3] & 0xFF));
+
+ int totalLen = length;
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ byte[] buff = new byte[256];
+ while (totalLen > 0) {
+ int len = cipherInputStream.read(buff, 0, Math.min(buff.length, totalLen));
+ totalLen -= len;
+ bos.write(buff, 0, len);
+ }
+ byte[] body = bos.toByteArray();
+
+ byte[] signed;
+ if (isValidateSignature) {
+ cipherInputStream.read(lengthBytes,0 , 4);
+ length = ((lengthBytes[0] & 0xFF) << 24) |
+ ((lengthBytes[1] & 0xFF) << 16) |
+ ((lengthBytes[2] & 0xFF) << 8) |
+ ((lengthBytes[3] & 0xFF));
+
+ totalLen = length;
+ bos = new ByteArrayOutputStream();
+ while (totalLen > 0) {
+ int len = cipherInputStream.read(buff, 0, Math.min(buff.length, totalLen));
+ totalLen -= len;
+ bos.write(buff, 0, len);
+ }
+ signed = bos.toByteArray();
+
+ Signature sign = Signature.getInstance("SHA512withRSA");
+ sign.initVerify(getPublicKey(BASE64_X509ENCODEDKEYSPEC));
+ sign.update(body);
+ boolean truth = sign.verify(signed);
+ if (!truth) throw new SignatureException("DG SIGNATURE FORGED");
+ }
+
+ ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(body));
+ ZipEntry zipEntry;
+ while ((zipEntry=zipInputStream.getNextEntry()) != null) {
+ byte[] buffer = new byte[256];
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ int p;
+ while((p = zipInputStream.read(buffer)) > 0) {
+ byteArrayOutputStream.write(buffer, 0, p);
+ }
+ this.loadedResources.put(zipEntry.getName(), byteArrayOutputStream.toByteArray());
+ }
+ }
+
+
+ public static PublicKey getPublicKey(String base64X509EncodedKeySpec) throws NoSuchAlgorithmException, InvalidKeySpecException {
+ X509EncodedKeySpec spec = new X509EncodedKeySpec(Base64.decodeBase64(base64X509EncodedKeySpec));
+
+ return KeyFactory.getInstance("RSA").generatePublic(spec);
+ }
+
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/auth/authprovider/AuthProvider.java b/src/main/java/kr/syeyoung/dungeonsguide/auth/authprovider/AuthProvider.java
new file mode 100644
index 00000000..ba42574e
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/auth/authprovider/AuthProvider.java
@@ -0,0 +1,16 @@
+package kr.syeyoung.dungeonsguide.auth.authprovider;
+
+import com.mojang.authlib.exceptions.AuthenticationException;
+
+import java.io.IOException;
+import java.security.KeyPair;
+import java.security.NoSuchAlgorithmException;
+
+public interface AuthProvider {
+ String getToken();
+
+ KeyPair getRsaKey();
+
+
+ AuthProvider createAuthProvider() throws NoSuchAlgorithmException, AuthenticationException, IOException;
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/auth/authprovider/DgAuth/DgAuth.java b/src/main/java/kr/syeyoung/dungeonsguide/auth/authprovider/DgAuth/DgAuth.java
new file mode 100644
index 00000000..0e7a05f6
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/auth/authprovider/DgAuth/DgAuth.java
@@ -0,0 +1,46 @@
+package kr.syeyoung.dungeonsguide.auth.authprovider.DgAuth;
+
+import com.mojang.authlib.exceptions.AuthenticationException;
+import kr.syeyoung.dungeonsguide.auth.AuthUtil;
+import kr.syeyoung.dungeonsguide.auth.authprovider.AuthProvider;
+
+import java.io.IOException;
+import java.security.KeyPair;
+import java.security.NoSuchAlgorithmException;
+
+public class DgAuth implements AuthProvider {
+
+ private final String authServerUrl;
+
+ public DgAuth(String authServerUrl){
+ this.authServerUrl = authServerUrl;
+ }
+
+ private String token;
+ private KeyPair rsaKey;
+
+ @Override
+ public String getToken() {
+ return token;
+ }
+
+ @Override
+ public KeyPair getRsaKey() {
+ return rsaKey;
+ }
+
+
+ @Override
+ public AuthProvider createAuthProvider() throws NoSuchAlgorithmException, AuthenticationException, IOException {
+ this.rsaKey = AuthUtil.getKeyPair();
+
+ String tempToken = DgAuthUtil.requestAuth(this.authServerUrl);
+
+ DgAuthUtil.checkSessionAuthenticity(tempToken);
+
+ this.token = DgAuthUtil.verifyAuth(tempToken, rsaKey.getPublic(), authServerUrl);
+
+ return this;
+ }
+
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/auth/authprovider/DgAuth/DgAuthUtil.java b/src/main/java/kr/syeyoung/dungeonsguide/auth/authprovider/DgAuth/DgAuthUtil.java
new file mode 100644
index 00000000..b01fba50
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/auth/authprovider/DgAuth/DgAuthUtil.java
@@ -0,0 +1,88 @@
+package kr.syeyoung.dungeonsguide.auth.authprovider.DgAuth;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.mojang.authlib.GameProfile;
+import com.mojang.authlib.exceptions.AuthenticationException;
+import com.mojang.authlib.minecraft.MinecraftSessionService;
+import net.minecraft.client.Minecraft;
+import net.minecraft.util.Session;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.io.IOUtils;
+
+import javax.net.ssl.HttpsURLConnection;
+import java.io.IOException;
+import java.math.BigInteger;
+import java.net.URL;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.PublicKey;
+
+public class DgAuthUtil {
+ private DgAuthUtil(){}
+
+ public static String requestAuth(String baseurl) throws IOException {
+ GameProfile profile = Minecraft.getMinecraft().getSession().getProfile();
+
+ HttpsURLConnection connection = (HttpsURLConnection) new URL(baseurl + "/auth/requestAuth").openConnection();
+ connection.setRequestProperty("User-Agent", "DungeonsGuide/1.0");
+ connection.setRequestProperty("Content-Type", "application/json");
+ connection.setRequestMethod("POST");
+ connection.setDoInput(true);
+ connection.setDoOutput(true);
+
+ connection.getOutputStream().write(("{\"uuid\":\""+profile.getId().toString()+"\",\"nickname\":\""+profile.getName()+"\"}").getBytes());
+ String payload = String.join("\n", IOUtils.readLines(connection.getErrorStream() == null ? connection.getInputStream() : connection.getErrorStream()));
+
+ JsonObject json = (JsonObject) new JsonParser().parse(payload);
+
+ if (!"ok".equals(json.get("status").getAsString())) {
+ return null;
+ }
+ return json.get("data").getAsString();
+ }
+
+ public static void checkSessionAuthenticity(String tempToken) throws NoSuchAlgorithmException, AuthenticationException {
+ JsonObject d = getJwtPayload(tempToken);
+ byte[] sharedSecret = Base64.decodeBase64(d.get("sharedSecret").getAsString());
+ byte[] publicKey =Base64.decodeBase64(d.get("publicKey").getAsString());
+ String hash = calculateServerHash(sharedSecret, publicKey);
+
+ Session session = Minecraft.getMinecraft().getSession();
+ MinecraftSessionService yggdrasilMinecraftSessionService = Minecraft.getMinecraft().getSessionService();
+ yggdrasilMinecraftSessionService.joinServer(session.getProfile(), session.getToken(), hash);
+ }
+
+ public static String verifyAuth(String tempToken, PublicKey clientKey, String baseurl) throws IOException {
+ HttpsURLConnection urlConnection = (HttpsURLConnection) new URL(baseurl + "/auth/authenticate").openConnection();
+ urlConnection.setRequestMethod("POST");
+ urlConnection.setRequestProperty("User-Agent", "DungeonsGuide/1.0");
+ urlConnection.setRequestProperty("Content-Type", "application/json");
+ urlConnection.setDoInput(true);
+ urlConnection.setDoOutput(true);
+
+ urlConnection.getOutputStream().write(("{\"jwt\":\""+tempToken+"\",\"publicKey\":\""+Base64.encodeBase64URLSafeString(clientKey.getEncoded())+"\"}").getBytes());
+ String payload = String.join("\n", IOUtils.readLines(urlConnection.getErrorStream() == null ? urlConnection.getInputStream() : urlConnection.getErrorStream()));
+
+ JsonObject jsonObject = (JsonObject) new JsonParser().parse(payload);
+ if (!"ok".equals(jsonObject.get("status").getAsString())) {
+ return null;
+ }
+ return jsonObject.get("data").getAsString();
+ }
+
+ public static JsonObject getJwtPayload(String jwt) {
+ String midPart = jwt.split("\\.")[1].replace("+", "-").replace("/", "_");
+ String base64Decode = new String(Base64.decodeBase64(midPart)); // padding
+ return (JsonObject) new JsonParser().parse(base64Decode);
+ }
+
+ public static String calculateServerHash(byte[] a, byte[] b) throws NoSuchAlgorithmException {
+ MessageDigest c = MessageDigest.getInstance("SHA-1");
+ c.update("".getBytes());
+ c.update(a);
+ c.update(b);
+ byte[] d = c.digest();
+ return new BigInteger(d).toString(16);
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/auth/authprovider/NullAuth.java b/src/main/java/kr/syeyoung/dungeonsguide/auth/authprovider/NullAuth.java
new file mode 100644
index 00000000..ec7e9aed
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/auth/authprovider/NullAuth.java
@@ -0,0 +1,62 @@
+package kr.syeyoung.dungeonsguide.auth.authprovider;
+
+import com.mojang.authlib.exceptions.AuthenticationException;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.io.IOException;
+import java.security.KeyPair;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+
+public class NullAuth implements AuthProvider {
+
+ Logger logger = LogManager.getLogger("NullAuth");
+
+ @Override
+ public String getToken() {
+ return "TOKEN";
+ }
+
+ @Override
+ public KeyPair getRsaKey() {
+ return new KeyPair(new PublicKey() {
+ @Override
+ public String getAlgorithm() {
+ return null;
+ }
+
+ @Override
+ public String getFormat() {
+ return null;
+ }
+
+ @Override
+ public byte[] getEncoded() {
+ return new byte[0];
+ }
+ }, new PrivateKey() {
+ @Override
+ public String getAlgorithm() {
+ return null;
+ }
+
+ @Override
+ public String getFormat() {
+ return null;
+ }
+
+ @Override
+ public byte[] getEncoded() {
+ return new byte[0];
+ }
+ });
+ }
+
+ @Override
+ public AuthProvider createAuthProvider() throws NoSuchAlgorithmException, AuthenticationException, IOException {
+ return new NullAuth();
+ }
+
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/chat/ChatProcessResult.java b/src/main/java/kr/syeyoung/dungeonsguide/chat/ChatProcessResult.java
deleted file mode 100644
index 94bafa95..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/chat/ChatProcessResult.java
+++ /dev/null
@@ -1,31 +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.chat;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-@AllArgsConstructor
-@Getter
-public enum ChatProcessResult {
- NONE(false, false), REMOVE_LISTENER(true, false), REMOVE_LISTENER_AND_CHAT(true, true), REMOVE_CHAT(false, true);
-
- private boolean removeListener;
- private boolean removeChat;
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/chat/ChatProcessor.java b/src/main/java/kr/syeyoung/dungeonsguide/chat/ChatProcessor.java
deleted file mode 100644
index 5fc666e2..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/chat/ChatProcessor.java
+++ /dev/null
@@ -1,115 +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.chat;
-
-import kr.syeyoung.dungeonsguide.DungeonsGuide;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.GuiNewChat;
-import net.minecraft.util.ChatComponentText;
-import net.minecraft.util.Tuple;
-import net.minecraftforge.client.event.ClientChatReceivedEvent;
-import net.minecraftforge.fml.common.eventhandler.Event;
-import net.minecraftforge.fml.common.eventhandler.EventPriority;
-import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
-import net.minecraftforge.fml.common.gameevent.TickEvent;
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.simple.SimpleLogger;
-
-import java.util.*;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-public class ChatProcessor {
- public static final ChatProcessor INSTANCE = new ChatProcessor();
-
- private static final Logger logger = LogManager.getLogger();
- private ChatProcessor() {
- Logger l = LogManager.getLogger(GuiNewChat.class);
- if (l instanceof SimpleLogger) {
- ((SimpleLogger) l).setLevel(Level.OFF);
- } else if (l instanceof org.apache.logging.log4j.core.Logger) {
- ((org.apache.logging.log4j.core.Logger) l).setLevel(Level.OFF);
- }
- }
-
- private Queue chatSubscriberQueue = new ConcurrentLinkedQueue<>();
- private Queue> chatQueue = new ConcurrentLinkedQueue<>();
-
- public void subscribe(ChatSubscriber chatSubscribed) {
- chatSubscriberQueue.add(chatSubscribed);
- }
- public void addToChatQueue(String chat, Runnable onSend, boolean noDupe) {
- if (noDupe && chatQueue.stream().anyMatch(a -> a.getFirst().trim().equalsIgnoreCase(chat.trim()))) return;
- chatQueue.add(new Tuple<>(chat, onSend));
- }
-
-
- private long minimumNext = 0;
-
- @SubscribeEvent
- public void onTick(TickEvent.ClientTickEvent clientTickEvent) {
- try {
- if (clientTickEvent.phase == TickEvent.Phase.START && Minecraft.getMinecraft().thePlayer != null && minimumNext < System.currentTimeMillis()) {
- if (!chatQueue.isEmpty()) {
- Tuple tuple = chatQueue.poll();
- Minecraft.getMinecraft().thePlayer.sendChatMessage(tuple.getFirst());
- if (tuple.getSecond() != null)
- tuple.getSecond().run();
- minimumNext = System.currentTimeMillis() + 200;
- DungeonsGuide.sendDebugChat(new ChatComponentText("Sending " + tuple.getFirst() + " Secretly"));
- }
- }
- } catch (Throwable e) {
- e.printStackTrace();
- }
- }
-
-
- @SubscribeEvent(priority = EventPriority.HIGHEST, receiveCanceled = true)
- public void onMessage(ClientChatReceivedEvent chatReceivedEvent) {
- if (chatReceivedEvent.type == 2) return;
- String txt = chatReceivedEvent.message.getFormattedText();
- logger.log(Level.INFO, "[CHAT] "+txt);
-
- int processed = 0;
- int listenened = 0;
- Map context = new HashMap<>();
- Iterator it = chatSubscriberQueue.iterator();
- while (it.hasNext()) {
- ChatSubscriber chatSubscribed = it.next();
- context.put("removed", processed);
- context.put("onceListenered", listenened);
- ChatProcessResult chatProcessResult = chatSubscribed.process(txt, context);
- if (chatProcessResult.isRemoveChat()) processed++;
- if (chatProcessResult.isRemoveListener()) listenened++;
-
- if (chatProcessResult.isRemoveChat()) chatReceivedEvent.setResult(Event.Result.DENY);
- if (chatProcessResult.isRemoveListener()) it.remove();
- }
- }
-
-
- @SubscribeEvent(priority = EventPriority.LOWEST)
- public void cancelMessage(ClientChatReceivedEvent chatReceivedEvent) {
- if (chatReceivedEvent.getResult() == Event.Result.DENY)
- chatReceivedEvent.setCanceled(true);
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/chat/ChatSubscriber.java b/src/main/java/kr/syeyoung/dungeonsguide/chat/ChatSubscriber.java
deleted file mode 100644
index 72879eb0..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/chat/ChatSubscriber.java
+++ /dev/null
@@ -1,26 +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.chat;
-
-import java.util.Map;
-
-@FunctionalInterface
-public interface ChatSubscriber {
- ChatProcessResult process(String txt, Map context);
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/chat/PartyContext.java b/src/main/java/kr/syeyoung/dungeonsguide/chat/PartyContext.java
deleted file mode 100644
index 87d1a264..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/chat/PartyContext.java
+++ /dev/null
@@ -1,89 +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.chat;
-
-import lombok.Data;
-import net.minecraft.client.Minecraft;
-
-import java.util.HashSet;
-import java.util.Set;
-import java.util.TreeSet;
-
-
-@Data
-public class PartyContext {
- private String partyID;
-
- private String partyOwner;
- private Set partyModerator; private boolean isModeratorComplete;
- private Set partyMember; private boolean isMemberComplete;
-
- private Set partyRawMembers = new HashSet<>(); private boolean isRawMemberComplete;
-
- private Boolean allInvite;
-
- private boolean partyExistHypixel = true;
-
- public void setPartyOwner(String partyOwner) {
- this.partyOwner = partyOwner;
- if (partyMember != null) partyMember.remove(partyOwner);
- if (partyModerator != null) partyModerator.remove(partyOwner);
- addRawMember(partyOwner);
- }
- public void addPartyModerator(String partyModerator) {
- if (partyModerator.equalsIgnoreCase(partyOwner)) partyOwner = null;
- if (partyMember != null) partyMember.remove(partyModerator);
-
- if (this.partyModerator == null) this.partyModerator = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
- this.partyModerator.add(partyModerator);
- addRawMember(partyModerator);
- }
- public void addPartyMember(String partyMember) {
- if (partyMember.equalsIgnoreCase(partyOwner)) partyOwner = null;
- if (partyModerator != null) partyModerator.remove(partyMember);
-
- if (this.partyMember == null) this.partyMember = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
- this.partyMember.add(partyMember);
- addRawMember(partyMember);
- }
- public void addRawMember(String partyMember){
- partyRawMembers.add(partyMember);
- }
- public void removeFromParty(String username) {
- if (username.equalsIgnoreCase(partyOwner)) {
- partyOwner = null;
- }
- if (partyModerator != null) partyModerator.remove(username);
- if (partyMember != null) partyMember.remove(username);
- partyRawMembers.remove(username);
- }
-
- public boolean hasModerator(String username) {
- return partyModerator != null && partyModerator.contains(username);
- }
- public boolean hasMember(String username) {
- return partyMember != null && partyMember.contains(username);
- }
- public boolean hasLeader(String username) {
- return username.equalsIgnoreCase(partyOwner);
- }
- public boolean isSelfSolo() {
- return hasLeader(Minecraft.getMinecraft().getSession().getUsername()) && getPartyRawMembers().size() == 1;
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/chat/PartyManager.java b/src/main/java/kr/syeyoung/dungeonsguide/chat/PartyManager.java
deleted file mode 100644
index 3053c74c..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/chat/PartyManager.java
+++ /dev/null
@@ -1,605 +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.chat;
-
-import kr.syeyoung.dungeonsguide.DungeonsGuide;
-import kr.syeyoung.dungeonsguide.events.HypixelJoinedEvent;
-import kr.syeyoung.dungeonsguide.events.StompConnectedEvent;
-import kr.syeyoung.dungeonsguide.stomp.*;
-import kr.syeyoung.dungeonsguide.utils.TextUtils;
-import lombok.Getter;
-import lombok.Setter;
-import net.minecraft.client.Minecraft;
-import net.minecraft.util.ChatComponentText;
-import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
-import org.json.JSONArray;
-import org.json.JSONObject;
-
-import java.security.SecureRandom;
-import java.util.*;
-import java.util.function.Consumer;
-
-public class PartyManager implements StompMessageHandler {
- public static final PartyManager INSTANCE = new PartyManager();
- @Getter
- private PartyContext partyContext;
-
- public PartyContext getPartyContext(boolean createIfNeeded) {
- PartyContext pc = partyContext == null && createIfNeeded ? partyContext = new PartyContext() : partyContext;
- if (createIfNeeded)
- pc.addRawMember(Minecraft.getMinecraft().getSession().getUsername());
- return pc;
- }
-
- @Getter
- @Setter
- private int maxParty = 5;
- @Getter
- private String askToJoinSecret = null;
-
- private static final SecureRandom random = new SecureRandom();
- private static final String validChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";
-
-
- private Set> partyBuiltCallback = new HashSet<>();
-
- public PartyManager() {
- ChatProcessor cp = ChatProcessor.INSTANCE;
- // Not in Party
- cp.subscribe((str, a) -> {
- if (str.equals("§cYou are not currently in a party.§r")
- || str.equals("§eYou left the party.§r")
- || str.equals("§cYou must be in a party to join the party channel!§r")
- || str.equals("§cThe party was disbanded because all invites expired and the party was empty§r")
- || str.equals("§cYou are not in a party and were moved to the ALL channel.§r")
- || str.startsWith("§cThe party was disbanded")
- || str.endsWith("§ehas disbanded the party!§r")
- || str.startsWith("§cYou are not in a party")
- || str.startsWith("§eYou have been kicked from the party by ")) {
- leaveParty();
-
- for (Consumer partyContextConsumer : partyBuiltCallback) {
- try {
- partyContextConsumer.accept(null);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- partyBuiltCallback.clear();
- a.put("type", "notinparty");
- }
- return ChatProcessResult.NONE;
- });
- // All invite
- cp.subscribe((str, a) -> {
- if (str.endsWith("§aenabled All Invite§r")) {
- getPartyContext(true).setAllInvite(true);
- a.put("type", "allinvite_on");
- } else if (str.endsWith("§cdisabled All Invite§r")
- || str.equals("§cYou are not allowed to invite players.§r")) {
- getPartyContext(true).setAllInvite(false);
- a.put("type", "allinvite_off");
- potentialInvitenessChange();
- }
- return ChatProcessResult.NONE;
- });
- // Member building
- cp.subscribe(new ChatSubscriber() {
- boolean memberExpected;
- PartyContext partyContext = new PartyContext();
- @Override
- public ChatProcessResult process(String txt, Map context) {
- if (txt.startsWith("§6Party Members ")) {
- memberExpected = true;
- partyContext = new PartyContext();
- partyContext.setPartyModerator(new TreeSet<>(String.CASE_INSENSITIVE_ORDER));
- partyContext.setPartyMember(new TreeSet<>(String.CASE_INSENSITIVE_ORDER));
- context.put("type", "member_start");
- } else if (txt.startsWith("§eParty ") && txt.contains(":")){
- String role = txt.split(":")[0];
- String playerNames = TextUtils.stripColor(txt.split(":")[1]);
- for (String s : playerNames.split(" ")) {
- if (s.isEmpty()) continue;
- if (s.equals("●")) continue;
- if (s.startsWith("[")) continue;
- partyContext.addRawMember(s);
- if (role.contains("Moder")) partyContext.addPartyModerator(s);
- if (role.contains("Member")) partyContext.addPartyMember(s);
- if (role.contains("Leader")) partyContext.setPartyOwner(s);
- }
- if (role.contains("Moder")) {
- partyContext.setModeratorComplete(true);
- context.put("type", "member_moder");
- }
- if (role.contains("Member")) {
- partyContext.setMemberComplete(true);
- context.put("type", "member_member");
- }
- if (role.contains("Leader")) {
- context.put("type", "member_leader");
- }
- } else if (txt.startsWith("§9§m---------------------------")) {
- if (memberExpected) {
- PartyContext old = getPartyContext(true);
- old.setPartyOwner(partyContext.getPartyOwner());
- old.setPartyModerator(partyContext.getPartyModerator());
- old.setPartyMember(partyContext.getPartyMember());
- old.setPartyRawMembers(new TreeSet<>(String.CASE_INSENSITIVE_ORDER));
- old.getPartyRawMembers().addAll(old.getPartyMember());
- old.getPartyRawMembers().addAll(old.getPartyModerator());
- old.getPartyRawMembers().add(old.getPartyOwner());
- old.setModeratorComplete(true); old.setMemberComplete(true);
- old.setRawMemberComplete(true);
- old.setPartyExistHypixel(true);
-
- memberExpected = false;
- context.put("type", "member_end");
-
- for (Consumer partyContextConsumer : partyBuiltCallback) {
- try {
- partyContextConsumer.accept(partyContext);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- partyBuiltCallback.clear();
-
- if (old.getPartyID() == null) {
- joinedParty();
- }
- potentialInvitenessChange();
- }
- }
- return ChatProcessResult.NONE;
- }
- });
- // Player party join / leave
- cp.subscribe((str ,a) -> {
- if (str.endsWith("§ejoined the party.§r")) {
- String username = null;
- for (String s : TextUtils.stripColor(str).split(" ")) {
- if (s.startsWith("[")) continue;
- username = s;
- break;
- }
- if (username != null) {
- getPartyContext(true).addPartyMember(username);
- }
- a.put("type", "party_join");
- } else if (str.endsWith("§ehas been removed from the party.§r")
- || str.endsWith("§ehas left the party.§r")) {
- String username = null;
- for (String s : TextUtils.stripColor(str).split(" ")) {
- if (s.startsWith("[")) continue;
- username = s;
- break;
- }
- if (username != null && partyContext != null) {
- getPartyContext().removeFromParty(username);
- }
- a.put("type", "party_leave");
- } else if (str.endsWith(" They have §r§c60 §r§eseconds to accept.§r")) {
- String[] messageSplit = TextUtils.stripColor(str).split(" ");
- String inviter = null;
- for (String s : messageSplit) {
- if (s.startsWith("[")) continue;
- inviter = s;
- break;
- }
- if (inviter != null && partyContext != null) {
- if (getPartyContext().hasMember(inviter)) {
- getPartyContext().setAllInvite(true);
- }
- }
- getPartyContext(true).setPartyExistHypixel(true);
- a.put("type", "party_invite_exist");
- } else if (str.equals("§cCouldn't find a player with that name!§r") || str.equals("§cYou cannot invite that player since they're not online.")) {
- a.put("type", "party_invite_noexist");
- String username = Minecraft.getMinecraft().getSession().getUsername();
- if (partyContext != null && getPartyContext().hasMember(username)) {
- getPartyContext().setAllInvite(true);
- }
- }
- return ChatProcessResult.NONE;
- });
- // Promotion
- cp.subscribe((str, a) -> {
- if (str.startsWith("§eThe party was transferred to ")) {
- // §eThe party was transferred to §r§b[MVP§r§f+§r§b] apotato321 §r§eby §r§a[VIP§r§6+§r§a] syeyoung§r
- String[] messageSplit = TextUtils.stripColor(str.substring(31)).split(" ");
- String newLeader = null;
- for (String s : messageSplit) {
- if (s.startsWith("[")) continue;
- newLeader = s;
- break;
- }
- String oldLeader;
- boolean left= false;
- if (str.endsWith("§r§eleft§r")) {
- oldLeader = messageSplit[messageSplit.length-2];
- left = true;
- } else {
- oldLeader = messageSplit[messageSplit.length-1];
- }
-
- if (oldLeader != null && newLeader != null ) {
- getPartyContext(true).setPartyOwner(newLeader);
- if (left)
- getPartyContext(true).removeFromParty(oldLeader);
- else
- getPartyContext(true).addPartyModerator(oldLeader);
- }
- a.put("type", "party_transfer");
- potentialInvitenessChange();
- } else if (str.endsWith("§eto Party Leader§r")) {
- // §a[VIP§r§6+§r§a] syeyoung§r§e has promoted §r§b[MVP§r§f+§r§b] apotato321 §r§eto Party Leader§r
- String[] messageSplit = TextUtils.stripColor(str).split(" ");
- String oldLeader = null;
- for (String s : messageSplit) {
- if (s.startsWith("[")) continue;
- oldLeader = s;
- break;
- }
- messageSplit = TextUtils.stripColor(str.substring(str.indexOf("has promoted") + 13)).split(" ");
- String newLeader = null;
- for (String s : messageSplit) {
- if (s.startsWith("[")) continue;
- newLeader = s;
- break;
- }
-
- if (oldLeader != null && newLeader != null) {
- getPartyContext(true).setPartyOwner(newLeader);
- getPartyContext(true).addPartyModerator(oldLeader);
- }
- a.put("type", "party_transfer");
- potentialInvitenessChange();
- } else if (str.endsWith("§r§eto Party Moderator§r")) {
- // §b[MVP§r§f+§r§b] apotato321§r§e has promoted §r§a[VIP§r§6+§r§a] syeyoung §r§eto Party Moderator§r
- String[] messageSplit = TextUtils.stripColor(str).split(" ");
- String oldLeader = null;
- for (String s : messageSplit) {
- if (s.startsWith("[")) continue;
- oldLeader = s;
- break;
- }
- messageSplit = TextUtils.stripColor(str.substring(str.indexOf("has promoted") + 13)).split(" ");
- String newModerator = null;
- for (String s : messageSplit) {
- if (s.startsWith("[")) continue;
- newModerator = s;
- break;
- }
-
- if (oldLeader != null && newModerator != null) {
- getPartyContext(true).setPartyOwner(oldLeader);
- getPartyContext(true).addPartyModerator(newModerator);
- }
- a.put("type", "party_promotion");
- potentialInvitenessChange();
- } else if (str.endsWith("§r§eto Party Member§r")) {
- String[] messageSplit = TextUtils.stripColor(str).split(" ");
- String oldLeader = null;
- for (String s : messageSplit) {
- if (s.startsWith("[")) continue;
- oldLeader = s;
- break;
- }
- messageSplit = TextUtils.stripColor(str.substring(str.indexOf("has demoted") + 12)).split(" ");
- String newMember = null;
- for (String s : messageSplit) {
- if (s.startsWith("[")) continue;
- newMember = s;
- break;
- }
-
- if (oldLeader != null && newMember != null) {
- getPartyContext(true).setPartyOwner(oldLeader);
- getPartyContext(true).addPartyMember(newMember);
- }
- a.put("type", "party_demotion");
- potentialInvitenessChange();
- }
- return ChatProcessResult.NONE;
- });
- // Player Join
- cp.subscribe(new ChatSubscriber() {
- boolean joined;
- @Override
- public ChatProcessResult process(String str, Map context) {
- if (str.startsWith("§eYou have joined ")) {
- String[] messageSplit = TextUtils.stripColor(str.substring(18)).split(" ");
- String leader = null;
- for (String s : messageSplit) {
- if (s.startsWith("[")) continue;
- leader = s;
- break;
- }
- leader = leader.substring(0, leader.length()-2); // remove 's
- partyContext = new PartyContext();
- getPartyContext().setPartyOwner(leader);
- getPartyContext().addPartyMember(Minecraft.getMinecraft().getSession().getUsername());
- context.put("type", "party_selfjoin_leader");
- joined= true;
- } else if (str.startsWith("§eYou'll be partying with: ")) {
- String[] players = TextUtils.stripColor(str.substring(27)).split(" ");
- for (String player : players) {
- if (player.startsWith("[")) continue;
- getPartyContext().addRawMember(player);
- }
- context.put("type", "party_selfjoin_players");
- } else if (str.startsWith("§9§m---------------------------") && joined) {
- joined = false;
- getPartyContext().setRawMemberComplete(true);
- joinedParty();
- potentialInvitenessChange();
- }
- return ChatProcessResult.NONE;
- }});
- // Player Join Dungon
- cp.subscribe((str, a)-> {
- if (str.contains("§r§ejoined the dungeon group! (§r§b")) {
- String username = TextUtils.stripColor(str).split(" ")[3];
- if (username.equalsIgnoreCase(Minecraft.getMinecraft().getSession().getUsername())) {
- partyContext = new PartyContext();
- requestPartyList((str2) -> {
- potentialInvitenessChange();
- });
- } else {
- getPartyContext(true).setMemberComplete(false);
- requestPartyList((str2) -> {});
- }
- }
- return ChatProcessResult.NONE;
- });
- }
-
- public void toggleAllowAskToJoin() {
- if (canInvite()) {
- if (askToJoinSecret != null) askToJoinSecret = null;
- else {
- updateAskToJoin();
- }
- }
- }
-
- public void updateAskToJoin() {
- StringBuilder secretBuilder = new StringBuilder();
- for (int i = 0; i < 20; i++) {
- secretBuilder.append(validChars.charAt(random.nextInt(validChars.length())));
- }
- askToJoinSecret = secretBuilder.toString();
-
- StompInterface stompInterface = DungeonsGuide.getDungeonsGuide().getStompConnection();
- stompInterface.send(new StompPayload().payload(new JSONObject().put("secret", askToJoinSecret).toString()).header("destination", "/app/party.setjoinsecret"));
- }
-
- public static ChatSubscriber dashShredder() {
- return (str, a) -> (int)a.get("removed") == 0 && str.startsWith("§9§m---------------------------") ? ChatProcessResult.REMOVE_LISTENER_AND_CHAT : ChatProcessResult.NONE;
- }
-
- public static ChatSubscriber typeShredder(boolean end, String... types) {
- return (str, a) -> (int)a.get("removed") == 0 &&Arrays.stream(types).anyMatch(s -> s.equals(a.getOrDefault("type", null))) ? (end ? ChatProcessResult.REMOVE_LISTENER_AND_CHAT : ChatProcessResult.REMOVE_CHAT) : ChatProcessResult.NONE;
- }
-
- public static ChatSubscriber combinedShredder(ChatSubscriber... chatSubscribers) {
- return (str, a) -> {
- boolean removeChat = false;
- boolean removeListener = false;
- for (ChatSubscriber chatSubscriber : chatSubscribers) {
- ChatProcessResult chatProcessResult = chatSubscriber.process(str, a);
- if (chatProcessResult.isRemoveChat()) removeChat = true;
- if (chatProcessResult.isRemoveListener()) removeListener = true;
- }
- return (removeChat && removeListener) ? ChatProcessResult.REMOVE_LISTENER_AND_CHAT : (removeChat ? ChatProcessResult.REMOVE_CHAT : (removeListener ? ChatProcessResult.REMOVE_LISTENER : ChatProcessResult.NONE));
- };
- }
-
- @SubscribeEvent
- public void onHypixelJoin(HypixelJoinedEvent skyblockJoinedEvent) {
- partyContext = null;
- requestPartyList((a) -> {
- if (a == null) return;
- if (isLeader() || isModerator()) return;
- if (a.getAllInvite() != null) return;
- requestAllInvite();
- });
- }
-
- private void leaveParty() {
- if (partyContext != null) {
- getPartyContext().setPartyExistHypixel(false);
- if (getPartyContext().isSelfSolo()) return;
- if (getPartyContext().getPartyID() != null) {
- JSONObject object = new JSONObject();
- object.put("partyid", getPartyContext().getPartyID());
- StompInterface stompInterface = DungeonsGuide.getDungeonsGuide().getStompConnection();
- stompInterface.send(new StompPayload().payload(object.toString()).header("destination", "/app/party.leave"));
- }
- }
-
- partyContext = new PartyContext();
- playerInvAntiSpam.clear();
-
- getPartyContext().setPartyExistHypixel(false);
- getPartyContext().setPartyOwner(Minecraft.getMinecraft().getSession().getUsername());
- getPartyContext().setPartyModerator(new TreeSet<>(String.CASE_INSENSITIVE_ORDER)); getPartyContext().setMemberComplete(true);
- getPartyContext().setPartyMember(new TreeSet<>(String.CASE_INSENSITIVE_ORDER)); getPartyContext().setModeratorComplete(true);
- getPartyContext().setAllInvite(false);
- joinedParty();
- }
- private void joinedParty() {
- JSONArray jsonArray = new JSONArray();
- for (String member : getPartyContext().getPartyRawMembers()) {
- jsonArray.put(member);
- }
- JSONObject object = new JSONObject();
- object.put("members", jsonArray);
- StompInterface stompInterface = DungeonsGuide.getDungeonsGuide().getStompConnection();
- stompInterface.send(new StompPayload().payload(object.toString()).header("destination", "/app/party.join"));
-
- getPartyContext().setPartyID("!@#!@#!@#..........FETCHING..........$!@$!@$!@$"+UUID.randomUUID().toString());
- }
-
- public boolean isLeader() {
- return partyContext != null && getPartyContext().hasLeader(Minecraft.getMinecraft().getSession().getUsername()); // "getUsername"
- }
- public boolean isModerator() {
- return partyContext != null && getPartyContext().hasModerator(Minecraft.getMinecraft().getSession().getUsername());
- }
- public boolean canInvite() {
- return isLeader() || isModerator() || (partyContext != null && getPartyContext().getAllInvite() != null && getPartyContext().getAllInvite());
- }
-
- private boolean requested = false;
- public void requestPartyList(Consumer onPartyCallback) {
- if (requested) {
- partyBuiltCallback.add(onPartyCallback);
- return;
- }
- requested = true;
-
- ChatProcessor.INSTANCE.addToChatQueue("/pl", () -> {
- ChatProcessor.INSTANCE.subscribe(dashShredder());
- ChatProcessor.INSTANCE.subscribe(combinedShredder(typeShredder(true, "member_end"), dashShredder(), typeShredder(false,"notinparty", "member_start", "member_moder", "member_leader", "member_member")));
- }, true);
- partyBuiltCallback.add(onPartyCallback);
- partyBuiltCallback.add(pc -> requested=false);
- }
-
- public void requestAllInvite() {
- if (isLeader() || isModerator()) return;
- if (partyContext != null && getPartyContext().getAllInvite() != null) return;
-
- ChatProcessor.INSTANCE.addToChatQueue("/p invite -", () -> {
- ChatProcessor.INSTANCE.subscribe(dashShredder());
- ChatProcessor.INSTANCE.subscribe(typeShredder(true, "notinparty", "allinvite_off", "party_invite_noexist"));
- ChatProcessor.INSTANCE.subscribe(dashShredder());
- }, true);
- }
-
- private Map playerInvAntiSpam = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
-
- @Override
- public void handle(StompInterface stompInterface, StompPayload stompPayload) {
- JSONObject object = new JSONObject(stompPayload.payload());
- if ("/user/queue/party.check".equals(stompPayload.headers().get("destination"))) {
- String playerName = object.getString("player");
- String token = object.getString("token");
- if (partyContext == null) {
- requestPartyList((pc) -> {
- boolean contains = pc.getPartyRawMembers().contains(playerName);
- if (!contains) {
- DungeonsGuide.getDungeonsGuide().getStompConnection().send(new StompPayload().payload(new JSONObject().put("status", "failure").put("token", token).toString()).header("destination", "/app/party.check.resp"));
- } else {
- DungeonsGuide.getDungeonsGuide().getStompConnection().send(new StompPayload().payload(new JSONObject().put("status", "success").put("token", token).toString()).header("destination", "/app/party.check.resp"));
- }
- });
- } else {
- if (getPartyContext().getPartyRawMembers().contains(playerName)) {
- DungeonsGuide.getDungeonsGuide().getStompConnection().send(new StompPayload().payload(new JSONObject().put("status", "success").put("token", token).toString()).header("destination", "/app/party.check.resp"));
- } else if (getPartyContext().isMemberComplete() && getPartyContext().isModeratorComplete() && getPartyContext().getPartyOwner() != null) {
- DungeonsGuide.getDungeonsGuide().getStompConnection().send(new StompPayload().payload(new JSONObject().put("status", "failure").put("token", token).toString()).header("destination", "/app/party.check.resp"));
- } else {
- requestPartyList((pc) -> {
- boolean contains = pc.getPartyRawMembers().contains(playerName);
- if (!contains) {
- DungeonsGuide.getDungeonsGuide().getStompConnection().send(new StompPayload().payload(new JSONObject().put("status", "failure").put("token", token).toString()).header("destination", "/app/party.check.resp"));
- } else {
- DungeonsGuide.getDungeonsGuide().getStompConnection().send(new StompPayload().payload(new JSONObject().put("status", "success").put("token", token).toString()).header("destination", "/app/party.check.resp"));
- }
- });
- }
- }
- } else if ("/user/queue/party.broadcast".equals(stompPayload.headers().get("destination"))) {
- try {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: Message Broadcasted from player:: \n" + new JSONObject(stompPayload.payload()).getString("payload")));
- } catch (Exception e) {
- e.printStackTrace();
- }
- } else if ("/user/queue/party.join".equals(stompPayload.headers().get("destination"))) {
- String playerName = object.getString("player");
- String secret = object.getString("secret");
- if (secret.equals(askToJoinSecret) && partyContext != null && getPartyContext().getPartyRawMembers().size() < maxParty && playerInvAntiSpam.getOrDefault(playerName, 0L) < System.currentTimeMillis() - 5000) {
- playerInvAntiSpam.put(playerName, System.currentTimeMillis());
- ChatProcessor.INSTANCE.addToChatQueue("/p invite "+playerName,() -> {}, true);
- }
- } else if ("/user/queue/party.askedtojoin.resp".equals(stompPayload.headers().get("destination"))) {
- String invFrom = object.getString("username");
- String token2 = object.getString("token");
- if (!token2.equals(lastToken)) return;
- lastToken = null;
- ChatProcessor.INSTANCE.addToChatQueue("/p accept "+invFrom, () -> {}, true);
- long end = System.currentTimeMillis() + 3000;
- ChatProcessor.INSTANCE.subscribe((str, a) -> {
- if (!str.contains("§r§ehas invited you to join their party!")) return System.currentTimeMillis() > end ? ChatProcessResult.REMOVE_LISTENER : ChatProcessResult.NONE;
- String[] messageSplit = TextUtils.stripColor(str).split(" ");
- String inviter = null;
- for (String s : messageSplit) {
- if (s.startsWith("[")) continue;
- if (s.startsWith("-")) continue;;
- inviter = s;
- break;
- }
- if (invFrom.equalsIgnoreCase(inviter)) {
- ChatProcessor.INSTANCE.addToChatQueue("/p accept "+invFrom, () -> {}, true);
- }
- return ChatProcessResult.NONE;
- });
- } else {
- String str = object.getString("status");
- if ("success".equals(str) && partyContext != null) {
- getPartyContext().setPartyID(object.getString("partyId"));
- if (askToJoinSecret != null) {
- updateAskToJoin();
- }
- } else if (partyContext != null){
- getPartyContext().setPartyID(null);
- }
- }
- }
-
- @SubscribeEvent
- public void stompConnect(StompConnectedEvent stompConnectedEvent) {
- stompConnectedEvent.getStompInterface().subscribe(StompSubscription.builder()
- .stompMessageHandler(this).ackMode(StompSubscription.AckMode.AUTO).destination("/user/queue/party.resp").build());
- stompConnectedEvent.getStompInterface().subscribe(StompSubscription.builder()
- .stompMessageHandler(this).ackMode(StompSubscription.AckMode.AUTO).destination("/user/queue/party.check").build());
- stompConnectedEvent.getStompInterface().subscribe(StompSubscription.builder()
- .stompMessageHandler(this).ackMode(StompSubscription.AckMode.AUTO).destination("/user/queue/party.broadcast").build());
- stompConnectedEvent.getStompInterface().subscribe(StompSubscription.builder()
- .stompMessageHandler(this).ackMode(StompSubscription.AckMode.AUTO).destination("/user/queue/party.join").build());
- stompConnectedEvent.getStompInterface().subscribe(StompSubscription.builder()
- .stompMessageHandler(this).ackMode(StompSubscription.AckMode.AUTO).destination("/user/queue/party.askedtojoin.resp").build());
- }
-
- private String lastToken;
- public void joinWithToken(String secret) {
- lastToken = secret;
- if (partyContext != null && getPartyContext().isPartyExistHypixel())
- ChatProcessor.INSTANCE.addToChatQueue("/p leave", () -> {}, true);
- DungeonsGuide.getDungeonsGuide().getStompConnection().send(new StompPayload().method(StompHeader.SEND)
- .header("destination", "/app/party.askedtojoin")
- .payload(new JSONObject().put("token", secret).toString()));
- }
-
- private void potentialInvitenessChange() {
- if (askToJoinSecret != null && !canInvite()) askToJoinSecret = null;
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/commands/CommandDungeonsGuide.java b/src/main/java/kr/syeyoung/dungeonsguide/commands/CommandDungeonsGuide.java
deleted file mode 100644
index 95850fdc..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/commands/CommandDungeonsGuide.java
+++ /dev/null
@@ -1,602 +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.commands;
-
-import com.google.gson.JsonObject;
-import kr.syeyoung.dungeonsguide.DungeonsGuide;
-import kr.syeyoung.dungeonsguide.chat.PartyContext;
-import kr.syeyoung.dungeonsguide.chat.PartyManager;
-import kr.syeyoung.dungeonsguide.rpc.RichPresenceManager;
-import kr.syeyoung.dungeonsguide.SkyblockStatus;
-import kr.syeyoung.dungeonsguide.config.guiconfig.GuiConfigV2;
-import kr.syeyoung.dungeonsguide.config.guiconfig.NestedCategory;
-import kr.syeyoung.dungeonsguide.cosmetics.CosmeticsManager;
-import kr.syeyoung.dungeonsguide.dungeon.DungeonContext;
-import kr.syeyoung.dungeonsguide.dungeon.MapProcessor;
-import kr.syeyoung.dungeonsguide.dungeon.data.DungeonRoomInfo;
-import kr.syeyoung.dungeonsguide.dungeon.data.OffsetPoint;
-import kr.syeyoung.dungeonsguide.dungeon.doorfinder.DungeonSpecificDataProvider;
-import kr.syeyoung.dungeonsguide.dungeon.doorfinder.DungeonSpecificDataProviderRegistry;
-import kr.syeyoung.dungeonsguide.dungeon.events.DungeonEventHolder;
-import kr.syeyoung.dungeonsguide.dungeon.mechanics.*;
-import kr.syeyoung.dungeonsguide.dungeon.roomfinder.DungeonRoom;
-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.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;
-import kr.syeyoung.dungeonsguide.roomprocessor.bossfight.BossfightProcessor;
-import kr.syeyoung.dungeonsguide.stomp.*;
-import kr.syeyoung.dungeonsguide.utils.AhUtils;
-import kr.syeyoung.dungeonsguide.utils.MapUtils;
-import kr.syeyoung.dungeonsguide.utils.ShortUtils;
-import kr.syeyoung.dungeonsguide.wsresource.StaticResourceCache;
-import net.minecraft.block.Block;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.entity.EntityPlayerSP;
-import net.minecraft.command.CommandBase;
-import net.minecraft.command.ICommandSender;
-import net.minecraft.nbt.CompressedStreamTools;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.server.MinecraftServer;
-import net.minecraft.util.*;
-import net.minecraft.world.World;
-import net.minecraftforge.common.MinecraftForge;
-import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
-import net.minecraftforge.fml.common.gameevent.TickEvent;
-import org.json.JSONObject;
-
-import javax.crypto.BadPaddingException;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
-import javax.vecmath.Vector2d;
-import java.awt.*;
-import java.io.*;
-import java.security.*;
-import java.security.cert.CertificateException;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.List;
-import java.util.regex.Pattern;
-
-public class CommandDungeonsGuide extends CommandBase {
- @Override
- public String getCommandName() {
- return "dg";
- }
-
- @Override
- public String getCommandUsage(ICommandSender sender) {
- return "dg";
- }
-
- @Override
- public void processCommand(ICommandSender sender, String[] args) {
- if (args.length == 0) {
- openConfig = true;
- } else if (args[0].equalsIgnoreCase("saverooms")) {
- DungeonRoomInfoRegistry.saveAll(DungeonsGuide.getDungeonsGuide().getConfigDir());
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §fSuccessfully saved user generated roomdata"));
- } else if (args[0].equalsIgnoreCase("loadrooms")) {
- try {
- DungeonRoomInfoRegistry.loadAll(DungeonsGuide.getDungeonsGuide().getConfigDir());
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §fSuccessfully loaded roomdatas"));
- return;
- } catch (BadPaddingException e) {
- e.printStackTrace();
- } catch (InvalidAlgorithmParameterException e) {
- e.printStackTrace();
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (IllegalBlockSizeException e) {
- e.printStackTrace();
- } catch (NoSuchPaddingException e) {
- e.printStackTrace();
- } catch (InvalidKeyException e) {
- e.printStackTrace();
- }
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §cAn error has occurred while loading roomdata"));
- } else if (args[0].equalsIgnoreCase("reloadah")) {
- try {
- AhUtils.loadAuctions();
- } catch (CertificateException e) {
- e.printStackTrace();
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- } catch (InvalidKeyException e) {
- e.printStackTrace();
- } catch (InvalidAlgorithmParameterException e) {
- e.printStackTrace();
- } catch (NoSuchPaddingException e) {
- e.printStackTrace();
- } catch (BadPaddingException e) {
- e.printStackTrace();
- } catch (KeyStoreException e) {
- e.printStackTrace();
- } catch (IllegalBlockSizeException e) {
- e.printStackTrace();
- } catch (KeyManagementException e) {
- e.printStackTrace();
- }
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §fReloaded Ah data"));
- } else if (args[0].equalsIgnoreCase("brand")) {
- String serverBrand = Minecraft.getMinecraft().thePlayer.getClientBrand();
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e" + serverBrand));
- } else if (args[0].equalsIgnoreCase("reparty")) {
- if (!DungeonsGuide.getDungeonsGuide().getCommandReparty().requestReparty(false)) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §cCurrently Repartying"));
- }
- } else if (args[0].equalsIgnoreCase("gui")) {
- openConfig = true;
- } else if (args[0].equalsIgnoreCase("info")) {
- JsonObject obj = DungeonsGuide.getDungeonsGuide().getAuthenticator().getJwtPayload(DungeonsGuide.getDungeonsGuide().getAuthenticator().getToken());
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
-
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §fCurrent Plan§7: §e" + obj.get("plan").getAsString()));
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §fBound to§7: §e" + obj.get("nickname").getAsString()));
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §fBound uuid§7: §e" + obj.get("uuid").getAsString()));
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §fSession Expire§7: §e" + sdf.format(new Date(obj.get("exp").getAsLong() * 1000))));
- } else if (args[0].equalsIgnoreCase("pathfind")) {
- try {
- DungeonContext context = DungeonsGuide.getDungeonsGuide().getSkyblockStatus().getContext();
- EntityPlayerSP thePlayer = Minecraft.getMinecraft().thePlayer;
- if (thePlayer == null) return;
- if (context.getBossfightProcessor() != null) context.getBossfightProcessor().tick();
- Point roomPt = context.getMapProcessor().worldPointToRoomPoint(thePlayer.getPosition());
-
- DungeonRoom dungeonRoom = context.getRoomMapper().get(roomPt);
- GeneralRoomProcessor grp = (GeneralRoomProcessor) dungeonRoom.getRoomProcessor();
- grp.pathfind("COMMAND", args[1], args[2], FeatureRegistry.SECRET_LINE_PROPERTIES_GLOBAL.getRouteProperties());
- } catch (Throwable t) {
- t.printStackTrace();
- }
- } else if (args[0].equals("process") && Minecraft.getMinecraft().getSession().getPlayerID().replace("-", "").equals("e686fe0aab804a71ac7011dc8c2b534c")) {
- File root = DungeonsGuide.getDungeonsGuide().getConfigDir();
- File dir = new File(root, "processorinput");
- File outsecret = new File(root, "processoroutsecret");
- for (File f : dir.listFiles()) {
- if (!f.getName().endsWith(".roomdata")) continue;
- try {
- InputStream fis = new FileInputStream(f);
- ObjectInputStream ois = new ObjectInputStream(fis);
- DungeonRoomInfo dri = (DungeonRoomInfo) ois.readObject();
- ois.close();
- fis.close();
- dri.setUserMade(false);
-
- FileOutputStream fos = new FileOutputStream(new File(outsecret, dri.getUuid().toString() + ".roomdata"));
- ObjectOutputStream oos = new ObjectOutputStream(fos);
- oos.writeObject(dri);
- oos.flush();
- oos.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- } else if (args[0].equals("check") && Minecraft.getMinecraft().getSession().getPlayerID().replace("-", "").equals("e686fe0aab804a71ac7011dc8c2b534c")) {
- File root = DungeonsGuide.getDungeonsGuide().getConfigDir();
- for (File f : root.listFiles()) {
- if (!f.getName().endsWith(".roomdata")) continue;
- try {
- InputStream fis = new FileInputStream(f);
- ObjectInputStream ois = new ObjectInputStream(fis);
- DungeonRoomInfo dri = (DungeonRoomInfo) ois.readObject();
- ois.close();
- fis.close();
- System.out.println("Starting at " + dri.getName() + " - " + dri.getUuid());
- for (Map.Entry value2 : dri.getMechanics().entrySet()) {
- DungeonMechanic value = value2.getValue();
- if (value instanceof DungeonSecret &&
- (((DungeonSecret) value).getSecretType() == DungeonSecret.SecretType.BAT
- || ((DungeonSecret) value).getSecretType() == DungeonSecret.SecretType.CHEST)
- && ((DungeonSecret) value).getSecretPoint().getY() == 0) {
- OffsetPoint offsetPoint = ((DungeonSecret) value).getSecretPoint();
- if (dri.getBlocks()[offsetPoint.getZ()][offsetPoint.getX()] != -1) {
- dri.getBlocks()[offsetPoint.getZ()][offsetPoint.getX()] = -1;
- System.out.println("Fixing " + value2.getKey() + " - as secret " + ((DungeonSecret) value).getSecretType() + " - at " + ((DungeonSecret) value).getSecretPoint());
- }
- } else if (value instanceof DungeonOnewayDoor) {
- for (OffsetPoint offsetPoint : ((DungeonOnewayDoor) value).getSecretPoint().getOffsetPointList()) {
- if (offsetPoint.getY() == 0 && dri.getBlocks()[offsetPoint.getZ()][offsetPoint.getX()] != -1) {
- dri.getBlocks()[offsetPoint.getZ()][offsetPoint.getX()] = -1;
- System.out.println("Fixing " + value2.getKey() + " - o-door - at " + offsetPoint);
- }
- }
- } else if (value instanceof DungeonDoor) {
- for (OffsetPoint offsetPoint : ((DungeonDoor) value).getSecretPoint().getOffsetPointList()) {
- if (offsetPoint.getY() == 0 && dri.getBlocks()[offsetPoint.getZ()][offsetPoint.getX()] != -1) {
- dri.getBlocks()[offsetPoint.getZ()][offsetPoint.getX()] = -1;
- System.out.println("Fixing " + value2.getKey() + " - door - at " + offsetPoint);
- }
- }
- } else if (value instanceof DungeonBreakableWall) {
- for (OffsetPoint offsetPoint : ((DungeonBreakableWall) value).getSecretPoint().getOffsetPointList()) {
- if (offsetPoint.getY() == 0 && dri.getBlocks()[offsetPoint.getZ()][offsetPoint.getX()] != -1) {
- dri.getBlocks()[offsetPoint.getZ()][offsetPoint.getX()] = -1;
- System.out.println("Fixing " + value2.getKey() + " - wall - at " + offsetPoint);
- }
- }
- } else if (value instanceof DungeonTomb) {
- for (OffsetPoint offsetPoint : ((DungeonTomb) value).getSecretPoint().getOffsetPointList()) {
- if (offsetPoint.getY() == 0 && dri.getBlocks()[offsetPoint.getZ()][offsetPoint.getX()] != -1) {
- dri.getBlocks()[offsetPoint.getZ()][offsetPoint.getX()] = -1;
- System.out.println("Fixing " + value2.getKey() + " - crypt - at " + offsetPoint);
- }
- }
- }
- }
- FileOutputStream fos = new FileOutputStream(f);
- ObjectOutputStream oos = new ObjectOutputStream(fos);
- oos.writeObject(dri);
- oos.flush();
- oos.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- } else if (args[0].equals("reloaddungeon") && Minecraft.getMinecraft().getSession().getPlayerID().replace("-", "").equals("e686fe0aab804a71ac7011dc8c2b534c")) {
- try {
- MinecraftForge.EVENT_BUS.post(new DungeonLeftEvent());
- DungeonsGuide.getDungeonsGuide().getSkyblockStatus().setContext(null);
- MapUtils.clearMap();
- } catch (Throwable t) {
- t.printStackTrace();
- }
- } else if (args[0].equalsIgnoreCase("pvall")) {
- PartyManager.INSTANCE.requestPartyList((context) -> {
- if (context == null) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §cNot in Party"));
- return;
- }
- FeatureViewPlayerStatsOnJoin.processPartyMembers(context);
- });
-// } else if (args[0].equals("fixschematic")) {
-// File root = new File(e.getDungeonsGuide().getConfigDir(), "schematics");
-// Method method = null;
-// try {
-// method = NBTTagCompound.class.getDeclaredMethod("write", DataOutput.class);
-// method.setAccessible(true);
-// } catch (NoSuchMethodException e) {
-// e.printStackTrace();
-// return;
-// }
-// for (File f : root.listFiles()) {
-// try {
-// NBTTagCompound nbtTagCompound = CompressedStreamTools.readCompressed(new FileInputStream(f));
-// if (nbtTagCompound.getKeySet().isEmpty()) {
-// System.out.println("ah");
-// return;
-// }
-// nbtTagCompound.setString("Materials","Alpha");
-// FileOutputStream fos = new FileOutputStream(f);
-// DataOutputStream dataoutputstream = new DataOutputStream(new BufferedOutputStream(new GZIPOutputStream(fos)));
-//
-// try
-// {
-// dataoutputstream.writeByte(nbtTagCompound.getId());
-//
-// dataoutputstream.writeUTF("Schematic");
-// method.invoke(nbtTagCompound, dataoutputstream);
-// }
-// finally
-// {
-// dataoutputstream.close();
-// }
-// } catch (Exception e) {
-// e.printStackTrace();
-// }
-// }
- } else if (args[0].equalsIgnoreCase("asktojoin") || args[0].equalsIgnoreCase("atj")) {
- if (RichPresenceManager.INSTANCE.getLastSetupCode() == -9999) {
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §cDiscord GameSDK has been disabled, or it failed to load!"));
- return;
- }
- if (!PartyManager.INSTANCE.canInvite()) {
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §cYou don't have perms in the party to invite people!"));
- } else {
- PartyManager.INSTANCE.toggleAllowAskToJoin();
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §fToggled Ask to join to " + (PartyManager.INSTANCE.getAskToJoinSecret() != null ? "§eon" : "§coff")));
- }
-
- if (!FeatureRegistry.DISCORD_RICHPRESENCE.isEnabled()) {
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §cDiscord Rich Presence is disabled! Enable at /dg -> Discord "));
- }
- if (!FeatureRegistry.DISCORD_ASKTOJOIN.isEnabled()) {
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §cDiscord Invite Viewer is disabled! Enable at /dg -> Discord ")); // how
- }
- } else if (args[0].equalsIgnoreCase("partymax") || args[0].equalsIgnoreCase("pm")) {
- if (args.length == 1) {
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §fCurrent party max is §e" + PartyManager.INSTANCE.getMaxParty()));
- } else if (args.length == 2) {
- try {
- int partyMax = Integer.parseInt(args[1]);
- if (partyMax < 2) {
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §cparty max can't be smaller than 2"));
- return;
- }
-
- PartyManager.INSTANCE.setMaxParty(partyMax);
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §fSuccessfully set partymax to §e" + PartyManager.INSTANCE.getMaxParty()));
- } catch (Exception e) {
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §c" + args[1] + " is not valid number."));
- return;
- }
- }
- } else if (args[0].equals("partyid")) {
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §fInternal Party id: " + Optional.ofNullable(PartyManager.INSTANCE.getPartyContext()).map(PartyContext::getPartyID).orElse(null)));
- } else if (args[0].equalsIgnoreCase("loc")) {
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §fYou're in " + DungeonsGuide.getDungeonsGuide().getSkyblockStatus().getDungeonName()));
- } else if (args[0].equalsIgnoreCase("saverun")) {
- try {
- File f = DungeonsGuide.getDungeonsGuide().getConfigDir();
- File runDir = new File(f, "dungeonruns");
- runDir.mkdirs();
-
- File runFile = new File(runDir, UUID.randomUUID() + ".dgrun");
-
- DungeonContext dungeonContext = DungeonsGuide.getDungeonsGuide().getSkyblockStatus().getContext();
- if (dungeonContext == null) {
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §cCouldn't find dungeon to save!"));
- return;
- }
- DungeonEventHolder dungeonEventHolder = new DungeonEventHolder();
- dungeonEventHolder.setDate(dungeonContext.getInit());
- dungeonEventHolder.setPlayers(dungeonContext.getPlayers());
- dungeonEventHolder.setEventDataList(dungeonContext.getEvents());
-
-
- ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(runFile));
- oos.writeObject(dungeonEventHolder);
- oos.flush();
- oos.close();
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §fSuccessfully saved dungeon run to " + runFile.getAbsolutePath()));
- } catch (Exception e) {
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §cAn error occured while writing rundata " + e.getMessage()));
- e.printStackTrace();
- }
- } else if (args[0].equals("pv")) {
- try {
- 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 FeatureViewPlayerStatsOnJoin.HoverEventRenderPlayer(a.orElse(null))))));
- });
- } catch (Exception e) {
- e.printStackTrace();
- }
- } else if (args[0].equals("purge")) {
- ApiFetcher.purgeCache();
- CosmeticsManager cosmeticsManager = DungeonsGuide.getDungeonsGuide().getCosmeticsManager();
- cosmeticsManager.requestPerms();
- cosmeticsManager.requestCosmeticsList();
- cosmeticsManager.requestActiveCosmetics();
- StaticResourceCache.INSTANCE.purgeCache();
- FeatureRegistry.DISCORD_ASKTOJOIN.imageMap.clear();
- FeatureRegistry.DISCORD_ASKTOJOIN.futureMap.clear();
-
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §fSuccessfully purged API Cache!"));
- } else if (args[0].equals("pbroadcast")) {
- try {
- String[] payload = new String[args.length - 1];
- System.arraycopy(args, 1, payload, 0, payload.length);
- String actualPayload = String.join(" ", payload).replace("$C$", "§");
- DungeonsGuide.getDungeonsGuide().getStompConnection().send(new StompPayload().header("destination", "/app/party.broadcast").payload(
- new JSONObject().put("partyID", PartyManager.INSTANCE.getPartyContext().getPartyID())
- .put("payload", actualPayload).toString()
- ));
- } catch (Exception e) {
- e.printStackTrace();
- }
- } else if (args[0].equals("requeststaticresource")) {
- UUID uid = UUID.fromString(args[1]);
- StaticResourceCache.INSTANCE.getResource(uid).thenAccept(a -> {
- sender.addChatMessage(new ChatComponentText(a.getResourceID() + ": " + a.getValue() + ": " + a.isExists()));
- });
- } else if (args[0].equals("createFakeRoom") && Minecraft.getMinecraft().getSession().getPlayerID().replace("-", "").equals("e686fe0aab804a71ac7011dc8c2b534c")) {
-
- // load schematic
- File f = new File(DungeonsGuide.getDungeonsGuide().getConfigDir(), "schematics/new roonm-b2df250c-4af2-4201-963c-0ee1cb6bd3de-5efb1f0c-c05f-4064-bde7-cad0874fdf39.schematic");
- NBTTagCompound compound;
- try {
- compound = CompressedStreamTools.readCompressed(new FileInputStream(f));
- } catch (IOException e) {
- e.printStackTrace();
- return;
- }
-
- byte[] blocks = compound.getByteArray("Blocks");
- byte[] meta = compound.getByteArray("Data");
- for (int x = 0; x < compound.getShort("Width"); x++) {
- for (int y = 0; y < compound.getShort("Height"); y++) {
- for (int z = 0; z < compound.getShort("Length"); z++) {
- int index = x + (y * compound.getShort("Length") + z) * compound.getShort("Width");
- BlockPos pos = new BlockPos(x, y, z);
- World w = MinecraftServer.getServer().getEntityWorld();
- w.setBlockState(pos, Block.getBlockById(blocks[index] & 0xFF).getStateFromMeta(meta[index] & 0xFF), 2);
- }
- }
- }
-
-
- DungeonSpecificDataProviderRegistry.doorFinders.put(Pattern.compile("TEST DG"), new DungeonSpecificDataProvider() {
- @Override
- public BlockPos findDoor(World w, String dungeonName) {
- return new BlockPos(0, 0, 0);
- }
-
- @Override
- public Vector2d findDoorOffset(World w, String dungeonName) {
- return null;
- }
-
- @Override
- public BossfightProcessor createBossfightProcessor(World w, String dungeonName) {
- return null;
- }
-
- @Override
- public boolean isTrapSpawn(String dungeonName) {
- return false;
- }
-
- @Override
- public double secretPercentage(String dungeonName) {
- return 0;
- }
-
- @Override
- public int speedSecond(String dungeonName) {
- return 0;
- }
- });
- SkyblockStatus skyblockStatus = DungeonsGuide.getDungeonsGuide().getSkyblockStatus();
- skyblockStatus.setDungeonName("TEST DG");
- DungeonContext fakeContext = new DungeonContext(Minecraft.getMinecraft().theWorld);
- skyblockStatus.setContext(fakeContext);
- skyblockStatus.setForceIsOnDungeon(true);
- MapProcessor mapProcessor = fakeContext.getMapProcessor();
- mapProcessor.setUnitRoomDimension(new Dimension(16, 16));
- mapProcessor.setBugged(false);
- mapProcessor.setDoorDimension(new Dimension(4, 4));
- mapProcessor.setTopLeftMapPoint(new Point(0, 0));
- fakeContext.setDungeonMin(new BlockPos(0, 70, 0));
-
- DungeonRoom dungeonRoom = new DungeonRoom(Arrays.asList(new Point(0, 0)), ShortUtils.topLeftifyInt((short) 1), (byte) 63, new BlockPos(0, 70, 0), new BlockPos(31, 70, 31), fakeContext, Collections.emptySet());
-
- fakeContext.getDungeonRoomList().add(dungeonRoom);
- for (Point p : Arrays.asList(new Point(0, 0))) {
- fakeContext.getRoomMapper().put(p, dungeonRoom);
- }
-
- EditingContext.createEditingContext(dungeonRoom);
- EditingContext.getEditingContext().openGui(new GuiDungeonRoomEdit(dungeonRoom));
- } else if (args[0].equals("CloseContext")) {
- DungeonsGuide.getDungeonsGuide().getSkyblockStatus().setForceIsOnDungeon(false);
- DungeonsGuide.getDungeonsGuide().getSkyblockStatus().setContext(null);
- } else if (args[0].equals("dumpsettings")) {
- NestedCategory root = new NestedCategory("ROOT");
- for (AbstractFeature abstractFeature : FeatureRegistry.getFeatureList()) {
- String category = abstractFeature.getCategory();
- NestedCategory currentRoot = root;
- for (String s : category.split("\\.")) {
- NestedCategory finalCurrentRoot = currentRoot;
- if (currentRoot.children().containsKey(s))
- currentRoot = currentRoot.children().get(s);
- else {
- currentRoot.child(currentRoot = new NestedCategory(finalCurrentRoot.categoryFull() + "." + s));
- }
- }
- }
-
- StringBuilder stringBuilder = new StringBuilder();
- StringBuilder stringBuilder2 = new StringBuilder();
-
- Stack> stak = new Stack<>();
- stak.push(new Tuple<>(root, 0));
- Set discovered = new HashSet<>();
- while (!stak.isEmpty()) {
- Tuple n = stak.pop();
- if (discovered.contains(n.getFirst())) continue;
- discovered.add(n.getFirst());
- for (Map.Entry stringNestedCategoryEntry : n.getFirst().children().entrySet()) {
- stak.push(new Tuple<>(stringNestedCategoryEntry.getValue(), n.getSecond() + 1));
- }
-
- if (n.getFirst().categoryFull().equals("ROOT")) continue;
-
- String prefix = "";
- for (int i = 0; i < n.getSecond() - 1; i++) {
- prefix += " ";
- }
-
- List abstractFeatureList = FeatureRegistry.getFeaturesByCategory().getOrDefault(n.getFirst().categoryFull().substring(5), Collections.emptyList());
- stringBuilder.append(prefix).append("- C ").append(n.getFirst().categoryFull()).append("\n");
- stringBuilder2.append(n.getFirst().categoryFull()).append("\n");
- for (AbstractFeature abstractFeature : abstractFeatureList) {
- stringBuilder.append(prefix).append(" - F ").append(abstractFeature.getName()).append(" / ").append(abstractFeature.getDescription().replace("\n", "$NEW_LINE$")).append("\n");
- }
- }
- System.out.println(stringBuilder.toString());
- System.out.println(stringBuilder2.toString());
- } else if (args[0].equals("readMap")) {
- try {
- int fromX = Integer.parseInt(args[1]);
- int fromY = Integer.parseInt(args[2]);
- sender.addChatMessage(new ChatComponentText(MapUtils.readDigit(MapUtils.getColors(), fromX, fromY)+"-"));
-// int cntY = Integer.parseInt(args[3]);
-// int target = Integer.parseInt(args[4]);
-// StringBuilder sb = new StringBuilder("{");
-// for (int y = fromY; y < fromY + cntY; y++) {
-// int curr = 0;
-// for (int x = fromX; x < fromX+8; x++) {
-// byte clr = MapUtils.getMapColorAt(MapUtils.getColors(), x,y);
-// if (clr == target) curr = (curr << 1) | 1;
-// else curr <<= 1;
-// }
-// sb.append("0x").append(Integer.toHexString(curr).toUpperCase());
-// if (y != fromY + cntY - 1) sb.append(", ");
-// }
-// sb.append("}");
-// System.out.println("\n"+sb.toString());
- } catch (Exception e) {
- e.printStackTrace();
- }
- } else {
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e/dg §7-§fOpens configuration gui"));
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e/dg gui §7-§fOpens configuration gui"));
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e/dg help §7-§fShows command help"));
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e/dg saverooms §7-§f Saves usergenerated dungeon roomdata."));
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e/dg loadrooms §7-§f Reloads dungeon roomdata."));
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e/dg reloadah §7-§f Reloads price data from server."));
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e/dg brand §7-§f View server brand."));
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e/dg reparty §7-§f Reparty."));
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e/dg info §7-§f View Current DG User info."));
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e/dg asktojoin or /dg atj §7-§f Toggle ask to join §cRequires Discord Rich Presence enabled. (/dg -> Advanced)"));
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e/dg partymax [number] or /dg pm [number] §7-§f Sets partymax §7(maximum amount people in party, for discord rpc)"));
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e/dg pv [ign] §7-§f Profile Viewer"));
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e/dg pvall §7-§f Profile Viewer For all people on party"));
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e/dg purge §7-§f Purge api cache."));
- sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e/dg saverun §7-§f Save run to be sent to developer."));
- }
- }
-
- private boolean openConfig = false;
-
- @SubscribeEvent
- public void onTick(TickEvent.ClientTickEvent e) {
- try {
- if (openConfig && e.phase == TickEvent.Phase.START ) {
- openConfig = false;
- Minecraft.getMinecraft().displayGuiScreen(new GuiConfigV2());
- }
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
-
- @Override
- public int getRequiredPermissionLevel() {
- return 0;
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/commands/CommandReparty.java b/src/main/java/kr/syeyoung/dungeonsguide/commands/CommandReparty.java
deleted file mode 100644
index 8df85529..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/commands/CommandReparty.java
+++ /dev/null
@@ -1,110 +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.commands;
-
-import kr.syeyoung.dungeonsguide.chat.ChatProcessor;
-import kr.syeyoung.dungeonsguide.chat.PartyManager;
-import kr.syeyoung.dungeonsguide.features.FeatureRegistry;
-import kr.syeyoung.dungeonsguide.utils.TextUtils;
-import net.minecraft.client.Minecraft;
-import net.minecraft.command.CommandBase;
-import net.minecraft.command.ICommandSender;
-import net.minecraft.util.ChatComponentText;
-import net.minecraftforge.client.event.ClientChatReceivedEvent;
-import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
-import net.minecraftforge.fml.common.gameevent.TickEvent;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-public class CommandReparty extends CommandBase {
- private String command;
- public CommandReparty() {
- command = FeatureRegistry.ETC_REPARTY.getParameter("command").getValue();
- command = command.replace(" ", "");
- }
-
- @Override
- public String getCommandName() {
- return command;
- }
-
- @Override
- public String getCommandUsage(ICommandSender sender) {
- return command;
- }
-
- @Override
- public void processCommand(ICommandSender sender, String[] args) {
- if (!requestReparty(false)) {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §cCurrently Repartying"));
- }
- }
-
- private boolean reparting = false;
-
-
- public boolean requestReparty(boolean noerror) {
- if (reparting) {
- return false;
- }
- reparting = true;
-
- PartyManager.INSTANCE.requestPartyList(pc -> {
- if (pc == null) {
- if (!noerror)
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §cNot in Party"));
- reparting = false;
- return;
- }
- if (!pc.hasLeader(Minecraft.getMinecraft().getSession().getUsername())) {
- if (!noerror)
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §cYou're not leader"));
- reparting = false;
- return;
- }
- if (pc.isSelfSolo()) {
- if (!noerror)
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §cYou can not reparty yourself"));
- reparting = false;
- return;
- }
- String members = pc.getPartyRawMembers().stream().filter(a -> !a.equalsIgnoreCase(Minecraft.getMinecraft().getSession().getUsername())).collect(Collectors.joining(" "));
- String command = "/p invite "+members;
-
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §eDisbanding Party..."));
- ChatProcessor.INSTANCE.addToChatQueue("/p disband", () -> {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §eRunning invite command §f"+command));
- ChatProcessor.INSTANCE.addToChatQueue(command, () -> {
- Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §eSuccessfully repartied!§f"));
-
- reparting = false;
- }, false);
- }, false);
- });
- return true;
- }
-
- @Override
- public int getRequiredPermissionLevel() {
- return 0;
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/config/Config.java b/src/main/java/kr/syeyoung/dungeonsguide/config/Config.java
deleted file mode 100644
index f8d60424..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/config/Config.java
+++ /dev/null
@@ -1,65 +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.config;
-
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
-import kr.syeyoung.dungeonsguide.features.AbstractFeature;
-import kr.syeyoung.dungeonsguide.features.FeatureRegistry;
-
-import java.io.*;
-
-public class Config {
- public static JsonObject configuration;
-
- public static File f;
-
- public static void loadConfig(File f) throws IOException {
- try {
- configuration = (JsonObject) new JsonParser().parse(new InputStreamReader(new FileInputStream(Config.f = f == null ? Config.f : f)));
- } catch (Exception e) {
- configuration = new JsonObject();
- }
- for (AbstractFeature feature : FeatureRegistry.getFeatureList()) {
- JsonObject object = configuration.getAsJsonObject(feature.getKey());
- if (object != null) feature.loadConfig(object);
- }
-
- saveConfig();
- }
-
- public static void saveConfig() throws IOException {
- for (AbstractFeature feature : FeatureRegistry.getFeatureList()) {
- JsonObject object = feature.saveConfig();
- configuration.add(feature.getKey(), object);
- }
-
- String str = new Gson().toJson(configuration);
- FileOutputStream fos = null;
- try {
- fos = new FileOutputStream(f);
- BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(fos));
- bos.write(str);
- bos.flush();
- } finally {
- fos.close();
- }
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/ConfigPanelCreator.java b/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/ConfigPanelCreator.java
deleted file mode 100644
index d02680bf..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/ConfigPanelCreator.java
+++ /dev/null
@@ -1,40 +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.config.guiconfig;
-
-import com.google.common.base.Function;
-import com.google.common.base.Supplier;
-import kr.syeyoung.dungeonsguide.gui.MPanel;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class ConfigPanelCreator implements Function {
- public static final ConfigPanelCreator INSTANCE = new ConfigPanelCreator();
-
- public static final Map> map = new HashMap>();
-
- @Nullable
- @Override
- public MPanel apply(@Nullable String input) {
- if (!map.containsKey(input)) return null;
- return map.get(input).get();
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/GuiConfigV2.java b/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/GuiConfigV2.java
deleted file mode 100644
index d1888283..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/GuiConfigV2.java
+++ /dev/null
@@ -1,59 +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.config.guiconfig;
-
-import kr.syeyoung.dungeonsguide.gui.MGui;
-import lombok.Getter;
-import net.minecraft.client.Minecraft;
-import net.minecraft.util.MathHelper;
-
-import java.awt.*;
-
-public class GuiConfigV2 extends MGui {
-
- @Getter
- private RootConfigPanel rootConfigPanel;
-
- public GuiConfigV2() {
- rootConfigPanel = new RootConfigPanel(this);
- getMainPanel().add(rootConfigPanel);
- }
-
-
- @Override
- public void initGui() {
- super.initGui();
- int dw = Minecraft.getMinecraft().displayWidth;
- int dh = Minecraft.getMinecraft().displayHeight;
- int width = MathHelper.clamp_int(dw - 200, 1250, 1500), height = MathHelper.clamp_int(dh - 200, 600, 800);
- double scale = 2.0;
- if (dw <= width || dh <= height) {
- width = width/2; height = height/2;
- scale = 1.0;
- }
- rootConfigPanel.setBounds(new Rectangle((dw-width)/2, (dh-height)/2, width,height));
- rootConfigPanel.setScale(scale);
- }
-
- @Override
- public void drawScreen(int mouseX, int mouseY, float partialTicks) {
- super.drawDefaultBackground();
- super.drawScreen(mouseX, mouseY, partialTicks);
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MCategory.java b/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MCategory.java
deleted file mode 100644
index 77111fe7..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MCategory.java
+++ /dev/null
@@ -1,103 +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.config.guiconfig;
-
-import kr.syeyoung.dungeonsguide.features.FeatureRegistry;
-import kr.syeyoung.dungeonsguide.gui.MPanel;
-import kr.syeyoung.dungeonsguide.utils.RenderUtils;
-import kr.syeyoung.dungeonsguide.utils.cursor.EnumCursor;
-import lombok.Getter;
-import lombok.Setter;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.audio.PositionedSoundRecord;
-import net.minecraft.client.gui.FontRenderer;
-import net.minecraft.client.gui.Gui;
-import net.minecraft.client.renderer.GlStateManager;
-import net.minecraft.util.ResourceLocation;
-import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL14;
-
-import java.awt.*;
-
-public class MCategory extends MPanel {
-
- private NestedCategory nestedCategory;
- private RootConfigPanel rootConfigPanel;
- @Getter
- @Setter
- private Color hover = new Color(94, 94, 94, 255);
- public MCategory(NestedCategory nestedCategory, RootConfigPanel rootConfigPanel) {
- this.nestedCategory = nestedCategory;
- this.rootConfigPanel = rootConfigPanel;
- }
-
- @Override
- public void render(int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks, Rectangle scissor) {
- int border = RenderUtils.blendAlpha(0x141414, 0.12f);
- if (!rootConfigPanel.getSearchWord().isEmpty() && (nestedCategory.categoryName().toLowerCase().contains(rootConfigPanel.getSearchWord()))) {
- border = 0xFF02EE67;
- }
-
- Gui.drawRect(0,0,getBounds().width, getBounds().height,border);
- if (getBounds().height >= 28)
- Gui.drawRect(1,18,getBounds().width -1, getBounds().height-1, RenderUtils.blendAlpha(0x141414, 0.15f));
- Gui.drawRect(1,1,getBounds().width-1, 18, RenderUtils.blendAlpha(0x141414, 0.12f));
-
-
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- GlStateManager.pushMatrix();
- GlStateManager.translate(5,5,0);
- GlStateManager.scale(1.0,1.0,0);
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
-
- fr.drawString((lastAbsClip.contains(absMousex, absMousey) ? "§n" : "") + nestedCategory.categoryName(), 0,0, 0xFFFFFFFF);
- GlStateManager.popMatrix();
-
- fr.drawSplitString(FeatureRegistry.getCategoryDescription().getOrDefault(nestedCategory.categoryFull(), ""), 5, 23, getBounds().width -10, 0xFFBFBFBF);
- }
-
-
- @Override
- public Dimension getPreferredSize() {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
-
- int descriptionHeight =
- FeatureRegistry.getCategoryDescription().containsKey(nestedCategory.categoryFull()) ?
- fr.listFormattedStringToWidth(FeatureRegistry.getCategoryDescription().get(nestedCategory.categoryFull()), Math.max(100, getBounds().width - 10)).size() * fr.FONT_HEIGHT
- : -9;
-
- return new Dimension(100, descriptionHeight + 28);
- }
-
- @Override
- public void mouseClicked(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int mouseButton) {
- if (lastAbsClip.contains(absMouseX, absMouseY)) {
- Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(new ResourceLocation("gui.button.press"), 1.0F));
- rootConfigPanel.setCurrentPageAndPushHistory(nestedCategory.categoryFull());
- }
- }
-
- @Override
- public void mouseMoved(int absMouseX, int absMouseY, int relMouseX0, int relMouseY0) {
- if (lastAbsClip.contains(absMouseX, absMouseY))
- setCursor(EnumCursor.POINTING_HAND);
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MCategoryElement.java b/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MCategoryElement.java
deleted file mode 100644
index 22934fca..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MCategoryElement.java
+++ /dev/null
@@ -1,82 +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.config.guiconfig;
-
-import kr.syeyoung.dungeonsguide.gui.MPanel;
-import kr.syeyoung.dungeonsguide.utils.RenderUtils;
-import kr.syeyoung.dungeonsguide.utils.cursor.EnumCursor;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.audio.PositionedSoundRecord;
-import net.minecraft.client.gui.FontRenderer;
-import net.minecraft.client.gui.Gui;
-import net.minecraft.util.ResourceLocation;
-
-import java.awt.*;
-
-public class MCategoryElement extends MPanel {
- private String category;
- private Runnable onClick;
- private int leftPad = 0;
- private int offsetX;
- private RootConfigPanel rootConfigPanel;
- public MCategoryElement(String category, Runnable onClick, int leftPad, int offsetX, RootConfigPanel rooot) {
- this.category = category;
- this.onClick = onClick;
- this.leftPad = leftPad;
- this.offsetX = offsetX;
- this.rootConfigPanel = rooot;
- }
-
- @Override
- public void render(int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks, Rectangle scissor) {
- if (rootConfigPanel.getCurrentPage().equals(category)) {
- clip(0,scissor.y, Minecraft.getMinecraft().displayWidth, scissor.height);
- Gui.drawRect(leftPad - offsetX, 0, getBounds().width, getBounds().height, RenderUtils.blendAlpha(0x141414, 0.13f));
- } else if (lastAbsClip.contains(absMousex, absMousey) && getTooltipsOpen() == 0) {
- clip(0,scissor.y, Minecraft.getMinecraft().displayWidth, scissor.height);
- Gui.drawRect(leftPad - offsetX, 0, getBounds().width, getBounds().height, RenderUtils.blendAlpha(0x141414, 0.09f));
- }
- clip(scissor.x, scissor.y, scissor.width, scissor.height);
-
-
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- String name = category.substring(category.lastIndexOf(".")+1);
- fr.drawString(name, leftPad,2,-1);
-
- }
-
- @Override
- public Dimension getPreferredSize() {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- return new Dimension(fr.getStringWidth(category.substring(category.lastIndexOf(".")+1)) + leftPad+10, fr.FONT_HEIGHT+4);
- }
-
- @Override
- public void mouseClicked(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int mouseButton) {
- if (!lastAbsClip.contains(absMouseX, absMouseY) || getTooltipsOpen() > 0) { return; }
- if (onClick != null) onClick.run();
- Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create(new ResourceLocation("gui.button.press"), 1.0F));
-
- }
- @Override
- public void mouseMoved(int absMouseX, int absMouseY, int relMouseX0, int relMouseY0) {
- if (lastAbsClip.contains(absMouseX, absMouseY))
- setCursor(EnumCursor.POINTING_HAND);
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MFeature.java b/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MFeature.java
deleted file mode 100644
index 49f637a5..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MFeature.java
+++ /dev/null
@@ -1,154 +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.config.guiconfig;
-
-import kr.syeyoung.dungeonsguide.config.guiconfig.location.GuiGuiLocationConfig;
-import kr.syeyoung.dungeonsguide.features.AbstractFeature;
-import kr.syeyoung.dungeonsguide.features.GuiFeature;
-import kr.syeyoung.dungeonsguide.gui.MPanel;
-import kr.syeyoung.dungeonsguide.gui.elements.MButton;
-import kr.syeyoung.dungeonsguide.gui.elements.MToggleButton;
-import kr.syeyoung.dungeonsguide.utils.RenderUtils;
-import lombok.Getter;
-import lombok.Setter;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.FontRenderer;
-import net.minecraft.client.gui.Gui;
-import net.minecraft.client.renderer.GlStateManager;
-import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL14;
-
-import java.awt.*;
-import java.util.ArrayList;
-import java.util.List;
-
-public class MFeature extends MPanel {
-
- @Getter
- private final AbstractFeature feature;
-
- private final List addons = new ArrayList();
-
- @Getter @Setter
- private Color hover;
-
- private final RootConfigPanel panel;
-
- public MFeature(final AbstractFeature abstractFeature, final RootConfigPanel panel) {
- this.panel = panel;
- this.feature = abstractFeature;
-
- if (abstractFeature.isDisyllable()) {
- final MToggleButton mStringSelectionButton = new MToggleButton();
- mStringSelectionButton.setOnToggle(new Runnable() {
- @Override
- public void run() {
- boolean selected = mStringSelectionButton.isEnabled();
- feature.setEnabled(selected);
- }
- });
- mStringSelectionButton.setBackground(RenderUtils.blendAlpha(0x141414, 0.07f));
- addons.add(mStringSelectionButton);
- mStringSelectionButton.setEnabled(feature.isEnabled());
- mStringSelectionButton.setSize(new Dimension(40, 15));
- add(mStringSelectionButton);
- }
- if (abstractFeature.getParameters().size() != 0) {
- MButton button = new MButton();
- button.setText("Settings");
- button.setOnActionPerformed(new Runnable() {
- @Override
- public void run() {
- panel.setCurrentPageAndPushHistory(abstractFeature.getEditRoute(panel));
- }
- });
- button.setBackground(RenderUtils.blendAlpha(0x141414, 0.07f));
- button.setClicked(RenderUtils.blendAlpha(0x141414, 0.17f));
- button.setHover(RenderUtils.blendAlpha(0x141414, 0.17f));
- addons.add(button);
- button.setSize(new Dimension(50, 15));
- add(button);
- }
- if (abstractFeature instanceof GuiFeature) {
- MButton button = new MButton();
- button.setText("Relocate");
- button.setOnActionPerformed(new Runnable() {
- @Override
- public void run() {
- Minecraft.getMinecraft().displayGuiScreen(new GuiGuiLocationConfig(Minecraft.getMinecraft().currentScreen, abstractFeature));
- button.setIsclicked(false);
- }
- });
- button.setBackground(RenderUtils.blendAlpha(0x141414, 0.07f));
- button.setClicked(RenderUtils.blendAlpha(0x141414, 0.17f));
- button.setHover(RenderUtils.blendAlpha(0x141414, 0.17f));
- addons.add(button);
- button.setSize(new Dimension(75, 15));
- add(button);
- }
- }
-
- @Override
- public void render(int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks, Rectangle scissor) {
-
- int border = RenderUtils.blendAlpha(0x141414, 0.12f);
- if (!panel.getSearchWord().isEmpty() && (feature.getName().toLowerCase().contains(panel.getSearchWord()) || feature.getDescription().toLowerCase().contains(panel.getSearchWord()))) {
- border = 0xFF02EE67;
- }
-
- Gui.drawRect(0,0,getBounds().width, getBounds().height,border);
- Gui.drawRect(1,18,getBounds().width -1, getBounds().height-1, RenderUtils.blendAlpha(0x141414, 0.15f));
- Gui.drawRect(1,1,getBounds().width-1, 18, RenderUtils.blendAlpha(0x141414, 0.12f));
-
-
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- GlStateManager.pushMatrix();
- GlStateManager.translate(5,5,0);
- GlStateManager.scale(1.0,1.0,0);
- GlStateManager.enableBlend();
- GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- fr.drawString(feature.getName(), 0,0, 0xFFFFFFFF);
- GlStateManager.popMatrix();
-
- fr.drawSplitString(feature.getDescription(), 5, 23, getBounds().width -10, 0xFFBFBFBF);
- }
-
- @Override
- public void resize(int parentWidth, int parentHeight) {
- this.setSize(new Dimension(parentWidth, getBounds().height));
- }
-
- @Override
- public Dimension getPreferredSize() {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- int descriptionHeight = fr.listFormattedStringToWidth(feature.getDescription(), Math.max(100, getBounds().width - 10)).size() * fr.FONT_HEIGHT;
-
- return new Dimension(100, descriptionHeight + 28);
- }
-
- @Override
- public void onBoundsUpdate() {
- int x = getBounds().width - 5;
- for (MPanel panel : addons) {
- panel.setBounds(new Rectangle(x - panel.getPreferredSize().width, 3, panel.getPreferredSize().width, 12));
- x -= panel.getPreferredSize().width + 5;
- }
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MFeatureEdit.java b/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MFeatureEdit.java
deleted file mode 100644
index f2ee35bc..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MFeatureEdit.java
+++ /dev/null
@@ -1,113 +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.config.guiconfig;
-
-import kr.syeyoung.dungeonsguide.features.AbstractFeature;
-import kr.syeyoung.dungeonsguide.features.FeatureParameter;
-import kr.syeyoung.dungeonsguide.gui.MPanel;
-import kr.syeyoung.dungeonsguide.gui.elements.MButton;
-import kr.syeyoung.dungeonsguide.gui.elements.MList;
-import kr.syeyoung.dungeonsguide.gui.elements.MModalConfirmation;
-
-import java.awt.*;
-import java.util.HashMap;
-import java.util.Map;
-
-public class MFeatureEdit extends MPanel {
- private MList list;
- private MButton goBack, resetToDefault;
- private RootConfigPanel rootConfigPanel;
- private AbstractFeature abstractFeature;
-
- private Map parameterEdits = new HashMap<>();
-
- public MFeatureEdit(AbstractFeature abstractFeature, RootConfigPanel rootConfigPanel) {
- this.abstractFeature = abstractFeature;
- this.rootConfigPanel = rootConfigPanel;
- list = new MList();
- list.setGap(5);
- list.setDrawLine(false);
- add(list);
-
- goBack = new MButton();
- goBack.setText("< Go Back");
- goBack.setOnActionPerformed(rootConfigPanel::goBack);
- add(goBack);
- resetToDefault = new MButton();
- resetToDefault.setText("Reset To Default");
- resetToDefault.setForeground(Color.red);
- resetToDefault.setOnActionPerformed(() -> {
- openResetConfirmation();
- });
- add(resetToDefault);
- }
-
- public void openResetConfirmation() {
- MModalConfirmation mModal = new MModalConfirmation("Are you sure?",
- "Resetting to default will reset your configuration for the selected feature to default",
- () -> {
- for (FeatureParameter parameter : abstractFeature.getParameters()) {
- parameter.setToDefault();
- }
- abstractFeature.onParameterReset();
- rootConfigPanel.invalidatePage(abstractFeature.getEditRoute(rootConfigPanel));
- }, () -> {});
- mModal.setScale(getScale());
- mModal.getYes().setBorder(0xFFFF0000);
- mModal.getYes().setText("Yes, Reset it");
- mModal.getNo().setText("Cancel");
- mModal.open(MFeatureEdit.this);
- }
-
- public void addParameterEdit(String name, MPanel paramEdit) {
- parameterEdits.put(name, paramEdit);
- list.add(paramEdit);
- }
- public MPanel removeParameterEdit(String name) {
- MPanel panel = parameterEdits.remove(name);
- list.remove(panel);
- return panel;
- }
-
- @Override
- public void resize(int parentWidth, int parentHeight) {
- super.resize(parentWidth, parentHeight);
- setBounds(new Rectangle(0,0,parentWidth,parentHeight));
- Dimension prefSize = getPreferredSize();
- int hei = prefSize.height;
- setBounds(new Rectangle(0,0,parentWidth,hei));
- }
-
- @Override
- public void setBounds(Rectangle bounds) {
- super.setBounds(bounds);
- goBack.setBounds(new Rectangle(5,5,75,15));
- resetToDefault.setBounds(new Rectangle(bounds.width - 105, 5, 100, 15));
-
- list.setBounds(new Rectangle(5,25,bounds.width - 10, bounds.height - 10));
- list.realignChildren();
-
- }
-
- @Override
- public Dimension getPreferredSize() {
- Dimension listPref = list.getPreferredSize();
- return new Dimension(listPref.width + 10, listPref.height + 30);
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MNotFound.java b/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MNotFound.java
deleted file mode 100644
index ef885487..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MNotFound.java
+++ /dev/null
@@ -1,40 +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.config.guiconfig;
-
-import kr.syeyoung.dungeonsguide.gui.MPanel;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.FontRenderer;
-import net.minecraft.client.gui.Gui;
-import org.lwjgl.opengl.GL11;
-
-import java.awt.*;
-
-public class MNotFound extends MPanel {
- @Override
- public void resize(int parentWidth, int parentHeight) {
- setBounds(new Rectangle(0,0,parentWidth,parentHeight));
- }
-
- @Override
- public void render(int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks, Rectangle scissor) {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- fr.drawString("404 Not Found", (getBounds().width - fr.getStringWidth("404 Not Found")) / 2, (getBounds().height - fr.FONT_HEIGHT) / 2, -1);
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MPanelCategory.java b/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MPanelCategory.java
deleted file mode 100644
index e2388c60..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MPanelCategory.java
+++ /dev/null
@@ -1,83 +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.config.guiconfig;
-
-import kr.syeyoung.dungeonsguide.features.AbstractFeature;
-import kr.syeyoung.dungeonsguide.features.FeatureRegistry;
-import kr.syeyoung.dungeonsguide.gui.MPanel;
-import kr.syeyoung.dungeonsguide.gui.elements.MList;
-
-import java.awt.*;
-
-public class MPanelCategory extends MPanel {
-
- private NestedCategory key;
- private RootConfigPanel rootConfigPanel;
-
- private MList list;
-
- public MPanelCategory(NestedCategory nestedCategory, RootConfigPanel rootConfigPanel) {
- this.key = nestedCategory;
- this.rootConfigPanel = rootConfigPanel;
-
- list = new MList();
- list.setDrawLine(false);
- list.setGap(5);
- add(list);
-
- for (NestedCategory value : nestedCategory.children().values()) {
- list.add(new MCategory(value, rootConfigPanel));
- }
- if (nestedCategory.parent() != null) {
- String actualCategory = nestedCategory.categoryFull().substring(5);
- if (FeatureRegistry.getFeaturesByCategory().containsKey(actualCategory))
- for (AbstractFeature abstractFeature : FeatureRegistry.getFeaturesByCategory().get(actualCategory)) {
- MFeature mFeature = new MFeature(abstractFeature, rootConfigPanel);
- list.add(mFeature);
- mFeature.setHover(new Color(94, 94, 94, 255));
- }
- }
- list.realignChildren();
-
- }
-
- @Override
- public void resize(int parentWidth, int parentHeight) {
- super.resize(parentWidth, parentHeight);
- setBounds(new Rectangle(0,0,parentWidth,parentHeight));
- Dimension prefSize = getPreferredSize();
- int hei = prefSize.height;
- setBounds(new Rectangle(0,0,parentWidth,hei));
- }
-
- @Override
- public void setBounds(Rectangle bounds) {
- super.setBounds(bounds);
- list.setBounds(new Rectangle(5,5,bounds.width- 10, bounds.height - 10));
- list.realignChildren();
- }
-
- @Override
- public Dimension getPreferredSize() {
- Dimension prefSize = list.getPreferredSize();
- int wid = prefSize.width + 10;
- int hei = prefSize.height + 10;
- return new Dimension(wid, hei);
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MParameterEdit.java b/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MParameterEdit.java
deleted file mode 100644
index 6f791bcf..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/MParameterEdit.java
+++ /dev/null
@@ -1,220 +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.config.guiconfig;
-
-import com.google.common.base.Predicates;
-import kr.syeyoung.dungeonsguide.config.types.AColor;
-import kr.syeyoung.dungeonsguide.features.AbstractFeature;
-import kr.syeyoung.dungeonsguide.features.FeatureParameter;
-import kr.syeyoung.dungeonsguide.gui.MPanel;
-import kr.syeyoung.dungeonsguide.gui.elements.*;
-import kr.syeyoung.dungeonsguide.utils.RenderUtils;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.FontRenderer;
-import net.minecraft.client.gui.Gui;
-
-import java.awt.*;
-import java.util.function.Predicate;
-
-public class MParameterEdit extends MPanel {
- private AbstractFeature abstractFeature;
- private FeatureParameter featureParameter;
- private RootConfigPanel rootConfigPanel;
- private MPanel valueEditHolder;
- private MPanel valueEdit;
-
- private Predicate isDisabled ;
-
- public MParameterEdit(AbstractFeature abstractFeature, FeatureParameter parameter, RootConfigPanel rootConfigPanel) {
- this(abstractFeature, parameter, rootConfigPanel, (a) -> false);
- }
-
- public MParameterEdit(AbstractFeature abstractFeature, FeatureParameter parameter, RootConfigPanel rootConfigPanel, Predicate isDisabled ) {
- this.abstractFeature = abstractFeature;
- this.featureParameter = parameter;
- this.rootConfigPanel = rootConfigPanel;
- this.isDisabled = isDisabled;
-
- if (parameter.getValue_type().equals("string")) {
- valueEdit = new MTextField() {
- @Override
- public void edit(String str) {
- parameter.setValue(str);
- }
- };
- ((MTextField)valueEdit).setText((String) parameter.getValue());
- } else if (parameter.getValue_type().equals("integer")) {
- valueEdit = new MIntegerSelectionButton((Integer) parameter.getValue());
- ((MIntegerSelectionButton)valueEdit).setOnUpdate(() -> {
- parameter.setValue(((MIntegerSelectionButton) valueEdit).getData());
- });
- } else if (parameter.getValue_type().equals("float")) {
- valueEdit = new MFloatSelectionButton((Float) parameter.getValue());
- ((MFloatSelectionButton)valueEdit).setOnUpdate(() -> {
- parameter.setValue(((MFloatSelectionButton) valueEdit).getData());
- });
- } else if (parameter.getValue_type().equals("acolor")) {
- valueEdit = new MEditableAColor();
- ((MEditableAColor)valueEdit).setColor((AColor) parameter.getValue());
- ((MEditableAColor)valueEdit).setEnableEdit(true);
- ((MEditableAColor)valueEdit).setOnUpdate(() -> {
- parameter.setValue(((MEditableAColor) valueEdit).getColor());
- });
- } else if (parameter.getValue_type().equals("color")) {
- valueEdit = new MEditableAColor();
- ((MEditableAColor)valueEdit).setColor(new AColor(((Color) parameter.getValue()).getRGB(), true));
- ((MEditableAColor)valueEdit).setEnableEdit(true);
- ((MEditableAColor)valueEdit).setOnUpdate(() -> {
- parameter.setValue(((MEditableAColor) valueEdit).getColor());
- });
- } else if (parameter.getValue_type().equals("boolean")) {
- valueEdit = new MToggleButton();
- ((MToggleButton)valueEdit).setEnabled((Boolean) parameter.getValue());
- ((MToggleButton)valueEdit).setOnToggle(() -> {
- parameter.setValue(((MToggleButton) valueEdit).isEnabled());
- });
- } else if (parameter.getValue_type().equals("keybind")) {
- valueEdit = new MKeyEditButton();
- ((MKeyEditButton)valueEdit).setKey((Integer) parameter.getValue());
- ((MKeyEditButton)valueEdit).setOnKeyEdit(() -> {
- parameter.setValue(((MKeyEditButton) valueEdit).getKey());
- });
- ((MKeyEditButton)valueEdit).setBorder(RenderUtils.blendTwoColors(0xFF141414,0x7702EE67));
- }else {
- valueEdit = new MLabel();
- ((MLabel)valueEdit).setText("????");
- }
-
-
- valueEditHolder = new MPanel() {
- @Override
- public void setBounds(Rectangle bounds) {
- super.setBounds(bounds);
- Dimension dimension = valueEdit.getPreferredSize();
- if (dimension.width <= 0) dimension.width = bounds.width/2;
- if (dimension.height <= 0) dimension.height = bounds.height/2;
- valueEdit.setBounds(new Rectangle((bounds.width - dimension.width)/2,(bounds.height - dimension.height)/2,dimension.width, dimension.height));
- }
- };
- add(valueEditHolder);
- valueEditHolder.add(valueEdit);
- }
- public MParameterEdit(AbstractFeature abstractFeature, FeatureParameter parameter, RootConfigPanel rootConfigPanel, MPanel valueEdit, Predicate isDisabled) {
- this.abstractFeature = abstractFeature;
- this.featureParameter = parameter;
- this.rootConfigPanel = rootConfigPanel;
- this.isDisabled = isDisabled;
-
-
- valueEditHolder = new MPanel() {
- @Override
- public void setBounds(Rectangle bounds) {
- super.setBounds(bounds);
- Dimension dimension = valueEdit.getPreferredSize();
- if (dimension.width <= 0) dimension.width = bounds.width/2;
- if (dimension.height <= 0) dimension.height = bounds.height/2;
- valueEdit.setBounds(new Rectangle((bounds.width - dimension.width)/2,(bounds.height - dimension.height)/2,dimension.width, dimension.height));
- }
- };
- add(valueEditHolder);
- valueEditHolder.add(valueEdit);
- }
-
- @Override
- public void render(int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks, Rectangle scissor) {
- Gui.drawRect(0,0,getBounds().width, getBounds().height, RenderUtils.blendAlpha(0x141414, 0.12f));
- Gui.drawRect(2*bounds.width / 3,1,getBounds().width -1, getBounds().height-1, RenderUtils.blendAlpha(0x141414, 0.15f));
- Gui.drawRect(4, 15,2*bounds.width / 3-5, 16, RenderUtils.blendAlpha(0x141414, 0.3f));
-
-
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- fr.drawString(featureParameter.getName(), 5,5, 0xFFFFFFFF);
- fr.drawSplitString(featureParameter.getDescription(), 5,18, 2*bounds.width /3-10, 0xFFAAAAAA);
-
- }
-
- @Override
- public void render0(double scale, Point parentPoint, Rectangle parentClip, int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks) {
- super.render0(scale, parentPoint, parentClip, absMousex, absMousey, relMousex0, relMousey0, partialTicks);
- if (isDisabled.test(featureParameter)) {
- Gui.drawRect(0,0, getBounds().width, getBounds().height, 0x55000000);
- }
- }
-
- @Override
- public Dimension getPreferredSize() {
- FontRenderer fr = Minecraft.getMinecraft().fontRendererObj;
- int descriptionHeight = fr.listFormattedStringToWidth(featureParameter.getDescription(), Math.max(50, 2*bounds.width/3-10)).size() * fr.FONT_HEIGHT;
- return new Dimension(100, Math.max(30, descriptionHeight + 23));
- }
-
- @Override
- public void setBounds(Rectangle bounds) {
- super.setBounds(bounds);
- valueEditHolder.setBounds(new Rectangle(2*bounds.width / 3, 0, bounds.width / 3, bounds.height));
- }
-
- @Override
- public void keyPressed0(char typedChar, int keyCode) {
- if (isDisabled.test(featureParameter)) return;
- super.keyPressed0(typedChar, keyCode);
- }
-
- @Override
- public void keyHeld0(char typedChar, int keyCode) {
- if (isDisabled.test(featureParameter)) return;
- super.keyHeld0(typedChar, keyCode);
- }
-
- @Override
- public void keyReleased0(char typedChar, int keyCode) {
- if (isDisabled.test(featureParameter)) return;
- super.keyReleased0(typedChar, keyCode);
- }
-
- @Override
- public boolean mouseClicked0(int absMouseX, int absMouseY, int relMouseX0, int relMouseY0, int mouseButton) {
- if (isDisabled.test(featureParameter)) return false;
- return super.mouseClicked0(absMouseX, absMouseY, relMouseX0, relMouseY0, mouseButton);
- }
-
- @Override
- public void mouseReleased0(int absMouseX, int absMouseY, int relMouseX0, int relMouseY0, int state) {
- if (isDisabled.test(featureParameter)) return ;
- super.mouseReleased0(absMouseX, absMouseY, relMouseX0, relMouseY0, state);
- }
-
- @Override
- public void mouseClickMove0(int absMouseX, int absMouseY, int relMouseX0, int relMouseY0, int clickedMouseButton, long timeSinceLastClick) {
- if (isDisabled.test(featureParameter)) return ;
- super.mouseClickMove0(absMouseX, absMouseY, relMouseX0, relMouseY0, clickedMouseButton, timeSinceLastClick);
- }
-
- @Override
- public void mouseScrolled0(int absMouseX, int absMouseY, int relMouseX0, int relMouseY0, int scrollAmount) {
- if (isDisabled.test(featureParameter)) return ;
- super.mouseScrolled0(absMouseX, absMouseY, relMouseX0, relMouseY0, scrollAmount);
- }
-
- @Override
- public void mouseMoved0(int absMouseX, int absMouseY, int relMouseX0, int relMouseY0) {
- if (isDisabled.test(featureParameter)) return ;
- super.mouseMoved0(absMouseX, absMouseY, relMouseX0, relMouseY0);
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/NestedCategory.java b/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/NestedCategory.java
deleted file mode 100644
index a4812fb7..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/NestedCategory.java
+++ /dev/null
@@ -1,55 +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.config.guiconfig;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-import lombok.experimental.Accessors;
-
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-@Data
-@Accessors(chain = true, fluent = true)
-public
-class NestedCategory {
- private final String categoryFull;
- @EqualsAndHashCode.Exclude
- private String categoryName;
- @EqualsAndHashCode.Exclude
- @ToString.Exclude
- private NestedCategory parent;
-
- public NestedCategory(String categoryFull) {
- this.categoryFull = categoryFull;
- this.categoryName = categoryFull.substring(categoryFull.lastIndexOf(".") + 1);
- }
-
- @EqualsAndHashCode.Exclude
- @ToString.Exclude
- private Map children = new LinkedHashMap<>();
-
- public NestedCategory child(NestedCategory child) {
- this.children.put(child.categoryName, child);
- child.parent = this;
- return this;
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/RootConfigPanel.java b/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/RootConfigPanel.java
deleted file mode 100644
index 1827d766..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/config/guiconfig/RootConfigPanel.java
+++ /dev/null
@@ -1,305 +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.config.guiconfig;
-
-import com.google.common.base.Function;
-import kr.syeyoung.dungeonsguide.config.guiconfig.location.GuiGuiLocationConfig;
-import kr.syeyoung.dungeonsguide.features.AbstractFeature;
-import kr.syeyoung.dungeonsguide.features.FeatureRegistry;
-import kr.syeyoung.dungeonsguide.gui.MPanel;
-import kr.syeyoung.dungeonsguide.gui.elements.*;
-import kr.syeyoung.dungeonsguide.utils.RenderUtils;
-import lombok.Getter;
-import lombok.Setter;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.FontRenderer;
-import net.minecraft.client.gui.Gui;
-
-import java.awt.*;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.*;
-
-public class RootConfigPanel extends MPanelScaledGUI {
- private MScrollablePanel navigationScroll;
-
- private MList navigation = new MList();
-
- private MScrollablePanel contentScroll;
-
-
- private final Map pages = new HashMap();
- @Getter
- @Setter
- private Function pageGenerator = ConfigPanelCreator.INSTANCE;
- @Getter
- private String currentPage = "";
-
- private GuiConfigV2 gui;
-
- private long lastPageSet = System.currentTimeMillis();
-
- private MTextField search;
- private MButton guiRelocate;
-
- private MButton github, discord;
-
- private final Stack history = new Stack();
-
- public String getSearchWord() {
- return search.getText().trim().toLowerCase();
- }
-
- public RootConfigPanel(GuiConfigV2 guiConfigV2) {
- this.gui = guiConfigV2;
-
- search = new MTextField() {
- @Override
- public void edit(String str) {
- setupNavigation();
-
- setCurrentPageAndPushHistory("");
- if (!categoryMap.containsKey(lastOpenCategory)) {
- for (Map.Entry nestedCategoryMPanelEntry : categoryMap.entrySet()) {
- if (nestedCategoryMPanelEntry.getValue() instanceof MCategoryElement) {
- setCurrentPageAndPushHistory(nestedCategoryMPanelEntry.getKey().categoryFull());
- lastOpenCategory = nestedCategoryMPanelEntry.getKey();
- break;
- }
- }
- }
- for (Map.Entry nestedCategoryMPanelEntry : categoryMap.entrySet()) {
- if (nestedCategoryMPanelEntry.getValue() instanceof MCollapsable) {
- ((MCollapsable) nestedCategoryMPanelEntry.getValue()).setCollapsed(false);
- }
- }
- rePlaceElements();
- }
- };
- search.setPlaceHolder("Search...");
- add(search);
- guiRelocate = new MButton();
- guiRelocate.setText("Edit Gui Locations");
- guiRelocate.setOnActionPerformed(() -> {
- Minecraft.getMinecraft().displayGuiScreen(new GuiGuiLocationConfig(gui, null));
- guiRelocate.setIsclicked(false);
- });
- guiRelocate.setBorder(RenderUtils.blendTwoColors(0xFF141414,0x7702EE67));
- add(guiRelocate);
-
- discord = new MButton(); github = new MButton();
- discord.setText("Discord"); github.setText("Github");
- discord.setBorder(RenderUtils.blendTwoColors(0xFF141414,0x7702EE67));
- github.setBorder(RenderUtils.blendTwoColors(0xFF141414,0x7702EE67));
- github.setOnActionPerformed(() -> {
- try {
- Desktop.getDesktop().browse(new URI("https://github.com/Dungeons-Guide/Skyblock-Dungeons-Guide/"));
- } catch (IOException | URISyntaxException e) {
- e.printStackTrace();
- }
- });
- discord.setOnActionPerformed(() -> {
- try {
- Desktop.getDesktop().browse(new URI("https://discord.gg/VuxayCWGE8"));
- } catch (IOException | URISyntaxException e) {
- e.printStackTrace();
- }
- });
- add(discord); add(github);
-
- navigationScroll = new MScrollablePanel(1);
- navigationScroll.setHideScrollBarWhenNotNecessary(false);
-
-
- add(navigationScroll);
- navigationScroll.add(navigation);
-
- contentScroll = new MScrollablePanel(3);
- contentScroll.setHideScrollBarWhenNotNecessary(true);
- add(contentScroll);
-
- setupNavigation();
- navigation.setGap(0);
- navigation.setDrawLine(false);
-
- setCurrentPageAndPushHistory("ROOT");
- rePlaceElements();
-
- search.setFocused(true);
- }
-
-
- private Map