aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de
diff options
context:
space:
mode:
authorviciscat <51047087+viciscat@users.noreply.github.com>2024-09-15 14:13:27 +0200
committerviciscat <51047087+viciscat@users.noreply.github.com>2024-12-12 18:21:01 +0100
commit929728f8a52447931a234c231ddca904ebb8564b (patch)
treeefb6f910d2b1d0baf19b561b10d914c4208515dd /src/main/java/de
parent6f94572314840d246546722003dd894a75d5ac76 (diff)
downloadSkyblocker-929728f8a52447931a234c231ddca904ebb8564b.tar.gz
Skyblocker-929728f8a52447931a234c231ddca904ebb8564b.tar.bz2
Skyblocker-929728f8a52447931a234c231ddca904ebb8564b.zip
Allow enabling widgets from the config screen, soon custom settings? idk
Diffstat (limited to 'src/main/java/de')
-rw-r--r--src/main/java/de/hysky/skyblocker/mixins/GenericContainerScreenHandlerMixin.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHudWidget.java24
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/end/EndHudWidget.java20
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java20
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsConfigurationScreen.java60
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsElementList.java53
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsListTab.java (renamed from src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsOrderingTab.java)134
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/WidgetEntry.java104
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/WidgetsListEntry.java51
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/BooleanSlotEntry.java (renamed from src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/BooleanEntry.java)8
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/DefaultSlotEntry.java (renamed from src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/DefaultEntry.java)8
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/EditableSlotEntry.java (renamed from src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/EditableEntry.java)8
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/WidgetSlotEntry.java79
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/entries/slot/WidgetsListSlotEntry.java25
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/preview/PreviewTab.java16
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java25
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/AlignStage.java83
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/CollideStage.java153
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PipelineStage.java14
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/PlaceStage.java94
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/StackStage.java114
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/pipeline/WidgetPositioner.java32
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java5
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ComponentBasedWidget.java21
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java49
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/TabHudWidget.java28
26 files changed, 520 insertions, 711 deletions
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<ItemStack> 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<Location> 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<Location> 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<Location> 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<WidgetEntry> 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<Location> 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<WidgetsListEntry> {
@@ -15,7 +22,23 @@ public class WidgetsElementList extends ElementListWidget<WidgetsListEntry> {
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<? extends Element> 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<WidgetsListEntry> {
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<Int2ObjectMap.Entry<WidgetsListSlotEntry>> 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/WidgetsOrderingTab.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsListTab.java
index 9ed827a5..97233c5d 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsOrderingTab.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/WidgetsListTab.java
@@ -1,8 +1,12 @@
package de.hysky.skyblocker.skyblock.tabhud.config;
-import de.hysky.skyblocker.skyblock.tabhud.config.entries.*;
+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;
@@ -12,26 +16,52 @@ 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.ArrayList;
+import java.util.Collection;
import java.util.List;
import java.util.function.Consumer;
// TODO: recommend disabling spacing and enabling wrapping
-public class WidgetsOrderingTab implements Tab {
+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 GenericContainerScreenHandler handler;
+ private @Nullable GenericContainerScreenHandler handler;
private final MinecraftClient client;
private boolean waitingForServer = false;
- public WidgetsOrderingTab(MinecraftClient client, GenericContainerScreenHandler handler) {
+ private final Int2ObjectMap<WidgetsListSlotEntry> entries = new Int2ObjectOpenHashMap<>();
+ private final List<WidgetEntry> widgetEntries = new ArrayList<>();
+ private boolean listNeedsUpdate = false;
+ private boolean shouldShowEntries = false;
+
+
+ public void setEntries(Collection<WidgetEntry> entries) {
+ this.widgetEntries.clear();
+ this.widgetEntries.addAll(entries);
+ }
+
+ public List<WidgetEntry> getWidgetEntries() {
+ return widgetEntries;
+ }
+
+ public boolean listNeedsUpdate() {
+ boolean b = listNeedsUpdate;
+ listNeedsUpdate = false;
+ return b;
+ }
+
+ public ObjectSet<Int2ObjectMap.Entry<WidgetsListSlotEntry>> 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;
@@ -48,6 +78,7 @@ public class WidgetsOrderingTab implements Tab {
nextPage = ButtonWidget.builder(Text.literal("Next Page"), button -> clickAndWaitForServer(53, 0))
.size(100, 15)
.build();
+ if (handler == null) back.visible = false;
}
@Override
@@ -65,14 +96,14 @@ public class WidgetsOrderingTab implements Tab {
}
public void clickAndWaitForServer(int slot, int button) {
- if (waitingForServer) return;
+ 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) return;
+ 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
@@ -82,6 +113,9 @@ public class WidgetsOrderingTab implements Tab {
public void updateHandler(GenericContainerScreenHandler newHandler) {
this.handler = newHandler;
+ back.visible = handler != null;
+ entries.clear();
+ listNeedsUpdate = true;
}
public void hopper(@Nullable List<Text> hopperTooltip) {
@@ -105,41 +139,49 @@ public class WidgetsOrderingTab implements Tab {
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<Text> 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));
- }
- }
+ 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<Text> 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) {
@@ -150,4 +192,12 @@ public class WidgetsOrderingTab implements Tab {
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 = shouldShowE