diff --git a/src/generated/resources/assets/gtceu/blockstates/test_mui_new.json b/src/generated/resources/assets/gtceu/blockstates/test_mui_new.json deleted file mode 100644 index 41ab9b075f2..00000000000 --- a/src/generated/resources/assets/gtceu/blockstates/test_mui_new.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "variants": { - "facing=down": { - "model": "gtceu:block/machine/test_mui_new", - "x": 90 - }, - "facing=east": { - "model": "gtceu:block/machine/test_mui_new", - "y": 90 - }, - "facing=north": { - "model": "gtceu:block/machine/test_mui_new" - }, - "facing=south": { - "model": "gtceu:block/machine/test_mui_new", - "y": 180 - }, - "facing=up": { - "gtceu:z": 180, - "model": "gtceu:block/machine/test_mui_new", - "x": 270 - }, - "facing=west": { - "model": "gtceu:block/machine/test_mui_new", - "y": 270 - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 1473ccf0ee7..385b481e206 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -1140,7 +1140,6 @@ "block.gtceu.superconducting_coil": "ʞɔoןᗺ ןıoƆ buıʇɔnpuoɔɹǝdnS", "block.gtceu.tempered_glass": "ssɐן⅁ pǝɹǝdɯǝ⟘", "block.gtceu.test_mui": "ınW ʇsǝ⟘", - "block.gtceu.test_mui_new": "ʍǝN ınW ʇsǝ⟘", "block.gtceu.the_end_marker": "puƎ ǝɥ⟘", "block.gtceu.the_nether_marker": "ɹǝɥʇǝN ǝɥ⟘", "block.gtceu.titanium_crate": "ǝʇɐɹƆ ɯnıuɐʇı⟘", @@ -1785,9 +1784,7 @@ "config.gtceu.option.coloredWireOutline": "ǝuıןʇnOǝɹıMpǝɹoןoɔ", "config.gtceu.option.compat": "ʇɐdɯoɔ", "config.gtceu.option.createCompat": "ʇɐdɯoƆǝʇɐǝɹɔ", - "config.gtceu.option.cursorColor": "ɹoןoƆɹosɹnɔ", "config.gtceu.option.debug": "bnqǝp", - "config.gtceu.option.debugUI": "I∩bnqǝp", "config.gtceu.option.debugWorldgen": "uǝbpןɹoMbnqǝp", "config.gtceu.option.defaultPaintingColor": "ɹoןoƆbuıʇuıɐԀʇןnɐɟǝp", "config.gtceu.option.defaultUIColor": "ɹoןoƆI∩ʇןnɐɟǝp", @@ -1867,7 +1864,6 @@ "config.gtceu.option.meHatchEnergyUsage": "ǝbɐs∩ʎbɹǝuƎɥɔʇɐHǝɯ", "config.gtceu.option.minerSpeed": "pǝǝdSɹǝuıɯ", "config.gtceu.option.minimap": "dɐɯıuıɯ", - "config.gtceu.option.mui": "ınɯ", "config.gtceu.option.nanoSaber": "ɹǝqɐSouɐu", "config.gtceu.option.nanoSaberBaseDamage": "ǝbɐɯɐᗡǝsɐᗺɹǝqɐSouɐu", "config.gtceu.option.nanoSaberDamageBoost": "ʇsooᗺǝbɐɯɐᗡɹǝqɐSouɐu", @@ -1888,7 +1884,6 @@ "config.gtceu.option.oreVeinGridSize": "ǝzıSpıɹ⅁uıǝΛǝɹo", "config.gtceu.option.oreVeinRandomOffset": "ʇǝsɟɟOɯopuɐᴚuıǝΛǝɹo", "config.gtceu.option.oreVeins": "suıǝΛǝɹo", - "config.gtceu.option.outlineColor": "ɹoןoƆǝuıןʇno", "config.gtceu.option.ownerOPBypass": "ssɐdʎᗺԀOɹǝuʍo", "config.gtceu.option.prospectorEnergyUseMultiplier": "ɹǝıןdıʇןnWǝs∩ʎbɹǝuƎɹoʇɔǝdsoɹd", "config.gtceu.option.quantumTank": "ʞuɐ⟘ɯnʇuɐnb", @@ -1908,20 +1903,8 @@ "config.gtceu.option.rngDamageElectricTools": "sןoo⟘ɔıɹʇɔǝןƎǝbɐɯɐᗡbuɹ", "config.gtceu.option.rubberTreeSpawnChance": "ǝɔuɐɥƆuʍɐdSǝǝɹ⟘ɹǝqqnɹ", "config.gtceu.option.sandOresFall": "ןןɐℲsǝɹOpuɐs", - "config.gtceu.option.scale": "ǝןɐɔs", "config.gtceu.option.shouldWeatherOrTerrainExplosion": "uoısoןdxƎuıɐɹɹǝ⟘ɹOɹǝɥʇɐǝMpןnoɥs", "config.gtceu.option.showDimensionTier": "ɹǝı⟘uoısuǝɯıᗡʍoɥs", - "config.gtceu.option.showExtra": "ɐɹʇxƎʍoɥs", - "config.gtceu.option.showHovered": "pǝɹǝʌoHʍoɥs", - "config.gtceu.option.showOutline": "ǝuıןʇnOʍoɥs", - "config.gtceu.option.showParent": "ʇuǝɹɐԀʍoɥs", - "config.gtceu.option.showParentOutline": "ǝuıןʇnOʇuǝɹɐԀʍoɥs", - "config.gtceu.option.showParentPos": "soԀʇuǝɹɐԀʍoɥs", - "config.gtceu.option.showParentSize": "ǝzıSʇuǝɹɐԀʍoɥs", - "config.gtceu.option.showParentWidgetTheme": "ǝɯǝɥ⟘ʇǝbpıMʇuǝɹɐԀʍoɥs", - "config.gtceu.option.showPos": "soԀʍoɥs", - "config.gtceu.option.showSize": "ǝzıSʍoɥs", - "config.gtceu.option.showWidgetTheme": "ǝɯǝɥ⟘ʇǝbpıMʍoɥs", "config.gtceu.option.smallBoilers": "sɹǝןıoᗺןןɐɯs", "config.gtceu.option.smoothProgressBar": "ɹɐᗺssǝɹboɹԀɥʇooɯs", "config.gtceu.option.solarBoilerBaseOutput": "ʇndʇnOǝsɐᗺɹǝןıoᗺɹɐןos", @@ -1935,7 +1918,6 @@ "config.gtceu.option.surfaceRockProspectRange": "ǝbuɐᴚʇɔǝdsoɹԀʞɔoᴚǝɔɐɟɹns", "config.gtceu.option.tankItemFluidPreview": "ʍǝıʌǝɹԀpınןℲɯǝʇIʞuɐʇ", "config.gtceu.option.temperaturesInCelsius": "snısןǝƆuIsǝɹnʇɐɹǝdɯǝʇ", - "config.gtceu.option.textColor": "ɹoןoƆʇxǝʇ", "config.gtceu.option.titaniumBoilerHeatSpeed": "pǝǝdSʇɐǝHɹǝןıoᗺɯnıuɐʇıʇ", "config.gtceu.option.titaniumBoilerMaxTemperature": "ǝɹnʇɐɹǝdɯǝ⟘xɐWɹǝןıoᗺɯnıuɐʇıʇ", "config.gtceu.option.toggle": "ǝןbboʇ", @@ -2061,6 +2043,12 @@ "cover.conveyor.transfer_rate": "ɔǝs/sɯǝʇıㄥ§", "cover.detector_base.message_inverted_state": "pǝʇɹǝʌuI :snʇɐʇS buıɹoʇıuoW", "cover.detector_base.message_normal_state": "ןɐɯɹoN :snʇɐʇS buıɹoʇıuoW", + "cover.disable_with_redstone": "ǝuoʇspǝᴚ ɥʇıʍ ǝןqɐsıᗡ", + "cover.distribution.mode.insert_first": "ʎʇıɹoıɹԀ", + "cover.distribution.mode.round_robin_global": "uıqoᴚ punoᴚ", + "cover.distribution.mode.round_robin_prio": "uoıʇɔıɹʇsǝᴚ ɥʇıʍ uıqoᴚ punoᴚ", + "cover.distribution.mode.title": "ǝpoW uoıʇnqıɹʇsıᗡ", + "cover.enable_with_redstone": "ǝuoʇspǝᴚ ɥʇıʍ ǝןqɐuƎ", "cover.ender_fluid_link.iomode.disabled": "pǝןqɐsıᗡ O/I", "cover.ender_fluid_link.iomode.enabled": "pǝןqɐuƎ O/I", "cover.ender_fluid_link.title": "ʞuıꞀ pınןℲ ɹǝpuƎ", @@ -2079,6 +2067,7 @@ "cover.filter.mode.filter_both": "ʇɔɐɹʇxƎ/ʇɹǝsuI ɹǝʇןıℲ", "cover.filter.mode.filter_extract": "ʇɔɐɹʇxƎ ɹǝʇןıℲ", "cover.filter.mode.filter_insert": "ʇɹǝsuI ɹǝʇןıℲ", + "cover.filter.mode.title": "ǝpoW ɹǝʇןıℲ", "cover.fluid.voiding.advanced.title": "sbuıʇʇǝS buıpıoΛ pınןℲ pǝɔuɐʌpⱯ", "cover.fluid.voiding.title": "sbuıʇʇǝS buıpıoΛ pınןℲ", "cover.fluid_filter.config_amount.0": "˙sǝsɐǝɹɔǝp uʍop 'ʇunoɯɐ sǝsɐǝɹɔuı dn ןǝǝɥʍ ןןoɹɔS", @@ -2111,6 +2100,7 @@ "cover.item_smart_filter.filtering_mode.sifter": "ɹǝʇɟıS", "cover.item_smart_filter.title": "ɹǝʇןıℲ ɯǝʇI ʇɹɐɯS", "cover.machine_controller.control": "ʇǝbɹɐ⟘ ɹǝןןoɹʇuoƆ", + "cover.machine_controller.cover_not_controllable": "ǝןqɐןןoɹʇuoɔ ʇou ɹǝʌoƆ", "cover.machine_controller.invert.disabled.0": "unɹ oʇ ןǝʌǝן ǝuoʇspǝɹ ʇǝs ǝɥʇ uɐɥʇ ɹǝʞɐǝʍ ןɐubıs ɐ ǝɹınbǝɹ ןןıʍ ɹǝʌoɔ ǝɥʇ 'ǝpoɯ sıɥʇ uı - ɹ§ןɐɯɹoNǝ§", "cover.machine_controller.invert.enabled.0": "unɹ oʇ ןǝʌǝן ǝuoʇspǝɹ ʇǝs ǝɥʇ uɐɥʇ ɹǝbuoɹʇs ןɐubıs ɐ ǝɹınbǝɹ ןןıʍ ɹǝʌoɔ ǝɥʇ 'ǝpoɯ sıɥʇ uı - ɹ§pǝʇɹǝʌuIǝ§", "cover.machine_controller.inverted": "pǝʇɹǝʌuI", @@ -2125,18 +2115,23 @@ "cover.machine_controller.normal": "ןɐɯɹoN", "cover.machine_controller.redstone": "%d :ɥʇbuǝɹʇS ǝuoʇspǝᴚ uıW", "cover.machine_controller.suspend_powerfail": ":buıןıɐℲ ɹǝʍoԀ ʇuǝʌǝɹԀ", + "cover.machine_controller.this_cover": "ɹǝʌoɔ sıɥ⟘", "cover.machine_controller.title": "sbuıʇʇǝS ɹǝןןoɹʇuoƆ ǝuıɥɔɐW", + "cover.manual.mode.disabled": "ɹ§pǝןqɐsıᗡq§", + "cover.manual.mode.filtered": "ɹ§pǝɹǝʇןıℲq§", + "cover.manual.mode.title": "O/I ןɐnuɐW", + "cover.manual.mode.unfiltered": "ɹ§pǝɹǝʇןıɟu∩q§", "cover.pump.fluid_filter.title": "ɹǝʇןıℲ pınןℲ", "cover.pump.mode.export": "ʇɹodxƎ :ǝpoW", "cover.pump.mode.import": "ʇɹodɯI :ǝpoW", "cover.pump.title": ")%s( sbuıʇʇǝS ɹǝʌoƆ dɯnԀ", "cover.pump.transfer_rate": "%s", - "cover.robotic_arm.title": ")%s( sbuıʇʇǝS ɯɹⱯ ɔıʇoqoᴚ", "cover.robotic_arm.transfer_mode.description.0": "˙ǝןqıssod sɐ ɹǝʇןıɟ sʇı buıɥɔʇɐɯ sɯǝʇı ʎuɐɯ sɐ ɹǝɟsuɐɹʇ ןןıʍ ɹǝʌoɔ 'ǝpoɯ sıɥʇ uı - ɹ§ʎuⱯ ɹǝɟsuɐɹ⟘ǝ§", "cover.robotic_arm.transfer_mode.description.1": "˙pǝʌoɯ ǝq ʇ,uoʍ sɯǝʇı 'ǝzıs uoıʇɹod uɐɥʇ ssǝן sı sɯǝʇı ɟo ʇunoɯɐ ɟI ˙)ɹǝʇןıɟ bɐʇ ɹoɟ uoʇʇnq sıɥʇ ɹǝpun ǝןqɐıɹɐʌ ɹo( sʇoןs ɹǝʇןıɟ ɯǝʇı uı pǝıɟıɔǝds suoıʇɹod uı sɯǝʇı ʎןddns ןןıʍ ɹǝʌoɔ 'ǝpoɯ sıɥʇ uı - ɹ§ʇɔɐxƎ ʎןddnSǝ§", "cover.robotic_arm.transfer_mode.description.2": "˙pǝɹınbǝɹ ɟı sɯǝʇı ɟo ʇunoɯɐ ןɐuoıʇıppɐ buıʎןddns 'ʎɹoʇuǝʌuı uoıʇɐuıʇsǝp ǝɥʇ uı sɯǝʇı ɟo ʇunoɯɐ pǝıɟıɔǝds dǝǝʞ ןןıʍ ɹǝʌoɔ 'ǝpoɯ sıɥʇ uı - ɹ§ʇɔɐxƎ dǝǝʞǝ§", "cover.robotic_arm.transfer_mode.description.3": "˙ɹǝʇsɐɟ ʇunoɯɐ ǝbuɐɥɔ oʇ buıʞɔıןɔ ʇɟıɥs ǝsn 'ʇunoɯɐ ɯǝʇı ǝbuɐɥɔ oʇ sʇoןs ɹǝʇןıɟ uo ʞɔıןɔ ʇɥbıɹ/ʇɟǝן :dı⟘ㄥ§", "cover.robotic_arm.transfer_mode.keep_exact": "ʇɔɐxƎ dǝǝʞ", + "cover.robotic_arm.transfer_mode.title": "ǝpoW ɹǝɟsuɐɹ⟘", "cover.robotic_arm.transfer_mode.transfer_any": "ʎuⱯ ɹǝɟsuɐɹ⟘", "cover.robotic_arm.transfer_mode.transfer_exact": "ʇɔɐxƎ ʎןddnS", "cover.shutter.message.disabled": "ɹǝʇʇnɥs pǝuǝdO", @@ -2565,6 +2560,7 @@ "gtceu.io.export": "ʇɹodxƎ", "gtceu.io.import": "ʇɹodɯI", "gtceu.io.none": "ǝuoN", + "gtceu.io.title": "ǝpoW OI", "gtceu.item.tooltip.image_url": "%s :Ꞁᴚ∩ ǝbɐɯI", "gtceu.item_filter.empty_item": ")ɯǝʇI oN( ʎʇdɯƎ", "gtceu.item_filter.footer": "ǝpıɹɹǝʌo oʇ ɯǝʇı ɥʇıʍ ʞɔıןƆǝ§", @@ -3844,6 +3840,7 @@ "gtceu.recipe_modifier.default_fail": "ןıɐℲ ɹǝıɟıpoW ǝdıɔǝᴚ", "gtceu.recipe_modifier.insufficient_eu_to_start_fusion": "uoıʇɔɐǝᴚ uoısnℲ ǝʇɐıʇıuI oʇ ʎbɹǝuƎ ʇuǝıɔıɟɟnsuI", "gtceu.recipe_modifier.insufficient_voltage": "ʍoꞀ oo⟘ ɹǝı⟘ ǝbɐʇןoΛ", + "gtceu.recipe_type.show_recipes": "sǝdıɔǝᴚ ʍoɥS", "gtceu.rei.group.potion_fluids": "spınןℲ uoıʇoԀ", "gtceu.research_station": "uoıʇɐʇS ɥɔɹɐǝsǝᴚ", "gtceu.rock_breaker": "ɹǝʞɐǝɹᗺ ʞɔoᴚ", @@ -4056,7 +4053,6 @@ "gui.gtceu.share_tank.desc.0": "¡ɹǝɟɟnq uıɥʇıʍ suɹǝʇʇɐd ןןɐ ɥʇıʍ ˙ɔʇǝ/sǝssɐb/spınןɟ pǝʇɹǝsuı sǝɹɐɥS", "gui.gtceu.share_tank.title": "ʎɹoʇuǝʌuI ʞuɐ⟘ pǝɹɐɥS", "gui.widget.incrementButton.default_tooltip": "ʇunoɯɐ ǝɥʇ ǝbuɐɥɔ oʇ ɥʇoq ɹo ןɹʇƆ 'ʇɟıɥS pןoH", - "gui.widget.recipeProgressWidget.default_tooltip": "sǝdıɔǝᴚ ʍoɥS", "item.glass_lens": ")ǝʇıɥM( suǝꞀ ssɐן⅁", "item.gtceu.activity_detector_cover": "ɹoʇɔǝʇǝᗡ ʎʇıʌıʇɔⱯ", "item.gtceu.activity_detector_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ǝuoʇspǝᴚ sɐ ㄥ§snʇɐʇS ʎʇıʌıʇɔⱯɟ§ ʇno sǝʌı⅁ㄥ§", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 6233a2e9bec..0f901a21151 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1140,7 +1140,6 @@ "block.gtceu.superconducting_coil": "Superconducting Coil Block", "block.gtceu.tempered_glass": "Tempered Glass", "block.gtceu.test_mui": "Test Mui", - "block.gtceu.test_mui_new": "Test Mui New", "block.gtceu.the_end_marker": "The End", "block.gtceu.the_nether_marker": "The Nether", "block.gtceu.titanium_crate": "Titanium Crate", @@ -1785,9 +1784,7 @@ "config.gtceu.option.coloredWireOutline": "coloredWireOutline", "config.gtceu.option.compat": "compat", "config.gtceu.option.createCompat": "createCompat", - "config.gtceu.option.cursorColor": "cursorColor", "config.gtceu.option.debug": "debug", - "config.gtceu.option.debugUI": "debugUI", "config.gtceu.option.debugWorldgen": "debugWorldgen", "config.gtceu.option.defaultPaintingColor": "defaultPaintingColor", "config.gtceu.option.defaultUIColor": "defaultUIColor", @@ -1867,7 +1864,6 @@ "config.gtceu.option.meHatchEnergyUsage": "meHatchEnergyUsage", "config.gtceu.option.minerSpeed": "minerSpeed", "config.gtceu.option.minimap": "minimap", - "config.gtceu.option.mui": "mui", "config.gtceu.option.nanoSaber": "nanoSaber", "config.gtceu.option.nanoSaberBaseDamage": "nanoSaberBaseDamage", "config.gtceu.option.nanoSaberDamageBoost": "nanoSaberDamageBoost", @@ -1888,7 +1884,6 @@ "config.gtceu.option.oreVeinGridSize": "oreVeinGridSize", "config.gtceu.option.oreVeinRandomOffset": "oreVeinRandomOffset", "config.gtceu.option.oreVeins": "oreVeins", - "config.gtceu.option.outlineColor": "outlineColor", "config.gtceu.option.ownerOPBypass": "ownerOPBypass", "config.gtceu.option.prospectorEnergyUseMultiplier": "prospectorEnergyUseMultiplier", "config.gtceu.option.quantumTank": "quantumTank", @@ -1908,20 +1903,8 @@ "config.gtceu.option.rngDamageElectricTools": "rngDamageElectricTools", "config.gtceu.option.rubberTreeSpawnChance": "rubberTreeSpawnChance", "config.gtceu.option.sandOresFall": "sandOresFall", - "config.gtceu.option.scale": "scale", "config.gtceu.option.shouldWeatherOrTerrainExplosion": "shouldWeatherOrTerrainExplosion", "config.gtceu.option.showDimensionTier": "showDimensionTier", - "config.gtceu.option.showExtra": "showExtra", - "config.gtceu.option.showHovered": "showHovered", - "config.gtceu.option.showOutline": "showOutline", - "config.gtceu.option.showParent": "showParent", - "config.gtceu.option.showParentOutline": "showParentOutline", - "config.gtceu.option.showParentPos": "showParentPos", - "config.gtceu.option.showParentSize": "showParentSize", - "config.gtceu.option.showParentWidgetTheme": "showParentWidgetTheme", - "config.gtceu.option.showPos": "showPos", - "config.gtceu.option.showSize": "showSize", - "config.gtceu.option.showWidgetTheme": "showWidgetTheme", "config.gtceu.option.smallBoilers": "smallBoilers", "config.gtceu.option.smoothProgressBar": "smoothProgressBar", "config.gtceu.option.solarBoilerBaseOutput": "solarBoilerBaseOutput", @@ -1935,7 +1918,6 @@ "config.gtceu.option.surfaceRockProspectRange": "surfaceRockProspectRange", "config.gtceu.option.tankItemFluidPreview": "tankItemFluidPreview", "config.gtceu.option.temperaturesInCelsius": "temperaturesInCelsius", - "config.gtceu.option.textColor": "textColor", "config.gtceu.option.titaniumBoilerHeatSpeed": "titaniumBoilerHeatSpeed", "config.gtceu.option.titaniumBoilerMaxTemperature": "titaniumBoilerMaxTemperature", "config.gtceu.option.toggle": "toggle", @@ -2061,6 +2043,12 @@ "cover.conveyor.transfer_rate": "§7items/sec", "cover.detector_base.message_inverted_state": "Monitoring Status: Inverted", "cover.detector_base.message_normal_state": "Monitoring Status: Normal", + "cover.disable_with_redstone": "Disable with Redstone", + "cover.distribution.mode.insert_first": "Priority", + "cover.distribution.mode.round_robin_global": "Round Robin", + "cover.distribution.mode.round_robin_prio": "Round Robin with Restriction", + "cover.distribution.mode.title": "Distribution Mode", + "cover.enable_with_redstone": "Enable with Redstone", "cover.ender_fluid_link.iomode.disabled": "I/O Disabled", "cover.ender_fluid_link.iomode.enabled": "I/O Enabled", "cover.ender_fluid_link.title": "Ender Fluid Link", @@ -2079,6 +2067,7 @@ "cover.filter.mode.filter_both": "Filter Insert/Extract", "cover.filter.mode.filter_extract": "Filter Extract", "cover.filter.mode.filter_insert": "Filter Insert", + "cover.filter.mode.title": "Filter Mode", "cover.fluid.voiding.advanced.title": "Advanced Fluid Voiding Settings", "cover.fluid.voiding.title": "Fluid Voiding Settings", "cover.fluid_filter.config_amount.0": "Scroll wheel up increases amount, down decreases.", @@ -2111,6 +2100,7 @@ "cover.item_smart_filter.filtering_mode.sifter": "Sifter", "cover.item_smart_filter.title": "Smart Item Filter", "cover.machine_controller.control": "Controller Target", + "cover.machine_controller.cover_not_controllable": "Cover not controllable", "cover.machine_controller.invert.disabled.0": "§eNormal§r - in this mode, the cover will require a signal weaker than the set redstone level to run", "cover.machine_controller.invert.enabled.0": "§eInverted§r - in this mode, the cover will require a signal stronger than the set redstone level to run", "cover.machine_controller.inverted": "Inverted", @@ -2125,18 +2115,23 @@ "cover.machine_controller.normal": "Normal", "cover.machine_controller.redstone": "Min Redstone Strength: %d", "cover.machine_controller.suspend_powerfail": "Prevent Power Failing:", + "cover.machine_controller.this_cover": "This cover", "cover.machine_controller.title": "Machine Controller Settings", + "cover.manual.mode.disabled": "§bDisabled§r", + "cover.manual.mode.filtered": "§bFiltered§r", + "cover.manual.mode.title": "Manual I/O", + "cover.manual.mode.unfiltered": "§bUnfiltered§r", "cover.pump.fluid_filter.title": "Fluid Filter", "cover.pump.mode.export": "Mode: Export", "cover.pump.mode.import": "Mode: Import", "cover.pump.title": "Pump Cover Settings (%s)", "cover.pump.transfer_rate": "%s", - "cover.robotic_arm.title": "Robotic Arm Settings (%s)", "cover.robotic_arm.transfer_mode.description.0": "§eTransfer Any§r - in this mode, cover will transfer as many items matching its filter as possible.", "cover.robotic_arm.transfer_mode.description.1": "§eSupply Exact§r - in this mode, cover will supply items in portions specified in item filter slots (or variable under this button for tag filter). If amount of items is less than portion size, items won't be moved.", "cover.robotic_arm.transfer_mode.description.2": "§eKeep Exact§r - in this mode, cover will keep specified amount of items in the destination inventory, supplying additional amount of items if required.", "cover.robotic_arm.transfer_mode.description.3": "§7Tip: left/right click on filter slots to change item amount, use shift clicking to change amount faster.", "cover.robotic_arm.transfer_mode.keep_exact": "Keep Exact", + "cover.robotic_arm.transfer_mode.title": "Transfer Mode", "cover.robotic_arm.transfer_mode.transfer_any": "Transfer Any", "cover.robotic_arm.transfer_mode.transfer_exact": "Supply Exact", "cover.shutter.message.disabled": "Opened shutter", @@ -2565,6 +2560,7 @@ "gtceu.io.export": "Export", "gtceu.io.import": "Import", "gtceu.io.none": "None", + "gtceu.io.title": "IO Mode", "gtceu.item.tooltip.image_url": "Image URL: %s", "gtceu.item_filter.empty_item": "Empty (No Item)", "gtceu.item_filter.footer": "§eClick with item to override", @@ -3844,6 +3840,7 @@ "gtceu.recipe_modifier.default_fail": "Recipe Modifier Fail", "gtceu.recipe_modifier.insufficient_eu_to_start_fusion": "Insufficient Energy to Initiate Fusion Reaction", "gtceu.recipe_modifier.insufficient_voltage": "Voltage Tier Too Low", + "gtceu.recipe_type.show_recipes": "Show Recipes", "gtceu.rei.group.potion_fluids": "Potion Fluids", "gtceu.research_station": "Research Station", "gtceu.rock_breaker": "Rock Breaker", @@ -4056,7 +4053,6 @@ "gui.gtceu.share_tank.desc.0": "Shares inserted fluids/gasses/etc. with all patterns within buffer!", "gui.gtceu.share_tank.title": "Shared Tank Inventory", "gui.widget.incrementButton.default_tooltip": "Hold Shift, Ctrl or both to change the amount", - "gui.widget.recipeProgressWidget.default_tooltip": "Show Recipes", "item.glass_lens": "Glass Lens (White)", "item.gtceu.activity_detector_cover": "Activity Detector", "item.gtceu.activity_detector_cover.tooltip": "§7Gives out §fActivity Status§7 as Redstone as §fCover§7.", diff --git a/src/generated/resources/assets/gtceu/models/block/machine/test_mui_new.json b/src/generated/resources/assets/gtceu/models/block/machine/test_mui_new.json deleted file mode 100644 index 12fd1d59a84..00000000000 --- a/src/generated/resources/assets/gtceu/models/block/machine/test_mui_new.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "parent": "minecraft:block/block", - "loader": "gtceu:machine", - "machine": "gtceu:test_mui_new", - "replaceable_textures": [ - "all" - ], - "variants": { - "recipe_logic_status=idle": { - "model": { - "parent": "gtceu:block/machine/part/computer_monitor", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel" - } - } - }, - "recipe_logic_status=suspend": { - "model": { - "parent": "gtceu:block/machine/part/computer_monitor", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel" - } - } - }, - "recipe_logic_status=waiting": { - "model": { - "parent": "gtceu:block/machine/part/computer_monitor", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel" - } - } - }, - "recipe_logic_status=working": { - "model": { - "parent": "gtceu:block/machine/part/computer_monitor", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel" - } - } - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/test_mui_new.json b/src/generated/resources/assets/gtceu/models/item/test_mui_new.json deleted file mode 100644 index e741c72dc8d..00000000000 --- a/src/generated/resources/assets/gtceu/models/item/test_mui_new.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "gtceu:block/machine/test_mui_new" -} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IO.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IO.java index ba6ef3a0ca1..2bd2d1cf27d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IO.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IO.java @@ -8,19 +8,26 @@ */ public enum IO { - IN("gtceu.io.import", "import"), - OUT("gtceu.io.export", "export"), - BOTH("gtceu.io.both", "both"), - NONE("gtceu.io.none", "none"); + IN("import"), + OUT("export"), + BOTH("both"), + NONE("none"); - @Getter - public final String tooltip; + public final String localeName; @Getter public final UITexture uiTexture; - IO(String tooltip, String textureName) { - this.tooltip = tooltip; - this.uiTexture = UITexture.fullImage("gtceu:textures/gui/icon/io_mode/" + textureName + ".png"); + IO(String localeName) { + this.localeName = localeName; + this.uiTexture = UITexture.fullImage("gtceu:textures/gui/icon/io_mode/" + localeName + ".png"); + } + + public static String getTitle() { + return "gtceu.io.title"; + } + + public String getTooltip() { + return "gtceu.io." + localeName; } public boolean support(IO io) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/IMuiCover.java b/src/main/java/com/gregtechceu/gtceu/api/cover/IMuiCover.java index e1eae3187b0..82c03427bec 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/IMuiCover.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/IMuiCover.java @@ -5,6 +5,7 @@ import com.gregtechceu.gtceu.common.mui.GTGuiTheme; import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -46,8 +47,8 @@ default ModularScreen createScreen(SidedPosGuiData data, ModularPanel mainPan @Override default ModularPanel buildUI(SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { ModularPanel panel = ModularPanel.defaultPanel(this.self().coverDefinition.getId().getPath(), 176, 192 + 18); - - panel.child(GTMuiWidgets.createTitleBar(this.self().getAttachItem(), 176, GTGuiTextures.BACKGROUND)); + ItemStack stack = this.self().coverHolder.getCoverAtSide(this.self().attachedSide).getAttachItem(); + panel.child(GTMuiWidgets.createTitleBar(() -> stack, 176, GTGuiTextures.BACKGROUND)); Flow column = Flow.column() .top(7).margin(7, 0) diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java index cdb011c12c0..25998e3c8d0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.api.cover.filter; +import brachy.modularui.widgets.layout.Flow; import net.minecraft.nbt.CompoundTag; import brachy.modularui.factory.GuiData; @@ -17,6 +18,8 @@ public interface Filter> extends Predicate { */ ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings); + Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings); + CompoundTag saveFilter(); void setOnUpdated(Consumer onUpdated); diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FluidFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FluidFilter.java index eb2c1191c4e..cd4bbca8f55 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FluidFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FluidFilter.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.api.cover.filter; +import brachy.modularui.widgets.layout.Flow; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; @@ -60,6 +61,11 @@ public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISe return null; } + @Override + public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { + return null; + } + @Override public CompoundTag saveFilter() { throw new NotImplementedException("Not available for empty fluid filter"); diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/ItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/ItemFilter.java index a149cd64ab3..ab1b03bc254 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/ItemFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/ItemFilter.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.api.cover.filter; +import brachy.modularui.widgets.layout.Flow; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; @@ -59,6 +60,11 @@ public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISe return null; } + @Override + public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { + return null; + } + @Override public CompoundTag saveFilter() { throw new NotImplementedException("Not available for empty item filter"); diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java index 083d95dd2d1..ad04d62d4cf 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java @@ -119,6 +119,16 @@ public void setIgnoreNbt(boolean ingoreNbt) { @Override public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) { + return new Dialog<>("simple_fluid_filter") + .disablePanelsBelow(false) + .draggable(true) + .closeOnOutOfBoundsClick(true) + .child(GTMuiWidgets.createTitleBar(() -> GTItems.FLUID_FILTER.asStack(), 176, GTGuiTextures.BACKGROUND)) + .child(getFilterUI(data, syncManager, settings).top(10)) + .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); + } + + public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings){ for (int i = 0; i < 9; i++) { syncManager.syncValue("filter_slot_" + i, new FluidSlotSyncHandler(fluidStorageSlots[i]).controlsAmount(true).phantom(true)); @@ -128,28 +138,20 @@ public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISe .coverChildren() .gridOfSizeWidth(9, 3, (x, y, i) -> new FluidSlot().syncHandler("filter_slot_" + i)); - BooleanSyncValue blacklist = new BooleanSyncValue(this::isBlackList, this::setBlackList); + BooleanSyncValue blacklist = new BooleanSyncValue(this::isBlackList, this::setBlackList).allowC2S(); syncManager.syncValue("blacklist", blacklist); - BooleanSyncValue ignoreNBT = new BooleanSyncValue(this::isIgnoreNbt, this::setIgnoreNbt); + BooleanSyncValue ignoreNBT = new BooleanSyncValue(this::isIgnoreNbt, this::setIgnoreNbt).allowC2S(); syncManager.syncValue("ignoreNBT", ignoreNBT); Flow filterConfigButtons = Flow.col() .coverChildren() .child(new ToggleButton().stateBackground(GTGuiTextures.BUTTON_BLACKLIST).syncHandler("blacklist")) .child(new ToggleButton().stateBackground(GTGuiTextures.BUTTON_IGNORE_NBT).syncHandler("ignoreNBT")); - - return new Dialog<>("simple_fluid_filter") - .disablePanelsBelow(false) - .draggable(true) - .closeOnOutOfBoundsClick(true) - .child(GTMuiWidgets.createTitleBar(GTItems.FLUID_FILTER.asStack(), 176, GTGuiTextures.BACKGROUND)) - .child(Flow.row() - .top(10) - .coverChildrenHeight() - .child(filterGrid.horizontalCenter()) - .child(filterConfigButtons.marginLeft(118))) - .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); + return Flow.row() + .coverChildrenHeight() + .child(filterGrid.horizontalCenter()) + .child(filterConfigButtons.marginLeft(118)); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java index 0c79718beca..439a3a54a98 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java @@ -111,6 +111,19 @@ public void setIgnoreNbt(boolean ingoreNbt) { @Override public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) { + + + return new Dialog<>("simple_item_filter") + .disablePanelsBelow(false) + .draggable(true) + .closeOnOutOfBoundsClick(true) + .child(GTMuiWidgets.createTitleBar(() -> GTItems.ITEM_FILTER.asStack(), 176, GTGuiTextures.BACKGROUND)) + .child(getFilterUI(data, syncManager, settings).top(10)) + .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); + } + + @Override + public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { FilterItemStackHandler handler = new FilterItemStackHandler(matches, this); Grid filterGrid = new Grid() @@ -122,28 +135,20 @@ public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISe handler.setStackInSlot(i, stack); }).ignoreMaxStackSize(true).accessibility(true, false)))); - BooleanSyncValue blacklist = new BooleanSyncValue(this::isBlackList, this::setBlackList); + BooleanSyncValue blacklist = new BooleanSyncValue(this::isBlackList, this::setBlackList).allowC2S(); syncManager.syncValue("blacklist", blacklist); - BooleanSyncValue ignoreNBT = new BooleanSyncValue(this::isIgnoreNbt, this::setIgnoreNbt); + BooleanSyncValue ignoreNBT = new BooleanSyncValue(this::isIgnoreNbt, this::setIgnoreNbt).allowC2S(); syncManager.syncValue("ignoreNBT", ignoreNBT); Flow filterConfigButtons = Flow.col() .coverChildren() .child(new ToggleButton().stateBackground(GTGuiTextures.BUTTON_BLACKLIST).syncHandler("blacklist")) .child(new ToggleButton().stateBackground(GTGuiTextures.BUTTON_IGNORE_NBT).syncHandler("ignoreNBT")); - - return new Dialog<>("simple_item_filter") - .disablePanelsBelow(false) - .draggable(true) - .closeOnOutOfBoundsClick(true) - .child(GTMuiWidgets.createTitleBar(GTItems.ITEM_FILTER.asStack(), 176, GTGuiTextures.BACKGROUND)) - .child(Flow.row() - .top(10) - .coverChildrenHeight() - .child(filterGrid.horizontalCenter()) - .child(filterConfigButtons.marginLeft(118))) - .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); + return Flow.row() + .coverChildrenHeight() + .child(filterGrid.horizontalCenter()) + .child(filterConfigButtons.marginLeft(118)); } public static class FilterItemStackHandler extends CustomItemStackHandler { diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java index 5d95bd47895..34bb229b2a7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java @@ -1,5 +1,15 @@ package com.gregtechceu.gtceu.api.cover.filter; +import brachy.modularui.api.value.IBoolValue; +import brachy.modularui.drawable.DynamicDrawable; +import brachy.modularui.drawable.GuiTextures; +import brachy.modularui.value.BoolValue; +import brachy.modularui.value.sync.BooleanSyncValue; +import brachy.modularui.widgets.ListWidget; +import brachy.modularui.widgets.ToggleButton; +import brachy.modularui.widgets.layout.Flow; +import brachy.modularui.widgets.menu.ContextMenuButton; +import brachy.modularui.widgets.menu.Menu; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; @@ -83,24 +93,52 @@ private void setFilterMode(SmartFilteringMode filterMode) { @Override public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) { - EnumSyncValue mode = new EnumSyncValue<>(SmartFilteringMode.class, - this::getFilterMode, this::setFilterMode); - - syncManager.syncValue("mode", mode); - return new Dialog<>("smart_item_filter") .disablePanelsBelow(false) .draggable(true) .closeOnOutOfBoundsClick(true) - .child(GTMuiWidgets.createTitleBar(GTItems.SMART_ITEM_FILTER.asStack(), 176, GTGuiTextures.BACKGROUND)) - .child(new GTMuiWidgets.EnumRowBuilder<>(SmartFilteringMode.class) - .value(mode) - .overlay(16, SmartFilteringMode.getTextures()) - .lang(Text.dynamic(() -> Component.translatable(filterMode.localeName))) - .build().margin(7)) + .child(GTMuiWidgets.createTitleBar(() -> GTItems.SMART_ITEM_FILTER.asStack(), 176, GTGuiTextures.BACKGROUND)) + .child(getFilterUI(data, syncManager, settings)) .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); } + @Override + public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { + EnumSyncValue mode = new EnumSyncValue<>(SmartFilteringMode.class, + this::getFilterMode, this::setFilterMode).allowC2S(); + + syncManager.syncValue("mode", mode); + + return Flow.row() + .child(new ContextMenuButton<>("smart_filter") + .size(18) + .requiresClick() + .tooltip(r -> r.add(Text.str("Set Machine Recipe Type"))) + .openRightDown() + .overlay(new DynamicDrawable(() -> SmartFilteringMode.getTextures()[mode.getIntValue()])) + .menu(new Menu<>() + .width(20) + .coverChildrenHeight() + .padding(2) + .child(new ListWidget<>() + .maxSize(SmartFilteringMode.VALUES.length * 20) + .widthRel(1.f) + .children(SmartFilteringMode.VALUES.length, w -> { + IBoolValue bsv = new BoolValue.Dynamic(() -> mode.getIntValue() == w, bool -> mode.setIntValue(w)); + + return new ToggleButton() + .overlay(SmartFilteringMode.getTextures()[w]) + .background(GuiTextures.MC_BUTTON) + .selectedBackground(GuiTextures.MC_BUTTON) + .value(bsv) + .tooltip(r -> r.add(Text.comp(Component.translatable(SmartFilteringMode.VALUES[w].getTooltip())))); + }) + ) + ) + ) + .child(Text.str("Recipe Type").asWidget().verticalCenter().rightRel(0.f)); + } + @Override public boolean test(ItemStack itemStack) { return testItemCount(itemStack) > 0; diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java index 83aace338fa..0f221b89b72 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java @@ -57,22 +57,27 @@ public void setFilterString(String filterString) { @Override public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) { - StringSyncValue filterString = new StringSyncValue(this::getFilterString, this::setFilterString); - RichTooltip infoTooltip = new RichTooltip().add("cover.tag_filter.info"); - - var inputRow = Flow.row().margin(7).coverChildren().horizontalCenter() - .child(new TextFieldWidget().width(140).value(filterString)) - .child(GTGuiTextures.INFO.asWidget().tooltip(infoTooltip)); - return new Dialog<>("tag_filter") .disablePanelsBelow(false) .draggable(true) .closeOnOutOfBoundsClick(true) - .child(GTMuiWidgets.createTitleBar(getFilterItem(), 176, GTGuiTextures.BACKGROUND)) - .child(inputRow) + .child(GTMuiWidgets.createTitleBar(() -> getFilterItem(), 176, GTGuiTextures.BACKGROUND)) + .child(getFilterUI(data, syncManager, settings).margin(7).horizontalCenter()) .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); } + @Override + public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { + StringSyncValue filterString = new StringSyncValue(this::getFilterString, this::setFilterString).allowC2S(); + RichTooltip infoTooltip = new RichTooltip().add("cover.tag_filter.info"); + + var inputRow = Flow.row() + .coverChildren() + .child(new TextFieldWidget().width(140).value(filterString)) + .child(GTGuiTextures.INFO.asWidget().tooltip(infoTooltip)); + return inputRow; + } + @Override public void setOnUpdated(Consumer onUpdated) { this.onUpdated = filter -> { diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFluidFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFluidFilter.java index 014a14e0898..f2858c344fe 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFluidFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFluidFilter.java @@ -1,5 +1,9 @@ package com.gregtechceu.gtceu.api.cover.filter; +import brachy.modularui.factory.GuiData; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widgets.layout.Flow; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.utils.TagExprFilter; @@ -57,6 +61,11 @@ public boolean test(FluidStack fluidStack) { return false; } + @Override + public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { + return super.getFilterUI(data, syncManager, settings); + } + @Override public int testFluidAmount(FluidStack fluidStack) { return test(fluidStack) ? Integer.MAX_VALUE : 0; diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagItemFilter.java index e33eca3e7df..5439096f485 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagItemFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagItemFilter.java @@ -1,5 +1,9 @@ package com.gregtechceu.gtceu.api.cover.filter; +import brachy.modularui.factory.GuiData; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widgets.layout.Flow; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.utils.TagExprFilter; @@ -39,6 +43,11 @@ public void setFilterString(String oreDict) { super.setFilterString(oreDict); } + @Override + public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { + return super.getFilterUI(data, syncManager, settings); + } + @Override protected ItemStack getFilterItem() { return GTItems.TAG_FILTER.asStack(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index f4b398b1222..76ab5393e0e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -515,8 +515,11 @@ public InteractionResult onUseWithItem(ExtendedUseOnContext context) { */ public InteractionResult onUse(ExtendedUseOnContext context) { if (context.getPlayer().isShiftKeyDown()) { - var cover = coverContainer.getCoverAtSide(context.getClickedFace()); - if (cover != null) cover.onScrewdriverClick(context); + var cover = coverContainer.getCoverAtSide(context.getGridSide()); + if (cover != null) { + var result = cover.onScrewdriverClick(context); + if (result == InteractionResult.CONSUME) return result; + } } for (var trait : getAllTraits()) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanel.java b/src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanel.java index beb944f924a..fa8a105fe99 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanel.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanel.java @@ -65,6 +65,7 @@ public MachineUIPanel(MetaMachine machine, UISettings settings, boolean attachPl panelContents.child(mainContents); if (attachPlayerInventory) { + panelContents.childPadding(2); var inventory = SlotGroupWidget.playerInventory((index, slot) -> slot) .marginTop(1) .marginBottom(3); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanelBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanelBuilder.java index 4fb2dd0f2ae..46e5e2e58e7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanelBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanelBuilder.java @@ -11,10 +11,12 @@ import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; +import brachy.modularui.drawable.ItemDrawable; import brachy.modularui.drawable.UITexture; import brachy.modularui.screen.UISettings; import brachy.modularui.value.sync.PanelSyncManager; import brachy.modularui.widget.ParentWidget; +import brachy.modularui.widgets.ButtonWidget; import brachy.modularui.widgets.layout.Flow; import lombok.Setter; import lombok.experimental.Accessors; @@ -99,6 +101,14 @@ public MachineUIPanel build(PanelSyncManager syncManager, UISettings settings) { } } + for (var cover : machine.getCoverContainer().getCovers()) { + attachLeft.child(new ButtonWidget<>() + .overlay(new ItemDrawable(cover.getAttachItem())) + .onMousePressed((context, button) -> { + return true; + })); + } + return panel; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java index 722707ac062..e5b181ff6e7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java @@ -37,6 +37,7 @@ import brachy.modularui.api.drawable.Text; import brachy.modularui.drawable.UITexture; +import brachy.modularui.drawable.progress.ProgressDrawable; import brachy.modularui.factory.PosGuiData; import brachy.modularui.screen.UISettings; import brachy.modularui.value.sync.DoubleSyncValue; @@ -332,10 +333,9 @@ public void buildMainUI(ParentWidget mainWidget, PosGuiData guiData, PanelSyn .size(14, 54)) .child(new ProgressWidget() .texture(progressTexture, - GTGuiTextures.PROGRESS_BAR_BOILER_HEAT, 54) + GTGuiTextures.PROGRESS_BAR_BOILER_HEAT, ProgressDrawable.Direction.UP) .size(14, 54) .value(tempPercentage) - .direction(ProgressWidget.Direction.UP) .tooltipAutoUpdate(true) .tooltipBuilder((r) -> r.addLine(Text .lang("gtceu.fluid.temperature", getCurrentTemperature()))))); diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java index 37b4b511e86..1cd5a12a9b6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java @@ -229,7 +229,7 @@ public static ActionResult handleRecipe(IRecipeCapabilityHolder holder, GTRecipe if (!simulated && ConfigHolder.INSTANCE.dev.debug) { GTCEu.LOGGER.warn("IO {} Error while handling recipe {} outputs for {}", - Component.translatable(io.tooltip).getString(), recipe, holder); + Component.translatable(io.getTooltip()).getString(), recipe, holder); } String key = "gtceu.recipe_logic.insufficient_" + (io == IO.IN ? "in" : "out"); return ActionResult.fail(Component.translatable(key) diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java index 67e6a18b109..0bc6050ace0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java @@ -124,7 +124,7 @@ private ActionResult handleContents() { return ActionResult.fail( Component.translatable("gtceu.recipe_logic.no_capabilities") .append(Component.literal(": ")) - .append(Component.translatable(io.tooltip)), + .append(Component.translatable(io.getTooltip())), null, io); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/category/GTRecipeCategory.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/category/GTRecipeCategory.java index 52900b5b7e1..cee9e45f1cd 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/category/GTRecipeCategory.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/category/GTRecipeCategory.java @@ -58,8 +58,11 @@ public static GTRecipeCategory registerDefault(@NotNull GTRecipeType recipeType) public CategoryIcon getIcon() { if (icon == null) { - if (recipeType.getIconSupplier() != null) icon = new CategoryIcon(recipeType.getIconSupplier().get()); - else icon = new CategoryIcon(new ItemStack(Items.BARRIER)); + if (recipeType.getIconSupplier() != null) { + icon = new CategoryIcon(recipeType.getIconSupplier().get()); + } else { + icon = new CategoryIcon(new ItemStack(Items.BARRIER)); + } } return icon; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/GTRecipeTypeMachineWidget.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/GTRecipeTypeMachineWidget.java index 30f6b9403e0..e87a76c722a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/GTRecipeTypeMachineWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/GTRecipeTypeMachineWidget.java @@ -13,6 +13,7 @@ import brachy.modularui.value.sync.DoubleSyncValue; import brachy.modularui.value.sync.PanelSyncManager; import brachy.modularui.widgets.layout.Flow; +import net.minecraft.network.chat.Component; import java.util.function.DoubleSupplier; @@ -55,7 +56,7 @@ public GTRecipeTypeMachineWidget(GTRecipeType recipeType, PanelSyncManager syncM return true; }); - child(progressWidget.tooltip(r -> r.addLine(Text.lang("gtceu.recipe_type.show_recipes")))); + child(progressWidget.tooltip(r -> r.add(Text.comp(Component.translatable("gtceu.recipe_type.show_recipes"))))); child(outputColumn); for (var entry : recipeType.maxInputs.object2IntEntrySet()) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/GTRecipeTypeUILayout.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/GTRecipeTypeUILayout.java index f15bc22dd5c..7734c3e4757 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/GTRecipeTypeUILayout.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/GTRecipeTypeUILayout.java @@ -350,12 +350,13 @@ public Builder setCapabilityContentBuilder(RecipeCapability cap, CapabilityCo public GTRecipeTypeUILayout build() { var progressWidgetSupplier = this.progressWidgetSupplier; - if (progressWidgetSupplier == null) progressWidgetSupplier = (l, v, m) -> new ProgressWidget() - .value(v) - .name("progressBar") - .texture(progressBar.get(m), progressBar.progressSize()) - .size(progressBar.progressSize()) - .direction(progressBar.fillDirection()); + if (progressWidgetSupplier == null) { + progressWidgetSupplier = (l, v, m) -> new ProgressWidget() + .value(v) + .name("progressBar") + .texture(progressBar.get(m), progressBar.fillDirection()) + .size(progressBar.progressSize()); + } var layout = new GTRecipeTypeUILayout(recipeType, capabilityInfo, recipeUIModifiers, progressWidgetSupplier, customUIBuilder); diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/GTRecipeViewerWidget.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/GTRecipeViewerWidget.java index 0c0489b6cd8..d487d23d27f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/GTRecipeViewerWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/GTRecipeViewerWidget.java @@ -88,7 +88,8 @@ public GTRecipeViewerWidget(GTRecipe recipe) { recipeContentRow = uiLayout.getCustomUIBuilder() == null ? buildDefaultLayout() : uiLayout.getCustomUIBuilder().apply(recipe); - mainColumn.child(recipeContentRow.coverChildrenWidth().marginTop(5).marginBottom(3)); + mainColumn.child(recipeContentRow.coverChildrenWidth().marginTop(5).marginBottom(3) + .paddingLeft(2).paddingRight(2)); mainColumn.child(additionalRecipeContent.child(textComponents)); loadContentIntoSlots(); @@ -183,7 +184,7 @@ private void attachDebugRecipeIDButton() { childIf(!FMLLoader.isProduction(), () -> new ButtonWidget<>() .overlay(Text.str("ID")) .decoration() - .top(3).right(3) + .bottom(16).right(3) .size(15, 15) .tooltip(r -> r.addLine("Click to copy recipe ID: " + baseRecipe.id)) .onMousePressed((ctx, b) -> { diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/ProgressBarTextureSet.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/ProgressBarTextureSet.java index 5baf8168699..767922e6f49 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/ProgressBarTextureSet.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/ProgressBarTextureSet.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.api.mui.SteamTextureSet; import brachy.modularui.drawable.UITexture; -import brachy.modularui.widgets.ProgressWidget; +import brachy.modularui.drawable.progress.ProgressDrawable; import lombok.Getter; import lombok.experimental.Accessors; import org.jetbrains.annotations.Nullable; @@ -13,9 +13,9 @@ public class ProgressBarTextureSet extends SteamTextureSet { private final int progressSize; - private final ProgressWidget.Direction fillDirection; + private final ProgressDrawable.Direction fillDirection; - public ProgressBarTextureSet(int progressSize, ProgressWidget.Direction fillDirection, UITexture main, + public ProgressBarTextureSet(int progressSize, ProgressDrawable.Direction fillDirection, UITexture main, @Nullable UITexture bronze, @Nullable UITexture steel) { super(main, bronze, steel); this.progressSize = progressSize; @@ -23,14 +23,14 @@ public ProgressBarTextureSet(int progressSize, ProgressWidget.Direction fillDire } public ProgressBarTextureSet(UITexture main, UITexture bronze, UITexture steel) { - this(20, ProgressWidget.Direction.RIGHT, main, bronze, steel); + this(20, ProgressDrawable.Direction.RIGHT, main, bronze, steel); } public ProgressBarTextureSet(UITexture main) { - this(20, ProgressWidget.Direction.RIGHT, main); + this(20, ProgressDrawable.Direction.RIGHT, main); } - public ProgressBarTextureSet(int progressSize, ProgressWidget.Direction fillDirection, UITexture main) { - this(20, fillDirection, main, null, null); + public ProgressBarTextureSet(int progressSize, ProgressDrawable.Direction fillDirection, UITexture main) { + this(progressSize, fillDirection, main, null, null); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ParallelLogic.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ParallelLogic.java index a1e903a2883..afdad07a749 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ParallelLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ParallelLogic.java @@ -89,7 +89,7 @@ public static int getMaxByInput(IRecipeCapabilityHolder holder, GTRecipe recipe, if (minimum == Integer.MAX_VALUE) { Component reason = Component.translatable("gtceu.recipe_logic.no_capabilities") .append(Component.literal(": ")) - .append(Component.translatable(IO.IN.tooltip)); + .append(Component.translatable(IO.IN.getTooltip())); RecipeLogic.putFailureReason(holder, recipe, reason); return 0; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java index c39226bfe03..1b2f9027a15 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java @@ -17,11 +17,13 @@ import com.gregtechceu.gtceu.common.cover.data.DistributionMode; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.common.mui.GTMuiCoverUtil; import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.ItemStackHashStrategy; +import lombok.Setter; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -69,12 +71,12 @@ public class ConveyorCover extends CoverBehavior implements IIOCover, IMuiCover, @Getter @RerenderOnChanged protected IO io; + @Setter @SaveField - @SyncToClient @Getter protected DistributionMode distributionMode; + @Setter @SaveField - @SyncToClient @Getter protected ManualIOMode manualIOMode = ManualIOMode.DISABLED; @SaveField @@ -123,11 +125,6 @@ protected boolean isSubscriptionActive() { .resolve().orElse(null); } - public void setDistributionMode(DistributionMode mode) { - distributionMode = mode; - syncDataHolder.markClientSyncFieldDirty("distributionMode"); - } - ////////////////////////////////////// // ***** Initialization ******// ////////////////////////////////////// @@ -150,10 +147,6 @@ public void setIo(IO io) { subscriptionHandler.updateSubscription(); } - protected void setManualIOMode(ManualIOMode manualIOMode) { - this.manualIOMode = manualIOMode; - } - @Override public void onLoad() { super.onLoad(); @@ -418,13 +411,13 @@ public boolean shouldRespectDistributionMode() { public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { EnumSyncValue manualMode = new EnumSyncValue<>(ManualIOMode.class, - this::getManualIOMode, this::setManualIOMode); + this::getManualIOMode, this::setManualIOMode).allowC2S(); EnumSyncValue distMode = new EnumSyncValue<>(DistributionMode.class, - this::getDistributionMode, this::setDistributionMode); + this::getDistributionMode, this::setDistributionMode).allowC2S(); - IntSyncValue transferRate = new IntSyncValue(this::getTransferRate, this::setTransferRate); - EnumSyncValue ioSync = new EnumSyncValue<>(IO.class, this::getIo, this::setIo); + IntSyncValue transferRate = new IntSyncValue(this::getTransferRate, this::setTransferRate).allowC2S(); + EnumSyncValue ioSync = new EnumSyncValue<>(IO.class, this::getIo, this::setIo).allowC2S(); syncManager.syncValue("io", ioSync); syncManager.syncValue("manualMode", manualMode); @@ -436,25 +429,19 @@ public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManage } if (createFilterRow()) { - column.child(GTMuiWidgets.createFilterRow(filterHandler, data, syncManager, settings) - .child(0, GTMuiWidgets.createIOCycleButton(ioSync, false))); + column.child(Flow.row() + .coverChildrenHeight() + .widthRel(1.0f) + .child(GTMuiWidgets.createIOCycleButton(ioSync, false).left(0)) + .child(Text.comp(Component.translatable(IO.getTitle())).asWidget().verticalCenter().rightRel(0.f))); + column.child(GTMuiWidgets.createFilterRow(filterHandler, data, syncManager, settings)); } if (createDistributionModeRow()) { - column.child(new GTMuiWidgets.EnumRowBuilder<>(DistributionMode.class) - .value(distMode) - .overlay(16, GTGuiTextures.DISTRIBUTION_MODE_OVERLAY) - .lang(Text.dynamic(() -> Component.translatable(distributionMode.localeName))) - .build()); + GTMuiCoverUtil.addDistributionModeRow(column, distMode); } - if (createManualIOModeRow()) { - column.child(new GTMuiWidgets.EnumRowBuilder<>(ManualIOMode.class) - .value(manualMode) - .overlay(16, GTGuiTextures.MANUAL_IO_OVERLAY_IN) - .lang(Text.dynamic(() -> Component.translatable(manualIOMode.localeName))) - .build()); - + GTMuiCoverUtil.addManualIORow(column, manualMode); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java index 0f42fda981c..56cc9f5d33b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.common.cover; +import brachy.modularui.api.drawable.IDrawable; import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; @@ -12,6 +13,7 @@ import com.gregtechceu.gtceu.common.cover.data.FilterMode; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.common.mui.GTMuiCoverUtil; import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; import net.minecraft.MethodsReturnNonnullByDefault; @@ -42,13 +44,13 @@ public class FluidFilterCover extends CoverBehavior implements IMuiCover { protected FluidFilter fluidFilter; + @Setter @SaveField - @SyncToClient @Getter protected FilterMode filterMode = FilterMode.FILTER_INSERT; private FilteredFluidHandlerWrapper fluidFilterWrapper; - @SaveField @Setter + @SaveField @Getter protected ManualIOMode allowFlow = ManualIOMode.DISABLED; @@ -56,11 +58,6 @@ public FluidFilterCover(CoverDefinition definition, ICoverable coverHolder, Dire super(definition, coverHolder, attachedSide); } - public void setFilterMode(FilterMode filterMode) { - this.filterMode = filterMode; - syncDataHolder.markClientSyncFieldDirty("filterMode"); - } - @Override public boolean canAttach() { return super.canAttach() && coverHolder.getFluidHandlerCap(attachedSide, false) != null; @@ -90,37 +87,20 @@ public FluidFilter getFluidFilter() { public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { EnumSyncValue filterMode = new EnumSyncValue<>(FilterMode.class, - this::getFilterMode, this::setFilterMode); + this::getFilterMode, this::setFilterMode).allowC2S(); EnumSyncValue ioMode = new EnumSyncValue<>(ManualIOMode.class, - this::getAllowFlow, this::setAllowFlow); + this::getAllowFlow, this::setAllowFlow).allowC2S(); syncManager.syncValue("filterMode", filterMode); syncManager.syncValue("ioMode", ioMode); - var panelHandler = syncManager.syncedPanel("filterPanel", true, - (sm, sh) -> fluidFilter.getPanel(data, sm, settings)); - - DynamicSyncHandler filterButton = new DynamicSyncHandler() - .widgetProvider((sm, buf) -> new ButtonWidget<>() - .onMousePressed((context, b) -> { - panelHandler.openPanel(); - return true; - })); - - column.child(coverUIRow().child(new DynamicSyncedWidget<>().syncHandler(filterButton))); - - column.child(new GTMuiWidgets.EnumRowBuilder<>(FilterMode.class) - .value(filterMode) - .overlay(16, GTGuiTextures.FILTER_MODE_OVERLAY) - .lang(Text.dynamic(() -> Component.translatable(getFilterMode().getTooltip()))) - .build()); - - column.child(new GTMuiWidgets.EnumRowBuilder<>(ManualIOMode.class) - .value(ioMode) - .overlay(16, GTGuiTextures.MANUAL_IO_OVERLAY_IN) - .lang(Text.dynamic(() -> Component.translatable(getAllowFlow().getTooltip()))) - .build()); + + column.coverChildrenHeight(); + column.child(getFluidFilter().getFilterUI(data, syncManager, settings).marginBottom(4)); + + GTMuiCoverUtil.addFilterModeRow(column, filterMode); + GTMuiCoverUtil.addManualIORow(column, ioMode); } private class FilteredFluidHandlerWrapper extends FluidHandlerDelegate { diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java index 8b79db6dc75..83ba6d10dd6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java @@ -10,6 +10,7 @@ import com.gregtechceu.gtceu.common.cover.data.BucketMode; import com.gregtechceu.gtceu.common.cover.data.TransferMode; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.common.mui.GTMuiCoverUtil; import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; import net.minecraft.MethodsReturnNonnullByDefault; @@ -40,12 +41,11 @@ public class FluidRegulatorCover extends PumpCover { private static final int MAX_STACK_SIZE = 2_048_000_000; // Capacity of quantum tank IX @SaveField - @SyncToClient @Getter private TransferMode transferMode = TransferMode.TRANSFER_ANY; + @Setter @SaveField - @SyncToClient @Getter private BucketMode transferBucketMode = BucketMode.MILLI_BUCKET; @SaveField @@ -156,16 +156,10 @@ private int keepExact(IFluidHandlerModifiable source, IFluidHandlerModifiable de return platformTransferLimit - fluidLeftToTransfer; } - private void setTransferBucketMode(BucketMode transferBucketMode) { - this.transferBucketMode = transferBucketMode; - syncDataHolder.markClientSyncFieldDirty("transferBucketMode"); - } - private void setTransferMode(TransferMode transferMode) { this.transferMode = transferMode; if (!this.isRemote()) { - syncDataHolder.markClientSyncFieldDirty("transferMode"); configureFilter(); } } @@ -193,19 +187,15 @@ public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManage UISettings settings) { super.createCoverUIRows(column, data, syncManager, settings); - var transferMode = new EnumSyncValue<>(TransferMode.class, this::getTransferMode, this::setTransferMode); - var transferSize = new IntSyncValue(this::getGlobalTransferLimit, this::setGlobalTransferLimit); + var transferMode = new EnumSyncValue<>(TransferMode.class, this::getTransferMode, this::setTransferMode).allowC2S(); + var transferSize = new IntSyncValue(this::getGlobalTransferLimit, this::setGlobalTransferLimit).allowC2S(); var transferBucketMode = new EnumSyncValue<>(BucketMode.class, this::getTransferBucketMode, - this::setTransferBucketMode); + this::setTransferBucketMode).allowC2S(); syncManager.syncValue("transferMode", transferMode); syncManager.syncValue("transferSize", transferSize); - column.child(new GTMuiWidgets.EnumRowBuilder<>(TransferMode.class) - .value(transferMode) - .overlay(16, GTGuiTextures.TRANSFER_MODE_OVERLAY) - .lang(Text.dynamic(() -> Component.translatable(getTransferMode().tooltip))) - .build()); + GTMuiCoverUtil.addTransferModeRow(column, transferMode); column.child(GTMuiWidgets.createIntInputWithBucketMode(transferSize, transferBucketMode, () -> maxFluidTransferRate)); diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java index 5dfb4298478..62d9a9beded 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java @@ -14,6 +14,7 @@ import com.gregtechceu.gtceu.common.cover.data.FilterMode; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.common.mui.GTMuiCoverUtil; import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; import net.minecraft.MethodsReturnNonnullByDefault; @@ -45,13 +46,13 @@ public class ItemFilterCover extends CoverBehavior implements IMuiCover { protected ItemFilter itemFilter; + @Setter @SaveField - @SyncToClient @Getter protected FilterMode filterMode = FilterMode.FILTER_INSERT; private FilteredItemHandlerWrapper itemFilterWrapper; - @SaveField @Setter + @SaveField @Getter protected ManualIOMode allowFlow = ManualIOMode.DISABLED; @@ -70,11 +71,6 @@ public ItemFilter getItemFilter() { return itemFilter; } - public void setFilterMode(FilterMode filterMode) { - this.filterMode = filterMode; - syncDataHolder.markClientSyncFieldDirty("filterMode"); - } - @Override public boolean canAttach() { return super.canAttach() && coverHolder.getItemHandlerCap(attachedSide, false) != null; @@ -100,37 +96,19 @@ public void onAttached(ItemStack itemStack, @Nullable ServerPlayer player) { public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { EnumSyncValue filterMode = new EnumSyncValue<>(FilterMode.class, - this::getFilterMode, this::setFilterMode); + this::getFilterMode, this::setFilterMode).allowC2S(); EnumSyncValue ioMode = new EnumSyncValue<>(ManualIOMode.class, - this::getAllowFlow, this::setAllowFlow); + this::getAllowFlow, this::setAllowFlow).allowC2S(); syncManager.syncValue("filterMode", filterMode); syncManager.syncValue("ioMode", ioMode); - var panelHandler = syncManager.syncedPanel("filterPanel", true, - (sm, sh) -> itemFilter.getPanel(data, sm, settings)); - - DynamicSyncHandler filterButton = new DynamicSyncHandler() - .widgetProvider((sm, buf) -> new ButtonWidget<>() - .onMousePressed((context, b) -> { - panelHandler.openPanel(); - return true; - })); - - column.child(coverUIRow().child(new DynamicSyncedWidget<>().syncHandler(filterButton))); - - column.child(new GTMuiWidgets.EnumRowBuilder<>(FilterMode.class) - .value(filterMode) - .overlay(16, GTGuiTextures.FILTER_MODE_OVERLAY) - .lang(Text.dynamic(() -> Component.translatable(getFilterMode().getTooltip()))) - .build()); - - column.child(new GTMuiWidgets.EnumRowBuilder<>(ManualIOMode.class) - .value(ioMode) - .overlay(16, GTGuiTextures.MANUAL_IO_OVERLAY_IN) - .lang(Text.dynamic(() -> Component.translatable(getAllowFlow().name()))) - .build()); + column.coverChildrenHeight(); + column.child(getItemFilter().getFilterUI(data, syncManager, settings).marginBottom(2)); + + GTMuiCoverUtil.addFilterModeRow(column, filterMode); + GTMuiCoverUtil.addManualIORow(column, ioMode); } private class FilteredItemHandlerWrapper extends ItemHandlerDelegate { diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java index 97d9344bb8a..42031f4f0db 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/MachineControllerCover.java @@ -61,7 +61,6 @@ public class MachineControllerCover extends CoverBehavior implements IMuiCover { private int minRedstoneStrength = 1; @SaveField - @SyncToClient @Getter @Nullable private ControllerMode controllerMode = ControllerMode.MACHINE; @@ -111,7 +110,6 @@ public void setControllerMode(@Nullable ControllerMode controllerMode) { resetCurrentControllable(); this.controllerMode = controllerMode; - syncDataHolder.markClientSyncFieldDirty("filterMode"); updateInput(); } @@ -198,12 +196,12 @@ private int getInputSignal() { @Override public ModularPanel buildUI(SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { EnumSyncValue controllerModeValue = new EnumSyncValue<>(ControllerMode.class, - this::getControllerMode, this::setControllerMode); + this::getControllerMode, this::setControllerMode).allowC2S(); syncManager.syncValue("controllerMode", controllerModeValue); return ModularPanel.defaultPanel(coverDefinition.getId().getPath(), 176, 245) - .child(GTMuiWidgets.createTitleBar(this.self().getAttachItem(), 176, GTGuiTextures.BACKGROUND)) + .child(GTMuiWidgets.createTitleBar(() -> this.self().getAttachItem(), 176, GTGuiTextures.BACKGROUND)) .child(Flow.col().top(7).margin(7, 0) .childPadding(2) .widthRel(1.0f) @@ -212,15 +210,15 @@ public ModularPanel buildUI(SidedPosGuiData data, PanelSyncManager syncManage .child(coverUIRow() .child(new ToggleButton() .size(16).left(0) - .value(new BooleanSyncValue(this::isInverted, ($) -> this.setInverted(true))) + .value(new BooleanSyncValue(this::isInverted, ($) -> this.setInverted(true)).allowC2S()) .overlay(GTGuiTextures.OVERLAY_REDSTONE_ON)) - .child(Text.lang("cover.enable_with_redstone").asWidget() + .child(Text.comp(Component.translatable("cover.enable_with_redstone")).asWidget() .heightRel(1.0f).left(20))) .child(coverUIRow() .child(new ToggleButton() .size(16).left(0) .value(new BooleanSyncValue(() -> !this.isInverted(), - ($) -> this.setInverted(false))) + ($) -> this.setInverted(false)).allowC2S()) .overlay(GTGuiTextures.OVERLAY_REDSTONE_OFF)) .child(Text.lang("cover.disable_with_redstone").asWidget() .heightRel(1.0f).left(20))) @@ -228,7 +226,7 @@ public ModularPanel buildUI(SidedPosGuiData data, PanelSyncManager syncManage .child(new ToggleButton() .size(16).left(0) .value(new BooleanSyncValue(() -> preventPowerFail, - bool -> preventPowerFail = bool)) + bool -> preventPowerFail = bool).allowC2S()) .overlay(GTGuiTextures.CIRCUIT_OVERLAY)) .child(Text.lang("cover.machine_controller.suspend_powerfail").asWidget() .heightRel(1.0f).left(20))) @@ -247,7 +245,7 @@ public ModularPanel buildUI(SidedPosGuiData data, PanelSyncManager syncManage .bounds(0, 15) .stopper(1.0) .value(new DoubleSyncValue(() -> (double) redstoneSignalOutput, - v -> redstoneSignalOutput = (int) v)))) + v -> redstoneSignalOutput = (int) v).allowC2S()))) // Separating line .child(coverUIRow().child(new Rectangle().color(UI_TEXT_COLOR).asWidget() .height(1).widthRel(0.9f).leftRel(0.5f)).margin(0, 2)) @@ -292,7 +290,7 @@ private Widget modeButton(EnumSyncValue syncValue, Controller return GuiTextures.MC_BUTTON.asWidget().size(18) .overlay(GTGuiTextures.BUTTON_CROSS) - .tooltip(t -> t.addLine(Text.lang(mode.localeName)).addLine(detail.getFormatted())); + .tooltip(t -> t.addLine(Text.lang(mode.getTooltip())).addLine(detail.getFormatted())); } ItemStack stack; @@ -311,7 +309,7 @@ private Widget modeButton(EnumSyncValue syncValue, Controller return new ToggleButton().size(18) .value(boolValueOf(syncValue, mode)) .overlay(new ItemDrawable(stack).asIcon().size(16)) - .tooltip(t -> t.addLine(Text.lang(mode.localeName)) + .tooltip(t -> t.addLine(Text.lang(mode.getTooltip())) .addLine(stack.getHoverName())); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java index 2e360a6f946..234125c65da 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java @@ -18,9 +18,11 @@ import com.gregtechceu.gtceu.common.cover.data.BucketMode; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.common.mui.GTMuiCoverUtil; import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; import com.gregtechceu.gtceu.utils.GTTransferUtils; +import lombok.Setter; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -45,6 +47,7 @@ import lombok.Getter; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.List; import javax.annotation.ParametersAreNonnullByDefault; @@ -67,12 +70,12 @@ public class PumpCover extends CoverBehavior implements IIOCover, IMuiCover, ICo @Getter @RerenderOnChanged protected IO io = IO.OUT; + @Setter @SaveField - @SyncToClient @Getter protected BucketMode bucketMode = BucketMode.MILLI_BUCKET; + @Setter @SaveField - @SyncToClient @Getter protected ManualIOMode manualIOMode = ManualIOMode.DISABLED; @@ -179,16 +182,6 @@ public void setTransferRate(int milliBucketsPerTick) { this.transferRate = Math.min(Math.max(milliBucketsPerTick, 0), maxFluidTransferRate); } - public void setBucketMode(BucketMode bucketMode) { - this.bucketMode = bucketMode; - syncDataHolder.markClientSyncFieldDirty("bucketMode"); - } - - protected void setManualIOMode(ManualIOMode manualIOMode) { - this.manualIOMode = manualIOMode; - syncDataHolder.markClientSyncFieldDirty("manualIOMode"); - } - protected void update() { long timer = coverHolder.getOffsetTimer(); if (timer % 5 != 0) @@ -268,12 +261,12 @@ private static boolean canTransfer(IFluidHandlerModifiable fluidHandler, Transfe @Override public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { - IntSyncValue transferRateSync = new IntSyncValue(this::getTransferRate, this::setTransferRate); + IntSyncValue transferRateSync = new IntSyncValue(this::getTransferRate, this::setTransferRate).allowC2S(); EnumSyncValue bucketModeSync = new EnumSyncValue<>(BucketMode.class, this::getBucketMode, - this::setBucketMode); + this::setBucketMode).allowC2S(); EnumSyncValue manualIOModeSync = new EnumSyncValue<>(ManualIOMode.class, this::getManualIOMode, - this::setManualIOMode); - EnumSyncValue ioSync = new EnumSyncValue<>(IO.class, this::getIo, this::setIo); + this::setManualIOMode).allowC2S(); + EnumSyncValue ioSync = new EnumSyncValue<>(IO.class, this::getIo, this::setIo).allowC2S(); syncManager.syncValue("io", ioSync); syncManager.syncValue("transferRate", transferRateSync); @@ -282,14 +275,14 @@ public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManage column.child(GTMuiWidgets.createIntInputWithBucketMode(transferRateSync, bucketModeSync, () -> maxFluidTransferRate)); - column.child(GTMuiWidgets.createFilterRow(filterHandler, data, syncManager, settings) - .child(0, GTMuiWidgets.createIOCycleButton(ioSync, false))); + column.child(Flow.row() + .coverChildrenHeight() + .widthRel(1.0f) + .child(GTMuiWidgets.createIOCycleButton(ioSync, false)).left(0) + .child(Text.comp(Component.translatable(IO.getTitle())).asWidget().verticalCenter().rightRel(0.f))); + column.child(GTMuiWidgets.createFilterRow(filterHandler, data, syncManager, settings)); - column.child(new GTMuiWidgets.EnumRowBuilder<>(ManualIOMode.class) - .value(manualIOModeSync) - .overlay(16, GTGuiTextures.MANUAL_IO_OVERLAY_IN) - .lang(Text.dynamic(() -> Component.translatable(manualIOMode.localeName))) - .build()); + GTMuiCoverUtil.addManualIORow(column, manualIOModeSync); } protected void configureFilter() { diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java index c548505e5bc..8c7ef4314fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java @@ -9,6 +9,7 @@ import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.cover.data.TransferMode; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.common.mui.GTMuiCoverUtil; import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; import com.gregtechceu.gtceu.common.pipelike.item.ItemNetHandler; @@ -40,13 +41,11 @@ public class RobotArmCover extends ConveyorCover { @SaveField - @SyncToClient @Getter protected TransferMode transferMode; - + @Setter @SaveField @Getter - @Setter protected int globalTransferLimit; protected int itemsTransferBuffered; @@ -166,17 +165,14 @@ public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManage UISettings settings) { super.createCoverUIRows(column, data, syncManager, settings); - var transferMode = new EnumSyncValue<>(TransferMode.class, this::getTransferMode, this::setTransferMode); - var transferSize = new IntSyncValue(this::getGlobalTransferLimit, v -> this.globalTransferLimit = v); + var transferMode = new EnumSyncValue<>(TransferMode.class, this::getTransferMode, this::setTransferMode) + .allowC2S(); + var transferSize = new IntSyncValue(this::getGlobalTransferLimit, this::setGlobalTransferLimit).allowC2S(); syncManager.syncValue("transferMode", transferMode); syncManager.syncValue("transferSize", transferSize); - column.child(new GTMuiWidgets.EnumRowBuilder<>(TransferMode.class) - .value(transferMode) - .overlay(16, GTGuiTextures.TRANSFER_MODE_OVERLAY) - .lang(Text.dynamic(() -> Component.translatable(getTransferMode().tooltip))) - .build()); + GTMuiCoverUtil.addTransferModeRow(column, transferMode); column.child(GTMuiWidgets.createIntInputWithButtons(transferSize, () -> 1, () -> getTransferMode().maxStackSize) .setEnabledIf($ -> shouldShowStackSize())); @@ -186,7 +182,6 @@ public void setTransferMode(TransferMode transferMode) { this.transferMode = transferMode; if (!this.isRemote()) { - syncDataHolder.markClientSyncFieldDirty("transferMode"); configureFilter(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java index 920d437b9b2..5ba0349719c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/StorageCover.java @@ -66,11 +66,12 @@ public boolean canAttach() { public void createCoverUIRows(Flow parent, SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { parent.child(SlotGroupWidget.builder() - .matrix("IIIIII", "IIIIII", "IIIIII") - .key('I', i -> new ItemSlot() + .matrix("IIIIII", "IIIIII", "IIIIII") + .key('I', i -> new ItemSlot() .slot(SyncHandlers.itemSlot(inventory, i).singletonSlotGroup(i))) - .build()) - .rightRel(0.5F) + .build()) + .horizontalCenter() + .paddingTop(20) .margin(3) .coverChildren(); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/data/ControllerMode.java b/src/main/java/com/gregtechceu/gtceu/common/cover/data/ControllerMode.java index a13f314e148..89053ad7e42 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/data/ControllerMode.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/data/ControllerMode.java @@ -6,13 +6,13 @@ public enum ControllerMode { - MACHINE("cover.machine_controller.mode.machine", null), - COVER_UP("cover.machine_controller.mode.cover_up", Direction.UP), - COVER_DOWN("cover.machine_controller.mode.cover_down", Direction.DOWN), - COVER_NORTH("cover.machine_controller.mode.cover_north", Direction.NORTH), - COVER_EAST("cover.machine_controller.mode.cover_east", Direction.EAST), - COVER_SOUTH("cover.machine_controller.mode.cover_south", Direction.SOUTH), - COVER_WEST("cover.machine_controller.mode.cover_west", Direction.WEST); + MACHINE("machine", null), + COVER_UP("cover_up", Direction.UP), + COVER_DOWN("cover_down", Direction.DOWN), + COVER_NORTH("cover_north", Direction.NORTH), + COVER_EAST("cover_east", Direction.EAST), + COVER_SOUTH("cover_south", Direction.SOUTH), + COVER_WEST("cover_west", Direction.WEST); @Getter public final String localeName; @@ -23,5 +23,9 @@ public enum ControllerMode { this.side = side; } + public String getTooltip() { + return "cover.machine_controller.mode." + localeName; + } + public static final String nullLocaleName = "cover.machine_controller.mode.null"; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/data/DistributionMode.java b/src/main/java/com/gregtechceu/gtceu/common/cover/data/DistributionMode.java index b5a6a216f12..123a2356bfa 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/data/DistributionMode.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/data/DistributionMode.java @@ -14,4 +14,16 @@ public enum DistributionMode { DistributionMode(String localeName) { this.localeName = localeName; } + + public static String getTitle() { + return "cover.distribution.mode.title"; + } + + public String getTooltip() { + return "cover.distribution.mode." + localeName; + } + + public String getDescription() { + return "cover.distribution.mode." + localeName + ".description"; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/data/FilterMode.java b/src/main/java/com/gregtechceu/gtceu/common/cover/data/FilterMode.java index 976176eb3c8..159c552e4b8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/data/FilterMode.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/data/FilterMode.java @@ -22,6 +22,10 @@ public enum FilterMode { this.localeName = localeName; } + public static String getTitle() { + return "cover.filter.mode.title"; + } + public String getTooltip() { return "cover.filter.mode." + this.localeName; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/data/ManualIOMode.java b/src/main/java/com/gregtechceu/gtceu/common/cover/data/ManualIOMode.java index 227caa57d1b..044fd2e2d70 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/data/ManualIOMode.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/data/ManualIOMode.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.common.cover.data; + public enum ManualIOMode { DISABLED("disabled"), @@ -14,7 +15,15 @@ public enum ManualIOMode { this.localeName = localeName; } + public static String getTitle() { + return "cover.manual.mode.title"; + } + public String getTooltip() { - return "cover.universal.manual_import_export.mode." + localeName; + return "cover.manual.mode." + localeName; + } + + public String getDescription() { + return "cover.manual.mode." + localeName + ".description"; } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/data/TransferMode.java b/src/main/java/com/gregtechceu/gtceu/common/cover/data/TransferMode.java index 2253e08af62..3d0719bfafe 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/data/TransferMode.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/data/TransferMode.java @@ -4,16 +4,26 @@ public enum TransferMode { - TRANSFER_ANY("cover.robotic_arm.transfer_mode.transfer_any", "transfer_any", 1), - TRANSFER_EXACT("cover.robotic_arm.transfer_mode.transfer_exact", "transfer_exact", 1024), - KEEP_EXACT("cover.robotic_arm.transfer_mode.keep_exact", "keep_exact", 1024); + TRANSFER_ANY( "transfer_any", 1), + TRANSFER_EXACT( "transfer_exact", 1024), + KEEP_EXACT("keep_exact", 1024); + + public static final TransferMode[] VALUES = values(); @Getter - public final String tooltip; + public final String localeName; public final int maxStackSize; - TransferMode(String tooltip, String textureName, int maxStackSize) { - this.tooltip = tooltip; + TransferMode(String localeName, int maxStackSize) { + this.localeName = localeName; this.maxStackSize = maxStackSize; } + + public static String getTitle() { + return "cover.robotic_arm.transfer_mode.title"; + } + + public String getTooltip() { + return "cover.robotic_arm.transfer_mode." + localeName; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java index 2ed4cab4737..7c950b445ae 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedEnergyDetectorCover.java @@ -128,9 +128,9 @@ public void setUsePercent(boolean usePercent) { @Override public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { - syncManager.syncValue("usePercent", new BooleanSyncValue(this::isUsePercent, this::setUsePercent)); - var minValueSync = new LongSyncValue(this::getMinValue, this::setMinValue); - var maxValueSync = new LongSyncValue(this::getMaxValue, this::setMaxValue); + syncManager.syncValue("usePercent", new BooleanSyncValue(this::isUsePercent, this::setUsePercent).allowC2S()); + var minValueSync = new LongSyncValue(this::getMinValue, this::setMinValue).allowC2S(); + var maxValueSync = new LongSyncValue(this::getMaxValue, this::setMaxValue).allowC2S(); syncManager.syncValue("minValue", minValueSync); syncManager.syncValue("maxValue", maxValueSync); diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java index f47586fd2c5..1f2df3099a6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java @@ -123,8 +123,8 @@ public void setMaxValue(int maxValue) { @Override public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { - var minValueSync = new IntSyncValue(this::getMinValue, this::setMinValue); - var maxValueSync = new IntSyncValue(this::getMaxValue, this::setMaxValue); + var minValueSync = new IntSyncValue(this::getMinValue, this::setMinValue).allowC2S(); + var maxValueSync = new IntSyncValue(this::getMaxValue, this::setMaxValue).allowC2S(); syncManager.syncValue("minValue", minValueSync); syncManager.syncValue("maxValue", maxValueSync); diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java index 95b3ec8e598..9fd835aeb92 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java @@ -119,8 +119,8 @@ public void setLatched(boolean latched) { @Override public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { - var minValueSync = new IntSyncValue(this::getMinValue, this::setMinValue); - var maxValueSync = new IntSyncValue(this::getMaxValue, this::setMaxValue); + var minValueSync = new IntSyncValue(this::getMinValue, this::setMinValue).allowC2S(); + var maxValueSync = new IntSyncValue(this::getMaxValue, this::setMaxValue).allowC2S(); syncManager.syncValue("minValue", minValueSync); syncManager.syncValue("maxValue", maxValueSync); diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java index b92624160d3..b6b442069ea 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/DetectorCover.java @@ -84,7 +84,7 @@ public InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { context.getPlayer().sendSystemMessage(Component.translatable(translationKey)); } - return InteractionResult.SUCCESS; + return InteractionResult.CONSUME; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java index 35bcf2a5043..4bf27b5d4d7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java @@ -345,7 +345,7 @@ protected ModularPanel createChannelManagerPanel(GuiData data, PanelSyncManag .disablePanelsBelow(false) .draggable(true) .closeOnOutOfBoundsClick(true) - .child(GTMuiWidgets.createTitleBar(getAttachItem(), 176, GTGuiTextures.BACKGROUND)); + .child(GTMuiWidgets.createTitleBar(() -> getAttachItem(), 176, GTGuiTextures.BACKGROUND)); var entries = new GenericListSyncHandler.Builder() .getter(this::getVirtualEntries) diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java index f53ca595253..f5a96e11afc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java @@ -133,6 +133,7 @@ public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManage column.child(new GTMuiWidgets.EnumRowBuilder<>(VoidingMode.class) .value(voidingMode) + .buttonTooltipSupplier((v) -> () -> Component.translatable(v.getTooltip())) .overlay(16, GTGuiTextures.VOIDING_MODES) .lang(Text.dynamic(() -> Component.translatable(getVoidingMode().tooltip))) .build() diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java index 97e0b3eddab..b42ec5c31e3 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java @@ -129,6 +129,7 @@ public void createCoverUIRows(Flow column, SidedPosGuiData data, PanelSyncManage column.child(new GTMuiWidgets.EnumRowBuilder<>(VoidingMode.class) .value(voidingMode) + .buttonTooltipSupplier((v) -> () -> Component.translatable(v.getTooltip())) .overlay(16, GTGuiTextures.VOIDING_MODES) .lang(Text.dynamic(() -> Component.translatable(getVoidingMode().tooltip))) .build() diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java index 1946e35aa26..f7c8b92362c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java @@ -22,6 +22,7 @@ import com.gregtechceu.gtceu.common.data.machines.*; import com.gregtechceu.gtceu.common.data.models.GTModels; import com.gregtechceu.gtceu.common.machine.electric.*; +import com.gregtechceu.gtceu.common.machine.mui.TestMuiMachine; import com.gregtechceu.gtceu.common.machine.multiblock.part.*; import com.gregtechceu.gtceu.common.machine.multiblock.part.monitor.AdvancedMonitorPartMachine; import com.gregtechceu.gtceu.common.machine.multiblock.part.monitor.MonitorPartMachine; @@ -1151,6 +1152,13 @@ public class GTMachines { .allowExtendedFacing(true) .register(); + public static final MachineDefinition MUI_TEST = REGISTRATE + .machine("test_mui", TestMuiMachine::new) + .rotationState(RotationState.ALL) + .model(createOverlayCasingMachineModel(GTCEu.id("block/casings/solid/machine_casing_clean_stainless_steel"), + GTCEu.id("block/machine/part/computer_monitor"))) + .register(); + public static void init() { GTMultiMachines.init(); GCYMMachines.init(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java index 4ddda5bc642..7ab4ff0f2c6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java @@ -32,6 +32,8 @@ import net.minecraftforge.fml.ModLoader; import brachy.modularui.api.drawable.Text; +import brachy.modularui.drawable.progress.CircularProgressDrawable; +import brachy.modularui.drawable.progress.ProgressDrawable; import brachy.modularui.widgets.ProgressWidget; import brachy.modularui.widgets.layout.Flow; @@ -180,7 +182,14 @@ public class GTRecipeTypes { .setMaxIOSize(1, 6, 1, 1).setEUIO(IO.IN) .prepareBuilder(recipeBuilder -> recipeBuilder.EUt(GTValues.VA[GTValues.LV])) .UI(builder -> builder - .setProgressBar(GTGuiTextures.PROGRESS_MIXER) + .setProgressBarSupplier((l, v, m) -> { + return new CircularProgressDrawable() + .emptyTexture(GTGuiTextures.PROGRESS_BATH[0]) + .filledTexture(GTGuiTextures.PROGRESS_BATH[1]) + .clockwise() + .asWidget() + .value(v); + }) .setItemSlotOverlay(IO.IN, 0, GTGuiTextures.BREWER_OVERLAY) .setItemSlotsOverlay(IO.OUT, 0, 5, GTGuiTextures.DUST_OVERLAY) .setFluidSlotOverlay(IO.IN, 0, GTGuiTextures.CENTRIFUGE_OVERLAY)) @@ -323,10 +332,8 @@ public class GTRecipeTypes { .texture( GTGuiTextures.PROGRESS_HAMMER .get(machine), - 20) - .size(20) - .direction( - ProgressWidget.Direction.DOWN)) + ProgressDrawable.Direction.DOWN) + .size(20)) .child(GTGuiTextures.PROGRESS_HAMMER_BASE .get(machine) .asWidget() @@ -355,15 +362,21 @@ public class GTRecipeTypes { .child(new ProgressWidget() .value(value) .name("progressBar") - .texture(GTGuiTextures.PROGRESS_BAR_LATHE, 20) - .size(20) - .direction(ProgressWidget.Direction.RIGHT)) + .texture(GTGuiTextures.PROGRESS_BAR_LATHE, ProgressDrawable.Direction.RIGHT) + .size(20)) .child(GTGuiTextures.PROGRESS_BAR_LATHE_BASE.asWidget().width(5)))) .setSound(GTSoundEntries.CUT); public final static GTRecipeType MIXER_RECIPES = register("mixer", ELECTRIC).setMaxIOSize(6, 1, 2, 1).setEUIO(IO.IN) .UI(builder -> builder - .setProgressBar(GTGuiTextures.PROGRESS_MIXER) + .setProgressBarSupplier((l, v, m) -> { + return new CircularProgressDrawable() + .emptyTexture(GTGuiTextures.PROGRESS_MIXER[0]) + .filledTexture(GTGuiTextures.PROGRESS_MIXER[1]) + .clockwise() + .asWidget() + .value(v); + }) .setItemSlotsOverlay(IO.IN, 0, 5, GTGuiTextures.DUST_OVERLAY) .setItemSlotOverlay(IO.OUT, 0, GTGuiTextures.DUST_OVERLAY)) .setSound(GTSoundEntries.MIXER); @@ -372,7 +385,14 @@ public class GTRecipeTypes { .setEUIO(IO.IN) .prepareBuilder(recipeBuilder -> recipeBuilder.duration(400).EUt(16)) .UI(builder -> builder - .setProgressBar(GTGuiTextures.PROGRESS_BATH) + .setProgressBarSupplier((l, v, m) -> { + return new CircularProgressDrawable() + .emptyTexture(GTGuiTextures.PROGRESS_BATH[0]) + .filledTexture(GTGuiTextures.PROGRESS_BATH[1]) + .clockwise() + .asWidget() + .value(v); + }) .setItemSlotOverlay(IO.IN, 0, GTGuiTextures.CRUSHED_ORE_OVERLAY) .setItemSlotOverlay(IO.OUT, 0, GTGuiTextures.DUST_OVERLAY)) .setSound(GTSoundEntries.BATH); @@ -461,6 +481,10 @@ public class GTRecipeTypes { public final static GTRecipeType ROCK_BREAKER_RECIPES = register("rock_breaker", ELECTRIC).setMaxIOSize(1, 4, 0, 0) .setEUIO(IO.IN) .UI(builder -> builder.setProgressBar(GTGuiTextures.PROGRESS_MACERATE) + .setMachineLayoutGridBuilder(ItemRecipeCapability.CAP, IO.OUT, (machine, layout) -> { + + return GTMuiWidgets.createGrid(4, 2, true, 's'); + }) .setItemSlotOverlay(IO.IN, 0, GTGuiTextures.DUST_OVERLAY) .setItemSlotOverlay(IO.OUT, 0, GTGuiTextures.CRUSHED_ORE_OVERLAY)) .setIconSupplier(() -> GTMachines.ROCK_CRUSHER[GTValues.LV].asStack()) diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemMagnetBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemMagnetBehavior.java index 13e1d3970b2..5ac8f6bb0a2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemMagnetBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemMagnetBehavior.java @@ -94,7 +94,7 @@ public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager EnumSyncValue filterSync = new EnumSyncValue<>(Filter.class, () -> Filter.get(data.getUsedItemStack().getOrCreateTag().getInt(FILTER_ORDINAL_TAG)), - filter -> data.getUsedItemStack().getOrCreateTag().putInt(FILTER_ORDINAL_TAG, filter.ordinal())); + filter -> data.getUsedItemStack().getOrCreateTag().putInt(FILTER_ORDINAL_TAG, filter.ordinal())).allowC2S(); PagedWidget pages = new PagedWidget<>() .left((176 - 80) / 2) @@ -130,8 +130,8 @@ public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager .size(20) .value(filterSync) .stateCount(Filter.values().length) - .stateOverlay(Filter.SIMPLE, new ItemDrawable(GTItems.ITEM_FILTER.asItem())) - .stateOverlay(Filter.TAG, new ItemDrawable(GTItems.TAG_FILTER.asItem())) + .stateOverlay(Filter.SIMPLE, new ItemDrawable(GTItems.ITEM_FILTER.asItem()).asIcon().size(16)) + .stateOverlay(Filter.TAG, new ItemDrawable(GTItems.TAG_FILTER.asItem()).asIcon().size(16)) .tooltipBuilder(r -> r.addLine(Text.dynamic( () -> Component.translatable(filterSync.getValue().getTooltip()))))) .child(pages) @@ -149,9 +149,9 @@ private ParentWidget createSimpleFilterPage(SimpleItemFilter filter) { .changeListener((stack, amount, client, init) -> handler.setStackInSlot(i, stack)) .ignoreMaxStackSize(true).accessibility(true, false)))); - BooleanSyncValue blacklist = new BooleanSyncValue(filter::isBlackList, filter::setBlackList); + BooleanSyncValue blacklist = new BooleanSyncValue(filter::isBlackList, filter::setBlackList).allowC2S(); - BooleanSyncValue ignoreNBT = new BooleanSyncValue(filter::isIgnoreNbt, filter::setIgnoreNbt); + BooleanSyncValue ignoreNBT = new BooleanSyncValue(filter::isIgnoreNbt, filter::setIgnoreNbt).allowC2S(); Flow filterButtons = Flow.col() .coverChildren() @@ -165,7 +165,7 @@ private ParentWidget createSimpleFilterPage(SimpleItemFilter filter) { } private ParentWidget createTagFilterPage(TagItemFilter filter) { - StringSyncValue filterString = new StringSyncValue(filter::getFilterString, filter::setFilterString); + StringSyncValue filterString = new StringSyncValue(filter::getFilterString, filter::setFilterString).allowC2S(); RichTooltip infoTooltip = new RichTooltip().add("cover.tag_filter.info"); return new ParentWidget<>() diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java index 6b7f09218a8..5c5f0c3f651 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java @@ -31,6 +31,7 @@ import brachy.modularui.api.drawable.IDrawable; import brachy.modularui.api.drawable.Text; +import brachy.modularui.drawable.progress.ProgressDrawable; import brachy.modularui.factory.PosGuiData; import brachy.modularui.screen.UISettings; import brachy.modularui.value.sync.DoubleSyncValue; @@ -147,8 +148,7 @@ public void buildMainUI(ParentWidget mainWidget, PosGuiData guiData, PanelSyn flow.child(new ProgressWidget() .texture(GTGuiTextures.PROGRESS_BAR_BOILER_EMPTY_STEEL, - GTGuiTextures.PROGRESS_BAR_BOILER_HEAT, 60) - .direction(ProgressWidget.Direction.UP) + GTGuiTextures.PROGRESS_BAR_BOILER_HEAT, ProgressDrawable.Direction.UP) .value(energyPercentage) .marginLeft(5) .size(18, 60) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java index c5173eaaeaa..1e46e31d432 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java @@ -38,6 +38,7 @@ import net.minecraft.world.phys.Vec3; import brachy.modularui.drawable.ItemDrawable; +import brachy.modularui.drawable.progress.ProgressDrawable; import brachy.modularui.factory.PosGuiData; import brachy.modularui.screen.UISettings; import brachy.modularui.utils.Alignment; @@ -317,7 +318,7 @@ public void buildMainUI(ParentWidget mainWidget, PosGuiData guiData, PanelSyn .child(new ItemSlot().slot(new ModularSlot(baitHandler, 0)) .background(GTGuiTextures.SLOT, GTGuiTextures.STRING_SLOT_OVERLAY).marginRight(2)) .child(new ProgressWidget() - .texture(GTGuiTextures.PROGRESS_ARROW.main(), 16) + .texture(GTGuiTextures.PROGRESS_ARROW.main(), ProgressDrawable.Direction.RIGHT) .value(progressPercent)) .child(GTMuiMachineUtil.createSlotGroupFromInventory(cache, "output_item_inv", cache.getSize(), 'i', diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/mui/TestMuiMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/mui/TestMuiMachine.java new file mode 100644 index 00000000000..31631c4479b --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/mui/TestMuiMachine.java @@ -0,0 +1,744 @@ +package com.gregtechceu.gtceu.common.machine.mui; + +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.animal.Fox; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.fluids.capability.templates.FluidTank; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.registries.ForgeRegistries; + +import brachy.modularui.api.IPanelHandler; +import brachy.modularui.api.drawable.Text; +import brachy.modularui.api.widget.IWidget; +import brachy.modularui.client.schemarenderer.BlockHighlight; +import brachy.modularui.drawable.*; +import brachy.modularui.drawable.progress.CircularProgressDrawable; +import brachy.modularui.drawable.progress.ProgressDrawable; +import brachy.modularui.factory.GuiData; +import brachy.modularui.factory.PosGuiData; +import brachy.modularui.schema.ArraySchema; +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.screen.RichTooltip; +import brachy.modularui.screen.UISettings; +import brachy.modularui.screen.viewport.ModularGuiContext; +import brachy.modularui.utils.Alignment; +import brachy.modularui.utils.Color; +import brachy.modularui.utils.Interpolation; +import brachy.modularui.value.BoolValue; +import brachy.modularui.value.IntValue; +import brachy.modularui.value.StringValue; +import brachy.modularui.value.sync.*; +import brachy.modularui.value.sync.ItemSlotSyncHandler; +import brachy.modularui.widget.EmptyWidget; +import brachy.modularui.widget.ParentWidget; +import brachy.modularui.widgets.*; +import brachy.modularui.widgets.layout.Flow; +import brachy.modularui.widgets.slot.*; +import brachy.modularui.widgets.textfield.TextFieldWidget; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import org.jetbrains.annotations.NotNull; + +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.DoubleUnaryOperator; + +import static brachy.modularui.drawable.GuiTextures.MUI_LOGO; + +public class TestMuiMachine extends MetaMachine implements IMuiMachine { + + private static final Object2IntMap handlerSizeMap = new Object2IntOpenHashMap<>() { + + { + put(Items.DIAMOND, 9); + put(Items.EMERALD, 9); + put(Items.GOLD_INGOT, 7); + put(Items.IRON_INGOT, 6); + put(Items.CLAY_BALL, 2); + defaultReturnValue(3); + } + }; + + private final FluidTank fluidTank = new FluidTank(10000); + private final FluidTank fluidTankPhantom = new FluidTank(500000); + private long time = 0; + private int val, val2 = 0; + private String value = ""; + private int intValue = 1234567; + private double doubleValue = 1; + private final int duration = 80; + private int progress = 0; + private int cycleState = 0; + private List serverInts = new ArrayList<>(); + private ItemStack displayItem = new ItemStack(Items.DIAMOND); + private final IItemHandlerModifiable inventory = new ItemStackHandler(2) { + + @Override + public int getSlotLimit(int slot) { + return slot == 0 ? Integer.MAX_VALUE : 64; + } + }; + private final ItemStackHandler bigInventory = new ItemStackHandler(9); + + private final ItemStackHandler mixerItems = new ItemStackHandler(4); + private final ItemStackHandler smallInv = new ItemStackHandler(4); + private final FluidTank mixerFluids1 = new FluidTank(16000); + private final FluidTank mixerFluids2 = new FluidTank(16000); + private final ItemStackHandler craftingInventory = new ItemStackHandler(10); + private final ItemStackHandler storageInventory0 = new ItemStackHandler(1); + private final Map stackHandlerMap = new Object2ObjectOpenHashMap<>(); + + private int num = 2; + + private TickableSubscription sub; + + public TestMuiMachine(BlockEntityCreationInfo info) { + super(info); + sub = subscribeServerTick(this::tick); + } + + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager syncManager, UISettings settings) { + // settings.customContainer(() -> new CraftingModularContainer(3, 3, this.craftingInventory)); + // settings.customGui(() -> TestGuiContainer::new); + + syncManager.registerSlotGroup("item_inv", 3); + syncManager.registerSlotGroup("mixer_items", 2); + + syncManager.syncValue("mixer_fluids", 0, SyncHandlers.fluidSlot(this.mixerFluids1)); + syncManager.syncValue("mixer_fluids", 1, SyncHandlers.fluidSlot(this.mixerFluids2)); + IntSyncValue cycleStateValue = new IntSyncValue(() -> this.cycleState, val -> this.cycleState = val); + syncManager.getHyperVisor().syncValue("cycle_state", cycleStateValue); + syncManager.syncValue("display_item", GenericSyncValue.forItem(() -> this.displayItem, null)); + GenericListSyncHandler numberListSyncHandler = GenericListSyncHandler.builder() + .getter(() -> this.serverInts) + .setter(v -> this.serverInts = v) + .serializer(FriendlyByteBuf::writeInt) + .deserializer(FriendlyByteBuf::readInt) + .immutableCopy() + .build(); + syncManager.syncValue("number_list", numberListSyncHandler); + syncManager.bindPlayerInventory(guiData.getPlayer()); + + DynamicSyncHandler dynamicSyncHandler = new DynamicSyncHandler() + .widgetProvider((syncManager1, packet) -> { + ItemStack itemStack = packet.readItem(); + if (itemStack.isEmpty()) return new EmptyWidget(); + Item item = itemStack.getItem(); + ItemStackHandler handler = stackHandlerMap.computeIfAbsent(item, + k -> new ItemStackHandler(handlerSizeMap.getInt(k))); + String name = item.getName(itemStack).toString(); + Flow flow = Flow.row(); + for (int i = 0; i < handler.getSlots(); i++) { + int finalI = i; + flow.child(new ItemSlot() + .syncHandler(syncManager1.getOrCreateSyncHandler(name, i, ItemSlotSyncHandler.class, + () -> new ItemSlotSyncHandler(new ModularSlot(handler, finalI))))); + } + return flow; + }); + + DynamicLinkedSyncHandler> dynamicLinkedSyncHandler = new DynamicLinkedSyncHandler<>( + numberListSyncHandler) + .widgetProvider((syncManager1, value1) -> { + List vals = value1.getValue(); + return Flow.col() + .widthRel(1f) + .coverChildrenHeight() + .children(vals.size(), i -> Text.str(String.valueOf(vals.get(i))).asWidget().padding(2)) + .name("synced number col"); + }); + + // disable spotless on the menu layout code so it won't insert random line breaks + // spotless:off + Rectangle colorPickerBackground = new Rectangle().color(Color.RED.main); + ModularPanel panel = new ModularPanel<>("test_tile"); + IPanelHandler panelSyncHandler = syncManager.syncedPanel("other_panel", true, this::openSecondWindow); + IPanelHandler colorPicker = IPanelHandler.simple(panel, + (mainPanel, player) -> new ColorPickerDialog("color_picker", colorPickerBackground.getColor(), true) + .draggable(true) + .relative(panel) + .top(0) + .rightRel(1f), + true); + PagedWidget.Controller tabController = new PagedWidget.Controller(); + panel.resizer() // returns object which is responsible for sizing + .size(176, 220); // set a static size for the main panel + + DoubleSyncValue progressPercent = syncManager.getOrCreateSyncHandler("progressPercent", DoubleSyncValue.class, () -> + new DoubleSyncValue(() -> (this.progress / (double) this.duration))); + + var babyFop = new Fox(EntityType.FOX, guiData.getLevel()); + babyFop.setAge(-1); + panel.child(Flow.row() + .name("Tab row") + .coverChildren() + .topRel(0f, 4, 1f) + .child(new PageButton(0, tabController) + .tab(GuiTextures.TAB_TOP, -1) + .overlay(new EntityDrawable<>(babyFop).followMouse().asIcon().size(8))) + .child(new PageButton(1, tabController) + .tab(GuiTextures.TAB_TOP, 0) + .overlay(new ItemDrawable(Items.OAK_SAPLING).asIcon())) + .child(new PageButton(2, tabController) + .tab(GuiTextures.TAB_TOP, 0) + .overlay(new ItemDrawable(Items.COMPASS).asIcon())) + .child(new PageButton(3, tabController) + .tab(GuiTextures.TAB_TOP, 0) + .overlay(new ItemDrawable(Blocks.CHEST).asIcon())) + .child(new PageButton(4, tabController) + .tab(GuiTextures.TAB_TOP, 0) + .overlay(new ItemDrawable(Items.ENDER_EYE).asIcon()))) + + .child(new Expandable() + .name("expandable") + .top(0) + .leftRelOffset(1f, 1) + .background(GTGuiTextures.BACKGROUND) + .excludeAreaInRecipeViewer() + .stencilTransform((r, expanded) -> { + r.width = Math.max(20, r.width - 5); + r.height = Math.max(20, r.height - 5); + }) + .animationDuration(500) + .interpolation(Interpolation.BOUNCE_OUT) + .collapsedView(new ItemDrawable(Blocks.CRAFTING_TABLE).asIcon().asWidget().size(20).pos(0, 0)) + .expandedView(new ParentWidget<>() + .name("crafting tab") + .coverChildren() + .child(new ItemDrawable(Blocks.CRAFTING_TABLE).asIcon().asWidget().size(20).pos(0, 0)) + .child(SlotGroupWidget.builder() + .row("III D") + .row("III O") + .row("III ") + .key('I', i -> new ItemSlot().slot(new ModularSlot(this.craftingInventory, i)) + .addTooltipLine("This slot is empty")) + .key('O', new ItemSlot().slot(new ModularCraftingSlot(this.craftingInventory, 9))) + .key('D', new ItemDisplayWidget().syncHandler("display_item")) + .build() + .margin(5, 5, 20, 5).name("crafting")))) + + .child(Flow.column() + .name("main col") + .sizeRel(1f) + .paddingBottom(7) + .child(new ParentWidget<>() + .expanded() + .widthRel(1f) + .child(new PagedWidget<>() + .name("root parent") + .sizeRel(1f) + .controller(tabController) + .addPage(new ParentWidget<>() + .name("page 1 parent") + .sizeRel(1f, 1f) + .padding(7, 0) + .child(Flow.row() + .name("buttons, slots and more tests") + .height(137) + .coverChildrenWidth() + .posRel(Alignment.CenterLeft) + // .padding(7) + .child(Flow.col() + .name("buttons and slots test") + .coverChildren() + .marginRight(8) + // .flex(flex -> flex.height(0.5f)) + // .widthRel(0.5f) + .crossAxisAlignment(Alignment.CrossAxis.CENTER) + .child(new ButtonWidget<>() + .size(60, 18) + .overlay(Text.dynamic(() -> Component.literal("Button " + this.val)))) + .child(new FluidSlot() + .margin(2) + .syncHandler(SyncHandlers.fluidSlot(this.fluidTank))) + .child(new ButtonWidget<>() + .size(60, 18) + .tooltip(tooltip -> { + tooltip.showUpTimer(10); + tooltip.addLine(Text.str("Test Line g")); + tooltip.addLine(Text.str("An image inside of a tooltip:")); + tooltip.addDrawableLine(MUI_LOGO + .asIcon().size(50) + .alignment(Alignment.TopCenter)); + tooltip.addLine(Text.str("And here a circle:")); + tooltip.addDrawableLine(new Circle() + .setColor(Color.RED.darker(2), Color.RED.brighter(2)) + .asIcon() + .size(20)) + .addDrawableLine(new ItemDrawable(Items.DIAMOND).asIcon()) + .pos(RichTooltip.Pos.LEFT); + }) + .onMousePressed((context, mouseButton) -> { + // panel.getScreen().close(true); + // panel.getScreen().openDialog("dialog", + // this::buildDialog, + // ModularUI.LOGGER::info); + // openSecondWindow(context).openIn(panel.getScreen()); + panelSyncHandler.openPanel(); + return true; + }) + // .flex(flex -> flex.left(3)) // ? + .overlay(Text.str("Button 2"))) + .child(new TextFieldWidget() + .size(60, 18) + .setTextAlignment(Alignment.CenterRight) + .value(SyncHandlers.string(() -> this.value, + val -> this.value = val)) + .margin(0, 2) + .hintText(Component.literal("hint"))) + .child(new TextFieldWidget() + .size(60, 18) + .paddingTop(1) + .value(SyncHandlers.doubleNumber( + () -> this.doubleValue, + val -> this.doubleValue = val)) + .setNumbersDouble(DoubleUnaryOperator.identity()) + .hintText(Component.literal("number"))) + // .child(Text.str("Test + // string").asWidget().padding(2).name("test + // string")) + .child(new ScrollingTextWidget( + Text.str("Very very long test string")) + .widthRel(1f).height(16)) + // .child(Text.EMPTY.asWidget().name("Empty Text")) + ) + .child(Flow.col() + .name("button and slots test 2") + .coverChildren() + // .widthRel(0.5f) + .crossAxisAlignment(Alignment.CrossAxis.CENTER) + .child(new ProgressWidget() + .value(progressPercent) + .texture(GTGuiTextures.PROGRESS_ARROW.main(), ProgressDrawable.Direction.RIGHT)) + .child(new CircularProgressDrawable() + .emptyTexture(GTGuiTextures.PROGRESS_MIXER[0]) + .filledTexture(GTGuiTextures.PROGRESS_MIXER[1]) + .clockwise() + .asWidget() + .value(progressPercent)) + .child(Flow.row().coverChildrenWidth().height(22) + .child(new ToggleButton() + .value(new BoolValue.Dynamic( + () -> cycleStateValue.getIntValue() == 0, + val -> cycleStateValue.setIntValue(0))) + .overlay(GTGuiTextures.CYCLE_BUTTON + .getSubArea(0, 0, 1, 1 / 3f))) + .child(new ToggleButton() + .value(new BoolValue.Dynamic( + () -> cycleStateValue.getIntValue() == 1, + val -> cycleStateValue.setIntValue(1))) + .overlay(GTGuiTextures.CYCLE_BUTTON + .getSubArea(0, 1 / 3f, 1, + 2 / 3f))) + .child(new ToggleButton() + .value(new BoolValue.Dynamic( + () -> cycleStateValue.getIntValue() == 2, + val -> cycleStateValue.setIntValue(2))) + .overlay(GTGuiTextures.CYCLE_BUTTON + .getSubArea(0, 2 / 3f, 1, 1)))) + /* + * .child(new CycleButtonWidget() + * .length(3) + * .texture(GTGuiTextures.CYCLE_BUTTON) + * .addTooltip(0, "State 1") + * .addTooltip(1, "State 2") + * .addTooltip(2, "State 3") + * .background(GTGuiTextures.BUTTON) + * .value(SyncHandlers.intNumber(() -> this.cycleState, + * val -> this.cycleState = val))) + */ + .child(new ItemSlot() + .slot(SyncHandlers.itemSlot(this.inventory, 0) + .ignoreMaxStackSize(true) + .singletonSlotGroup())) + .child(new FluidSlot() + .margin(2) + .width(30) + .alwaysShowFull(false) + .syncHandler(SyncHandlers + .fluidSlot(this.fluidTankPhantom) + .phantom(true))) + .child(Flow.col() + .name("button and slots test 3") + .coverChildren() + .child(new TextFieldWidget() + .size(60, 20) + .value(SyncHandlers.intNumber( + () -> this.intValue, + val -> this.intValue = val)) + .setNumbers(0, 9999999) + .hintText(Component + .literal("integer"))))))) + .addPage(Flow.col() + .name("Slots test page") + .coverChildren() + // .height(120) + .padding(7) + .leftRel(0.5f) + .mainAxisAlignment(Alignment.MainAxis.START) + .childPadding(2) + // .child(SlotGroupWidget.playerInventory().left(0)) + .child(SlotGroupWidget.builder() + .matrix("III", "III", "III") + .key('I', index -> { + // 4 is the middle slot with a negative priority -> shift + // click prioritises middle slot + if (index == 4) { + return new ItemSlot().slot( + SyncHandlers.itemSlot(this.bigInventory, index) + .singletonSlotGroup(-100)); + } + return new ItemSlot().slot( + SyncHandlers.itemSlot(this.bigInventory, index) + .slotGroup("item_inv")); + }) + .build().name("9 slot inv") + .placeSortButtonsTopRightVertical() + // .marginBottom(2) + ) + .child(SlotGroupWidget.builder() + .row("FII") + .row("FII") + .key('F', + index -> new FluidSlot().syncHandler("mixer_fluids", + index)) + .key('I', + index -> ItemSlot.create(index >= 2) + .slot(new ModularSlot(this.mixerItems, index) + .slotGroup("mixer_items") + .filter(stack -> !stack.getCapability( + ForgeCapabilities.ITEM_HANDLER) + .isPresent()))) + .build().name("mixer inv") + .disableSortButtons()) + .child(Flow.row() + .coverChildrenHeight() + .child(new CycleButtonWidget() + .size(20, 20) + .stateCount(3) + .stateOverlay(GTGuiTextures.CYCLE_BUTTON) + .value(new IntSyncValue(() -> this.val2, val -> this.val2 = val)) + .margin(8, 0)) + .child(Text.str("Hello World").asWidget().height(18))) + /*.child(*//*new SpecialButton( + Text.str("A very long string that looks cool when animated") + *//**//*.withAnimation()*//**//*) + .height(14) + .widthRel(1f)*//*)*/ + /* + * GuiTextures.LOGO.asIcon() + * .size(80, 80) + * .asWidget() + * .flex(flex -> flex.width(1f).height(1f)) + */) + .addPage(new ParentWidget<>() + .name("page 3 parent") + .sizeRel(1f, 1f) + .padding(7) + // .child(SlotGroupWidget.playerInventory()) + .child(new SliderWidget() + .widthRel(1f).bottom(50).height(16) // test overwriting of units + .top(7) + .stopper(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100) + .background(GTGuiTextures.FLUID_SLOT)) + .child(new ButtonWidget<>() + .name("color picker button") + .top(25) + .background(colorPickerBackground) + .disableHoverBackground() + .onMousePressed((context, mouseButton) -> { + colorPicker.openPanel(); + return true; + })) + .child(new ListWidget<>() + .name("test config list") + .widthRel(1f).top(50).bottom(2) + /* + * .child(new Rectangle().setColor(0xFF606060).asWidget() + * .top(1) + * .left(32) + * .size(1, 40)) + */ + .child(Flow.row() + .name("test config 1") + .widthRel(1f).coverChildrenHeight() + .crossAxisAlignment(Alignment.CrossAxis.CENTER) + .childPadding(2) + .child(new CycleButtonWidget() + .value(new BoolValue(false)) + .stateOverlay(GuiTextures.CHECK_BOX) + .size(14, 14) + .margin(8, 4)) + .child(Text.str("Boolean config").asWidget().height(14))) + .child(Flow.row() + .name("test config 2") + .widthRel(1f).height(14) + .childPadding(2) + .child(new TextFieldWidget() + .value(new IntValue.Dynamic(() -> this.num, val -> this.num = val)) + .disableHoverBackground() + .setNumbers(1, Short.MAX_VALUE) + .setTextAlignment(Alignment.Center) + .background(new Rectangle().color(0xFFb1b1b1)) + .setTextColor(Text.TEXT_COLOR) + .size(20, 14)) + .child(Text.str("Number config").asWidget() + .height(14))) + .child(Text.str("Config title").asWidget() + .color(0xFF404040) + .alignment(Alignment.CenterLeft) + .left(5).height(14) + .tooltip(tooltip -> tooltip.showUpTimer(10) + .addLine(Text.str("Config title tooltip")))) + .child(Flow.row() + .name("test config 3") + .widthRel(1f).height(14) + .childPadding(2) + .child(new CycleButtonWidget() + .value(new BoolValue(false)) + .stateOverlay(GuiTextures.CHECK_BOX) + .size(14, 14)) + .child(Text.str("Boolean config 3").asWidget().height(14))))) + .addPage(new ParentWidget<>() + .name("page 4 storage") + .sizeRel(1f) + .child(Flow.col() + .name("page 4 col, dynamic widgets") + .padding(7) + .child(new ItemSlot() + .slot(new ModularSlot(this.storageInventory0, 0) + .changeListener(((newItem, onlyAmountChanged, client, init) -> { + if (client && !onlyAmountChanged) { + dynamicSyncHandler.notifyUpdate( + packet -> packet.writeItem(newItem)); + } + })))) + .child(new DynamicSyncedWidget<>() + .widthRel(1f) + .syncHandler(dynamicSyncHandler)) + /*.child(new DynamicSyncedWidget<>() + .widthRel(1f) + .coverChildrenHeight() + .syncHandler(dynamicLinkedSyncHandler))*/)) + .addPage(createSchemaPage(guiData)))) + .child(SlotGroupWidget.playerInventory(false))); + /* + * panel.child(new ButtonWidget<>() + * .flex(flex -> flex.size(60, 20) + * .top(7) + * .left(0.5f)) + * .background(GuiTextures.BUTTON, Text.dynamic(() -> "Button " + this.val))) + * .child(SlotGroup.playerInventory()) + * .child(new FluidSlot().flex(flex -> flex + * .top(30) + * .left(0.5f)) + * .setSynced("fluid_slot")); + */ + // spotless:on + + return panel; + } + + private IWidget createSchemaPage(GuiData data) { + ParentWidget page = new ParentWidget<>(); + page.name("Page 5 schema"); + page.sizeRel(1f); + page.child(Text.str("Schema").asWidget()); + + if (getLevel().isClientSide()) { + page.child(new SchemaWidget( + new SchemaRenderer(ArraySchema.of(data.getPlayer(), 20)) + .highlightRenderer( + new BlockHighlight(Color.withAlpha(Color.GREEN.brighter(1), 0.9f), 1 / 32f)) + /* .isometric(true) */) + .pos(20, 20) + .size(100, 100)); + } + + return page; + } + + public ModularPanel openSecondWindow(PanelSyncManager syncManager, IPanelHandler syncHandler) { + ModularPanel panel = new Dialog<>("second_window") + .disablePanelsBelow(false) + .closeOnOutOfBoundsClick(false) + .draggable(true) + .size(100, 100) + .resizeableOnDrag(true); + SlotGroup slotGroup = new SlotGroup("small_inv", 2); + IntSyncValue timeSync = new IntSyncValue(() -> (int) java.lang.System.currentTimeMillis()); + syncManager.syncValue(123456, timeSync); + syncManager.registerSlotGroup(slotGroup); + AtomicInteger number = new AtomicInteger(0); + syncManager.syncValue("int_value", new IntSyncValue(number::get, number::set)); + IPanelHandler panelSyncHandler = syncManager.syncedPanel("other_panel_2", true, + (syncManager1, syncHandler1) -> openThirdWindow(syncManager1, syncHandler1, number)); + IntSyncValue num = syncManager.getHyperVisor().findSyncHandler("cycle_state", IntSyncValue.class); + panel.child(ButtonWidget.panelCloseButton()) + .child(new ButtonWidget<>() + .size(10).top(14).right(4) + .overlay((new FluidDrawable().setFluid(GTMaterials.Iron.getFluid(200))), Text.str("3")) + .size(50, 50) + .onMousePressed((context, mouseButton) -> { + panelSyncHandler.openPanel(); + return true; + })) + .child(Text.str("2nd Panel") + .asWidget() + .pos(5, 5)) + .child(SlotGroupWidget.builder() + .row("II") + .row("II") + .key('I', i -> new ItemSlot().slot(new ModularSlot(smallInv, i).slotGroup(slotGroup))) + .build() + .center()) + .child(new CycleButtonWidget() + .size(16).pos(5, 5 + 11) + .value(num) + .stateOverlay(0, Text.str("1")) + .stateOverlay(1, Text.str("2")) + .stateOverlay(2, Text.str("3")) + .addTooltipLine(Text.str("Hyper Visor test"))) + .child(new ButtonWidget<>() + .bottom(5) + .right(5) + .tooltip(richTooltip -> richTooltip.textColor(Color.RED.main).add("WARNING! Very Dangerous")) + .onMousePressed((context, mouseButton) -> { + if (!panelSyncHandler.isPanelOpen()) { + panelSyncHandler.deleteCachedPanel(); + number.incrementAndGet(); + } + return true; + })); + return panel; + } + + public ModularPanel openThirdWindow(PanelSyncManager syncManager, IPanelHandler syncHandler, + AtomicInteger integer) { + ModularPanel panel = new Dialog<>("third_window") + .disablePanelsBelow(false) + .closeOnOutOfBoundsClick(false) + .draggable(true) + .size(50, 50); + panel.child(ButtonWidget.panelCloseButton()) + .child(Text.str("3rd Panel: " + integer.get()) + .asWidget() + .pos(5, 17)); + return panel; + } + + public void buildDialog(Dialog dialog) { + AtomicReference value = new AtomicReference<>(""); + dialog.draggable(true); + dialog.child(new TextFieldWidget() + .resizer(flex -> flex.size(100, 20).center()) + .value(new StringValue.Dynamic(value::get, value::set))) + .child(new ButtonWidget<>() + .resizer(flex -> flex.size(8, 8).top(5).right(5)) + .overlay(Text.str("x")) + .onMousePressed((context, mouseButton) -> { + dialog.closeWith(value.get()); + return true; + })); + } + + @Override + public void clientTick() { + if (this.time++ % 20 == 0) { + this.val++; + } + if (++this.progress == this.duration) { + this.progress = 0; + } + } + + public @NotNull ModularPanel buildSearchTest(ModularGuiContext context) { + List items = Arrays.asList("Chicken", "Jockey", "Flint", "Steel", "Steve", "Diamond", "Ingot", "Iron", + "Armor", "Greg"); + StringValue searchValue = new StringValue(""); + return ModularPanel.defaultPanel("search", 100, 150) + .child(Flow.column() + .padding(5) + .child(new TextFieldWidget() + .value(searchValue) + .height(16) + .widthRel(1f)) + .child(new ListWidget<>() + .collapseDisabledChildren() + .expanded() + .widthRel(1f) + .children(items.size(), i -> new TextWidget<>(Text.str(items.get(i))) + .alignment(Alignment.Center) + .color(Color.WHITE.main) + .widthRel(1f) + .height(16) + .background(GuiTextures.MC_BUTTON) + .setEnabledIf(w -> items.get(i).toLowerCase() + .contains(searchValue.getStringValue()))))); + } + + public void tick() { + if (this.time++ % 20 == 0) { + if (++this.val2 == 3) this.val2 = 0; + Collection vals = ForgeRegistries.ITEMS.getValues(); + Item item = vals.stream().skip(new Random().nextInt(vals.size())).findFirst().orElse(Items.DIAMOND); + this.displayItem = new ItemStack(item, 26735987); + + Random rnd = new Random(); + this.serverInts.clear(); + for (int i = 0; i < 5; i++) { + this.serverInts.add(rnd.nextInt(100)); + } + } + if (++this.progress == this.duration) { + this.progress = 0; + } + } + + /* + * private static class SpecialButton extends ButtonWidget { + * + * private final AnimatedText animatedKey; + * + * private SpecialButton(AnimatedText animatedKey) { + * this.animatedKey = animatedKey.stopAnimation().forward(true); + * this.animatedKey.reset(); + * } + * + * @Override + * public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { + * this.animatedKey.draw(context, 0, 0, getArea().w(), getArea().h(), + * getActiveWidgetTheme(widgetTheme, isHovering())); + * } + * + * @Override + * public void onMouseStartHover() { + * super.onMouseStartHover(); + * this.animatedKey.startAnimation().forward(true); + * } + * + * @Override + * public void onMouseEndHover() { + * super.onMouseEndHover(); + * this.animatedKey.forward(false); + * } + * } + */ +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CokeOvenMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CokeOvenMachine.java index c7700cb8c84..44d4070ea4e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CokeOvenMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CokeOvenMachine.java @@ -19,6 +19,7 @@ import net.minecraftforge.fluids.FluidUtil; import brachy.modularui.api.ITheme; +import brachy.modularui.drawable.progress.ProgressDrawable; import brachy.modularui.factory.PosGuiData; import brachy.modularui.screen.UISettings; import brachy.modularui.theme.ThemeAPI; @@ -70,7 +71,7 @@ public void buildMainUI(ParentWidget mainWidget, PosGuiData guiData, PanelSyn .child(new ProgressWidget() .value(progressPercent) .size(20, 15) - .texture(GTGuiTextures.PRIMITIVE_BLAST_FURNACE_PROGRESS_BAR, 18) + .texture(GTGuiTextures.PRIMITIVE_BLAST_FURNACE_PROGRESS_BAR, ProgressDrawable.Direction.RIGHT) .margin(4, 0)) .child(new ItemSlot().syncHandler(new ItemSlotSyncHandler( diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveBlastFurnaceMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveBlastFurnaceMachine.java index 24301ea7dba..01ebe663a37 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveBlastFurnaceMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveBlastFurnaceMachine.java @@ -30,6 +30,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import brachy.modularui.api.ITheme; +import brachy.modularui.drawable.progress.ProgressDrawable; import brachy.modularui.factory.PosGuiData; import brachy.modularui.screen.UISettings; import brachy.modularui.theme.ThemeAPI; @@ -158,7 +159,7 @@ public void buildMainUI(ParentWidget mainWidget, PosGuiData guiData, PanelSyn .child(new ProgressWidget() .value(progressPercent) .size(20, 15) - .texture(GTGuiTextures.PRIMITIVE_BLAST_FURNACE_PROGRESS_BAR, 0) + .texture(GTGuiTextures.PRIMITIVE_BLAST_FURNACE_PROGRESS_BAR, ProgressDrawable.Direction.RIGHT) .margin(5, 5, 0, 0)) .child(createExportItemSlot(syncManager, theme)); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java index b47eb32a336..63fbae3a930 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java @@ -19,6 +19,7 @@ import net.minecraftforge.fluids.FluidUtil; import brachy.modularui.drawable.UITexture; +import brachy.modularui.drawable.progress.ProgressDrawable; import brachy.modularui.factory.PosGuiData; import brachy.modularui.screen.UISettings; import brachy.modularui.utils.Alignment; @@ -94,9 +95,8 @@ public void buildMainUI(ParentWidget mainWidget, PosGuiData guiData, PanelSyn .crossAxisAlignment(Alignment.CrossAxis.CENTER) .child(new ProgressWidget() .size(18) - .texture(progressTexture, 18) + .texture(progressTexture, ProgressDrawable.Direction.UP) .value(progressPercent) - .direction(ProgressWidget.Direction.UP) .setEnabledIf((w) -> progressPercent.getFloatValue() > -1f)) .child(new FluidSlot() .syncHandler(new FluidSlotSyncHandler(fuelTank.getStorages()[0]) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolarBoiler.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolarBoiler.java index 1149d7b5368..82fb6c3b668 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolarBoiler.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolarBoiler.java @@ -12,6 +12,7 @@ import net.minecraft.util.RandomSource; import brachy.modularui.drawable.UITexture; +import brachy.modularui.drawable.progress.ProgressDrawable; import brachy.modularui.factory.PosGuiData; import brachy.modularui.screen.UISettings; import brachy.modularui.value.sync.DoubleSyncValue; @@ -84,8 +85,10 @@ public void buildMainUI(ParentWidget mainWidget, PosGuiData guiData, PanelSyn })); mainWidget.child(new ProgressWidget() + .right(20) + .top(30) .size(18) - .texture(progressTexture, 20) + .texture(progressTexture, ProgressDrawable.Direction.UP) .value(canSeeSun)); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java index 5894bf8ff96..b7ea4f2f473 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java @@ -19,6 +19,7 @@ import net.minecraftforge.fluids.FluidUtil; import brachy.modularui.drawable.UITexture; +import brachy.modularui.drawable.progress.ProgressDrawable; import brachy.modularui.factory.PosGuiData; import brachy.modularui.screen.UISettings; import brachy.modularui.value.sync.DoubleSyncValue; @@ -139,9 +140,8 @@ public void buildMainUI(ParentWidget mainWidget, PosGuiData guiData, PanelSyn .slot(new ModularSlot(this.fuelHandler, 0))) .child(new ProgressWidget() .size(18) - .texture(progressTexture, 18) - .value(progressPercent) - .direction(ProgressWidget.Direction.UP)) + .texture(progressTexture, ProgressDrawable.Direction.UP) + .value(progressPercent)) .child(new ItemSlot() .slot(new ModularSlot(this.ashHandler, 0)))); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/GTGuiTextures.java b/src/main/java/com/gregtechceu/gtceu/common/mui/GTGuiTextures.java index fe3fc3b8988..c4783be13d7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/GTGuiTextures.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/GTGuiTextures.java @@ -11,7 +11,7 @@ import brachy.modularui.drawable.ColorType; import brachy.modularui.drawable.TabTexture; import brachy.modularui.drawable.UITexture; -import brachy.modularui.widgets.ProgressWidget; +import brachy.modularui.drawable.progress.ProgressDrawable; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -228,9 +228,11 @@ interface IDs { UITexture[] BUTTON_VOID_MULTIBLOCK = slice("textures/gui/widget/button_void_multiblock.png", 16, 64, 16, 16, ColorType.DEFAULT); - UITexture[] FILTER_MODE_OVERLAY = slice( - "textures/gui/overlay/filter_mode_overlay.png", - 16, 48, 16, 16, ColorType.DEFAULT); + UITexture[] FILTER_MODE_OVERLAY = { + fullImage("textures/gui/icon/filter_mode/filter_insert.png"), + fullImage("textures/gui/icon/filter_mode/filter_extract.png"), + fullImage("textures/gui/icon/filter_mode/filter_both.png") + }; UITexture[] PRIVATE_MODE_BUTTON = slice( "textures/gui/widget/button_public_private.png", @@ -475,8 +477,8 @@ interface IDs { ProgressBarTextureSet PROGRESS_ASSEMBLER = new ProgressBarTextureSet( progressBar("textures/gui/progress_bar/progress_bar_assembler.png", ColorType.DEFAULT)); - ProgressBarTextureSet PROGRESS_BATH = new ProgressBarTextureSet(20, ProgressWidget.Direction.CIRCULAR_CW, - progressBar("textures/gui/progress_bar/progress_bar_bath.png", ColorType.DEFAULT)); + UITexture[] PROGRESS_BATH = slice("textures/gui/progress_bar/progress_bar_bath.png", + 20, 40, 20, 20, ColorType.DEFAULT); ProgressBarTextureSet PROGRESS_BENDING = new ProgressBarTextureSet( progressBar("textures/gui/progress_bar/progress_bar_bending.png", ColorType.DEFAULT)); @@ -512,7 +514,7 @@ interface IDs { ProgressBarTextureSet PROGRESS_GAS_COLLECTOR = new ProgressBarTextureSet( progressBar("textures/gui/progress_bar/progress_bar_gas_collector.png", ColorType.DEFAULT)); - ProgressBarTextureSet PROGRESS_HAMMER = new ProgressBarTextureSet(20, ProgressWidget.Direction.DOWN, + ProgressBarTextureSet PROGRESS_HAMMER = new ProgressBarTextureSet(20, ProgressDrawable.Direction.DOWN, progressBar("textures/gui/progress_bar/progress_bar_hammer.png", ColorType.DEFAULT), progressBar("textures/gui/progress_bar/progress_bar_hammer_bronze.png"), progressBar("textures/gui/progress_bar/progress_bar_hammer_steel.png")); @@ -522,7 +524,7 @@ interface IDs { fullImage("textures/gui/progress_bar/progress_bar_hammer_base_bronze.png"), fullImage("textures/gui/progress_bar/progress_bar_hammer_base_steel.png")); - ProgressBarTextureSet PROGRESS_MACERATE = new ProgressBarTextureSet(20, ProgressWidget.Direction.RIGHT, + ProgressBarTextureSet PROGRESS_MACERATE = new ProgressBarTextureSet(20, ProgressDrawable.Direction.RIGHT, progressBar("textures/gui/progress_bar/progress_bar_macerate.png", ColorType.DEFAULT), progressBar("textures/gui/progress_bar/progress_bar_macerate_bronze.png"), progressBar("textures/gui/progress_bar/progress_bar_macerate_steel.png")); @@ -530,10 +532,10 @@ interface IDs { ProgressBarTextureSet PROGRESS_MAGNET = new ProgressBarTextureSet( progressBar("textures/gui/progress_bar/progress_bar_magnet.png", ColorType.DEFAULT)); - ProgressBarTextureSet PROGRESS_MIXER = new ProgressBarTextureSet(20, ProgressWidget.Direction.CIRCULAR_CW, - progressBar("textures/gui/progress_bar/progress_bar_mixer.png", ColorType.DEFAULT)); + UITexture[] PROGRESS_MIXER = slice("textures/gui/progress_bar/progress_bar_mixer.png", + 20, 40, 20, 20, ColorType.DEFAULT); - ProgressBarTextureSet PROGRESS_SIFTER = new ProgressBarTextureSet(20, ProgressWidget.Direction.DOWN, + ProgressBarTextureSet PROGRESS_SIFTER = new ProgressBarTextureSet(20, ProgressDrawable.Direction.DOWN, progressBar("textures/gui/progress_bar/progress_bar_sift.png", ColorType.DEFAULT)); ProgressBarTextureSet PROGRESS_CUTTER = new ProgressBarTextureSet( @@ -590,7 +592,7 @@ interface IDs { UITexture PROGRESS_BAR_BOILER_FUEL_STEEL = progressBar( "textures/gui/progress_bar/progress_bar_boiler_fuel_steel.png", 18, 36); - ProgressBarTextureSet PROGRESS_BOILER_FUEL_STEEL = new ProgressBarTextureSet(18, ProgressWidget.Direction.UP, + ProgressBarTextureSet PROGRESS_BOILER_FUEL_STEEL = new ProgressBarTextureSet(18, ProgressDrawable.Direction.UP, PROGRESS_BAR_BOILER_FUEL_STEEL); UITexture PROGRESS_BAR_CRACKING_INPUT = progressBar("textures/gui/progress_bar/progress_bar_cracking_2.png", 21, 38, diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiCoverUtil.java b/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiCoverUtil.java new file mode 100644 index 00000000000..0744d2dbbbe --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiCoverUtil.java @@ -0,0 +1,80 @@ +package com.gregtechceu.gtceu.common.mui; + +import brachy.modularui.api.drawable.Text; +import brachy.modularui.value.sync.EnumSyncValue; +import brachy.modularui.widgets.layout.Flow; +import com.gregtechceu.gtceu.common.cover.data.DistributionMode; +import com.gregtechceu.gtceu.common.cover.data.FilterMode; +import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; +import com.gregtechceu.gtceu.common.cover.data.TransferMode; +import net.minecraft.network.chat.Component; + +public class GTMuiCoverUtil { + + public static void addManualIORow(Flow column, EnumSyncValue value) { + Component[] manualIODesc = { + Component.translatable("cover.universal.manual_import_export.mode.description.0"), + Component.translatable("cover.universal.manual_import_export.mode.description.1"), + Component.translatable("cover.universal.manual_import_export.mode.description.2"), + }; + column.child(new GTMuiWidgets.EnumRowBuilder<>(ManualIOMode.class) + .value(value) + .buttonTooltipSupplier((v) -> () -> Component.translatable(v.getTooltip())) + .overlay(16, GTGuiTextures.MANUAL_IO_OVERLAY_IN) + .lang(Text.comp(Component.translatable(ManualIOMode.getTitle()))) + .multiLangTooltip() + .multiLangTooltip(manualIODesc) + .build()); + } + + public static void addDistributionModeRow(Flow column, EnumSyncValue value) { + Component[] distributionModeDesc = { + Component.translatable("cover.conveyor.distribution.round_robin_global.0"), + Component.translatable("cover.conveyor.distribution.round_robin_global.1"), + Component.translatable("cover.conveyor.distribution.round_robin_prio.0"), + Component.translatable("cover.conveyor.distribution.round_robin_prio.1"), + Component.translatable("cover.conveyor.distribution.round_robin_prio.2"), + Component.translatable("cover.conveyor.distribution.insert_first.0"), + Component.translatable("cover.conveyor.distribution.insert_first.1"), + Component.translatable("cover.conveyor.distribution.insert_first.2"), + }; + column.child(new GTMuiWidgets.EnumRowBuilder<>(DistributionMode.class) + .value(value) + .buttonTooltipSupplier((v) -> () -> Component.translatable(v.getTooltip())) + .overlay(16, GTGuiTextures.DISTRIBUTION_MODE_OVERLAY) + .lang(Text.comp(Component.translatable(DistributionMode.getTitle()))) + .multiLangTooltip(distributionModeDesc) + .build()); + } + + public static void addFilterModeRow(Flow column, EnumSyncValue value) { + Component[] filterModeDesc = { + Component.translatable("cover.universal.manual_import_export.mode.description.0"), + Component.translatable("cover.universal.manual_import_export.mode.description.1"), + Component.translatable("cover.universal.manual_import_export.mode.description.2"), + }; + column.child(new GTMuiWidgets.EnumRowBuilder<>(FilterMode.class) + .value(value) + .buttonTooltipSupplier((v) -> () -> Component.translatable(v.getTooltip())) + .overlay(16, GTGuiTextures.FILTER_MODE_OVERLAY) + .lang(Text.comp(Component.translatable(FilterMode.getTitle()))) + .multiLangTooltip(filterModeDesc) + .build()); + } + + public static void addTransferModeRow(Flow column, EnumSyncValue value) { + Component[] transferModeDesc = { + Component.translatable("cover.robotic_arm.transfer_mode.description.0"), + Component.translatable("cover.robotic_arm.transfer_mode.description.1"), + Component.translatable("cover.robotic_arm.transfer_mode.description.2"), + Component.translatable("cover.robotic_arm.transfer_mode.description.3"), + }; + column.child(new GTMuiWidgets.EnumRowBuilder<>(TransferMode.class) + .value(value) + .buttonTooltipSupplier((v) -> () -> Component.translatable(v.getTooltip())) + .overlay(16, GTGuiTextures.TRANSFER_MODE_OVERLAY) + .lang(Text.comp(Component.translatable(TransferMode.getTitle()))) + .multiLangTooltip(transferModeDesc) + .build()); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java b/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java index 00de1e82a8b..eb518bb0936 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java @@ -49,6 +49,8 @@ import it.unimi.dsi.fastutil.booleans.BooleanConsumer; import org.jetbrains.annotations.Nullable; +import java.util.Collections; +import java.util.List; import java.util.Objects; import java.util.function.*; @@ -68,10 +70,11 @@ public static Flow createTitleBar(MachineDefinition definition, int panelWidth) } public static Flow createTitleBar(MachineDefinition definition, int panelWidth, UITexture background) { - return createTitleBar(definition.asStack(), panelWidth, background); + return createTitleBar(() -> definition.asStack(), panelWidth, background); } - public static Flow createTitleBar(ItemStack stack, int panelWidth, UITexture background) { + public static Flow createTitleBar(Supplier stackSupplier, int panelWidth, UITexture background) { + ItemStack stack = stackSupplier.get(); var name = stack.getHoverName().getString(); name = name.replaceAll("§.", "").trim(); return createTitleBar(new ItemDrawable(stack).asIcon(), name, panelWidth, background); @@ -147,18 +150,20 @@ public static ToggleButton createPowerButton(IControllable workable) { "behaviour.soft_hammer"); } - public static ProgressWidget createProgressBar(IRecipeLogicMachine workableMachine, PanelSyncManager syncManager, - UITexture texture, int size) { - DoubleSyncValue progressPercent = syncManager.getOrCreateSyncHandler("progressPercent", DoubleSyncValue.class, - () -> new DoubleSyncValue(() -> { - if (workableMachine.getMaxProgress() == 0.0f) return 0.0f; - return workableMachine.getProgress() / (double) workableMachine.getMaxProgress(); - })); - - return new ProgressWidget() - .texture(texture, size) - .value(progressPercent); - } + /* + * public static ProgressWidget createProgressBar(IRecipeLogicMachine workableMachine, PanelSyncManager syncManager, + * UITexture texture, int size) { + * DoubleSyncValue progressPercent = syncManager.getOrCreateSyncHandler("progressPercent", DoubleSyncValue.class, + * () -> new DoubleSyncValue(() -> { + * if (workableMachine.getMaxProgress() == 0.0f) return 0.0f; + * return workableMachine.getProgress() / (double) workableMachine.getMaxProgress(); + * })); + * + * return new ProgressWidget() + * .texture(texture, size) + * .value(progressPercent); + * } + */ public static FluidSlot createTankWidget() { return new FluidSlot().size(20, 58).alwaysShowFull(false); @@ -375,42 +380,41 @@ public static CycleButtonWidget createIOCycleButton(EnumSyncValue syncValue, return cycleButton; } - public static > ParentWidget createFilterRow(ParentWidget existingRow, + public static > ParentWidget createFilterRow(Flow existingRow, FilterHandler filterHandler, SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { var filterSlot = filterHandler.getFilterSlot(); - // TODO get the panel to use the right sync handler when swapping from one item filter to the next - var panelHandler = syncManager.syncedPanel("filterPanel", true, - (sm, sh) -> filterHandler.loadFilter(filterSlot.getStackInSlot(0)).getPanel(data, sm, settings)); - - DynamicSyncHandler filterButton = new DynamicSyncHandler() - .widgetProvider((sm, buf) -> { - ItemStack stack = buf.readItem(); - if (stack.isEmpty()) return new EmptyWidget(); - stack = filterSlot.getStackInSlot(0); - S filter = filterHandler.loadFilter(stack); - - return new ButtonWidget<>() - .onMousePressed((context, b) -> { - panelHandler.openPanel(); - return true; - }); - }); - return existingRow.child(new ItemSlot() - .slot(new ModularSlot(filterSlot, 0) - .changeListener((stack, amount, client, init) -> filterButton - .notifyUpdate(packet -> packet.writeItem(stack))))) - .child(new DynamicSyncedWidget<>().syncHandler(filterButton)); + + ModularSlot modSlot = new ModularSlot(filterSlot, 0) + .singletonSlotGroup(0); + + ItemSlotSyncHandler filterSlotHandler = new ItemSlotSyncHandler(modSlot); + syncManager.syncValue("filterSlotHandler", filterSlotHandler); + + IPanelHandler panelHandler = syncManager.syncedPanel("filterPanel", true, + (sm, sh) -> filterHandler.loadFilter(filterSlotHandler.getSlot().getItem()).getPanel(data, sm, settings)); + + + return existingRow + .child(new ItemSlot().syncHandler(filterSlotHandler)) + .child(new ButtonWidget<>() + .background(GuiTextures.MC_BUTTON) + .size(16) + .onMousePressed((c, b) -> { + panelHandler.togglePanel(); + return true; + }) + .setEnabledIf((w) -> !filterSlotHandler.getSlot().getItem().isEmpty())); } public static > ParentWidget createFilterRow(FilterHandler filterHandler, SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { - return createFilterRow(Flow.row().coverChildrenHeight().childPadding(2), filterHandler, data, syncManager, - settings); + Flow row = Flow.row().coverChildrenHeight().childPadding(2); + return createFilterRow(row, filterHandler, data, syncManager, settings); } private static int getIncrementValue(MouseData data, int step) { @@ -608,7 +612,10 @@ public boolean onMouseScrolled(double delta) { .right(0) .width(18) .value(bucketModeSyncValue) - .background(BucketMode.BUCKET.getIcon(), BucketMode.MILLI_BUCKET.getIcon())); + .background(GTGuiTextures.BUTTON) + .stateOverlay(0, BucketMode.BUCKET.icon.asIcon().size(16)) + .stateOverlay(1, BucketMode.MILLI_BUCKET.icon.asIcon().size(16)) + ); } public static class EnumRowBuilder> { @@ -616,6 +623,8 @@ public static class EnumRowBuilder> { private @Nullable EnumSyncValue syncValue; private final Class enumValue; private @Nullable Component lang; + private @Nullable List langTooltip; + private @Nullable Function> buttonTooltipSupplier; private IDrawable @Nullable [] background; private @Nullable IDrawable selectedBackground; private IDrawable @Nullable [] overlay; @@ -634,6 +643,21 @@ public EnumRowBuilder lang(Component lang) { return this; } + public EnumRowBuilder langTooltip(Component tooltip) { + this.langTooltip = Collections.singletonList(tooltip); + return this; + } + + public EnumRowBuilder multiLangTooltip(Component... tooltips) { + this.langTooltip = List.of(tooltips); + return this; + } + + public EnumRowBuilder multiLangTooltip(List tooltips) { + this.langTooltip = tooltips; + return this; + } + public EnumRowBuilder background(IDrawable... background) { this.background = background; return this; @@ -657,6 +681,11 @@ public EnumRowBuilder overlay(int size, IDrawable... overlay) { return this; } + public EnumRowBuilder buttonTooltipSupplier(Function> buttonTooltipSupplier) { + this.buttonTooltipSupplier = buttonTooltipSupplier; + return this; + } + private BoolValue.Dynamic boolValueOf(EnumSyncValue syncValue, T value) { return new BoolValue.Dynamic(() -> syncValue.getValue() == value, $ -> syncValue.setValue(value)); } @@ -681,16 +710,26 @@ public Flow build() { if (this.overlay != null) button.overlay(this.overlay[enumVal.ordinal()]); - if (enumVal instanceof StringRepresentable serializable) { + if (this.buttonTooltipSupplier != null) { + button.addTooltipLine(Text.lang(buttonTooltipSupplier.apply(enumVal).get().getString())); + } else if (enumVal instanceof StringRepresentable serializable) { button.addTooltipLine(Text.lang(serializable.getSerializedName())); } row.child(button); } } - if (this.lang != null) - row.child(Text.of(lang).asWidget().posRel(Alignment.CenterRight).height(18)); - + if (this.lang != null) { + TextWidget text = Text.comp(lang) + .asWidget() + .verticalCenter() + .rightRel(0.f) + .height(18); + if(this.langTooltip != null) { + text.tooltip(r -> langTooltip.forEach(r::addLine)); + } + row.child(text); + } return row; } } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 683c8914296..ca620c09b2e 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -67,6 +67,7 @@ public static void init(RegistrateLangProvider provider) { provider.add("recipe.condition.quest.completed.tooltip", "Requires %s completed"); provider.add("recipe.condition.quest.not_completed.tooltip", "Requires %s not completed"); + provider.add("gtceu.io.title", "IO Mode"); provider.add("gtceu.io.import", "Import"); provider.add("gtceu.io.export", "Export"); provider.add("gtceu.io.both", "Both"); @@ -404,7 +405,7 @@ public static void init(RegistrateLangProvider provider) { provider.add("item.gtceu.blacklight.tooltip", "Long-Wave §dUltraviolet§7 light source"); provider.add("gui.widget.incrementButton.default_tooltip", "Hold Shift, Ctrl or both to change the amount"); - provider.add("gui.widget.recipeProgressWidget.default_tooltip", "Show Recipes"); + provider.add("gtceu.recipe_type.show_recipes", "Show Recipes"); multilineLang(provider, "gtceu.recipe_memory_widget.tooltip", "§7Left click to automatically input this recipe into the crafting grid\n§7Shift click to lock/unlock this recipe"); provider.add("cover.filter.blacklist.disabled", "Whitelist"); @@ -436,9 +437,14 @@ public static void init(RegistrateLangProvider provider) { provider.add("cover.fluid_filter.mode.filter_both", "Filter Fill & Drain"); provider.add("cover.item_filter.title", "Item Filter"); provider.add("cover.storage.title", "Storage Cover"); + provider.add("cover.filter.mode.title", "Filter Mode"); provider.add("cover.filter.mode.filter_insert", "Filter Insert"); provider.add("cover.filter.mode.filter_extract", "Filter Extract"); provider.add("cover.filter.mode.filter_both", "Filter Insert/Extract"); + provider.add("cover.manual.mode.title", "Manual I/O"); + provider.add("cover.manual.mode.disabled", "§bDisabled§r"); + provider.add("cover.manual.mode.filtered", "§bFiltered§r"); + provider.add("cover.manual.mode.unfiltered", "§bUnfiltered§r"); provider.add("cover.item_filter.ignore_damage.enabled", "Ignore Damage"); provider.add("cover.item_filter.ignore_damage.disabled", "Respect Damage"); provider.add("cover.item_filter.ignore_nbt.enabled", "Ignore NBT"); @@ -468,6 +474,10 @@ public static void init(RegistrateLangProvider provider) { provider.add("cover.conveyor.mode", "Mode: %s"); provider.add("cover.conveyor.mode.export", "Mode: Export"); provider.add("cover.conveyor.mode.import", "Mode: Import"); + provider.add("cover.distribution.mode.title", "Distribution Mode"); + provider.add("cover.distribution.mode.round_robin_global", "Round Robin"); + provider.add("cover.distribution.mode.round_robin_prio", "Round Robin with Restriction"); + provider.add("cover.distribution.mode.insert_first", "Priority"); multilineLang(provider, "cover.conveyor.distribution.round_robin_global", "Distribution Mode: §bRound Robin\n§7Splits items equally across connected inventories"); multilineLang(provider, "cover.conveyor.distribution.round_robin_prio", @@ -478,6 +488,8 @@ public static void init(RegistrateLangProvider provider) { "If enabled, items will not be inserted when cover is set to pull items from the inventory into pipe.\n§aEnabled"); multilineLang(provider, "cover.conveyor.blocks_input.disabled", "If enabled, items will not be inserted when cover is set to pull items from the inventory into pipe.\n§cDisabled"); + + // TODO edit to be descriptions provider.add("cover.universal.manual_import_export.mode.disabled", "Manual I/O: §bDisabled\n§7Items / Fluids will only move as specified by the cover and its filter."); provider.add("cover.universal.manual_import_export.mode.filtered", @@ -486,10 +498,11 @@ public static void init(RegistrateLangProvider provider) { "Manual I/O: §bUnfiltered\n§7Items / Fluids can be moved independently of the cover mode. The filter only applies to what is inserted or extracted by this cover itself."); multilineLang(provider, "cover.universal.manual_import_export.mode.description", "§eDisabled§r - Items/fluids will only move as specified by the cover and its filter. \n§eAllow Filtered§r - Items/fluids can be extracted and inserted independently of the cover mode, as long as its filter matches (if any). \n§eAllow Unfiltered§r - Items/fluids can be moved independently of the cover mode. Filter applies to the items inserted or extracted by this cover"); + provider.add("cover.conveyor.item_filter.title", "Item Filter"); multiLang(provider, "cover.conveyor.tag.title", "Tag Name", "(use * for wildcard)"); - provider.add("cover.robotic_arm.title", "Robotic Arm Settings (%s)"); + provider.add("cover.robotic_arm.transfer_mode.title", "Transfer Mode"); provider.add("cover.robotic_arm.transfer_mode.transfer_any", "Transfer Any"); provider.add("cover.robotic_arm.transfer_mode.transfer_exact", "Supply Exact"); provider.add("cover.robotic_arm.transfer_mode.keep_exact", "Keep Exact"); @@ -524,6 +537,10 @@ public static void init(RegistrateLangProvider provider) { provider.add("cover.machine_controller.mode.cover_north", "Control Cover (North)"); provider.add("cover.machine_controller.mode.cover_east", "Control Cover (East)"); provider.add("cover.machine_controller.mode.cover_west", "Control Cover (West)"); + provider.add("cover.machine_controller.cover_not_controllable", "Cover not controllable"); + provider.add("cover.machine_controller.this_cover", "This cover"); + provider.add("cover.enable_with_redstone", "Enable with Redstone"); + provider.add("cover.disable_with_redstone", "Disable with Redstone"); provider.add("cover.machine_controller.mode.null", "Control Nothing"); provider.add("cover.ender_link.tooltip.channel_description", "Channel description"); diff --git a/src/main/resources/assets/gtceu/textures/gui/progress_bar/progress_bar_hammer_base_bronze.png b/src/main/resources/assets/gtceu/textures/gui/progress_bar/progress_bar_hammer_base_bronze.png index c485d0c6f7b..231047daecc 100644 Binary files a/src/main/resources/assets/gtceu/textures/gui/progress_bar/progress_bar_hammer_base_bronze.png and b/src/main/resources/assets/gtceu/textures/gui/progress_bar/progress_bar_hammer_base_bronze.png differ diff --git a/src/main/resources/assets/gtceu/textures/gui/progress_bar/progress_bar_hammer_base_steel.png b/src/main/resources/assets/gtceu/textures/gui/progress_bar/progress_bar_hammer_base_steel.png index c7634f5aa86..171fe462528 100644 Binary files a/src/main/resources/assets/gtceu/textures/gui/progress_bar/progress_bar_hammer_base_steel.png and b/src/main/resources/assets/gtceu/textures/gui/progress_bar/progress_bar_hammer_base_steel.png differ