diff --git a/gradle.properties b/gradle.properties index 1724cfea..e21ac2d8 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/generated/resources/assets/monilabs/lang/en_ud.json b/src/generated/resources/assets/monilabs/lang/en_ud.json index 9b61f047..8b0247a3 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 17e094a1..8540d3fc 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 d8a8de1f..64b72191 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 59451c92..4da67ce6 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 854f83d3..0ced2d02 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 8aca427b..58105eca 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 @@ -3,9 +3,10 @@ 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.widget.Widget; -import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +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; @@ -17,14 +18,22 @@ 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 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, @@ -42,6 +51,20 @@ public class AdvancedChromaSensorHatchPartMachine extends ChromaSensorHatchPartM @DescSynced public boolean inverted = false; + public static final Object2ObjectMap NAME_TO_COLOR = new Object2ObjectOpenHashMap<>(); + + static { + for (Color color : Color.values()) { + NAME_TO_COLOR.put(color.name(), color); + } + } + + 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); } @@ -70,13 +93,35 @@ 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); + + 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( + -5, 11, 80, 20, + ACTUAL_COLOR_DISPLAY_NAMES, + currentIndex) + .setMaxCount(3) + .setOnChanged(selectedName -> { + int index = ACTUAL_COLOR_DISPLAY_NAMES.indexOf(selectedName); + if (index >= 0) { + setDetectorColor(VALID_COLORS.get(index)); + } + }) + .setButtonBackground(ResourceBorderTexture.BUTTON_COMMON) + .setSupplier(() -> { + int idx = VALID_COLORS.indexOf(getDetectorColor()); + return idx >= 0 ? ACTUAL_COLOR_DISPLAY_NAMES.get(idx) : "gui.monilabs.chroma.color.unknown"; + })); group.addWidget(new ToggleButtonWidget( - 9, 20, 20, 20, + 80, 11, 20, 20, GuiTextures.INVERT_REDSTONE_BUTTON, this::isInverted, this::setInverted) .isMultiLang() - .setTooltipText("cover.advanced_energy_detector.invert")); + .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 25da4895..5f441e9e 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 7a0ecf50..c8ad3aff 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 ca5ba49d..84229b25 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 2e28387a..4ad0aafe 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 00000000..94b84d48 Binary files /dev/null and b/src/main/resources/assets/monilabs/textures/gui/widget/button_xp_sensor.png differ