From 6f3ec2d50e1ac28233c3712756fb4a349c6159e8 Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Tue, 24 Feb 2026 23:21:16 -0500 Subject: [PATCH 1/2] Start of sensor hatches. This is a test commit don't burn everything down. --- gradle.properties | 2 +- .../AdvancedChromaSensorHatchPartMachine.java | 54 ++++++++++++++++--- 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/gradle.properties b/gradle.properties index 1724cfe..e21ac2d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,7 +23,7 @@ org.gradle.jvmargs=-Xmx1G # Dependencies guideme_version=20.1.11 architectury_version=9.2.14 - gtceu_version=7.5.1 + gtceu_version=7.5.2 ldlib_version=1.0.40.b registrate_version=MC1.20-1.3.11 rhino_version=2001.2.3-build.6 diff --git a/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedChromaSensorHatchPartMachine.java b/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedChromaSensorHatchPartMachine.java index 8aca427..78ac851 100644 --- a/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedChromaSensorHatchPartMachine.java +++ b/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedChromaSensorHatchPartMachine.java @@ -1,16 +1,24 @@ package net.neganote.monilabs.common.machine.part; +import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.lowdragmc.lowdraglib.gui.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; +import com.lowdragmc.lowdraglib.gui.factory.HeldItemUIFactory; +import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture; +import com.lowdragmc.lowdraglib.gui.widget.*; import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.lowdragmc.lowdraglib.utils.LocalizationUtils; +import net.minecraft.ChatFormatting; import net.minecraft.core.Direction; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.BlockHitResult; @@ -19,8 +27,11 @@ import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import lombok.Getter; import lombok.Setter; +import org.apache.commons.lang3.ArrayUtils; import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Arrays; +import java.util.List; @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault @@ -42,6 +53,19 @@ public class AdvancedChromaSensorHatchPartMachine extends ChromaSensorHatchPartM @DescSynced public boolean inverted = false; + private static final List COLOR_NAMES = Arrays.stream(Color.values()) + .map(Enum::name) + .toList(); + + private static final it.unimi.dsi.fastutil.objects.Object2ObjectMap NAME_TO_COLOR = + new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>(); + + static { + for (Color color : Color.values()) { + NAME_TO_COLOR.put(color.name(), color); + } + } + public AdvancedChromaSensorHatchPartMachine(IMachineBlockEntity holder) { super(holder); } @@ -70,13 +94,29 @@ public int getOutputSignal(Direction direction) { @Override public Widget createUIWidget() { - WidgetGroup group = new WidgetGroup(0, 0, 176, 105); - + WidgetGroup group = new WidgetGroup(0, 0, 70, 70); + + // Selection Widget + group.addWidget(new LabelWidget(5, 5, "Color:")); + + group.addWidget(new SelectorWidget( + 15, 10, 80, 20, + COLOR_NAMES, + COLOR_NAMES.indexOf(getDetectorColor().name())) + .setOnChanged(selectedName -> { + // Safe retrieval using the fastutil map + Color newColor = NAME_TO_COLOR.getOrDefault(selectedName, Color.RED); + setDetectorColor(newColor); + }) + .setButtonBackground(ResourceBorderTexture.BUTTON_COMMON) + .setBackground(ColorPattern.BLACK.rectTexture()) + .setSupplier(() -> getDetectorColor().name())); + + // Invert Redstone Output Toggle: group.addWidget(new ToggleButtonWidget( - 9, 20, 20, 20, + 9, 55, 20, 20, GuiTextures.INVERT_REDSTONE_BUTTON, this::isInverted, this::setInverted) - .isMultiLang() - .setTooltipText("cover.advanced_energy_detector.invert")); + .setTooltipText("gtceu.gui.button.invert_redstone")); return group; } From 5c915a139b3045b0636d1fdfb28dbd76ca7c927b Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Thu, 26 Feb 2026 14:17:48 -0500 Subject: [PATCH 2/2] All 4 sensor hatch uis are done. --- .../resources/assets/monilabs/lang/en_ud.json | 47 +++++++- .../resources/assets/monilabs/lang/en_us.json | 47 +++++++- .../monilabs/client/gui/MoniGuiTextures.java | 2 + .../common/machine/multiblock/Color.java | 31 +++++ .../common/machine/multiblock/Microverse.java | 34 ++++-- .../AdvancedChromaSensorHatchPartMachine.java | 65 ++++++----- ...overseStabilitySensorHatchPartMachine.java | 42 +++++++ ...dMicroverseTypeSensorHatchPartMachine.java | 74 +++++++++++- ...SculkExperienceSensorHatchPartMachine.java | 110 +++++++++++++----- .../monilabs/data/lang/MoniLangHandler.java | 43 ++++++- .../textures/gui/widget/button_xp_sensor.png | Bin 0 -> 490 bytes 11 files changed, 422 insertions(+), 73 deletions(-) create mode 100644 src/main/resources/assets/monilabs/textures/gui/widget/button_xp_sensor.png diff --git a/src/generated/resources/assets/monilabs/lang/en_ud.json b/src/generated/resources/assets/monilabs/lang/en_ud.json index 9b61f04..8b0247a 100644 --- a/src/generated/resources/assets/monilabs/lang/en_ud.json +++ b/src/generated/resources/assets/monilabs/lang/en_ud.json @@ -81,7 +81,53 @@ "gtceu.placeholder_info.sculkVatXPBuffer.0": "˙ʇɐΛ ʞןnɔS ǝɥʇ ɟo ɹǝɟɟnq ԀX ʇuǝɹɹnɔ ǝɥʇ suɹnʇǝᴚ", "gtceu.placeholder_info.sculkVatXPBuffer.1": ":ǝbɐs∩", "gtceu.placeholder_info.sculkVatXPBuffer.2": ")sʇǝʞɔnqıןןıɯ uı ǝnןɐʌ( :pǝɹoʇS ԀX >- }ɹǝɟɟnᗺԀXʇɐΛʞןnɔs{ ", + "gui.advanced_chroma_sensor.display": " :ǝdʎ⟘", + "gui.advanced_chroma_sensor.invert.disabled.0": "ןɐɯɹoN :ʇndʇnO", + "gui.advanced_chroma_sensor.invert.disabled.1": "", + "gui.advanced_chroma_sensor.invert.disabled.2": "ɔıboן ǝuoʇspǝɹ ǝɥʇ ʇɹǝʌuı oʇ ǝןbbo⟘", + "gui.advanced_chroma_sensor.invert.disabled.3": "˙ǝןqıɔnɹƆ ɔıʇɐɯsıɹԀ ǝɥʇ ɟo ɹoןoɔ ǝʌıʇɔɐ ǝɥʇ ɥɔʇɐɯ ʇou sǝop uǝsoɥɔ ɹoןoɔ ǝɥʇ uǝɥʍ buıʇʇıɯǝ sdoʇs ǝuoʇspǝɹ 'ʇןnɐɟǝp ʎᗺ", + "gui.advanced_chroma_sensor.invert.enabled.0": "pǝʇɹǝʌuI :ʇndʇnO", + "gui.advanced_chroma_sensor.invert.enabled.1": "", + "gui.advanced_chroma_sensor.invert.enabled.2": "ɔıboן ǝuoʇspǝɹ ǝɥʇ ʇɹǝʌuı oʇ ǝןbbo⟘", + "gui.advanced_chroma_sensor.invert.enabled.3": "˙ǝןqıɔnɹƆ ɔıʇɐɯsıɹԀ ǝɥʇ ɟo ɹoןoɔ ǝʌıʇɔɐ ǝɥʇ ɥɔʇɐɯ ʇou sǝop uǝsoɥɔ ɹoןoɔ ǝɥʇ uǝɥʍ buıʇʇıɯǝ sdoʇs ǝuoʇspǝɹ 'ʇןnɐɟǝp ʎᗺ", + "gui.advanced_chroma_sensor.none": "ǝuoN", "gui.ae2.With": "ɥʇıM", + "gui.monilabs.chroma.color.display": " :ɹoןoƆ", + "gui.monilabs.chroma.color.unknown": "uʍouʞu∩", + "gui.monilabs.microverse_stability.max": " :xɐW", + "gui.monilabs.microverse_stability.max_threshold": "pןoɥsǝɹɥʇ ɯnɯıxɐɯ ʇǝS", + "gui.monilabs.microverse_stability.min": " :uıW", + "gui.monilabs.microverse_stability.min_threshold": "pןoɥsǝɹɥʇ ɯnɯıuıɯ ʇǝS", + "gui.monilabs.microverse_stability_sensor.invert.disabled.0": "ןɐɯɹoN :ʇndʇnO", + "gui.monilabs.microverse_stability_sensor.invert.disabled.1": "", + "gui.monilabs.microverse_stability_sensor.invert.disabled.2": "ɔıboן ǝuoʇspǝɹ ǝɥʇ ʇɹǝʌuı oʇ ǝןbbo⟘", + "gui.monilabs.microverse_stability_sensor.invert.disabled.3": "˙ɹoʇɔǝظoɹԀ ǝsɹǝʌoɹɔıW ǝɥʇ ɟo ʎʇıןıqɐʇs ʇuǝɹɹnɔ ǝɥʇ ɥɔʇɐɯ ʇou sǝop ǝbɐʇuǝɔɹǝd ǝɥʇ uǝɥʍ buıʇʇıɯǝ sdoʇs ǝuoʇspǝɹ 'ʇןnɐɟǝp ʎᗺ", + "gui.monilabs.microverse_stability_sensor.invert.enabled.0": "pǝʇɹǝʌuI :ʇndʇnO", + "gui.monilabs.microverse_stability_sensor.invert.enabled.1": "", + "gui.monilabs.microverse_stability_sensor.invert.enabled.2": "ɔıboן ǝuoʇspǝɹ ǝɥʇ ʇɹǝʌuı oʇ ǝןbbo⟘", + "gui.monilabs.microverse_stability_sensor.invert.enabled.3": "˙ɹoʇɔǝظoɹԀ ǝsɹǝʌoɹɔıW ǝɥʇ ɟo ʎʇıןıqɐʇs ʇuǝɹɹnɔ ǝɥʇ ɥɔʇɐɯ ʇou sǝop ǝbɐʇuǝɔɹǝd ǝɥʇ uǝɥʍ buıʇʇıɯǝ sdoʇs ǝuoʇspǝɹ 'ʇןnɐɟǝp ʎᗺ", + "gui.monilabs.xp_sensor.invert.disabled.0": "ןɐɯɹoN :ʇndʇnO", + "gui.monilabs.xp_sensor.invert.disabled.1": "", + "gui.monilabs.xp_sensor.invert.disabled.2": "ɔıboן ǝuoʇspǝɹ ǝɥʇ ʇɹǝʌuı oʇ ǝןbbo⟘", + "gui.monilabs.xp_sensor.invert.disabled.3": "˙ʇɐΛ ʞןnɔS ǝɥʇ ɟo ɹǝɟɟnq ןɐuɹǝʇuı ǝɥʇ uı ԀX ɟo ʇunoɯɐ ǝɥʇ ɥɔʇɐɯ ʇou sǝop ǝbɐʇuǝɔɹǝd ɹo ǝnןɐʌ ʍɐɹ ǝɥʇ uǝɥʍ buıʇʇıɯǝ sdoʇs ǝuoʇspǝɹ 'ʇןnɐɟǝp ʎᗺ", + "gui.monilabs.xp_sensor.invert.enabled.0": "pǝʇɹǝʌuI :ʇndʇnO", + "gui.monilabs.xp_sensor.invert.enabled.1": "", + "gui.monilabs.xp_sensor.invert.enabled.2": "ɔıboן ǝuoʇspǝɹ ǝɥʇ ʇɹǝʌuı oʇ ǝןbbo⟘", + "gui.monilabs.xp_sensor.invert.enabled.3": "˙ʇɐΛ ʞןnɔS ǝɥʇ ɟo ɹǝɟɟnq ןɐuɹǝʇuı ǝɥʇ uı ԀX ɟo ʇunoɯɐ ǝɥʇ ɥɔʇɐɯ ʇou sǝop ǝbɐʇuǝɔɹǝd ɹo ǝnןɐʌ ʍɐɹ ǝɥʇ uǝɥʍ buıʇʇıɯǝ sdoʇs ǝuoʇspǝɹ 'ʇןnɐɟǝp ʎᗺ", + "gui.monilabs.xp_sensor.max": " :xɐW", + "gui.monilabs.xp_sensor.max_threshold": "pןoɥsǝɹɥʇ ɯnɯıxɐɯ ʇǝS", + "gui.monilabs.xp_sensor.min": " :uıW", + "gui.monilabs.xp_sensor.min_threshold": "pןoɥsǝɹɥʇ ɯnɯıuıɯ ʇǝS", + "gui.monilabs.xp_sensor.mode_percentage": " )%%( ǝbɐʇuǝɔɹǝԀ :ǝpoW", + "gui.monilabs.xp_sensor.mode_raw_amount": " )ԀX( ʇunoɯⱯ ʍɐᴚ :ǝpoW", + "gui.monilabs.xp_sensor.mode_toggle.disabled.0": "ʇunoɯⱯ ʍɐᴚ :ǝpoW", + "gui.monilabs.xp_sensor.mode_toggle.disabled.1": "", + "gui.monilabs.xp_sensor.mode_toggle.disabled.2": "˙ןɐubıS ǝɔuǝıɹǝdxƎ ʞןnɔS ɟo ǝpoɯ ǝɥʇ ʇɔǝןǝs oʇ ǝןbbo⟘", + "gui.monilabs.xp_sensor.mode_toggle.disabled.3": "sǝnןɐʌ ʍɐɹ ǝɥʇ sǝɥɔʇɐɯ ʇɐΛ ʞןnɔS ǝɥʇ uı ԀX ɟo ʇunoɯɐ ǝɥʇ uǝɥʍ pǝʇʇıɯǝ sı ǝuoʇspǝɹ 'ǝpoɯ sıɥʇ uI", + "gui.monilabs.xp_sensor.mode_toggle.enabled.0": " ǝbɐʇuǝɔɹǝԀ :ǝpoW", + "gui.monilabs.xp_sensor.mode_toggle.enabled.1": "", + "gui.monilabs.xp_sensor.mode_toggle.enabled.2": "˙ןɐubıS ǝɔuǝıɹǝdxƎ ʞןnɔS ɟo ǝpoɯ ǝɥʇ ʇɔǝןǝs oʇ ǝןbbo⟘", + "gui.monilabs.xp_sensor.mode_toggle.enabled.3": "sǝbɐʇuǝɔɹǝd ǝɥʇ sǝɥɔʇɐɯ ʇɐΛ ʞןnɔS ǝɥʇ uı ԀX ɟo ʇunoɯɐ ǝɥʇ uǝɥʍ pǝʇʇıɯǝ sı ǝuoʇspǝɹ 'ǝpoɯ sıɥʇ uI", "item.monilabs.max_conveyor_module": "ǝןnpoW ɹoʎǝʌuoƆ XⱯW", "item.monilabs.max_electric_motor": "ɹoʇoW ɔıɹʇɔǝןƎ XⱯW", "item.monilabs.max_electric_piston": "uoʇsıԀ ɔıɹʇɔǝןƎ XⱯW", @@ -103,7 +149,6 @@ "microverse.monilabs.type.none": "ǝuoN", "microverse.monilabs.type.normal": "ןɐɯɹoN", "microverse.monilabs.type.shattered": "pǝɹǝʇʇɐɥS", - "monilabs.advanced_chroma_sensor_hatch.toggle": " :ʇndʇno ǝuoʇspǝɹ ǝןbbo⟘", "monilabs.commands.helpexpert": "sbuıɥʇ ɹǝɥʇo buoɯɐ sbuıʇʇǝs ɯ⟘⅁ ǝɯǝɹʇxǝ ǝɹoɯ ǝɥʇ ɟo ǝɯos sǝןqɐuǝ 'pɹɐɥ ɹoɟ ɹǝıɟıpoɯ Ɐ - ǝpoW ʇɹǝdxƎ", "monilabs.commands.helphard": "buıpuǝds uıoɔıuoW puɐ NNH sǝʌoɯǝɹ 'uoıssǝɹboɹd puɐ sǝuıן ǝɹoɯ sppⱯ - ǝpoW pɹɐH", "monilabs.commands.helpnormal": "ǝpoɯ ʇןnɐɟǝᗡ ǝɥ⟘ - ǝpoW ןɐɯɹoN", diff --git a/src/generated/resources/assets/monilabs/lang/en_us.json b/src/generated/resources/assets/monilabs/lang/en_us.json index 17e094a..8540d3f 100644 --- a/src/generated/resources/assets/monilabs/lang/en_us.json +++ b/src/generated/resources/assets/monilabs/lang/en_us.json @@ -81,7 +81,53 @@ "gtceu.placeholder_info.sculkVatXPBuffer.0": "Returns the current XP buffer of the Sculk Vat.", "gtceu.placeholder_info.sculkVatXPBuffer.1": "Usage:", "gtceu.placeholder_info.sculkVatXPBuffer.2": " {sculkVatXPBuffer} -> XP Stored: (value in millibuckets)", + "gui.advanced_chroma_sensor.display": "Type: ", + "gui.advanced_chroma_sensor.invert.disabled.0": "Output: Normal", + "gui.advanced_chroma_sensor.invert.disabled.1": "", + "gui.advanced_chroma_sensor.invert.disabled.2": "Toggle to invert the redstone logic", + "gui.advanced_chroma_sensor.invert.disabled.3": "By default, redstone stops emitting when the color chosen does not match the active color of the Prismatic Crucible.", + "gui.advanced_chroma_sensor.invert.enabled.0": "Output: Inverted", + "gui.advanced_chroma_sensor.invert.enabled.1": "", + "gui.advanced_chroma_sensor.invert.enabled.2": "Toggle to invert the redstone logic", + "gui.advanced_chroma_sensor.invert.enabled.3": "By default, redstone stops emitting when the color chosen does not match the active color of the Prismatic Crucible.", + "gui.advanced_chroma_sensor.none": "None", "gui.ae2.With": "With", + "gui.monilabs.chroma.color.display": "Color: ", + "gui.monilabs.chroma.color.unknown": "Unknown", + "gui.monilabs.microverse_stability.max": "Max: ", + "gui.monilabs.microverse_stability.max_threshold": "Set maximum threshold", + "gui.monilabs.microverse_stability.min": "Min: ", + "gui.monilabs.microverse_stability.min_threshold": "Set minimum threshold", + "gui.monilabs.microverse_stability_sensor.invert.disabled.0": "Output: Normal", + "gui.monilabs.microverse_stability_sensor.invert.disabled.1": "", + "gui.monilabs.microverse_stability_sensor.invert.disabled.2": "Toggle to invert the redstone logic", + "gui.monilabs.microverse_stability_sensor.invert.disabled.3": "By default, redstone stops emitting when the percentage does not match the current stability of the Microverse Projector.", + "gui.monilabs.microverse_stability_sensor.invert.enabled.0": "Output: Inverted", + "gui.monilabs.microverse_stability_sensor.invert.enabled.1": "", + "gui.monilabs.microverse_stability_sensor.invert.enabled.2": "Toggle to invert the redstone logic", + "gui.monilabs.microverse_stability_sensor.invert.enabled.3": "By default, redstone stops emitting when the percentage does not match the current stability of the Microverse Projector.", + "gui.monilabs.xp_sensor.invert.disabled.0": "Output: Normal", + "gui.monilabs.xp_sensor.invert.disabled.1": "", + "gui.monilabs.xp_sensor.invert.disabled.2": "Toggle to invert the redstone logic", + "gui.monilabs.xp_sensor.invert.disabled.3": "By default, redstone stops emitting when the raw value or percentage does not match the amount of XP in the internal buffer of the Sculk Vat.", + "gui.monilabs.xp_sensor.invert.enabled.0": "Output: Inverted", + "gui.monilabs.xp_sensor.invert.enabled.1": "", + "gui.monilabs.xp_sensor.invert.enabled.2": "Toggle to invert the redstone logic", + "gui.monilabs.xp_sensor.invert.enabled.3": "By default, redstone stops emitting when the raw value or percentage does not match the amount of XP in the internal buffer of the Sculk Vat.", + "gui.monilabs.xp_sensor.max": "Max: ", + "gui.monilabs.xp_sensor.max_threshold": "Set maximum threshold", + "gui.monilabs.xp_sensor.min": "Min: ", + "gui.monilabs.xp_sensor.min_threshold": "Set minimum threshold", + "gui.monilabs.xp_sensor.mode_percentage": "Mode: Percentage (%%) ", + "gui.monilabs.xp_sensor.mode_raw_amount": "Mode: Raw Amount (XP) ", + "gui.monilabs.xp_sensor.mode_toggle.disabled.0": "Mode: Raw Amount", + "gui.monilabs.xp_sensor.mode_toggle.disabled.1": "", + "gui.monilabs.xp_sensor.mode_toggle.disabled.2": "Toggle to select the mode of Sculk Experience Signal.", + "gui.monilabs.xp_sensor.mode_toggle.disabled.3": "In this mode, redstone is emitted when the amount of XP in the Sculk Vat matches the raw values", + "gui.monilabs.xp_sensor.mode_toggle.enabled.0": "Mode: Percentage ", + "gui.monilabs.xp_sensor.mode_toggle.enabled.1": "", + "gui.monilabs.xp_sensor.mode_toggle.enabled.2": "Toggle to select the mode of Sculk Experience Signal.", + "gui.monilabs.xp_sensor.mode_toggle.enabled.3": "In this mode, redstone is emitted when the amount of XP in the Sculk Vat matches the percentages", "item.monilabs.max_conveyor_module": "MAX Conveyor Module", "item.monilabs.max_electric_motor": "MAX Electric Motor", "item.monilabs.max_electric_piston": "MAX Electric Piston", @@ -103,7 +149,6 @@ "microverse.monilabs.type.none": "None", "microverse.monilabs.type.normal": "Normal", "microverse.monilabs.type.shattered": "Shattered", - "monilabs.advanced_chroma_sensor_hatch.toggle": "Toggle redstone output: ", "monilabs.commands.helpexpert": "Expert Mode - A modifier for hard, enables some of the more extreme GTm settings among other things", "monilabs.commands.helphard": "Hard Mode - Adds more lines and progression, removes HNN and Monicoin spending", "monilabs.commands.helpnormal": "Normal Mode - The Default mode", diff --git a/src/main/java/net/neganote/monilabs/client/gui/MoniGuiTextures.java b/src/main/java/net/neganote/monilabs/client/gui/MoniGuiTextures.java index d8a8de1..64b7219 100644 --- a/src/main/java/net/neganote/monilabs/client/gui/MoniGuiTextures.java +++ b/src/main/java/net/neganote/monilabs/client/gui/MoniGuiTextures.java @@ -12,4 +12,6 @@ public class MoniGuiTextures { "monilabs:textures/gui/progress_bar/progress_bar_simulation.png"); public static final ResourceTexture PROGRESS_BAR_XP = new ResourceTexture( "monilabs:textures/gui/progress_bar/progress_bar_xp.png"); + public static final ResourceTexture XP_SENSOR_BUTTON = new ResourceTexture( + "monilabs:textures/gui/widget/button_xp_sensor.png"); } diff --git a/src/main/java/net/neganote/monilabs/common/machine/multiblock/Color.java b/src/main/java/net/neganote/monilabs/common/machine/multiblock/Color.java index 59451c9..4da67ce 100644 --- a/src/main/java/net/neganote/monilabs/common/machine/multiblock/Color.java +++ b/src/main/java/net/neganote/monilabs/common/machine/multiblock/Color.java @@ -1,5 +1,6 @@ package net.neganote.monilabs.common.machine.multiblock; +import net.minecraft.network.chat.Component; import net.minecraft.util.StringRepresentable; import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; @@ -87,6 +88,36 @@ public enum Color implements StringRepresentable { } public static final Map TO_NOT_COLOR = new Object2ObjectArrayMap<>(); + + public String getColoredDisplayName() { + String displayName; + + if (nameKey != null && !nameKey.isEmpty()) { + displayName = Component.translatable(nameKey).getString(); + } else { + displayName = this.name().toUpperCase().replace('_', ' '); + } + + boolean isRealColor = this.key >= Color.RED.key && this.key <= Color.PINK.key; + + if (isRealColor) { + int rgb = this.integerColor; + String hex = String.format("%06X", rgb & 0xFFFFFF); + StringBuilder sb = new StringBuilder("§x"); + for (char c : hex.toCharArray()) { + sb.append('§').append(c); + } + return sb + displayName; + } else { + String hex = String.format("%06X", 0x555555 & 0xFFFFFF); + StringBuilder sb = new StringBuilder("§x"); + for (char c : hex.toCharArray()) { + sb.append('§').append(c); + } + return sb + displayName; + } + } + public static final Map FROM_NOT_COLOR = new Object2ObjectArrayMap<>(); static { diff --git a/src/main/java/net/neganote/monilabs/common/machine/multiblock/Microverse.java b/src/main/java/net/neganote/monilabs/common/machine/multiblock/Microverse.java index 854f83d..0ced2d0 100644 --- a/src/main/java/net/neganote/monilabs/common/machine/multiblock/Microverse.java +++ b/src/main/java/net/neganote/monilabs/common/machine/multiblock/Microverse.java @@ -1,13 +1,15 @@ package net.neganote.monilabs.common.machine.multiblock; -import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.network.chat.*; import net.minecraft.util.StringRepresentable; import net.minecraft.world.level.block.state.properties.EnumProperty; import net.neganote.monilabs.config.MoniConfig; import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; -@MethodsReturnNonnullByDefault public enum Microverse implements StringRepresentable { NONE("none", 0, 0, false, false, "microverse.monilabs.type.none"), @@ -17,24 +19,26 @@ public enum Microverse implements StringRepresentable { SHATTERED("shattered", 3, 0, false, false, "microverse.monilabs.type.shattered"), CORRUPTED("corrupted", 4, 10, true, true, "microverse.monilabs.type.corrupted"); - public static final Microverse[] MICROVERSES = Microverse.values(); + public static final Microverse[] MICROVERSES = values(); public static final EnumProperty MICROVERSE_TYPE = EnumProperty.create("microverse_type", Microverse.class); public final int decayRate; public final boolean isRepairable; - public final boolean isHungry; - public final String langKey; + public final int key; @Getter public final String serializedName; - public final int key; - - Microverse(String serializedName, int key, int decayRate, boolean isRepairable, boolean isHungry, String langKey) { + Microverse(String serializedName, + int key, + int decayRate, + boolean isRepairable, + boolean isHungry, + String langKey) { this.decayRate = decayRate; this.isRepairable = isRepairable; this.isHungry = isHungry; @@ -43,12 +47,22 @@ public enum Microverse implements StringRepresentable { this.serializedName = serializedName; } + public String getDisplayName() { + if (langKey != null && !langKey.isEmpty()) { + return Component.translatable(langKey).getString(); + } + return this.name().toLowerCase().replace('_', ' '); + } + + public static final Microverse[] ACTUAL_MICROVERSES = Arrays.copyOfRange(MICROVERSES, 0, + Microverse.CORRUPTED.ordinal() + 1); + public static Microverse getMicroverseFromKey(int pKey) { return MICROVERSES[pKey]; } @Override - public String toString() { - return "Microverse{" + name() + "}"; + public @NotNull String getSerializedName() { + return serializedName; } } diff --git a/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedChromaSensorHatchPartMachine.java b/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedChromaSensorHatchPartMachine.java index 78ac851..58105ec 100644 --- a/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedChromaSensorHatchPartMachine.java +++ b/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedChromaSensorHatchPartMachine.java @@ -1,41 +1,39 @@ package net.neganote.monilabs.common.machine.part; -import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; -import com.lowdragmc.lowdraglib.gui.factory.HeldItemUIFactory; import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture; import com.lowdragmc.lowdraglib.gui.widget.*; import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; -import com.lowdragmc.lowdraglib.utils.LocalizationUtils; -import net.minecraft.ChatFormatting; import net.minecraft.core.Direction; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.BlockHitResult; import net.neganote.monilabs.common.machine.multiblock.Color; import com.mojang.blaze3d.MethodsReturnNonnullByDefault; +import it.unimi.dsi.fastutil.objects.Object2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import lombok.Getter; import lombok.Setter; -import org.apache.commons.lang3.ArrayUtils; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.Arrays; import java.util.List; +import javax.annotation.ParametersAreNonnullByDefault; + +import static net.neganote.monilabs.common.machine.multiblock.Color.ACTUAL_COLORS; + @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class AdvancedChromaSensorHatchPartMachine extends ChromaSensorHatchPartMachine { +public class AdvancedChromaSensorHatchPartMachine extends ChromaSensorHatchPartMachine + implements IFancyUIMachine { public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( AdvancedChromaSensorHatchPartMachine.class, @@ -53,12 +51,7 @@ public class AdvancedChromaSensorHatchPartMachine extends ChromaSensorHatchPartM @DescSynced public boolean inverted = false; - private static final List COLOR_NAMES = Arrays.stream(Color.values()) - .map(Enum::name) - .toList(); - - private static final it.unimi.dsi.fastutil.objects.Object2ObjectMap NAME_TO_COLOR = - new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>(); + public static final Object2ObjectMap NAME_TO_COLOR = new Object2ObjectOpenHashMap<>(); static { for (Color color : Color.values()) { @@ -66,6 +59,12 @@ public class AdvancedChromaSensorHatchPartMachine extends ChromaSensorHatchPartM } } + private static final List VALID_COLORS = Arrays.asList(ACTUAL_COLORS); + + private static final List ACTUAL_COLOR_DISPLAY_NAMES = VALID_COLORS.stream() + .map(Color::getColoredDisplayName) + .toList(); + public AdvancedChromaSensorHatchPartMachine(IMachineBlockEntity holder) { super(holder); } @@ -96,27 +95,33 @@ public int getOutputSignal(Direction direction) { public Widget createUIWidget() { WidgetGroup group = new WidgetGroup(0, 0, 70, 70); - // Selection Widget - group.addWidget(new LabelWidget(5, 5, "Color:")); + int currentIndex = VALID_COLORS.indexOf(getDetectorColor()); + if (currentIndex == -1) currentIndex = 0; + + group.addWidget(new LabelWidget(-40, 15, "gui.monilabs.chroma.color.display")); group.addWidget(new SelectorWidget( - 15, 10, 80, 20, - COLOR_NAMES, - COLOR_NAMES.indexOf(getDetectorColor().name())) + -5, 11, 80, 20, + ACTUAL_COLOR_DISPLAY_NAMES, + currentIndex) + .setMaxCount(3) .setOnChanged(selectedName -> { - // Safe retrieval using the fastutil map - Color newColor = NAME_TO_COLOR.getOrDefault(selectedName, Color.RED); - setDetectorColor(newColor); + int index = ACTUAL_COLOR_DISPLAY_NAMES.indexOf(selectedName); + if (index >= 0) { + setDetectorColor(VALID_COLORS.get(index)); + } }) .setButtonBackground(ResourceBorderTexture.BUTTON_COMMON) - .setBackground(ColorPattern.BLACK.rectTexture()) - .setSupplier(() -> getDetectorColor().name())); + .setSupplier(() -> { + int idx = VALID_COLORS.indexOf(getDetectorColor()); + return idx >= 0 ? ACTUAL_COLOR_DISPLAY_NAMES.get(idx) : "gui.monilabs.chroma.color.unknown"; + })); - // Invert Redstone Output Toggle: group.addWidget(new ToggleButtonWidget( - 9, 55, 20, 20, + 80, 11, 20, 20, GuiTextures.INVERT_REDSTONE_BUTTON, this::isInverted, this::setInverted) - .setTooltipText("gtceu.gui.button.invert_redstone")); + .isMultiLang() + .setTooltipText("gui.advanced_chroma_sensor.invert")); return group; } diff --git a/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedMicroverseStabilitySensorHatchPartMachine.java b/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedMicroverseStabilitySensorHatchPartMachine.java index 25da489..5f441e9 100644 --- a/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedMicroverseStabilitySensorHatchPartMachine.java +++ b/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedMicroverseStabilitySensorHatchPartMachine.java @@ -1,11 +1,21 @@ package net.neganote.monilabs.common.machine.part; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; +import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.core.Direction; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.BlockHitResult; import net.neganote.monilabs.common.machine.multiblock.MicroverseProjectorMachine; import com.mojang.blaze3d.MethodsReturnNonnullByDefault; @@ -42,6 +52,11 @@ public AdvancedMicroverseStabilitySensorHatchPartMachine(IMachineBlockEntity hol maxPercent = DEFAULT_MAX_PERCENT; } + @Override + public boolean shouldOpenUI(Player player, InteractionHand hand, BlockHitResult hit) { + return true; + } + @Override public int getOutputSignal(@Nullable Direction direction) { if (direction != getFrontFacing().getOpposite()) { @@ -73,6 +88,33 @@ public int getOutputSignal(@Nullable Direction direction) { } } + @Override + public Widget createUIWidget() { + WidgetGroup group = new WidgetGroup(0, 0, 170, 85); + + group.addWidget(new ToggleButtonWidget( + 10, 5, 18, 18, + GuiTextures.INVERT_REDSTONE_BUTTON, this::isInverted, this::setInverted) + .isMultiLang() + .setTooltipText("gui.monilabs.microverse_stability_sensor.invert")); + + group.addWidget(new LabelWidget(10, 35, "gui.monilabs.microverse_stability.min")); + group.addWidget(new IntInputWidget(45, 30, 100, 20, + () -> minPercent, + val -> { + minPercent = Mth.clamp(val, 0, 100); + }) + .setHoverTooltips("gui.monilabs.microverse_stability.min_threshold")); + + group.addWidget(new LabelWidget(10, 60, "gui.monilabs.microverse_stability.max")); + group.addWidget(new IntInputWidget(45, 55, 100, 20, + () -> maxPercent, + val -> maxPercent = Mth.clamp(val, 0, 100)) + .setHoverTooltips("gui.monilabs.microverse_stability.max_threshold")); + + return group; + } + @Override public ManagedFieldHolder getFieldHolder() { return MANAGED_FIELD_HOLDER; diff --git a/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedMicroverseTypeSensorHatchPartMachine.java b/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedMicroverseTypeSensorHatchPartMachine.java index 7a0ecf5..c8ad3af 100644 --- a/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedMicroverseTypeSensorHatchPartMachine.java +++ b/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedMicroverseTypeSensorHatchPartMachine.java @@ -1,31 +1,50 @@ package net.neganote.monilabs.common.machine.part; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; +import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture; +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.SelectorWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.BlockHitResult; import net.neganote.monilabs.common.machine.multiblock.Microverse; import net.neganote.monilabs.common.machine.multiblock.MicroverseProjectorMachine; import com.mojang.blaze3d.MethodsReturnNonnullByDefault; +import it.unimi.dsi.fastutil.objects.Object2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import lombok.Getter; import lombok.Setter; import org.jetbrains.annotations.Nullable; +import java.util.Arrays; +import java.util.List; + import javax.annotation.ParametersAreNonnullByDefault; +import static net.neganote.monilabs.common.machine.multiblock.Microverse.ACTUAL_MICROVERSES; + @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class AdvancedMicroverseTypeSensorHatchPartMachine extends MicroverseTypeSensorHatchPartMachine { +public class AdvancedMicroverseTypeSensorHatchPartMachine extends MicroverseTypeSensorHatchPartMachine + implements IFancyUIMachine { @Setter @Getter @Persisted @DescSynced - public Microverse detectorMicroverse; + public Microverse detectorMicroverse = Microverse.NONE; @Setter @Getter @@ -41,6 +60,26 @@ public AdvancedMicroverseTypeSensorHatchPartMachine(IMachineBlockEntity holder) super(holder); } + @Override + public boolean shouldOpenUI(Player player, InteractionHand hand, BlockHitResult hit) { + return true; + } + + public static final Object2ObjectMap MICROVERSE_NAME = new Object2ObjectOpenHashMap<>(); + + static { + for (Microverse microverse : Microverse.values()) { + MICROVERSE_NAME.put(microverse.name(), microverse); + } + } + + private static final List VALID_TYPES = Arrays.asList(ACTUAL_MICROVERSES); + + // Now uses getDisplayName() for plain white text + private static final List ACTUAL_MICROVERSE_DISPLAY_NAMES = VALID_TYPES.stream() + .map(Microverse::getDisplayName) + .toList(); + @Override public int getOutputSignal(@Nullable Direction direction) { if (direction == getFrontFacing().getOpposite()) { @@ -61,6 +100,37 @@ public int getOutputSignal(@Nullable Direction direction) { } } + @Override + public Widget createUIWidget() { + WidgetGroup group = new WidgetGroup(0, 0, 70, 70); + group.addWidget(new LabelWidget(-40, 15, "gui.advanced_chroma_sensor.display")); + + group.addWidget(new SelectorWidget( + -5, 11, 80, 20, + ACTUAL_MICROVERSE_DISPLAY_NAMES, + VALID_TYPES.indexOf(getDetectorMicroverse())) + .setMaxCount(3) + .setOnChanged(selectedName -> { + int index = ACTUAL_MICROVERSE_DISPLAY_NAMES.indexOf(selectedName); + if (index >= 0) { + setDetectorMicroverse(VALID_TYPES.get(index)); + } + }) + .setButtonBackground(ResourceBorderTexture.BUTTON_COMMON) + .setSupplier(() -> { + int idx = VALID_TYPES.indexOf(getDetectorMicroverse()); + return idx >= 0 ? ACTUAL_MICROVERSE_DISPLAY_NAMES.get(idx) : "gui.advanced_chroma_sensor.none"; + })); + + group.addWidget(new ToggleButtonWidget( + 80, 11, 20, 20, + GuiTextures.INVERT_REDSTONE_BUTTON, this::isInverted, this::setInverted) + .isMultiLang() + .setTooltipText("gui.advanced_chroma_sensor.invert")); + + return group; + } + @Override public ManagedFieldHolder getFieldHolder() { return MANAGED_FIELD_HOLDER; diff --git a/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedSculkExperienceSensorHatchPartMachine.java b/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedSculkExperienceSensorHatchPartMachine.java index ca5ba49..84229b2 100644 --- a/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedSculkExperienceSensorHatchPartMachine.java +++ b/src/main/java/net/neganote/monilabs/common/machine/part/AdvancedSculkExperienceSensorHatchPartMachine.java @@ -1,76 +1,130 @@ package net.neganote.monilabs.common.machine.part; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; +import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; import net.minecraft.core.Direction; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.BlockHitResult; +import net.neganote.monilabs.client.gui.MoniGuiTextures; import net.neganote.monilabs.common.machine.multiblock.SculkVatMachine; -import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import lombok.Getter; import lombok.Setter; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; -@MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault public class AdvancedSculkExperienceSensorHatchPartMachine extends SculkExperienceSensorHatchPartMachine { - public static int DEFAULT_MIN_PERCENT = 33; - public static int DEFAULT_MAX_PERCENT = 66; + @Persisted + @Setter + @Getter + @DescSynced + public int minPercent = 33, maxPercent = 66; @Persisted @Setter @Getter - public int minPercent, maxPercent; + @DescSynced + public int minValue = 1000, maxValue = 10000; @Persisted @Setter @Getter + @DescSynced public boolean inverted; + @Persisted + @Setter + @Getter + @DescSynced + public boolean usesPercent = true; + public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( AdvancedSculkExperienceSensorHatchPartMachine.class, SculkExperienceSensorHatchPartMachine.MANAGED_FIELD_HOLDER); public AdvancedSculkExperienceSensorHatchPartMachine(IMachineBlockEntity holder) { super(holder); - minPercent = DEFAULT_MIN_PERCENT; - maxPercent = DEFAULT_MAX_PERCENT; + } + + @Override + public boolean shouldOpenUI(Player player, InteractionHand hand, BlockHitResult hit) { + return true; } @Override public int getOutputSignal(@Nullable Direction direction) { - if (direction != getFrontFacing().getOpposite()) { - return 0; - } + if (direction != getFrontFacing().getOpposite()) return 0; var controller = (SculkVatMachine) getController(); - if (controller == null) { - return 0; - } - - int buffer = controller.getXpBuffer(); + if (controller == null) return 0; - int minXp = (int) (SculkVatMachine.XP_BUFFER_MAX * (minPercent / 100.0)); - int maxXp = (int) (SculkVatMachine.XP_BUFFER_MAX * (maxPercent / 100.0)); + int currentXP = controller.getXpBuffer(); + int min, max; - if (inverted) { - if (buffer >= minXp && buffer <= maxXp) { - return 0; - } else { - return 15; - } + if (usesPercent) { + min = (int) (SculkVatMachine.XP_BUFFER_MAX * (minPercent / 100.0)); + max = (int) (SculkVatMachine.XP_BUFFER_MAX * (maxPercent / 100.0)); } else { - if (buffer >= minXp && buffer <= maxXp) { - return 15; - } else { - return 0; - } + min = minValue; + max = maxValue; } + + boolean inRange = (currentXP >= min && currentXP <= max); + return (inverted ? !inRange : inRange) ? 15 : 0; + } + + @Override + public Widget createUIWidget() { + WidgetGroup group = new WidgetGroup(0, 0, 170, 85); + + group.addWidget(new ToggleButtonWidget( + 10, 5, 18, 18, + GuiTextures.INVERT_REDSTONE_BUTTON, this::isInverted, this::setInverted) + .isMultiLang() + .setTooltipText("gui.monilabs.xp_sensor.invert")); + + group.addWidget(new ToggleButtonWidget(30, 5, 18, 18, + MoniGuiTextures.XP_SENSOR_BUTTON, this::isUsesPercent, this::setUsesPercent) + .isMultiLang() + .setTooltipText("gui.monilabs.xp_sensor.mode_toggle")); + + group.addWidget(new LabelWidget(55, 12, () -> usesPercent ? "gui.monilabs.xp_sensor.mode_percentage" : + "gui.monilabs.xp_sensor.mode_raw_amount")); + + group.addWidget(new LabelWidget(10, 35, "gui.monilabs.xp_sensor.min")); + group.addWidget(new IntInputWidget(45, 30, 100, 20, + () -> usesPercent ? minPercent : minValue, + val -> { + if (usesPercent) minPercent = Mth.clamp(val, 0, 100); + else minValue = Math.max(0, val); + }) + .setHoverTooltips("gui.monilabs.xp_sensor.min_threshold")); + + group.addWidget(new LabelWidget(10, 60, "gui.monilabs.xp_sensor.max")); + group.addWidget(new IntInputWidget(45, 55, 100, 20, + () -> usesPercent ? maxPercent : maxValue, + val -> { + if (usesPercent) maxPercent = Mth.clamp(val, 0, 100); + else maxValue = Math.max(0, val); + }) + .setHoverTooltips("gui.monilabs.xp_sensor.max_threshold")); + + return group; } @Override diff --git a/src/main/java/net/neganote/monilabs/data/lang/MoniLangHandler.java b/src/main/java/net/neganote/monilabs/data/lang/MoniLangHandler.java index 2e28387..4ad0aaf 100644 --- a/src/main/java/net/neganote/monilabs/data/lang/MoniLangHandler.java +++ b/src/main/java/net/neganote/monilabs/data/lang/MoniLangHandler.java @@ -229,7 +229,43 @@ public static void init(RegistrateLangProvider provider) { "half full (this is the maximum)", "Min XP: %d, Max: %d"); - provider.add("monilabs.advanced_chroma_sensor_hatch.toggle", "Toggle redstone output: "); + provider.add("gui.monilabs.chroma.color.display", "Color: "); + provider.add("gui.monilabs.chroma.color.unknown", "Unknown"); + provider.add("gui.monilabs.microverse_stability.min_threshold", "Set minimum threshold"); + provider.add("gui.monilabs.microverse_stability.max_threshold", "Set maximum threshold"); + provider.add("gui.monilabs.microverse_stability.min", "Min: "); + provider.add("gui.monilabs.microverse_stability.max", "Max: "); + provider.add("gui.advanced_chroma_sensor.display", "Type: "); + provider.add("gui.advanced_chroma_sensor.none", "None"); + provider.add("gui.monilabs.xp_sensor.mode_percentage", "Mode: Percentage (%%) "); + provider.add("gui.monilabs.xp_sensor.mode_raw_amount", "Mode: Raw Amount (XP) "); + provider.add("gui.monilabs.xp_sensor.min_threshold", "Set minimum threshold"); + provider.add("gui.monilabs.xp_sensor.max_threshold", "Set maximum threshold"); + provider.add("gui.monilabs.xp_sensor.min", "Min: "); + provider.add("gui.monilabs.xp_sensor.max", "Max: "); + + var advancedChromaSensorHatchDescription = "Toggle to invert the redstone logic\nBy default, redstone stops emitting when the color chosen does not match the active color of the Prismatic Crucible."; + multilineLang(provider, "gui.advanced_chroma_sensor.invert.enabled", + "Output: Inverted\n\n" + advancedChromaSensorHatchDescription); + multilineLang(provider, "gui.advanced_chroma_sensor.invert.disabled", + "Output: Normal\n\n" + advancedChromaSensorHatchDescription); + + var advancedSculkExperienceSensorHatchDescription = "Toggle to invert the redstone logic\nBy default, redstone stops emitting when the raw value or percentage does not match the amount of XP in the internal buffer of the Sculk Vat."; + multilineLang(provider, "gui.monilabs.xp_sensor.invert.enabled", + "Output: Inverted\n\n" + advancedSculkExperienceSensorHatchDescription); + multilineLang(provider, "gui.monilabs.xp_sensor.invert.disabled", + "Output: Normal\n\n" + advancedSculkExperienceSensorHatchDescription); + + var advancedMicroverseStabilitySensorHatchDescription = "Toggle to invert the redstone logic\nBy default, redstone stops emitting when the percentage does not match the current stability of the Microverse Projector."; + multilineLang(provider, "gui.monilabs.microverse_stability_sensor.invert.enabled", + "Output: Inverted\n\n" + advancedMicroverseStabilitySensorHatchDescription); + multilineLang(provider, "gui.monilabs.microverse_stability_sensor.invert.disabled", + "Output: Normal\n\n" + advancedMicroverseStabilitySensorHatchDescription); + + multilineLang(provider, "gui.monilabs.xp_sensor.mode_toggle.enabled", + "Mode: Percentage \n\nToggle to select the mode of Sculk Experience Signal.\nIn this mode, redstone is emitted when the amount of XP in the Sculk Vat matches the percentages"); + multilineLang(provider, "gui.monilabs.xp_sensor.mode_toggle.disabled", + "Mode: Raw Amount\n\nToggle to select the mode of Sculk Experience Signal.\nIn this mode, redstone is emitted when the amount of XP in the Sculk Vat matches the raw values"); dfs(provider, new HashSet<>(), MoniConfig.CONFIG_HOLDER.getValueMap()); } @@ -252,6 +288,11 @@ protected static void multiLang(RegistrateLangProvider provider, String key, Str } } + protected static void multilineLang(RegistrateLangProvider provider, String key, String multiline) { + var lines = multiline.split("\n"); + multiLang(provider, key, lines); + } + protected static String getSubKey(String key, int index) { return key + "." + index; } diff --git a/src/main/resources/assets/monilabs/textures/gui/widget/button_xp_sensor.png b/src/main/resources/assets/monilabs/textures/gui/widget/button_xp_sensor.png new file mode 100644 index 0000000000000000000000000000000000000000..94b84d48fb6fc8c77113f8577ebae7ba2284cf91 GIT binary patch literal 490 zcmVNkl$mZ|HU?&5^_sU;iZ*7>dpKaw&0M9FY zcDvn~YYQO7e!sURIvfsQ>;jClayY%7tfvwkl@bWZ-aOY)WIQtcUI8Nrh~$eOl-y>+ z$Wj-LfDx!Lg71E)@>63IR?o%^^`H@O@a!@G2=l`a$QMg5p?F0aNFWCjgqL;p@Fr>l z2_}F#rM&F<+6Q{z)^8uEZcTY**ETS3tpc*nUIAsPf!{+r2LU1M^fH52Gy-nEHfEng zHwOSz(axS{V+L=~2#6N}4^kV0N;EwaS?Z!IAiW6sKwNEOjSS(5B#;aPJ&{ogAkRUb zXG@gu0B*P2r{nRsSU>|vv6ce3!Yk$c|L>H0e}cH>dxzCr6X^fEAvJ{8>PaAB|B($* z1E|8ISG}wyFq>-a!N^M>yEBNW38Lva-c%Au2oR!1b716}K$@w!F!H|wr!dYD!%AHs zgX*^N=-mWlfI&6X^W+t_U~E7SQ7f!~g&Q literal 0 HcmV?d00001