/*
* 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();
}
}