From 154fb46f12fc8c27b43e937928b8116235cc72db Mon Sep 17 00:00:00 2001 From: Shiewk Date: Sat, 23 Aug 2025 11:00:37 +0200 Subject: [PATCH] Add Inventory Widget (#3) --- .../widgets/client/WidgetsModClient.java | 1 + .../widgets/widgets/InventoryWidget.java | 218 ++++++++++++++++++ .../resources/assets/widgets/lang/de_de.json | 21 +- .../resources/assets/widgets/lang/en_us.json | 39 ++-- .../widgets/textures/vanilla_inventory.png | Bin 0 -> 643 bytes 5 files changed, 262 insertions(+), 17 deletions(-) create mode 100644 src/main/java/de/shiewk/widgets/widgets/InventoryWidget.java create mode 100644 src/main/resources/assets/widgets/textures/vanilla_inventory.png diff --git a/src/main/java/de/shiewk/widgets/client/WidgetsModClient.java b/src/main/java/de/shiewk/widgets/client/WidgetsModClient.java index 408c140..731de79 100644 --- a/src/main/java/de/shiewk/widgets/client/WidgetsModClient.java +++ b/src/main/java/de/shiewk/widgets/client/WidgetsModClient.java @@ -70,6 +70,7 @@ public class WidgetsModClient implements ClientModInitializer { WidgetManager.register(new BiomeWidget(Identifier.of(WidgetsMod.MOD_ID, "biome"))); WidgetManager.register(new SpeedWidget(Identifier.of(WidgetsMod.MOD_ID, "speed"))); WidgetManager.register(new ArmorHudWidget(Identifier.of(WidgetsMod.MOD_ID, "armor"))); + WidgetManager.register(new InventoryWidget(Identifier.of(WidgetsMod.MOD_ID, "inventory"))); ComboWidget comboWidget = new ComboWidget(Identifier.of(WidgetsMod.MOD_ID, "combo")); WidgetManager.register(comboWidget); diff --git a/src/main/java/de/shiewk/widgets/widgets/InventoryWidget.java b/src/main/java/de/shiewk/widgets/widgets/InventoryWidget.java new file mode 100644 index 0000000..6e3f216 --- /dev/null +++ b/src/main/java/de/shiewk/widgets/widgets/InventoryWidget.java @@ -0,0 +1,218 @@ +package de.shiewk.widgets.widgets; + +import de.shiewk.widgets.WidgetSettings; +import de.shiewk.widgets.widgets.settings.EnumWidgetSetting; +import de.shiewk.widgets.widgets.settings.IntSliderWidgetSetting; +import de.shiewk.widgets.widgets.settings.RGBAColorWidgetSetting; +import de.shiewk.widgets.widgets.settings.ToggleWidgetSetting; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gl.RenderPipelines; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import java.util.List; + +import static net.minecraft.text.Text.translatable; + +public class InventoryWidget extends ResizableWidget { + + private static final Identifier VANILLA_INVENTORY = Identifier.of("widgets", "textures/vanilla_inventory.png"); + private static final Identifier TEXTURE_PACK_INVENTORY = Identifier.ofVanilla("textures/gui/container/inventory.png"); + + public enum InventoryMode { + VANILLA, + TEXTURE_PACK, + TRANSPARENT(true), + GRID(true), + BOXES(true); + + public final boolean canDisableHotbar; + + InventoryMode(){ + this(false); + } + + InventoryMode(boolean canDisableHotbar){ + this.canDisableHotbar = canDisableHotbar; + } + + public Text display() { + return translatable("widgets.widgets.inventory.mode." + name().toLowerCase()); + } + } + + public InventoryWidget(Identifier id) { + super(id, List.of( + new EnumWidgetSetting<>("mode", translatable("widgets.widgets.inventory.mode"), InventoryMode.class, InventoryMode.TEXTURE_PACK, InventoryMode::display), + new ToggleWidgetSetting("show_hotbar", translatable("widgets.widgets.inventory.showHotbar"), true), + new ToggleWidgetSetting("rainbow_grid", translatable("widgets.widgets.inventory.rainbowGrid"), false), + new IntSliderWidgetSetting("grid_rainbow_speed", translatable("widgets.widgets.common.rainbow.speed"), 1, 3, 10), + new RGBAColorWidgetSetting("grid_color", translatable("widgets.widgets.inventory.gridColor"), 0, 0, 0, 255), + new ToggleWidgetSetting("rainbow_boxes", translatable("widgets.widgets.inventory.rainbowBoxes"), false), + new IntSliderWidgetSetting("box_rainbow_speed", translatable("widgets.widgets.common.rainbow.speed"), 1, 3, 10), + new RGBAColorWidgetSetting("box_color", translatable("widgets.widgets.inventory.boxColor"), 80, 80, 80, 128) + )); + getSettings().optionById("rainbow_grid").setShowCondition(() -> this.mode == InventoryMode.GRID); + getSettings().optionById("grid_rainbow_speed").setShowCondition(() -> this.mode == InventoryMode.GRID && this.rainbowGrid); + getSettings().optionById("grid_color").setShowCondition(() -> this.mode == InventoryMode.GRID && !this.rainbowGrid); + + getSettings().optionById("rainbow_boxes").setShowCondition(() -> this.mode == InventoryMode.BOXES); + getSettings().optionById("box_rainbow_speed").setShowCondition(() -> this.mode == InventoryMode.BOXES && this.rainbowBoxes); + getSettings().optionById("box_color").setShowCondition(() -> this.mode == InventoryMode.BOXES && !this.rainbowBoxes); + + getSettings().optionById("show_hotbar").setShowCondition(() -> this.mode.canDisableHotbar); + } + + private InventoryMode mode = InventoryMode.TEXTURE_PACK; + private PlayerInventory inventory; + + private boolean rainbowGrid = false; + private int gridColor = 0xff000000; + private int gridRainbowSpeed = 3; + + private boolean rainbowBoxes = false; + private int boxColor = 0xff000000; + private int boxRainbowSpeed = 3; + private boolean showHotbar = false; + + @Override + public void renderScaled(DrawContext context, long measuringTimeNano, TextRenderer textRenderer, int posX, int posY) { + drawBackground(context, measuringTimeNano, posX, posY); + if (inventory != null){ + drawItems(context, textRenderer, switch (mode){ + case VANILLA, TEXTURE_PACK -> posX+8; + case GRID -> posX+1; + case TRANSPARENT, BOXES -> posX; + }, switch (mode){ + case VANILLA, TEXTURE_PACK -> posY+9; + case GRID -> posY+1; + case TRANSPARENT, BOXES -> posY; + }); + } + } + + private void drawBackground(DrawContext context, long mt, int posX, int posY) { + switch (mode){ + case VANILLA -> context.drawTexture(RenderPipelines.GUI_TEXTURED, VANILLA_INVENTORY, posX, posY, 0, 0, 176, 91, 176, 91); + case TEXTURE_PACK -> { + context.enableScissor(posX, posY, posX + width(), posY + 6); + context.drawTexture(RenderPipelines.GUI_TEXTURED, TEXTURE_PACK_INVENTORY, posX, posY, 0, 0, 256, 256, 256, 256); + context.disableScissor(); + context.enableScissor(posX, posY + 6, posX + width(), posY + height()); + context.drawTexture(RenderPipelines.GUI_TEXTURED, TEXTURE_PACK_INVENTORY, posX, posY - 75, 0, 0, 256, 256, 256, 256); + context.disableScissor(); + } + case GRID -> { + int gridColor = rainbowGrid ? BasicTextWidget.rainbowColor(mt, gridRainbowSpeed) : this.gridColor; + context.drawHorizontalLine(posX, posX+width(), posY, gridColor); + context.drawHorizontalLine(posX, posX+width(), posY + 18, gridColor); + context.drawHorizontalLine(posX, posX+width(), posY + 36, gridColor); + context.drawHorizontalLine(posX, posX+width(), posY + 54, gridColor); + + if (showHotbar){ + context.drawHorizontalLine(posX, posX+width(), posY + 58, gridColor); + context.drawHorizontalLine(posX, posX+width(), posY + 76, gridColor); + } + + context.drawVerticalLine(posX, posY, posY+height(), gridColor); + context.drawVerticalLine(posX+18, posY, posY+height(), gridColor); + context.drawVerticalLine(posX+18*2, posY, posY+height(), gridColor); + context.drawVerticalLine(posX+18*3, posY, posY+height(), gridColor); + context.drawVerticalLine(posX+18*4, posY, posY+height(), gridColor); + context.drawVerticalLine(posX+18*5, posY, posY+height(), gridColor); + context.drawVerticalLine(posX+18*6, posY, posY+height(), gridColor); + context.drawVerticalLine(posX+18*7, posY, posY+height(), gridColor); + context.drawVerticalLine(posX+18*8, posY, posY+height(), gridColor); + context.drawVerticalLine(posX+18*9, posY, posY+height(), gridColor); + } + case BOXES -> { + int boxColor = rainbowBoxes ? ((BasicTextWidget.rainbowColor(mt, boxRainbowSpeed) & 0xffffff) | (this.boxColor & 0xff000000)) : this.boxColor; + for (int ry = 0; ry < 4; ry++) { + if (ry == 0 && !showHotbar) continue; + for (int rx = 0; rx < 9; rx++) { + + int itemY = ry == 0 ? posY + 58 : posY + (ry-1) * 18; + int itemX = posX + rx * 18; + + context.fill(itemX, itemY, itemX + 16, itemY + 16, boxColor); + } + } + } + } + } + + private void drawItems(DrawContext context, TextRenderer textRenderer, int posX, int posY) { + for (int ry = 0; ry < 4; ry++) { + if (ry == 0 && !showHotbar) continue; + for (int rx = 0; rx < 9; rx++) { + + int slot = ry * 9 + rx; + ItemStack stack = inventory.getStack(slot); + if (stack.isEmpty()) continue; + + int itemY = ry == 0 ? posY + 58 : posY + (ry-1) * 18; + int itemX = posX + rx * 18; + + context.drawItem(stack, itemX, itemY); + context.drawStackOverlay(textRenderer, stack, itemX, itemY); + } + } + } + + @Override + public void tick() { + ClientPlayerEntity player = MinecraftClient.getInstance().player; + if (player != null) { + PlayerInventory clientPlayerEntityInventory = player.getInventory(); + if (clientPlayerEntityInventory != null) inventory = clientPlayerEntityInventory; + } + } + + @Override + public Text getName() { + return translatable("widgets.widgets.inventory"); + } + + @Override + public Text getDescription() { + return translatable("widgets.widgets.inventory.description"); + } + + @Override + public int width() { + return switch (mode){ + case VANILLA, TEXTURE_PACK -> 176; + case TRANSPARENT, BOXES -> 160; + case GRID -> 162; + }; + } + + @Override + public int height() { + return switch (mode){ + case VANILLA, TEXTURE_PACK -> 91; + case TRANSPARENT, BOXES -> showHotbar ? 74 : 53; + case GRID -> showHotbar ? 76 : 55; + }; + } + + @Override + public void onSettingsChanged(WidgetSettings settings) { + super.onSettingsChanged(settings); + this.mode = ((InventoryMode) ((EnumWidgetSetting) settings.optionById("mode")).getValue()); + this.rainbowGrid = ((ToggleWidgetSetting) settings.optionById("rainbow_grid")).getValue(); + this.gridRainbowSpeed = ((IntSliderWidgetSetting) settings.optionById("grid_rainbow_speed")).getValue(); + this.gridColor = ((RGBAColorWidgetSetting) settings.optionById("grid_color")).getColor(); + + this.rainbowBoxes = ((ToggleWidgetSetting) settings.optionById("rainbow_boxes")).getValue(); + this.boxRainbowSpeed = ((IntSliderWidgetSetting) settings.optionById("box_rainbow_speed")).getValue(); + this.boxColor = ((RGBAColorWidgetSetting) settings.optionById("box_color")).getColor(); + + this.showHotbar = ((ToggleWidgetSetting) settings.optionById("show_hotbar")).getValue() || !mode.canDisableHotbar; + } +} diff --git a/src/main/resources/assets/widgets/lang/de_de.json b/src/main/resources/assets/widgets/lang/de_de.json index 868e6b4..ab5c825 100644 --- a/src/main/resources/assets/widgets/lang/de_de.json +++ b/src/main/resources/assets/widgets/lang/de_de.json @@ -51,6 +51,10 @@ "widgets.widgets.clock.showSeconds": "Sekunden anzeigen", "widgets.widgets.clock.weekFormat": "Wochentagformat", "widgets.widgets.clock.weekFormat.none": "Nicht anzeigen", + "widgets.widgets.combo": "Combo", + "widgets.widgets.combo.combo": "Combo: %s", + "widgets.widgets.combo.description": "Zeigt deine momentane Combo an", + "widgets.widgets.combo.displayThreshold": "Minimum sichtbar", "widgets.widgets.common.hideInSingleplayer": "In Einzelspielerwelten verbergen", "widgets.widgets.common.rainbow": "Regenbogen-Text", "widgets.widgets.common.rainbow.speed": "Regenbogengeschwindigkeit", @@ -72,6 +76,16 @@ "widgets.widgets.cps.right": "Zeigt/Zählt Rechts-Klicks", "widgets.widgets.fps": "FPS", "widgets.widgets.fps.description": "Zeigt deine aktuellen FPS an.", + "widgets.widgets.inventory": "Inventar", + "widgets.widgets.inventory.description": "Zeigt dein Inventar.", + "widgets.widgets.inventory.gridColor": "Farbe des Gitters", + "widgets.widgets.inventory.mode": "Modus", + "widgets.widgets.inventory.mode.boxes": "Zellen", + "widgets.widgets.inventory.mode.grid": "Gitter", + "widgets.widgets.inventory.mode.texture_pack": "Texturenpaket", + "widgets.widgets.inventory.mode.transparent": "Transparent", + "widgets.widgets.inventory.mode.vanilla": "Standard", + "widgets.widgets.inventory.rainbowGrid": "Regenbogengitter", "widgets.widgets.keystrokes": "Keystrokes", "widgets.widgets.keystrokes.colorBackgroundPressed": "Hintergrundfarbe (Taste gedrückt)", "widgets.widgets.keystrokes.colorBackgroundUnpressed": "Hintergrundfarbe (Taste nicht gedrückt)", @@ -117,8 +131,7 @@ "widgets.widgets.tps.description": "Zeigt die TPS im Einzelspielermodus an oder schätzt die TPS im Mehrspielermodus", "widgets.widgets.tps.dynamicColor": "Farbe dynamisch anzeigen", "widgets.widgets.tps.tps": "%s TPS", - "widgets.widgets.combo": "Combo", - "widgets.widgets.combo.description": "Zeigt deine momentane Combo an", - "widgets.widgets.combo.combo": "Combo: %s", - "widgets.widgets.combo.displayThreshold": "Minimum sichtbar" + "widgets.widgets.inventory.boxColor": "Zellenfarbe", + "widgets.widgets.inventory.rainbowBoxes": "Regenbogenzellen", + "widgets.widgets.inventory.showHotbar": "Schnellzugriffsleiste anzeigen" } \ No newline at end of file diff --git a/src/main/resources/assets/widgets/lang/en_us.json b/src/main/resources/assets/widgets/lang/en_us.json index 7a9eb93..bdce54b 100644 --- a/src/main/resources/assets/widgets/lang/en_us.json +++ b/src/main/resources/assets/widgets/lang/en_us.json @@ -43,7 +43,7 @@ "widgets.widgets.clock": "Clock/Date", "widgets.widgets.clock.dateFormat": "Date format", "widgets.widgets.clock.dateFormat.none": "No date", - "widgets.widgets.clock.description": "Shows the current time and/or date", + "widgets.widgets.clock.description": "Shows the current time and/or date.", "widgets.widgets.clock.hourFormat": "Hour Format", "widgets.widgets.clock.hourFormat.24hour": "Military Time", "widgets.widgets.clock.hourFormat.am_pm": "AM/PM", @@ -51,13 +51,17 @@ "widgets.widgets.clock.showSeconds": "Show seconds", "widgets.widgets.clock.weekFormat": "Day of week format", "widgets.widgets.clock.weekFormat.none": "Don't show", + "widgets.widgets.combo": "Combo", + "widgets.widgets.combo.combo": "Combo: %s", + "widgets.widgets.combo.description": "Shows your current Combo.", + "widgets.widgets.combo.displayThreshold": "Display Threshold", "widgets.widgets.common.hideInSingleplayer": "Hide in singleplayer worlds", "widgets.widgets.common.rainbow": "Rainbow text", "widgets.widgets.common.rainbow.speed": "Rainbow speed", "widgets.widgets.common.showLabel": "Show label", "widgets.widgets.common.sizePercent": "Widget size (%)", "widgets.widgets.coordinates": "Coordinates", - "widgets.widgets.coordinates.description": "Shows your current coordinates", + "widgets.widgets.coordinates.description": "Shows your current coordinates.", "widgets.widgets.coordinates.showX": "Show X coordinate:", "widgets.widgets.coordinates.showY": "Show Y coordinate:", "widgets.widgets.coordinates.showZ": "Show Z coordinate:", @@ -66,12 +70,24 @@ "widgets.widgets.cps.appearance.pipe": "Split (Pipe)", "widgets.widgets.cps.appearance.slash": "Split (Slash)", "widgets.widgets.cps.appearance.unified": "Unified", - "widgets.widgets.cps.description": "Shows your clicks per second", + "widgets.widgets.cps.description": "Shows your clicks per second.", "widgets.widgets.cps.left": "Display/Count left clicks", "widgets.widgets.cps.middle": "Display/Count middle clicks", "widgets.widgets.cps.right": "Display/Count right clicks", "widgets.widgets.fps": "FPS", "widgets.widgets.fps.description": "Shows your current FPS.", + "widgets.widgets.inventory": "Inventory", + "widgets.widgets.inventory.boxColor": "Box color", + "widgets.widgets.inventory.description": "Shows your inventory on screen.", + "widgets.widgets.inventory.gridColor": "Grid color", + "widgets.widgets.inventory.mode": "Mode", + "widgets.widgets.inventory.mode.boxes": "Boxes", + "widgets.widgets.inventory.mode.grid": "Grid", + "widgets.widgets.inventory.mode.texture_pack": "Texture pack", + "widgets.widgets.inventory.mode.transparent": "Transparent", + "widgets.widgets.inventory.mode.vanilla": "Vanilla", + "widgets.widgets.inventory.rainbowBoxes": "Rainbow boxes", + "widgets.widgets.inventory.rainbowGrid": "Rainbow Grid", "widgets.widgets.keystrokes": "Keystrokes", "widgets.widgets.keystrokes.colorBackgroundPressed": "Background color (key pressed)", "widgets.widgets.keystrokes.colorBackgroundUnpressed": "Background color (key not pressed)", @@ -84,18 +100,18 @@ "widgets.widgets.memory.showPercentage": "Show percentage", "widgets.widgets.memory.withLabel": "Memory: %s", "widgets.widgets.ping": "Ping", - "widgets.widgets.ping.description": "Shows your latency to the server", + "widgets.widgets.ping.description": "Shows your latency to the server.", "widgets.widgets.ping.dynamicColor": "Dynamic Color", "widgets.widgets.plaintext": "Text", - "widgets.widgets.plaintext.description": "Input a text to display on screen", + "widgets.widgets.plaintext.description": "Input a text to display on screen.", "widgets.widgets.plaintext.initial": "Change this in the widget settings", "widgets.widgets.plaintext.placeholder": "Type your text here...", "widgets.widgets.plaintext.text": "Text", "widgets.widgets.playerCount": "Player count", - "widgets.widgets.playerCount.description": "Shows the number of players online. May not be accurate on all servers (especially those that spawn fake players in the tab list)", + "widgets.widgets.playerCount.description": "Shows the number of players online. May not be accurate on all servers (especially those that spawn fake players in the tab list).", "widgets.widgets.playerCount.online": "%s online", "widgets.widgets.playtime": "Playtime", - "widgets.widgets.playtime.description": "Shows the current session's uptime", + "widgets.widgets.playtime.description": "Shows the current session's uptime.", "widgets.widgets.playtime.labelStyle": "Label Style", "widgets.widgets.playtime.labelStyle.none": "No label", "widgets.widgets.playtime.labelStyle.played": "Time played", @@ -103,7 +119,7 @@ "widgets.widgets.playtime.played": "%s played", "widgets.widgets.playtime.playtime": "Playtime: %s", "widgets.widgets.serverIP": "Server IP", - "widgets.widgets.serverIP.description": "Shows the server address", + "widgets.widgets.serverIP.description": "Shows the server address.", "widgets.widgets.serverIP.dynamicWidth": "Dynamically set widget width", "widgets.widgets.speed": "Speed", "widgets.widgets.speed.description": "Shows the speed you are moving at.", @@ -114,11 +130,8 @@ "widgets.widgets.speed.withY": "With Y-axis velocity", "widgets.widgets.speed.withZ": "With Z-axis velocity", "widgets.widgets.tps": "TPS", - "widgets.widgets.tps.description": "Shows the current TPS when in singleplayer or estimates server TPS when in multiplayer", + "widgets.widgets.tps.description": "Shows the current TPS when in singleplayer and estimates server TPS when in multiplayer.", "widgets.widgets.tps.dynamicColor": "Dynamic Color", "widgets.widgets.tps.tps": "%s TPS", - "widgets.widgets.combo": "Combo", - "widgets.widgets.combo.description": "Shows your current Combo", - "widgets.widgets.combo.combo": "Combo: %s", - "widgets.widgets.combo.displayThreshold": "Display Threshold" + "widgets.widgets.inventory.showHotbar": "Show hotbar" } \ No newline at end of file diff --git a/src/main/resources/assets/widgets/textures/vanilla_inventory.png b/src/main/resources/assets/widgets/textures/vanilla_inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..5ee6b9a8a0bccb4c4cf204058ec112264b7cf128 GIT binary patch literal 643 zcmeAS@N?(olHy`uVBq!ia0vp^8-O^PgBeIZdG%ixNHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%7Y*{w`MsJXd$cXu~XBz5z2X&}X3666;Qlm!9?DQ{*s zpb%$)M`SSr1K(i~W;~w1A_XWYQQ{g=5}cn_Ql40p$`Fv4nOCCc=Nh75s%NNYA)WbZ z1yIel)CkWsPfsld4j_k>L5h);ff2~^0%B<>8{`8GMrN=$6Oe7l$iyH3q@#d1vz-Mj zo&{usKmrhh^uuU0OBsM+FoB(c1*pQn$k>2!0mM|04%P(_lcoUKAixAPhY74Q$kGDH zg6c9fFaXJ}Zcr2so@b!}Wd8GXaSX|DetX-H>#&1>^Tk4$^MCtg%wBHE+i%RYl5@|i zWak^YF?XMCez$Jj;qmNPY`%3&z(ap+hTw(Kevs^Cbt9z~2THnnUzbSc^%8Y3& zmnS7e3Hf+8WqKOuaxOb+`{R=IS3}<~oUilF{oy*_#g@N50js(S`-lF*wTE`iHr{_| z^P+>dwP&btE>k_Y1;xxl{(JsEF1s|@PD`jdcd*KH@9yndHri5q{`UGzMza~HbqD+V z?N>6D4$65O*lvGN%v!!Se)ih@+1`a8R_&Kh{=Mcm^B%reSCv!VUjv1Tr>mdKI;Vst E0P`2e8UO$Q literal 0 HcmV?d00001