diff options
| author | viciscat <51047087+viciscat@users.noreply.github.com> | 2024-05-18 15:07:38 +0200 |
|---|---|---|
| committer | viciscat <51047087+viciscat@users.noreply.github.com> | 2024-12-12 18:19:05 +0100 |
| commit | a6fdb3cd9f83e5a0586eccba115c6c59affa4bb1 (patch) | |
| tree | 3995cc3748b790d1a4b67e3208cda1fd30e135cc /src/main/java/de | |
| parent | b2fd8bdd04eb37e16cda183316159cf1483406be (diff) | |
| download | Skyblocker-a6fdb3cd9f83e5a0586eccba115c6c59affa4bb1.tar.gz Skyblocker-a6fdb3cd9f83e5a0586eccba115c6c59affa4bb1.tar.bz2 Skyblocker-a6fdb3cd9f83e5a0586eccba115c6c59affa4bb1.zip | |
progress I think
Diffstat (limited to 'src/main/java/de')
6 files changed, 220 insertions, 102 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/PreviewTab.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/PreviewTab.java new file mode 100644 index 00000000..65456c96 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/config/PreviewTab.java @@ -0,0 +1,54 @@ +package de.hysky.skyblocker.skyblock.tabhud.config; + +import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.ScreenRect; +import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; +import net.minecraft.client.gui.tab.Tab; +import net.minecraft.client.gui.widget.ClickableWidget; +import net.minecraft.text.Text; + +import java.util.function.Consumer; + +public class PreviewTab implements Tab { + + private final MinecraftClient client; + + public PreviewTab(MinecraftClient client) { + this.client = client; + } + + @Override + public Text getTitle() { + return Text.literal("Preview"); + } + + @Override + public void forEachChild(Consumer<ClickableWidget> consumer) { + + } + + @Override + public void refreshGrid(ScreenRect tabArea) { + + } + + public static class PreviewWidget extends ClickableWidget { + + public PreviewWidget(int x, int y, int width, int height, Text message) { + super(x, y, width, height, message); + } + + @Override + protected void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { + ScreenMaster.getScreenBuilder(Utils.getLocation()); + } + + @Override + protected void appendClickableNarrations(NarrationMessageBuilder builder) { + + } + } +} 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 3b999e18..4ea8c157 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 @@ -18,6 +18,11 @@ public class WidgetsConfigurationScreen extends Screen implements ScreenHandlerL private GenericContainerScreenHandler handler; private String titleLowercase; + private boolean tabPreview = false; + public boolean isPreviewVisible() { + return tabPreview; + } + // Tabs and stuff private final TabManager tabManager = new TabManager(this::addDrawableChild, this::remove); @Nullable @@ -68,6 +73,9 @@ public class WidgetsConfigurationScreen extends Screen implements ScreenHandlerL @Override public void onSlotUpdate(ScreenHandler handler, int slotId, ItemStack stack) { + if (slotId == 4) { + tabPreview = stack.isOf(Items.PLAYER_HEAD); + } if (widgetsOrderingTab == null) { if (slotId == 13) slotThirteenBacklog = stack.copy(); return; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java index 7290ecea..29e825d1 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java @@ -39,7 +39,7 @@ public class ScreenBuilder { // maps alias -> widget instance private final HashMap<String, HudWidget> objectMap = new HashMap<>(); - private final String builderName; + //private final String builderName; private final Map<String, Boolean> positioning = new Object2ObjectOpenHashMap<>(); @@ -48,7 +48,7 @@ public class ScreenBuilder { */ public ScreenBuilder(Identifier ident) { - try (BufferedReader reader = MinecraftClient.getInstance().getResourceManager().openAsReader(ident)) { + /*try (BufferedReader reader = MinecraftClient.getInstance().getResourceManager().openAsReader(ident)) { this.builderName = ident.getPath(); JsonObject json = JsonParser.parseReader(reader).getAsJsonObject(); @@ -73,7 +73,7 @@ public class ScreenBuilder { } catch (Exception ex) { // rethrow as unchecked exception so that I don't have to catch anything in the ScreenMaster throw new IllegalStateException("Failed to load file " + ident + ". Reason: " + ex.getMessage()); - } + }*/ } /** @@ -82,7 +82,7 @@ public class ScreenBuilder { */ public HudWidget instanceFrom(String name, JsonObject widget) { - // do widgets that require args the normal way + /*// do widgets that require args the normal way JsonElement arg; switch (name) { case "DungeonPlayerWidget" -> { @@ -124,7 +124,7 @@ public class ScreenBuilder { // load failed. if (clazz == null) { - throw new NoSuchElementException(builderName + "/[ERROR]: No such Widget type \"" + name + "\"!"); + throw new NoSuchElementException(builderName + "/[ERROR]: No such Widget type \"" + name + "\"!"); } // return instance of that class. @@ -132,9 +132,10 @@ public class ScreenBuilder { Constructor<?> ctor = clazz.getConstructor(); return (HudWidget) ctor.newInstance(); } catch (NoSuchMethodException | InstantiationException | IllegalAccessException - | IllegalArgumentException | InvocationTargetException | SecurityException ex) { + | IllegalArgumentException | InvocationTargetException | SecurityException ex) { throw new IllegalStateException(builderName + "/" + name + ": Internal error..."); - } + }*/ + return null; } /** @@ -149,7 +150,7 @@ public class ScreenBuilder { case "stack" -> new StackStage(this, descr); case "align" -> new AlignStage(this, descr); case "collideAgainst" -> new CollideStage(this, descr); - default -> throw new NoSuchElementException("No such op " + op + " as requested by " + this.builderName); + default -> throw new NoSuchElementException("No such op " + op + " as requested by "); }; } @@ -158,93 +159,124 @@ public class ScreenBuilder { */ public HudWidget getInstance(String name) { if (!this.objectMap.containsKey(name)) { - throw new NoSuchElementException("No widget with alias " + name + " in screen " + builderName); + throw new NoSuchElementException("No widget with alias " + name + " in screen "); } return this.objectMap.get(name); } - private static int totalWidth = 0; + private List<TabHudWidget> topAligned(int screenW, int screenH) { + List<TabHudWidget> affected = new ArrayList<>(); + List<TabHudWidget> unaffected = new ArrayList<>(); - private void topAligned(MatrixStack matrices, int screenW, int screenH) { - if (positionsNeedsUpdating) { + final int maxY = 300; + final int startY = 20; - positionsNeedsUpdating = false; - final int maxY = 300; - final int startY = 20; - - totalWidth = 0; - - int currentWidth = 0; - int currentY = startY; - for (TabHudWidget tabHudWidget : PlayerListMgr.widgetsToShow) { - if (positioning.getOrDefault(tabHudWidget.getInternalID(), false)) continue; - tabHudWidget.update(); - if (currentY + tabHudWidget.getHeight() > maxY) { - totalWidth += currentWidth + ScreenConst.WIDGET_PAD; - currentY = startY; - currentWidth = 0; - } - tabHudWidget.setPosition(totalWidth, currentY); - currentY += tabHudWidget.getHeight() + ScreenConst.WIDGET_PAD; - currentWidth = Math.max(currentWidth, tabHudWidget.getWidth()); + int totalWidth = 0; + + int currentWidth = 0; + int currentY = startY; + for (TabHudWidget tabHudWidget : PlayerListMgr.widgetsToShow) { + if (positioning.getOrDefault(tabHudWidget.getInternalID(), false)) { + unaffected.add(tabHudWidget); + continue; } - totalWidth += currentWidth; + affected.add(tabHudWidget); + + tabHudWidget.update(); + if (currentY + tabHudWidget.getHeight() > maxY) { + totalWidth += currentWidth + ScreenConst.WIDGET_PAD; + currentY = startY; + currentWidth = 0; + } + tabHudWidget.setPosition(totalWidth, currentY); + currentY += tabHudWidget.getHeight() + ScreenConst.WIDGET_PAD; + currentWidth = Math.max(currentWidth, tabHudWidget.getWidth()); } - matrices.translate((float) (screenW - totalWidth)/2, 0, 0); + totalWidth += currentWidth; + + // centering + int off = (screenW - totalWidth) / 2; + for (TabHudWidget tabHudWidget : affected) { + tabHudWidget.setX(tabHudWidget.getX() - off); + } + + return unaffected; + } - private void centered(MatrixStack matrices, int screenW, int screenH) { - if (positionsNeedsUpdating) { - positionsNeedsUpdating = false; - totalWidth = 0; - - final int maxY = Math.min(400, (int) (screenH*0.9f)); - // each column is a pair of a list of widgets for the rows and an int for the width of the column - List<ObjectIntPair<List<TabHudWidget>>> columns = new ArrayList<>(); - columns.add(new ObjectIntMutablePair<>(new ArrayList<>(), 0)); - - int currentY = 0; - int currentWidth = 0; - - for (TabHudWidget tabHudWidget : PlayerListMgr.widgetsToShow) { - if (positioning.getOrDefault(tabHudWidget.getInternalID(), false)) continue; - tabHudWidget.update(); - if (currentY + tabHudWidget.getHeight() > maxY) { - currentY = 0; - currentWidth = 0; - columns.add(new ObjectIntMutablePair<>(new ArrayList<>(), 0)); - } - tabHudWidget.setY(currentY); - currentY += tabHudWidget.getHeight() + ScreenConst.WIDGET_PAD; - currentWidth = Math.max(currentWidth, tabHudWidget.getWidth()); - columns.getLast().right(currentWidth); - columns.getLast().left().add(tabHudWidget); + private List<TabHudWidget> centered(int screenW, int screenH) { + List<TabHudWidget> affected = new ArrayList<>(); + List<TabHudWidget> unaffected = new ArrayList<>(); + + int totalWidth = 0; + + final int maxY = Math.min(400, (int) (screenH * 0.9f)); + // each column is a pair of a list of widgets for the rows and an int for the width of the column + List<ObjectIntPair<List<TabHudWidget>>> columns = new ArrayList<>(); + columns.add(new ObjectIntMutablePair<>(new ArrayList<>(), 0)); + + int currentY = 0; + int currentWidth = 0; + + for (TabHudWidget tabHudWidget : PlayerListMgr.widgetsToShow) { + if (positioning.getOrDefault(tabHudWidget.getInternalID(), false)) { + unaffected.add(tabHudWidget); + continue; } - for (int i = 0; i < columns.size(); i++) { - ObjectIntPair<List<TabHudWidget>> listObjectIntPair = columns.get(i); - int columnWidth = listObjectIntPair.rightInt(); - List<TabHudWidget> column = listObjectIntPair.left(); - - // calculate the height of the column - int height = (column.size() - 1) * ScreenConst.WIDGET_PAD; - for (TabHudWidget tabHudWidget : column) { - height += tabHudWidget.getHeight(); - } - // set x and y of the widgets! - int offset = (screenH - height) / 2; - for (TabHudWidget tabHudWidget : column) { - tabHudWidget.setY(tabHudWidget.getY() + offset); - if (i < columns.size() / 2) { - tabHudWidget.setX(totalWidth + columnWidth - tabHudWidget.getWidth()); - } else { - tabHudWidget.setX(totalWidth); - } + affected.add(tabHudWidget); + + tabHudWidget.update(); + // Too large to fit in column + if (currentY + tabHudWidget.getHeight() > maxY) { + currentY = 0; + currentWidth = 0; + columns.add(new ObjectIntMutablePair<>(new ArrayList<>(), 0)); + } + tabHudWidget.setY(currentY); + currentY += tabHudWidget.getHeight() + ScreenConst.WIDGET_PAD; + currentWidth = Math.max(currentWidth, tabHudWidget.getWidth()); + columns.getLast().right(currentWidth); + columns.getLast().left().add(tabHudWidget); + } + for (int i = 0; i < columns.size(); i++) { + ObjectIntPair<List<TabHudWidget>> listObjectIntPair = columns.get(i); + int columnWidth = listObjectIntPair.rightInt(); + List<TabHudWidget> column = listObjectIntPair.left(); + + // calculate the height of the column + int height = (column.size() - 1) * ScreenConst.WIDGET_PAD; + for (TabHudWidget tabHudWidget : column) { + height += tabHudWidget.getHeight(); + } + // set x and y of the widgets! + int offset = (screenH - height) / 2; + for (TabHudWidget tabHudWidget : column) { + tabHudWidget.setY(tabHudWidget.getY() + offset); + if (i < columns.size() / 2) { + tabHudWidget.setX(totalWidth + columnWidth - tabHudWidget.getWidth()); + } else { + tabHudWidget.setX(totalWidth); } - totalWidth += columnWidth + ScreenConst.WIDGET_PAD; } + totalWidth += columnWidth + ScreenConst.WIDGET_PAD; + } + + // Center everything + int off = (screenW - totalWidth) / 2; + for (TabHudWidget tabHudWidget : affected) { + tabHudWidget.setX(tabHudWidget.getX() - off); } - matrices.translate((float) (screenW - totalWidth)/2, 0, 0); + return unaffected; + } + + private void positionWidgets(int screenW, int screenH) { + List<TabHudWidget> unaffected; + if (false) { + unaffected = centered(screenW, screenH); + } else { + unaffected = topAligned(screenW, screenH); + } } /** @@ -255,20 +287,17 @@ public class ScreenBuilder { int i = 0; for (TabHudWidget value : PlayerListMgr.widgetInstances.values()) { context.drawText(MinecraftClient.getInstance().textRenderer, value.getHypixelWidgetName(), 0, i, PlayerListMgr.widgetsToShow.contains(value) ? Colors.LIGHT_YELLOW : -1, true); - i+=9; + i += 9; } - - - MatrixStack matrices = context.getMatrices(); - matrices.push(); - - centered(matrices, screenW, screenH); + if (positionsNeedsUpdating) { + positionsNeedsUpdating = false; + positionWidgets(screenW, screenH); + } for (HudWidget w : PlayerListMgr.widgetsToShow) { w.render(context); } - matrices.pop(); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java index 258a831e..2146d966 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java @@ -10,6 +10,7 @@ import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr; import de.hysky.skyblocker.skyblock.tabhud.util.PlayerLocator; import de.hysky.skyblocker.skyblock.tabhud.widget.HudWidget; import de.hysky.skyblocker.skyblock.tabhud.widget.TabHudWidget; +import de.hysky.skyblocker.utils.Location; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; import net.fabricmc.fabric.api.resource.ResourceManagerHelper; import net.fabricmc.fabric.api.resource.ResourcePackActivationType; @@ -39,6 +40,7 @@ public class ScreenMaster { private static final HashMap<String, ScreenBuilder> standardMap = new HashMap<>(); private static final HashMap<String, ScreenBuilder> screenAMap = new HashMap<>(); private static final HashMap<String, ScreenBuilder> screenBMap = new HashMap<>(); + private static final Map<Location, ScreenBuilder> builderMap = new HashMap<>(); /** * Load a screen mapping from an identifier @@ -59,6 +61,10 @@ public class ScreenMaster { } } + public static ScreenBuilder getScreenBuilder(Location location) { + return builderMap.computeIfAbsent(location, location1 -> new ScreenBuilder(new Identifier(""))); + } + /** * Top level render method. * Calls the appropriate ScreenBuilder with the screen's dimensions @@ -106,6 +112,7 @@ public class ScreenMaster { LOGGER.error("[Skyblocker] Failed to get instances of hud widgets", e); } }); + /* // WHY MUST IT ALWAYS BE SUCH NESTED GARBAGE MINECRAFT KEEP THAT IN DFU FFS @@ -165,6 +172,8 @@ public class ScreenMaster { } } }); + + */ } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java index 44946b5c..0e82d2a8 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/PlayerListMgr.java @@ -3,6 +3,7 @@ package de.hysky.skyblocker.skyblock.tabhud.util; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.mixins.accessors.PlayerListHudAccessor; +import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsConfigurationScreen; import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenBuilder; import de.hysky.skyblocker.skyblock.tabhud.widget.TabHudWidget; import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent; @@ -70,24 +71,30 @@ public class PlayerListMgr { playerStringList = playerList.stream().map(PlayerListEntry::getDisplayName).filter(Objects::nonNull).map(Text::getString).map(String::strip).toList(); } - Predicate<String> playersColumnPredicate = PLAYERS_COLUMN_PATTERN.asMatchPredicate(); - Predicate<String> infoColumnPredicate = INFO_COLUMN_PATTERN.asMatchPredicate(); + // TODO DUNGEONS CHECK + if (!(MinecraftClient.getInstance().currentScreen instanceof WidgetsConfigurationScreen widgetsConfigurationScreen && widgetsConfigurationScreen.isPreviewVisible())) { + updateWidgetsFrom(playerList.stream().map(PlayerListEntry::getDisplayName).filter(Objects::nonNull).toList()); + } + + + } + + public static void updateWidgetsFrom(List<Text> lines) { + final Predicate<String> playersColumnPredicate = PLAYERS_COLUMN_PATTERN.asMatchPredicate(); + final Predicate<String> infoColumnPredicate = INFO_COLUMN_PATTERN.asMatchPredicate(); widgetsToShow.clear(); boolean doingPlayers = false; boolean playersDone = false; String hypixelWidgetName = ""; List<Text> contents = new ArrayList<>(); - // TODO DUNGEONS CHECK - for (PlayerListEntry playerListEntry : playerList) { - Text displayName = playerListEntry.getDisplayName(); - if (displayName == null) continue; + for (Text displayName : lines) { String string = displayName.getString(); - if (string.isBlank()) continue; - if (!playersDone) { - // check if Players (number) + if (string.isBlank()) continue; + if (!playersDone) { + // check if Players (number) if (playersColumnPredicate.test(string)) { if (!doingPlayers) { doingPlayers = true; @@ -102,8 +109,8 @@ public class PlayerListMgr { contents.clear(); continue; } - } else { - if (infoColumnPredicate.test(string)) continue; + } else { + if (infoColumnPredicate.test(string)) continue; // New widget alert!!!! if (!string.startsWith(" ")) { if (!contents.isEmpty()) widgetsToShow.add(getTabHudWidget(hypixelWidgetName, contents)); @@ -113,10 +120,10 @@ public class PlayerListMgr { if (!nameAndInfo.right().getString().isBlank()) contents.add(trim(nameAndInfo.right())); continue; } - } + } // Add the line to the content - contents.add(trim(displayName)); - } + contents.add(trim(displayName)); + } if (!contents.isEmpty()) widgetsToShow.add(getTabHudWidget(hypixelWidgetName, contents)); ScreenBuilder.positionsNeedsUpdating = true; } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java index d095ad60..ea52d5a8 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java @@ -278,4 +278,15 @@ public abstract class HudWidget implements Element, Widget { public String getInternalID() { return internalID; } + + private boolean positioned = false; + + + public boolean isPositioned() { + return positioned; + } + + public void setPositioned(boolean positioned) { + this.positioned = positioned; + } } |
