From 929728f8a52447931a234c231ddca904ebb8564b Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Sun, 15 Sep 2024 14:13:27 +0200 Subject: Allow enabling widgets from the config screen, soon custom settings? idk --- .../mixins/GenericContainerScreenHandlerMixin.java | 3 +- .../skyblock/dwarven/CrystalsHudWidget.java | 24 ++- .../skyblocker/skyblock/end/EndHudWidget.java | 20 +- .../skyblock/garden/FarmingHudWidget.java | 20 +- .../tabhud/config/WidgetsConfigurationScreen.java | 60 ++++-- .../skyblock/tabhud/config/WidgetsElementList.java | 53 ++++-- .../skyblock/tabhud/config/WidgetsListTab.java | 203 +++++++++++++++++++++ .../skyblock/tabhud/config/WidgetsOrderingTab.java | 153 ---------------- .../tabhud/config/entries/BooleanEntry.java | 46 ----- .../tabhud/config/entries/DefaultEntry.java | 50 ----- .../tabhud/config/entries/EditableEntry.java | 55 ------ .../tabhud/config/entries/WidgetEntry.java | 104 ++++------- .../tabhud/config/entries/WidgetsListEntry.java | 51 +++--- .../config/entries/slot/BooleanSlotEntry.java | 46 +++++ .../config/entries/slot/DefaultSlotEntry.java | 50 +++++ .../config/entries/slot/EditableSlotEntry.java | 55 ++++++ .../config/entries/slot/WidgetSlotEntry.java | 79 ++++++++ .../config/entries/slot/WidgetsListSlotEntry.java | 25 +++ .../skyblock/tabhud/config/preview/PreviewTab.java | 16 +- .../tabhud/screenbuilder/ScreenBuilder.java | 25 +-- .../tabhud/screenbuilder/pipeline/AlignStage.java | 83 --------- .../screenbuilder/pipeline/CollideStage.java | 153 ---------------- .../screenbuilder/pipeline/PipelineStage.java | 14 -- .../tabhud/screenbuilder/pipeline/PlaceStage.java | 94 ---------- .../tabhud/screenbuilder/pipeline/StackStage.java | 114 ------------ .../screenbuilder/pipeline/WidgetPositioner.java | 32 ++-- .../skyblock/tabhud/util/PlayerListMgr.java | 5 +- .../tabhud/widget/ComponentBasedWidget.java | 21 ++- .../skyblock/tabhud/widget/HudWidget.java | 49 ++++- .../skyblock/tabhud/widget/TabHudWidget.java | 28 ++- 30 files changed, 770 insertions(+), 961 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsListTab.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsOrderingTab.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/BooleanEntry.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/DefaultEntry.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/EditableEntry.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/BooleanSlotEntry.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/DefaultSlotEntry.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/EditableSlotEntry.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/WidgetSlotEntry.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/WidgetsListSlotEntry.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/AlignStage.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/CollideStage.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PipelineStage.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PlaceStage.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/StackStage.java (limited to 'src') diff --git a/src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java index e671406a..5ed4493a 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java @@ -42,13 +42,14 @@ public abstract class GenericContainerScreenHandlerMixin extends ScreenHandler { } case null, default -> {} } - onContentChanged(slots.get(slot).inventory); // this should be default behavior + sendContentUpdates(); } @Override public void updateSlotStacks(int revision, List stacks, ItemStack cursorStack) { super.updateSlotStacks(revision, stacks, cursorStack); ContainerSolverManager.markHighlightsDirty(); + sendContentUpdates(); if (MinecraftClient.getInstance().currentScreen instanceof PartyFinderScreen screen) { screen.markDirty(); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHudWidget.java index 01f591a0..122f6c6e 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHudWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHudWidget.java @@ -9,6 +9,7 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.Text; import net.minecraft.util.Identifier; import net.minecraft.util.math.RotationAxis; import org.joml.Vector2i; @@ -16,6 +17,7 @@ import org.joml.Vector2ic; import java.util.List; import java.util.Map; +import java.util.Set; @RegisterWidget public class CrystalsHudWidget extends HudWidget { @@ -66,12 +68,23 @@ public class CrystalsHudWidget extends HudWidget { return (clipped * 360f) / 16f; } - @Override - public boolean shouldRender(Location location) { + @Override + public Set availableLocations() { + return Set.of(Location.CRYSTAL_HOLLOWS); + } + + @Override + public boolean isEnabledIn(Location location) { return location.equals(Location.CRYSTAL_HOLLOWS) && SkyblockerConfigManager.get().mining.crystalsHud.enabled; } - public void update() { + @Override + public void setEnabledIn(Location location, boolean enabled) { + if (!location.equals(Location.CRYSTAL_HOLLOWS)) return; + SkyblockerConfigManager.get().mining.crystalsHud.enabled = enabled; + } + + public void update() { if (CLIENT.player == null || CLIENT.getNetworkHandler() == null || !SkyblockerConfigManager.get().mining.crystalsHud.enabled) return; @@ -134,4 +147,9 @@ public class CrystalsHudWidget extends HudWidget { context.drawTexture(RenderLayer::getGuiTextured, MAP_ICON, 0, 0, 2, 0, 5, 7, 8, 8); matrices.pop(); } + + @Override + public Text getDisplayName() { + return Text.of("Crystals HUD"); + } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java index d56a03ca..fdf5b785 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java @@ -18,6 +18,7 @@ import net.minecraft.util.Formatting; import java.text.NumberFormat; import java.util.Locale; import java.util.Optional; +import java.util.Set; @RegisterWidget public class EndHudWidget extends ComponentBasedWidget { @@ -48,11 +49,22 @@ public class EndHudWidget extends ComponentBasedWidget { this.update(); } @Override - public boolean shouldRender(Location location) { + public boolean isEnabledIn(Location location) { return location.equals(Location.THE_END) && SkyblockerConfigManager.get().otherLocations.end.hudEnabled; } - @Override + @Override + public void setEnabledIn(Location location, boolean enabled) { + if (!location.equals(Location.THE_END)) return; + SkyblockerConfigManager.get().otherLocations.end.hudEnabled = enabled; + } + + @Override + public Set availableLocations() { + return Set.of(Location.THE_END); + } + + @Override public void updateContent() { // Zealots if (SkyblockerConfigManager.get().otherLocations.end.zealotKillsEnabled) { @@ -80,8 +92,8 @@ public class EndHudWidget extends ComponentBasedWidget { } @Override - public String getNiceName() { - return "End Hud"; + public Text getDisplayName() { + return Text.literal("End Hud"); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java index 215956c5..47b28fcc 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java @@ -20,6 +20,7 @@ import net.minecraft.util.Formatting; import net.minecraft.util.math.MathHelper; import java.util.Map; +import java.util.Set; @RegisterWidget public class FarmingHudWidget extends ComponentBasedWidget { @@ -119,12 +120,23 @@ public class FarmingHudWidget extends ComponentBasedWidget { } @Override - public boolean shouldRender(Location location) { + public boolean isEnabledIn(Location location) { return location.equals(Location.GARDEN) && SkyblockerConfigManager.get().farming.garden.farmingHud.enableHud; } - @Override - public String getNiceName() { - return "Farming Hud"; + @Override + public void setEnabledIn(Location location, boolean enabled) { + if (!location.equals(Location.GARDEN)) return; + SkyblockerConfigManager.get().farming.garden.farmingHud.enableHud = enabled; + } + + @Override + public Set availableLocations() { + return Set.of(Location.GARDEN); + } + + @Override + public Text getDisplayName() { + return Text.literal("Farming HUD"); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsConfigurationScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsConfigurationScreen.java index 6e15a831..0b7029a6 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsConfigurationScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsConfigurationScreen.java @@ -1,9 +1,12 @@ package de.hysky.skyblocker.skyblock.tabhud.config; import com.mojang.logging.LogUtils; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.tabhud.config.entries.WidgetEntry; import de.hysky.skyblocker.skyblock.tabhud.config.preview.PreviewTab; import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster; import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr; +import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Location; import de.hysky.skyblocker.utils.Utils; @@ -73,7 +76,7 @@ public class WidgetsConfigurationScreen extends Screen implements ScreenHandlerL private final TabManager tabManager = new TabManager(this::addDrawableChild, this::remove); @Nullable private TabNavigationWidget tabNavigation; - private WidgetsOrderingTab widgetsOrderingTab; + private WidgetsListTab widgetsListTab; private boolean switchingToPopup = false; @@ -126,10 +129,12 @@ public class WidgetsConfigurationScreen extends Screen implements ScreenHandlerL .build(); previewTab.goToLayer(ScreenMaster.getScreenBuilder(currentLocation).getPositionRuleOrDefault(widgetsLayer).screenLayer()); } else { - widgetsOrderingTab = new WidgetsOrderingTab(this.client, this.handler); + widgetsListTab = new WidgetsListTab(this.client, this.handler); this.tabNavigation = TabNavigationWidget.builder(this.tabManager, this.width) - .tabs(this.widgetsOrderingTab, this.previewTab, previewDungeons) + .tabs(this.widgetsListTab, this.previewTab, previewDungeons) .build(); + widgetsListTab.setShouldShowEntries(titleLowercase.startsWith("widgets ")); + updateCustomWidgets(); } this.tabNavigation.selectTab(0, false); switchingToPopup = false; @@ -155,24 +160,40 @@ public class WidgetsConfigurationScreen extends Screen implements ScreenHandlerL handler.addListener(this); this.titleLowercase = titleLowercase; parseLocation(); - widgetsOrderingTab.updateHandler(handler); + widgetsListTab.updateHandler(handler); } + public void updateCustomWidgets() { + List entries = new ArrayList<>(); + for (HudWidget value : ScreenMaster.widgetInstances.values()) { + if (!value.availableLocations().contains(currentLocation)) continue; + entries.add(new WidgetEntry(value, currentLocation)); + } + widgetsListTab.setEntries(entries); + } + + public void setCurrentLocation(Location location) { + Location old = this.currentLocation; + currentLocation = location; + if (old != currentLocation) { + ScreenMaster.getScreenBuilder(currentLocation).backupPositioning(); + updateCustomWidgets(); + } + } + private void parseLocation() { - String trim = this.titleLowercase + boolean b = titleLowercase.startsWith("widgets "); + if (widgetsListTab != null) widgetsListTab.setShouldShowEntries(b); + String trim = this.titleLowercase .replace("widgets in", "") .replace("widgets on", "") .trim(); if (nameToLocation.containsKey(trim)) { - Location old = currentLocation; - currentLocation = nameToLocation.get(trim); - if (old != currentLocation) { - ScreenMaster.getScreenBuilder(currentLocation).backupPositioning(); - } + setCurrentLocation(nameToLocation.get(trim)); } else { //currentLocation = Utils.getLocation(); - if (this.titleLowercase.startsWith("widgets ")) + if (b) LOGGER.warn("[Skyblocker] Couldn't find location for {} (trimmed: {})", this.titleLowercase, trim); } } @@ -189,19 +210,19 @@ public class WidgetsConfigurationScreen extends Screen implements ScreenHandlerL if (slotId == 4) { tabPreview = stack.isOf(Items.PLAYER_HEAD); } - if (widgetsOrderingTab == null) { + if (widgetsListTab == null) { if (slotId == 13) slotThirteenBacklog = stack.copy(); return; } if (slotId == 13) { if (stack.isOf(Items.HOPPER)) { - widgetsOrderingTab.hopper(ItemUtils.getLore(stack)); + widgetsListTab.hopper(ItemUtils.getLore(stack)); } else { - widgetsOrderingTab.hopper(null); + widgetsListTab.hopper(null); } } - if (slotId > 9 && slotId < this.handler.getRows() * 9 - 9 || slotId == 45 || slotId == 53) { - widgetsOrderingTab.updateEntries(titleLowercase); + if (slotId > (titleLowercase.startsWith("tablist widgets") ? 9 : 18) && slotId < this.handler.getRows() * 9 - 9 || slotId == 45 || slotId == 53 || slotId == 50) { + widgetsListTab.onSlotChange(slotId, stack); } } @@ -209,8 +230,8 @@ public class WidgetsConfigurationScreen extends Screen implements ScreenHandlerL public void tick() { super.tick(); if (noHandler) return; - if (slotThirteenBacklog != null && widgetsOrderingTab != null) { - widgetsOrderingTab.hopper(ItemUtils.getLore(slotThirteenBacklog)); + if (slotThirteenBacklog != null && widgetsListTab != null) { + widgetsListTab.hopper(ItemUtils.getLore(slotThirteenBacklog)); slotThirteenBacklog = null; } if (!this.client.player.isAlive() || this.client.player.isRemoved()) { @@ -239,6 +260,7 @@ public class WidgetsConfigurationScreen extends Screen implements ScreenHandlerL } handler.removeListener(this); Scheduler.INSTANCE.schedule(PlayerListMgr::updateList, 1); + SkyblockerConfigManager.save(); } @Override @@ -250,7 +272,7 @@ public class WidgetsConfigurationScreen extends Screen implements ScreenHandlerL List locations = new ArrayList<>(List.of(Location.hudLocations())); locations.remove(Location.DUNGEON); // there's already a tab for that return new DropdownWidget<>(client, 0, 0, 50, 50, locations, location -> { - this.currentLocation = location; + setCurrentLocation(location); onLocationChanged.accept(location); }, locations.contains(currentLocation) ? currentLocation : Location.HUB); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsElementList.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsElementList.java index 6d587e74..804bc222 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsElementList.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsElementList.java @@ -1,12 +1,19 @@ package de.hysky.skyblocker.skyblock.tabhud.config; import de.hysky.skyblocker.skyblock.tabhud.config.entries.WidgetsListEntry; +import de.hysky.skyblocker.skyblock.tabhud.config.entries.slot.WidgetsListSlotEntry; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.IntComparators; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.Element; import net.minecraft.client.gui.widget.ElementListWidget; import net.minecraft.text.Text; import net.minecraft.util.Identifier; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; import java.util.Objects; public class WidgetsElementList extends ElementListWidget { @@ -15,7 +22,23 @@ public class WidgetsElementList extends ElementListWidget { static final Identifier MOVE_DOWN_HIGHLIGHTED_TEXTURE = Identifier.ofVanilla("transferable_list/move_down_highlighted"); static final Identifier MOVE_DOWN_TEXTURE = Identifier.ofVanilla("transferable_list/move_down"); - private final WidgetsOrderingTab parent; + static final WidgetsListEntry SEPARATOR = new WidgetsListEntry() { + + @Override + public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { + context.drawCenteredTextWithShadow(MinecraftClient.getInstance().textRenderer, Text.of("- Skyblocker Widgets -"), x + entryWidth / 2, y + (entryHeight - 9) / 2, 0xFFFFFF); + } + + @Override + public List children() { + return List.of(); + } + + @Override + public void drawBorder(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) {} + }; + + private final WidgetsListTab parent; private boolean rightUpArrowHovered = false; private boolean rightDownArrowHovered = false; private boolean leftUpArrowHovered = false; @@ -23,28 +46,30 @@ public class WidgetsElementList extends ElementListWidget { private int editingPosition = - 1; - public WidgetsElementList(WidgetsOrderingTab parent, MinecraftClient minecraftClient, int width, int height, int y) { + public WidgetsElementList(WidgetsListTab parent, MinecraftClient minecraftClient, int width, int height, int y) { super(minecraftClient, width, height, y, 32); this.parent = parent; } - - @Override - public void clearEntries() { - super.clearEntries(); - } - - @Override - public int addEntry(WidgetsListEntry entry) { - return super.addEntry(entry); - } - private int x, y, entryWidth, entryHeight; @Override public void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { + if (parent.listNeedsUpdate()) { + ArrayList> entries = new ArrayList<>(parent.getEntries()); + clearEntries(); + entries.stream() + .sorted((a, b) -> IntComparators.NATURAL_COMPARATOR.compare(a.getIntKey(), b.getIntKey())) + .map(Map.Entry::getValue) + .forEach(this::addEntry); + if (!parent.getWidgetEntries().isEmpty() && parent.shouldShowEntries()) { + if (!children().isEmpty()) addEntry(SEPARATOR); + parent.getWidgetEntries().forEach(this::addEntry); + } + setScrollAmount(getScrollAmount()); + } super.renderWidget(context, mouseX, mouseY, delta); - WidgetsListEntry hoveredEntry = getHoveredEntry(); + WidgetsListEntry hoveredEntry = getHoveredEntry(); if (hoveredEntry != null) hoveredEntry.renderTooltip(context, x, y, entryWidth, entryHeight, mouseX, mouseY); if (rightUpArrowHovered || rightDownArrowHovered) { context.drawTooltip(client.textRenderer, Text.literal("Move widget"), mouseX, mouseY); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsListTab.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsListTab.java new file mode 100644 index 00000000..97233c5d --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsListTab.java @@ -0,0 +1,203 @@ +package de.hysky.skyblocker.skyblock.tabhud.config; + +import de.hysky.skyblocker.skyblock.tabhud.config.entries.WidgetEntry; +import de.hysky.skyblocker.skyblock.tabhud.config.entries.slot.*; +import de.hysky.skyblocker.utils.ItemUtils; +import de.hysky.skyblocker.utils.scheduler.Scheduler; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectSet; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.ScreenRect; +import net.minecraft.client.gui.tab.Tab; +import net.minecraft.client.gui.tooltip.Tooltip; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.gui.widget.ClickableWidget; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.screen.GenericContainerScreenHandler; +import net.minecraft.screen.slot.SlotActionType; +import net.minecraft.text.Text; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.function.Consumer; + +// TODO: recommend disabling spacing and enabling wrapping +public class WidgetsListTab implements Tab { + private final WidgetsElementList widgetsElementList; + private final ButtonWidget back; + private final ButtonWidget previousPage; + private final ButtonWidget nextPage; + private final ButtonWidget thirdColumnButton; + private @Nullable GenericContainerScreenHandler handler; + private final MinecraftClient client; + private boolean waitingForServer = false; + + private final Int2ObjectMap entries = new Int2ObjectOpenHashMap<>(); + private final List widgetEntries = new ArrayList<>(); + private boolean listNeedsUpdate = false; + private boolean shouldShowEntries = false; + + + public void setEntries(Collection entries) { + this.widgetEntries.clear(); + this.widgetEntries.addAll(entries); + } + + public List getWidgetEntries() { + return widgetEntries; + } + + public boolean listNeedsUpdate() { + boolean b = listNeedsUpdate; + listNeedsUpdate = false; + return b; + } + + public ObjectSet> getEntries() { + return entries.int2ObjectEntrySet(); + } + + public WidgetsListTab(MinecraftClient client, @Nullable GenericContainerScreenHandler handler) { + widgetsElementList = new WidgetsElementList(this, client, 0, 0, 0); + this.client = client; + this.handler = handler; + back = ButtonWidget.builder(Text.literal("Back"), button -> clickAndWaitForServer(48, 0)) + .size(64, 15) + .build(); + thirdColumnButton = ButtonWidget.builder(Text.literal("3rd Column:"), button -> clickAndWaitForServer(50, 0)) + .size(120, 15) + .build(); + thirdColumnButton.setTooltip(Tooltip.of(Text.literal("It is recommended to have this enabled, to have more info be displayed!"))); + previousPage = ButtonWidget.builder(Text.literal("Previous Page"), button -> clickAndWaitForServer(45, 0)) + .size(100, 15) + .build(); + nextPage = ButtonWidget.builder(Text.literal("Next Page"), button -> clickAndWaitForServer(53, 0)) + .size(100, 15) + .build(); + if (handler == null) back.visible = false; + } + + @Override + public Text getTitle() { + return Text.literal("Widgets"); + } + + @Override + public void forEachChild(Consumer consumer) { + consumer.accept(back); + consumer.accept(previousPage); + consumer.accept(nextPage); + consumer.accept(thirdColumnButton); + consumer.accept(widgetsElementList); + } + + public void clickAndWaitForServer(int slot, int button) { + if (waitingForServer || handler == null) return; + if (client.interactionManager == null || this.client.player == null) return; + client.interactionManager.clickSlot(handler.syncId, slot, button, SlotActionType.PICKUP, this.client.player); + waitingForServer = true; + } + + public void shiftClickAndWaitForServer(int slot, int button) { + if (waitingForServer || handler == null) return; + if (client.interactionManager == null || this.client.player == null) return; + client.interactionManager.clickSlot(handler.syncId, slot, button, SlotActionType.QUICK_MOVE, this.client.player); + // When moving a widget down it gets stuck sometimes + Scheduler.INSTANCE.schedule(() -> this.waitingForServer = false, 1); + waitingForServer = true; + } + + public void updateHandler(GenericContainerScreenHandler newHandler) { + this.handler = newHandler; + back.visible = handler != null; + entries.clear(); + listNeedsUpdate = true; + } + + public void hopper(@Nullable List hopperTooltip) { + if (hopperTooltip == null) { + widgetsElementList.setEditingPosition(-1); + return; + } + int start = -1; + int editing = 1; + for (int i = 0; i < hopperTooltip.size(); i++) { + Text text = hopperTooltip.get(i); + String string = text.getString(); + if (start == -1 && string.contains("▶")) { + start = i; + } + if (string.contains("(EDITING)")) { + editing = i; + break; + } + } + widgetsElementList.setEditingPosition(editing - start); + } + + public void onSlotChange(int slot, ItemStack stack) { + waitingForServer = false; + listNeedsUpdate = true; + switch (slot) { + case 45 -> {previousPage.visible = stack.isOf(Items.ARROW); return;} + case 53 -> {nextPage.visible = stack.isOf(Items.ARROW); return;} + case 50 -> { + thirdColumnButton.visible = stack.isOf(Items.BOOKSHELF) || stack.isOf(Items.STONE_BUTTON); + if (thirdColumnButton.visible) { + if (stack.isOf(Items.STONE_BUTTON)) + thirdColumnButton.setMessage(Text.literal("Apply to all locations")); + else if (ItemUtils.getLoreLineIf(stack, s -> s.contains("DISABLED")) == null) + thirdColumnButton.setMessage(Text.literal("3rd Column: ").append(WidgetsListSlotEntry.ENABLED_TEXT)); + else + thirdColumnButton.setMessage(Text.literal("3rd Column: ").append(WidgetsListSlotEntry.DISABLED_TEXT)); + } + return; + } + } + + if (stack.isEmpty() || stack.isOf(Items.BLACK_STAINED_GLASS_PANE)) { + entries.remove(slot); + return; + } + + + String lowerCase = stack.getName().getString().trim().toLowerCase(); + List lore = ItemUtils.getLore(stack); + String lastLowerCase = lore.getLast().getString().toLowerCase(); + + WidgetsListSlotEntry entry; + if (lowerCase.startsWith("widgets on") || lowerCase.startsWith("widgets in") || lastLowerCase.contains("click to edit") || stack.isOf(Items.RED_STAINED_GLASS_PANE)) { + entry = new EditableSlotEntry(this, slot, stack); + } else if (lowerCase.endsWith("widget")) { + entry = new WidgetSlotEntry(this, slot, stack); + } else if (lastLowerCase.contains("enable") || lastLowerCase.contains("disable")) { + entry = new BooleanSlotEntry(this, slot, stack); + } else { + entry = new DefaultSlotEntry(this, slot, stack); + } + entries.put(slot, entry); + + } + + @Override + public void refreshGrid(ScreenRect tabArea) { + back.setPosition(16, tabArea.getTop() + 4); + widgetsElementList.setY(tabArea.getTop()); + widgetsElementList.setDimensions(tabArea.width(), tabArea.height() - 20); + previousPage.setPosition(widgetsElementList.getRowLeft(), widgetsElementList.getBottom() + 4); + nextPage.setPosition(widgetsElementList.getScrollbarX() - 100, widgetsElementList.getBottom() + 4); + thirdColumnButton.setPosition(widgetsElementList.getScrollbarX() + 5, widgetsElementList.getBottom() + 4); + } + + public boolean shouldShowEntries() { + return shouldShowEntries; + } + + public void setShouldShowEntries(boolean shouldShowEntries) { + this.shouldShowEntries = shouldShowEntries; + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsOrderingTab.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsOrderingTab.java deleted file mode 100644 index 9ed827a5..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsOrderingTab.java +++ /dev/null @@ -1,153 +0,0 @@ -package de.hysky.skyblocker.skyblock.tabhud.config; - -import de.hysky.skyblocker.skyblock.tabhud.config.entries.*; -import de.hysky.skyblocker.utils.ItemUtils; -import de.hysky.skyblocker.utils.scheduler.Scheduler; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.ScreenRect; -import net.minecraft.client.gui.tab.Tab; -import net.minecraft.client.gui.tooltip.Tooltip; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.gui.widget.ClickableWidget; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.screen.GenericContainerScreenHandler; -import net.minecraft.screen.slot.Slot; -import net.minecraft.screen.slot.SlotActionType; -import net.minecraft.text.Text; -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.function.Consumer; - -// TODO: recommend disabling spacing and enabling wrapping -public class WidgetsOrderingTab implements Tab { - private final WidgetsElementList widgetsElementList; - private final ButtonWidget back; - private final ButtonWidget previousPage; - private final ButtonWidget nextPage; - private final ButtonWidget thirdColumnButton; - private GenericContainerScreenHandler handler; - private final MinecraftClient client; - private boolean waitingForServer = false; - - public WidgetsOrderingTab(MinecraftClient client, GenericContainerScreenHandler handler) { - widgetsElementList = new WidgetsElementList(this, client, 0, 0, 0); - this.client = client; - this.handler = handler; - back = ButtonWidget.builder(Text.literal("Back"), button -> clickAndWaitForServer(48, 0)) - .size(64, 15) - .build(); - thirdColumnButton = ButtonWidget.builder(Text.literal("3rd Column:"), button -> clickAndWaitForServer(50, 0)) - .size(120, 15) - .build(); - thirdColumnButton.setTooltip(Tooltip.of(Text.literal("It is recommended to have this enabled, to have more info be displayed!"))); - previousPage = ButtonWidget.builder(Text.literal("Previous Page"), button -> clickAndWaitForServer(45, 0)) - .size(100, 15) - .build(); - nextPage = ButtonWidget.builder(Text.literal("Next Page"), button -> clickAndWaitForServer(53, 0)) - .size(100, 15) - .build(); - } - - @Override - public Text getTitle() { - return Text.literal("Widgets"); - } - - @Override - public void forEachChild(Consumer consumer) { - consumer.accept(back); - consumer.accept(previousPage); - consumer.accept(nextPage); - consumer.accept(thirdColumnButton); - consumer.accept(widgetsElementList); - } - - public void clickAndWaitForServer(int slot, int button) { - if (waitingForServer) return; - if (client.interactionManager == null || this.client.player == null) return; - client.interactionManager.clickSlot(handler.syncId, slot, button, SlotActionType.PICKUP, this.client.player); - waitingForServer = true; - } - - public void shiftClickAndWaitForServer(int slot, int button) { - if (waitingForServer) return; - if (client.interactionManager == null || this.client.player == null) return; - client.interactionManager.clickSlot(handler.syncId, slot, button, SlotActionType.QUICK_MOVE, this.client.player); - // When moving a widget down it gets stuck sometimes - Scheduler.INSTANCE.schedule(() -> this.waitingForServer = false, 1); - waitingForServer = true; - } - - public void updateHandler(GenericContainerScreenHandler newHandler) { - this.handler = newHandler; - } - - public void hopper(@Nullable List hopperTooltip) { - if (hopperTooltip == null) { - widgetsElementList.setEditingPosition(-1); - return; - } - int start = -1; - int editing = 1; - for (int i = 0; i < hopperTooltip.size(); i++) { - Text text = hopperTooltip.get(i); - String string = text.getString(); - if (start == -1 && string.contains("▶")) { - start = i; - } - if (string.contains("(EDITING)")) { - editing = i; - break; - } - } - widgetsElementList.setEditingPosition(editing - start); - } - - public void updateEntries(String titleLowercase) { - waitingForServer = false; - widgetsElementList.clearEntries(); - for (int i = titleLowercase.equals("tablist widgets") ? 9: 18; i < handler.getRows() * 9 - 9; i++) { - Slot slot = handler.getSlot(i); - ItemStack stack = slot.getStack(); - if (stack.isEmpty() || stack.isOf(Items.BLACK_STAINED_GLASS_PANE)) continue; - String lowerCase = stack.getName().getString().trim().toLowerCase(); - List lore = ItemUtils.getLore(stack); - String lastLowerCase = lore.getLast().getString().toLowerCase(); - if (lowerCase.startsWith("widgets on") || lowerCase.startsWith("widgets in") || lastLowerCase.contains("click to edit") || stack.isOf(Items.RED_STAINED_GLASS_PANE)) { - widgetsElementList.addEntry(new EditableEntry(this, i, stack)); - } else if (lowerCase.endsWith("widget")) { - widgetsElementList.addEntry(new WidgetEntry(this, i, stack)); - } else if (lastLowerCase.contains("enable") || lastLowerCase.contains("disable")) { - widgetsElementList.addEntry(new BooleanEntry(this, i, stack)); - } else { - widgetsElementList.addEntry(new DefaultEntry(this, i, stack)); - } - } - // Force it to update the scrollbar (it is stupid) - widgetsElementList.setScrollAmount(widgetsElementList.getScrollAmount()); - previousPage.visible = handler.getRows() == 6 && handler.getSlot(45).getStack().isOf(Items.ARROW); - nextPage.visible = handler.getRows() == 6 && handler.getSlot(53).getStack().isOf(Items.ARROW); - thirdColumnButton.visible = handler.getRows() == 6 && (handler.getSlot(50).getStack().isOf(Items.BOOKSHELF) || handler.getSlot(50).getStack().isOf(Items.STONE_BUTTON)); - if (thirdColumnButton.visible) { - ItemStack stack = handler.getSlot(50).getStack(); - if (stack.isOf(Items.STONE_BUTTON)) - thirdColumnButton.setMessage(Text.literal("Apply to all locations")); - else if (ItemUtils.getLoreLineIf(stack, s -> s.contains("DISABLED")) == null) - thirdColumnButton.setMessage(Text.literal("3rd Column: ").append(WidgetsListEntry.ENABLED_TEXT)); - else - thirdColumnButton.setMessage(Text.literal("3rd Column: ").append(WidgetsListEntry.DISABLED_TEXT)); - } - } - - @Override - public void refreshGrid(ScreenRect tabArea) { - back.setPosition(16, tabArea.getTop() + 4); - widgetsElementList.setY(tabArea.getTop()); - widgetsElementList.setDimensions(tabArea.width(), tabArea.height() - 20); - previousPage.setPosition(widgetsElementList.getRowLeft(), widgetsElementList.getBottom() + 4); - nextPage.setPosition(widgetsElementList.getScrollbarX() - 100, widgetsElementList.getBottom() + 4); - thirdColumnButton.setPosition(widgetsElementList.getScrollbarX() + 5, widgetsElementList.getBottom() + 4); - } -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/BooleanEntry.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/BooleanEntry.java deleted file mode 100644 index c7567106..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/BooleanEntry.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.hysky.skyblocker.skyblock.tabhud.config.entries; - -import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsOrderingTab; -import de.hysky.skyblocker.utils.ItemUtils; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.Element; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; - -import java.util.List; - -public class BooleanEntry extends WidgetsListEntry { - - private final ButtonWidget enableButton; - - public BooleanEntry(WidgetsOrderingTab parent, int slotId, ItemStack icon) { - super(parent, slotId, icon); - boolean enabled = !ItemUtils.getLore(icon).getLast().getString().toLowerCase().contains("enable"); - enableButton = ButtonWidget.builder(enabled ? ENABLED_TEXT : DISABLED_TEXT, button -> this.parent.clickAndWaitForServer(this.slotId, 0)) - .size(64, 12) - .build(); - - } - - @Override - public void renderTooltip(DrawContext context, int x, int y, int entryWidth, int entryHeight, int mouseX, int mouseY) { - if (mouseX >= x && mouseX <= x + entryWidth - 70 && mouseY >= y && mouseY <= y + entryHeight) { - List lore = ItemUtils.getLore(icon); - context.drawTooltip(MinecraftClient.getInstance().textRenderer, lore.subList(0, Math.max(lore.size() - 2, 0)), mouseX, mouseY); - } - } - - @Override - public List children() { - return List.of(enableButton); - } - - @Override - public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { - renderIconAndText(context, y, x, entryHeight); - enableButton.setPosition(x + entryWidth - 70, y + (entryHeight - 12) / 2); - enableButton.render(context, mouseX, mouseY, tickDelta); - } -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/DefaultEntry.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/DefaultEntry.java deleted file mode 100644 index 635d3bf8..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/DefaultEntry.java +++ /dev/null @@ -1,50 +0,0 @@ -package de.hysky.skyblocker.skyblock.tabhud.config.entries; - -import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsOrderingTab; -import de.hysky.skyblocker.utils.ItemUtils; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.Element; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; - -import java.util.List; - -public class DefaultEntry extends WidgetsListEntry{ - - private final ButtonWidget leftClick; - private final ButtonWidget rightClick; - - public DefaultEntry(WidgetsOrderingTab parent, int slotId, ItemStack icon) { - super(parent, slotId, icon); - leftClick = ButtonWidget.builder(Text.literal("LEFT"),button -> this.parent.clickAndWaitForServer(this.slotId, 0)) - .size(32, 12) - .build(); - rightClick = ButtonWidget.builder(Text.literal("RIGHT"), button -> this.parent.clickAndWaitForServer(this.slotId, 1)) - .size(32, 12) - .build(); - } - - @Override - public void renderTooltip(DrawContext context, int x, int y, int entryWidth, int entryHeight, int mouseX, int mouseY) { - if (mouseX >= x && mouseX <= x + entryWidth - 80 && mouseY >= y && mouseY <= y + entryHeight) { - List lore = ItemUtils.getLore(icon); - context.drawTooltip(MinecraftClient.getInstance().textRenderer, lore, mouseX, mouseY); - } - } - - @Override - public List children() { - return List.of(leftClick, rightClick); - } - - @Override - public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { - renderIconAndText(context, y, x, entryHeight); - rightClick.setPosition(x + entryWidth - 40, y + (entryHeight - 12) / 2); - rightClick.render(context, mouseX, mouseY, tickDelta); - leftClick.setPosition(x + entryWidth - 80, y + (entryHeight - 12) / 2); - leftClick.render(context, mouseX, mouseY, tickDelta); - } -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/EditableEntry.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/EditableEntry.java deleted file mode 100644 index c56a608f..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/EditableEntry.java +++ /dev/null @@ -1,55 +0,0 @@ -package de.hysky.skyblocker.skyblock.tabhud.config.entries; - -import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsOrderingTab; -import de.hysky.skyblocker.utils.ItemUtils; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.Element; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.text.Text; -import net.minecraft.util.Colors; - -import java.util.List; - -public class EditableEntry extends WidgetsListEntry { - - private final ButtonWidget editButton; - private final boolean locked; - - public EditableEntry(WidgetsOrderingTab parent, int slotId, ItemStack icon) { - super(parent, slotId, icon); - editButton = ButtonWidget.builder(Text.literal("EDIT"), button -> this.parent.clickAndWaitForServer(this.slotId, 0)) - .size(32, 12) - .build(); - this.locked = ItemUtils.getLoreLineIf(icon, s -> s.startsWith("Click to edit")) == null || icon.isOf(Items.RED_STAINED_GLASS_PANE); - } - - @Override - public void renderTooltip(DrawContext context, int x, int y, int entryWidth, int entryHeight, int mouseX, int mouseY) { - if (mouseX >= x && mouseX <= x + entryWidth - 50 && mouseY >= y && mouseY <= y + entryHeight) { - List lore = ItemUtils.getLore(icon); - context.drawTooltip(MinecraftClient.getInstance().textRenderer, locked ? lore : lore.subList(0, Math.max(lore.size() - 2, 0)), mouseX, mouseY); - } - } - - @Override - public List children() { - return List.of(editButton); - } - - @Override - public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { - int textY = y + (entryHeight - 9) / 2; - TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; - renderIconAndText(context, y, x, entryHeight); - if (locked) { - context.drawText(textRenderer, "LOCKED", x + entryWidth - 50, textY, Colors.RED, true); - } else { - editButton.setPosition(x + entryWidth - 40, y + (entryHeight - 12) / 2); - editButton.render(context, mouseX, mouseY, tickDelta); - } - } -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/WidgetEntry.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/WidgetEntry.java index 33bf1c00..bb6e2c34 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/WidgetEntry.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/WidgetEntry.java @@ -1,79 +1,49 @@ package de.hysky.skyblocker.skyblock.tabhud.config.entries; -import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsOrderingTab; -import de.hysky.skyblocker.utils.ItemUtils; +import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; +import de.hysky.skyblocker.utils.Location; import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; -import net.minecraft.util.Colors; import java.util.List; public class WidgetEntry extends WidgetsListEntry { - private final ButtonWidget editButton; - private final State state; - private final ButtonWidget enableButton; - private final boolean alwaysEnabled; - public WidgetEntry(WidgetsOrderingTab parent, int slotId, ItemStack icon) { - super(parent, slotId, icon); - editButton = ButtonWidget.builder(Text.literal("EDIT"), button -> this.parent.clickAndWaitForServer(this.slotId, 1)) - .size(32, 12) - .build(); - - String string = icon.getName().getString().trim(); - if (string.startsWith("✔")) { - state = State.ENABLED; - } else if (string.startsWith("✖")) { - state = State.DISABLED; - } else state = State.LOCKED; - enableButton = ButtonWidget.builder(state.equals(State.ENABLED) ? ENABLED_TEXT : DISABLED_TEXT, button -> this.parent.clickAndWaitForServer(this.slotId, 0)) - .size(64, 12) - .build(); - alwaysEnabled = ItemUtils.getLoreLineIf(icon, s -> s.toLowerCase().contains("always enable")) != null; - - } - - - @Override - public void renderTooltip(DrawContext context, int x, int y, int entryWidth, int entryHeight, int mouseX, int mouseY) { - if (mouseX >= x && mouseX <= x + entryWidth - 110 && mouseY >= y && mouseY <= y + entryHeight) { - List lore = ItemUtils.getLore(icon); - context.drawTooltip(MinecraftClient.getInstance().textRenderer, state == State.LOCKED ? lore : lore.subList(0, Math.max(lore.size() - 3, 0)), mouseX, mouseY); - } - } - - @Override - public List children() { - return alwaysEnabled ? List.of(editButton) : List.of(editButton, enableButton); - } - - @Override - public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { - int textY = y + (entryHeight - 9) / 2; - TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; - renderIconAndText(context, y, x, entryHeight); - if (state != State.LOCKED) { - - editButton.setPosition(x + entryWidth - 40, y + (entryHeight - 12) / 2); - editButton.render(context, mouseX, mouseY, tickDelta); - - if (!alwaysEnabled) { - enableButton.setPosition(x + entryWidth - 110, y + (entryHeight - 12) / 2); - enableButton.render(context, mouseX, mouseY, tickDelta); - } - } else { - context.drawText(textRenderer, "LOCKED", x + entryWidth - 50, textY, Colors.RED, true); - } - } - - enum State { - ENABLED, - DISABLED, - LOCKED - } + private final HudWidget widget; + private final Location currentLocation; + private final ButtonWidget enableButton; + + public WidgetEntry(HudWidget widget, Location currentLocation) { + this.widget = widget; + this.currentLocation = currentLocation; + + boolean enabled = widget.isEnabledIn(currentLocation); + enableButton = ButtonWidget.builder(enabled ? ENABLED_TEXT : DISABLED_TEXT, button -> { + boolean enabledIn = this.widget.isEnabledIn(this.currentLocation); + this.widget.setEnabledIn(currentLocation, !enabledIn); + button.setMessage(!enabledIn ? ENABLED_TEXT : DISABLED_TEXT); + }) + .size(64, 12) + .build(); + } + + @Override + public void renderTooltip(DrawContext context, int x, int y, int entryWidth, int entryHeight, int mouseX, int mouseY) { + + } + + @Override + public List children() { + return List.of(enableButton); + } + + @Override + public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { + int textY = y + (entryHeight - 9) / 2; + enableButton.setPosition(x + entryWidth - 110, y + (entryHeight - 12) / 2); + enableButton.render(context, mouseX, mouseY, tickDelta); + context.drawTextWithShadow(MinecraftClient.getInstance().textRenderer, widget.getDisplayName(), x + 2, textY, -1); + } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/WidgetsListEntry.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/WidgetsListEntry.java index 20f732a5..cb324698 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/WidgetsListEntry.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/WidgetsListEntry.java @@ -1,6 +1,5 @@ package de.hysky.skyblocker.skyblock.tabhud.config.entries; -import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsOrderingTab; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; @@ -15,33 +14,25 @@ import java.util.List; public abstract class WidgetsListEntry extends ElementListWidget.Entry { - public static final Text ENABLED_TEXT = Text.literal("ENABLED").formatted(Formatting.GREEN); - public static final Text DISABLED_TEXT = Text.literal("DISABLED").formatted(Formatting.RED); - - protected final int slotId; - protected final WidgetsOrderingTab parent; - protected final ItemStack icon; - - public WidgetsListEntry(WidgetsOrderingTab parent, int slotId, ItemStack icon) { - this.parent = parent; - this.slotId = slotId; - this.icon = icon; - } - @Override - public List selectableChildren() { - return List.of(); - } - - public abstract void renderTooltip(DrawContext context, int x, int y, int entryWidth, int entryHeight, int mouseX, int mouseY); - - @Override - public void drawBorder(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { - if (hovered) context.drawBorder(x, y, entryWidth, entryHeight, -1); - } - - protected void renderIconAndText(DrawContext context, int y, int x, int entryHeight) { - TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; - context.drawItem(icon, x + 2, y + (entryHeight - 16) / 2); - context.drawText(textRenderer, icon.getName(), x + 20, y + (entryHeight - 9) / 2, Colors.WHITE, true); - } + public static final Text ENABLED_TEXT = Text.literal("ENABLED").formatted(Formatting.GREEN); + public static final Text DISABLED_TEXT = Text.literal("DISABLED").formatted(Formatting.RED); + + public void renderTooltip(DrawContext context, int x, int y, int entryWidth, int entryHeight, int mouseX, int mouseY) {} + + @Override + public void drawBorder(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { + if (hovered) context.drawBorder(x, y, entryWidth, entryHeight, -1); + } + + @Override + public List selectableChildren() { + return List.of(); + } + + protected void renderIconAndText(DrawContext context, ItemStack icon, int y, int x, int entryHeight) { + TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; + context.drawItem(icon, x + 2, y + (entryHeight - 16) / 2); + context.drawText(textRenderer, icon.getName(), x + 20, y + (entryHeight - 9) / 2, Colors.WHITE, true); + } + } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/BooleanSlotEntry.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/BooleanSlotEntry.java new file mode 100644 index 00000000..eb48cc22 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/BooleanSlotEntry.java @@ -0,0 +1,46 @@ +package de.hysky.skyblocker.skyblock.tabhud.config.entries.slot; + +import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsListTab; +import de.hysky.skyblocker.utils.ItemUtils; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; + +import java.util.List; + +public class BooleanSlotEntry extends WidgetsListSlotEntry { + + private final ButtonWidget enableButton; + + public BooleanSlotEntry(WidgetsListTab parent, int slotId, ItemStack icon) { + super(parent, slotId, icon); + boolean enabled = !ItemUtils.getLore(icon).getLast().getString().toLowerCase().contains("enable"); + enableButton = ButtonWidget.builder(enabled ? ENABLED_TEXT : DISABLED_TEXT, button -> this.parent.clickAndWaitForServer(this.slotId, 0)) + .size(64, 12) + .build(); + + } + + @Override + public void renderTooltip(DrawContext context, int x, int y, int entryWidth, int entryHeight, int mouseX, int mouseY) { + if (mouseX >= x && mouseX <= x + entryWidth - 70 && mouseY >= y && mouseY <= y + entryHeight) { + List lore = ItemUtils.getLore(icon); + context.drawTooltip(MinecraftClient.getInstance().textRenderer, lore.subList(0, Math.max(lore.size() - 2, 0)), mouseX, mouseY); + } + } + + @Override + public List children() { + return List.of(enableButton); + } + + @Override + public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { + renderIconAndText(context, y, x, entryHeight); + enableButton.setPosition(x + entryWidth - 70, y + (entryHeight - 12) / 2); + enableButton.render(context, mouseX, mouseY, tickDelta); + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/DefaultSlotEntry.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/DefaultSlotEntry.java new file mode 100644 index 00000000..e25ae91c --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/DefaultSlotEntry.java @@ -0,0 +1,50 @@ +package de.hysky.skyblocker.skyblock.tabhud.config.entries.slot; + +import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsListTab; +import de.hysky.skyblocker.utils.ItemUtils; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; + +import java.util.List; + +public class DefaultSlotEntry extends WidgetsListSlotEntry { + + private final ButtonWidget leftClick; + private final ButtonWidget rightClick; + + public DefaultSlotEntry(WidgetsListTab parent, int slotId, ItemStack icon) { + super(parent, slotId, icon); + leftClick = ButtonWidget.builder(Text.literal("LEFT"),button -> this.parent.clickAndWaitForServer(this.slotId, 0)) + .size(32, 12) + .build(); + rightClick = ButtonWidget.builder(Text.literal("RIGHT"), button -> this.parent.clickAndWaitForServer(this.slotId, 1)) + .size(32, 12) + .build(); + } + + @Override + public void renderTooltip(DrawContext context, int x, int y, int entryWidth, int entryHeight, int mouseX, int mouseY) { + if (mouseX >= x && mouseX <= x + entryWidth - 80 && mouseY >= y && mouseY <= y + entryHeight) { + List lore = ItemUtils.getLore(icon); + context.drawTooltip(MinecraftClient.getInstance().textRenderer, lore, mouseX, mouseY); + } + } + + @Override + public List children() { + return List.of(leftClick, rightClick); + } + + @Override + public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { + renderIconAndText(context, y, x, entryHeight); + rightClick.setPosition(x + entryWidth - 40, y + (entryHeight - 12) / 2); + rightClick.render(context, mouseX, mouseY, tickDelta); + leftClick.setPosition(x + entryWidth - 80, y + (entryHeight - 12) / 2); + leftClick.render(context, mouseX, mouseY, tickDelta); + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/EditableSlotEntry.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/EditableSlotEntry.java new file mode 100644 index 00000000..df15e9f2 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/EditableSlotEntry.java @@ -0,0 +1,55 @@ +package de.hysky.skyblocker.skyblock.tabhud.config.entries.slot; + +import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsListTab; +import de.hysky.skyblocker.utils.ItemUtils; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.text.Text; +import net.minecraft.util.Colors; + +import java.util.List; + +public class EditableSlotEntry extends WidgetsListSlotEntry { + + private final ButtonWidget editButton; + private final boolean locked; + + public EditableSlotEntry(WidgetsListTab parent, int slotId, ItemStack icon) { + super(parent, slotId, icon); + editButton = ButtonWidget.builder(Text.literal("EDIT"), button -> this.parent.clickAndWaitForServer(this.slotId, 0)) + .size(32, 12) + .build(); + this.locked = ItemUtils.getLoreLineIf(icon, s -> s.startsWith("Click to edit")) == null || icon.isOf(Items.RED_STAINED_GLASS_PANE); + } + + @Override + public void renderTooltip(DrawContext context, int x, int y, int entryWidth, int entryHeight, int mouseX, int mouseY) { + if (mouseX >= x && mouseX <= x + entryWidth - 50 && mouseY >= y && mouseY <= y + entryHeight) { + List lore = ItemUtils.getLore(icon); + context.drawTooltip(MinecraftClient.getInstance().textRenderer, locked ? lore : lore.subList(0, Math.max(lore.size() - 2, 0)), mouseX, mouseY); + } + } + + @Override + public List children() { + return List.of(editButton); + } + + @Override + public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { + int textY = y + (entryHeight - 9) / 2; + TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; + renderIconAndText(context, y, x, entryHeight); + if (locked) { + context.drawText(textRenderer, "LOCKED", x + entryWidth - 50, textY, Colors.RED, true); + } else { + editButton.setPosition(x + entryWidth - 40, y + (entryHeight - 12) / 2); + editButton.render(context, mouseX, mouseY, tickDelta); + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/WidgetSlotEntry.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/WidgetSlotEntry.java new file mode 100644 index 00000000..cd87e068 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/WidgetSlotEntry.java @@ -0,0 +1,79 @@ +package de.hysky.skyblocker.skyblock.tabhud.config.entries.slot; + +import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsListTab; +import de.hysky.skyblocker.utils.ItemUtils; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; +import net.minecraft.util.Colors; + +import java.util.List; + +public class WidgetSlotEntry extends WidgetsListSlotEntry { + private final ButtonWidget editButton; + private final State state; + private final ButtonWidget enableButton; + private final boolean alwaysEnabled; + + public WidgetSlotEntry(WidgetsListTab parent, int slotId, ItemStack icon) { + super(parent, slotId, icon); + editButton = ButtonWidget.builder(Text.literal("EDIT"), button -> this.parent.clickAndWaitForServer(this.slotId, 1)) + .size(32, 12) + .build(); + + String string = icon.getName().getString().trim(); + if (string.startsWith("✔")) { + state = State.ENABLED; + } else if (string.startsWith("✖")) { + state = State.DISABLED; + } else state = State.LOCKED; + enableButton = ButtonWidget.builder(state.equals(State.ENABLED) ? ENABLED_TEXT : DISABLED_TEXT, button -> this.parent.clickAndWaitForServer(this.slotId, 0)) + .size(64, 12) + .build(); + alwaysEnabled = ItemUtils.getLoreLineIf(icon, s -> s.toLowerCase().contains("always enable")) != null; + + } + + + @Override + public void renderTooltip(DrawContext context, int x, int y, int entryWidth, int entryHeight, int mouseX, int mouseY) { + if (mouseX >= x && mouseX <= x + entryWidth - 110 && mouseY >= y && mouseY <= y + entryHeight) { + List lore = ItemUtils.getLore(icon); + context.drawTooltip(MinecraftClient.getInstance().textRenderer, state == State.LOCKED ? lore : lore.subList(0, Math.max(lore.size() - 3, 0)), mouseX, mouseY); + } + } + + @Override + public List children() { + return alwaysEnabled ? List.of(editButton) : List.of(editButton, enableButton); + } + + @Override + public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { + int textY = y + (entryHeight - 9) / 2; + TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; + renderIconAndText(context, y, x, entryHeight); + if (state != State.LOCKED) { + + editButton.setPosition(x + entryWidth - 40, y + (entryHeight - 12) / 2); + editButton.render(context, mouseX, mouseY, tickDelta); + + if (!alwaysEnabled) { + enableButton.setPosition(x + entryWidth - 110, y + (entryHeight - 12) / 2); + enableButton.render(context, mouseX, mouseY, tickDelta); + } + } else { +