diff options
author | syeyoung <cyong06@naver.com> | 2021-07-21 15:29:43 +0900 |
---|---|---|
committer | syeyoung <cyong06@naver.com> | 2021-07-21 15:29:43 +0900 |
commit | d392b203a93a8897a184f75634338b7c866510f3 (patch) | |
tree | a27505fbdc2bc754c674a026915c27065984c00e | |
parent | 4850d1a1f795f625286b9a2058143f688265dc3d (diff) | |
download | Skyblock-Dungeons-Guide-d392b203a93a8897a184f75634338b7c866510f3.tar.gz Skyblock-Dungeons-Guide-d392b203a93a8897a184f75634338b7c866510f3.tar.bz2 Skyblock-Dungeons-Guide-d392b203a93a8897a184f75634338b7c866510f3.zip |
custom party finder
13 files changed, 874 insertions, 20 deletions
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/FeatureRegistry.java b/src/main/java/kr/syeyoung/dungeonsguide/features/FeatureRegistry.java index 927684e4..860cd86a 100644 --- a/src/main/java/kr/syeyoung/dungeonsguide/features/FeatureRegistry.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/features/FeatureRegistry.java @@ -32,6 +32,7 @@ import kr.syeyoung.dungeonsguide.features.impl.etc.*; import kr.syeyoung.dungeonsguide.features.impl.etc.ability.FeatureAbilityCooldown; import kr.syeyoung.dungeonsguide.features.impl.party.APIKey; import kr.syeyoung.dungeonsguide.features.impl.party.FeatureGoodParties; +import kr.syeyoung.dungeonsguide.features.impl.party.customgui.FeatureCustomPartyFinder; import kr.syeyoung.dungeonsguide.features.impl.party.playerpreview.FeatureViewPlayerOnJoin; import kr.syeyoung.dungeonsguide.features.impl.secret.FeatureActions; import kr.syeyoung.dungeonsguide.features.impl.secret.FeatureFreezePathfind; @@ -112,6 +113,7 @@ public class FeatureRegistry { public static final APIKey PARTYKICKER_APIKEY = register(new APIKey()); public static final FeatureViewPlayerOnJoin PARTYKICKER_VIEWPLAYER = register(new FeatureViewPlayerOnJoin()); public static final FeatureGoodParties PARTYKICKER_GOODPARTIES = register(new FeatureGoodParties()); + public static final FeatureCustomPartyFinder PARTYKICKER_CUSTOM = register(new FeatureCustomPartyFinder()); public static final FeatureWarningOnPortal BOSSFIGHT_WARNING_ON_PORTAL = register(new FeatureWarningOnPortal()); public static final SimpleFeature BOSSFIGHT_CHESTPRICE = register(new FeatureChestPrice()); diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/FeatureCustomPartyFinder.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/FeatureCustomPartyFinder.java new file mode 100644 index 00000000..34daadf8 --- /dev/null +++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/FeatureCustomPartyFinder.java @@ -0,0 +1,61 @@ +/* + * 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 <https://www.gnu.org/licenses/>. + */ + +package kr.syeyoung.dungeonsguide.features.impl.party.customgui; + +import kr.syeyoung.dungeonsguide.events.WindowUpdateEvent; +import kr.syeyoung.dungeonsguide.features.SimpleFeature; +import kr.syeyoung.dungeonsguide.features.listener.*; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.inventory.GuiChest; +import net.minecraft.inventory.ContainerChest; +import net.minecraft.inventory.IInventory; +import net.minecraftforge.client.event.GuiOpenEvent; + +public class FeatureCustomPartyFinder extends SimpleFeature implements GuiOpenListener, GuiUpdateListener { + public FeatureCustomPartyFinder() { + super("Party Kicker","Custom Party Finder","Custom Party Finder", "party.customfinder", true); + } + + GuiCustomPartyFinder guiCustomPartyFinder; + @Override + public void onGuiOpen(GuiOpenEvent event) { + if (event.gui == null) guiCustomPartyFinder = null; + if (!isEnabled()) return; + if (!(event.gui instanceof GuiChest)) return; + GuiChest chest = (GuiChest) event.gui; + if (!(chest.inventorySlots instanceof ContainerChest)) return; + ContainerChest containerChest = (ContainerChest) chest.inventorySlots; + IInventory lower = containerChest.getLowerChestInventory(); + if (lower == null || !lower.getName().equals("Party Finder")) return; + + if (guiCustomPartyFinder == null) { + guiCustomPartyFinder = new GuiCustomPartyFinder(); + } + guiCustomPartyFinder.setGuiChest(chest); + + event.gui = guiCustomPartyFinder; + } + + @Override + public void onGuiUpdate(WindowUpdateEvent windowUpdateEvent) { + if (guiCustomPartyFinder != null) { + guiCustomPartyFinder.onChestUpdate(windowUpdateEvent); + } + } +} diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/GuiCustomPartyFinder.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/GuiCustomPartyFinder.java new file mode 100644 index 00000000..bf297b93 --- /dev/null +++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/GuiCustomPartyFinder.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 <https://www.gnu.org/licenses/>. + */ + +package kr.syeyoung.dungeonsguide.features.impl.party.customgui; + +import kr.syeyoung.dungeonsguide.events.WindowUpdateEvent; +import kr.syeyoung.dungeonsguide.gui.MGui; +import lombok.Getter; +import lombok.Setter; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.inventory.GuiChest; + +import java.awt.*; + +public class GuiCustomPartyFinder extends MGui { + @Getter + private GuiChest guiChest; + + public void setGuiChest(GuiChest guiChest) { + if (this.guiChest != null) this.guiChest.onGuiClosed(); + this.guiChest = guiChest; + panelPartyFinder.onChestUpdate(null); + guiChest.setWorldAndResolution(Minecraft.getMinecraft(), Minecraft.getMinecraft().displayWidth, Minecraft.getMinecraft().displayHeight); + guiChest.initGui(); + } + + public void onChestUpdate(WindowUpdateEvent windowUpdateEvent) { + panelPartyFinder.onChestUpdate(windowUpdateEvent); + } + + private PanelPartyFinder panelPartyFinder; + public GuiCustomPartyFinder() { + panelPartyFinder = new PanelPartyFinder(this); + getMainPanel().add(panelPartyFinder); + } + + @Override + public void initGui() { + super.initGui(); + panelPartyFinder.setBounds(new Rectangle(Minecraft.getMinecraft().displayWidth/5, Minecraft.getMinecraft().displayHeight/5,3*Minecraft.getMinecraft().displayWidth/5, 3*Minecraft.getMinecraft().displayHeight/5)); + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + super.drawDefaultBackground(); + super.drawScreen(mouseX, mouseY, partialTicks); + + } + + @Override + public void onGuiClosed() { + guiChest.onGuiClosed(); + guiChest = null; + } +} diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/PanelPartyFinder.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/PanelPartyFinder.java new file mode 100644 index 00000000..8f43399c --- /dev/null +++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/PanelPartyFinder.java @@ -0,0 +1,286 @@ +/* + * 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 <https://www.gnu.org/licenses/>. + */ + +package kr.syeyoung.dungeonsguide.features.impl.party.customgui; + +import kr.syeyoung.dungeonsguide.events.WindowUpdateEvent; +import kr.syeyoung.dungeonsguide.gui.MPanel; +import kr.syeyoung.dungeonsguide.gui.elements.MButton; +import kr.syeyoung.dungeonsguide.gui.elements.MLabel; +import kr.syeyoung.dungeonsguide.gui.elements.MList; +import kr.syeyoung.dungeonsguide.gui.elements.MScrollablePanel; +import kr.syeyoung.dungeonsguide.utils.RenderUtils; +import lombok.Getter; +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.Blocks; +import net.minecraft.init.Items; +import net.minecraft.inventory.ContainerChest; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +import java.awt.*; +import java.util.HashMap; +import java.util.Map; + +public class PanelPartyFinder extends MPanel { + @Getter + private GuiCustomPartyFinder guiCustomPartyFinder; + + private PanelPartyFinderSettings panelPartyFinderSettings; + + private MScrollablePanel scrollablePanel; + private MList list; + + private MButton goBack; + private MButton previous; + private MButton next; + private int page = 1; + + private Map<Integer, PanelPartyListElement> panelPartyListElementMap = new HashMap<>(); + + public PanelPartyFinder(GuiCustomPartyFinder guiCustomPartyFinder) { + this.guiCustomPartyFinder = guiCustomPartyFinder; + + scrollablePanel = new MScrollablePanel(1); + panelPartyFinderSettings = new PanelPartyFinderSettings(this); + + list = new MList() { + @Override + public void resize(int parentWidth, int parentHeight) { + setSize(new Dimension(parentWidth, 9999)); + realignChildren(); + } + }; + list.setGap(1); + + scrollablePanel.add(list); + + add(scrollablePanel); + add(panelPartyFinderSettings); + + previous = new MButton(); next = new MButton(); + previous.setText("Prev"); next.setText("Next"); + previous.setEnabled(false); next.setEnabled(false); + next.setOnActionPerformed(() -> { + GuiChest chest = getGuiCustomPartyFinder().getGuiChest(); + Minecraft.getMinecraft().playerController.windowClick(chest.inventorySlots.windowId, 9*2+8, 0, 0, Minecraft.getMinecraft().thePlayer); + }); + previous.setOnActionPerformed(() -> { + GuiChest chest = getGuiCustomPartyFinder().getGuiChest(); + Minecraft.getMinecraft().playerController.windowClick(chest.inventorySlots.windowId, 9*2, 0, 0, Minecraft.getMinecraft().thePlayer); + }); + goBack = new MButton(); + goBack.setBackground(RenderUtils.blendAlpha(0xFF141414, 0.05f)); + goBack.setText("<"); + goBack.setOnActionPerformed(() -> { + GuiChest chest = getGuiCustomPartyFinder().getGuiChest(); + Minecraft.getMinecraft().playerController.windowClick(chest.inventorySlots.windowId, 9*5+3, 0, 0, Minecraft.getMinecraft().thePlayer); + }); + add(previous); add(next); add(goBack); + } + + public String getHighlightNote() { + return panelPartyFinderSettings.getHighlightText(); + } + + @Override + public void setBounds(Rectangle bounds) { + super.setBounds(bounds); + FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; + scrollablePanel.setBounds(new Rectangle(0, fr.FONT_HEIGHT*2+41, 2*bounds.width/3, bounds.height - fr.FONT_HEIGHT*2-41)); + panelPartyFinderSettings.setBounds(new Rectangle(2*bounds.width/3+1, fr.FONT_HEIGHT*2+21, bounds.width/3 -1, (bounds.height-fr.FONT_HEIGHT*2-21))); + + previous.setBounds(new Rectangle(0, fr.FONT_HEIGHT*2+21, 50, 20)); + next.setBounds(new Rectangle(2*bounds.width/3-50, fr.FONT_HEIGHT*2+21, 50, 20)); + goBack.setBounds(new Rectangle(0,0, fr.FONT_HEIGHT*2+20, fr.FONT_HEIGHT*2+20)); + } + + @Override + public void render(int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks, Rectangle scissor) { + FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; + // background + Gui.drawRect(0,0,getBounds().width, getBounds().height, RenderUtils.blendAlpha(0xFF141414, 0.0f)); + // top bar + Gui.drawRect(0,0,getBounds().width, fr.FONT_HEIGHT*2+21, RenderUtils.blendAlpha(0xFF141414, 0.05f)); + // lines + Gui.drawRect(0,fr.FONT_HEIGHT*2+20,getBounds().width, fr.FONT_HEIGHT*2+21, -1); + Gui.drawRect(panelPartyFinderSettings.getBounds().x-1,fr.FONT_HEIGHT*2+20,panelPartyFinderSettings.getBounds().x, getBounds().height, -1); + // prev next bar + Gui.drawRect(0,fr.FONT_HEIGHT*2+21,scrollablePanel.getBounds().width, fr.FONT_HEIGHT*2+41, RenderUtils.blendAlpha(0xFF141414, 0.08f)); + + GlStateManager.pushMatrix(); + GlStateManager.translate(fr.FONT_HEIGHT*2+21, 0,0); + GlStateManager.scale(2,2,1); + fr.drawString("Party Finder", 5,5,-1); + GlStateManager.popMatrix(); + fr.drawString("Page "+page, (scrollablePanel.getBounds().width-fr.getStringWidth("Page "+page))/2, (20-fr.FONT_HEIGHT)/2 + fr.FONT_HEIGHT*2+21, -1); + } + + public synchronized void onChestUpdate(WindowUpdateEvent windowUpdateEvent) { + if (windowUpdateEvent == null) { + GuiChest guiChest = guiCustomPartyFinder.getGuiChest(); + if (guiChest == null) { + panelPartyListElementMap.clear(); + } else { + for (int x = 1; x<=7; x++) { + for (int y = 1; y <= 3; y++) { + int i = y * 9 + x; + Slot s = guiChest.inventorySlots.getSlot(i); + PanelPartyListElement prev = panelPartyListElementMap.remove(i); + if (s == null || !s.getHasStack()) { continue; } + if (!filter(s.getStack())) continue; + + if (prev == null) prev = new PanelPartyListElement(this, i); + panelPartyListElementMap.put(i, prev); + } + } + + { + Slot next = guiChest.inventorySlots.getSlot(9 * 2 + 8); + if (next.getStack() != null && next.getStack().getItem() == Items.arrow) { + this.next.setEnabled(true); + extractPage(next.getStack()); + } else { + this.next.setEnabled(false); + } + + Slot prev = guiChest.inventorySlots.getSlot(9 * 2 + 0); + if (prev.getStack() != null && prev.getStack().getItem() == Items.arrow) { + this.previous.setEnabled(true); + extractPage(prev.getStack()); + } else { + this.previous.setEnabled(false); + } + + Slot delist = guiChest.inventorySlots.getSlot(9 * 5 + 7); + panelPartyFinderSettings.setDelistable(delist.getStack() != null && delist.getStack().getItem() == Item.getItemFromBlock(Blocks.bookshelf)); + } + } + } else { + if (windowUpdateEvent.getPacketSetSlot() != null) { + int i = windowUpdateEvent.getPacketSetSlot().func_149173_d(); + + ItemStack stack = windowUpdateEvent.getPacketSetSlot().func_149174_e(); + if (i == 9*2+8) { + if (stack != null && stack.getItem() == Items.arrow) { + this.next.setEnabled(true); + extractPage(stack); + } else { + this.next.setEnabled(false); + } + } else if (i == 9*2) { + if (stack != null && stack.getItem() == Items.arrow) { + this.previous.setEnabled(true); + extractPage(stack); + } else { + this.previous.setEnabled(false); + } + } else if (i == 9*5+7) { + panelPartyFinderSettings.setDelistable(stack != null && stack.getItem() == Item.getItemFromBlock(Blocks.bookshelf)); + } + + if (i%9 == 0 || i%9 == 8 || i/9 == 0 || i/9 >= 4) { + return; + } + + PanelPartyListElement prev = panelPartyListElementMap.remove(i); + if (filter(stack)) { + if (prev == null) prev = new PanelPartyListElement(this, i); + panelPartyListElementMap.put(i, prev); + } + } else if (windowUpdateEvent.getWindowItems() != null) { + for (int x = 1; x<=7; x++) { + for (int y = 1; y <= 3; y++) { + int i = y * 9 + x; + ItemStack item = windowUpdateEvent.getWindowItems().getItemStacks()[i]; + PanelPartyListElement prev = panelPartyListElementMap.remove(i); + if (!filter(item)) continue; + + if (prev == null) prev = new PanelPartyListElement(this, i); + panelPartyListElementMap.put(i, prev); + } + } + + { + ItemStack next = windowUpdateEvent.getWindowItems().getItemStacks()[9 * 2 + 8]; + if (next != null && next.getItem() == Items.arrow) { + this.next.setEnabled(true); + extractPage(next); + } else { + this.next.setEnabled(false); + } + + ItemStack prev = windowUpdateEvent.getWindowItems().getItemStacks()[9 * 2]; + if (prev != null && prev.getItem() == Items.arrow) { + this.previous.setEnabled(true); + extractPage(prev); + } else { + this.previous.setEnabled(false); + } + + ItemStack delist = windowUpdateEvent.getWindowItems().getItemStacks()[9*5+7]; + panelPartyFinderSettings.setDelistable(delist != null && delist.getItem() == Item.getItemFromBlock(Blocks.bookshelf)); + } + } + } + + addItems(); + } + + public boolean filter(ItemStack item) { + return !(item == null || item.getItem() == null || item.getItem() == Item.getItemFromBlock(Blocks.air)) && panelPartyFinderSettings.filter(item); + } + + public void extractPage(ItemStack itemStack) { + NBTTagCompound stackTagCompound = itemStack.getTagCompound(); + if (stackTagCompound.hasKey("display", 10)) { + NBTTagCompound nbttagcompound = stackTagCompound.getCompoundTag("display"); + + if (nbttagcompound.getTagId("Lore") == 9) { + NBTTagList nbttaglist1 = nbttagcompound.getTagList("Lore", 8); + + for (int i = 0; i < nbttaglist1.tagCount(); i++) { + String str = nbttaglist1.getStringTagAt(i); + if (str.startsWith("§ePage ")) { + int pg = Integer.parseInt(str.substring(7)); + if (itemStack.getDisplayName().equals("§aPrevious Page")) page = pg+1; + else page = pg-1; + } + } + } + } + } + + public void addItems() { + for (MPanel childComponent : list.getChildComponents()) { + list.remove(childComponent); + } + for (Map.Entry<Integer, PanelPartyListElement> value : panelPartyListElementMap.entrySet()) { + list.add(value.getValue()); + } + scrollablePanel.evalulateContentArea(); + } +} 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 new file mode 100644 index 00000000..97c8eb40 --- /dev/null +++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/PanelPartyFinderSettings.java @@ -0,0 +1,223 @@ +/* + * 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 <https://www.gnu.org/licenses/>. + */ + +package kr.syeyoung.dungeonsguide.features.impl.party.customgui; + +import kr.syeyoung.dungeonsguide.gui.MPanel; +import kr.syeyoung.dungeonsguide.gui.elements.MButton; +import kr.syeyoung.dungeonsguide.gui.elements.MPassiveLabelAndElement; +import kr.syeyoung.dungeonsguide.gui.elements.MTextField; +import kr.syeyoung.dungeonsguide.gui.elements.MToggleButton; +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.inventory.GuiChest; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.init.Items; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.EnumChatFormatting; + +import java.awt.*; +import java.util.List; + +public class PanelPartyFinderSettings extends MPanel { + private PanelPartyFinder panelPartyFinder; + + private MButton refresh = new MButton(), createNew = new MButton(), settings = new MButton(); + private MPassiveLabelAndElement filterCantjoin, filterWhitelistNote, filterBlacklistNote, plaeHighlightNote; private MToggleButton filterCantjoinButton; + private MTextField filterWhitelist, filterBlacklist, highlightNote; + + @Getter @Setter + boolean delistable = false; + + public void setDelistable(boolean delistable) { + createNew.setText(delistable ? "De-list" : "Create New"); + this.delistable = delistable; + } + + public PanelPartyFinderSettings(PanelPartyFinder panelPartyFinder) { + this.panelPartyFinder = panelPartyFinder; + + createNew.setText("Create New"); + createNew.setOnActionPerformed(this::createNew); + createNew.setBackground(0xFF00838F); + createNew.setHover(0xFF00ACC1); + createNew.setClicked(0xFF0097A7); + add(createNew); + refresh.setText("Refresh"); + refresh.setOnActionPerformed(this::refresh); + add(refresh); + settings.setText("Search Settings"); + settings.setOnActionPerformed(this::settings); + add(settings); + + { + filterCantjoinButton = new MToggleButton(); + filterCantjoin = new MPassiveLabelAndElement("Filter Unjoinable", filterCantjoinButton); + filterCantjoin.setDivideRatio(0.7); + filterCantjoinButton.setOnToggle(() -> panelPartyFinder.onChestUpdate(null)); + add(filterCantjoin); + } + { + filterWhitelist = new MTextField() { + @Override + public void edit(String str) { + panelPartyFinder.onChestUpdate(null); + } + }; + filterBlacklist = new MTextField() { + @Override + public void edit(String str) { + panelPartyFinder.onChestUpdate(null); + } + }; + highlightNote = new MTextField(); + + filterWhitelistNote = new MPassiveLabelAndElement("Whitelist Note", filterWhitelist); + filterBlacklistNote = new MPassiveLabelAndElement("Blacklist Note", filterBlacklist); + plaeHighlightNote = new MPassiveLabelAndElement("Highlight Note (Regex)", highlightNote); + + filterWhitelistNote.setDivideRatio(0.5); + filterBlacklistNote.setDivideRatio(0.5); + plaeHighlightNote.setDivideRatio(0.5); + add(filterWhitelistNote); + add(filterBlacklistNote); + add(plaeHighlightNote); + } + } + + private void createNew() { + GuiChest chest = panelPartyFinder.getGuiCustomPartyFinder().getGuiChest(); + if (delistable) + Minecraft.getMinecraft().playerController.windowClick(chest.inventorySlots.windowId, 9*5+7, 0, 0, Minecraft.getMinecraft().thePlayer); + else + Minecraft.getMinecraft().playerController.windowClick(chest.inventorySlots.windowId, 9*5+0, 0, 0, Minecraft.getMinecraft().thePlayer); + + } + + public String getHighlightText() { + return highlightNote.getText(); + } + + @Override + public void render(int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks, Rectangle scissor) { + FontRenderer fontRenderer = Minecraft.getMinecraft().fontRendererObj; + + + GuiCustomPartyFinder guiCustomPartyFinder = panelPartyFinder.getGuiCustomPartyFinder(); + if (guiCustomPartyFinder.getGuiChest() == null) return; + Slot s = guiCustomPartyFinder.getGuiChest().inventorySlots.getSlot(9*5+5); + ItemStack itemStack = s.getStack(); + if (itemStack == null) return; + + String dungeon="", floor="", text=""; + { + NBTTagCompound stackTagCompound = itemStack.getTagCompound(); + if (stackTagCompound.hasKey("display", 10)) { + NBTTagCompound nbttagcompound = stackTagCompound.getCompoundTag("display"); + + if (nbttagcompound.getTagId("Lore") == 9) { + NBTTagList nbttaglist1 = nbttagcompound.getTagList("Lore", 8); + + for (int i = 0; i < nbttaglist1.tagCount(); i++) { + String str = nbttaglist1.getStringTagAt(i); + if (str.startsWith("§aDungeon: ")) { + dungeon = str.substring(11); + } else if (str.startsWith("§aFloor: ")) { + floor = str.substring(9); + } else if (str.startsWith("§aSearch text: ")) { + text = str.substring(15); + } + } + } + } + } + fontRenderer.drawString("§aSearching: "+dungeon+" §7- "+floor, 5,155,-1); + fontRenderer.drawString("§aSearch text: "+text, 5,155+fontRenderer.FONT_HEIGHT,-1); + + Gui.drawRect(0,160+fontRenderer.FONT_HEIGHT*2,getBounds().width, 161+fontRenderer.FONT_HEIGHT*2, -1); + GlStateManager.translate(5,165+fontRenderer.FONT_HEIGHT*2,0); + + s = guiCustomPartyFinder.getGuiChest().inventorySlots.getSlot(9*5+8); + itemStack = s.getStack(); + if (itemStack == null || itemStack.getItem() != Items.skull) return; + + List<String> list = itemStack.getTooltip(Minecraft.getMinecraft().thePlayer, Minecraft.getMinecraft().gameSettings.advancedItemTooltips); + for (int i = 0; i < list.size(); ++i) { + if (i == 0) { + list.set(i, itemStack.getRarity().rarityColor + list.get(i)); + } else { + list.set(i, EnumChatFormatting.GRAY + list.get(i)); + } + } + for (int i = 0; i < list.size(); i++) { + fontRenderer.drawString(list.get(i), 0, (i)*fontRenderer.FONT_HEIGHT, -1); + } + } + + public void refresh() { + GuiChest chest = panelPartyFinder.getGuiCustomPartyFinder().getGuiChest(); + Minecraft.getMinecraft().playerController.windowClick(chest.inventorySlots.windowId, 9*5+1, 0, 0, Minecraft.getMinecraft().thePlayer); + } + public void settings() { + GuiChest chest = panelPartyFinder.getGuiCustomPartyFinder().getGuiChest(); + Minecraft.getMinecraft().playerController.windowClick(chest.inventorySlots.windowId, 9*5+5, 0, 0, Minecraft.getMinecraft().thePlayer); + } + + @Override + public void setBounds(Rectangle bounds) { + super.setBounds(bounds); + refresh.setBounds(new Rectangle(5,5,(bounds.width-10)/2,20)); + createNew.setBounds(new Rectangle(bounds.width/2,5,(bounds.width-10)/2,20)); + filterCantjoin.setBounds(new Rectangle(5,30,bounds.width-10,20)); + filterWhitelistNote.setBounds(new Rectangle(5,55,bounds.width-10,20)); + filterBlacklistNote.setBounds(new Rectangle(5,80,bounds.width-10,20)); + plaeHighlightNote.setBounds(new Rectangle(5,105,bounds.width-10,20)); + settings.setBounds(new Rectangle(5,130,bounds.width-10,20)); + } + + public boolean filter(ItemStack itemStack) { + NBTTagCompound stackTagCompound = itemStack.getTagCompound(); + String note = ""; + if (stackTagCompound.hasKey("display", 10)) { + NBTTagCompound nbttagcompound = stackTagCompound.getCompoundTag("display"); + + if (nbttagcompound.getTagId("Lore") == 9) { + NBTTagList nbttaglist1 = nbttagcompound.getTagList("Lore", 8); + + for (int i = 0; i < nbttaglist1.tagCount(); i++) { + String str = nbttaglist1.getStringTagAt(i); + if (str.startsWith("§cRequires ") && filterCantjoinButton.isEnabled()) return false; + if (str.startsWith("§7§7Note:")) { + note = str.substring(12); + } + } + } + } + + if (!filterBlacklist.getText().isEmpty() && note.toLowerCase().contains(filterBlacklist.getText().toLowerCase())) return false; + if (!filterWhitelist.getText().isEmpty() && !note.toLowerCase().contains(filterWhitelist.getText().toLowerCase())) return false; + + return true; + } +} diff --git a/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/PanelPartyListElement.java b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/PanelPartyListElement.java new file mode 100644 index 00000000..c0925a1e --- /dev/null +++ b/src/main/java/kr/syeyoung/dungeonsguide/features/impl/party/customgui/PanelPartyListElement.java @@ -0,0 +1,197 @@ +/* + * 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 <https://www.gnu.org/licenses/>. + */ + +package kr.syeyoung.dungeonsguide.features.impl.party.customgui; + +import kr.syeyoung.dungeonsguide.config.guiconfig.MParameter; +import kr.syeyoung.dungeonsguide.features.FeatureParameter; +import kr.syeyoung.dungeonsguide.gui.MPanel; +import kr.syeyoung.dungeonsguide.gui.elements.MTooltip; +import kr.syeyoung.dungeonsguide.gui.elements.MTooltipText; +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.inventory.GuiChest; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.Slot; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.EnumChatFormatting; + +import java.awt.*; +import java.util.Arrays; +import java.util.List; + +public class PanelPartyListElement extends MPanel { + private PanelPartyFinder panelPartyFinder; + private int slot; + + public PanelPartyListElement(PanelPartyFinder panelPartyFinder, int slot) { + this.panelPartyFinder = panelPartyFinder; + this.slot = slot; + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(-1, 32); + } + + private MTooltip mTooltip; + + @Override + public void render(int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks, Rectangle scissor) { + GuiCustomPartyFinder guiCustomPartyFinder = panelPartyFinder.getGuiCustomPartyFinder(); + if (guiCustomPartyFinder.getGuiChest() == null) return; + Slot s = guiCustomPartyFinder.getGuiChest().inventorySlots.getSlot(slot); + ItemStack itemStack = s.getStack(); + if (itemStack == null) return; + + + int color = RenderUtils.blendAlpha(0x141414, 0.0f); + + String note = ""; + boolean cantjoin = false; + if (itemStack.getItem() == Item.getItemFromBlock(Blocks.bedrock)) cantjoin = true; + int minClass = -1, minDungeon = -1; + { + NBTTagCompound stackTagCompound = itemStack.getTagCompound(); + if (stackTagCompound.hasKey("display", 10)) { + NBTTagCompound nbttagcompound = stackTagCompound.getCompoundTag("display"); + + if (nbttagcompound.getTagId("Lore") == 9) { + NBTTagList nbttaglist1 = nbttagcompound.getTagList("Lore", 8); + + for (int i = 0; i < nbttaglist1.tagCount(); i++) { + String str = nbttaglist1.getStringTagAt(i); + if (str.startsWith("§7§7Note:")) { + note = str.substring(12); + } else if (str.startsWith("§7Class Level Required: §b")) { + minClass = Integer.parseInt(str.substring(26)); + } else if (str.startsWith("§7Dungeon Level Required: §b")) { + minDungeon = Integer.parseInt(str.substring(28)); + } else if (str.startsWith("§cRequires ")) cantjoin = true; + } + } + } + } + + note = note.replaceAll("(?i)(S\\+)", "§6$1§r"); + note = note.replaceAll("(?i)(carry)", "§4$1§r"); + + try { + if (!panelPartyFinder.getHighlightNote().isEmpty()) + note = note.replaceAll("(?i)(" + panelPartyFinder.getHighlightNote() + ")", "§e§l$1§r"); + } catch (Exception e) {} + + if (cantjoin) {} + else if (clicked) { + color = RenderUtils.blendAlpha(0x141414, 0.10f); + } else if (lastAbsClip.contains(absMousex, absMousey)) { + color = RenderUtils.blendAlpha(0x141414, 0.12f); + } + if (cantjoin) {} + else if (note.contains("§e")) { + color = RenderUtils.blendTwoColors(color, 0x44FFFF00); + } else if (note.contains("§6")){ + color = RenderUtils.blendTwoColors(color, 0x44FFAA00); + } + Gui.drawRect(0,0,getBounds().width,getBounds().height,color); + + RenderItem renderItem= Minecraft.getMinecraft().getRenderItem(); + GlStateManager.pushMatrix(); + RenderHelper.disableStandardItemLighting(); + RenderHelper.enableGUIStandardItemLighting(); + GlStateManager.scale(2,2,1); + GlStateManager.enableCull(); + renderItem.renderItemAndEffectIntoGUI(itemStack, 0,0); + GlStateManager.popMatrix(); + + FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; + GlStateManager.pushMatrix(); + GlStateManager.translate(37,(32 - 2*fr.FONT_HEIGHT)/2,0); + GlStateManager.scale(2,2,1); + String name = itemStack.getDisplayName(); + if (name.contains("'")) + name = name.substring(0, name.indexOf("'")); + fr.drawString(name, 0,0,-1); + + fr.drawString(note, fr.getStringWidth("AAAAAAAAAAAAAAAAAA")+5, 0,-1); + GlStateManager.popMatrix(); + GlStateManager.pushMatrix(); + String sideNote = ""; + if (minClass != -1) sideNote = "§7CLv ≥§b"+minClass+" "; + if (minDungeon != -1) sideNote += "§7DLv ≥§b"+minDungeon+" "; + if (cantjoin) sideNote = "§cCan't join"; + sideNote = sideNote.trim(); + + GlStateManager.translate(getBounds().width,(32 - 2*fr.FONT_HEIGHT)/2,0); + GlStateManager.scale(2,2,0); + GlStateManager.translate(-fr.getStringWidth(sideNote), 0,0); + fr.drawString(sideNote, 0,0,-1); + + GlStateManager.popMatrix(); + if (lastAbsClip.contains(absMousex, absMousey) && (mTooltip == null || !mTooltip.isOpen())) { + if (mTooltip != null) mTooltip.close(); + List<String> list = itemStack.getTooltip(Minecraft.getMinecraft().thePlayer, Minecraft.getMinecraft().gameSettings.advancedItemTooltips); + for (int i = 0; i < list.size(); ++i) { + if (i == 0) { + list.set(i, itemStack.getRarity().rarityColor + list.get(i)); + } else { + list.set(i, EnumChatFormatting.GRAY + list.get(i)); + } + } + mTooltip = new MTooltipText(list); + mTooltip.open(this); + } else if (!lastAbsClip.contains(absMousex, absMousey)){ + if (mTooltip != null) + mTooltip.close(); + mTooltip = null; + } + } + + @Override + public void setParent(MPanel parent) { + super.setParent(parent); + if (parent == null && mTooltip != null) { + mTooltip.close(); + mTooltip = null; + } + } + + boolean clicked = false; + @Override + public void mouseClicked(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int mouseButton) { + if (lastAbsClip.contains(absMouseX, absMouseY)) { + clicked = true; + + GuiChest chest = panelPartyFinder.getGuiCustomPartyFinder().getGuiChest(); + Minecraft.getMinecraft().playerController.windowClick(chest.inventorySlots.windowId, slot, 0, 0, Minecraft.getMinecraft().thePlayer); + } + } + + @Override + public void mouseReleased(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int state) { + clicked = false; + } +} diff --git a/src/main/java/kr/syeyoung/dungeonsguide/gui/MGui.java b/src/main/java/kr/syeyoung/dungeonsguide/gui/MGui.java index 7c35306d..feef2848 100644 --- a/src/main/java/kr/syeyoung/dungeonsguide/gui/MGui.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/gui/MGui.java @@ -78,8 +78,8 @@ public class MGui extends GuiScreen { mainPanel.keyTyped0(typedChar, keyCode); super.keyTyped(typedChar, keyCode); } catch (Throwable e) { - if (!e.getMessage().contains("hack to stop")) - e.printStackTrace(); + if (e.getMessage() == null || !e.getMessage().contains("hack to stop")) + e.printStackTrace(); } } @@ -90,7 +90,7 @@ public class MGui extends GuiScreen { mainPanel.mouseClicked0(mouseX, mouseY ,mouseX, mouseY, mouseButton); } catch (Throwable e) { - if (!e.getMessage().contains("hack to stop")) + if (e.getMessage() == null || !e.getMessage().contains("hack to stop")) e.printStackTrace(); } } @@ -106,7 +106,7 @@ public class MGui extends GuiScreen { mainPanel.mouseReleased0(mouseX, mouseY ,mouseX,mouseY , state); } catch (Throwable e) { - if (!e.getMessage().contains("hack to stop")) + if (e.getMessage() == null || !e.getMessage().contains("hack to stop")) e.printStackTrace(); } } @@ -117,7 +117,7 @@ public class MGui extends GuiScreen { mainPanel.mouseClickMove0(mouseX, mouseY ,mouseX ,mouseY, clickedMouseButton, timeSinceLastClick); } catch (Throwable e) { - if (!e.getMessage().contains("hack to stop")) + if (e.getMessage() == null || !e.getMessage().contains("hack to stop")) e.printStackTrace(); } } diff --git a/src/main/java/kr/syeyoung/dungeonsguide/gui/MPanel.java b/src/main/java/kr/syeyoung/dungeonsguide/gui/MPanel.java index 319a7af8..a91cb6c6 100644 --- a/src/main/java/kr/syeyoung/dungeonsguide/gui/MPanel.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/gui/MPanel.java @@ -88,7 +88,7 @@ public class MPanel { public void add(MPanel child) { if (child.parent != null) throw new IllegalArgumentException("What have you done"); this.childComponents.add(child); - child.parent = this; + child.setParent(this); } public void openTooltip(MTooltip mPanel) { @@ -99,7 +99,7 @@ public class MPanel { } public void remove(MPanel panel) { - panel.parent = null; + panel.setParent(null); this.childComponents.remove(panel); } diff --git a/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MButton.java b/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MButton.java index d30b82c9..da2ff78c 100755 --- a/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MButton.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MButton.java @@ -37,9 +37,10 @@ public class MButton extends MPanel { private String text; private Color foreground = Color.white; - private Color hover = Color.gray; - private Color clicked = Color.lightGray; - private Color disabled = Color.darkGray; + private int background = RenderUtils.blendAlpha(0xFF141414, 0.08f); + private int hover = RenderUtils.blendAlpha(0xFF141414, 0.14f); + private int clicked = RenderUtils.blendAlpha(0xFF141414, 0.16f); + private int disabled =0xFF141414; private boolean enabled = true; @@ -49,14 +50,15 @@ public class MButton extends MPanel { public void render(int absMousex, int absMousey, int relMousex0, int relMousey0, float partialTicks, Rectangle clip) { Dimension bounds = getSize(); - Color bg = backgroundColor; + int bg = background; if (!enabled) { bg = disabled; + } else if (isclicked) { + bg = clicked; } else if (new Rectangle(new Point(0,0),bounds).contains(relMousex0, relMousey0)) { bg = hover; } - if (bg != null) - Gui.drawRect(0,0,getBounds().width, getBounds().height, bg.getRGB()); + Gui.drawRect(0,0,getBounds().width, getBounds().height, bg); FontRenderer renderer = Minecraft.getMinecraft().fontRendererObj; int width = renderer.getStringWidth(getText()); @@ -69,9 +71,18 @@ public class MButton extends MPanel { renderer.drawString(getText(), x,y, foreground.getRGB()); } + boolean isclicked = false; @Override public void mouseClicked(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int mouseButton) { - if (onActionPerformed != null && lastAbsClip.contains(absMouseX, absMouseY)) - onActionPerformed.run(); + if (lastAbsClip.contains(absMouseX, absMouseY)) { + isclicked = true; + if (onActionPerformed != null) + onActionPerformed.run(); + } + } + + @Override + public void mouseReleased(int absMouseX, int absMouseY, int relMouseX, int relMouseY, int state) { + isclicked = false; } } diff --git a/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MList.java b/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MList.java index de3e4b40..f6df0e19 100644 --- a/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MList.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MList.java @@ -51,7 +51,7 @@ public class MList extends MPanel { for (int i = 1; i < getChildComponents().size(); i++) { MPanel panel = getChildComponents().get(i); Rectangle bound = panel.getBounds(); - Gui.drawRect(0,bound.y - (gap/2), getBounds().width, bound.y - (gap/2)+1, gapLineColor); + Gui.drawRect(0, bound.y - gap, getBounds().width, bound.y, gapLineColor); } } diff --git a/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MPassiveLabelAndElement.java b/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MPassiveLabelAndElement.java index af29f92a..a90e40e5 100755 --- a/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MPassiveLabelAndElement.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MPassiveLabelAndElement.java @@ -34,6 +34,9 @@ public class MPassiveLabelAndElement extends MPanel { @Getter @Setter private Runnable onClick; + @Getter @Setter + private double divideRatio = 1/3.0; + public MPassiveLabelAndElement(String label, MPanel element) { this.add(this.label = new MLabel()); this.label.setText(label); @@ -62,7 +65,7 @@ public class MPassiveLabelAndElement extends MPanel { @Override public void onBoundsUpdate() { - label.setBounds(new Rectangle(0,0,getBounds().width / 3, getBounds().height)); - element.setBounds(new Rectangle(getBounds().width / 3,0,getBounds().width / 3 * 2, getBounds().height)); + label.setBounds(new Rectangle(0,0, (int) (getBounds().width * divideRatio), getBounds().height)); + element.setBounds(new Rectangle((int) (getBounds().width * divideRatio),0, (int) (getBounds().width * (1-divideRatio)), getBounds().height)); } } diff --git a/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MScrollablePanel.java b/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MScrollablePanel.java index ffdab32b..bdbf51d0 100644 --- a/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MScrollablePanel.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MScrollablePanel.java @@ -112,7 +112,7 @@ public class MScrollablePanel extends MPanel { } } - private void evalulateContentArea() { + public void evalulateContentArea() { if (contentArea.getChildComponents().size() == 0) { contentAreaDim= new Rectangle(0,0,0,0); return; diff --git a/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MTextField.java b/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MTextField.java index c26a1b21..a971cc30 100755 --- a/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MTextField.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/gui/elements/MTextField.java @@ -39,7 +39,7 @@ import java.io.IOException; public class MTextField extends MPanel { private final Color foreground = Color.white; - private String text = "asdasdasd"; + private String text = ""; private int cursorBlickTicker = 0; private int selectionStart = 0; |