From 394c52045bcb53a93c08cfab6d60a42bfd777d59 Mon Sep 17 00:00:00 2001 From: syeyoung Date: Sun, 22 Jan 2023 00:30:16 +0900 Subject: - Profile viewer now uses guiv2 Signed-off-by: syeyoung --- .../mod/commands/CommandDungeonsGuide.java | 7 +- .../mod/events/listener/DungeonListener.java | 2 +- .../impl/boss/terminal/FeatureTerminalSolvers.java | 1 - .../impl/party/playerpreview/FakePlayer.java | 40 +- .../FeatureViewPlayerStatsOnJoin.java | 571 ++------------------- .../playerpreview/HoverEventRenderPlayer.java | 71 +++ .../impl/party/playerpreview/api/SkinFetcher.java | 1 - .../playerpreview/datarenders/IDataRenderer.java | 3 +- .../impl/DataRenderDungeonFloorStat.java | 14 +- .../impl/DataRenderDungeonHighestFloorStat.java | 16 +- .../datarenders/impl/DataRendererClassLv.java | 11 +- .../datarenders/impl/DataRendererDungeonLv.java | 11 +- .../datarenders/impl/DataRendererFairySouls.java | 4 +- .../datarenders/impl/DataRendererLilyWeight.java | 13 +- .../datarenders/impl/DataRendererSecrets.java | 4 +- .../impl/DataRendererSelectedClassLv.java | 11 +- .../datarenders/impl/DataRendererSetUrOwn.java | 5 +- .../datarenders/impl/DataRendererSkillLv.java | 11 +- .../datarenders/impl/DataRendererTalismans.java | 8 +- .../playerpreview/widget/PlayerModelRenderer.java | 179 +++++++ .../widget/WidgetDataRendererWrapper.java | 112 ++++ .../widget/WidgetPlayerInventory.java | 148 ++++++ .../playerpreview/widget/WidgetPlayerModel.java | 105 ++++ .../playerpreview/widget/WidgetProfileViewer.java | 94 ++++ .../widget/WidgetProfileViewerData.java | 133 +++++ .../dungeonsguide/mod/guiv2/DomElement.java | 11 +- .../mod/guiv2/elements/MinecraftTooltip.java | 58 +++ .../mod/guiv2/elements/MouseTooltip.java | 50 ++ .../dungeonsguide/mod/guiv2/elements/Slot.java | 18 + .../mod/overlay/OverlayManagerRootWidget.java | 5 +- 30 files changed, 1113 insertions(+), 604 deletions(-) create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/HoverEventRenderPlayer.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/widget/PlayerModelRenderer.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/widget/WidgetDataRendererWrapper.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/widget/WidgetPlayerInventory.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/widget/WidgetPlayerModel.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/widget/WidgetProfileViewer.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/widget/WidgetProfileViewerData.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/guiv2/elements/MinecraftTooltip.java create mode 100644 mod/src/main/java/kr/syeyoung/dungeonsguide/mod/guiv2/elements/MouseTooltip.java (limited to 'mod/src/main/java') diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandDungeonsGuide.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandDungeonsGuide.java index 394f95ca..fd8d7164 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandDungeonsGuide.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/commands/CommandDungeonsGuide.java @@ -18,6 +18,7 @@ package kr.syeyoung.dungeonsguide.mod.commands; +import com.mojang.authlib.GameProfile; import kr.syeyoung.dungeonsguide.launcher.Main; import kr.syeyoung.dungeonsguide.mod.DungeonsGuide; import kr.syeyoung.dungeonsguide.mod.chat.ChatTransmitter; @@ -26,6 +27,7 @@ import kr.syeyoung.dungeonsguide.mod.cosmetics.CosmeticsManager; import kr.syeyoung.dungeonsguide.mod.discord.DiscordIntegrationManager; import kr.syeyoung.dungeonsguide.mod.features.FeatureRegistry; import kr.syeyoung.dungeonsguide.mod.features.impl.party.playerpreview.FeatureViewPlayerStatsOnJoin; +import kr.syeyoung.dungeonsguide.mod.features.impl.party.playerpreview.HoverEventRenderPlayer; import kr.syeyoung.dungeonsguide.mod.features.impl.party.playerpreview.api.ApiFetcher; import kr.syeyoung.dungeonsguide.mod.guiv2.elements.image.ImageTexture; import kr.syeyoung.dungeonsguide.mod.party.PartyManager; @@ -94,7 +96,10 @@ public class CommandDungeonsGuide extends CommandBase { 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)))))); + sender.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §e" + args[1] + "§f's Profile ").appendSibling(new ChatComponentText("§7view").setChatStyle(new ChatStyle().setChatHoverEvent( + new HoverEventRenderPlayer( + new GameProfile(FeatureViewPlayerStatsOnJoin.fromString(a.orElse(null)), args[1]) + ))))); }); } catch (Exception e) { e.printStackTrace(); diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/DungeonListener.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/DungeonListener.java index 0e1001ba..c36fac6d 100755 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/DungeonListener.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/events/listener/DungeonListener.java @@ -191,7 +191,7 @@ public class DungeonListener { @SubscribeEvent public void onRender(RenderGameOverlayEvent.Post postRender) { - if (!(postRender.type == RenderGameOverlayEvent.ElementType.EXPERIENCE || postRender.type == RenderGameOverlayEvent.ElementType.JUMPBAR)) + if (!(postRender.type == RenderGameOverlayEvent.ElementType.ALL)) return; if (!SkyblockStatus.isOnDungeon()) return; diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/terminal/FeatureTerminalSolvers.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/terminal/FeatureTerminalSolvers.java index a51affd8..64c200ea 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/terminal/FeatureTerminalSolvers.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/boss/terminal/FeatureTerminalSolvers.java @@ -90,7 +90,6 @@ public class FeatureTerminalSolvers extends SimpleFeature { @DGEventHandler public void onGuiPostRender(GuiScreenEvent.DrawScreenEvent.Post rendered) { - if (!isEnabled()) return; if (solutionProvider == null) return; if (!(Minecraft.getMinecraft().currentScreen instanceof GuiChest)) { solution = null; diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/FakePlayer.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/FakePlayer.java index ac0e2fec..1cbb01b5 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/FakePlayer.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/FakePlayer.java @@ -41,19 +41,49 @@ public class FakePlayer extends EntityOtherPlayerMP { @Setter @Getter private PlayerProfile skyblockProfile; + + public void setSkyblockProfile(PlayerProfile skyblockProfile) { + this.skyblockProfile = skyblockProfile; + + 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; + } + } + private final SkinFetcher.SkinSet skinSet; - private final PlayerProfile.Armor armor; - @Getter - private final int profileNumber; + private PlayerProfile.Armor armor; private FakePlayer(World w) { super(w, null); throw new UnsupportedOperationException("what"); } - public FakePlayer(GameProfile playerProfile, SkinFetcher.SkinSet skinSet, PlayerProfile skyblockProfile, int profileNumber) { + public FakePlayer(GameProfile playerProfile, SkinFetcher.SkinSet skinSet, PlayerProfile skyblockProfile) { super(Minecraft.getMinecraft().theWorld, playerProfile); - this.profileNumber = profileNumber; this.skyblockProfile = skyblockProfile; this.skinSet = skinSet; armor = skyblockProfile.getCurrentArmor(); diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/FeatureViewPlayerStatsOnJoin.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/FeatureViewPlayerStatsOnJoin.java index ddc6ab3b..746f9728 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/FeatureViewPlayerStatsOnJoin.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/FeatureViewPlayerStatsOnJoin.java @@ -22,7 +22,6 @@ 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.mod.DungeonsGuide; import kr.syeyoung.dungeonsguide.mod.chat.ChatProcessResult; import kr.syeyoung.dungeonsguide.mod.chat.ChatProcessor; import kr.syeyoung.dungeonsguide.mod.chat.ChatTransmitter; @@ -30,75 +29,53 @@ import kr.syeyoung.dungeonsguide.mod.config.guiconfig.ConfigPanelCreator; import kr.syeyoung.dungeonsguide.mod.config.guiconfig.MFeatureEdit; import kr.syeyoung.dungeonsguide.mod.config.guiconfig.MParameterEdit; import kr.syeyoung.dungeonsguide.mod.config.guiconfig.RootConfigPanel; -import kr.syeyoung.dungeonsguide.mod.cosmetics.ActiveCosmetic; -import kr.syeyoung.dungeonsguide.mod.cosmetics.CosmeticData; import kr.syeyoung.dungeonsguide.mod.events.annotations.DGEventHandler; import kr.syeyoung.dungeonsguide.mod.features.FeatureParameter; import kr.syeyoung.dungeonsguide.mod.features.FeatureRegistry; import kr.syeyoung.dungeonsguide.mod.features.SimpleFeature; import kr.syeyoung.dungeonsguide.mod.features.impl.party.playerpreview.api.ApiFetcher; -import kr.syeyoung.dungeonsguide.mod.features.impl.party.playerpreview.api.PlayerSkyblockData; -import kr.syeyoung.dungeonsguide.mod.features.impl.party.playerpreview.api.SkinFetcher; -import kr.syeyoung.dungeonsguide.mod.features.impl.party.playerpreview.api.playerprofile.PlayerProfile; import kr.syeyoung.dungeonsguide.mod.features.impl.party.playerpreview.datarenders.DataRendererEditor; -import kr.syeyoung.dungeonsguide.mod.features.impl.party.playerpreview.datarenders.DataRendererRegistry; -import kr.syeyoung.dungeonsguide.mod.features.impl.party.playerpreview.datarenders.IDataRenderer; +import kr.syeyoung.dungeonsguide.mod.features.impl.party.playerpreview.widget.WidgetProfileViewer; +import kr.syeyoung.dungeonsguide.mod.guiv2.primitive.Rect; +import kr.syeyoung.dungeonsguide.mod.overlay.OverlayManager; +import kr.syeyoung.dungeonsguide.mod.overlay.OverlayType; +import kr.syeyoung.dungeonsguide.mod.overlay.OverlayWidget; import kr.syeyoung.dungeonsguide.mod.party.PartyContext; import kr.syeyoung.dungeonsguide.mod.party.PartyManager; import kr.syeyoung.dungeonsguide.mod.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.GuiOpenEvent; import net.minecraftforge.client.event.GuiScreenEvent; -import net.minecraftforge.fml.client.config.GuiUtils; import net.minecraftforge.fml.common.Loader; import org.jetbrains.annotations.NotNull; 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; +// TODO: do not limit element positioning +// maybe a cool editor? public class FeatureViewPlayerStatsOnJoin extends SimpleFeature { static Minecraft mc = Minecraft.getMinecraft(); - protected Rectangle popupRect; - ChangeProfileWidget profileButtonWidget = new ChangeProfileWidget(); - private String lastuid; // actually current uid - private CompletableFuture> profileFuture; - private Future> gameProfileFuture; - private Future skinFuture; - private FakePlayer fakePlayer; - private boolean shouldDraw = false; - public FeatureViewPlayerStatsOnJoin() { - super("Party", "View player stats when join", "view player rendering when joining/someone joins the party", "partykicker.viewstats", true); + public static UUID fromString(String input) { + return UUID.fromString(input.replaceFirst("(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})", "$1-$2-$3-$4-$5")); + } + public FeatureViewPlayerStatsOnJoin() { + super("Party", "View player stats when join", "view player rendering when joining/someone joins the party", "partykicker.viewstats", true); addParameter("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")); ChatProcessor.INSTANCE.subscribe(((txt, messageContext) -> { - if (isEnabled() && txt.contains("§r§ejoined the dungeon group! (§r§b")) { String username = TextUtils.stripColor(txt).split(" ")[3]; if (username.equalsIgnoreCase(mc.getSession().getUsername())) { @@ -112,23 +89,11 @@ public class FeatureViewPlayerStatsOnJoin extends SimpleFeature { } else { processMemberJoin(username); } - - } - - return ChatProcessResult.NONE; })); } - - 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); - } - public static void processPartyMembers(PartyContext context) { for (String member : context.getPartyRawMembers()) { processMemberJoin(member); @@ -147,385 +112,55 @@ public class FeatureViewPlayerStatsOnJoin extends SimpleFeature { ApiFetcher.fetchMostRecentProfileAsync(a.get(), FeatureRegistry.PARTYKICKER_APIKEY.getAPIKey()); IChatComponent comp = new ChatComponentText("§eDungeons Guide §7:: §e" + username + "§f's Profile ") - .appendSibling(new ChatComponentText("§7view").setChatStyle(new ChatStyle().setChatHoverEvent(new HoverEventRenderPlayer(a.orElse(null))))); + .appendSibling(new ChatComponentText("§7view").setChatStyle(new ChatStyle().setChatHoverEvent(new HoverEventRenderPlayer( + new GameProfile(fromString(a.get()), username))))); ChatTransmitter.addToQueue((ChatComponentText) comp); - - }); } - @DGEventHandler - public void onGuiPostRender(GuiScreenEvent.DrawScreenEvent.Post rendered) { + private OverlayWidget widget; + + @DGEventHandler(triggerOutOfSkyblock = true) + public void onGuiPostRender(GuiScreenEvent.MouseInputEvent.Pre mouseInputEvent) { 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]; + GameProfile gameProfile = null; + if (ichatcomponent != null && ichatcomponent.getChatStyle().getChatHoverEvent() instanceof HoverEventRenderPlayer) { + gameProfile = ((HoverEventRenderPlayer) ichatcomponent.getChatStyle().getChatHoverEvent()).getGameProfile(); + } + if (gameProfile != null && widget == null) { + int mouseX = Mouse.getX(); + int mouseY = (Minecraft.getMinecraft().displayHeight - Mouse.getY()); + + double width = 220 * scaledResolution.getScaleFactor(); + double heigth = 220 * scaledResolution.getScaleFactor(); + widget = new OverlayWidget( + new WidgetProfileViewer(gameProfile, FeatureRegistry.PARTYKICKER_APIKEY.getAPIKey(), + scaledResolution.getScaleFactor(), () -> { + if (widget != null) { + OverlayManager.getInstance().removeOverlay(widget); + widget = null; } - 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); + }), + OverlayType.OVER_CHAT, + () -> new Rect(mouseX, mouseY-heigth, width, heigth) + ); + OverlayManager.getInstance().addOverlay(widget); } - 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(); - } - - 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; + @DGEventHandler(triggerOutOfSkyblock = true) + public void onGuiClose(GuiOpenEvent event) { + if (!(event.gui instanceof GuiChat) && widget != null) { + OverlayManager.getInstance().removeOverlay(widget); + widget = null; } } - public void cancelRender() { - popupRect = null; - profileFuture = null; - lastuid = null; - gameProfileFuture = null; - skinFuture = null; - fakePlayer = null; - shouldDraw = false; - } - - @DGEventHandler - 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; @@ -561,120 +196,4 @@ public class FeatureViewPlayerStatsOnJoin extends SimpleFeature { return "base." + getKey(); } - public static class HoverEventRenderPlayer extends HoverEvent { - @Getter - private final String uuid; - private IChatComponent cached; - - 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); - } - - @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; - } - } - - class ChangeProfileWidget { - FontRenderer fr; - @Getter - @Setter - int currentyselectedprofile = 0; - String buttonText = "Switch Profile"; - int stringWidth; - int textx; - int texty; - int blockWidth; - int blockHeight; - long clickDeBounce = 0; - - 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; - } - - 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); - } - - 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]; - } - } } diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/HoverEventRenderPlayer.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/HoverEventRenderPlayer.java new file mode 100644 index 00000000..5fd82b73 --- /dev/null +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/HoverEventRenderPlayer.java @@ -0,0 +1,71 @@ +/* + * Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod + * Copyright (C) 2023 cyoung06 (syeyoung) + * + * 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.mod.features.impl.party.playerpreview; + +import com.mojang.authlib.GameProfile; +import lombok.Getter; +import net.minecraft.event.HoverEvent; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChatStyle; +import net.minecraft.util.IChatComponent; + +import java.util.Objects; + +public class HoverEventRenderPlayer extends HoverEvent { + @Getter + private final GameProfile gameProfile; + private IChatComponent cached; + + public HoverEventRenderPlayer(GameProfile gameProfile) { + super(Action.SHOW_TEXT, new ChatComponentText("")); + this.gameProfile = Objects.requireNonNull(gameProfile); + } + + @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(gameProfile.getId(), that.gameProfile.getId()); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), gameProfile.getId()); + } + + @Override + public IChatComponent getValue() { + if (cached == null) { + cached = new ChatComponentText("") + .setChatStyle( + new ChatStyle() + .setChatHoverEvent( + new HoverEvent( + Action.SHOW_TEXT, + new ChatComponentText(gameProfile.getId().toString()) + ) + ) + ); + return cached; + } + return cached; + } +} diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/api/SkinFetcher.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/api/SkinFetcher.java index 5488f637..b93debf9 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/api/SkinFetcher.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/api/SkinFetcher.java @@ -75,7 +75,6 @@ public class SkinFetcher { } } }, true); - return skinSet2; } diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/IDataRenderer.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/IDataRenderer.java index 577bdcb5..77b3bfa2 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/IDataRenderer.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/IDataRenderer.java @@ -21,10 +21,11 @@ package kr.syeyoung.dungeonsguide.mod.features.impl.party.playerpreview.datarend import kr.syeyoung.dungeonsguide.mod.features.impl.party.playerpreview.api.playerprofile.PlayerProfile; import java.awt.*; +import java.util.List; public interface IDataRenderer { Dimension renderData(PlayerProfile playerProfile); - void onHover(PlayerProfile playerProfile, int mouseX, int mouseY); + List onHover(PlayerProfile playerProfile); Dimension renderDummy(); diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonFloorStat.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonFloorStat.java index e4f4ea0b..67b91566 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonFloorStat.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonFloorStat.java @@ -28,11 +28,10 @@ import kr.syeyoung.dungeonsguide.mod.features.impl.party.playerpreview.datarende import kr.syeyoung.dungeonsguide.mod.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; +import java.util.List; public class DataRenderDungeonFloorStat implements IDataRenderer { private final DungeonType dungeonType; @@ -81,16 +80,15 @@ public class DataRenderDungeonFloorStat implements IDataRenderer { } @Override - public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) { + public List onHover(PlayerProfile playerProfile) { DungeonSpecificData dungeonStatDungeonSpecificData = playerProfile.getDungeonStats().get(dungeonType); - if (dungeonStatDungeonSpecificData == null) return; + if (dungeonStatDungeonSpecificData == null) return null; FloorSpecificData playedFloorFloorSpecificData = dungeonStatDungeonSpecificData.getData().getPlays().get(floor); - if (playedFloorFloorSpecificData == null) return; + if (playedFloorFloorSpecificData == null) return null; String floorName = (dungeonType == DungeonType.CATACOMBS ? "F" : "M") + floor; - ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); - GuiUtils.drawHoveringText(Arrays.asList( + return Arrays.asList( "§bFloor "+floorName, "§bBest Score§7: §f"+playedFloorFloorSpecificData.getData().getBestScore(), "§bTotal Completions§7: §f"+playedFloorFloorSpecificData.getData().getCompletions(), @@ -101,6 +99,6 @@ public class DataRenderDungeonFloorStat implements IDataRenderer { "§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/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonHighestFloorStat.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonHighestFloorStat.java index 8eb10ad4..7d36f1b9 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonHighestFloorStat.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRenderDungeonHighestFloorStat.java @@ -28,11 +28,10 @@ import kr.syeyoung.dungeonsguide.mod.features.impl.party.playerpreview.datarende import kr.syeyoung.dungeonsguide.mod.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; +import java.util.List; public class DataRenderDungeonHighestFloorStat implements IDataRenderer { private final DungeonType dungeonType; @@ -82,17 +81,16 @@ public class DataRenderDungeonHighestFloorStat implements IDataRenderer { } @Override - public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) { + public List onHover(PlayerProfile playerProfile) { DungeonSpecificData dungeonStatDungeonSpecificData = playerProfile.getDungeonStats().get(dungeonType); - if (dungeonStatDungeonSpecificData == null) return; - if (dungeonStatDungeonSpecificData.getData().getHighestCompleted() == -1) return; + if (dungeonStatDungeonSpecificData == null) return null; + if (dungeonStatDungeonSpecificData.getData().getHighestCompleted() == -1) return null; FloorSpecificData playedFloorFloorSpecificData = dungeonStatDungeonSpecificData.getData().getPlays().get( dungeonStatDungeonSpecificData.getData().getHighestCompleted()); - if (playedFloorFloorSpecificData == null) return; + if (playedFloorFloorSpecificData == null) return null; String floorName = (dungeonType == DungeonType.CATACOMBS ? "F" : "M") + dungeonStatDungeonSpecificData.getData().getHighestCompleted(); - ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); - GuiUtils.drawHoveringText(Arrays.asList( + return Arrays.asList( "§bFloor "+floorName, "§bBest Score§7: §f"+playedFloorFloorSpecificData.getData().getBestScore(), "§bTotal Completions§7: §f"+playedFloorFloorSpecificData.getData().getCompletions(), @@ -103,6 +101,6 @@ public class DataRenderDungeonHighestFloorStat implements IDataRenderer { "§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/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererClassLv.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererClassLv.java index 62a56209..b76bcbf9 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererClassLv.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererClassLv.java @@ -28,11 +28,10 @@ import kr.syeyoung.dungeonsguide.mod.utils.TextUtils; import kr.syeyoung.dungeonsguide.mod.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; +import java.util.List; public class DataRendererClassLv implements IDataRenderer { private final DungeonClass dungeonClass; @@ -77,13 +76,11 @@ public class DataRendererClassLv implements IDataRenderer { } @Override - public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) { + public List onHover(PlayerProfile playerProfile) { ClassSpecificData dungeonStatDungeonSpecificData = playerProfile.getPlayerClassData().get(dungeonClass); - if (dungeonStatDungeonSpecificData == null) return; + if (dungeonStatDungeonSpecificData == null) return null; 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); + return 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())); } } diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererDungeonLv.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererDungeonLv.java index 2da70108..63cad630 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererDungeonLv.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererDungeonLv.java @@ -28,11 +28,10 @@ import kr.syeyoung.dungeonsguide.mod.utils.TextUtils; import kr.syeyoung.dungeonsguide.mod.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; +import java.util.List; public class DataRendererDungeonLv implements IDataRenderer { private final DungeonType dungeonType; @@ -71,12 +70,10 @@ public class DataRendererDungeonLv implements IDataRenderer { } @Override - public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) { + public List onHover(PlayerProfile playerProfile) { DungeonSpecificData dungeonStatDungeonSpecificData = playerProfile.getDungeonStats().get(dungeonType); - if (dungeonStatDungeonSpecificData == null) return; + if (dungeonStatDungeonSpecificData == null) return null; 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); + return 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())); } } diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererFairySouls.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererFairySouls.java index afaef852..5250c291 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererFairySouls.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererFairySouls.java @@ -24,6 +24,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import java.awt.*; +import java.util.List; public class DataRendererFairySouls implements IDataRenderer { @Override @@ -45,6 +46,7 @@ public class DataRendererFairySouls implements IDataRenderer { } @Override - public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) { + public List onHover(PlayerProfile playerProfile) { + return null; } } diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererLilyWeight.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererLilyWeight.java index 251368eb..567ba757 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererLilyWeight.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererLilyWeight.java @@ -23,11 +23,10 @@ import kr.syeyoung.dungeonsguide.mod.features.impl.party.playerpreview.api.playe import kr.syeyoung.dungeonsguide.mod.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; +import java.util.List; public class DataRendererLilyWeight implements IDataRenderer { @Override @@ -52,11 +51,10 @@ public class DataRendererLilyWeight implements IDataRenderer { } @Override - public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) { + public List onHover(PlayerProfile playerProfile) { PlayerProfile.LilyWeight lilyWeight= playerProfile.getLilyWeight(); - if (lilyWeight == null) return; - ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); - GuiUtils.drawHoveringText(Arrays.asList( + if (lilyWeight == null) return null; + return 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()), @@ -66,7 +64,6 @@ public class DataRendererLilyWeight implements IDataRenderer { " §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/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererSecrets.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererSecrets.java index ed3da2ec..f8c43a06 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererSecrets.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererSecrets.java @@ -24,6 +24,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import java.awt.*; +import java.util.List; public class DataRendererSecrets implements IDataRenderer { @Override @@ -48,6 +49,7 @@ public class DataRendererSecrets implements IDataRenderer { } @Override - public void onHover(PlayerProfile playerProfile, int mouseX, int mouseY) { + public List onHover(PlayerProfile playerProfile) { + return null; } } diff --git a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererSelectedClassLv.java b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererSelectedClassLv.java index 470cfbbb..4d1d46e1 100644 --- a/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererSelectedClassLv.java +++ b/mod/src/main/java/kr/syeyoung/dungeonsguide/mod/features/impl/party/playerpreview/datarenders/impl/DataRendererSelectedClassLv.java @@ -26,11 +26,10 @@ import kr.syeyoung.dungeonsguide.mod.utils.TextUtils; import kr.syeyoung.dungeonsguide.mod.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; +import java.util.List; public class DataRendererSelectedClassLv implemen